Salome HOME
[bos #40653][CEA] New mesh import export formats with meshio.
[modules/smesh.git] / src / SMESH / SMESH_subMesh.cxx
index cf6ba0b9896e33045c220e6bf67fc2f43313b2aa..18b6c3cdfe9687603d1dea4f8dacc19b5806ea71 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2022  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -37,6 +37,7 @@
 #include "SMESH_Mesh.hxx"
 #include "SMESH_MesherHelper.hxx"
 #include "SMESH_subMeshEventListener.hxx"
+#include "SMESH_MeshLocker.hxx"
 
 #include "utilities.h"
 #include "Basics_Utils.hxx"
@@ -62,10 +63,9 @@ using namespace std;
 
 #ifdef _DEBUG_
 // enable printing algo + shape id + hypo used while meshing
-//#define PRINT_WHO_COMPUTE_WHAT
+#define PRINT_WHO_COMPUTE_WHAT
 #endif
 
-#define PRINT_WHO_COMPUTE_WHAT
 //=============================================================================
 /*!
  * \brief Allocate some memory at construction and release it at destruction.
@@ -207,20 +207,6 @@ SMESH_Algo* SMESH_subMesh::GetAlgo() const
   return _algo;
 }
 
-//================================================================================
-/*!
- * \brief Returns a current algorithm
- */
-//================================================================================
-
-SMESH_Algo* SMESH_subMesh::CopyAlgo() const
-{
-  //SMESH_Algo* algo = (SMESH_Algo*) new StdMeshers_Regular_1D(666, _father->GetGent());
-  SMESH_Algo* algo;
-
-  return algo;
-}
-
 //================================================================================
 /*!
  * \brief Allow algo->Compute() if a sub-shape of lower dim is meshed but
@@ -271,7 +257,7 @@ bool SMESH_subMesh::IsMeshComputed() const
       TopExp_Explorer exp( _subShape, (TopAbs_ShapeEnum) type );
       for ( ; exp.More(); exp.Next() )
       {
-        if ( SMESHDS_SubMesh * smDS = meshDS->MeshElements( exp.Current() ))
+        if ( SMESHDS_SubMesh * smDS = meshDS->MeshElements( exp.Current() ) )
         {
           bool computed = (dim > 0) ? smDS->NbElements() : smDS->NbNodes();
           if ( computed )
@@ -905,7 +891,10 @@ SMESH_Hypothesis::Hypothesis_Status
           ret = SMESH_Hypothesis::HYP_INCOMPATIBLE;
       }
       else if (!_father->IsUsedHypothesis( anHyp, this ))
-        ret = SMESH_Hypothesis::HYP_INCOMPATIBLE;
+      {
+        if ( anHyp->GetDim() == this->GetAlgo()->GetDim() )
+          ret = SMESH_Hypothesis::HYP_INCOMPATIBLE;
+      }
 
       if (SMESH_Hypothesis::IsStatusFatal( ret ))
       {
@@ -1407,16 +1396,13 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
     else if (( event == COMPUTE || event == COMPUTE_SUBMESH )
              && !_alwaysComputed )
     {
-      // LOCK: Adding node to mesh
-      _father->Lock();
+      SMESH_MeshLocker myLocker(_father);
       const TopoDS_Vertex & V = TopoDS::Vertex( _subShape );
       gp_Pnt P = BRep_Tool::Pnt(V);
       if ( SMDS_MeshNode * n = _father->GetMeshDS()->AddNode(P.X(), P.Y(), P.Z()) ) {
         _father->GetMeshDS()->SetNodeOnVertex(n,_Id);
         _computeState = COMPUTE_OK;
       }
-      _father->Unlock();
-      // UNLOCK
     }
     if ( event == MODIF_ALGO_STATE )
       cleanDependants();
@@ -1520,12 +1506,8 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
     case COMPUTE_SUBMESH:
       {
         algo = GetAlgo();
-        SMESH_Algo* algo2 = CopyAlgo();
-        cout << "Algo2" << algo2;
         ASSERT(algo);
-        //_father->Lock();
-        //ret = algo->CheckHypothesis((*_father), _subShape, hyp_status);
-        //_father->Unlock();
+        ret = algo->CheckHypothesis((*_father), _subShape, hyp_status);
         if (!ret)
         {
           MESSAGE("***** verify compute state *****");
@@ -1534,11 +1516,11 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
           break;
         }
         TopoDS_Shape shape = _subShape;
-        algo->SubMeshesToCompute().assign( 1, this );
+        algo->setSubMeshesToCompute(this);
         // check submeshes needed
-        // Forcing to false for parallel run
-        // TODO: Remove forced false
-        if (_father->HasShapeToMesh() && false) {
+        // When computing in parallel mode we do not have a additional layer of submesh
+        // The check should not be done in parallel as that check is not thread-safe
+        if (_father->HasShapeToMesh() && (!_father->IsParallel() || shape.ShapeType() != _father->GetParallelElement() )) {
           bool subComputed = false, subFailed = false;
           if (!algo->OnlyUnaryInput()) {
             //  --- commented for bos#22320 to compute all sub-shapes at once if possible;
@@ -1594,14 +1576,13 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
           }
           else
           {
-            std::cout<<"Running compute for " << _father << " of shape type " << shape.ShapeType() << std::endl;
             ret = algo->Compute((*_father), shape);
           }
           // algo can set _computeError of submesh
           _computeError = SMESH_ComputeError::Worst( _computeError, algo->GetComputeError() );
         }
         catch ( ::SMESH_ComputeError& comperr ) {
-          cout << " SMESH_ComputeError caught" << endl;
+          MESSAGE(" SMESH_ComputeError caught");
           if ( !_computeError ) _computeError = SMESH_ComputeError::New();
           *_computeError = comperr;
         }
@@ -1668,10 +1649,9 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
 #ifdef PRINT_WHO_COMPUTE_WHAT
         for (subS.ReInit(); subS.More(); subS.Next())
         {
-          _father->Lock();
-          const std::list <const SMESHDS_Hypothesis *> hyps =
-            _algo->GetUsedHypothesis( *_father, _subShape );
-          _father->Unlock();
+          SMESH_MeshLocker myLocker(_father);
+          const std::list <const SMESHDS_Hypothesis *> & hyps =
+              _algo->GetUsedHypothesis( *_father, _subShape );
           SMESH_Comment hypStr;
           if ( !hyps.empty() )
           {
@@ -1757,9 +1737,7 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
             updateDependantsState( SUBMESH_COMPUTED );
         }
         // let algo clear its data gathered while algo->Compute()
-        //_father->Lock();
-        //algo->CheckHypothesis((*_father), _subShape, hyp_status);
-        //_father->Unlock();
+        algo->CheckHypothesis((*_father), _subShape, hyp_status);
       }
       break;
     case COMPUTE_CANCELED:               // nothing to do
@@ -1927,7 +1905,7 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
     break;
   }
 
-  //notifyListenersOnEvent( event, COMPUTE_EVENT );
+  notifyListenersOnEvent( event, COMPUTE_EVENT );
 
   return ret;
 }
@@ -2195,10 +2173,8 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * /*theGen*/,
     return _subShape;
 
   const bool skipAuxHyps = false;
-  _father->Lock();
   list<const SMESHDS_Hypothesis*> usedHyps =
     theAlgo->GetUsedHypothesis( *_father, _subShape, skipAuxHyps ); // copy
-  _father->Lock();
   std::list < TopoDS_Shape >  assiShapes = theAlgo->GetAssignedShapes();
 
   // put in a compound all shapes with the same hypothesis assigned
@@ -2215,10 +2191,13 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * /*theGen*/,
   {
     SMESH_subMesh* subMesh = smIt->next();
     const TopoDS_Shape&  S = subMesh->_subShape;
-    if ( S.ShapeType() != this->_subShape.ShapeType() )
+
+    if ( S.ShapeType() != this->_subShape.ShapeType() ){
       continue;
-    if ( _allowedSubShapes && !_allowedSubShapes->IsEmpty() && !_allowedSubShapes->Contains( S ))
+    }
+    if ( _allowedSubShapes && !_allowedSubShapes->IsEmpty() && !_allowedSubShapes->Contains( S )){
       continue;
+    }
     if ( subMesh == this )
     {
       aBuilder.Add( aCompound, S );
@@ -2226,8 +2205,8 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * /*theGen*/,
     }
     else if ( subMesh->GetComputeState() == READY_TO_COMPUTE )
     {
-      _father->Lock();
       SMESH_Algo* anAlgo = subMesh->GetAlgo();
+
       if (( anAlgo->IsSameName( *theAlgo )) && // same algo
           ( anAlgo->GetUsedHypothesis( *_father, S, skipAuxHyps ) == usedHyps ) && // same hyps
           ( anAlgo->GetAssignedShapes() == assiShapes ) && // on same sub-shapes
@@ -2238,7 +2217,6 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * /*theGen*/,
           theSubComputed = false;
         theSubs.push_back( subMesh );
       }
-      _father->Unlock();
     }
   }