From f85bc0ab6f009a118105bdcc1b04364ef4dbc298 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 25 Feb 2022 14:44:14 +0300 Subject: [PATCH] bos #29143 [CEA] Compute takes too much time in polyhedron per solid use case more optimization: don't fill in uniDimAlgoShapes if no multi-dimensional algo assigned --- src/SMESH/SMESH_Gen.cxx | 56 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index 06c47d8c0..db0010287 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -332,32 +332,6 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, else smWithAlgoSupportingSubmeshes[0].push_front( shDim2smIt->second ); - // gather sub-shapes with local uni-dimensional algos (bos #29143) - // ---------------------------------------------------------------- - TopTools_MapOfShape uniDimAlgoShapes; - ShapeToHypothesis::Iterator s2hyps( aMesh.GetMeshDS()->GetHypotheses() ); - for ( ; s2hyps.More(); s2hyps.Next() ) - { - const TopoDS_Shape& s = s2hyps.Key(); - if ( s.IsSame( aMesh.GetShapeToMesh() )) - continue; - for ( auto & hyp : s2hyps.Value() ) - { - if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo*>( hyp )) - if ( algo->NeedDiscreteBoundary() ) - { - TopAbs_ShapeEnum sType; - switch ( algo->GetDim() ) { - case 3: sType = TopAbs_SOLID; break; - case 2: sType = TopAbs_FACE; break; - default: sType = TopAbs_EDGE; break; - } - for ( TopExp_Explorer ex( s2hyps.Key(), sType ); ex.More(); ex.Next() ) - uniDimAlgoShapes.Add( ex.Current() ); - } - } - } - // ====================================================== // Apply all-dimensional algorithms supporing sub-meshes // ====================================================== @@ -367,6 +341,36 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, smVec.insert( smVec.end(), smWithAlgoSupportingSubmeshes[aShapeDim].begin(), smWithAlgoSupportingSubmeshes[aShapeDim].end() ); + + // gather sub-shapes with local uni-dimensional algos (bos #29143) + // ---------------------------------------------------------------- + TopTools_MapOfShape uniDimAlgoShapes; + if ( !smVec.empty() ) + { + ShapeToHypothesis::Iterator s2hyps( aMesh.GetMeshDS()->GetHypotheses() ); + for ( ; s2hyps.More(); s2hyps.Next() ) + { + const TopoDS_Shape& s = s2hyps.Key(); + if ( s.IsSame( aMesh.GetShapeToMesh() )) + continue; + for ( auto & hyp : s2hyps.Value() ) + { + if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo*>( hyp )) + if ( algo->NeedDiscreteBoundary() ) + { + TopAbs_ShapeEnum sType; + switch ( algo->GetDim() ) { + case 3: sType = TopAbs_SOLID; break; + case 2: sType = TopAbs_FACE; break; + default: sType = TopAbs_EDGE; break; + } + for ( TopExp_Explorer ex( s2hyps.Key(), sType ); ex.More(); ex.Next() ) + uniDimAlgoShapes.Add( ex.Current() ); + } + } + } + } + { // ------------------------------------------------ // sort list of sub-meshes according to mesh order