IPAL53716: Body Fitting - cavities in mesh mismatch cavities in geometry

This commit is contained in:
eap 2016-12-21 19:46:09 +03:00
parent dca6c871d2
commit 2ba55546bd
2 changed files with 60 additions and 49 deletions

View File

@ -441,8 +441,8 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
{ {
SMDS_Mesh* _mesh; SMDS_Mesh* _mesh;
SMDS_ElemIteratorPtr _meshPartIt; SMDS_ElemIteratorPtr _meshPartIt;
ElementBndBoxTree* _ebbTree; ElementBndBoxTree* _ebbTree [SMDSAbs_NbElementTypes];
int _ebbTreeHeight; int _ebbTreeHeight[SMDSAbs_NbElementTypes];
SMESH_NodeSearcherImpl* _nodeSearcher; SMESH_NodeSearcherImpl* _nodeSearcher;
SMDSAbs_ElementType _elementType; SMDSAbs_ElementType _elementType;
double _tolerance; double _tolerance;
@ -452,10 +452,20 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
SMESH_ElementSearcherImpl( SMDS_Mesh& mesh, SMESH_ElementSearcherImpl( SMDS_Mesh& mesh,
double tol=-1, double tol=-1,
SMDS_ElemIteratorPtr elemIt=SMDS_ElemIteratorPtr()) SMDS_ElemIteratorPtr elemIt=SMDS_ElemIteratorPtr())
: _mesh(&mesh),_meshPartIt(elemIt),_ebbTree(0),_ebbTreeHeight(-1),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false) {} : _mesh(&mesh),_meshPartIt(elemIt),_nodeSearcher(0),_tolerance(tol),_outerFacesFound(false)
{
for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
{
_ebbTree[i] = NULL;
_ebbTreeHeight[i] = -1;
}
}
virtual ~SMESH_ElementSearcherImpl() virtual ~SMESH_ElementSearcherImpl()
{ {
if ( _ebbTree ) delete _ebbTree; _ebbTree = 0; for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
{
delete _ebbTree[i]; _ebbTree[i] = NULL;
}
if ( _nodeSearcher ) delete _nodeSearcher; _nodeSearcher = 0; if ( _nodeSearcher ) delete _nodeSearcher; _nodeSearcher = 0;
} }
virtual int FindElementsByPoint(const gp_Pnt& point, virtual int FindElementsByPoint(const gp_Pnt& point,
@ -482,9 +492,9 @@ struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher
} }
int getTreeHeight() int getTreeHeight()
{ {
if ( _ebbTreeHeight < 0 ) if ( _ebbTreeHeight[ _elementType ] < 0 )
_ebbTreeHeight = _ebbTree->getHeight(); _ebbTreeHeight[ _elementType ] = _ebbTree[ _elementType ]->getHeight();
return _ebbTreeHeight; return _ebbTreeHeight[ _elementType ];
} }
struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState()) struct TInters //!< data of intersection of the line and the mesh face (used in GetPointState())
@ -528,9 +538,9 @@ double SMESH_ElementSearcherImpl::getTolerance()
double boxSize = _nodeSearcher->getTree()->maxSize(); double boxSize = _nodeSearcher->getTree()->maxSize();
_tolerance = 1e-8 * boxSize/* / meshInfo.NbNodes()*/; _tolerance = 1e-8 * boxSize/* / meshInfo.NbNodes()*/;
} }
else if ( _ebbTree && meshInfo.NbElements() > 0 ) else if ( _ebbTree[_elementType] && meshInfo.NbElements() > 0 )
{ {
double boxSize = _ebbTree->maxSize(); double boxSize = _ebbTree[_elementType]->maxSize();
_tolerance = 1e-8 * boxSize/* / meshInfo.NbElements()*/; _tolerance = 1e-8 * boxSize/* / meshInfo.NbElements()*/;
} }
if ( _tolerance == 0 ) if ( _tolerance == 0 )
@ -551,10 +561,9 @@ double SMESH_ElementSearcherImpl::getTolerance()
} }
else else
{ {
SMDS_ElemIteratorPtr elemIt = SMDS_ElemIteratorPtr elemIt = _mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
_mesh->elementsIterator( SMDSAbs_ElementType( complexType ));
const SMDS_MeshElement* elem = elemIt->next(); const SMDS_MeshElement* elem = elemIt->next();
SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator(); SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
SMESH_TNodeXYZ n1( nodeIt->next() ); SMESH_TNodeXYZ n1( nodeIt->next() );
elemSize = 0; elemSize = 0;
while ( nodeIt->more() ) while ( nodeIt->more() )
@ -723,6 +732,7 @@ FindElementsByPoint(const gp_Pnt& point,
vector< const SMDS_MeshElement* >& foundElements) vector< const SMDS_MeshElement* >& foundElements)
{ {
foundElements.clear(); foundElements.clear();
_elementType = type;
double tolerance = getTolerance(); double tolerance = getTolerance();
@ -756,13 +766,12 @@ FindElementsByPoint(const gp_Pnt& point,
// ================================================================================= // =================================================================================
else // elements more complex than 0D else // elements more complex than 0D
{ {
if ( !_ebbTree || _elementType != type ) if ( !_ebbTree[type] )
{ {
if ( _ebbTree ) delete _ebbTree; _ebbTree[_elementType] = new ElementBndBoxTree( *_mesh, type, _meshPartIt, tolerance );
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt, tolerance );
} }
TIDSortedElemSet suspectElems; TIDSortedElemSet suspectElems;
_ebbTree->getElementsNearPoint( point, suspectElems ); _ebbTree[ type ]->getElementsNearPoint( point, suspectElems );
TIDSortedElemSet::iterator elem = suspectElems.begin(); TIDSortedElemSet::iterator elem = suspectElems.begin();
for ( ; elem != suspectElems.end(); ++elem ) for ( ; elem != suspectElems.end(); ++elem )
if ( !SMESH_MeshAlgos::IsOut( *elem, point, tolerance )) if ( !SMESH_MeshAlgos::IsOut( *elem, point, tolerance ))
@ -784,29 +793,29 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
SMDSAbs_ElementType type ) SMDSAbs_ElementType type )
{ {
const SMDS_MeshElement* closestElem = 0; const SMDS_MeshElement* closestElem = 0;
_elementType = type;
if ( type == SMDSAbs_Face || type == SMDSAbs_Volume ) if ( type == SMDSAbs_Face || type == SMDSAbs_Volume )
{ {
if ( !_ebbTree || _elementType != type ) ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
{ if ( !ebbTree )
if ( _ebbTree ) delete _ebbTree; ebbTree = new ElementBndBoxTree( *_mesh, type, _meshPartIt );
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt );
}
TIDSortedElemSet suspectElems;
_ebbTree->getElementsNearPoint( point, suspectElems );
if ( suspectElems.empty() && _ebbTree->maxSize() > 0 ) TIDSortedElemSet suspectElems;
ebbTree->getElementsNearPoint( point, suspectElems );
if ( suspectElems.empty() && ebbTree->maxSize() > 0 )
{ {
gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox()->CornerMin() + gp_Pnt boxCenter = 0.5 * ( ebbTree->getBox()->CornerMin() +
_ebbTree->getBox()->CornerMax() ); ebbTree->getBox()->CornerMax() );
double radius = -1; double radius = -1;
if ( _ebbTree->getBox()->IsOut( point.XYZ() )) if ( ebbTree->getBox()->IsOut( point.XYZ() ))
radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize(); radius = point.Distance( boxCenter ) - 0.5 * ebbTree->maxSize();
if ( radius < 0 ) if ( radius < 0 )
radius = _ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2; radius = ebbTree->maxSize() / pow( 2., getTreeHeight()) / 2;
while ( suspectElems.empty() ) while ( suspectElems.empty() )
{ {
_ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems ); ebbTree->getElementsInSphere( point.XYZ(), radius, suspectElems );
radius *= 1.1; radius *= 1.1;
} }
} }
@ -870,11 +879,13 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point) TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
{ {
double tolerance = getTolerance(); double tolerance = getTolerance();
if ( !_ebbTree || _elementType != SMDSAbs_Face )
{ _elementType = SMDSAbs_Face;
if ( _ebbTree ) delete _ebbTree;
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = SMDSAbs_Face, _meshPartIt ); ElementBndBoxTree*& ebbTree = _ebbTree[ SMDSAbs_Face ];
} if ( !ebbTree )
ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
// Algo: analyse transition of a line starting at the point through mesh boundary; // Algo: analyse transition of a line starting at the point through mesh boundary;
// try three lines parallel to axis of the coordinate system and perform rough // try three lines parallel to axis of the coordinate system and perform rough
// analysis. If solution is not clear perform thorough analysis. // analysis. If solution is not clear perform thorough analysis.
@ -890,7 +901,7 @@ TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
gp_Lin line ( lineAxis ); gp_Lin line ( lineAxis );
TIDSortedElemSet suspectFaces; // faces possibly intersecting the line TIDSortedElemSet suspectFaces; // faces possibly intersecting the line
_ebbTree->getElementsNearLine( lineAxis, suspectFaces ); ebbTree->getElementsNearLine( lineAxis, suspectFaces );
// Intersect faces with the line // Intersect faces with the line
@ -1098,13 +1109,13 @@ void SMESH_ElementSearcherImpl::GetElementsNearLine( const gp_Ax1&
SMDSAbs_ElementType type, SMDSAbs_ElementType type,
vector< const SMDS_MeshElement* >& foundElems) vector< const SMDS_MeshElement* >& foundElems)
{ {
if ( !_ebbTree || _elementType != type ) _elementType = type;
{ ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
if ( _ebbTree ) delete _ebbTree; if ( !ebbTree )
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt ); ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
}
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
_ebbTree->getElementsNearLine( line, suspectFaces ); ebbTree->getElementsNearLine( line, suspectFaces );
foundElems.assign( suspectFaces.begin(), suspectFaces.end()); foundElems.assign( suspectFaces.begin(), suspectFaces.end());
} }
@ -1119,13 +1130,13 @@ void SMESH_ElementSearcherImpl::GetElementsInSphere( const gp_XYZ&
SMDSAbs_ElementType type, SMDSAbs_ElementType type,
vector< const SMDS_MeshElement* >& foundElems) vector< const SMDS_MeshElement* >& foundElems)
{ {
if ( !_ebbTree || _elementType != type ) _elementType = type;
{ ElementBndBoxTree*& ebbTree = _ebbTree[ type ];
if ( _ebbTree ) delete _ebbTree; if ( !ebbTree )
_ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type, _meshPartIt ); ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt );
}
TIDSortedElemSet suspectFaces; // elements possibly intersecting the line TIDSortedElemSet suspectFaces; // elements possibly intersecting the line
_ebbTree->getElementsInSphere( center, radius, suspectFaces ); ebbTree->getElementsInSphere( center, radius, suspectFaces );
foundElems.assign( suspectFaces.begin(), suspectFaces.end() ); foundElems.assign( suspectFaces.begin(), suspectFaces.end() );
} }

View File

@ -3167,7 +3167,7 @@ namespace
const F_IntersectPoint* firstIntPnt = 0; const F_IntersectPoint* firstIntPnt = 0;
if ( link._nodes[0]->Node() ) // 1st node is a hexa corner if ( link._nodes[0]->Node() ) // 1st node is a hexa corner
{ {
curIntPnt._paramOnLine = coords[ ijk[ iDir ]] - coords[0]; curIntPnt._paramOnLine = coords[ ijk[ iDir ]] - coords[0] + _grid->_tol;
const GridLine& line = _grid->_lines[ iDir ][ lineIndex[ iL ]]; const GridLine& line = _grid->_lines[ iDir ][ lineIndex[ iL ]];
multiset< F_IntersectPoint >::const_iterator ip = multiset< F_IntersectPoint >::const_iterator ip =
line._intPoints.upper_bound( curIntPnt ); line._intPoints.upper_bound( curIntPnt );