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 <[email protected]> a écrit :

> Renard Yves wrote:
>>
>> Umut Tabak <[email protected]> a écrit :
>>
>>> Renard Yves wrote:
>>>>
>>>> Umut Tabak <[email protected]> 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;
> }
>
>
>
>
>
>





_______________________________________________
Getfem-users mailing list
[email protected]
https://mail.gna.org/listinfo/getfem-users

Reply via email to