[Gmsh] c++ API - Import mesh vertices and elements
Simone GREMMO [531257]
Simone.GREMMO at umons.ac.be
Mon Feb 9 10:04:52 CET 2015
Dear all,
I think I have partially solved my problem. Here is the code that I have written and let me to create the volume mesh (Thanks to Mikhail for his suggestion in this answer: http://geuz.org/pipermail/gmsh/2015/009536.html):
GmshInitialize();
GmshSetOption("Mesh","Algorithm",1.);
//Create Gmsh model and set the factory
GModel *modelGmsh = new GModel;
modelGmsh->setFactory("Gmsh");
//GFace is defined by a mesh and not through GVertex and GEdge
GFace *interfaceGmsh = new discreteFace(modelGmsh,1);
//Function that loops over mesh vertices and elements and import them in a gmsh structure [see at the bottom of the main function]
importSurfaceMeshintoGmsh(interface, interfaceGmsh);
modelGmsh->add(interfaceGmsh);
//Using the previously defined surface, define a surface loop, used to enclose a volume
std::vector<GFace*> interfaceFace; //in my case the surface is given in one piece only
interfaceFace.push_back(interfaceGmsh);
std::vector <std::vector<GFace*> > interfaceLoop;
interfaceLoop.push_back(interfaceFace);
//Add the volume enclose by the surface loop to the model and create the related GRegion
GRegion *regionInterface = modelGmsh->addVolume(interfaceLoop);
//Add a volume physical entity
regionInterface->addPhysicalEntity(1);
//Add the region to the model
modelGmsh->add(regionInterface);
//Mesh the model
modelGmsh->mesh(3);
modelGmsh->writeGEO("/home/simoneg/Hexpress-Hybrid_projects/IncludeGmsh-HH/TESTGMSHAPI_keyword/interfaceVertGmsh.geo");
modelGmsh->writeMSH("/home/simoneg/Hexpress-Hybrid_projects/IncludeGmsh-HH/TESTGMSHAPI_keyword/interfaceVertGmsh.msh");
delete modelGmsh;
GmshFinalize();
//Function to import the mesh in a Gmsh structure
//inMesh is the input mesh, created with another tool
//gmshMesh is the structure containing the inMesh, but that can be used by Gmsh to generate the volume mesh
bool importSurfaceMeshintoGmsh(const My_Mesh &inMesh, GFace *gmshMesh)
{
My_int numNodes = inMesh.numVerticies(); //get the number of vertices from the inMesh
My_int numCells = inMesh.numCells(); ////get the number of elements from the inMesh
//Get all the vertices from the mesh
std::vector<MVertex*> mv;
mv.resize((int)numNodes);
for (MC_Index nodeCounter = 0; nodeCounter < numNodes; nodeCounter++)
{
My_Coord3D coordHH = inMesh.vertex(nodeCounter); //a 3 dimensions vector with the vertex coordinates
mv[nodeCounter] = new MVertex((double)coordHH[0], (double)coordHH[1], (double)coordHH[2],gmshMesh, nodeCounter+1);
gmshMesh->addMeshVertex(mv[nodeCounter]); //add the vertex to the mesh
}
//Get all the elements from the mesh
for (My_int cellCounter = 0; cellCounter < numCells; cellCounter++)
{
My_int numVertCell = inMesh.numElems(cellCounter); //for element #cellCounter, get the number of vertices
switch (numVertCell)
{
case 3: //triangle
gmshMesh->addTriangle(new MTriangle(mv[inMesh.elem(cellCounter,0)], //extract the vertexID for element #cellCounter
mv[inMesh.elem(cellCounter,1)],
mv[inMesh.elem(cellCounter,2)]));
break;
case 4: //quadrangle
gmshMesh->addQuadrangle(new MQuadrangle(mv[inMesh. elem(cellCounter,0)],
mv[inMesh. elem(cellCounter,1)],
mv[inMesh. elem(cellCounter,2)],
mv[inMesh. elem(cellCounter,3)]));
break;
default:
return false;
break;
}
}
return true;
}
This code generates a mesh in a volume without any hole inside. Does anyone know how to add a hole inside the volume and mesh the region between the two surfaces?
The .geo commands looks like:
Merge "interfaceMesh.msh";
Surface Loop(3) = {1};
Merge "envelopeMovingMesh.msh";
Surface Loop(4) = {2};
Volume(1) = {3,4};
Physical Volume(1) = {5};
Thanks for your help.
Simone
Dear all,
I have included Gmsh as library in my c++ program and I need to use it to mesh a volume region bounded by a surface mesh: in my program I have defined a surface mesh and I need to import its vertices and elements into a gmsh structure to be able to create a volume mesh starting from this surface.
Steps to do so, as far as I can understand, are:
- Declare a GModel* that will contain the surface
- Add a GFace* into the GModel
- Add vertices and cells to the GFace* (get them from the mesh created in my program). Actually define a mesh for this GFace object
- Create the volume mesh
Is this correct? Does anyone have any suggestion on how to write this portion of code?
PS I have already looked at the example in utils/api_demos/mainSimple.cpp and have adapted it to my case, but I would rather avoid reading/writing files to transfer meshes between the my program and gmsh to avoid performance issues.
Simone
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.geuz.org/pipermail/gmsh/attachments/20150209/b67f5aa5/attachment.html>