]> SALOME platform Git repositories - plugins/netgenplugin.git/commitdiff
Salome HOME
Merge from V5_1_3_BR branch (07/12/09) BR_FSH_DEV V6_0_0
authorvsr <vsr@opencascade.com>
Tue, 8 Dec 2009 16:04:11 +0000 (16:04 +0000)
committervsr <vsr@opencascade.com>
Tue, 8 Dec 2009 16:04:11 +0000 (16:04 +0000)
src/NETGENPlugin/NETGENPlugin_Mesher.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx

index b7b835822d2bdbe3ab23426aaaf94f5a819372c8..677ed206b35ffe54f624804cff24000aaee32501 100644 (file)
@@ -41,6 +41,7 @@
 #include <utilities.h>
 
 #include <vector>
+#include <limits>
 
 #include <BRep_Tool.hxx>
 #include <TopExp.hxx>
@@ -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<int>::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<int> 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<int> aVec(SMDSEntity_Last);
-    for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i]=0;
-    if( mparams.secondorder > 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<int> aVec(SMDSEntity_Last);
-    for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i]=0;
+    if ( !tooManyElems )
+      for (TopExp_Explorer exp1(F,TopAbs_EDGE); exp1.More(); exp1.Next())
+        nb1d += EdgesMap.Find(exp1.Current());
+
+    int nbFaces = tooManyElems ? hugeNb : int( 4*anArea / mparams.maxh*mparams.maxh*sqrt(3.));
+    int nbNodes = tooManyElems ? hugeNb : (( nbFaces*3 - (nb1d-1)*2 ) / 6 + 1 );
+
+    std::vector<int> 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<int> aVec(SMDSEntity_Last);
-    for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i]=0;
-    if( mparams.secondorder > 0 ) {
-      aVec[SMDSEntity_Node] = nb1d_in/3 + 1 + nb1d_in;
-      aVec[SMDSEntity_Quad_Tetra] = nbVols;
+    std::vector<int> 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));
index 6fb7036274d3633db917c227b553c1459eaeb844..331de00cd733ac77c183cb87256bc863bee82f87 100644 (file)
@@ -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);
index 51f01e08d8f877ab5c608af7d760e5672f13482a..f2e94412c5539320ef3fb95d8ca952f07a09dda5 100644 (file)
@@ -47,6 +47,7 @@
 
 #include <list>
 #include <vector>
+#include <limits>
 
 /*
   Netgen include files
@@ -206,10 +207,6 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
     StdMeshers_FaceSidePtr wire = wires[ iW ];
     const vector<UVPtStruct>& 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<int>::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<int> aVec(SMDSEntity_Last);
   for(int i=SMDSEntity_Node; i<SMDSEntity_Last; i++) aVec[i]=0;