X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FNETGENPlugin%2FNETGENPlugin_NETGEN_3D.cxx;h=b379d7aafa9e222f091a86ab683cb41fb5d6b0ba;hb=1b359b696a744f5cefdd5185651b466a78e5812f;hp=f2ef3d8531904ea1d63ac0213159a2ea7066a755;hpb=a6ff10e23f7e68d7109ae6b90bb255286b9159cf;p=plugins%2Fnetgenplugin.git diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx index f2ef3d8..b379d7a 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -71,6 +71,7 @@ #define OCCGEOMETRY #endif #include +#include namespace nglib { #include } @@ -80,7 +81,13 @@ namespace netgen { #else extern int OCCGenerateMesh (OCCGeometry&, Mesh*&, int, int, char*); #endif - extern MeshingParameters mparam; +#if defined(NETGEN_V5) && defined(WIN32) + DLL_HEADER +#endif +extern MeshingParameters mparam; +#if defined(NETGEN_V5) && defined(WIN32) + DLL_HEADER +#endif extern volatile multithreadt multithread; } using namespace nglib; @@ -92,11 +99,9 @@ using namespace std; */ //============================================================================= -NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, int studyId, - SMESH_Gen* gen) - : SMESH_3D_Algo(hypId, studyId, gen) +NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, SMESH_Gen* gen) + : SMESH_3D_Algo(hypId, gen) { - MESSAGE("NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D"); _name = "NETGEN_3D"; _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID);// 1 bit /shape type _compatibleHypothesis.push_back("MaxElementVolume"); @@ -120,7 +125,6 @@ NETGENPlugin_NETGEN_3D::NETGENPlugin_NETGEN_3D(int hypId, int studyId, NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D() { - MESSAGE("NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D"); } //============================================================================= @@ -133,8 +137,6 @@ bool NETGENPlugin_NETGEN_3D::CheckHypothesis (SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, Hypothesis_Status& aStatus) { - MESSAGE("NETGENPlugin_NETGEN_3D::CheckHypothesis"); - _hypMaxElementVolume = NULL; _hypParameters = NULL; _viscousLayersHyp = NULL; @@ -340,77 +342,77 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh, return ( ngLib._isComputeOk = compute( aMesh, helper, nodeVec, Netgen_mesh)); } -namespace -{ - void limitVolumeSize( netgen::Mesh* ngMesh, - 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 ); - const double dx = pmax.X() - pmin.X(); - 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 )); - - netgen::Point3d p; - for ( int i = 0; i <= nbX; ++i ) - { - p.X() = pmin.X() + i * dx / nbX; - for ( int j = 0; j <= nbY; ++j ) - { - p.Y() = pmin.Y() + j * dy / nbY; - for ( int k = 0; k <= nbZ; ++k ) - { - p.Z() = pmin.Z() + k * dz / nbZ; - ngMesh->RestrictLocalH( p, maxh ); - } - } - } - } -} +// namespace +// { +// void limitVolumeSize( netgen::Mesh* ngMesh, +// 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 ); +// const double dx = pmax.X() - pmin.X(); +// 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 )); + +// netgen::Point3d p; +// for ( int i = 0; i <= nbX; ++i ) +// { +// p.X() = pmin.X() + i * dx / nbX; +// for ( int j = 0; j <= nbY; ++j ) +// { +// p.Y() = pmin.Y() + j * dy / nbY; +// for ( int k = 0; k <= nbZ; ++k ) +// { +// p.Z() = pmin.Z() + k * dz / nbZ; +// ngMesh->RestrictLocalH( p, maxh ); +// } +// } +// } +// } +// } //================================================================================ /*! @@ -437,10 +439,28 @@ 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() || + !_hypParameters->GetMeshSizeFile().empty() ) + { + if ( ! &ngMesh->LocalHFunction() ) + { + netgen::Point3d pmin, pmax; + ngMesh->GetBox( pmin, pmax, 0 ); + ngMesh->SetLocalH( pmin, pmax, _hypParameters->GetGrowthRate() ); + } + aMesher.SetLocalSize( occgeo, *ngMesh ); + + try { + ngMesh->LoadLocalMeshSize( netgen::mparam.meshsizefilename ); + } catch (netgen::NgException & ex) { + return error( COMPERR_BAD_PARMETERS, ex.What() ); + } + } if ( !_hypParameters->GetOptimize() ) endWith = netgen::MESHCONST_MESHVOLUME; } @@ -510,10 +530,6 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh, int Netgen_NbOfNodesNew = Ng_GetNP(Netgen_mesh); int Netgen_NbOfTetra = Ng_GetNE(Netgen_mesh); - MESSAGE("End of Volume Mesh Generation. err=" << err << - ", nb new nodes: " << Netgen_NbOfNodesNew - Netgen_NbOfNodes << - ", nb tetra: " << Netgen_NbOfTetra); - // ------------------------------------------------------------------- // Feed back the SMESHDS with the generated Nodes and Volume Elements // -------------------------------------------------------------------