From 19fe2e412fa1cb1fd33d7a2580b2483280db811e Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 10 Apr 2018 19:14:21 +0300 Subject: [PATCH 1/1] 23544: SMESH's performance issues --- src/SMDS/SMDS_MeshCell.cxx | 29 +++++++++++++++-------------- src/SMDS/SMDS_MeshGroup.cxx | 19 +++++++++---------- src/SMDS/SMDS_MeshGroup.hxx | 10 ++++------ src/SMDS/SMDS_SpacePosition.hxx | 2 +- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/SMDS/SMDS_MeshCell.cxx b/src/SMDS/SMDS_MeshCell.cxx index ae6d99fad..7ee9c9208 100644 --- a/src/SMDS/SMDS_MeshCell.cxx +++ b/src/SMDS/SMDS_MeshCell.cxx @@ -41,6 +41,7 @@ namespace SMDSAbs_ElementType myType; SMDSAbs_GeometryType myGeom; bool myIsPoly; + bool myIsQuadratic; int myNbCornerNodes; int myNbNodes; int myNbEdges; @@ -65,12 +66,12 @@ namespace myType = Type; myGeom = Geom; myIsPoly = IsPoly; + myIsQuadratic = ( NbNodes > NbCornerNodes ); myNbCornerNodes = NbCornerNodes; myNbNodes = NbNodes; myNbEdges = NbEdges; myNbFaces = NbFaces; } - bool IsQuadratic() const { return myNbNodes > myNbCornerNodes; } }; //! return vector a CellProps @@ -259,7 +260,7 @@ bool SMDS_MeshCell::ChangeNodes(const SMDS_MeshNode* nodes[], const int theNbNod /////////////////////////////////////////////////////////////////////////////// int SMDS_MeshCell::NbNodes() const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::NbNodes(); vtkIdType *pts, npts; getGrid()->GetCellPoints( GetVtkID(), npts, pts ); @@ -268,7 +269,7 @@ int SMDS_MeshCell::NbNodes() const int SMDS_MeshCell::NbFaces() const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::NbFaces(); return getCellProps( GetVtkType() ).myNbFaces; } @@ -290,13 +291,13 @@ int SMDS_MeshCell::NbEdges() const int SMDS_MeshCell::NbCornerNodes() const { - switch ( GetEntityType() ) + switch ( GetVtkType() ) { - case SMDSEntity_Polyhedra: + case VTK_POLYHEDRON: return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::NbCornerNodes(); - case SMDSEntity_Polygon: + case VTK_POLYGON: return NbNodes(); - case SMDSEntity_Quad_Polygon: + case VTK_QUADRATIC_POLYGON: return NbNodes() / 2; default:; } @@ -308,7 +309,7 @@ int SMDS_MeshCell::NbCornerNodes() const /////////////////////////////////////////////////////////////////////////////// SMDS_ElemIteratorPtr SMDS_MeshCell::nodesIterator() const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::nodesIterator(); return boost::make_shared< SMDS_VtkCellIterator<> >( GetMesh(), GetVtkID(), GetEntityType()); @@ -319,7 +320,7 @@ SMDS_ElemIteratorPtr SMDS_MeshCell::nodesIterator() const /////////////////////////////////////////////////////////////////////////////// SMDS_NodeIteratorPtr SMDS_MeshCell::nodeIterator() const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::nodeIterator(); return SMDS_NodeIteratorPtr @@ -340,7 +341,7 @@ SMDS_NodeIteratorPtr SMDS_MeshCell::nodesIteratorToUNV() const SMDSAbs_ElementType SMDS_MeshCell::GetType() const { - return ElemType( GetEntityType() ); + return getCellProps( GetVtkType() ).myType; } SMDSAbs_EntityType SMDS_MeshCell::GetEntityType() const @@ -365,12 +366,12 @@ bool SMDS_MeshCell::IsPoly() const bool SMDS_MeshCell::IsQuadratic() const { - return getCellProps( GetVtkType() ).IsQuadratic(); + return getCellProps( GetVtkType() ).myIsQuadratic; } const SMDS_MeshNode* SMDS_MeshCell::GetNode(const int ind) const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::GetNode( ind ); vtkIdType npts, *pts; @@ -381,7 +382,7 @@ const SMDS_MeshNode* SMDS_MeshCell::GetNode(const int ind) const int SMDS_MeshCell::GetNodeIndex( const SMDS_MeshNode* node ) const { - if ( GetEntityType() == SMDSEntity_Polyhedra ) + if ( GetVtkType() == VTK_POLYHEDRON ) return static_cast< const SMDS_MeshVolume* >( this )->SMDS_MeshVolume::GetNodeIndex( node ); vtkIdType npts, *pts; @@ -767,7 +768,7 @@ bool SMDS_MeshCell::IsPoly( SMDSAbs_EntityType entityType ) bool SMDS_MeshCell::IsQuadratic( SMDSAbs_EntityType entityType ) { - return getCellProps( entityType ).IsQuadratic(); + return getCellProps( entityType ).myIsQuadratic; } int SMDS_MeshCell::NbCornerNodes( SMDSAbs_EntityType entityType ) diff --git a/src/SMDS/SMDS_MeshGroup.cxx b/src/SMDS/SMDS_MeshGroup.cxx index 80e7c6080..e2f5fbccf 100644 --- a/src/SMDS/SMDS_MeshGroup.cxx +++ b/src/SMDS/SMDS_MeshGroup.cxx @@ -45,7 +45,7 @@ SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * theMesh, const SMDSAbs_ElementType theType) - : SMDS_ElementHolder( theMesh ), myType(theType), myTic(0) + : SMDS_ElementHolder( theMesh ), myType( theType ), myTic( 0 ) { } @@ -69,15 +69,15 @@ void SMDS_MeshGroup::Clear() bool SMDS_MeshGroup::Add(const SMDS_MeshElement * theElem) { // the type of the group is determined by the first element added - if (myElements.empty()) { + if ( myElements.empty() ) { myType = theElem->GetType(); } - else if (theElem->GetType() != myType) { + else if ( theElem->GetType() != myType ) { MESSAGE("SMDS_MeshGroup::Add : Type Mismatch "<GetType()<<"!="< -#include - class SMDS_EXPORT SMDS_MeshGroup: public SMDS_MeshObject, SMDS_ElementHolder { public: @@ -43,7 +41,7 @@ class SMDS_EXPORT SMDS_MeshGroup: public SMDS_MeshObject, SMDS_ElementHolder void SetType (const SMDSAbs_ElementType theType); void Clear(); - void Reserve(size_t nbElems) { myElements.reserve( nbElems ); } + void Reserve(size_t nbElems) {} bool Add(const SMDS_MeshElement * theElem); bool Remove(const SMDS_MeshElement * theElem); bool IsEmpty() const { return myElements.empty(); } @@ -62,12 +60,12 @@ class SMDS_EXPORT SMDS_MeshGroup: public SMDS_MeshObject, SMDS_ElementHolder virtual SMDS_ElemIteratorPtr getElements() { return GetElements(); } virtual void tmpClear(); virtual void add( const SMDS_MeshElement* element ) { Add( element ); } - virtual void compact() { myElements.shrink_to_fit(); } + virtual void compact() {} private: - typedef boost::container::flat_set< const SMDS_MeshElement* > TElementSet; - typedef TElementSet::const_iterator TIterator; + typedef std::set< const SMDS_MeshElement* > TElementSet; + typedef TElementSet::const_iterator TIterator; const SMDS_Mesh * myMesh; SMDSAbs_ElementType myType; diff --git a/src/SMDS/SMDS_SpacePosition.hxx b/src/SMDS/SMDS_SpacePosition.hxx index 1bbac7b1f..71afda939 100644 --- a/src/SMDS/SMDS_SpacePosition.hxx +++ b/src/SMDS/SMDS_SpacePosition.hxx @@ -36,7 +36,7 @@ class SMDS_EXPORT SMDS_SpacePosition : public SMDS_Position public: virtual SMDS_TypeOfPosition GetTypeOfPosition() const { return SMDS_TOP_3DSPACE; } - static SMDS_PositionPtr originSpacePosition(); + static SMDS_PositionPtr originSpacePosition(); virtual const double* GetParameters() const { return 0; } private: -- 2.30.2