1 //=============================================================================
2 // File : NETGENPlugin_NETGEN_3D.cxx
3 // Moved here from SMESH_NETGEN_3D.cxx
4 // Created : lundi 27 Janvier 2003
5 // Author : Nadir BOUHAMOU (CEA)
7 // Copyright : CEA 2003
9 //=============================================================================
12 #include "NETGENPlugin_NETGEN_3D.hxx"
13 #include "SMESH_Gen.hxx"
14 #include "SMESH_Mesh.hxx"
15 #include "SMESH_subMesh.hxx"
17 #include "SMDS_MeshElement.hxx"
18 #include "SMDS_MeshNode.hxx"
19 #include "SMDS_FacePosition.hxx"
22 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
23 #include <TopTools_ListOfShape.hxx>
24 #include <TopTools_ListIteratorOfListOfShape.hxx>
25 #include <TColStd_ListIteratorOfListOfInteger.hxx>
27 #include <BRep_Tool.hxx>
28 #include <Geom_Surface.hxx>
29 #include <Geom_Curve.hxx>
30 #include <Geom2d_Curve.hxx>
32 #include "utilities.h"
40 //=============================================================================
44 //=============================================================================
46 NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, int studyId,
48 : SMESH_3D_Algo(hypId, studyId, gen)
50 MESSAGE("NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D");
52 // _shapeType = TopAbs_SOLID;
53 _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID);// 1 bit /shape type
54 // MESSAGE("_shapeType octal " << oct << _shapeType);
55 _compatibleHypothesis.push_back("MaxElementVolume");
57 _maxElementVolume = 0.;
59 _hypMaxElementVolume = NULL;
62 //=============================================================================
66 //=============================================================================
68 NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D()
70 MESSAGE("NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D");
73 //=============================================================================
77 //=============================================================================
79 bool NETGENPlugin_NETGEN_3D::CheckHypothesis
81 const TopoDS_Shape& aShape,
82 SMESH_Hypothesis::Hypothesis_Status& aStatus)
84 MESSAGE("NETGENPlugin_NETGEN_3D::CheckHypothesis");
86 _hypMaxElementVolume = NULL;
88 list<const SMESHDS_Hypothesis*>::const_iterator itl;
89 const SMESHDS_Hypothesis* theHyp;
91 const list<const SMESHDS_Hypothesis*>& hyps = GetUsedHypothesis(aMesh, aShape);
92 int nbHyp = hyps.size();
95 aStatus = SMESH_Hypothesis::HYP_MISSING;
96 return false; // can't work with no hypothesis
100 theHyp = (*itl); // use only the first hypothesis
102 string hypName = theHyp->GetName();
103 // int hypId = theHyp->GetID();
108 if (hypName == "MaxElementVolume")
110 _hypMaxElementVolume = static_cast<const StdMeshers_MaxElementVolume*> (theHyp);
111 ASSERT(_hypMaxElementVolume);
112 _maxElementVolume = _hypMaxElementVolume->GetMaxVolume();
114 aStatus = SMESH_Hypothesis::HYP_OK;
117 aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE;
122 //=============================================================================
124 *Here we are going to use the NETGEN mesher
126 //=============================================================================
128 bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
129 const TopoDS_Shape& aShape)
131 MESSAGE("NETGENPlugin_NETGEN_3D::Compute with maxElmentsize = " << _maxElementVolume);
133 SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
135 map<int, const SMDS_MeshNode*> netgenToDS;
137 // check if all faces were meshed by a triangle mesher (here MESFISTO_2D)
139 vector<SMESH_subMesh*> meshFaces;
140 vector<TopoDS_Shape> shapeFaces;
142 for (TopExp_Explorer exp(aShape,TopAbs_FACE);exp.More();exp.Next())
144 TopoDS_Shape aShapeFace = exp.Current();
145 SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
147 int internal_size = meshFaces.size();
149 for (int i = 0;i<internal_size;i++)
151 if (aSubMesh == meshFaces[i]) index = 1;
153 if (index == 0) meshFaces.push_back(aSubMesh);
155 internal_size = shapeFaces.size();
157 for (int i = 0;i<internal_size;i++)
159 if (aShapeFace == shapeFaces[i]) index = 1;
161 if (index == 0) shapeFaces.push_back(aShapeFace);
164 int numberOfFaces = meshFaces.size();
167 int NbTotOfNodesFaces = 0;
169 for (int i=0; i<numberOfFaces; i++)
171 TopoDS_Shape aShapeFace = meshFaces[i]->GetSubShape();
172 TopoDS_Shape aFace = shapeFaces[i];
173 SMESH_Algo* algoFace = _gen->GetAlgo(aMesh, aShapeFace);
174 string algoFaceName = algoFace->GetName();
175 if (algoFaceName != "MEFISTO_2D")
181 const SMESHDS_SubMesh* aSubMeshDSFace = meshFaces[i]->GetSubMeshDS();
183 int nbNodes = aSubMeshDSFace->NbNodes();
184 NbTotOfNodesFaces += nbNodes;
185 int nbTria = aSubMeshDSFace->NbElements();
186 NbTotOfTria += nbTria;
189 SMDS_ElemIteratorPtr iteratorTriangle = aSubMeshDSFace->GetElements();
192 int numberOfDegeneratedTriangle = 0;
193 while(iteratorTriangle->more())
196 const SMDS_MeshElement * triangle = iteratorTriangle->next();
198 SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
200 const SMDS_MeshNode * node1 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
201 double node1X = node1->X();
202 double node1Y = node1->Y();
203 double node1Z = node1->Z();
205 const SMDS_MeshNode * node2 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
206 double node2X = node2->X();
207 double node2Y = node2->Y();
208 double node2Z = node2->Z();
210 const SMDS_MeshNode * node3 = static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
211 double node3X = node3->X();
212 double node3Y = node3->Y();
213 double node3Z = node3->Z();
215 // Compute the triangle surface
217 double vect1 = ((node2Y - node1Y)*(node3Z - node1Z) - (node2Z - node1Z)*(node3Y - node1Y));
218 double vect2 = - ((node2X - node1X)*(node3Z - node1Z) - (node2Z - node1Z)*(node3X - node1X));
219 double vect3 = ((node2X - node1X)*(node3Y - node1Y) - (node2Y - node1Y)*(node3X - node1X));
220 double epsilon = 1.0e-6;
222 bool triangleIsDegenerated = ((abs(vect1)<epsilon) && (abs(vect2)<epsilon) && (abs(vect3)<epsilon));
224 if (triangleIsDegenerated)
226 numberOfDegeneratedTriangle++;
230 if (numberOfDegeneratedTriangle > 0)
231 MESSAGE("WARNING THERE IS(ARE) " << numberOfDegeneratedTriangle << " degenerated triangle on this face");
235 // check if all edges were meshed by a edge mesher (here Regular_1D)
237 vector<SMESH_subMesh*> meshEdges;
238 for (TopExp_Explorer exp(aShape,TopAbs_EDGE);exp.More();exp.Next())
240 SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
242 int internal_size = meshEdges.size();
244 for (int i = 0;i<internal_size;i++)
246 if (aSubMesh == meshEdges[i]) index = 1;
248 if (index == 0) meshEdges.push_back(aSubMesh);
251 int numberOfEdges = meshEdges.size();
253 int NbTotOfNodesEdges = 0;
256 for (int i=0; i<numberOfEdges; i++)
258 TopoDS_Shape aShapeEdge = meshEdges[i]->GetSubShape();
259 SMESH_Algo* algoEdge = _gen->GetAlgo(aMesh, aShapeEdge);
260 string algoEdgeName = algoEdge->GetName();
261 if (algoEdgeName != "Regular_1D")
268 const SMESHDS_SubMesh* aSubMeshDSEdge = meshEdges[i]->GetSubMeshDS();
270 int nbNodes = aSubMeshDSEdge->NbNodes();
271 NbTotOfNodesEdges += nbNodes;
272 int nbSegs = aSubMeshDSEdge->NbElements();
273 NbTotOfSegs += nbSegs;
276 vector<SMESH_subMesh*> meshVertices;
277 for (TopExp_Explorer exp(aShape,TopAbs_VERTEX);exp.More();exp.Next())
279 SMESH_subMesh* aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
281 int internal_size = meshVertices.size();
283 for (int i = 0;i<internal_size;i++)
285 if (aSubMesh == meshVertices[i]) index = 1;
287 if (index == 0) meshVertices.push_back(aSubMesh);
290 int numberOfVertices = meshVertices.size();
292 int NbTotOfNodesVertices = 0;
294 for (int i=0; i<numberOfVertices; i++)
296 TopoDS_Shape aShapeVertex = meshVertices[i]->GetSubShape();
298 const SMESHDS_SubMesh * aSubMeshDSVertex = meshVertices[i]->GetSubMeshDS();
300 int nbNodes = aSubMeshDSVertex->NbNodes();
301 NbTotOfNodesVertices += nbNodes;
304 vector<SMESH_subMesh*> meshShells;
307 for (TopExp_Explorer exp(aShape,TopAbs_SHELL);exp.More();exp.Next())
309 SMESH_subMesh* aSubMesh = aMesh.GetSubMesh(exp.Current());
311 aShell = TopoDS::Shell(exp.Current());
312 meshShells.push_back(aSubMesh);
315 int numberOfShells = meshShells.size();
317 if (numberOfShells > 0)
320 Prepare the Netgen surface mesh from the SMESHDS
322 int spaceDimension = 3;
323 int nbNodesByTri = 3;
324 int nbNodesByTetra = 4;
326 int Netgen_NbOfNodes = NbTotOfNodesFaces +
328 NbTotOfNodesVertices;
329 int Netgen_NbOfTria = NbTotOfTria;
330 int Netgen_param2ndOrder = 0;
331 double Netgen_paramFine = 1.;
332 double Netgen_paramSize = _maxElementVolume;
334 double * Netgen_Coordinates = new double [spaceDimension*
336 int * listNodeCoresNetgenSmesh = new int [Netgen_NbOfNodes];
337 int * Netgen_Connectivity = new int [nbNodesByTri*Netgen_NbOfTria];
338 double * Netgen_point = new double [spaceDimension];
339 int * Netgen_triangle = new int [nbNodesByTri];
340 int * Netgen_tetrahedron = new int [nbNodesByTetra];
342 for (int i=0; i<Netgen_NbOfTria; i++)
344 for (int j=0; j<nbNodesByTri; j++)
345 Netgen_Connectivity[i*nbNodesByTri+j] = 0;
348 double bigNumber = 1.e20;
350 for (int i=0; i<Netgen_NbOfNodes; i++)
352 listNodeCoresNetgenSmesh[i] = 0;
353 for (int j=0; j<spaceDimension; j++)
354 Netgen_Coordinates[i*spaceDimension+j] = bigNumber;
358 for (int i=0; i<numberOfVertices; i++)
360 const SMESHDS_SubMesh * aSubMeshDSVertex =
361 meshVertices[i]->GetSubMeshDS();
363 SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSVertex->GetNodes();
365 while(iteratorNodes->more())
367 const SMDS_MeshNode * node = iteratorNodes->next();
368 int nodeId = node->GetID();
369 double nodeX = node->X();
370 double nodeY = node->Y();
371 double nodeZ = node->Z();
372 listNodeCoresNetgenSmesh[indexNodes] = nodeId;
373 int index = indexNodes*spaceDimension;
374 Netgen_Coordinates[index] = nodeX;
375 Netgen_Coordinates[index+1] = nodeY;
376 Netgen_Coordinates[index+2] = nodeZ;
377 netgenToDS[indexNodes] = node;
382 for (int i=0; i<numberOfEdges; i++)
384 const SMESHDS_SubMesh * aSubMeshDSEdge =
385 meshEdges[i]->GetSubMeshDS();
387 SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSEdge->GetNodes();
389 while(iteratorNodes->more())
391 const SMDS_MeshNode * node = iteratorNodes->next();
392 listNodeCoresNetgenSmesh[indexNodes] = node->GetID();
393 int index = indexNodes*spaceDimension;
394 Netgen_Coordinates[index] = node->X();
395 Netgen_Coordinates[index+1] = node->Y();
396 Netgen_Coordinates[index+2] = node->Z();
397 netgenToDS[indexNodes] = node;
402 for (int i=0; i<numberOfFaces; i++)
404 const SMESHDS_SubMesh * aSubMeshDSFace =
405 meshFaces[i]->GetSubMeshDS();
407 SMDS_NodeIteratorPtr iteratorNodes = aSubMeshDSFace->GetNodes();
409 while(iteratorNodes->more())
411 const SMDS_MeshNode * node = iteratorNodes->next();
412 int nodeId = node->GetID();
413 double nodeX = node->X();
414 double nodeY = node->Y();
415 double nodeZ = node->Z();
416 // MESSAGE("NODE -> ID = " << nodeId << " X = " << nodeX << " Y = " << nodeY << " Z = " << nodeZ);
417 listNodeCoresNetgenSmesh[indexNodes] = nodeId;
418 int index = indexNodes*spaceDimension;
419 Netgen_Coordinates[index] = nodeX;
420 Netgen_Coordinates[index+1] = nodeY;
421 Netgen_Coordinates[index+2] = nodeZ;
422 netgenToDS[indexNodes] = node;
427 for (int i=0; i<Netgen_NbOfNodes; i++)
429 ASSERT(listNodeCoresNetgenSmesh[i] != 0);
431 for (int j=0; j<Netgen_NbOfNodes && j!=i; j++)
432 ASSERT(listNodeCoresNetgenSmesh[i] != listNodeCoresNetgenSmesh[j]);
434 for (int j=0; j<spaceDimension; j++)
435 ASSERT(Netgen_Coordinates[i*spaceDimension+j] != bigNumber);
439 for (int i=0; i<numberOfFaces; i++)
441 const SMESHDS_SubMesh * aSubMeshDSFace =
442 meshFaces[i]->GetSubMeshDS();
444 TopoDS_Shape aFace = shapeFaces[i];
446 SMDS_ElemIteratorPtr iteratorTriangle = aSubMeshDSFace->GetElements();
448 TopoDS_Shape aShapeFace = meshFaces[i]->GetSubShape();
450 bool orientationMeshFace = (aFace.Orientation() == aShapeFace.Orientation());
452 if (orientationMeshFace)
454 while(iteratorTriangle->more())
456 const SMDS_MeshElement * triangle = iteratorTriangle->next();
458 SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
460 int triangleNode1 = (triangleNodesIt->next())->GetID();
461 int triangleNode2 = (triangleNodesIt->next())->GetID();
462 int triangleNode3 = (triangleNodesIt->next())->GetID();
467 int index = indexTrias*nbNodesByTri;
469 for (int j=0; j<Netgen_NbOfNodes; j++)
473 if (triangleNode1 == listNodeCoresNetgenSmesh[j])
475 else if (triangleNode2 == listNodeCoresNetgenSmesh[j])
477 else if (triangleNode3 == listNodeCoresNetgenSmesh[j])
481 triangleNode1 = N1New;
482 triangleNode2 = N2New;
483 triangleNode3 = N3New;
485 Netgen_Connectivity[index] = triangleNode1;
486 Netgen_Connectivity[index+1] = triangleNode2;
487 Netgen_Connectivity[index+2] = triangleNode3;
494 while(iteratorTriangle->more())
496 const SMDS_MeshElement * triangle = iteratorTriangle->next();
498 SMDS_ElemIteratorPtr triangleNodesIt = triangle->nodesIterator();
500 int triangleNode1 = (triangleNodesIt->next())->GetID();
501 int triangleNode3 = (triangleNodesIt->next())->GetID();
502 int triangleNode2 = (triangleNodesIt->next())->GetID();
507 int index = indexTrias*nbNodesByTri;
509 for (int j=0; j<Netgen_NbOfNodes; j++)
513 if (triangleNode1 == listNodeCoresNetgenSmesh[j])
515 else if (triangleNode2 == listNodeCoresNetgenSmesh[j])
517 else if (triangleNode3 == listNodeCoresNetgenSmesh[j])
521 triangleNode1 = N1New;
522 triangleNode2 = N2New;
523 triangleNode3 = N3New;
525 Netgen_Connectivity[index] = triangleNode1;
526 Netgen_Connectivity[index+1] = triangleNode2;
527 Netgen_Connectivity[index+2] = triangleNode3;
534 int * nodesUsed = new int[Netgen_NbOfNodes];
536 for (int i=0; i<Netgen_NbOfNodes; i++) nodesUsed[i] = 0;
538 for (int i=0; i<Netgen_NbOfTria; i++)
539 for (int j=0; j<nbNodesByTri; j++)
541 int Nij = Netgen_Connectivity[i*nbNodesByTri+j];
543 ASSERT((Nij>=1) && (Nij<=Netgen_NbOfNodes));
545 nodesUsed[Nij-1] = 1;
546 Netgen_Connectivity[i*nbNodesByTri+j] = Nij;
549 for (int i=0; i<Netgen_NbOfNodes; i++)
551 ASSERT(nodesUsed[i] != 0);
557 Feed the Netgen surface mesh
559 Ng_Mesh * Netgen_mesh;
563 Netgen_mesh = Ng_NewMesh();
565 Ng_Meshing_Parameters Netgen_param;
567 for (int i=0; i<Netgen_NbOfNodes; i++)
569 for (int j=0; j<spaceDimension; j++)
570 Netgen_point[j] = Netgen_Coordinates[i*spaceDimension+j];
572 Ng_AddPoint(Netgen_mesh, Netgen_point);
575 for (int i=0; i<Netgen_NbOfTria; i++)
577 for (int j=0; j<nbNodesByTri; j++)
578 Netgen_triangle[j] = Netgen_Connectivity[i*nbNodesByTri+j];
580 Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
583 Netgen_param.secondorder = Netgen_param2ndOrder;
584 Netgen_param.fineness = Netgen_paramFine;
585 Netgen_param.maxh = Netgen_paramSize;
588 Generate the volume mesh
591 ASSERT(Netgen_NbOfNodes == Ng_GetNP(Netgen_mesh));
592 ASSERT(Ng_GetNE(Netgen_mesh) == 0);
593 ASSERT(Netgen_NbOfTria == Ng_GetNSE(Netgen_mesh));
598 status = Ng_GenerateVolumeMesh(Netgen_mesh, &Netgen_param);
600 MESSAGE("An exception has been caught during the Volume Mesh Generation ...");
601 status = NG_VOLUME_FAILURE;
604 int Netgen_NbOfNodesNew = Ng_GetNP(Netgen_mesh);
606 int Netgen_NbOfTetra = Ng_GetNE(Netgen_mesh);
608 MESSAGE("End of Volume Mesh Generation. status=" << status <<
609 ", nb new nodes: " << Netgen_NbOfNodesNew - Netgen_NbOfNodes <<
610 ", nb tetra: " << Netgen_NbOfTetra);
612 if ((status != NG_OK) ||
613 (Netgen_NbOfTetra <= 0))
616 Free the memory needed by to generate the Netgen Mesh
619 delete [] Netgen_Coordinates;
620 delete [] Netgen_Connectivity;
621 delete [] Netgen_point;
622 delete [] Netgen_triangle;
623 delete [] Netgen_tetrahedron;
625 delete [] listNodeCoresNetgenSmesh;
627 Ng_DeleteMesh(Netgen_mesh);
634 double * Netgen_CoordinatesNew = new double [spaceDimension*Netgen_NbOfNodesNew];
635 int * Netgen_ConnectivityNew = new int [nbNodesByTetra*Netgen_NbOfTetra];
637 for (int i=0; i<Netgen_NbOfNodesNew; i++)
639 Ng_GetPoint(Netgen_mesh, (i+1), Netgen_point);
641 for (int j=0; j<spaceDimension; j++)
642 Netgen_CoordinatesNew[i*spaceDimension+j] = Netgen_point[j];
645 for (int i=0; i<Netgen_NbOfNodes; i++)
646 for (int j=0; j<spaceDimension; j++)
647 ASSERT(Netgen_CoordinatesNew[i*spaceDimension+j] == Netgen_Coordinates[i*spaceDimension+j])
649 for (int i=0; i<Netgen_NbOfTetra; i++)
651 Ng_GetVolumeElement(Netgen_mesh, (i+1), Netgen_tetrahedron);
653 for (int j=0; j<nbNodesByTetra; j++)
654 Netgen_ConnectivityNew[i*nbNodesByTetra+j] = Netgen_tetrahedron[j];
658 Feed back the SMESHDS with the generated Nodes and Volume Elements
661 int NbTotOfNodesShell = Netgen_NbOfNodesNew - Netgen_NbOfNodes;
663 int * listNodeShellCoresNetgenSmesh = new int [NbTotOfNodesShell];
665 for (int i=0; i<NbTotOfNodesShell; i++)
666 listNodeShellCoresNetgenSmesh[i] = 0;
668 for (int i=0; i<NbTotOfNodesShell; i++)
670 int index = (i+Netgen_NbOfNodes)*spaceDimension;
672 SMDS_MeshNode * node =
673 meshDS->AddNode(Netgen_CoordinatesNew[index],
674 Netgen_CoordinatesNew[index+1],
675 Netgen_CoordinatesNew[index+2]);
677 meshDS->SetNodeInVolume(node, aShell);
679 index = i+Netgen_NbOfNodes;
680 netgenToDS[index] = node;
682 listNodeShellCoresNetgenSmesh[i] = node->GetID();
685 for (int i=0; i<NbTotOfNodesShell; i++)
687 ASSERT(listNodeShellCoresNetgenSmesh[i] != 0);
689 for (int j=0; j<NbTotOfNodesShell && j!=i; j++)
690 ASSERT(listNodeShellCoresNetgenSmesh[i] != listNodeShellCoresNetgenSmesh[j]);
693 for (int i=0; i<Netgen_NbOfTetra; i++)
695 int index = i*nbNodesByTetra;
696 int tetraNode1 = Netgen_ConnectivityNew[index];
697 int tetraNode2 = Netgen_ConnectivityNew[index+1];
698 int tetraNode3 = Netgen_ConnectivityNew[index+2];
699 int tetraNode4 = Netgen_ConnectivityNew[index+3];
701 const SMDS_MeshNode * node1 = netgenToDS[tetraNode1-1];
702 const SMDS_MeshNode * node2 = netgenToDS[tetraNode2-1];
703 const SMDS_MeshNode * node3 = netgenToDS[tetraNode3-1];
704 const SMDS_MeshNode * node4 = netgenToDS[tetraNode4-1];
707 if (index <= Netgen_NbOfNodes)
708 tetraNode1 = listNodeCoresNetgenSmesh[index-1];
710 tetraNode1 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
713 if (index <= Netgen_NbOfNodes)
714 tetraNode2 = listNodeCoresNetgenSmesh[index-1];
716 tetraNode2 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
719 if (index <= Netgen_NbOfNodes)
720 tetraNode3 = listNodeCoresNetgenSmesh[index-1];
722 tetraNode3 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
725 if (index <= Netgen_NbOfNodes)
726 tetraNode4 = listNodeCoresNetgenSmesh[index-1];
728 tetraNode4 = listNodeShellCoresNetgenSmesh[index-Netgen_NbOfNodes-1];
730 SMDS_MeshVolume * elt =
731 meshDS->AddVolume(node1,node2,node3,node4);
733 meshDS->SetMeshElementOnShape(elt, aShell);
737 Free the memory needed by to generate the Netgen Mesh
740 delete [] Netgen_Coordinates;
741 delete [] Netgen_Connectivity;
742 delete [] Netgen_CoordinatesNew;
743 delete [] Netgen_ConnectivityNew;
744 delete [] Netgen_point;
745 delete [] Netgen_triangle;
746 delete [] Netgen_tetrahedron;
748 delete [] listNodeCoresNetgenSmesh;
749 delete [] listNodeShellCoresNetgenSmesh;
751 Ng_DeleteMesh(Netgen_mesh);
761 //=============================================================================
765 //=============================================================================
767 ostream & NETGENPlugin_NETGEN_3D::SaveTo(ostream & save)
772 //=============================================================================
776 //=============================================================================
778 istream & NETGENPlugin_NETGEN_3D::LoadFrom(istream & load)
783 //=============================================================================
787 //=============================================================================
789 ostream & operator << (ostream & save, NETGENPlugin_NETGEN_3D & hyp)
791 return hyp.SaveTo( save );
794 //=============================================================================
798 //=============================================================================
800 istream & operator >> (istream & load, NETGENPlugin_NETGEN_3D & hyp)
802 return hyp.LoadFrom( load );