From: vsr Date: Tue, 8 Dec 2009 16:04:11 +0000 (+0000) Subject: Merge from V5_1_3_BR branch (07/12/09) X-Git-Tag: V6_0_0 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2FBR_FSH_DEV;p=plugins%2Fnetgenplugin.git Merge from V5_1_3_BR branch (07/12/09) --- diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx index b7b8358..677ed20 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -1016,6 +1017,9 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap) list< SMESH_subMesh* > meshedSM; PrepareOCCgeometry( occgeo, _shape, *_mesh, &meshedSM ); + bool tooManyElems = false; + const int hugeNb = std::numeric_limits::max() / 100; + // ---------------- // evaluate 1D // ---------------- @@ -1043,22 +1047,30 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap) if( EdgesMap.IsBound(E) ) continue; SMESH_subMesh *sm = _mesh->GetSubMesh(E); + std::vector aVec(SMDSEntity_Last, 0); double aLen = SMESH_Algo::EdgeLength(E); fullLen += aLen; int nb1d = nbs; - if(nb1d==0) { - nb1d = (int)( aLen/mparams.maxh + 1 ); + tooManyElems = ( aLen/hugeNb > mparams.maxh ); + if(nb1d==0 && !tooManyElems) { + nb1d = (int)( aLen/mparams.maxh + 1 ); } - fullNbSeg += nb1d; - std::vector aVec(SMDSEntity_Last); - for(int i=SMDSEntity_Node; i 0 ) { - aVec[SMDSEntity_Node] = 2*nb1d - 1; - aVec[SMDSEntity_Quad_Edge] = nb1d; + if ( tooManyElems ) // avoid FPE + { + aVec[SMDSEntity_Node] = hugeNb; + aVec[ mparams.secondorder > 0 ? SMDSEntity_Quad_Edge : SMDSEntity_Edge] = hugeNb; } - else { - aVec[SMDSEntity_Node] = nb1d - 1; - aVec[SMDSEntity_Edge] = nb1d; + else + { + fullNbSeg += nb1d; + if( mparams.secondorder > 0 ) { + aVec[SMDSEntity_Node] = 2*nb1d - 1; + aVec[SMDSEntity_Quad_Edge] = nb1d; + } + else { + aVec[SMDSEntity_Node] = nb1d - 1; + aVec[SMDSEntity_Edge] = nb1d; + } } aResMap.insert(std::make_pair(sm,aVec)); EdgesMap.Bind(E,nb1d); @@ -1080,20 +1092,24 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap) } mparams.maxh = min( mparams.maxh, occgeo.boundingbox.Diam()/2 ); } - for (TopExp_Explorer exp(_shape, TopAbs_FACE); exp.More(); exp.Next()) { + + for (TopExp_Explorer exp(_shape, TopAbs_FACE); exp.More(); exp.Next()) + { TopoDS_Face F = TopoDS::Face( exp.Current() ); SMESH_subMesh *sm = _mesh->GetSubMesh(F); GProp_GProps G; BRepGProp::SurfaceProperties(F,G); double anArea = G.Mass(); + tooManyElems = tooManyElems || ( anArea/hugeNb > mparams.maxh*mparams.maxh ); int nb1d = 0; - for (TopExp_Explorer exp1(F,TopAbs_EDGE); exp1.More(); exp1.Next()) { - nb1d += EdgesMap.Find(exp1.Current()); - } - int nbFaces = (int) ( anArea / ( mparams.maxh*mparams.maxh*sqrt(3.) / 4 ) ); - int nbNodes = (int) ( ( nbFaces*3 - (nb1d-1)*2 ) / 6 + 1 ); - std::vector aVec(SMDSEntity_Last); - for(int i=SMDSEntity_Node; i aVec(SMDSEntity_Last, 0); if( mparams.secondorder > 0 ) { int nb1d_in = (nbFaces*3 - nb1d) / 2; aVec[SMDSEntity_Node] = nbNodes + nb1d_in; @@ -1128,17 +1144,25 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap) BRepGProp::VolumeProperties(_shape,G); double aVolume = G.Mass(); double tetrVol = 0.1179*mparams.maxh*mparams.maxh*mparams.maxh; - int nbVols = int(aVolume/tetrVol); + tooManyElems = tooManyElems || ( aVolume/hugeNb > tetrVol ); + int nbVols = tooManyElems ? hugeNb : int(aVolume/tetrVol); int nb1d_in = int(( nbVols*6 - fullNbSeg ) / 6 ); - std::vector aVec(SMDSEntity_Last); - for(int i=SMDSEntity_Node; i 0 ) { - aVec[SMDSEntity_Node] = nb1d_in/3 + 1 + nb1d_in; - aVec[SMDSEntity_Quad_Tetra] = nbVols; + std::vector aVec(SMDSEntity_Last, 0 ); + if ( tooManyElems ) // avoid FPE + { + aVec[SMDSEntity_Node] = hugeNb; + aVec[ mparams.secondorder > 0 ? SMDSEntity_Quad_Tetra : SMDSEntity_Tetra] = hugeNb; } - else { - aVec[SMDSEntity_Node] = nb1d_in/3 + 1; - aVec[SMDSEntity_Tetra] = nbVols; + else + { + if( mparams.secondorder > 0 ) { + aVec[SMDSEntity_Node] = nb1d_in/3 + 1 + nb1d_in; + aVec[SMDSEntity_Quad_Tetra] = nbVols; + } + else { + aVec[SMDSEntity_Node] = nb1d_in/3 + 1; + aVec[SMDSEntity_Tetra] = nbVols; + } } SMESH_subMesh *sm = _mesh->GetSubMesh(_shape); aResMap.insert(std::make_pair(sm,aVec)); diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx index 6fb7036..331de00 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx @@ -138,8 +138,8 @@ bool NETGENPlugin_NETGEN_2D::Compute(SMESH_Mesh& aMesh, //============================================================================= bool NETGENPlugin_NETGEN_2D::Evaluate(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - MapShapeNbElems& aResMap) + const TopoDS_Shape& aShape, + MapShapeNbElems& aResMap) { NETGENPlugin_Mesher mesher(&aMesh, aShape, false); diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx index 51f01e0..f2e9441 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx @@ -47,6 +47,7 @@ #include #include +#include /* Netgen include files @@ -206,10 +207,6 @@ static TError AddSegmentsToMesh(netgen::Mesh& ngMesh, StdMeshers_FaceSidePtr wire = wires[ iW ]; const vector& uvPtVec = wire->GetUVPtStruct(); - bool reverse = // 20526: [CEA] Disk meshing fails - ( wire->NbEdges() == 1 && - geom.emap(geom.emap.FindIndex(wire->Edge(0))).Orientation() == TopAbs_REVERSED ); - int firstPointID = ngMesh.GetNP() + 1; int edgeID = 1, posID = -2; for ( int i = 0; i < wire->NbSegments(); ++i ) // loop on segments @@ -265,18 +262,6 @@ static TError AddSegmentsToMesh(netgen::Mesh& ngMesh, } seg.epgeominfo[ iEnd ].edgenr = edgeID; // = geom.emap.FindIndex(edge); } - // 20526: [CEA] Disk meshing fails - if (reverse) - { -#ifdef NETGEN_NEW - swap (seg.pnums[0], seg.pnums[1]); -#else - swap (seg.p1, seg.p2); -#endif - swap (seg.epgeominfo[0].dist, seg.epgeominfo[1].dist); - swap (seg.epgeominfo[0].u, seg.epgeominfo[1].u); - swap (seg.epgeominfo[0].v, seg.epgeominfo[1].v); - } ngMesh.AddSegment (seg); @@ -529,21 +514,19 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Evaluate(SMESH_Mesh& aMesh, double maxArea = _hypMaxElementArea->GetMaxArea(); ELen = sqrt(2. * maxArea/sqrt(3.0)); } - if ( ELen < Precision::Confusion() ) { - SMESH_subMesh *sm = aMesh.GetSubMesh(F); - if ( sm ) { - SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); - smError.reset( new SMESH_ComputeError(COMPERR_ALGO_FAILED,"Submesh can not be evaluated.\nToo small element length",this)); - } - return false; - } - GProp_GProps G; BRepGProp::SurfaceProperties(F,G); double anArea = G.Mass(); - int nbFaces = 0; - if ( ELen > Precision::Confusion() ) - nbFaces = (int) ( anArea / ( ELen*ELen*sqrt(3.) / 4 ) ); + + const int hugeNb = numeric_limits::max()/10; + if ( anArea / hugeNb > ELen*ELen ) + { + SMESH_subMesh *sm = aMesh.GetSubMesh(F); + SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); + smError.reset( new SMESH_ComputeError(COMPERR_ALGO_FAILED,"Submesh can not be evaluated.\nToo small element length",this)); + return false; + } + int nbFaces = (int) ( anArea / ( ELen*ELen*sqrt(3.) / 4 ) ); int nbNodes = (int) ( ( nbFaces*3 - (nb1d-1)*2 ) / 6 + 1 ); std::vector aVec(SMDSEntity_Last); for(int i=SMDSEntity_Node; i