Salome HOME
PR: debug SMDS memimp
[modules/smesh.git] / src / SMDS / SMDS_Mesh.cxx
index 7239155356e88cacbae78ea30064b799d00b1a92..ed42389f991d1d1b56ac0cc794843789a693ade6 100644 (file)
@@ -37,6 +37,7 @@
 #include "SMDS_QuadraticFaceOfNodes.hxx"
 #include "SMDS_QuadraticVolumeOfNodes.hxx"
 #include "SMDS_SpacePosition.hxx"
+#include "SMDS_UnstructuredGrid.hxx"
 
 #include <vtkUnstructuredGrid.h>
 #include <vtkUnstructuredGridWriter.h>
@@ -122,7 +123,7 @@ SMDS_Mesh::SMDS_Mesh()
          myElementIDFactory(new SMDS_MeshElementIDFactory()),
          myHasConstructionEdges(false), myHasConstructionFaces(false),
          myHasInverseElements(true),
-         myNodeMin(0), myNodeMax(0), myCellLinksSize(0),
+         myNodeMin(0), myNodeMax(0),
          myNodePool(0), myEdgePool(0), myFacePool(0), myVolumePool(0)
 {
   myMeshId = _meshList.size();         // --- index of the mesh to push back in the vector
@@ -145,7 +146,7 @@ SMDS_Mesh::SMDS_Mesh()
   myCells.clear();
   myIDElements.clear();
   myVtkIndex.clear();
-  myGrid = vtkUnstructuredGrid::New();
+  myGrid = SMDS_UnstructuredGrid::New();
   myGrid->Initialize();
   myGrid->Allocate();
   vtkPoints* points = vtkPoints::New();
@@ -795,11 +796,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
     vector<vtkIdType> nodeIds;
     nodeIds.clear();
     nodeIds.push_back(n1->getId());
-    nodeIds.push_back(n3->getId());
     nodeIds.push_back(n2->getId());
+    nodeIds.push_back(n3->getId());
     nodeIds.push_back(n4->getId());
-    nodeIds.push_back(n6->getId());
     nodeIds.push_back(n5->getId());
+    nodeIds.push_back(n6->getId());
 
     SMDS_VtkVolume *volvtk = myVolumePool->getNew();
     volvtk->init(nodeIds, this);
@@ -1978,6 +1979,7 @@ const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const
   if ((IDelem < 0) || IDelem >= myCells.size())
   {
     MESSAGE("----------------------------------- bad IDelem " << IDelem << " " << myCells.size());
+    assert(0);
     return 0;
   }
   return myCells[IDelem];
@@ -2253,47 +2255,52 @@ SMDS_Mesh::~SMDS_Mesh()
 
 void SMDS_Mesh::Clear()
 {
-  if (myParent!=NULL) {
+  if (myParent!=NULL)
+    {
     SMDS_ElemIteratorPtr eIt = elementsIterator();
     while ( eIt->more() )
       myElementIDFactory->ReleaseID(eIt->next()->GetID());
     SMDS_NodeIteratorPtr itn = nodesIterator();
     while (itn->more())
       myNodeIDFactory->ReleaseID(itn->next()->GetID());
-  }
-  else {
+    }
+  else
+    {
     myNodeIDFactory->Clear();
     myElementIDFactory->Clear();
-  }
+    }
 
   SMDS_ElemIteratorPtr itv = elementsIterator();
   while (itv->more())
-    delete itv->next();
+    {
+      SMDS_MeshElement* elem = (SMDS_MeshElement*)(itv->next());
+      SMDSAbs_ElementType aType = elem->GetType();
+      switch (aType)
+      {
+        case SMDSAbs_0DElement:
+          delete elem;
+          break;
+        case SMDSAbs_Edge:
+           myEdgePool->destroy(static_cast<SMDS_VtkEdge*>(elem));
+          break;
+        case SMDSAbs_Face:
+          myFacePool->destroy(static_cast<SMDS_VtkFace*>(elem));
+          break;
+        case SMDSAbs_Volume:
+          myVolumePool->destroy(static_cast<SMDS_VtkVolume*>(elem));
+          break;
+        default:
+          break;
+      }
+    }
   myCells.clear();
 
-//  SMDS_VolumeIteratorPtr itv = volumesIterator();
-//  while (itv->more())
-//    delete itv->next();
-//  myVolumes.Clear();
-//
-//  SMDS_FaceIteratorPtr itf = facesIterator();
-//  while (itf->more())
-//    delete itf->next();
-//  myFaces.Clear();
-//
-//  SMDS_EdgeIteratorPtr ite = edgesIterator();
-//  while (ite->more())
-//    delete ite->next();
-//  myEdges.Clear();
-//
-//  SMDS_0DElementIteratorPtr it0d = elements0dIterator();
-//  while (it0d->more())
-//    delete it0d->next();
-//  my0DElements.Clear();
-
   SMDS_NodeIteratorPtr itn = nodesIterator();
   while (itn->more())
-    delete itn->next();
+    {
+      SMDS_MeshNode *node = (SMDS_MeshNode*)(itn->next());
+      myNodePool->destroy(node);
+    }
   myNodes.clear();
 
   list<SMDS_Mesh*>::iterator itc=myChildren.begin();
@@ -2301,6 +2308,14 @@ void SMDS_Mesh::Clear()
     (*itc)->Clear();
 
   myInfo.Clear();
+
+  myGrid->Initialize();
+  myGrid->Allocate();
+  vtkPoints* points = vtkPoints::New();
+  points->SetNumberOfPoints(SMDS_Mesh::chunkSize);
+  myGrid->SetPoints( points );
+  points->Delete();
+  myGrid->BuildLinks();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -2686,7 +2701,7 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement *        elem,
                               list<const SMDS_MeshElement *>& removedNodes,
                               bool                            removenodes)
 {
-  MESSAGE("SMDS_Mesh::RemoveElement " << elem->GetID() << " " << removenodes);
+  //MESSAGE("SMDS_Mesh::RemoveElement " << elem->GetID() << " " << removenodes);
   // get finite elements built on elem
   set<const SMDS_MeshElement*> * s1;
   if (elem->GetType() == SMDSAbs_0DElement ||
@@ -2744,25 +2759,38 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement *        elem,
     case SMDSAbs_0DElement:
       myCells[(*it)->GetID()] = 0;  // -PR- ici ou dans myElementIDFactory->ReleaseID ?
       myInfo.remove(*it);
+      removedElems.push_back( (*it) );
+      myElementIDFactory->ReleaseID((*it)->GetID());
+      delete (*it);
       break;
     case SMDSAbs_Edge:
       myCells[(*it)->GetID()] = 0;
       myInfo.RemoveEdge(*it);
+      removedElems.push_back( (*it) );
+      myElementIDFactory->ReleaseID((*it)->GetID());
+      if (const SMDS_VtkEdge* vtkElem = dynamic_cast<const SMDS_VtkEdge*>(*it))
+       myEdgePool->destroy((SMDS_VtkEdge*)vtkElem);
+      else delete (*it);
       break;
     case SMDSAbs_Face:
       myCells[(*it)->GetID()] = 0;
       myInfo.RemoveFace(*it);
+      removedElems.push_back( (*it) );
+      myElementIDFactory->ReleaseID((*it)->GetID());
+      if (const SMDS_VtkFace* vtkElem = dynamic_cast<const SMDS_VtkFace*>(*it))
+       myFacePool->destroy((SMDS_VtkFace*)vtkElem);
+      else delete (*it);
       break;
     case SMDSAbs_Volume:
       myCells[(*it)->GetID()] = 0;
       myInfo.RemoveVolume(*it);
+      removedElems.push_back( (*it) );
+      myElementIDFactory->ReleaseID((*it)->GetID());
+      if (const SMDS_VtkVolume* vtkElem = dynamic_cast<const SMDS_VtkVolume*>(*it))
+       myVolumePool->destroy((SMDS_VtkVolume*)vtkElem);
+      else delete (*it);
       break;
     }
-    //MESSAGE( "SMDS: RM elem " << (*it)->GetID() );
-    removedElems.push_back( (*it) );
-    myElementIDFactory->ReleaseID((*it)->GetID());
-    MYASSERT("problem delete elem")
-    delete (*it);
     it++;
   }
 
@@ -2777,8 +2805,9 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement *        elem,
       myInfo.myNbNodes--;
       myNodeIDFactory->ReleaseID((*it)->GetID());
       removedNodes.push_back( (*it) );
-      MYASSERT("problem delete node")
-      delete *it;
+      if (const SMDS_MeshNode* vtkElem = dynamic_cast<const SMDS_MeshNode*>(*it))
+       myNodePool->destroy((SMDS_MeshNode*)vtkElem);
+      else delete (*it);
       it++;
     }
   }
@@ -2794,7 +2823,7 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement *        elem,
 void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
 {
   int elemId = elem->GetID();
-  MESSAGE("SMDS_Mesh::RemoveFreeElement " << elemId);
+  //MESSAGE("SMDS_Mesh::RemoveFreeElement " << elemId);
   SMDSAbs_ElementType aType = elem->GetType();
   SMDS_MeshElement* todest = (SMDS_MeshElement*)(elem);
   if (aType == SMDSAbs_Node) {
@@ -3031,24 +3060,28 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
                                         int ID)
 {
   if ( !n1 || !n2 || !n12 ) return 0;
-  SMDS_QuadraticEdge* edge = new SMDS_QuadraticEdge(n1,n2,n12);
-  if(myElementIDFactory->BindID(ID, edge)) {
-    SMDS_MeshNode *node1,*node2, *node12;
-    //node1 = const_cast<SMDS_MeshNode*>(n1);
-    //node2 = const_cast<SMDS_MeshNode*>(n2);
-    //node12 = const_cast<SMDS_MeshNode*>(n12);
-    //node1->AddInverseElement(edge); // --- fait avec BindID
-    //node2->AddInverseElement(edge);
-    //node12->AddInverseElement(edge);
-    adjustmyCellsCapacity(ID);
-    myCells[ID] = edge;
-    myInfo.myNbQuadEdges++;
-    return edge;
-  }
-  else {
-    delete edge;
-    return NULL;
+
+  // --- retrieve nodes ID
+  vector<vtkIdType> nodeIds;
+  nodeIds.clear();
+  nodeIds.push_back(n1->getId());
+  nodeIds.push_back(n2->getId());
+  nodeIds.push_back(n12->getId());
+
+  SMDS_MeshEdge * edge = 0;
+  SMDS_VtkEdge *edgevtk = myEdgePool->getNew();
+  edgevtk->init(nodeIds, this);
+  edge = edgevtk;
+  adjustmyCellsCapacity(ID);
+  myCells[ID] = edge;
+  myInfo.myNbQuadEdges++;
+
+  if (!registerElement(ID, edge)) {
+         RemoveElement(edge, false);
+         edge = NULL;
   }
+  return edge;
+
 }
 
 
@@ -3101,17 +3134,32 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
     // creation quadratic edges - not implemented
     return 0;
   }
-  SMDS_QuadraticFaceOfNodes* face =
-    new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n12,n23,n31);
+  else
+  {
+    // --- retrieve nodes ID
+    vector<vtkIdType> nodeIds;
+    nodeIds.clear();
+    nodeIds.push_back(n1->getId());
+    nodeIds.push_back(n2->getId());
+    nodeIds.push_back(n3->getId());
+    nodeIds.push_back(n12->getId());
+    nodeIds.push_back(n23->getId());
+    nodeIds.push_back(n31->getId());
+
+    SMDS_MeshFace * face = 0;
+    SMDS_VtkFace *facevtk = myFacePool->getNew();
+    facevtk->init(nodeIds, this);
+    face = facevtk;
     adjustmyCellsCapacity(ID);
-  myCells[ID] = face;
-  myInfo.myNbQuadTriangles++;
+    myCells[ID] = face;
+    myInfo.myNbQuadTriangles++;
 
-  if (!registerElement(ID, face)) {
-    RemoveElement(face, false);
-    face = NULL;
+    if (!registerElement(ID, face)) {
+      RemoveElement(face, false);
+      face = NULL;
+    }
+    return face;
   }
-  return face;
 }
 
 
@@ -3168,18 +3216,36 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
   if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n34 || !n41) return 0;
   if(hasConstructionEdges()) {
     // creation quadratic edges - not implemented
+       return 0;
   }
-  SMDS_QuadraticFaceOfNodes* face =
-    new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n4,n12,n23,n34,n41);
+  else
+  {
+    // --- retrieve nodes ID
+    vector<vtkIdType> nodeIds;
+    nodeIds.clear();
+    nodeIds.push_back(n1->getId());
+    nodeIds.push_back(n2->getId());
+    nodeIds.push_back(n3->getId());
+    nodeIds.push_back(n4->getId());
+    nodeIds.push_back(n12->getId());
+    nodeIds.push_back(n23->getId());
+    nodeIds.push_back(n34->getId());
+    nodeIds.push_back(n41->getId());
+
+    SMDS_MeshFace * face = 0;
+    SMDS_VtkFace *facevtk = myFacePool->getNew();
+    facevtk->init(nodeIds, this);
+    face = facevtk;
     adjustmyCellsCapacity(ID);
-  myCells[ID] = face;
-  myInfo.myNbQuadQuadrangles++;
+    myCells[ID] = face;
+    myInfo.myNbQuadQuadrangles++;
 
-  if (!registerElement(ID, face)) {
-    RemoveElement(face, false);
-    face = NULL;
+    if (!registerElement(ID, face)) {
+      RemoveElement(face, false);
+      face = NULL;
+    }
+    return face;
   }
-  return face;
 }
 
 
@@ -3249,17 +3315,33 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
     // creation quadratic faces - not implemented
     return 0;
   }
-  SMDS_QuadraticVolumeOfNodes * volume =
-    new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
-    adjustmyCellsCapacity(ID);
-  myCells[ID] = volume;
+  // --- retrieve nodes ID
+  vector<vtkIdType> nodeIds;
+  nodeIds.clear();
+  nodeIds.push_back(n1->getId());
+  nodeIds.push_back(n3->getId());
+  nodeIds.push_back(n2->getId());
+  nodeIds.push_back(n4->getId());
+
+  nodeIds.push_back(n31->getId());
+  nodeIds.push_back(n23->getId());
+  nodeIds.push_back(n12->getId());
+
+  nodeIds.push_back(n14->getId());
+  nodeIds.push_back(n34->getId());
+  nodeIds.push_back(n24->getId());
+
+  SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+  volvtk->init(nodeIds, this);
+  adjustmyCellsCapacity(ID);
+  myCells[ID] = volvtk;
   myInfo.myNbQuadTetras++;
 
-  if (!registerElement(ID, volume)) {
-    RemoveElement(volume, false);
-    volume = NULL;
+  if (!registerElement(ID, volvtk)) {
+    RemoveElement(volvtk, false);
+    volvtk = NULL;
   }
-  return volume;
+  return volvtk;
 }
 
 
@@ -3340,18 +3422,36 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
     // creation quadratic faces - not implemented
     return 0;
   }
-  SMDS_QuadraticVolumeOfNodes * volume =
-    new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n12,n23,
-                                    n34,n41,n15,n25,n35,n45);
-    adjustmyCellsCapacity(ID);
-  myCells[ID] = volume;
+  // --- retrieve nodes ID
+  vector<vtkIdType> nodeIds;
+  nodeIds.clear();
+  nodeIds.push_back(n1->getId());
+  nodeIds.push_back(n4->getId());
+  nodeIds.push_back(n3->getId());
+  nodeIds.push_back(n2->getId());
+  nodeIds.push_back(n5->getId());
+
+  nodeIds.push_back(n41->getId());
+  nodeIds.push_back(n34->getId());
+  nodeIds.push_back(n23->getId());
+  nodeIds.push_back(n12->getId());
+
+  nodeIds.push_back(n15->getId());
+  nodeIds.push_back(n45->getId());
+  nodeIds.push_back(n35->getId());
+  nodeIds.push_back(n25->getId());
+
+  SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+  volvtk->init(nodeIds, this);
+  adjustmyCellsCapacity(ID);
+  myCells[ID] = volvtk;
   myInfo.myNbQuadPyramids++;
 
-  if (!registerElement(ID, volume)) {
-    RemoveElement(volume, false);
-    volume = NULL;
+  if (!registerElement(ID, volvtk)) {
+    RemoveElement(volvtk, false);
+    volvtk = NULL;
   }
-  return volume;
+  return volvtk;
 }
 
 
@@ -3440,18 +3540,40 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
     // creation quadratic faces - not implemented
     return 0;
   }
-  SMDS_QuadraticVolumeOfNodes * volume =
-    new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n12,n23,n31,
-                                    n45,n56,n64,n14,n25,n36);
-    adjustmyCellsCapacity(ID);
-  myCells[ID] = volume;
+  // --- retrieve nodes ID
+  vector<vtkIdType> nodeIds;
+  nodeIds.clear();
+  nodeIds.push_back(n1->getId());
+  nodeIds.push_back(n2->getId());
+  nodeIds.push_back(n3->getId());
+
+  nodeIds.push_back(n4->getId());
+  nodeIds.push_back(n5->getId());
+  nodeIds.push_back(n6->getId());
+
+  nodeIds.push_back(n12->getId());
+  nodeIds.push_back(n23->getId());
+  nodeIds.push_back(n31->getId());
+
+  nodeIds.push_back(n45->getId());
+  nodeIds.push_back(n56->getId());
+  nodeIds.push_back(n64->getId());
+
+  nodeIds.push_back(n14->getId());
+  nodeIds.push_back(n25->getId());
+  nodeIds.push_back(n36->getId());
+
+  SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+  volvtk->init(nodeIds, this);
+  adjustmyCellsCapacity(ID);
+  myCells[ID] = volvtk;
   myInfo.myNbQuadPrisms++;
 
-  if (!registerElement(ID, volume)) {
-    RemoveElement(volume, false);
-    volume = NULL;
+  if (!registerElement(ID, volvtk)) {
+    RemoveElement(volvtk, false);
+    volvtk = NULL;
   }
-  return volume;
+  return volvtk;
 }
 
 
@@ -3555,18 +3677,45 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
     return 0;
     // creation quadratic faces - not implemented
   }
-  SMDS_QuadraticVolumeOfNodes * volume =
-    new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
-                                    n56,n67,n78,n85,n15,n26,n37,n48);
-    adjustmyCellsCapacity(ID);
-  myCells[ID] = volume;
+  // --- retrieve nodes ID
+  vector<vtkIdType> nodeIds;
+  nodeIds.clear();
+  nodeIds.push_back(n1->getId());
+  nodeIds.push_back(n4->getId());
+  nodeIds.push_back(n3->getId());
+  nodeIds.push_back(n2->getId());
+
+  nodeIds.push_back(n5->getId());
+  nodeIds.push_back(n8->getId());
+  nodeIds.push_back(n7->getId());
+  nodeIds.push_back(n6->getId());
+
+  nodeIds.push_back(n41->getId());
+  nodeIds.push_back(n34->getId());
+  nodeIds.push_back(n23->getId());
+  nodeIds.push_back(n12->getId());
+
+  nodeIds.push_back(n85->getId());
+  nodeIds.push_back(n78->getId());
+  nodeIds.push_back(n67->getId());
+  nodeIds.push_back(n56->getId());
+
+  nodeIds.push_back(n15->getId());
+  nodeIds.push_back(n48->getId());
+  nodeIds.push_back(n37->getId());
+  nodeIds.push_back(n26->getId());
+
+  SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+  volvtk->init(nodeIds, this);
+  adjustmyCellsCapacity(ID);
+  myCells[ID] = volvtk;
   myInfo.myNbQuadHexas++;
 
-  if (!registerElement(ID, volume)) {
-    RemoveElement(volume, false);
-    volume = NULL;
+  if (!registerElement(ID, volvtk)) {
+    RemoveElement(volvtk, false);
+    volvtk = NULL;
   }
-  return volume;
+  return volvtk;
 }
 
 void SMDS_Mesh::updateNodeMinMax()
@@ -3612,14 +3761,14 @@ void SMDS_Mesh::adjustStructure()
 void SMDS_Mesh::dumpGrid(string ficdump)
 {
        MESSAGE("SMDS_Mesh::dumpGrid " << ficdump);
-  vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
-  aWriter->SetFileName(ficdump.c_str());
-  aWriter->SetInput(myGrid);
-  if(myGrid->GetNumberOfCells())
-  {
-    aWriter->Write();
-  }
-  aWriter->Delete();
+//  vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
+//  aWriter->SetFileName(ficdump.c_str());
+//  aWriter->SetInput(myGrid);
+//  if(myGrid->GetNumberOfCells())
+//  {
+//    aWriter->Write();
+//  }
+//  aWriter->Delete();
   ficdump = ficdump + "_connectivity";
   ofstream ficcon(ficdump.c_str(), ios::out);
   int nbPoints = myGrid->GetNumberOfPoints();
@@ -3632,6 +3781,8 @@ void SMDS_Mesh::dumpGrid(string ficdump)
   ficcon << "-------------------------------- cells " <<  nbCells << endl;
   for (int i=0; i<nbCells; i++)
   {
+//     MESSAGE(i << " " << myGrid->GetCell(i));
+//     MESSAGE("  " << myGrid->GetCell(i)->GetCellType());
        ficcon << i << " - " << myGrid->GetCell(i)->GetCellType() << " -";
        int nbptcell = myGrid->GetCell(i)->GetNumberOfPoints();
        vtkIdList *listid = myGrid->GetCell(i)->GetPointIds();