0021681: EDF 2246 NETGENPLUGIN: Local size not fully taken into account

1) if a local size is given on a face, set this size on edges of the face as well
2) take into account local sizes when pre-computing internal edges
This commit is contained in:
eap 2012-06-26 15:33:59 +00:00
parent ab7bc69cf5
commit f6d900d8a6

View File

@ -77,6 +77,7 @@
//#include <ngexception.hpp>
namespace netgen {
extern int OCCGenerateMesh (OCCGeometry&, Mesh*&, int, int, char*);
//extern void OCCSetLocalMeshSize(OCCGeometry & geom, Mesh & mesh);
extern MeshingParameters mparam;
extern volatile multithreadt multithread;
}
@ -1833,15 +1834,6 @@ bool NETGENPlugin_Mesher::Compute()
#ifdef NETGEN_NEW
// Local size on faces
occgeo.face_maxh = mparams.maxh;
for(map<int,double>::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);
}
#endif
// Let netgen create ngMesh and calculate element size on not meshed shapes
@ -1902,6 +1894,17 @@ bool NETGENPlugin_Mesher::Compute()
gp_Pnt p = BRep_Tool::Pnt(v);
NETGENPlugin_Mesher::RestrictLocalSize( *ngMesh, p.XYZ(), hi );
}
for(map<int,double>::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 );
}
}
// Precompute internal edges (issue 0020676) in order to
@ -1917,19 +1920,24 @@ bool NETGENPlugin_Mesher::Compute()
intOccgeo.face_maxh.SetSize(intOccgeo.fmap.Extent());
intOccgeo.face_maxh = netgen::mparam.maxh;
#endif
// let netgen compute element size by the main geometry in temporary mesh
netgen::Mesh *tmpNgMesh = NULL;
try
{
OCC_CATCH_SIGNALS;
netgen::OCCGenerateMesh(occgeo, tmpNgMesh, startWith, endWith, optstr);
// compute local H on internal shapes in the main mesh
//OCCSetLocalMeshSize(intOccgeo, *ngMesh); it deletes ngMesh->localH
// let netgen create a temporary mesh
netgen::OCCGenerateMesh(intOccgeo, tmpNgMesh, startWith, endWith, optstr);
#ifdef WITH_SMESH_CANCEL_COMPUTE
if(netgen::multithread.terminate)
return false;
#endif
// copy LocalH from the main to temporary mesh
initState.transferLocalH( ngMesh, tmpNgMesh );
// compute mesh on internal edges
endWith = netgen::MESHCONST_MESHEDGES;
startWith = endWith = netgen::MESHCONST_MESHEDGES;
err = netgen::OCCGenerateMesh(intOccgeo, tmpNgMesh, startWith, endWith, optstr);
comment << text(err);
}
@ -1938,6 +1946,8 @@ bool NETGENPlugin_Mesher::Compute()
comment << text(ex);
err = 1;
}
initState.restoreLocalH( tmpNgMesh );
// fill SMESH by netgen mesh
vector< const SMDS_MeshNode* > tmpNodeVec;
FillSMesh( intOccgeo, *tmpNgMesh, initState, *_mesh, tmpNodeVec, comment );
@ -2539,7 +2549,8 @@ NETGENPlugin_Mesher::readErrors(const vector<const SMDS_MeshNode* >& nodeVec)
*/
//================================================================================
NETGENPlugin_ngMeshInfo::NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh)
NETGENPlugin_ngMeshInfo::NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh):
_copyOfLocalH(0)
{
if ( ngMesh )
{
@ -2554,6 +2565,42 @@ NETGENPlugin_ngMeshInfo::NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh)
}
}
//================================================================================
/*!
* \brief Copy LocalH member from one netgen mesh to another
*/
//================================================================================
void NETGENPlugin_ngMeshInfo::transferLocalH( netgen::Mesh* fromMesh,
netgen::Mesh* toMesh )
{
if ( !fromMesh->LocalHFunctionGenerated() ) return;
if ( !toMesh->LocalHFunctionGenerated() )
toMesh->CalcLocalH();
const size_t size = sizeof( netgen::LocalH );
_copyOfLocalH = new char[ size ];
memcpy( (void*)_copyOfLocalH, (void*)&toMesh->LocalHFunction(), size );
memcpy( (void*)&toMesh->LocalHFunction(), (void*)&fromMesh->LocalHFunction(), size );
}
//================================================================================
/*!
* \brief Restore LocalH member of a netgen mesh
*/
//================================================================================
void NETGENPlugin_ngMeshInfo::restoreLocalH( netgen::Mesh* toMesh )
{
if ( _copyOfLocalH )
{
const size_t size = sizeof( netgen::LocalH );
memcpy( (void*)&toMesh->LocalHFunction(), (void*)_copyOfLocalH, size );
delete [] _copyOfLocalH;
_copyOfLocalH = 0;
}
}
//================================================================================
/*!
* \brief Find "internal" sub-shapes