Salome HOME
023544: SMESH's performance issues (note 22293)
[modules/smesh.git] / src / SMDS / SMDS_Mesh.cxx
index 1d7ba140b7005d9644b21af7cd56d99a6eac3bb0..43a48eb37f23095e4f666dd64df2ed7c84a93487 100644 (file)
@@ -2916,9 +2916,10 @@ void SMDS_Mesh::CompactMesh()
     for ( ; holder != myElemHolders.end(); ++holder )
       (*holder)->beforeCompacting();
   }
     for ( ; holder != myElemHolders.end(); ++holder )
       (*holder)->beforeCompacting();
   }
+  int oldCellSize = myCellFactory->GetMaxID();
 
   // remove "holes" in SMDS numeration
 
   // remove "holes" in SMDS numeration
-  std::vector<int> idNodesOldToNew, idCellsNewToOld;
+  std::vector<int> idNodesOldToNew, idCellsNewToOld, idCellsOldToNew;
   myNodeFactory->Compact( idNodesOldToNew );
   myCellFactory->Compact( idCellsNewToOld );
 
   myNodeFactory->Compact( idNodesOldToNew );
   myCellFactory->Compact( idCellsNewToOld );
 
@@ -2927,10 +2928,22 @@ void SMDS_Mesh::CompactMesh()
   int newCellSize = myCellFactory->NbUsedElements();
   myGrid->compactGrid( idNodesOldToNew, newNodeSize, idCellsNewToOld, newCellSize );
 
   int newCellSize = myCellFactory->NbUsedElements();
   myGrid->compactGrid( idNodesOldToNew, newNodeSize, idCellsNewToOld, newCellSize );
 
+  if ( idsChange && !myElemHolders.empty() )
+  {
+    // idCellsNewToOld -> idCellsOldToNew
+    idCellsOldToNew.resize( oldCellSize, oldCellSize );
+    for ( size_t iNew = 0; iNew < idCellsNewToOld.size(); ++iNew )
+    {
+      if ( idCellsNewToOld[ iNew ] >= (int) idCellsOldToNew.size() )
+        idCellsOldToNew.resize( ( 1 + idCellsNewToOld[ iNew ]) * 1.5, oldCellSize );
+      idCellsOldToNew[ idCellsNewToOld[ iNew ]] = iNew;
+    }
+  }
+
   std::set< SMDS_ElementHolder* >::iterator holder = myElemHolders.begin();
   for ( ; holder != myElemHolders.end(); ++holder )
     if ( idsChange )
   std::set< SMDS_ElementHolder* >::iterator holder = myElemHolders.begin();
   for ( ; holder != myElemHolders.end(); ++holder )
     if ( idsChange )
-      (*holder)->restoreElements( idNodesOldToNew, idCellsNewToOld );
+      (*holder)->restoreElements( idNodesOldToNew, idCellsOldToNew );
     else
       (*holder)->compact();
 
     else
       (*holder)->compact();