Compare commits

...

1 Commits

Author SHA1 Message Date
eap
41005a96db implement building a quadratic mesh 2006-03-03 14:10:48 +00:00

View File

@ -17,6 +17,7 @@ using namespace std;
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include "SMDS_MeshElement.hxx" #include "SMDS_MeshElement.hxx"
#include "SMDS_MeshNode.hxx" #include "SMDS_MeshNode.hxx"
#include "StdMeshers_Helper.hxx"
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <TopExp.hxx> #include <TopExp.hxx>
@ -137,6 +138,9 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
// get triangles on aShell and make a map of nodes to Netgen node IDs // get triangles on aShell and make a map of nodes to Netgen node IDs
// ------------------------------------------------------------------- // -------------------------------------------------------------------
StdMeshers_Helper* myTool = new StdMeshers_Helper(aMesh);
bool _quadraticMesh = myTool->IsQuadraticSubMesh(aShape);
typedef map< const SMDS_MeshNode*, int> TNodeToIDMap; typedef map< const SMDS_MeshNode*, int> TNodeToIDMap;
TNodeToIDMap nodeToNetgenID; TNodeToIDMap nodeToNetgenID;
list< const SMDS_MeshElement* > triangles; list< const SMDS_MeshElement* > triangles;
@ -161,8 +165,10 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
{ {
// check element // check element
const SMDS_MeshElement* elem = iteratorElem->next(); const SMDS_MeshElement* elem = iteratorElem->next();
if ( !elem || elem->NbNodes() != 3 ) { if ( !elem ||
!( elem->NbNodes()==3 || ( _quadraticMesh && elem->NbNodes()==6) ) ) {
INFOS( "NETGENPlugin_NETGEN_3D::Compute(), bad mesh"); INFOS( "NETGENPlugin_NETGEN_3D::Compute(), bad mesh");
delete myTool; myTool = 0;
return false; return false;
} }
// keep a triangle // keep a triangle
@ -173,6 +179,8 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
while ( triangleNodesIt->more() ) { while ( triangleNodesIt->more() ) {
const SMDS_MeshNode * node = const SMDS_MeshNode * node =
static_cast<const SMDS_MeshNode *>(triangleNodesIt->next()); static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
if(myTool->IsMedium(node))
continue;
nodeToNetgenID.insert( make_pair( node, invalid_ID )); nodeToNetgenID.insert( make_pair( node, invalid_ID ));
} }
#ifdef _DEBUG_ #ifdef _DEBUG_
@ -245,6 +253,7 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
if ( isDegen ) // all nodes on a degen edge get one netgen ID if ( isDegen ) // all nodes on a degen edge get one netgen ID
*(shId_ngId->second) = n_id->second; *(shId_ngId->second) = n_id->second;
} }
// set triangles // set triangles
list< const SMDS_MeshElement* >::iterator tria = triangles.begin(); list< const SMDS_MeshElement* >::iterator tria = triangles.begin();
list< bool >::iterator reverse = isReversed.begin(); list< bool >::iterator reverse = isReversed.begin();
@ -255,6 +264,8 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
while ( triangleNodesIt->more() ) { while ( triangleNodesIt->more() ) {
const SMDS_MeshNode * node = const SMDS_MeshNode * node =
static_cast<const SMDS_MeshNode *>(triangleNodesIt->next()); static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
if(myTool->IsMedium(node))
continue;
Netgen_triangle[ *reverse ? 2 - i : i ] = nodeToNetgenID[ node ]; Netgen_triangle[ *reverse ? 2 - i : i ] = nodeToNetgenID[ node ];
++i; ++i;
} }
@ -280,7 +291,8 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
try { try {
status = Ng_GenerateVolumeMesh(Netgen_mesh, &Netgen_param); status = Ng_GenerateVolumeMesh(Netgen_mesh, &Netgen_param);
} catch (...) { }
catch (...) {
MESSAGE("An exception has been caught during the Volume Mesh Generation ..."); MESSAGE("An exception has been caught during the Volume Mesh Generation ...");
status = NG_VOLUME_FAILURE; status = NG_VOLUME_FAILURE;
} }
@ -303,8 +315,9 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
// vector of nodes in which node index == netgen ID // vector of nodes in which node index == netgen ID
vector< const SMDS_MeshNode* > nodeVec ( Netgen_NbOfNodesNew + 1 ); vector< const SMDS_MeshNode* > nodeVec ( Netgen_NbOfNodesNew + 1 );
// insert old nodes into nodeVec // insert old nodes into nodeVec
for ( n_id = nodeToNetgenID.begin(); n_id != nodeToNetgenID.end(); ++n_id ) for ( n_id = nodeToNetgenID.begin(); n_id != nodeToNetgenID.end(); ++n_id ) {
nodeVec.at( n_id->second ) = n_id->first; nodeVec.at( n_id->second ) = n_id->first;
}
// create and insert new nodes into nodeVec // create and insert new nodes into nodeVec
int nodeIndex = Netgen_NbOfNodes + 1; int nodeIndex = Netgen_NbOfNodes + 1;
int shapeID = meshDS->ShapeToIndex( aShape ); int shapeID = meshDS->ShapeToIndex( aShape );
@ -322,7 +335,7 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
for ( int elemIndex = 1; elemIndex <= Netgen_NbOfTetra; ++elemIndex ) for ( int elemIndex = 1; elemIndex <= Netgen_NbOfTetra; ++elemIndex )
{ {
Ng_GetVolumeElement(Netgen_mesh, elemIndex, Netgen_tetrahedron); Ng_GetVolumeElement(Netgen_mesh, elemIndex, Netgen_tetrahedron);
SMDS_MeshVolume * elt = meshDS->AddVolume (nodeVec.at( Netgen_tetrahedron[0] ), SMDS_MeshVolume * elt = myTool->AddVolume (nodeVec.at( Netgen_tetrahedron[0] ),
nodeVec.at( Netgen_tetrahedron[1] ), nodeVec.at( Netgen_tetrahedron[1] ),
nodeVec.at( Netgen_tetrahedron[2] ), nodeVec.at( Netgen_tetrahedron[2] ),
nodeVec.at( Netgen_tetrahedron[3] )); nodeVec.at( Netgen_tetrahedron[3] ));
@ -333,6 +346,8 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
Ng_DeleteMesh(Netgen_mesh); Ng_DeleteMesh(Netgen_mesh);
Ng_Exit(); Ng_Exit();
delete myTool; myTool = 0;
return isOK; return isOK;
} }