getfem-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Getfem-users] different mesh_fem definitions for different regions


From: Renard Yves
Subject: Re: [Getfem-users] different mesh_fem definitions for different regions
Date: Mon, 03 Aug 2009 22:01:36 +0200
User-agent: Dynamic Internet Messaging Program (DIMP) H3 (1.1.2)


Dear Umut,

I your exemple, you should define two mesh_fems as follows :



   getfem::mesh_fem meshFemCore1(mshGmsh);
   // region 1, scalar domain, pressure field, dimension 1
   for(getfem::mr_visitor i(region1); !i.finished(); ++i){
meshFemCore1.set_finite_element(i.cv(),getfem::fem_descriptor("FEM_QK(3, 1)"));
   }
   meshFemCore.set_qdim(1); // not really necessary.

   getfem::mesh_fem meshFemCore2(mshGmsh);
   // region 2, vectorial domain, displacement field, dimension 3
   for(getfem::mr_visitor i(region2); !i.finished(); ++i){
meshFemCore2.set_finite_element(i.cv(),getfem::fem_descriptor("FEM_QK(3, 1)"));
   }
   meshFemCore.set_qdim(3);



Then, you can use these two mesh_fem objects in the assembly procedure in order to compute your coupling term.

Regards,

Yves.




Umut Tabak <address@hidden> a écrit :

Renard Yves wrote:

Umut Tabak <address@hidden> a écrit :

Renard Yves wrote:

Umut Tabak <address@hidden> a écrit :

Renard Yves wrote:

Dear Umut,

Hi again,

I tried to apply a sample analysis where I can assemble the fluid part(scalar) and the structural part(displacement). Now I have a problem concerning the coupling matrix assembly. I attached the code and the necessary msh files. Now the questions are(better to answer these after taking a look at the source file attached. In brief, I have 3 mesh structures and 3 mesh_fems attached to these mesh structures and the operations should be clear for you.)

+ To have this kind of analysis(coupled structural-acoustic), we have to set the mesh_fem dimensions to 3 and 1 for the structural and fluid parts respectively, if there is only one mesh_fem definition, how can I assign different dimensions to different regions of my mesh?

You cannot ! Even if you have only one mesh representing both the structure and the fluid, the best is to have two mesh_fem, each defined only on the corresponding region. This is the easiest for computing the coupling terms but of course it means that the meshes of the structure and the fluid match to each other. If you have two separate meshes you can try to compute the coupling term using the object "interpolated fem" which interpolate a fem from a mesh to another (see for instance tests/test_interpolated_fem.cc)
Dear Professor Renard,

That is the question I am still puzzling with, how to assign two mesh_fems to different regions of a mesh, I am sorry again but let me ask one more, I can iterate over regions as you have suggested, to assign pfem definitions, but how to change the dimensions of the these regions? As far as, I can understand from your definitions, I can have one mesh and different mesh_fem definitions for different regions. I could partly accomplish this task by assigning the pfem by iteration but I still could not understand how to change the target dimension, Or do I have a conceptual misunderstanding on this point? Or there is a trick to do this that I am still missing? There is a simple code below to explain my purposes.

Best regards,

Umut

A very simple code vhere I think the dimensions also be changed, but you are the creator of the library.

// standard headers
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cassert>
#include <stdexcept>
// gmm++ headers, pay attention that this is a template
// library, so that no build is required.
#include <gmm/gmm.h>
#include <gmm/gmm_inoutput.h>
// getFem++ headers
#include <getfem/getfem_import.h>
#include <getfem/dal_bit_vector.h>
#include <getfem/getfem_mesh.h>
#include <getfem/getfem_mesh_fem.h>
#include <getfem/getfem_partial_mesh_fem.h>
#include <getfem/getfem_mesh_im.h>
#include <getfem/getfem_integration.h>
#include <getfem/getfem_assembling.h>
#include <getfem/getfem_modeling.h>
#include <getfem/getfem_regular_meshes.h>
//
typedef getfem::modeling_standard_sparse_matrix sparse_matrix;
//using namespace getfem;
//using namespace gmm;
using namespace std;
//
int main(int argc, char** argv)
{
 try{
   getfem::mesh mshGmsh;
   getfem::import_mesh("gmshv2:./boxSolidCheck.msh", mshGmsh);
   // region 1 is the fluid part of the model mesh definition
   if(mshGmsh.has_region(1))
     cout << "Region 1 is defined" << endl;
   if(mshGmsh.has_region(2))
     cout << "Region 2 is defined" << endl;
   if(mshGmsh.has_region(3))
     cout << "Region 3 is defined" << endl;
   getfem::mesh_region region1(mshGmsh.region(1));
   getfem::mesh_region region2(mshGmsh.region(2));
   getfem::mesh_region region3(mshGmsh.region(3));
   // optional print out for the convexes(elements) of a specific
       // region
cout << "Number of elements in region 1 is " << region1.nb_convex() << endl; cout << "Number of elements in region 2 is " << region2.nb_convex() << endl; cout << "Number of elements in region 3 is " << region3.nb_convex() << endl;
   // can also be an array of vectors
if(region1.is_only_convexes()) cout << "region 1 only contains convexes" << endl;
       else
         cout << "region 1 is not composed of convexes only" << endl;
   //
       dal::bit_vector elemsInRegion1= region1.index();
       dal::bit_vector elemsInRegion2= region2.index();
       dal::bit_vector elemsInRegion3= region3.index();
   //
       for(getfem::mr_visitor i(region1);!i.finished();++i){
         cout << "Element :" << i.cv() << " in region1." << endl;
       }
       // assign fem definitions to the regions
       getfem::mesh_fem meshFemCore(mshGmsh);
   // region 1, scalar domain, pressure field, dimension 1
       for(getfem::mr_visitor i(region1); !i.finished(); ++i){
meshFemCore.set_finite_element(i.cv(),getfem::fem_descriptor("FEM_QK(3, 1)"));
         // should not dimensions set here??
       }
   // region 2, vectorial domain, displacement field, dimension 3
       for(getfem::mr_visitor i(region2); !i.finished(); ++i){
meshFemCore.set_finite_element(i.cv(),getfem::fem_descriptor("FEM_QK(3, 1)"));
         // should not dimensions set here??
       }

 }
 catch(std::exception &e){
   std::cout << e.what() << std::endl;
 }
 return EXIT_SUCCESS;
}













reply via email to

[Prev in Thread] Current Thread [Next in Thread]