0020452: EDF 1056 SMESH : 2D Projection Issue /regresion/
avoid sharp change of Local H caused by short edges
This commit is contained in:
parent
fee2e60207
commit
eab620651d
@ -169,7 +169,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::CheckHypothesis (SMESH_Mesh& aMesh,
|
|||||||
*/
|
*/
|
||||||
//================================================================================
|
//================================================================================
|
||||||
|
|
||||||
static TError AddSegmentsToMesh(netgen::Mesh& ngMesh,
|
static TError addSegmentsToMesh(netgen::Mesh& ngMesh,
|
||||||
OCCGeometry& geom,
|
OCCGeometry& geom,
|
||||||
const TSideVector& wires,
|
const TSideVector& wires,
|
||||||
SMESH_MesherHelper& helper,
|
SMESH_MesherHelper& helper,
|
||||||
@ -225,6 +225,11 @@ static TError AddSegmentsToMesh(netgen::Mesh& ngMesh,
|
|||||||
const vector<UVPtStruct>& uvPtVec = wire->GetUVPtStruct();
|
const vector<UVPtStruct>& uvPtVec = wire->GetUVPtStruct();
|
||||||
const int nbSegments = wire->NbPoints() - 1;
|
const int nbSegments = wire->NbPoints() - 1;
|
||||||
|
|
||||||
|
// compute length of every segment
|
||||||
|
vector<double> segLen( nbSegments );
|
||||||
|
for ( int i = 0; i < nbSegments; ++i )
|
||||||
|
segLen[i] = SMESH_TNodeXYZ( uvPtVec[ i ].node ).Distance( uvPtVec[ i+1 ].node );
|
||||||
|
|
||||||
int edgeID = 1, posID = -2;
|
int edgeID = 1, posID = -2;
|
||||||
bool isInternalWire = false;
|
bool isInternalWire = false;
|
||||||
for ( int i = 0; i < nbSegments; ++i ) // loop on segments
|
for ( int i = 0; i < nbSegments; ++i ) // loop on segments
|
||||||
@ -295,10 +300,16 @@ static TError AddSegmentsToMesh(netgen::Mesh& ngMesh,
|
|||||||
|
|
||||||
ngMesh.AddSegment (seg);
|
ngMesh.AddSegment (seg);
|
||||||
{
|
{
|
||||||
|
// restrict size of elements near the segment
|
||||||
netgen::Point3d ngP1(n->X(), n->Y(), n->Z());
|
netgen::Point3d ngP1(n->X(), n->Y(), n->Z());
|
||||||
n = uvPtVec[ i+1 ].node;
|
n = uvPtVec[ i+1 ].node;
|
||||||
netgen::Point3d ngP2(n->X(), n->Y(), n->Z());
|
netgen::Point3d ngP2(n->X(), n->Y(), n->Z());
|
||||||
ngMesh.RestrictLocalH( netgen::Center( ngP1,ngP2), Dist(ngP1,ngP2));
|
// get an average size of adjacent segments to avoid sharp change of
|
||||||
|
// element size (regression on issue 0020452, note 0010898)
|
||||||
|
int iPrev = SMESH_MesherHelper::WrapIndex( i-1, nbSegments );
|
||||||
|
int iNext = SMESH_MesherHelper::WrapIndex( i+1, nbSegments );
|
||||||
|
double avgH = ( segLen[ iPrev ] + segLen[ i ] + segLen[ iNext ]) / 3;
|
||||||
|
ngMesh.RestrictLocalH( netgen::Center( ngP1,ngP2), avgH );
|
||||||
}
|
}
|
||||||
#ifdef DUMP_SEGMENTS
|
#ifdef DUMP_SEGMENTS
|
||||||
cout << "Segment: " << seg.edgenr << endl
|
cout << "Segment: " << seg.edgenr << endl
|
||||||
@ -426,11 +437,9 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh,
|
|||||||
if ( edgeLength < DBL_MIN )
|
if ( edgeLength < DBL_MIN )
|
||||||
edgeLength = occgeo.GetBoundingBox().Diam();
|
edgeLength = occgeo.GetBoundingBox().Diam();
|
||||||
|
|
||||||
//cout << " edgeLength = " << edgeLength << endl;
|
|
||||||
|
|
||||||
netgen::mparam.maxh = edgeLength;
|
netgen::mparam.maxh = edgeLength;
|
||||||
netgen::mparam.quad = _hypQuadranglePreference ? 1 : 0;
|
netgen::mparam.quad = _hypQuadranglePreference ? 1 : 0;
|
||||||
//ngMesh->SetGlobalH ( edgeLength );
|
netgen::mparam.grading = 0.7; // very coarse mesh by default
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------
|
// -------------------------
|
||||||
@ -446,7 +455,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh,
|
|||||||
ngMesh->SetGlobalH (netgen::mparam.maxh);
|
ngMesh->SetGlobalH (netgen::mparam.maxh);
|
||||||
|
|
||||||
vector< const SMDS_MeshNode* > nodeVec;
|
vector< const SMDS_MeshNode* > nodeVec;
|
||||||
problem = AddSegmentsToMesh( *ngMesh, occgeo, wires, helper, nodeVec );
|
problem = addSegmentsToMesh( *ngMesh, occgeo, wires, helper, nodeVec );
|
||||||
if ( problem && !problem->IsOK() )
|
if ( problem && !problem->IsOK() )
|
||||||
return error( problem );
|
return error( problem );
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user