X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2FStdMeshers%2FStdMeshers_ViscousLayers.cxx;h=4872d5c9b46f9d747194ab00b3ed61f857377974;hb=9e3ba593d523e41dabd369657ab59b8b9c10346b;hp=73536f8eb82acd8d75eaa3fe8f0689f663d98659;hpb=e201ae8a2a7d37a84c195803ee97237be92f2f9b;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index 73536f8eb..4872d5c9b 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -63,6 +63,7 @@ #include #include #include +#include //#define __myDEBUG @@ -321,6 +322,14 @@ namespace VISCOUS void Copy( _LayerEdge& other, SMESH_MesherHelper& helper ); void SetCosin( double cosin ); }; + struct _LayerEdgeCmp + { + bool operator () (const _LayerEdge* e1, const _LayerEdge* e2) const + { + const bool cmpNodes = ( e1 && e2 && e1->_nodes.size() && e2->_nodes.size() ); + return cmpNodes ? ( e1->_nodes[0]->GetID() < e2->_nodes[0]->GetID()) : ( e1 < e2 ); + } + }; //-------------------------------------------------------------------------------- typedef map< const SMDS_MeshNode*, _LayerEdge*, TIDCompare > TNode2Edge; @@ -1279,7 +1288,7 @@ void _ViscousBuilder::limitStepSize( _SolidData& data, if ( nextN->GetPosition()->GetTypeOfPosition() == SMDS_TOP_FACE || curN->GetPosition()->GetTypeOfPosition() == SMDS_TOP_FACE ) { - double dist = SMESH_MeshEditor::TNodeXYZ( face->GetNode(i)).Distance( nextN ); + double dist = SMESH_TNodeXYZ( face->GetNode(i)).Distance( nextN ); if ( dist < minSize ) minSize = dist, iN = i; } @@ -1308,7 +1317,7 @@ void _ViscousBuilder::limitStepSize( _SolidData& data, const double minSize) if ( data._stepSizeNodes[0] ) { double dist = - SMESH_MeshEditor::TNodeXYZ(data._stepSizeNodes[0]).Distance(data._stepSizeNodes[1]); + SMESH_TNodeXYZ(data._stepSizeNodes[0]).Distance(data._stepSizeNodes[1]); data._stepSizeCoeff = data._stepSize / dist; } } @@ -1595,7 +1604,7 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge, } else { - edge._pos.push_back( SMESH_MeshEditor::TNodeXYZ( node )); + edge._pos.push_back( SMESH_TNodeXYZ( node )); if ( posType == SMDS_TOP_FACE ) { @@ -1603,7 +1612,7 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge, double avgNormProj = 0, avgLen = 0; for ( unsigned i = 0; i < edge._simplices.size(); ++i ) { - gp_XYZ vec = edge._pos.back() - SMESH_MeshEditor::TNodeXYZ( edge._simplices[i]._nPrev ); + gp_XYZ vec = edge._pos.back() - SMESH_TNodeXYZ( edge._simplices[i]._nPrev ); avgNormProj += edge._normal * vec; avgLen += vec.Modulus(); } @@ -1693,9 +1702,9 @@ void _LayerEdge::SetDataByNeighbors( const SMDS_MeshNode* n1, if ( _nodes[0]->GetPosition()->GetTypeOfPosition() != SMDS_TOP_EDGE ) return; - gp_XYZ pos = SMESH_MeshEditor::TNodeXYZ( _nodes[0] ); - gp_XYZ vec1 = pos - SMESH_MeshEditor::TNodeXYZ( n1 ); - gp_XYZ vec2 = pos - SMESH_MeshEditor::TNodeXYZ( n2 ); + gp_XYZ pos = SMESH_TNodeXYZ( _nodes[0] ); + gp_XYZ vec1 = pos - SMESH_TNodeXYZ( n1 ); + gp_XYZ vec2 = pos - SMESH_TNodeXYZ( n2 ); // Set _curvature @@ -1836,7 +1845,7 @@ void _ViscousBuilder::makeGroupOfLE() for ( unsigned j = 0 ; j < _sdVec[i]._edges.size(); ++j ) { _LayerEdge& edge = *_sdVec[i]._edges[j]; - SMESH_MeshEditor::TNodeXYZ nXYZ( edge._nodes[0] ); + SMESH_TNodeXYZ nXYZ( edge._nodes[0] ); nXYZ += edge._normal * _sdVec[i]._stepSize; dumpCmd(SMESH_Comment("mesh.AddEdge([ ") <GetID() << ", mesh.AddNode( " << nXYZ.X()<<","<< nXYZ.Y()<<","<< nXYZ.Z()<<")])"); @@ -1969,7 +1978,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) limitStepSize( data, 0.25 * distToIntersection ); if ( data._stepSizeNodes[0] ) data._stepSize = data._stepSizeCoeff * - SMESH_MeshEditor::TNodeXYZ(data._stepSizeNodes[0]).Distance(data._stepSizeNodes[1]); + SMESH_TNodeXYZ(data._stepSizeNodes[0]).Distance(data._stepSizeNodes[1]); } if (nbSteps == 0 ) @@ -2058,7 +2067,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data, for ( int i = iBeg; i < iEnd; ++i ) { _LayerEdge* edge = data._edges[i]; - SMESH_MeshEditor::TNodeXYZ tgtXYZ( edge->_nodes.back() ); + SMESH_TNodeXYZ tgtXYZ( edge->_nodes.back() ); for ( unsigned j = 0; j < edge->_simplices.size(); ++j ) if ( !edge->_simplices[j].IsForward( edge->_nodes[0], &tgtXYZ )) { @@ -2177,7 +2186,8 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, // 1) Find intersections double dist; const SMDS_MeshElement* face; - map< _LayerEdge*, set< _LayerEdge* > > edge2CloseEdge; + typedef map< _LayerEdge*, set< _LayerEdge*, _LayerEdgeCmp >, _LayerEdgeCmp > TLEdge2LEdgeSet; + TLEdge2LEdgeSet edge2CloseEdge; const double eps = data._epsilon * data._epsilon; for ( unsigned i = 0; i < data._edges.size(); ++i ) @@ -2187,7 +2197,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, if ( edge->FindIntersection( *searcher, dist, eps, &face )) { const TmpMeshFaceOnEdge* f = (const TmpMeshFaceOnEdge*) face; - set< _LayerEdge* > & ee = edge2CloseEdge[ edge ]; + set< _LayerEdge*, _LayerEdgeCmp > & ee = edge2CloseEdge[ edge ]; ee.insert( f->_le1 ); ee.insert( f->_le2 ); if ( f->_le1->IsOnEdge() && f->_le1->_sWOL.IsNull() ) @@ -2203,12 +2213,12 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, { dumpFunction(SMESH_Comment("updateNormals")< >::iterator e2ee = edge2CloseEdge.begin(); + TLEdge2LEdgeSet::iterator e2ee = edge2CloseEdge.begin(); for ( ; e2ee != edge2CloseEdge.end(); ++e2ee ) { _LayerEdge* edge1 = e2ee->first; _LayerEdge* edge2 = 0; - set< _LayerEdge* >& ee = e2ee->second; + set< _LayerEdge*, _LayerEdgeCmp >& ee = e2ee->second; // find EDGEs the edges reside TopoDS_Edge E1, E2; @@ -2463,7 +2473,7 @@ gp_Ax1 _LayerEdge::LastSegment(double& segLen) const gp_Ax1 segDir; if ( iPrev < 0 ) { - segDir.SetLocation( SMESH_MeshEditor::TNodeXYZ( _nodes[0] )); + segDir.SetLocation( SMESH_TNodeXYZ( _nodes[0] )); segDir.SetDirection( _normal ); segLen = 0; } @@ -2484,7 +2494,7 @@ gp_Ax1 _LayerEdge::LastSegment(double& segLen) const Handle(Geom_Surface) surface = BRep_Tool::Surface( TopoDS::Face(_sWOL), loc ); pPrev = surface->Value( pPrev.X(), pPrev.Y() ).Transformed( loc ); } - dir = SMESH_MeshEditor::TNodeXYZ( _nodes.back() ) - pPrev.XYZ(); + dir = SMESH_TNodeXYZ( _nodes.back() ) - pPrev.XYZ(); } segDir.SetLocation( pPrev ); segDir.SetDirection( dir ); @@ -2514,9 +2524,9 @@ bool _LayerEdge::SegTriaInter( const gp_Ax1& lastSegment, gp_XYZ orig = lastSegment.Location().XYZ(); gp_XYZ dir = lastSegment.Direction().XYZ(); - SMESH_MeshEditor::TNodeXYZ vert0( n0 ); - SMESH_MeshEditor::TNodeXYZ vert1( n1 ); - SMESH_MeshEditor::TNodeXYZ vert2( n2 ); + SMESH_TNodeXYZ vert0( n0 ); + SMESH_TNodeXYZ vert1( n1 ); + SMESH_TNodeXYZ vert2( n2 ); /* calculate distance from vert0 to ray origin */ gp_XYZ tvec = orig - vert0; @@ -2597,11 +2607,11 @@ bool _LayerEdge::SmoothOnEdge(Handle(Geom_Surface)& surface, ASSERT( IsOnEdge() ); SMDS_MeshNode* tgtNode = const_cast( _nodes.back() ); - SMESH_MeshEditor::TNodeXYZ oldPos( tgtNode ); + SMESH_TNodeXYZ oldPos( tgtNode ); double dist01, distNewOld; - SMESH_MeshEditor::TNodeXYZ p0( _2neibors->_nodes[0]); - SMESH_MeshEditor::TNodeXYZ p1( _2neibors->_nodes[1]); + SMESH_TNodeXYZ p0( _2neibors->_nodes[0]); + SMESH_TNodeXYZ p1( _2neibors->_nodes[1]); dist01 = p0.Distance( _2neibors->_nodes[1] ); gp_Pnt newPos = p0 * _2neibors->_wgt[0] + p1 * _2neibors->_wgt[1]; @@ -2619,7 +2629,7 @@ bool _LayerEdge::SmoothOnEdge(Handle(Geom_Surface)& surface, if ( _2neibors->_plnNorm ) { // put newPos on the plane defined by source node and _plnNorm - gp_XYZ new2src = SMESH_MeshEditor::TNodeXYZ( _nodes[0] ) - newPos.XYZ(); + gp_XYZ new2src = SMESH_TNodeXYZ( _nodes[0] ) - newPos.XYZ(); double new2srcProj = (*_2neibors->_plnNorm) * new2src; newPos.ChangeCoord() += (*_2neibors->_plnNorm) * new2srcProj; } @@ -2665,7 +2675,7 @@ bool _LayerEdge::Smooth(int& badNb) // compute new position for the last _pos gp_XYZ newPos (0,0,0); for ( unsigned i = 0; i < _simplices.size(); ++i ) - newPos += SMESH_MeshEditor::TNodeXYZ( _simplices[i]._nPrev ); + newPos += SMESH_TNodeXYZ( _simplices[i]._nPrev ); newPos /= _simplices.size(); if ( _curvature ) @@ -2686,7 +2696,7 @@ bool _LayerEdge::Smooth(int& badNb) // } // count quality metrics (orientation) of tetras around _tgtNode int nbOkBefore = 0; - SMESH_MeshEditor::TNodeXYZ tgtXYZ( _nodes.back() ); + SMESH_TNodeXYZ tgtXYZ( _nodes.back() ); for ( unsigned i = 0; i < _simplices.size(); ++i ) nbOkBefore += _simplices[i].IsForward( _nodes[0], &tgtXYZ ); @@ -2699,7 +2709,7 @@ bool _LayerEdge::Smooth(int& badNb) SMDS_MeshNode* n = const_cast< SMDS_MeshNode* >( _nodes.back() ); - _len -= prevPos.Distance(SMESH_MeshEditor::TNodeXYZ( n )); + _len -= prevPos.Distance(SMESH_TNodeXYZ( n )); _len += prevPos.Distance(newPos); n->setXYZ( newPos.X(), newPos.Y(), newPos.Z()); @@ -2727,7 +2737,7 @@ void _LayerEdge::SetNewLength( double len, SMESH_MesherHelper& helper ) } SMDS_MeshNode* n = const_cast< SMDS_MeshNode*>( _nodes.back() ); - SMESH_MeshEditor::TNodeXYZ oldXYZ( n ); + SMESH_TNodeXYZ oldXYZ( n ); gp_XYZ nXYZ = oldXYZ + _normal * ( len - _len ) * _lenFactor; n->setXYZ( nXYZ.X(), nXYZ.Y(), nXYZ.Z() ); @@ -3806,7 +3816,7 @@ bool _ViscousBuilder::addBoundaryElements() map< TGeomID, TopoDS_Shape >::iterator e2f = data._shrinkShape2Shape.find( getMeshDS()->ShapeToIndex( E )); TopoDS_Shape F; - if ( isOnFace = ( e2f != data._shrinkShape2Shape.end() )) + if (( isOnFace = ( e2f != data._shrinkShape2Shape.end() ))) { F = e2f->second.Oriented( TopAbs_FORWARD ); reverse = ( helper.GetSubShapeOri( F, E ) == TopAbs_REVERSED ); @@ -3839,8 +3849,6 @@ bool _ViscousBuilder::addBoundaryElements() // Make faces const int dj1 = reverse ? 0 : 1; const int dj2 = reverse ? 1 : 0; - vector newFaces; - newFaces.reserve(( ledges.size() - 1 ) * (ledges[0]->_nodes.size() - 1 )); for ( unsigned j = 1; j < ledges.size(); ++j ) { vector< const SMDS_MeshNode*>& nn1 = ledges[j-dj1]->_nodes;