Regression of SALOME_TESTS/Grids/smesh/viscous_layers_00/A6

This commit is contained in:
eap 2014-05-30 16:11:45 +04:00
parent fb5ce7193e
commit c365f36e98

View File

@ -1012,8 +1012,11 @@ namespace
} }
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
// DEBUG. Dump intermediate node positions into a python script // DEBUG. Dump intermediate node positions into a python script
// HOWTO use: run python commands written in a console to see
// construction steps of viscous layers
#ifdef __myDEBUG #ifdef __myDEBUG
ofstream* py; ofstream* py;
int theNbFunc;
struct PyDump { struct PyDump {
PyDump() { PyDump() {
const char* fname = "/tmp/viscous.py"; const char* fname = "/tmp/viscous.py";
@ -1024,19 +1027,20 @@ namespace
<< "smesh = smeshBuilder.New(salome.myStudy)" << endl << "smesh = smeshBuilder.New(salome.myStudy)" << endl
<< "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl << "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
<< "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl; << "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl;
theNbFunc = 0;
} }
void Finish() { void Finish() {
if (py) if (py)
*py << "mesh.MakeGroup('Viscous Prisms',SMESH.VOLUME,SMESH.FT_ElemGeomType,'=',SMESH.Geom_PENTA)"<<endl; *py << "mesh.MakeGroup('Viscous Prisms',SMESH.VOLUME,SMESH.FT_ElemGeomType,'=',SMESH.Geom_PENTA)"<<endl;
delete py; py=0; delete py; py=0;
} }
~PyDump() { Finish(); } ~PyDump() { Finish(); cout << "NB FUNCTIONS: " << theNbFunc << endl; }
}; };
#define dumpFunction(f) { _dumpFunction(f, __LINE__);} #define dumpFunction(f) { _dumpFunction(f, __LINE__);}
#define dumpMove(n) { _dumpMove(n, __LINE__);} #define dumpMove(n) { _dumpMove(n, __LINE__);}
#define dumpCmd(txt) { _dumpCmd(txt, __LINE__);} #define dumpCmd(txt) { _dumpCmd(txt, __LINE__);}
void _dumpFunction(const string& fun, int ln) void _dumpFunction(const string& fun, int ln)
{ if (py) *py<< "def "<<fun<<"(): # "<< ln <<endl; cout<<fun<<"()"<<endl;} { if (py) *py<< "def "<<fun<<"(): # "<< ln <<endl; cout<<fun<<"()"<<endl; ++theNbFunc; }
void _dumpMove(const SMDS_MeshNode* n, int ln) void _dumpMove(const SMDS_MeshNode* n, int ln)
{ if (py) *py<< " mesh.MoveNode( "<<n->GetID()<< ", "<< n->X() { if (py) *py<< " mesh.MoveNode( "<<n->GetID()<< ", "<< n->X()
<< ", "<<n->Y()<<", "<< n->Z()<< ")\t\t # "<< ln <<endl; } << ", "<<n->Y()<<", "<< n->Z()<< ")\t\t # "<< ln <<endl; }
@ -3598,7 +3602,13 @@ bool _ViscousBuilder::updateNormalsOfConvexFaces( _SolidData& data,
for ( ; iBeg < iEnd; ++iBeg ) for ( ; iBeg < iEnd; ++iBeg )
avgNormal += data._edges[ iBeg ]->_normal; avgNormal += data._edges[ iBeg ]->_normal;
} }
avgNormal.Normalize(); double normSize = avgNormal.SquareModulus();
if ( normSize < 1e-200 )
{
debugMsg( "updateNormalsOfConvexFaces(): zero avgNormal" );
return false;
}
avgNormal /= Sqrt( normSize );
// compute new _LayerEdge::_cosin on EDGEs // compute new _LayerEdge::_cosin on EDGEs
double avgCosin = 0; double avgCosin = 0;
@ -3957,7 +3967,7 @@ bool _CentralCurveOnEdge::FindNewNormal( const gp_Pnt& center, gp_XYZ& newNormal
newNormal += norm; newNormal += norm;
double sz = newNormal.Modulus(); double sz = newNormal.Modulus();
if ( Abs ( sz ) < 1e-200 ) if ( sz < 1e-200 )
break; break;
newNormal /= sz; newNormal /= sz;
return true; return true;
@ -4739,6 +4749,7 @@ bool _ViscousBuilder::shrink()
dumpChangeNodes( f ); dumpChangeNodes( f );
// Replace source nodes by target nodes in mesh faces to shrink // Replace source nodes by target nodes in mesh faces to shrink
dumpFunction(SMESH_Comment("replNodesOnFace")<<f2sd->first); // debug
const SMDS_MeshNode* nodes[20]; const SMDS_MeshNode* nodes[20];
for ( size_t i = 0; i < lEdges.size(); ++i ) for ( size_t i = 0; i < lEdges.size(); ++i )
{ {
@ -4758,6 +4769,7 @@ bool _ViscousBuilder::shrink()
nodes[iN] = ( n == srcNode ? tgtNode : n ); nodes[iN] = ( n == srcNode ? tgtNode : n );
} }
helper.GetMeshDS()->ChangeElementNodes( f, nodes, f->NbNodes() ); helper.GetMeshDS()->ChangeElementNodes( f, nodes, f->NbNodes() );
dumpChangeNodes( f );
} }
} }
@ -4767,6 +4779,7 @@ bool _ViscousBuilder::shrink()
// Create _SmoothNode's on face F // Create _SmoothNode's on face F
vector< _SmoothNode > nodesToSmooth( smoothNodes.size() ); vector< _SmoothNode > nodesToSmooth( smoothNodes.size() );
{ {
dumpFunction(SMESH_Comment("fixUVOnFace")<<f2sd->first); // debug
const bool sortSimplices = isConcaveFace; const bool sortSimplices = isConcaveFace;
for ( size_t i = 0; i < smoothNodes.size(); ++i ) for ( size_t i = 0; i < smoothNodes.size(); ++i )
{ {
@ -4907,6 +4920,17 @@ bool _ViscousBuilder::shrink()
} }
} }
} }
// TODO: check effect of this additional smooth
// additional laplacian smooth to increase allowed shrink step
// for ( int st = 1; st; --st )
// {
// dumpFunction(SMESH_Comment("shrinkFace")<<f2sd->first<<"_st"<<++smooStep); // debug
// for ( size_t i = 0; i < nodesToSmooth.size(); ++i )
// {
// nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
// _SmoothNode::LAPLACIAN,/*set3D=*/false);
// }
// }
} // while ( shrinked ) } // while ( shrinked )
// No wrongly shaped faces remain; final smooth. Set node XYZ. // No wrongly shaped faces remain; final smooth. Set node XYZ.
@ -4980,7 +5004,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge,
gp_Vec2d uvDir( srcUV, tgtUV ); gp_Vec2d uvDir( srcUV, tgtUV );
double uvLen = uvDir.Magnitude(); double uvLen = uvDir.Magnitude();
uvDir /= uvLen; uvDir /= uvLen;
edge._normal.SetCoord( uvDir.X(),uvDir.Y(), 0); edge._normal.SetCoord( uvDir.X(),uvDir.Y(), 0 );
edge._len = uvLen; edge._len = uvLen;
edge._pos.resize(1); edge._pos.resize(1);
@ -5210,7 +5234,7 @@ bool _LayerEdge::SetNewLength2d( Handle(Geom_Surface)& surface,
const double kSafe = Max( 0.5, 1. - 0.1 * _simplices.size() ); const double kSafe = Max( 0.5, 1. - 0.1 * _simplices.size() );
// Select shrinking step such that not to make faces with wrong orientation. // Select shrinking step such that not to make faces with wrong orientation.
double stepSize = uvLen; double stepSize = 1e100;
for ( size_t i = 0; i < _simplices.size(); ++i ) for ( size_t i = 0; i < _simplices.size(); ++i )
{ {
// find intersection of 2 lines: curUV-tgtUV and that connecting simplex nodes // find intersection of 2 lines: curUV-tgtUV and that connecting simplex nodes
@ -5225,7 +5249,7 @@ bool _LayerEdge::SetNewLength2d( Handle(Geom_Surface)& surface,
stepSize = Min( step, stepSize ); stepSize = Min( step, stepSize );
} }
gp_Pnt2d newUV; gp_Pnt2d newUV;
if ( uvLen - stepSize < _len / 200. ) if ( uvLen <= stepSize )
{ {
newUV = tgtUV; newUV = tgtUV;
_pos.clear(); _pos.clear();