From a5c8f82089ec9f32e3930db84e1098c9be305450 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 30 Aug 2016 15:38:14 +0300 Subject: [PATCH] Enable Local Size for NETGEN 3D and NETGEN 2D --- src/GUI/NETGENPluginGUI_HypothesisCreator.cxx | 2 +- src/NETGENPlugin/NETGENPlugin_Mesher.cxx | 272 +++++++++--------- src/NETGENPlugin/NETGENPlugin_Mesher.hxx | 1 + .../NETGENPlugin_NETGEN_2D_ONLY.cxx | 4 + src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx | 13 +- 5 files changed, 152 insertions(+), 140 deletions(-) diff --git a/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx b/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx index f2c685f..e5bb0aa 100644 --- a/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx +++ b/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx @@ -236,7 +236,7 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame() } myLocalSizeTable = 0; - if ( !myIsONLY ) + //if ( !myIsONLY ) { QWidget* localSizeGroup = new QWidget(); QGridLayout* localSizeLayout = new QGridLayout(localSizeGroup); diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx index 9f56231..ed36d22 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx @@ -123,6 +123,9 @@ std::map EdgeId2LocalSize; std::map FaceId2LocalSize; std::map SolidId2LocalSize; +std::vector ControlPoints; +std::set ShapesWithControlPoints; // <-- allows calling SetLocalSize() several times w/o recomputing ControlPoints + //============================================================================= /*! * @@ -152,6 +155,8 @@ NETGENPlugin_Mesher::NETGENPlugin_Mesher (SMESH_Mesh* mesh, EdgeId2LocalSize.clear(); FaceId2LocalSize.clear(); SolidId2LocalSize.clear(); + ControlPoints.clear(); + ShapesWithControlPoints.clear(); } //================================================================================ @@ -283,23 +288,25 @@ void NETGENPlugin_Mesher::SetParameters(const NETGENPlugin_Hypothesis* hyp) CORBA::Object_var anObject = smeshGen_i->GetNS()->Resolve("/myStudyManager"); SALOMEDS::StudyManager_var aStudyMgr = SALOMEDS::StudyManager::_narrow(anObject); SALOMEDS::Study_var myStudy = aStudyMgr->GetStudyByID(hyp->GetStudyId()); - - const NETGENPlugin_Hypothesis::TLocalSize localSizes = hyp->GetLocalSizesAndEntries(); - NETGENPlugin_Hypothesis::TLocalSize::const_iterator it = localSizes.begin(); - for ( ; it != localSizes.end() ; it++) + if ( !myStudy->_is_nil() ) { - std::string entry = (*it).first; - double val = (*it).second; - // -- - GEOM::GEOM_Object_var aGeomObj; - SALOMEDS::SObject_var aSObj = myStudy->FindObjectID( entry.c_str() ); - if ( !aSObj->_is_nil() ) { - CORBA::Object_var obj = aSObj->GetObject(); - aGeomObj = GEOM::GEOM_Object::_narrow(obj); - aSObj->UnRegister(); + const NETGENPlugin_Hypothesis::TLocalSize localSizes = hyp->GetLocalSizesAndEntries(); + NETGENPlugin_Hypothesis::TLocalSize::const_iterator it = localSizes.begin(); + for ( ; it != localSizes.end() ; it++) + { + std::string entry = (*it).first; + double val = (*it).second; + // -- + GEOM::GEOM_Object_var aGeomObj; + SALOMEDS::SObject_var aSObj = myStudy->FindObjectID( entry.c_str() ); + if ( !aSObj->_is_nil() ) { + CORBA::Object_var obj = aSObj->GetObject(); + aGeomObj = GEOM::GEOM_Object::_narrow(obj); + aSObj->UnRegister(); + } + TopoDS_Shape S = smeshGen_i->GeomObjectToShape( aGeomObj.in() ); + ::SetLocalSize(S, val); } - TopoDS_Shape S = smeshGen_i->GeomObjectToShape( aGeomObj.in() ); - SetLocalSize(S, val); } } } @@ -558,6 +565,105 @@ namespace // } // } + //================================================================================ + /*! + * \brief Restrict size of elements on the given edge + */ + //================================================================================ + + void setLocalSize(const TopoDS_Edge& edge, + double size, + netgen::Mesh& mesh) + { + if ( size <= std::numeric_limits::min() ) + return; + Standard_Real u1, u2; + Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, u1, u2); + if ( curve.IsNull() ) + { + TopoDS_Iterator vIt( edge ); + if ( !vIt.More() ) return; + gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( vIt.Value() )); + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); + } + else + { + const int nb = (int)( 1.5 * SMESH_Algo::EdgeLength( edge ) / size ); + Standard_Real delta = (u2-u1)/nb; + for(int i=0; iValue(u); + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); + netgen::Point3d pi(p.X(), p.Y(), p.Z()); + double resultSize = mesh.GetH(pi); + if ( resultSize - size > 0.1*size ) + // netgen does restriction iff oldH/newH > 1.2 (localh.cpp:136) + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), resultSize/1.201 ); + } + } + } +} // namespace + +//================================================================================ +/*! + * \brief Set local size on shapes defined by SetParameters() + */ +//================================================================================ + +void NETGENPlugin_Mesher::SetLocalSize( netgen::OCCGeometry& occgeo, + netgen::Mesh& ngMesh ) +{ + for(std::map::const_iterator it=EdgeId2LocalSize.begin(); it!=EdgeId2LocalSize.end(); it++) + { + int key = (*it).first; + double hi = (*it).second; + const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); + setLocalSize( TopoDS::Edge(shape), hi, ngMesh ); + } + for(std::map::const_iterator it=VertexId2LocalSize.begin(); it!=VertexId2LocalSize.end(); it++) + { + int key = (*it).first; + double hi = (*it).second; + const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); + gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex(shape) ); + NETGENPlugin_Mesher::RestrictLocalSize( ngMesh, p.XYZ(), hi ); + } + for(map::const_iterator it=FaceId2LocalSize.begin(); it!=FaceId2LocalSize.end(); it++) + { + int key = (*it).first; + double val = (*it).second; + const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); + int faceNgID = occgeo.fmap.FindIndex(shape); + if ( faceNgID >= 1 ) + { + occgeo.SetFaceMaxH(faceNgID, val); + for ( TopExp_Explorer edgeExp( shape, TopAbs_EDGE ); edgeExp.More(); edgeExp.Next() ) + setLocalSize( TopoDS::Edge( edgeExp.Current() ), val, ngMesh ); + } + else if ( !ShapesWithControlPoints.count( key )) + { + SMESHUtils::createPointsSampleFromFace( TopoDS::Face( shape ), val, ControlPoints ); + ShapesWithControlPoints.insert( key ); + } + } + for(map::const_iterator it=SolidId2LocalSize.begin(); it!=SolidId2LocalSize.end(); it++) + { + int key = (*it).first; + double val = (*it).second; + if ( !ShapesWithControlPoints.count( key )) + { + const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); + SMESHUtils::createPointsSampleFromSolid( TopoDS::Solid( shape ), val, ControlPoints ); + ShapesWithControlPoints.insert( key ); + } + } + + if ( !ControlPoints.empty() ) + { + for ( size_t i = 1; i < ControlPoints.size(); ++i ) + NETGENPlugin_Mesher::RestrictLocalSize( ngMesh, ControlPoints[i].XYZ(), ControlPoints[i].Size() ); + } } //================================================================================ @@ -2283,45 +2389,6 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry& occgeo, namespace { - //================================================================================ - /*! - * \brief Restrict size of elements on the given edge - */ - //================================================================================ - - void setLocalSize(const TopoDS_Edge& edge, - double size, - netgen::Mesh& mesh) - { - if ( size <= std::numeric_limits::min() ) - return; - Standard_Real u1, u2; - Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, u1, u2); - if ( curve.IsNull() ) - { - TopoDS_Iterator vIt( edge ); - if ( !vIt.More() ) return; - gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( vIt.Value() )); - NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); - } - else - { - const int nb = (int)( 1.5 * SMESH_Algo::EdgeLength( edge ) / size ); - Standard_Real delta = (u2-u1)/nb; - for(int i=0; iValue(u); - NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); - netgen::Point3d pi(p.X(), p.Y(), p.Z()); - double resultSize = mesh.GetH(pi); - if ( resultSize - size > 0.1*size ) - // netgen does restriction iff oldH/newH > 1.2 (localh.cpp:136) - NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), resultSize/1.201 ); - } - } - } - //================================================================================ /*! * \brief Convert error into text @@ -2541,60 +2608,8 @@ bool NETGENPlugin_Mesher::Compute() } else // if ( ! _simpleHyp ) { - // Local size on vertices and edges - // -------------------------------- - for(std::map::const_iterator it=EdgeId2LocalSize.begin(); it!=EdgeId2LocalSize.end(); it++) - { - int key = (*it).first; - double hi = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - const TopoDS_Edge& e = TopoDS::Edge(shape); - setLocalSize( e, hi, *_ngMesh ); - } - for(std::map::const_iterator it=VertexId2LocalSize.begin(); it!=VertexId2LocalSize.end(); it++) - { - int key = (*it).first; - double hi = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - const TopoDS_Vertex& v = TopoDS::Vertex(shape); - gp_Pnt p = BRep_Tool::Pnt(v); - NETGENPlugin_Mesher::RestrictLocalSize( *_ngMesh, p.XYZ(), hi ); - } - for(map::const_iterator it=FaceId2LocalSize.begin(); it!=FaceId2LocalSize.end(); it++) - { - int key = (*it).first; - double val = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - int faceNgID = occgeo.fmap.FindIndex(shape); - if ( faceNgID >= 1 ) - { - occgeo.SetFaceMaxH(faceNgID, val); - for ( TopExp_Explorer edgeExp( shape, TopAbs_EDGE ); edgeExp.More(); edgeExp.Next() ) - setLocalSize( TopoDS::Edge( edgeExp.Current() ), val, *_ngMesh ); - } - else - { - std::vector pnt; - SMESHUtils::createPointsSampleFromFace( TopoDS::Face( shape ), val, pnt ); - if ( !pnt.empty() ) - NETGENPlugin_Mesher::RestrictLocalSize( *_ngMesh, pnt[0].XYZ(), val ); - for ( size_t i = 1; i < pnt.size(); ++i ) - _ngMesh->RestrictLocalH( netgen::Point3d( pnt[i].X(), pnt[i].Y(), pnt[i].Z() ), val ); - } - } - for(map::const_iterator it=SolidId2LocalSize.begin(); it!=SolidId2LocalSize.end(); it++) - { - int key = (*it).first; - double val = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - - std::vector pnt; - SMESHUtils::createPointsSampleFromSolid( TopoDS::Solid( shape ), val, pnt ); - if ( !pnt.empty() ) - NETGENPlugin_Mesher::RestrictLocalSize( *_ngMesh, pnt[0].XYZ(), val ); - for ( size_t i = 1; i < pnt.size(); ++i ) - _ngMesh->RestrictLocalH( netgen::Point3d( pnt[i].X(), pnt[i].Y(), pnt[i].Z() ), val ); - } + // Local size on shapes + SetLocalSize( occgeo, *_ngMesh ); } // Precompute internal edges (issue 0020676) in order to @@ -3156,36 +3171,8 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap) } else // if ( ! _simpleHyp ) { - // Local size on vertices and edges - // -------------------------------- - for(std::map::const_iterator it=EdgeId2LocalSize.begin(); it!=EdgeId2LocalSize.end(); it++) - { - int key = (*it).first; - double hi = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - const TopoDS_Edge& e = TopoDS::Edge(shape); - setLocalSize( e, hi, *ngMesh ); - } - for(std::map::const_iterator it=VertexId2LocalSize.begin(); it!=VertexId2LocalSize.end(); it++) - { - int key = (*it).first; - double hi = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - const TopoDS_Vertex& v = TopoDS::Vertex(shape); - gp_Pnt p = BRep_Tool::Pnt(v); - NETGENPlugin_Mesher::RestrictLocalSize( *ngMesh, p.XYZ(), hi ); - } - for(map::const_iterator it=FaceId2LocalSize.begin(); - it!=FaceId2LocalSize.end(); it++) - { - int key = (*it).first; - double val = (*it).second; - const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); - int faceNgID = occgeo.fmap.FindIndex(shape); - occgeo.SetFaceMaxH(faceNgID, val); - for ( TopExp_Explorer edgeExp( shape, TopAbs_EDGE ); edgeExp.More(); edgeExp.Next() ) - setLocalSize( TopoDS::Edge( edgeExp.Current() ), val, *ngMesh ); - } + // Local size on shapes + SetLocalSize( occgeo, *ngMesh ); } // calculate total nb of segments and length of edges double fullLen = 0.0; @@ -3386,10 +3373,19 @@ double NETGENPlugin_Mesher::GetProgress(const SMESH_Algo* holder, // << " " << doneTime / _totalTime / _progressTic << endl; } } + if ( _ticTime > 0 ) progress = Max( *algoProgressTic * _ticTime, *algoProgress ); + if ( progress > 0 ) { + if ( _isVolume && + netgen::multithread.task[0] == 'D'/*elaunay meshing*/ && + progress > voluMeshingTime ) + { + progress = voluMeshingTime; + ((double&) _ticTime) = voluMeshingTime / _totalTime / _progressTic; + } ((int&) *algoProgressTic )++; ((double&) *algoProgress) = progress; } diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx index ed4dafc..2335b84 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx @@ -121,6 +121,7 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher void SetParameters(const NETGENPlugin_Hypothesis* hyp); void SetParameters(const NETGENPlugin_SimpleHypothesis_2D* hyp); void SetViscousLayers2DAssigned(bool isAssigned) { _isViscousLayers2D = isAssigned; } + static void SetLocalSize( netgen::OCCGeometry& occgeo, netgen::Mesh& ngMesh ); bool Compute(); diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx index 3a513a8..c383e5f 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx @@ -314,6 +314,9 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh, ngMeshes[0]->RestrictLocalH( pi, factor * ( n1 - n2 ).Modulus() ); } } + + // set local size defined on shapes + aMesher.SetLocalSize( occgeoComm, *ngMeshes[0] ); } netgen::mparam.uselocalh = toOptimize; // restore as it is used at surface optimization @@ -449,6 +452,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh, Box<3> bb = occgeom.GetBoundingBox(); bb.Increase (bb.Diam()/10); ngMesh->SetLocalH (bb.PMin(), bb.PMax(), mparam.grading); + aMesher.SetLocalSize( occgeom, *ngMesh ); } nodeVec.clear(); diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx index c9d5376..17a33c9 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx @@ -433,10 +433,21 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh, NETGENPlugin_Mesher aMesher( &aMesh, helper.GetSubShape(), /*isVolume=*/true ); netgen::OCCGeometry occgeo; - + if ( _hypParameters ) { aMesher.SetParameters( _hypParameters ); + + if ( !_hypParameters->GetLocalSizesAndEntries().empty() ) + { + if ( ! &ngMesh->LocalHFunction() ) + { + netgen::Point3d pmin, pmax; + ngMesh->GetBox( pmin, pmax, 0 ); + ngMesh->SetLocalH( pmin, pmax, _hypParameters->GetGrowthRate() ); + } + aMesher.SetLocalSize( occgeo, *ngMesh ); + } if ( !_hypParameters->GetOptimize() ) endWith = netgen::MESHCONST_MESHVOLUME; } -- 2.39.2