Salome HOME
Optimize ConvertToQuadratic
authoreap <eap@opencascade.com>
Wed, 16 Nov 2016 13:48:50 +0000 (16:48 +0300)
committereap <eap@opencascade.com>
Wed, 16 Nov 2016 13:48:50 +0000 (16:48 +0300)
   avoid computing octree->getHeight() upon each FindClosestTo() in SMESH_MesherHelper::FixQuadraticElements()

src/MEFISTO2/aptrte.cxx
src/SMESHUtils/SMESH_MeshAlgos.cxx

index 3743dcf..5ee5e16 100755 (executable)
@@ -866,6 +866,5 @@ void
   if( nbtrianeg>0 )
     MESSAGE( "ATTENTION: "<< nbtrianeg << " TRIANGLES d'AIRE NEGATIVE" );
 
-  MESSAGE(" ");
   return;
 }
index dbadd82..6670e50 100644 (file)
@@ -442,6 +442,7 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
   SMDS_Mesh*                   _mesh;
   SMDS_ElemIteratorPtr         _meshPartIt;
   ElementBndBoxTree*           _ebbTree;
+  int                          _ebbTreeHeight;
   SMESH_NodeSearcherImpl*      _nodeSearcher;
   SMDSAbs_ElementType          _elementType;
   double                       _tolerance;
@@ -451,7 +452,7 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
   SMESH_ElementSearcherImpl( SMDS_Mesh&           mesh,
                              double               tol=-1,
                              SMDS_ElemIteratorPtr elemIt=SMDS_ElemIteratorPtr())
-    : _mesh(&mesh),_meshPartIt(elemIt),_ebbTree(0),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false) {}
+    : _mesh(&mesh),_meshPartIt(elemIt),_ebbTree(0),_ebbTreeHeight(-1),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false) {}
   virtual ~SMESH_ElementSearcherImpl()
   {
     if ( _ebbTree )      delete _ebbTree;      _ebbTree      = 0;
@@ -479,6 +480,12 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
   {
     return _outerFaces.empty() || _outerFaces.count(face);
   }
+  int getTreeHeight()
+  {
+    if ( _ebbTreeHeight < 0 )
+      _ebbTreeHeight = _ebbTree->getHeight();
+    return _ebbTreeHeight;
+  }
 
   struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState())
   {
@@ -796,7 +803,7 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt&       point,
       if ( _ebbTree->getBox()->IsOut( point.XYZ() ))
         radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize();
       if ( radius < 0 )
-        radius = _ebbTree->maxSize() / pow( 2., _ebbTree->getHeight()) / 2;
+        radius = _ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
       while ( suspectElems.empty() )
       {
         _ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );