From afc23286c7e8bca2665e09b8f902bca28e67d906 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 10 Jan 2011 13:41:45 +0000 Subject: [PATCH] 0020832: EDF 1359 SMESH : Automatic meshing of boundary layers Move StdMeshers_ProxyMesh -> SMESH_ProxyMesh --- src/SMESH/Makefile.am | 6 +- .../SMESH_ProxyMesh.cxx} | 106 +++++++----- .../SMESH_ProxyMesh.hxx} | 42 +++-- src/StdMeshers/Makefile.am | 6 +- .../StdMeshers_QuadToTriaAdaptor.cxx | 26 +-- .../StdMeshers_QuadToTriaAdaptor.hxx | 10 +- src/StdMeshers/StdMeshers_ViscousLayers.cxx | 154 +++++++++++++----- src/StdMeshers/StdMeshers_ViscousLayers.hxx | 9 +- 8 files changed, 231 insertions(+), 128 deletions(-) rename src/{StdMeshers/StdMeshers_ProxyMesh.cxx => SMESH/SMESH_ProxyMesh.cxx} (81%) rename src/{StdMeshers/StdMeshers_ProxyMesh.hxx => SMESH/SMESH_ProxyMesh.hxx} (84%) diff --git a/src/SMESH/Makefile.am b/src/SMESH/Makefile.am index ef7e491bb..9fce7bebb 100644 --- a/src/SMESH/Makefile.am +++ b/src/SMESH/Makefile.am @@ -53,7 +53,8 @@ salomeinclude_HEADERS = \ SMESH_Comment.hxx \ SMESH_ComputeError.hxx \ SMESH_File.hxx \ - SMESH_SMESH.hxx + SMESH_SMESH.hxx \ + SMESH_ProxyMesh.hxx # Libraries targets @@ -77,7 +78,8 @@ dist_libSMESHimpl_la_SOURCES = \ SMESH_MesherHelper.cxx \ SMESH_Octree.cxx \ SMESH_OctreeNode.cxx \ - SMESH_File.cxx + SMESH_File.cxx \ + SMESH_ProxyMesh.cxx # additionnal information to compile and link file libSMESHimpl_la_CPPFLAGS = \ diff --git a/src/StdMeshers/StdMeshers_ProxyMesh.cxx b/src/SMESH/SMESH_ProxyMesh.cxx similarity index 81% rename from src/StdMeshers/StdMeshers_ProxyMesh.cxx rename to src/SMESH/SMESH_ProxyMesh.cxx index 83effe6b6..bee0efb11 100644 --- a/src/StdMeshers/StdMeshers_ProxyMesh.cxx +++ b/src/SMESH/SMESH_ProxyMesh.cxx @@ -16,11 +16,11 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : StdMeshers_ProxyMesh.cxx +// File : SMESH_ProxyMesh.cxx // Created : Thu Dec 2 12:32:53 2010 // Author : Edward AGAPOV (eap) -#include "StdMeshers_ProxyMesh.hxx" +#include "SMESH_ProxyMesh.hxx" #include "SMDS_IteratorOnIterators.hxx" #include "SMDS_SetIterator.hxx" @@ -36,7 +36,7 @@ */ //================================================================================ -StdMeshers_ProxyMesh::StdMeshers_ProxyMesh():_mesh(0) +SMESH_ProxyMesh::SMESH_ProxyMesh():_mesh(0) { } //================================================================================ @@ -45,14 +45,14 @@ StdMeshers_ProxyMesh::StdMeshers_ProxyMesh():_mesh(0) */ //================================================================================ -StdMeshers_ProxyMesh::StdMeshers_ProxyMesh(vector& components): +SMESH_ProxyMesh::SMESH_ProxyMesh(vector& components): _mesh(0) { if ( components.empty() ) return; for ( unsigned i = 0; i < components.size(); ++i ) { - StdMeshers_ProxyMesh* m = components[i].get(); + SMESH_ProxyMesh* m = components[i].get(); if ( !m ) continue; takeTmpElemsInMesh( m ); @@ -97,7 +97,7 @@ StdMeshers_ProxyMesh::StdMeshers_ProxyMesh(vector& co */ //================================================================================ -StdMeshers_ProxyMesh::~StdMeshers_ProxyMesh() +SMESH_ProxyMesh::~SMESH_ProxyMesh() { for ( unsigned i = 0; i < _subMeshes.size(); ++i ) delete _subMeshes[i]; @@ -105,7 +105,7 @@ StdMeshers_ProxyMesh::~StdMeshers_ProxyMesh() set< const SMDS_MeshElement* >::iterator i = _elemsInMesh.begin(); for ( ; i != _elemsInMesh.end(); ++i ) - getMeshDS()->RemoveFreeElement( *i, 0 ); + GetMeshDS()->RemoveFreeElement( *i, 0 ); _elemsInMesh.clear(); } @@ -115,9 +115,9 @@ StdMeshers_ProxyMesh::~StdMeshers_ProxyMesh() */ //================================================================================ -int StdMeshers_ProxyMesh::shapeIndex(const TopoDS_Shape& shape) const +int SMESH_ProxyMesh::shapeIndex(const TopoDS_Shape& shape) const { - return ( shape.IsNull() || !_mesh->HasShapeToMesh() ? 0 : getMeshDS()->ShapeToIndex(shape)); + return ( shape.IsNull() || !_mesh->HasShapeToMesh() ? 0 : GetMeshDS()->ShapeToIndex(shape)); } //================================================================================ @@ -126,7 +126,7 @@ int StdMeshers_ProxyMesh::shapeIndex(const TopoDS_Shape& shape) const */ //================================================================================ -const SMESHDS_SubMesh* StdMeshers_ProxyMesh::GetSubMesh(const TopoDS_Shape& shape) const +const SMESHDS_SubMesh* SMESH_ProxyMesh::GetSubMesh(const TopoDS_Shape& shape) const { const SMESHDS_SubMesh* sm = 0; @@ -134,7 +134,7 @@ const SMESHDS_SubMesh* StdMeshers_ProxyMesh::GetSubMesh(const TopoDS_Shape& shap if ( i < _subMeshes.size() ) sm = _subMeshes[i]; if ( !sm ) - sm = getMeshDS()->MeshElements( i ); + sm = GetMeshDS()->MeshElements( i ); return sm; } @@ -145,8 +145,8 @@ const SMESHDS_SubMesh* StdMeshers_ProxyMesh::GetSubMesh(const TopoDS_Shape& shap */ //================================================================================ -const StdMeshers_ProxyMesh::SubMesh* -StdMeshers_ProxyMesh::GetProxySubMesh(const TopoDS_Shape& shape) const +const SMESH_ProxyMesh::SubMesh* +SMESH_ProxyMesh::GetProxySubMesh(const TopoDS_Shape& shape) const { int i = shapeIndex(shape); return i < _subMeshes.size() ? _subMeshes[i] : 0; @@ -158,7 +158,7 @@ StdMeshers_ProxyMesh::GetProxySubMesh(const TopoDS_Shape& shape) const */ //================================================================================ -const SMDS_MeshNode* StdMeshers_ProxyMesh::GetProxyNode( const SMDS_MeshNode* node ) const +const SMDS_MeshNode* SMESH_ProxyMesh::GetProxyNode( const SMDS_MeshNode* node ) const { const SMDS_MeshNode* proxy = node; if ( node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_FACE ) @@ -168,7 +168,7 @@ const SMDS_MeshNode* StdMeshers_ProxyMesh::GetProxyNode( const SMDS_MeshNode* no } else { - TopoDS_Shape shape = SMESH_MesherHelper::GetSubShapeByNode( node, getMeshDS()); + TopoDS_Shape shape = SMESH_MesherHelper::GetSubShapeByNode( node, GetMeshDS()); TopTools_ListIteratorOfListOfShape ancIt; if ( !shape.IsNull() ) ancIt.Initialize( _mesh->GetAncestors( shape )); for ( ; ancIt.More() && proxy == node; ancIt.Next() ) @@ -223,7 +223,7 @@ namespace */ //================================================================================ -SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces(const TopoDS_Shape& shape) const +SMDS_ElemIteratorPtr SMESH_ProxyMesh::GetFaces(const TopoDS_Shape& shape) const { if ( !_mesh->HasShapeToMesh() ) return SMDS_ElemIteratorPtr(); @@ -246,7 +246,7 @@ SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces(const TopoDS_Shape& shape) c */ //================================================================================ -SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces() const +SMDS_ElemIteratorPtr SMESH_ProxyMesh::GetFaces() const { if ( _mesh->HasShapeToMesh() ) return SMDS_ElemIteratorPtr(); @@ -257,7 +257,7 @@ SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces() const _subContainer.AddSubMesh( _subMeshes[i] ); if ( _subContainer.NbSubMeshes() == 0 ) // no elements substituted - return getMeshDS()->elementsIterator(SMDSAbs_Face); + return GetMeshDS()->elementsIterator(SMDSAbs_Face); // if _allowedTypes is empty, only elements from _subMeshes are returned,... SMDS_ElemIteratorPtr proxyIter = _subContainer.SMESHDS_SubMesh::GetElements(); @@ -265,7 +265,7 @@ SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces() const return proxyIter; // ... else elements filtered using allowedTypes are additionally returned - SMDS_ElemIteratorPtr facesIter = getMeshDS()->elementsIterator(SMDSAbs_Face); + SMDS_ElemIteratorPtr facesIter = GetMeshDS()->elementsIterator(SMDSAbs_Face); SMDS_ElemIteratorPtr filterIter( new TFilteringIterator( _allowedTypes, facesIter )); vector< SMDS_ElemIteratorPtr > iters(2); iters[0] = proxyIter; @@ -282,7 +282,7 @@ SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::GetFaces() const */ //================================================================================ -int StdMeshers_ProxyMesh::NbFaces() const +int SMESH_ProxyMesh::NbFaces() const { int nb = 0; if ( _mesh->HasShapeToMesh() ) @@ -296,7 +296,7 @@ int StdMeshers_ProxyMesh::NbFaces() const else { if ( _subMeshes.empty() ) - return getMeshDS()->NbFaces(); + return GetMeshDS()->NbFaces(); for ( unsigned i = 0; i < _subMeshes.size(); ++i ) if ( _subMeshes[i] ) @@ -311,7 +311,7 @@ int StdMeshers_ProxyMesh::NbFaces() const bool allowed = ( find( _allowedTypes.begin(), _allowedTypes.end(), t ) != _allowedTypes.end() ); if ( allowed ) - nb += getMeshDS()->GetMeshInfo().NbEntities( SMDSAbs_EntityType( t )); + nb += GetMeshDS()->GetMeshInfo().NbEntities( SMDSAbs_EntityType( t )); } } } @@ -324,7 +324,7 @@ int StdMeshers_ProxyMesh::NbFaces() const */ //================================================================================ -StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::getProxySubMesh(int index) +SMESH_ProxyMesh::SubMesh* SMESH_ProxyMesh::getProxySubMesh(int index) { if ( int(_subMeshes.size()) <= index ) _subMeshes.resize( index+1, 0 ); @@ -339,7 +339,7 @@ StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::getProxySubMesh(int index) */ //================================================================================ -StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::getProxySubMesh(const TopoDS_Shape& shape) +SMESH_ProxyMesh::SubMesh* SMESH_ProxyMesh::getProxySubMesh(const TopoDS_Shape& shape) { return getProxySubMesh( shapeIndex( shape )); } @@ -350,7 +350,7 @@ StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::getProxySubMesh(const TopoD */ //================================================================================ -StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::findProxySubMesh(int shapeIndex) const +SMESH_ProxyMesh::SubMesh* SMESH_ProxyMesh::findProxySubMesh(int shapeIndex) const { return shapeIndex < int(_subMeshes.size()) ? _subMeshes[shapeIndex] : 0; } @@ -361,7 +361,7 @@ StdMeshers_ProxyMesh::SubMesh* StdMeshers_ProxyMesh::findProxySubMesh(int shapeI */ //================================================================================ -SMESHDS_Mesh* StdMeshers_ProxyMesh::getMeshDS() const +SMESHDS_Mesh* SMESH_ProxyMesh::GetMeshDS() const { return (SMESHDS_Mesh*)( _mesh ? _mesh->GetMeshDS() : 0 ); } @@ -372,8 +372,8 @@ SMESHDS_Mesh* StdMeshers_ProxyMesh::getMeshDS() const */ //================================================================================ -bool StdMeshers_ProxyMesh::takeProxySubMesh( const TopoDS_Shape& shape, - StdMeshers_ProxyMesh* proxyMesh ) +bool SMESH_ProxyMesh::takeProxySubMesh( const TopoDS_Shape& shape, + SMESH_ProxyMesh* proxyMesh ) { if ( proxyMesh && proxyMesh->_mesh == _mesh ) { @@ -396,7 +396,7 @@ bool StdMeshers_ProxyMesh::takeProxySubMesh( const TopoDS_Shape& shape, */ //================================================================================ -void StdMeshers_ProxyMesh::takeTmpElemsInMesh( StdMeshers_ProxyMesh* proxyMesh ) +void SMESH_ProxyMesh::takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh ) { if ( proxyMesh ) { @@ -412,14 +412,14 @@ void StdMeshers_ProxyMesh::takeTmpElemsInMesh( StdMeshers_ProxyMesh* proxyMesh ) */ //================================================================================ -void StdMeshers_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face ) +void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face ) { if ( face && face->GetID() > 0 ) { set< const SMDS_MeshElement* >::iterator i = _elemsInMesh.find( face ); if ( i != _elemsInMesh.end() ) { - getMeshDS()->RemoveFreeElement( face, 0 ); + GetMeshDS()->RemoveFreeElement( face, 0 ); _elemsInMesh.erase( i ); } } @@ -435,18 +435,34 @@ void StdMeshers_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face ) */ //================================================================================ -void StdMeshers_ProxyMesh::storeTmpElement( const SMDS_MeshElement* face ) +void SMESH_ProxyMesh::storeTmpElement( const SMDS_MeshElement* face ) { _elemsInMesh.insert( face ); } +//================================================================================ +/*! + * \brief Set node-node correspondence + */ +//================================================================================ + +void SMESH_ProxyMesh::setNode2Node(const SMDS_MeshNode* srcNode, + const SMDS_MeshNode* proxyNode, + const SubMesh* subMesh) +{ + SubMesh* sm = const_cast( subMesh ); + if ( !subMesh->_n2n ) + sm->_n2n = new TN2NMap; + sm->_n2n->insert( make_pair( srcNode, proxyNode )); +} + //================================================================================ /*! * \brief Return true if the element is a temporary one */ //================================================================================ -bool StdMeshers_ProxyMesh::IsTemporary(const SMDS_MeshElement* elem ) const +bool SMESH_ProxyMesh::IsTemporary(const SMDS_MeshElement* elem ) const { return ( elem->GetID() < 1 ) || _elemsInMesh.count( elem ); } @@ -457,7 +473,7 @@ bool StdMeshers_ProxyMesh::IsTemporary(const SMDS_MeshElement* elem ) const */ //================================================================================ -const SMDS_MeshNode* StdMeshers_ProxyMesh::SubMesh::GetProxyNode( const SMDS_MeshNode* n ) const +const SMDS_MeshNode* SMESH_ProxyMesh::SubMesh::GetProxyNode( const SMDS_MeshNode* n ) const { TN2NMap::iterator n2n; if ( _n2n && ( n2n = _n2n->find( n )) != _n2n->end()) @@ -471,12 +487,14 @@ const SMDS_MeshNode* StdMeshers_ProxyMesh::SubMesh::GetProxyNode( const SMDS_Mes */ //================================================================================ -void StdMeshers_ProxyMesh::SubMesh::Clear() +void SMESH_ProxyMesh::SubMesh::Clear() { for ( unsigned i = 0; i < _elements.size(); ++i ) if ( _elements[i]->GetID() < 0 ) delete _elements[i]; _elements.clear(); + if ( _n2n ) + delete _n2n, _n2n = 0; } //================================================================================ @@ -485,7 +503,7 @@ void StdMeshers_ProxyMesh::SubMesh::Clear() */ //================================================================================ -int StdMeshers_ProxyMesh::SubMesh::NbElements() const +int SMESH_ProxyMesh::SubMesh::NbElements() const { return _elements.size(); } @@ -496,7 +514,7 @@ int StdMeshers_ProxyMesh::SubMesh::NbElements() const */ //================================================================================ -SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::SubMesh::GetElements() const +SMDS_ElemIteratorPtr SMESH_ProxyMesh::SubMesh::GetElements() const { return SMDS_ElemIteratorPtr ( new SMDS_ElementVectorIterator( _elements.begin(), _elements.end() )); @@ -508,8 +526,20 @@ SMDS_ElemIteratorPtr StdMeshers_ProxyMesh::SubMesh::GetElements() const */ //================================================================================ -void StdMeshers_ProxyMesh::SubMesh::AddElement(const SMDS_MeshElement * e) +void SMESH_ProxyMesh::SubMesh::AddElement(const SMDS_MeshElement * e) { _elements.push_back( e ); } +//================================================================================ +/*! + * \brief Check presence of element inside it-self + */ +//================================================================================ + +bool SMESH_ProxyMesh::SubMesh::Contains(const SMDS_MeshElement * ME) const +{ + if ( ME->GetType() != SMDSAbs_Node ) + return find( _elements.begin(), _elements.end(), ME ) != _elements.end(); + return false; +} diff --git a/src/StdMeshers/StdMeshers_ProxyMesh.hxx b/src/SMESH/SMESH_ProxyMesh.hxx similarity index 84% rename from src/StdMeshers/StdMeshers_ProxyMesh.hxx rename to src/SMESH/SMESH_ProxyMesh.hxx index 53c4a6fe4..76c4da472 100644 --- a/src/StdMeshers/StdMeshers_ProxyMesh.hxx +++ b/src/SMESH/SMESH_ProxyMesh.hxx @@ -17,14 +17,14 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : StdMeshers_ProxyMesh.hxx +// File : SMESH_ProxyMesh.hxx // Created : Thu Dec 2 10:05:35 2010 // Author : Edward AGAPOV (eap) -#ifndef __StdMeshers_ProxyMesh_HXX__ -#define __StdMeshers_ProxyMesh_HXX__ +#ifndef __SMESH_ProxyMesh_HXX__ +#define __SMESH_ProxyMesh_HXX__ -#include "SMESH_StdMeshers.hxx" +#include "SMESH_SMESH.hxx" #include "SMDS_MeshElement.hxx" #include "SMESHDS_SubMesh.hxx" @@ -42,11 +42,11 @@ class SMESH_Mesh; /*! * \brief Container of mesh faces substituting other faces in the input mesh of 3D algorithm */ -class STDMESHERS_EXPORT StdMeshers_ProxyMesh +class SMESH_EXPORT SMESH_ProxyMesh { public: - typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr Ptr; typedef std::map TN2NMap; @@ -64,6 +64,7 @@ public: virtual int NbElements() const; virtual SMDS_ElemIteratorPtr GetElements() const; virtual void Clear(); + virtual bool Contains(const SMDS_MeshElement * ME) const; template< class ITERATOR > void ChangeElements( ITERATOR it, ITERATOR end ) @@ -79,15 +80,15 @@ public: private: std::vector _elements; TN2NMap* _n2n; - friend class StdMeshers_ProxyMesh; + friend class SMESH_ProxyMesh; }; //-------------------------------------------------------------------------------- // Public interface - StdMeshers_ProxyMesh(); - StdMeshers_ProxyMesh(std::vector& components); - StdMeshers_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } - virtual ~StdMeshers_ProxyMesh(); + SMESH_ProxyMesh(); + SMESH_ProxyMesh(std::vector& components); + SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } + virtual ~SMESH_ProxyMesh(); // Returns the submesh of a face; it can be a proxy sub-mesh const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& face) const; @@ -110,16 +111,18 @@ public: bool IsTemporary(const SMDS_MeshElement* elem ) const; + + + const SMESH_Mesh* GetMesh() const { return _mesh; } + + SMESHDS_Mesh* GetMeshDS() const; + //-------------------------------------------------------------------------------- // Interface for descendants protected: void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } - const SMESH_Mesh* getMesh() const { return _mesh; } - - SMESHDS_Mesh* getMeshDS() const; - int shapeIndex(const TopoDS_Shape& shape) const; // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape @@ -132,10 +135,10 @@ public: SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape()); // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found - bool takeProxySubMesh( const TopoDS_Shape& shape, StdMeshers_ProxyMesh* proxyMesh ); + bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh ); // move tmp elements residing the _mesh from other proxy mesh to this - void takeTmpElemsInMesh( StdMeshers_ProxyMesh* proxyMesh ); + void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh ); // removes tmp faces from the _mesh void removeTmpElement( const SMDS_MeshElement* face ); @@ -143,6 +146,11 @@ public: // stores tmp element residing the _mesh void storeTmpElement( const SMDS_MeshElement* face ); + // store node-node correspondence + void setNode2Node(const SMDS_MeshNode* srcNode, + const SMDS_MeshNode* proxyNode, + const SubMesh* subMesh); + // types of elements needed to implement NbFaces() and GetFaces(); // if _allowedTypes is empty, only elements from _subMeshes are returned, // else elements of _mesh filtered using allowedTypes are additionally returned diff --git a/src/StdMeshers/Makefile.am b/src/StdMeshers/Makefile.am index 6e02bb7bc..fe49617ce 100644 --- a/src/StdMeshers/Makefile.am +++ b/src/StdMeshers/Makefile.am @@ -76,8 +76,7 @@ salomeinclude_HEADERS = \ StdMeshers_ImportSource.hxx \ StdMeshers_Import_1D.hxx \ StdMeshers_Import_1D2D.hxx \ - StdMeshers_ViscousLayers.hxx \ - StdMeshers_ProxyMesh.hxx + StdMeshers_ViscousLayers.hxx # Libraries targets @@ -132,8 +131,7 @@ dist_libStdMeshers_la_SOURCES = \ StdMeshers_ImportSource.cxx \ StdMeshers_Import_1D.cxx \ StdMeshers_Import_1D2D.cxx \ - StdMeshers_ViscousLayers.cxx \ - StdMeshers_ProxyMesh.cxx + StdMeshers_ViscousLayers.cxx # additionnal information to compil and link file libStdMeshers_la_CPPFLAGS = \ diff --git a/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx b/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx index 48f656e40..fe16c1fee 100644 --- a/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx +++ b/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx @@ -230,11 +230,11 @@ void StdMeshers_QuadToTriaAdaptor::MergePiramids( const SMDS_MeshElement* Pr const SMDS_MeshElement* elem = inverseElems[i]; vector< const SMDS_MeshNode* > nodes( elem->begin_nodes(), elem->end_nodes() ); nodes[ elem->GetType() == SMDSAbs_Volume ? PYRAM_APEX : TRIA_APEX ] = CommonNode; - getMeshDS()->ChangeElementNodes( elem, &nodes[0], nodes.size()); + GetMeshDS()->ChangeElementNodes( elem, &nodes[0], nodes.size()); } ASSERT( Nrem->NbInverseElements() == 0 ); - getMeshDS()->RemoveFreeNode( Nrem, - getMeshDS()->MeshElements( Nrem->GetPosition()->GetShapeId()), + GetMeshDS()->RemoveFreeNode( Nrem, + GetMeshDS()->MeshElements( Nrem->GetPosition()->GetShapeId()), /*fromGroups=*/false); } @@ -258,7 +258,7 @@ void StdMeshers_QuadToTriaAdaptor::MergeAdjacent(const SMDS_MeshElement* PrmI const SMDS_MeshElement* PrmJ = vIt->next(); if ( PrmJ->NbCornerNodes() != 5 || !adjacentPyrams.insert( PrmJ ).second ) continue; - if ( PrmI != PrmJ && TooCloseAdjacent( PrmI, PrmJ, getMesh()->HasShapeToMesh() )) + if ( PrmI != PrmJ && TooCloseAdjacent( PrmI, PrmJ, GetMesh()->HasShapeToMesh() )) { MergePiramids( PrmI, PrmJ, nodesToMove ); mergedPyrams = true; @@ -294,7 +294,7 @@ StdMeshers_QuadToTriaAdaptor::StdMeshers_QuadToTriaAdaptor(): StdMeshers_QuadToTriaAdaptor::~StdMeshers_QuadToTriaAdaptor() { - // temporary faces are deleted by ~StdMeshers_ProxyMesh() + // temporary faces are deleted by ~SMESH_ProxyMesh() if ( myElemSearcher ) delete myElemSearcher; myElemSearcher=0; } @@ -635,9 +635,9 @@ int StdMeshers_QuadToTriaAdaptor::Preparation(const SMDS_MeshElement* face bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, - StdMeshers_ProxyMesh* aProxyMesh) + SMESH_ProxyMesh* aProxyMesh) { - StdMeshers_ProxyMesh::setMesh( aMesh ); + SMESH_ProxyMesh::setMesh( aMesh ); if ( aShape.ShapeType() != TopAbs_SOLID && aShape.ShapeType() != TopAbs_SHELL ) @@ -790,7 +790,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh, } if ( hasNewTrias ) { - StdMeshers_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh( aShapeFace ); + SMESH_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh( aShapeFace ); prxSubMesh->ChangeElements( trias.begin(), trias.end() ); // delete tmp quadrangles removed from aProxyMesh @@ -812,9 +812,9 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh, bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh) { - StdMeshers_ProxyMesh::setMesh( aMesh ); - StdMeshers_ProxyMesh::_allowedTypes.push_back( SMDSEntity_Triangle ); - StdMeshers_ProxyMesh::_allowedTypes.push_back( SMDSEntity_Quad_Triangle ); + SMESH_ProxyMesh::setMesh( aMesh ); + SMESH_ProxyMesh::_allowedTypes.push_back( SMDSEntity_Triangle ); + SMESH_ProxyMesh::_allowedTypes.push_back( SMDSEntity_Quad_Triangle ); if ( aMesh.NbQuadrangles() < 1 ) return false; @@ -828,7 +828,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh) SMESH_ElementSearcher* searcher = const_cast(myElemSearcher); SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - StdMeshers_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh(); + SMESH_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh(); SMDS_FaceIteratorPtr fIt = meshDS->facesIterator(/*idInceasingOrder=*/true); while( fIt->more()) @@ -1170,7 +1170,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh& if ( !myRemovedTrias.empty() ) { for ( int i = 0; i <= meshDS->MaxShapeIndex(); ++i ) - if ( StdMeshers_ProxyMesh::SubMesh* sm = findProxySubMesh(i)) + if ( SMESH_ProxyMesh::SubMesh* sm = findProxySubMesh(i)) { vector faces; faces.reserve( sm->NbElements() ); diff --git a/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.hxx b/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.hxx index e3c8e51c0..c3b81e9b1 100644 --- a/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.hxx +++ b/src/StdMeshers/StdMeshers_QuadToTriaAdaptor.hxx @@ -26,7 +26,7 @@ #include "SMESH_StdMeshers.hxx" -#include "StdMeshers_ProxyMesh.hxx" +#include "SMESH_ProxyMesh.hxx" class SMESH_Mesh; class SMESH_ElementSearcher; @@ -48,16 +48,16 @@ class gp_Vec; /*! * \brief "Transforms" quadrilateral faces into triangular ones by creation of pyramids */ -class STDMESHERS_EXPORT StdMeshers_QuadToTriaAdaptor : public StdMeshers_ProxyMesh +class STDMESHERS_EXPORT StdMeshers_QuadToTriaAdaptor : public SMESH_ProxyMesh { public: StdMeshers_QuadToTriaAdaptor(); ~StdMeshers_QuadToTriaAdaptor(); - bool Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - StdMeshers_ProxyMesh* aProxyMesh=0); + bool Compute(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + SMESH_ProxyMesh* aProxyMesh=0); bool Compute(SMESH_Mesh& aMesh); diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index 91d86b794..568b9ba23 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -38,7 +38,7 @@ #include "SMESH_MesherHelper.hxx" #include "SMESH_subMesh.hxx" #include "SMESH_subMeshEventListener.hxx" -#include "StdMeshers_ProxyMesh.hxx" +#include "SMESH_ProxyMesh.hxx" #include "utilities.h" @@ -76,22 +76,31 @@ namespace VISCOUS enum UIndex { U_TGT = 1, U_SRC, LEN_TGT }; /*! - * \brief StdMeshers_ProxyMesh computed by _ViscousBuilder for a solid. + * \brief SMESH_ProxyMesh computed by _ViscousBuilder for a solid. * It is stored in a SMESH_subMesh of the SOLID as SMESH_subMeshEventListenerData */ - struct _MeshOfSolid : public StdMeshers_ProxyMesh, + struct _MeshOfSolid : public SMESH_ProxyMesh, public SMESH_subMeshEventListenerData { - _MeshOfSolid( SMESH_Mesh* mesh):SMESH_subMeshEventListenerData( /*isDeletable=*/true) + bool _n2nMapComputed; + + _MeshOfSolid( SMESH_Mesh* mesh) + :SMESH_subMeshEventListenerData( /*isDeletable=*/true),_n2nMapComputed(false) { - StdMeshers_ProxyMesh::setMesh( *mesh ); + SMESH_ProxyMesh::setMesh( *mesh ); } // returns submesh for a geom face - StdMeshers_ProxyMesh::SubMesh* getFaceSubM(const TopoDS_Face& F, bool create=false) + SMESH_ProxyMesh::SubMesh* getFaceSubM(const TopoDS_Face& F, bool create=false) + { + TGeomID i = SMESH_ProxyMesh::shapeIndex(F); + return create ? SMESH_ProxyMesh::getProxySubMesh(i) : findProxySubMesh(i); + } + void setNode2Node(const SMDS_MeshNode* srcNode, + const SMDS_MeshNode* proxyNode, + const SMESH_ProxyMesh::SubMesh* subMesh) { - TGeomID i = StdMeshers_ProxyMesh::shapeIndex(F); - return create ? StdMeshers_ProxyMesh::getProxySubMesh(i) : findProxySubMesh(i); + SMESH_ProxyMesh::setNode2Node( srcNode,proxyNode,subMesh); } }; //-------------------------------------------------------------------------------- @@ -152,7 +161,7 @@ namespace VISCOUS { if ( SMESH_subMesh::COMPUTE_EVENT == eventType ) { - // delete StdMeshers_ProxyMesh containing temporary faces + // delete SMESH_ProxyMesh containing temporary faces subMesh->DeleteEventListener( this ); } } @@ -165,7 +174,11 @@ namespace VISCOUS SMESH_subMesh* sm = mesh->GetSubMesh(solid); _MeshOfSolid* data = (_MeshOfSolid*) sm->GetEventListenerData( Get() ); if ( !data && toCreate ) - ( data = new _MeshOfSolid(mesh)), sm->SetEventListener( Get(), data, sm ); + { + data = new _MeshOfSolid(mesh); + data->mySubMeshes.push_back( sm ); // to find SOLID by _MeshOfSolid + sm->SetEventListener( Get(), data, sm ); + } return data; } // Removes proxy mesh of the solid @@ -381,11 +394,15 @@ namespace VISCOUS public: _ViscousBuilder(); // does it's job - SMESH_ComputeErrorPtr Compute(SMESH_Mesh& mesh, const TopoDS_Shape& theShape); + SMESH_ComputeErrorPtr Compute(SMESH_Mesh& mesh, + const TopoDS_Shape& shape); // restore event listeners used to clear an inferior dim sub-mesh modified by viscous layers void RestoreListeners(); + // computes SMESH_ProxyMesh::SubMesh::_n2n; + bool MakeN2NMap( _MeshOfSolid* pm ); + private: bool findSolidsWithLayers(); @@ -416,7 +433,7 @@ namespace VISCOUS const SMESHDS_SubMesh* faceSubMesh ); bool addBoundaryElements(); - bool error( const string& text, _SolidData* data ); + bool error( const string& text, int solidID=-1 ); SMESHDS_Mesh* getMeshDS() { return _mesh->GetMeshDS(); } // debug @@ -511,24 +528,29 @@ void StdMeshers_ViscousLayers::SetStretchFactor(double factor) if ( _stretchFactor != factor ) _stretchFactor = factor, NotifySubMeshesHypothesisModification(); } // -------------------------------------------------------------------------------- -StdMeshers_ProxyMesh::Ptr StdMeshers_ViscousLayers::Compute(SMESH_Mesh& theMesh, - const TopoDS_Shape& theShape) const +SMESH_ProxyMesh::Ptr +StdMeshers_ViscousLayers::Compute(SMESH_Mesh& theMesh, + const TopoDS_Shape& theShape, + const bool toMakeN2NMap) const { using namespace VISCOUS; _ViscousBuilder bulder; SMESH_ComputeErrorPtr err = bulder.Compute( theMesh, theShape ); if ( err && !err->IsOK() ) - return StdMeshers_ProxyMesh::Ptr(); + return SMESH_ProxyMesh::Ptr(); - vector components; + vector components; TopExp_Explorer exp( theShape, TopAbs_SOLID ); for ( ; exp.More(); exp.Next() ) { if ( _MeshOfSolid* pm = _ViscousListener::GetSolidMesh( &theMesh, exp.Current(), /*toCreate=*/false)) { - components.push_back( StdMeshers_ProxyMesh::Ptr( pm )); - pm->myIsDeletable =false; // it will de deleted by boost::shared_ptr + if ( toMakeN2NMap && !pm->_n2nMapComputed ) + if ( !bulder.MakeN2NMap( pm )) + return SMESH_ProxyMesh::Ptr(); + components.push_back( SMESH_ProxyMesh::Ptr( pm )); + pm->myIsDeletable = false; // it will de deleted by boost::shared_ptr } _ViscousListener::RemoveSolidMesh ( &theMesh, exp.Current() ); } @@ -538,9 +560,9 @@ StdMeshers_ProxyMesh::Ptr StdMeshers_ViscousLayers::Compute(SMESH_Mesh& case 1: return components[0]; - default: return StdMeshers_ProxyMesh::Ptr( new StdMeshers_ProxyMesh( components )); + default: return SMESH_ProxyMesh::Ptr( new SMESH_ProxyMesh( components )); } - return StdMeshers_ProxyMesh::Ptr(); + return SMESH_ProxyMesh::Ptr(); } // -------------------------------------------------------------------------------- std::ostream & StdMeshers_ViscousLayers::SaveTo(std::ostream & save) { @@ -727,17 +749,17 @@ _ViscousBuilder::_ViscousBuilder() */ //================================================================================ -bool _ViscousBuilder::error(const string& text, _SolidData* data ) +bool _ViscousBuilder::error(const string& text, int solidId ) { _error->myName = COMPERR_ALGO_FAILED; _error->myComment = string("Viscous layers builder: ") + text; if ( _mesh ) { - if ( !data && !_sdVec.empty() ) - data = & _sdVec[0]; - if ( data ) + SMESH_subMesh* sm = _mesh->GetSubMeshContaining( solidId ); + if ( !sm && !_sdVec.empty() ) + sm = _mesh->GetSubMeshContaining( _sdVec[0]._index ); + if ( sm && sm->GetSubShape().ShapeType() == TopAbs_SOLID ) { - SMESH_subMesh* sm = _mesh->GetSubMesh( data->_solid ); SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); if ( smError && smError->myAlgo ) _error->myAlgo = smError->myAlgo; @@ -761,6 +783,45 @@ void _ViscousBuilder::RestoreListeners() // TODO } +//================================================================================ +/*! + * \brief computes SMESH_ProxyMesh::SubMesh::_n2n + */ +//================================================================================ + +bool _ViscousBuilder::MakeN2NMap( _MeshOfSolid* pm ) +{ + SMESH_subMesh* solidSM = pm->mySubMeshes.front(); + TopExp_Explorer fExp( solidSM->GetSubShape(), TopAbs_FACE ); + for ( ; fExp.More(); fExp.Next() ) + { + SMESHDS_SubMesh* srcSmDS = pm->GetMeshDS()->MeshElements( fExp.Current() ); + const SMESH_ProxyMesh::SubMesh* prxSmDS = pm->GetProxySubMesh( fExp.Current() ); + + if ( !srcSmDS || !prxSmDS || !srcSmDS->NbElements() || !prxSmDS->NbElements() ) + continue; + if ( srcSmDS->GetElements()->next() == prxSmDS->GetElements()->next()) + continue; + + if ( srcSmDS->NbElements() != prxSmDS->NbElements() ) + return error( "Different nb elements in a source and a proxy sub-mesh", solidSM->GetId()); + + SMDS_ElemIteratorPtr srcIt = srcSmDS->GetElements(); + SMDS_ElemIteratorPtr prxIt = prxSmDS->GetElements(); + while( prxIt->more() ) + { + const SMDS_MeshElement* fSrc = srcIt->next(); + const SMDS_MeshElement* fPrx = prxIt->next(); + if ( fSrc->NbNodes() != fPrx->NbNodes()) + return error( "Different elements in a source and a proxy sub-mesh", solidSM->GetId()); + for ( int i = 0 ; i < fPrx->NbNodes(); ++i ) + pm->setNode2Node( fSrc->GetNode(i), fPrx->GetNode(i), prxSmDS ); + } + } + pm->_n2nMapComputed = true; + return true; +} + //================================================================================ /*! * \brief Does its job @@ -770,7 +831,6 @@ void _ViscousBuilder::RestoreListeners() SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& theShape) { - PyDump debugDump; // TODO: set priority of solids during Gen::Compute() _mesh = & theMesh; @@ -778,11 +838,13 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh& theMesh, // check if proxy mesh already computed TopExp_Explorer exp( theShape, TopAbs_SOLID ); if ( !exp.More() ) - return error("No SOLID's in theShape", 0), _error; + return error("No SOLID's in theShape"), _error; if ( _ViscousListener::GetSolidMesh( _mesh, exp.Current(), /*toCreate=*/false)) return SMESH_ComputeErrorPtr(); // everything already computed + PyDump debugDump; + // TODO: ignore already computed SOLIDs if ( !findSolidsWithLayers()) return _error; @@ -843,7 +905,7 @@ bool _ViscousBuilder::findSolidsWithLayers() allSolids(i), /*toCreate=*/true); _sdVec.push_back( _SolidData( allSolids(i), viscHyp, proxyMesh )); - _sdVec.back()._index = _sdVec.size()-1; // debug + _sdVec.back()._index = getMeshDS()->ShapeToIndex( allSolids(i)); } } if ( _sdVec.empty() ) @@ -1024,7 +1086,7 @@ bool _ViscousBuilder::findFacesWithLayers() break; } default: - return error("Not yet supported case", &_sdVec[i]); + return error("Not yet supported case", _sdVec[i]._index); } } } @@ -1096,10 +1158,10 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) for ( set::iterator id = faceIds.begin(); id != faceIds.end(); ++id ) { SMESHDS_SubMesh* smDS = getMeshDS()->MeshElements( *id ); - if ( !smDS ) return error(SMESH_Comment("Not meshed face ") << *id, &data ); + if ( !smDS ) return error(SMESH_Comment("Not meshed face ") << *id, data._index ); const TopoDS_Face& F = TopoDS::Face( getMeshDS()->IndexToShape( *id )); - StdMeshers_ProxyMesh::SubMesh* proxySub = + SMESH_ProxyMesh::SubMesh* proxySub = data._proxyMesh->getFaceSubM( F, /*create=*/true); SMDS_ElemIteratorPtr eIt = smDS->GetElements(); @@ -1178,7 +1240,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) break; // _LayerEdge is shared by two _SolidData's const SMDS_MeshNode* & n = data._edges[i]->_2neibors->_nodes[j]; if (( n2e = data._n2eMap.find( n )) == data._n2eMap.end() ) - return error("_LayerEdge not found by src node", &data); + return error("_LayerEdge not found by src node", data._index); n = (*n2e).second->_nodes.back(); data._edges[i]->_2neibors->_edges[j] = n2e->second; } @@ -1467,7 +1529,7 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge, edge._normal += geomNorm.XYZ(); } if ( totalNbFaces == 0 ) - return error(SMESH_Comment("Can't get normal to node ") << node->GetID(), &data); + return error(SMESH_Comment("Can't get normal to node ") << node->GetID(), data._index); edge._normal /= totalNbFaces; @@ -1493,13 +1555,13 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge, break; } default: - return error(SMESH_Comment("Invalid shape position of node ")<::min() ) - return error(SMESH_Comment("Bad normal at node ")<< node->GetID(), &data ); + return error(SMESH_Comment("Bad normal at node ")<< node->GetID(), data._index ); edge._normal /= sqrt( normSize ); @@ -1590,7 +1652,7 @@ bool _ViscousBuilder::findNeiborsOnEdge(const _LayerEdge* edge, edgeSM = getMeshDS()->MeshElements( shapeInd ); if ( !edgeSM || edgeSM->NbElements() == 0 ) - return error(SMESH_Comment("Not meshed EDGE ") << shapeInd, &data); + return error(SMESH_Comment("Not meshed EDGE ") << shapeInd, data._index); } int iN = 0; n2 = 0; @@ -1612,7 +1674,7 @@ bool _ViscousBuilder::findNeiborsOnEdge(const _LayerEdge* edge, ( iN++ ? n2 : n1 ) = nNeibor; } if ( !n2 ) - return error(SMESH_Comment("Wrongly meshed EDGE ") << shapeInd, &data); + return error(SMESH_Comment("Wrongly meshed EDGE ") << shapeInd, data._index); return true; } @@ -1909,7 +1971,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) } if (nbSteps == 0 ) - return error("failed at the very first inflation step", &data); + return error("failed at the very first inflation step", data._index); return true; } @@ -2087,7 +2149,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, // neiborEdge = data._edges[i-di]; // } // if ( !neiborEdge ) -// return error("updateNormals(): neighbor _LayerEdge not found", &data); +// return error("updateNormals(): neighbor _LayerEdge not found", data._index); _LayerEdge* neiborEdge = edge->_2neibors->_edges[j]; TmpMeshFaceOnEdge* f = new TmpMeshFaceOnEdge( edge, neiborEdge, --_tmpFaceID ); @@ -2876,6 +2938,8 @@ bool _ViscousBuilder::refine(_SolidData& data) // TODO: make quadratic prisms and polyhedrons(?) + helper.SetElementsOnShape(true); + TopExp_Explorer exp( data._solid, TopAbs_FACE ); for ( ; exp.More(); exp.Next() ) { @@ -2912,7 +2976,7 @@ bool _ViscousBuilder::refine(_SolidData& data) (*nnVec[2])[iZ], (*nnVec[3])[iZ]); break; default: - return error("Not supported type of element", &data); + return error("Not supported type of element", data._index); } } } @@ -2946,7 +3010,7 @@ bool _ViscousBuilder::shrink() // by StdMeshers_QuadToTriaAdaptor if ( SMESHDS_SubMesh* smDS = getMeshDS()->MeshElements( s2s->second )) { - StdMeshers_ProxyMesh::SubMesh* proxySub = + SMESH_ProxyMesh::SubMesh* proxySub = data._proxyMesh->getFaceSubM( TopoDS::Face( s2s->second ), /*create=*/true); SMDS_ElemIteratorPtr fIt = smDS->GetElements(); while ( fIt->more() ) @@ -3132,7 +3196,7 @@ bool _ViscousBuilder::shrink() dumpFunctionEnd(); } if ( badNb > 0 ) - return error(SMESH_Comment("Can't shrink 2D mesh on face ") << f2sd->first, 0 ); + return error(SMESH_Comment("Can't shrink 2D mesh on face ") << f2sd->first ); } // No wrongly shaped faces remain; final smooth. Set node XYZ for ( int st = 3; st; --st ) @@ -3240,7 +3304,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge, TopoDS_Edge E = TopoDS::Edge( edge._sWOL); SMESHDS_SubMesh* edgeSM = getMeshDS()->MeshElements( E ); if ( !edgeSM || edgeSM->NbElements() == 0 ) - return error(SMESH_Comment("Not meshed EDGE ") << getMeshDS()->ShapeToIndex( E ), 0); + return error(SMESH_Comment("Not meshed EDGE ") << getMeshDS()->ShapeToIndex( E )); const SMDS_MeshNode* n2 = 0; SMDS_ElemIteratorPtr eIt = srcNode->GetInverseElementIterator(SMDSAbs_Edge); @@ -3252,7 +3316,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge, if ( n2 == srcNode ) n2 = e->GetNode( 1 ); } if ( !n2 ) - return error(SMESH_Comment("Wrongly meshed EDGE ") << getMeshDS()->ShapeToIndex( E ), 0); + return error(SMESH_Comment("Wrongly meshed EDGE ") << getMeshDS()->ShapeToIndex( E )); double uSrc = helper.GetNodeU( E, srcNode, n2 ); double uTgt = helper.GetNodeU( E, tgtNode, srcNode ); @@ -3768,7 +3832,7 @@ bool _ViscousBuilder::addBoundaryElements() else sm = data._proxyMesh->getFaceSubM( TopoDS::Face(F), /*create=*/true ); if ( !sm ) - return error("error in addBoundaryElements()", &data); + return error("error in addBoundaryElements()", data._index); // Make faces const int dj1 = reverse ? 0 : 1; diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.hxx b/src/StdMeshers/StdMeshers_ViscousLayers.hxx index ebfa2563f..ac0da936a 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.hxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.hxx @@ -27,7 +27,7 @@ #include "SMESH_StdMeshers.hxx" #include "SMESH_Hypothesis.hxx" -#include "StdMeshers_ProxyMesh.hxx" +#include "SMESH_ProxyMesh.hxx" #include @@ -56,9 +56,10 @@ public: double GetStretchFactor() const { return _stretchFactor; } // Computes temporary 2D mesh to be used by 3D algorithm. - // Return StdMeshers_ProxyMesh for each SOLID in theShape - StdMeshers_ProxyMesh::Ptr Compute(SMESH_Mesh& theMesh, - const TopoDS_Shape& theShape) const; + // Return SMESH_ProxyMesh for each SOLID in theShape + SMESH_ProxyMesh::Ptr Compute(SMESH_Mesh& theMesh, + const TopoDS_Shape& theShape, + const bool toMakeN2NMap=false) const; virtual std::ostream & SaveTo(std::ostream & save); virtual std::istream & LoadFrom(std::istream & load); -- 2.39.2