mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-26 15:15:37 +05:00
Regression of SALOME_TESTS/Grids/smesh/viscous_layers_00/A6
This commit is contained in:
parent
fb5ce7193e
commit
c365f36e98
@ -1012,8 +1012,11 @@ namespace
|
||||
}
|
||||
//--------------------------------------------------------------------------------
|
||||
// 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
|
||||
ofstream* py;
|
||||
int theNbFunc;
|
||||
struct PyDump {
|
||||
PyDump() {
|
||||
const char* fname = "/tmp/viscous.py";
|
||||
@ -1024,19 +1027,20 @@ namespace
|
||||
<< "smesh = smeshBuilder.New(salome.myStudy)" << endl
|
||||
<< "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
|
||||
<< "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl;
|
||||
theNbFunc = 0;
|
||||
}
|
||||
void Finish() {
|
||||
if (py)
|
||||
*py << "mesh.MakeGroup('Viscous Prisms',SMESH.VOLUME,SMESH.FT_ElemGeomType,'=',SMESH.Geom_PENTA)"<<endl;
|
||||
delete py; py=0;
|
||||
}
|
||||
~PyDump() { Finish(); }
|
||||
~PyDump() { Finish(); cout << "NB FUNCTIONS: " << theNbFunc << endl; }
|
||||
};
|
||||
#define dumpFunction(f) { _dumpFunction(f, __LINE__);}
|
||||
#define dumpMove(n) { _dumpMove(n, __LINE__);}
|
||||
#define dumpCmd(txt) { _dumpCmd(txt, __LINE__);}
|
||||
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)
|
||||
{ if (py) *py<< " mesh.MoveNode( "<<n->GetID()<< ", "<< n->X()
|
||||
<< ", "<<n->Y()<<", "<< n->Z()<< ")\t\t # "<< ln <<endl; }
|
||||
@ -3598,7 +3602,13 @@ bool _ViscousBuilder::updateNormalsOfConvexFaces( _SolidData& data,
|
||||
for ( ; iBeg < iEnd; ++iBeg )
|
||||
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
|
||||
double avgCosin = 0;
|
||||
@ -3957,7 +3967,7 @@ bool _CentralCurveOnEdge::FindNewNormal( const gp_Pnt& center, gp_XYZ& newNormal
|
||||
|
||||
newNormal += norm;
|
||||
double sz = newNormal.Modulus();
|
||||
if ( Abs ( sz ) < 1e-200 )
|
||||
if ( sz < 1e-200 )
|
||||
break;
|
||||
newNormal /= sz;
|
||||
return true;
|
||||
@ -4739,6 +4749,7 @@ bool _ViscousBuilder::shrink()
|
||||
dumpChangeNodes( f );
|
||||
|
||||
// Replace source nodes by target nodes in mesh faces to shrink
|
||||
dumpFunction(SMESH_Comment("replNodesOnFace")<<f2sd->first); // debug
|
||||
const SMDS_MeshNode* nodes[20];
|
||||
for ( size_t i = 0; i < lEdges.size(); ++i )
|
||||
{
|
||||
@ -4758,6 +4769,7 @@ bool _ViscousBuilder::shrink()
|
||||
nodes[iN] = ( n == srcNode ? tgtNode : n );
|
||||
}
|
||||
helper.GetMeshDS()->ChangeElementNodes( f, nodes, f->NbNodes() );
|
||||
dumpChangeNodes( f );
|
||||
}
|
||||
}
|
||||
|
||||
@ -4767,6 +4779,7 @@ bool _ViscousBuilder::shrink()
|
||||
// Create _SmoothNode's on face F
|
||||
vector< _SmoothNode > nodesToSmooth( smoothNodes.size() );
|
||||
{
|
||||
dumpFunction(SMESH_Comment("fixUVOnFace")<<f2sd->first); // debug
|
||||
const bool sortSimplices = isConcaveFace;
|
||||
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 )
|
||||
|
||||
// No wrongly shaped faces remain; final smooth. Set node XYZ.
|
||||
@ -4980,7 +5004,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge,
|
||||
gp_Vec2d uvDir( srcUV, tgtUV );
|
||||
double uvLen = uvDir.Magnitude();
|
||||
uvDir /= uvLen;
|
||||
edge._normal.SetCoord( uvDir.X(),uvDir.Y(), 0);
|
||||
edge._normal.SetCoord( uvDir.X(),uvDir.Y(), 0 );
|
||||
edge._len = uvLen;
|
||||
|
||||
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() );
|
||||
|
||||
// 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 )
|
||||
{
|
||||
// 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 );
|
||||
}
|
||||
gp_Pnt2d newUV;
|
||||
if ( uvLen - stepSize < _len / 200. )
|
||||
if ( uvLen <= stepSize )
|
||||
{
|
||||
newUV = tgtUV;
|
||||
_pos.clear();
|
||||
|
Loading…
Reference in New Issue
Block a user