Optimize compactList()

This commit is contained in:
eap 2013-08-08 12:39:06 +00:00
parent b19ad3a4fd
commit c4cd7806bc

View File

@ -67,6 +67,7 @@ SMESHDS_SubMesh::~SMESHDS_SubMesh()
//function : AddElement //function : AddElement
//purpose : //purpose :
//======================================================================= //=======================================================================
void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
{ {
if (!IsComplexSubmesh()) if (!IsComplexSubmesh())
@ -76,7 +77,6 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
AddNode( static_cast< const SMDS_MeshNode* >( ME )); AddNode( static_cast< const SMDS_MeshNode* >( ME ));
return; return;
} }
//MESSAGE("in " << myIndex << " AddElement "<< ME->GetID());
int oldShapeId = ME->getshapeId(); int oldShapeId = ME->getshapeId();
if ( oldShapeId > 0 ) if ( oldShapeId > 0 )
{ {
@ -121,6 +121,7 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
//function : RemoveElement //function : RemoveElement
//purpose : //purpose :
//======================================================================= //=======================================================================
bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDeleted) bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDeleted)
{ {
if (!ME) if (!ME)
@ -128,13 +129,11 @@ bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDele
MESSAGE("-----------------> Remove Null Element " << isElemDeleted); MESSAGE("-----------------> Remove Null Element " << isElemDeleted);
return false; return false;
} }
//MESSAGE("-----------------> RemoveElement "<< ME->GetID() << " " << isElemDeleted);
if (!IsComplexSubmesh()) if (!IsComplexSubmesh())
{ {
if ( ME->getshapeId() != myIndex ) if ( ME->getshapeId() != myIndex )
return false; return false;
int idInSubShape = ME->getIdInShape(); int idInSubShape = ME->getIdInShape();
//MESSAGE("in "<< myIndex << " RemoveElement " << ME->GetID() << " " << idInSubShape << " " << myUnusedIdElements);
SMDS_MeshElement* elem = (SMDS_MeshElement*) (ME); SMDS_MeshElement* elem = (SMDS_MeshElement*) (ME);
elem->setShapeId(0); elem->setShapeId(0);
elem->setIdInShape(-1); elem->setIdInShape(-1);
@ -145,7 +144,6 @@ bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME, bool isElemDele
return true; return true;
} }
return false; return false;
// }
} }
MESSAGE("Try to remove an element from a complex submesh "); MESSAGE("Try to remove an element from a complex submesh ");
return false; return false;
@ -188,13 +186,9 @@ bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted)
{ {
if (!IsComplexSubmesh()) if (!IsComplexSubmesh())
{ {
// if (!isNodeDeleted) // alive node has valid ID and can be found
// {
if ( N->getshapeId() != myIndex ) if ( N->getshapeId() != myIndex )
return false; return false;
int idInSubShape = N->getIdInShape(); int idInSubShape = N->getIdInShape();
//int shapeId = N->getshapeId();
//MESSAGE("in "<< myIndex << " RemoveNode " << shapeId << " " << idInSubShape << " " << N->GetID());
SMDS_MeshNode* node = (SMDS_MeshNode*) (N); SMDS_MeshNode* node = (SMDS_MeshNode*) (N);
node->setShapeId(0); node->setShapeId(0);
node->setIdInShape(-1); node->setIdInShape(-1);
@ -205,7 +199,6 @@ bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted)
return true; return true;
} }
return false; return false;
// }
} }
MESSAGE("Try to remove a node from a complex submesh"); MESSAGE("Try to remove a node from a complex submesh");
return false; return false;
@ -215,9 +208,9 @@ bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N, bool isNodeDeleted)
//function : NbElements //function : NbElements
//purpose : //purpose :
//======================================================================= //=======================================================================
int SMESHDS_SubMesh::NbElements() const int SMESHDS_SubMesh::NbElements() const
{ {
//MESSAGE(this << " NbElements " << IsComplexSubmesh() << " " << myElements.size() - myUnusedIdElements);
if ( !IsComplexSubmesh() ) if ( !IsComplexSubmesh() )
return myElements.size() - myUnusedIdElements; return myElements.size() - myUnusedIdElements;
@ -236,7 +229,6 @@ int SMESHDS_SubMesh::NbElements() const
int SMESHDS_SubMesh::NbNodes() const int SMESHDS_SubMesh::NbNodes() const
{ {
//MESSAGE(this << " NbNodes " << IsComplexSubmesh() << " " << myNodes.size() - myUnusedIdNodes);
if ( !IsComplexSubmesh() ) if ( !IsComplexSubmesh() )
return myNodes.size() - myUnusedIdNodes; return myNodes.size() - myUnusedIdNodes;
@ -476,64 +468,52 @@ void SMESHDS_SubMesh::Clear()
clearVector( myNodes ); clearVector( myNodes );
myUnusedIdNodes = 0; myUnusedIdNodes = 0;
myUnusedIdElements = 0; myUnusedIdElements = 0;
if ( NbSubMeshes() > 0 )
{
SMESHDS_SubMeshIteratorPtr sub = GetSubMeshIterator(); SMESHDS_SubMeshIteratorPtr sub = GetSubMeshIterator();
while ( sub->more() ) { while ( sub->more() ) {
if ( SMESHDS_SubMesh* sm = (SMESHDS_SubMesh*) sub->next()) if ( SMESHDS_SubMesh* sm = (SMESHDS_SubMesh*) sub->next())
sm->Clear(); sm->Clear();
} }
}
} }
int SMESHDS_SubMesh::getSize() int SMESHDS_SubMesh::getSize()
{ {
int c = NbNodes(); int c = NbNodes();
int d = NbElements(); int d = NbElements();
//cerr << "SMESHDS_SubMesh::NbNodes " << c << endl;
//cerr << "SMESHDS_SubMesh::NbElements " << d << endl;
return c+d; return c+d;
} }
void SMESHDS_SubMesh::compactList() void SMESHDS_SubMesh::compactList()
{ {
//MESSAGE("compactList old: nodes " << myNodes.size() << " elements " << myElements.size()); if ( myUnusedIdElements > 0 )
//stringstream a; {
//stringstream b;
//stringstream c;
//stringstream d;
std::vector<const SMDS_MeshElement*> newElems; std::vector<const SMDS_MeshElement*> newElems;
newElems.clear(); newElems.reserve( myElements.size() - myUnusedIdElements );
for (int i = 0; i < myElements.size(); i++) for (size_t i = 0; i < myElements.size(); i++)
if (myElements[i]) if (myElements[i])
{ {
SMDS_MeshElement* elem = (SMDS_MeshElement*)myElements[i]; SMDS_MeshElement* elem = (SMDS_MeshElement*)myElements[i];
elem->setIdInShape(newElems.size()); elem->setIdInShape(newElems.size());
newElems.push_back(elem); newElems.push_back(elem);
//a << elem->GetID() << " ";
//b << elem->GetID() << " ";
} }
//else
// a << "_ ";
myElements.swap(newElems); myElements.swap(newElems);
myUnusedIdElements = 0; myUnusedIdElements = 0;
//MESSAGE("in " << myIndex << " oldElems " << a.str()); }
//MESSAGE("in " << myIndex << " newElems " << b.str());
if ( myUnusedIdNodes > 0 )
{
std::vector<const SMDS_MeshNode*> newNodes; std::vector<const SMDS_MeshNode*> newNodes;
newNodes.clear(); newNodes.reserve( myNodes.size() - myUnusedIdNodes );
for (int i = 0; i < myNodes.size(); i++) for (size_t i = 0; i < myNodes.size(); i++)
if (myNodes[i]) if (myNodes[i])
{ {
SMDS_MeshNode* node = (SMDS_MeshNode*)myNodes[i]; SMDS_MeshNode* node = (SMDS_MeshNode*)myNodes[i];
node->setIdInShape(newNodes.size()); node->setIdInShape(newNodes.size());
newNodes.push_back(node); newNodes.push_back(node);
//c << node->GetID() << " ";
//d << node->GetID() << " ";
} }
//else
// c << "_ ";
myNodes.swap(newNodes); myNodes.swap(newNodes);
myUnusedIdNodes = 0; myUnusedIdNodes = 0;
//MESSAGE("in " << myIndex << " oldNodes " << c.str()); }
//MESSAGE("in " << myIndex << " newNodes " << d.str());
//MESSAGE("compactList new: nodes " << myNodes.size() << " elements " << myElements.size());
} }