Salome HOME
Parallel version for 1d mesher number of segment
authorYoann Audouin <yoann.audouin@edf.fr>
Mon, 25 Jul 2022 08:35:21 +0000 (10:35 +0200)
committerYoann Audouin <yoann.audouin@edf.fr>
Tue, 18 Oct 2022 13:01:44 +0000 (15:01 +0200)
src/SMESH/SMESH_Algo.cxx
src/SMESH/SMESH_Gen.cxx
src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMesh.hxx
src/StdMeshers/StdMeshers_Regular_1D.cxx

index 582e554ee9ac9fe2be291bd60763b7bbf84e4226..215879d3c46f517edad022d56fc8a99b759e6b88 100644 (file)
@@ -281,6 +281,9 @@ SMESH_Algo::GetUsedHypothesis(SMESH_Mesh &         aMesh,
   if ( _usedHypList == savedHyps )
     savedHyps.swap( me->_usedHypList );
 
+  for(auto hyp:_usedHypList){
+    std::cout << hyp << std::endl;
+  }
   return _usedHypList;
 }
 
index 9f81f7494693a050bc3842f00aa70b4d396a25fc..a67b6f09b0e3a32a23b2a978ba0cff6ecb544962 100644 (file)
@@ -262,6 +262,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh &                aMesh,
           std::cout << "Waiting" << std::endl;
           it->wait();
         }
+        cout << "Number of segments: " << aMesh.NbEdges() << endl;
         //Resetting threaded pool info
         previousShapeType = shapeType;
         pending.clear();
index d37172d90e79f60075aa8270cb7aa3e3f086a2c9..cf6ba0b9896e33045c220e6bf67fc2f43313b2aa 100644 (file)
@@ -65,6 +65,7 @@ using namespace std;
 //#define PRINT_WHO_COMPUTE_WHAT
 #endif
 
+#define PRINT_WHO_COMPUTE_WHAT
 //=============================================================================
 /*!
  * \brief Allocate some memory at construction and release it at destruction.
@@ -206,6 +207,20 @@ 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
@@ -1392,6 +1407,7 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
     else if (( event == COMPUTE || event == COMPUTE_SUBMESH )
              && !_alwaysComputed )
     {
+      // LOCK: Adding node to mesh
       _father->Lock();
       const TopoDS_Vertex & V = TopoDS::Vertex( _subShape );
       gp_Pnt P = BRep_Tool::Pnt(V);
@@ -1400,6 +1416,7 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
         _computeState = COMPUTE_OK;
       }
       _father->Unlock();
+      // UNLOCK
     }
     if ( event == MODIF_ALGO_STATE )
       cleanDependants();
@@ -1502,10 +1519,13 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
     case COMPUTE:
     case COMPUTE_SUBMESH:
       {
-        _father->Lock();
         algo = GetAlgo();
+        SMESH_Algo* algo2 = CopyAlgo();
+        cout << "Algo2" << algo2;
         ASSERT(algo);
-        ret = algo->CheckHypothesis((*_father), _subShape, hyp_status);
+        //_father->Lock();
+        //ret = algo->CheckHypothesis((*_father), _subShape, hyp_status);
+        //_father->Unlock();
         if (!ret)
         {
           MESSAGE("***** verify compute state *****");
@@ -1516,7 +1536,9 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
         TopoDS_Shape shape = _subShape;
         algo->SubMeshesToCompute().assign( 1, this );
         // check submeshes needed
-        if (_father->HasShapeToMesh() ) {
+        // Forcing to false for parallel run
+        // TODO: Remove forced false
+        if (_father->HasShapeToMesh() && false) {
           bool subComputed = false, subFailed = false;
           if (!algo->OnlyUnaryInput()) {
             //  --- commented for bos#22320 to compute all sub-shapes at once if possible;
@@ -1544,7 +1566,6 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
             break; // goto exit
           }
         }
-        _father->Unlock();
         // Compute
 
         // to restore cout that may be redirected by algo
@@ -1647,8 +1668,10 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
 #ifdef PRINT_WHO_COMPUTE_WHAT
         for (subS.ReInit(); subS.More(); subS.Next())
         {
-          const std::list <const SMESHDS_Hypothesis *> & hyps =
+          _father->Lock();
+          const std::list <const SMESHDS_Hypothesis *> hyps =
             _algo->GetUsedHypothesis( *_father, _subShape );
+          _father->Unlock();
           SMESH_Comment hypStr;
           if ( !hyps.empty() )
           {
@@ -1734,9 +1757,9 @@ 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();
+        //_father->Lock();
+        //algo->CheckHypothesis((*_father), _subShape, hyp_status);
+        //_father->Unlock();
       }
       break;
     case COMPUTE_CANCELED:               // nothing to do
@@ -2172,8 +2195,10 @@ 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
@@ -2201,6 +2226,7 @@ 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
@@ -2212,6 +2238,7 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * /*theGen*/,
           theSubComputed = false;
         theSubs.push_back( subMesh );
       }
+      _father->Unlock();
     }
   }
 
index fbfd222c235f2698734183c9bfb76f37cf11e343..0f925570a683aa20f4592995ba5b288d1b2ea893 100644 (file)
@@ -69,7 +69,7 @@ class SMESH_EXPORT SMESH_subMesh
   int GetId() const; // == meshDS->ShapeToIndex( aSubShape )
 
   SMESH_Mesh* GetFather() { return _father; }
-  
+
   SMESHDS_SubMesh *       GetSubMeshDS();
   const SMESHDS_SubMesh * GetSubMeshDS() const;
 
@@ -79,6 +79,7 @@ class SMESH_EXPORT SMESH_subMesh
   SMESH_subMesh *GetFirstToCompute();
 
   SMESH_Algo* GetAlgo() const;
+  SMESH_Algo* CopyAlgo() const;
 
   const std::map < int, SMESH_subMesh * >& DependsOn();
   bool DependsOn( const SMESH_subMesh* other ) const;
@@ -123,7 +124,7 @@ class SMESH_EXPORT SMESH_subMesh
   };
 
   // ==================================================================
-  // Members to track non hierarchical dependencies between sub-meshes 
+  // Members to track non hierarchical dependencies between sub-meshes
   // ==================================================================
 
   /*!
@@ -131,7 +132,7 @@ class SMESH_EXPORT SMESH_subMesh
     * \param listener - the listener to store
     * \param data - the listener data to store
     * \param where - the submesh to store the listener and it's data
-   * 
+   *
    * The method remembers the submesh \awhere it puts the listener in order to delete
    * it when HYP_OK algo_state is lost
    * After being set, event listener is notified on each event of \awhere submesh.
@@ -185,7 +186,7 @@ protected:
    * \brief Sets an event listener and its data to a submesh
     * \param listener - the listener to store
     * \param data - the listener data to store
-   * 
+   *
    * After being set, event listener is notified on each event of a submesh.
    */
   void setEventListener(EventListener* listener, EventListenerData* data);
@@ -245,7 +246,7 @@ public:
   bool IsApplicableHypothesis(const SMESH_Hypothesis* theHypothesis) const;
   // return true if theHypothesis can be used to mesh me:
   // its shape type is checked
-  
+
   SMESH_Hypothesis::Hypothesis_Status CheckConcurrentHypothesis (SMESH_Hypothesis* theHypothesis);
   // check if there are several applicable hypothesis on fathers
 
@@ -277,7 +278,7 @@ public:
 
   int GetComputeCost() const;
   // how costly is to compute this sub-mesh
-  
+
   /*!
    * \brief  Find common submeshes (based on shared subshapes with other
    * \param theOther submesh to check
@@ -319,7 +320,7 @@ protected:
 
   /*!
    * \brief Return a hypothesis attached to theShape.
-   * 
+   *
    * If theHyp is provided, similar but not same hypotheses
    * is returned; else an applicable ones having theHypType
    * is returned
@@ -327,7 +328,7 @@ protected:
   const SMESH_Hypothesis* getSimilarAttached(const TopoDS_Shape&      theShape,
                                              const SMESH_Hypothesis * theHyp,
                                              const int                theHypType = 0);
-  // 
+  //
   int computeCost() const;
 
 protected:
index bd20e30fa9505e1774ce255d0d792a4fc9261ce2..c26113ab3e161bc75e89b2f45f1b74b6c391ce2b 100644 (file)
@@ -126,14 +126,22 @@ bool StdMeshers_Regular_1D::CheckHypothesis( SMESH_Mesh&         aMesh,
   _onlyUnaryInput = true;
 
   // check propagation in a redefined GetUsedHypothesis()
-  const list <const SMESHDS_Hypothesis * > hyps =
+  const list <const SMESHDS_Hypothesis * > hyps =
     GetUsedHypothesis(aMesh, aShape, /*ignoreAuxiliaryHyps=*/false);
-
   const SMESH_HypoFilter & propagFilter = StdMeshers_Propagation::GetFilter();
 
   // find non-auxiliary hypothesis
   const SMESHDS_Hypothesis *theHyp = 0;
   set< string > propagTypes;
+  std::cout << "For shape " << aShape.HashCode(1) << " of type "<< aShape.ShapeType() <<
+               "CheckHypothesis" << std::endl;
+  for(auto hyp:hyps){
+    SMESH_Comment hypStr;
+    hypStr << hyp << " " << hyp->GetName() << " ";
+    ((SMESHDS_Hypothesis*)hyp)->SaveTo( hypStr.Stream() );
+    hypStr << " ";
+    std::cout << hypStr << std::endl;
+  }
   list <const SMESHDS_Hypothesis * >::const_iterator h = hyps.begin();
   for ( ; h != hyps.end(); ++h ) {
     if ( static_cast<const SMESH_Hypothesis*>(*h)->IsAuxiliary() ) {
@@ -848,8 +856,12 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
     {
       // Number Of Segments hypothesis
       nbSegments = _ivalue[ NB_SEGMENTS_IND ];
-      if ( nbSegments < 1 )  return false;
-      if ( nbSegments == 1 ) return true;
+      if ( nbSegments < 1 )  {
+        return false;
+      }
+      if ( nbSegments == 1 ) {
+        return true;
+      }
 
       switch (_ivalue[ DISTR_TYPE_IND ])
       {
@@ -1170,10 +1182,16 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
 
 bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & theShape)
 {
-  if ( _hypType == NONE )
-    return false;
+  SMESH_Hypothesis::Hypothesis_Status hyp_status;
+  theMesh.Lock();
+  bool ret = this->CheckHypothesis(theMesh, theShape, hyp_status);
+  int hypType = _hypType;
+  theMesh.Unlock();
 
-  if ( _hypType == ADAPTIVE )
+  if ( hypType == NONE )
+      return false;
+
+  if ( hypType == ADAPTIVE )
   {
     _adaptiveHyp->GetAlgo()->InitComputeError();
     _adaptiveHyp->GetAlgo()->Compute( theMesh, theShape );
@@ -1183,6 +1201,7 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
   SMESHDS_Mesh * meshDS = theMesh.GetMeshDS();
 
   theMesh.Lock();
+
   const TopoDS_Edge & EE = TopoDS::Edge(theShape);
   TopoDS_Edge E = TopoDS::Edge(EE.Oriented(TopAbs_FORWARD));
   int shapeID = meshDS->ShapeToIndex( E );
@@ -1199,6 +1218,7 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
   const SMDS_MeshNode *  nLast = SMESH_Algo::VertexNode( VLast,  meshDS );
   if ( !nFirst || !nLast ){
     theMesh.Unlock();
+    std::cout << "exit no node" << std::endl;
     return error( COMPERR_BAD_INPUT_MESH, "No node on vertex");
   }
   // remove elements created by e.g. pattern mapping (PAL21999)
@@ -1232,7 +1252,7 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
       // take into account reversing the edge the hypothesis is propagated from
       // (_mainEdge.Orientation() marks mutual orientation of EDGEs in propagation chain)
       reversed = ( _mainEdge.Orientation() == TopAbs_REVERSED );
-      if ( _hypType != DISTRIB_PROPAGATION ) {
+      if ( hypType != DISTRIB_PROPAGATION ) {
         int mainID = meshDS->ShapeToIndex(_mainEdge);
         if ( std::find( _revEdgesIDs.begin(), _revEdgesIDs.end(), mainID) != _revEdgesIDs.end())
           reversed = !reversed;
@@ -1245,6 +1265,8 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
     BRepAdaptor_Curve C3d( E );
     if ( ! computeInternalParameters( theMesh, C3d, length, f, l, params, reversed, true )) {
       theMesh.Unlock();
+    std::cout << "exit Compute internal failed" << std::endl;
+
       return false;
     }
     redistributeNearVertices( theMesh, C3d, length, params, VFirst, VLast );
@@ -1336,6 +1358,8 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
     }
   }
   theMesh.Unlock();
+  std::cout << "exit normal" << std::endl;
+
   return true;
 }