0020918: EDF 1447 SMESH: Mesh common borders (note 0010726)

1) in Compute(), fix error that points corresponding to free nodes
     on vertices are not added to netgen mesh
  2) in FillSMesh(), remove unnecessary data
-  NCollection_Map<int> pindMap;
-  NCollection_Map<Link> linkMap;
This commit is contained in:
eap 2011-04-20 13:44:05 +00:00
parent 2456aacf6c
commit c62bdcf082

View File

@ -84,9 +84,9 @@ using namespace nglib;
using namespace std;
#ifdef _DEBUG_
#define nodeVec_ACCESS(index) (SMDS_MeshNode*) nodeVec.at((index))
#define nodeVec_ACCESS(index) ((SMDS_MeshNode*) nodeVec.at((index)))
#else
#define nodeVec_ACCESS(index) (SMDS_MeshNode*) nodeVec[index]
#define nodeVec_ACCESS(index) ((SMDS_MeshNode*) nodeVec[index])
#endif
#ifdef NETGEN_NEW
@ -1294,8 +1294,6 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
SMESHDS_Mesh* meshDS = sMesh.GetMeshDS();
// map of nodes assigned to submeshes
NCollection_Map<int> pindMap;
// create and insert nodes into nodeVec
nodeVec.resize( nbNod + 1 );
int i, nbInitNod = initState._nbNodes;
@ -1320,30 +1318,20 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
node = const_cast<SMDS_MeshNode*>( SMESH_Algo::VertexNode( aVert, meshDS ));
}
}
if (node) // node found on vertex
pindMap.Add(i);
else
if (!node) // node not found on vertex
{
node = meshDS->AddNode( NGPOINT_COORDS( ngPoint ));
if (!aVert.IsNull())
{
// point on vertex
meshDS->SetNodeOnVertex(node, aVert);
pindMap.Add(i);
}
}
nodeVec[i] = node;
}
// create mesh segments along geometric edges
NCollection_Map<Link> linkMap;
int nbInitSeg = initState._nbSegments;
for (i = nbInitSeg+1; i <= nbSeg; ++i )
{
const netgen::Segment& seg = ngMesh.LineSegment(i);
Link link(seg[0], seg[1]);
if (!linkMap.Add(link))
continue;
TopoDS_Edge aEdge;
#ifdef NETGEN_NEW
int pinds[3] = { seg.pnums[0], seg.pnums[1], seg.pnums[2] };
@ -1355,7 +1343,8 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
for (int j=0; j < 3; ++j)
{
int pind = pinds[j];
if (pind <= 0) continue;
if (pind <= 0 || !nodeVec_ACCESS(pind))
break;
++nbp;
double param;
if (j < 2)
@ -1369,31 +1358,46 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
param = seg.epgeominfo[j].dist;
param2 += param;
}
else
else // middle point
{
param = param2 * 0.5;
if (pind <= nbInitNod || pindMap.Contains(pind))
continue;
if (!aEdge.IsNull())
}
if (!aEdge.IsNull() && nodeVec_ACCESS(pind)->getshapeId() < 1)
{
meshDS->SetNodeOnEdge(nodeVec_ACCESS(pind), aEdge, param);
pindMap.Add(pind);
}
}
SMDS_MeshEdge* edge;
if (nbp < 3) // second order ?
edge = meshDS->AddEdge(nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1]));
else
edge = meshDS->AddEdge(nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1]),
nodeVec_ACCESS(pinds[2]));
if (!edge)
if ( nbp > 1 )
{
if ( !comment.size() ) comment << "Cannot create a mesh edge";
MESSAGE("Cannot create a mesh edge");
nbSeg = nbFac = nbVol = 0;
break;
SMDS_MeshEdge* edge = 0;
if (nbp == 2) // second order ?
{
if ( meshDS->FindEdge( nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1])))
continue;
edge = meshDS->AddEdge(nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1]));
}
else
{
if ( meshDS->FindEdge( nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1]),
nodeVec_ACCESS(pinds[2])))
continue;
edge = meshDS->AddEdge(nodeVec_ACCESS(pinds[0]), nodeVec_ACCESS(pinds[1]),
nodeVec_ACCESS(pinds[2]));
}
if (!edge)
{
if ( comment.empty() ) comment << "Cannot create a mesh edge";
MESSAGE("Cannot create a mesh edge");
nbSeg = nbFac = nbVol = 0;
break;
}
if ( !aEdge.IsNull() && edge->getshapeId() < 1 )
meshDS->SetMeshElementOnShape(edge, aEdge);
}
else if ( comment.empty() )
{
comment << "Invalid netgen segment #" << i;
}
if (!aEdge.IsNull())
meshDS->SetMeshElementOnShape(edge, aEdge);
}
// create mesh faces along geometric faces
@ -1409,17 +1413,24 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
for (int j=1; j <= elem.GetNP(); ++j)
{
int pind = elem.PNum(j);
SMDS_MeshNode* node = nodeVec_ACCESS(pind);
nodes.push_back(node);
if (pind <= nbInitNod || pindMap.Contains(pind))
continue;
if (!aFace.IsNull())
if ( pind < 1 || pind >= nodeVec.size() )
break;
if ( SMDS_MeshNode* node = nodeVec_ACCESS(pind))
{
const netgen::PointGeomInfo& pgi = elem.GeomInfoPi(j);
meshDS->SetNodeOnFace(node, aFace, pgi.u, pgi.v);
pindMap.Add(pind);
nodes.push_back(node);
if (!aFace.IsNull() && node->getshapeId() < 1)
{
const netgen::PointGeomInfo& pgi = elem.GeomInfoPi(j);
meshDS->SetNodeOnFace(node, aFace, pgi.u, pgi.v);
}
}
}
if ( nodes.size() != elem.GetNP() )
{
if ( comment.empty() )
comment << "Invalid netgen 2d element #" << i;
continue; // bad node ids
}
SMDS_MeshFace* face = NULL;
switch (elem.GetType())
{
@ -1442,7 +1453,7 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
}
if (!face)
{
if ( !comment.size() ) comment << "Cannot create a mesh face";
if ( comment.empty() ) comment << "Cannot create a mesh face";
MESSAGE("Cannot create a mesh face");
nbSeg = nbFac = nbVol = 0;
break;
@ -1452,7 +1463,7 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
}
// create tetrahedra
for (i = 1; i <= nbVol/* && isOK*/; ++i)
for (i = 1; i <= nbVol; ++i)
{
const netgen::Element& elem = ngMesh.VolumeElement(i);
int aSolidInd = elem.GetIndex();
@ -1463,17 +1474,21 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
for (int j=1; j <= elem.GetNP(); ++j)
{
int pind = elem.PNum(j);
SMDS_MeshNode* node = nodeVec_ACCESS(pind);
nodes.push_back(node);
if (pind <= nbInitNod || pindMap.Contains(pind))
continue;
if (!aSolid.IsNull())
if ( pind < 1 || pind >= nodeVec.size() )
break;
if ( SMDS_MeshNode* node = nodeVec_ACCESS(pind) )
{
// point in solid
meshDS->SetNodeInVolume(node, aSolid);
pindMap.Add(pind);
nodes.push_back(node);
if ( !aSolid.IsNull() && node->getshapeId() < 1 )
meshDS->SetNodeInVolume(node, aSolid);
}
}
if ( nodes.size() != elem.GetNP() )
{
if ( comment.empty() )
comment << "Invalid netgen 3d element #" << i;
continue;
}
SMDS_MeshVolume* vol = NULL;
switch (elem.GetType())
{
@ -1490,7 +1505,7 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo,
}
if (!vol)
{
if ( !comment.size() ) comment << "Cannot create a mesh volume";
if ( comment.empty() ) comment << "Cannot create a mesh volume";
MESSAGE("Cannot create a mesh volume");
nbSeg = nbFac = nbVol = 0;
break;
@ -1756,7 +1771,8 @@ bool NETGENPlugin_Mesher::Compute()
if ( !err )
{
_faceDescriptors.clear();
err = ! ( fillNgMesh(occgeo, *ngMesh, nodeVec, meshedSM[ MeshDim_1D ]));
err = ! ( fillNgMesh(occgeo, *ngMesh, nodeVec, meshedSM[ MeshDim_0D ]) &&
fillNgMesh(occgeo, *ngMesh, nodeVec, meshedSM[ MeshDim_1D ]));
}
initState = NETGENPlugin_ngMeshInfo(ngMesh);