From: eap Date: Mon, 28 Feb 2022 11:38:20 +0000 (+0300) Subject: bos #29143 [CEA] Compute takes too much time in polyhedron per solid use case X-Git-Tag: V9_9_0a1^0 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=a065ed143c667923c28ff710017519215e309a36;p=modules%2Fsmesh.git bos #29143 [CEA] Compute takes too much time in polyhedron per solid use case more optimization: don't try to find more local algos if uniDimAlgoShapes is empty --- diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index db0010287..02d5a217e 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -248,7 +248,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // ================================================================ // Apply algos that do NOT require discreteized boundaries // ("all-dimensional") and do NOT support sub-meshes, starting from - // the most complex shapes and collect sub-meshes with algos that + // the most complex shapes and collect sub-meshes with algos that // DO support sub-meshes // ================================================================ @@ -273,7 +273,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); aShapeDim = GetShapeDim( aSubShape ); if ( aShapeDim < 1 ) break; - + // check for preview dimension limitations if ( aShapesId && aShapeDim > (int)aDim ) continue; @@ -390,47 +390,50 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType(); - // get a shape the algo is assigned to - if ( !GetAlgo( sm, & algoShape )) - continue; // strange... + if ( !uniDimAlgoShapes.IsEmpty() ) + { + // get a shape the algo is assigned to + if ( !GetAlgo( sm, & algoShape )) + continue; // strange... - // look for more local algos - if ( SMESH_subMesh* algoSM = aMesh.GetSubMesh( algoShape )) - smIt = algoSM->getDependsOnIterator(!includeSelf, !complexShapeFirst); - else - smIt = sm->getDependsOnIterator(!includeSelf, !complexShapeFirst); + // look for more local algos + if ( SMESH_subMesh* algoSM = aMesh.GetSubMesh( algoShape )) + smIt = algoSM->getDependsOnIterator(!includeSelf, !complexShapeFirst); + else + smIt = sm->getDependsOnIterator(!includeSelf, !complexShapeFirst); - while ( smIt->more() ) - { - SMESH_subMesh* smToCompute = smIt->next(); + while ( smIt->more() ) + { + SMESH_subMesh* smToCompute = smIt->next(); - const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); - const int aShapeDim = GetShapeDim( aSubShape ); - if ( aShapeDim < 1 || aSubShape.ShapeType() <= shapeType ) - continue; - if ( !uniDimAlgoShapes.Contains( aSubShape )) - continue; // [bos #29143] aMesh.GetHypothesis() is too long + const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); + const int aShapeDim = GetShapeDim( aSubShape ); + if ( aShapeDim < 1 || aSubShape.ShapeType() <= shapeType ) + continue; + if ( !uniDimAlgoShapes.Contains( aSubShape )) + continue; // [bos #29143] aMesh.GetHypothesis() is too long - // check for preview dimension limitations - if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim ) - continue; + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim ) + continue; - SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); - filter - .And( SMESH_HypoFilter::IsApplicableTo( aSubShape )) - .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape, aMesh )); + SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); + filter + .And( SMESH_HypoFilter::IsApplicableTo( aSubShape )) + .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape, aMesh )); - if ( SMESH_Algo* subAlgo = (SMESH_Algo*) aMesh.GetHypothesis( smToCompute, filter, true)) - { - if ( ! subAlgo->NeedDiscreteBoundary() ) continue; - TopTools_IndexedMapOfShape* localAllowed = allowedSubShapes; - if ( localAllowed && localAllowed->IsEmpty() ) - localAllowed = 0; // prevent fillAllowed() with aSubShape - - SMESH_Hypothesis::Hypothesis_Status status; - if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status )) - // mesh a lower smToCompute starting from vertices - Compute( aMesh, aSubShape, aFlags | SHAPE_ONLY_UPWARD, aDim, aShapesId, localAllowed ); + if ( SMESH_Algo* subAlgo = (SMESH_Algo*) aMesh.GetHypothesis( smToCompute, filter, true)) + { + if ( ! subAlgo->NeedDiscreteBoundary() ) continue; + TopTools_IndexedMapOfShape* localAllowed = allowedSubShapes; + if ( localAllowed && localAllowed->IsEmpty() ) + localAllowed = 0; // prevent fillAllowed() with aSubShape + + SMESH_Hypothesis::Hypothesis_Status status; + if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status )) + // mesh a lower smToCompute starting from vertices + Compute( aMesh, aSubShape, aFlags | SHAPE_ONLY_UPWARD, aDim, aShapesId, localAllowed ); + } } } // -------------------------------- diff --git a/src/SMESH/SMESH_Homard.hxx b/src/SMESH/SMESH_Homard.hxx index 9d2b7dc07..5fce29bb8 100644 --- a/src/SMESH/SMESH_Homard.hxx +++ b/src/SMESH/SMESH_Homard.hxx @@ -237,6 +237,6 @@ private: int _MessInfo; }; -}; // namespace SMESHHOMARDImpl +} // namespace SMESHHOMARDImpl #endif