From 997b0b500debf3b5261650bc306bee99bcf49938 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 2 Nov 2011 08:56:51 +0000 Subject: [PATCH] Fix regression of test grid 2d_mesh_NETGEN/D2 fix restricting local H, which was broken by a defaut netgen::mparam.minh + static void RestrictLocalSize(netgen::Mesh& ngMesh, const gp_XYZ& p, const double size); --- src/NETGENPlugin/NETGENPlugin_Mesher.cxx | 32 +++++++++++++++++------- src/NETGENPlugin/NETGENPlugin_Mesher.hxx | 2 ++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx index 325b3c7..5e14144 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx @@ -579,6 +579,23 @@ double NETGENPlugin_Mesher::GetDefaultMinSize(const TopoDS_Shape& geom, return minh; } +//================================================================================ +/*! + * \brief Restrict size of elements at a given point + */ +//================================================================================ + +void NETGENPlugin_Mesher::RestrictLocalSize(netgen::Mesh& ngMesh, const gp_XYZ& p, const double size) +{ + if ( netgen::mparam.minh > size ) + { + ngMesh.SetMinimalH( size ); + netgen::mparam.minh = size; + } + netgen::Point3d pi(p.X(), p.Y(), p.Z()); + ngMesh.RestrictLocalH( pi, size ); +} + //================================================================================ /*! * \brief fill ngMesh with nodes and elements of computed submeshes @@ -712,9 +729,8 @@ bool NETGENPlugin_Mesher::fillNgMesh(const netgen::OCCGeometry& occgeom, seg.edgenr = ngMesh.GetNSeg() + 1; // segment id ngMesh.AddSegment (seg); - netgen::Point3d ngP1(p1.node->X(), p1.node->Y(), p1.node->Z()); - netgen::Point3d ngP2(p2.node->X(), p2.node->Y(), p2.node->Z()); - ngMesh.RestrictLocalH( netgen::Center( ngP1,ngP2), Dist(ngP1,ngP2)); + SMESH_TNodeXYZ np1( p1.node ), np2( p2.node ); + RestrictLocalSize( ngMesh, 0.5*(np1+np2), (np1-np2).Modulus() ); #ifdef DUMP_SEGMENTS cout << "Segment: " << seg.edgenr << " on SMESH face " << helper.GetMeshDS()->ShapeToIndex( face ) << endl @@ -1676,8 +1692,7 @@ namespace TopoDS_Iterator vIt( edge ); if ( !vIt.More() ) return; gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( vIt.Value() )); - netgen::Point3d pi(p.X(), p.Y(), p.Z()); - mesh.RestrictLocalH(pi, size); + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); } else { @@ -1686,12 +1701,12 @@ namespace { Standard_Real u = u1 + delta*i; gp_Pnt p = curve->Value(u); + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), size ); netgen::Point3d pi(p.X(), p.Y(), p.Z()); - mesh.RestrictLocalH(pi, size); double resultSize = mesh.GetH(pi); if ( resultSize - size > 0.1*size ) // netgen does restriction iff oldH/newH > 1.2 (localh.cpp:136) - mesh.RestrictLocalH(pi, resultSize/1.201); + NETGENPlugin_Mesher::RestrictLocalSize( mesh, p.XYZ(), resultSize/1.201 ); } } } @@ -1884,8 +1899,7 @@ bool NETGENPlugin_Mesher::Compute() const TopoDS_Shape& shape = ShapesWithLocalSize.FindKey(key); const TopoDS_Vertex& v = TopoDS::Vertex(shape); gp_Pnt p = BRep_Tool::Pnt(v); - netgen::Point3d pi(p.X(), p.Y(), p.Z()); - ngMesh->RestrictLocalH(pi, hi); + NETGENPlugin_Mesher::RestrictLocalSize( *ngMesh, p.XYZ(), hi ); } } diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx index 70b620f..a32dc84 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx @@ -97,6 +97,8 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher static double GetDefaultMinSize(const TopoDS_Shape& shape, const double maxSize); + static void RestrictLocalSize(netgen::Mesh& ngMesh, const gp_XYZ& p, const double size); + static int FillSMesh(const netgen::OCCGeometry& occgeom, const netgen::Mesh& ngMesh, const NETGENPlugin_ngMeshInfo& initState, -- 2.39.2