Salome HOME
23418: [OCC] Mesh: Minimization of memory usage of SMESH V8_5_0b1
authoreap <eap@opencascade.com>
Fri, 22 Dec 2017 11:16:51 +0000 (14:16 +0300)
committereap <eap@opencascade.com>
Thu, 5 Apr 2018 14:15:06 +0000 (17:15 +0300)
src/NETGENPlugin/NETGENPlugin_Mesher.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx
src/NETGENPlugin/NETGENPlugin_Remesher_2D.cxx

index 7da62dceef203c752d7c290bba8e44afaeb0cfbb..4cab2a9e074b5818c5aa2cc9737456d11268c730 100644 (file)
@@ -1375,9 +1375,11 @@ bool NETGENPlugin_Mesher::FillNgMesh(netgen::OCCGeometry&           occgeom,
           PShapeIteratorPtr solidIt=helper.GetAncestors(geomFace,*sm->GetFather(),TopAbs_SOLID);
           if ( const TopoDS_Shape * solid = solidIt->next() )
             sm = _mesh->GetSubMesh( *solid );
-          SMESH_ComputeErrorPtr& smError = sm->GetComputeError();
-          smError.reset( new SMESH_ComputeError(COMPERR_BAD_INPUT_MESH,"Not triangle sub-mesh"));
-          smError->myBadElements.push_back( f );
+          SMESH_BadInputElements* badElems =
+            new SMESH_BadInputElements( helper.GetMeshDS(), COMPERR_BAD_INPUT_MESH,
+                                        "Not triangle sub-mesh");
+          badElems->add( f );
+          sm->GetComputeError().reset( badElems );
           return false;
         }
 
@@ -3318,7 +3320,7 @@ bool NETGENPlugin_Mesher::Compute()
           _mesh->GetMeshDS()->RemoveFreeNode( nodeVec[i], 0, /*fromGroups=*/false );
   }
   SMESH_ComputeErrorPtr readErr = ReadErrors(nodeVec);
-  if ( readErr && !readErr->myBadElements.empty() )
+  if ( readErr && readErr->HasBadElems() )
   {
     error = readErr;
     if ( !comment.empty() && !readErr->myComment.empty() ) comment += "\n";
@@ -3380,9 +3382,10 @@ bool NETGENPlugin_Mesher::Compute()
             {
               smError->myName = COMPERR_WARNING;
             }
-            else if ( !smError->myBadElements.empty() ) // bad surface mesh
+            else if ( smError->HasBadElems() ) // bad surface mesh
             {
-              if ( !hasBadElemOnSolid( smError->myBadElements, sm ))
+              if ( !hasBadElemOnSolid
+                   ( static_cast<SMESH_BadInputElements*>( smError.get() )->myBadElements, sm ))
                 smError.reset();
             }
           }
@@ -3712,8 +3715,10 @@ double NETGENPlugin_Mesher::GetProgress(const SMESH_Algo* holder,
 SMESH_ComputeErrorPtr
 NETGENPlugin_Mesher::ReadErrors(const vector<const SMDS_MeshNode* >& nodeVec)
 {
-  SMESH_ComputeErrorPtr err = SMESH_ComputeError::New
-    (COMPERR_BAD_INPUT_MESH, "Some edges multiple times in surface mesh");
+  if ( nodeVec.size() < 2 ) return SMESH_ComputeErrorPtr();
+  SMESH_BadInputElements* err =
+    new SMESH_BadInputElements( nodeVec.back()->GetMesh(), COMPERR_BAD_INPUT_MESH,
+                                "Some edges multiple times in surface mesh");
   SMESH_File file("test.out");
   vector<int> two(2);
   vector<int> three1(3), three2(3);
@@ -3773,7 +3778,7 @@ NETGENPlugin_Mesher::ReadErrors(const vector<const SMDS_MeshNode* >& nodeVec)
   if ( nbBadElems ) nbBadElems++; // avoid warning: variable set but not used
 #endif
 
-  return err;
+  return SMESH_ComputeErrorPtr( err );
 }
 
 //================================================================================
index 6b2047474c2c7a99cf2b8f6c8277a6bf16f5911f..c9872561693dc4ec7749da3625d7b46aca5bdc1e 100644 (file)
@@ -538,7 +538,7 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh&                     aMesh,
   if ( err )
   {
     SMESH_ComputeErrorPtr ce = NETGENPlugin_Mesher::ReadErrors(nodeVec);
-    if ( ce && !ce->myBadElements.empty() )
+    if ( ce && ce->HasBadElems() )
       error( ce );
   }
 
index 08f05b53ba449a955eb830edd49f9846e72c2d9b..030d571d7497836e1869b7227012c5f47cae2efe 100644 (file)
@@ -109,7 +109,8 @@ namespace
     {
       // set bad faces into a compute error
       const char* text = "Non-manifold mesh. Only manifold mesh can be re-meshed";
-      SMESH_ComputeErrorPtr error = SMESH_ComputeError::New( COMPERR_BAD_INPUT_MESH, text );
+      SMESH_BadInputElements* error =
+        new SMESH_BadInputElements( myMeshDS, COMPERR_BAD_INPUT_MESH, text );
       SMESH::Controls::MultiConnection2D fun;
       fun.SetMesh( myMeshDS );
       SMDS_ElemIteratorPtr fIt = myMeshDS->elementsIterator( SMDSAbs_Face );
@@ -119,7 +120,7 @@ namespace
         if ( fun.GetValue( f->GetID() ) > 2 )
           error->myBadElements.push_back( f );
       }
-      theMesh.GetSubMesh( theMesh.GetShapeToMesh() )->GetComputeError() = error;
+      theMesh.GetSubMesh( theMesh.GetShapeToMesh() )->GetComputeError().reset( error );
       throw SALOME_Exception( text );
     }
 
@@ -153,12 +154,13 @@ namespace
       if ( !freeBords._coincidentGroups.empty() )
       {
         const char* text = "Can't re-meshed a mesh with coincident free edges";
-        SMESH_ComputeErrorPtr error = SMESH_ComputeError::New( COMPERR_BAD_INPUT_MESH, text );
+        SMESH_BadInputElements* error =
+          new SMESH_BadInputElements( myMeshDS, COMPERR_BAD_INPUT_MESH, text );
         for ( size_t i = 0; i < freeBords._borders.size(); ++i )
           error->myBadElements.insert( error->myBadElements.end(),
                                        freeBords._borders[i].begin(),
                                        freeBords._borders[i].end() );
-        theMesh.GetSubMesh( theMesh.GetShapeToMesh() )->GetComputeError() = error;
+        theMesh.GetSubMesh( theMesh.GetShapeToMesh() )->GetComputeError().reset( error );
         throw SALOME_Exception( text );
       }
     }