From 882d700f99a491e39ebacdb8dfc7bfeabdb9c67b Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 8 Oct 2014 16:13:59 +0400 Subject: [PATCH] 22737: [CEA 1303] Regression on test script 12_cube_ecorce_noyau.py --- src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx | 45 ++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx index 9137887..cbb7b4e 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx @@ -342,8 +342,43 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh, namespace { void limitVolumeSize( netgen::Mesh* ngMesh, - const double maxh ) + double maxh ) { + // get average h of faces + double faceh = 0; + int nbh = 0; + for (int i = 1; i <= ngMesh->GetNSE(); i++) + { + const netgen::Element2d& face = ngMesh->SurfaceElement(i); + for (int j=1; j <= face.GetNP(); ++j) + { + const netgen::PointIndex & i1 = face.PNumMod(j); + const netgen::PointIndex & i2 = face.PNumMod(j+1); + if ( i1 < i2 ) + { + const netgen::Point3d & p1 = ngMesh->Point( i1 ); + const netgen::Point3d & p2 = ngMesh->Point( i2 ); + faceh += netgen::Dist2( p1, p2 ); + nbh++; + } + } + } + faceh = Sqrt( faceh / nbh ); + + double compareh; + if ( faceh < 0.5 * maxh ) compareh = -1; + else if ( faceh > 1.5 * maxh ) compareh = 1; + else compareh = 0; + // cerr << "faceh " << faceh << endl; + // cerr << "init maxh " << maxh << endl; + // cerr << "compareh " << compareh << endl; + + if ( compareh > 0 ) + maxh *= 1.2; + else + maxh *= 0.8; + // cerr << "maxh " << maxh << endl; + // get bnd box netgen::Point3d pmin, pmax; ngMesh->GetBox( pmin, pmax, 0 ); @@ -351,14 +386,14 @@ namespace const double dy = pmax.Y() - pmin.Y(); const double dz = pmax.Z() - pmin.Z(); + if ( ! & ngMesh->LocalHFunction() ) + ngMesh->SetLocalH( pmin, pmax, compareh <= 0 ? 0.1 : 0.5 ); + // adjusted by SALOME_TESTS/Grids/smesh/bugs_08/I8 const int nbX = Max( 2, int( dx / maxh * 2 )); const int nbY = Max( 2, int( dy / maxh * 2 )); const int nbZ = Max( 2, int( dz / maxh * 2 )); - if ( ! & ngMesh->LocalHFunction() ) - ngMesh->SetLocalH( pmin, pmax, 0.1 ); - netgen::Point3d p; for ( int i = 0; i <= nbX; ++i ) { @@ -411,7 +446,7 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh, else if ( _hypMaxElementVolume ) { netgen::mparam.maxh = pow( 72, 1/6. ) * pow( _maxElementVolume, 1/3. ); - limitVolumeSize( ngMesh, netgen::mparam.maxh * 0.8 ); + // limitVolumeSize( ngMesh, netgen::mparam.maxh ); // result is unpredictable } else if ( aMesh.HasShapeToMesh() ) {