Salome HOME
[bos #40653][CEA] New mesh import export formats with meshio.
[modules/smesh.git] / src / SMDS / SMDS_Mesh.hxx
index d233a00a3390aed783a5260bd003386f9bd61720..e643ee20f47a5de283691fcab169565b8df633e2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -20,7 +20,7 @@
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-//  SMESH SMDS : implementaion of Salome mesh data structure
+//  SMESH SMDS : implementation of Salome mesh data structure
 //  File   : SMDS_Mesh.hxx
 //  Module : SMESH
 //
 
 #include "SMESH_SMDS.hxx"
 
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_MeshCell.hxx"
+#include "SMDS_BallElement.hxx"
+#include "SMDS_ElemIterator.hxx"
 #include "SMDS_Mesh0DElement.hxx"
+#include "SMDS_MeshCell.hxx"
 #include "SMDS_MeshEdge.hxx"
 #include "SMDS_MeshFace.hxx"
-#include "SMDS_MeshVolume.hxx"
-#include "SMDS_MeshNodeIDFactory.hxx"
-#include "SMDS_MeshElementIDFactory.hxx"
 #include "SMDS_MeshInfo.hxx"
-#include "SMDS_ElemIterator.hxx"
-#include "SMDS_VolumeOfNodes.hxx"
-#include "SMDS_VtkEdge.hxx"
-#include "SMDS_VtkFace.hxx"
-#include "SMDS_VtkVolume.hxx"
-#include "ObjectPool.hxx"
+#include "SMDS_MeshNode.hxx"
+#include "SMDS_MeshVolume.hxx"
 #include "SMDS_UnstructuredGrid.hxx"
-#include "SMDS_BallElement.hxx"
 
-#include <boost/shared_ptr.hpp>
 #include <set>
 #include <list>
 #include <vector>
-#include <vtkSystemIncludes.h>
-#include <cassert>
-
-#include "Utils_SALOME_Exception.hxx"
+#include <smIdType.hxx>
 
-#define MYASSERT(val) if (!(val)) throw SALOME_Exception(LOCALIZED("assertion not verified"));
+class SMDS_ElementHolder;
+class SMDS_ElementFactory;
+class SMDS_NodeFactory;
 
 class SMDS_EXPORT SMDS_Mesh : public SMDS_MeshObject
 {
 public:
-  friend class SMDS_MeshIDFactory;
-  friend class SMDS_MeshNodeIDFactory;
-  friend class SMDS_MeshElementIDFactory;
-  friend class SMDS_MeshVolumeVtkNodes;
-  friend class SMDS_MeshNode;
 
   SMDS_Mesh();
   
-  //! to retreive this SMDS_Mesh instance from its elements (index stored in SMDS_Elements)
-  static std::vector<SMDS_Mesh*> _meshList;
-
   //! actual nodes coordinates, cells definition and reverse connectivity are stored in a vtkUnstructuredGrid
-  inline SMDS_UnstructuredGrid* getGrid() {return myGrid; }
-  inline int getMeshId() {return myMeshId; }
+  inline SMDS_UnstructuredGrid* GetGrid() { return myGrid; }
 
-  virtual SMDS_NodeIteratorPtr   nodesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_EdgeIteratorPtr   edgesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_FaceIteratorPtr   facesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_VolumeIteratorPtr volumesIterator   (bool idInceasingOrder=false) const;
+  virtual SMDS_NodeIteratorPtr   nodesIterator  () const;
+  virtual SMDS_EdgeIteratorPtr   edgesIterator  () const;
+  virtual SMDS_FaceIteratorPtr   facesIterator  () const;
+  virtual SMDS_VolumeIteratorPtr volumesIterator() const;
 
   virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
   virtual SMDS_ElemIteratorPtr elementGeomIterator(SMDSAbs_GeometryType type) const;
   virtual SMDS_ElemIteratorPtr elementEntityIterator(SMDSAbs_EntityType type) const;
 
-  SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
+  virtual SMDS_NodeIteratorPtr shapeNodesIterator   (int                  shapeID,
+                                                     size_t               nbElemsToReturn=-1,
+                                                     const SMDS_MeshNode* sm1stNode=0) const;
+  virtual SMDS_ElemIteratorPtr shapeElementsIterator(int                     shapeID,
+                                                     size_t                  nbElemsToReturn=-1,
+                                                     const SMDS_MeshElement* sm1stElem=0) const;
+
+  SMDSAbs_ElementType GetElementType( const smIdType id, const bool iselem ) const;
 
   SMDS_Mesh *AddSubMesh();
 
-  virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
+  virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, smIdType ID);
   virtual SMDS_MeshNode* AddNode      (double x, double y, double z);
 
-  virtual SMDS_Mesh0DElement* Add0DElementWithID(int n,                   int ID);
-  virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, int ID);
+  virtual SMDS_Mesh0DElement* Add0DElementWithID(smIdType n,                   smIdType ID);
+  virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, smIdType ID);
   virtual SMDS_Mesh0DElement* Add0DElement      (const SMDS_MeshNode * n);
 
-  virtual SMDS_BallElement* AddBallWithID(int n,                   double diameter, int ID);
-  virtual SMDS_BallElement* AddBallWithID(const SMDS_MeshNode * n, double diameter, int ID);
+  virtual SMDS_BallElement* AddBallWithID(smIdType n,                   double diameter, smIdType ID);
+  virtual SMDS_BallElement* AddBallWithID(const SMDS_MeshNode * n, double diameter, smIdType ID);
   virtual SMDS_BallElement* AddBall      (const SMDS_MeshNode * n, double diameter);
 
-  virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
+  virtual SMDS_MeshEdge* AddEdgeWithID(smIdType n1, smIdType n2, smIdType ID);
   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2);
 
   // 2d order edge with 3 nodes: n12 - node between n1 and n2
-  virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID);
+  virtual SMDS_MeshEdge* AddEdgeWithID(smIdType n1, smIdType n2, smIdType n12, smIdType ID);
   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n12,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n12);
 
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3);
 
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
                                        const SMDS_MeshNode * n4,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3,
                                  const SMDS_MeshNode * n4);
 
-  virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
-                                       const SMDS_MeshEdge * e2,
-                                       const SMDS_MeshEdge * e3, int ID);
-  virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
-                                 const SMDS_MeshEdge * e2,
-                                 const SMDS_MeshEdge * e3);
-
-  virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
-                                       const SMDS_MeshEdge * e2,
-                                       const SMDS_MeshEdge * e3,
-                                       const SMDS_MeshEdge * e4, int ID);
-  virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
-                                 const SMDS_MeshEdge * e2,
-                                 const SMDS_MeshEdge * e3,
-                                 const SMDS_MeshEdge * e4);
 
   // 2d order triangle of 6 nodes
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3,
-                                       int n12,int n23,int n31, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
+                                       smIdType n12,smIdType n23,smIdType n31, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
                                        const SMDS_MeshNode * n12,
                                        const SMDS_MeshNode * n23,
                                        const SMDS_MeshNode * n31,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3,
@@ -171,8 +145,8 @@ public:
                                  const SMDS_MeshNode * n31);
 
   // 2d order triangle of 7 nodes
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3,
-                                       int n12,int n23,int n31, int nCenter, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
+                                       smIdType n12,smIdType n23,smIdType n31, smIdType nCenter, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
@@ -180,7 +154,7 @@ public:
                                        const SMDS_MeshNode * n23,
                                        const SMDS_MeshNode * n31,
                                        const SMDS_MeshNode * nCenter,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3,
@@ -190,8 +164,8 @@ public:
                                  const SMDS_MeshNode * nCenter);
 
   // 2d order quadrangle
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
-                                       int n12,int n23,int n34,int n41, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                       smIdType n12,smIdType n23,smIdType n34,smIdType n41, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
@@ -200,7 +174,7 @@ public:
                                        const SMDS_MeshNode * n23,
                                        const SMDS_MeshNode * n34,
                                        const SMDS_MeshNode * n41,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3,
@@ -210,8 +184,8 @@ public:
                                  const SMDS_MeshNode * n34,
                                  const SMDS_MeshNode * n41);
 
-  virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
-                                       int n12,int n23,int n34,int n41, int nCenter, int ID);
+  virtual SMDS_MeshFace* AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                       smIdType n12,smIdType n23,smIdType n34,smIdType n41, smIdType nCenter, smIdType ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2,
                                        const SMDS_MeshNode * n3,
@@ -221,7 +195,7 @@ public:
                                        const SMDS_MeshNode * n34,
                                        const SMDS_MeshNode * n41,
                                        const SMDS_MeshNode * nCenter,
-                                       int ID);
+                                       smIdType ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
                                  const SMDS_MeshNode * n3,
@@ -232,40 +206,40 @@ public:
                                  const SMDS_MeshNode * n41,
                                  const SMDS_MeshNode * nCenter);
 
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
                                            const SMDS_MeshNode * n4,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
                                      const SMDS_MeshNode * n4);
 
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n5, int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n5, smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
                                            const SMDS_MeshNode * n4,
                                            const SMDS_MeshNode * n5,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
                                      const SMDS_MeshNode * n4,
                                      const SMDS_MeshNode * n5);
 
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n5, int n6, int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n5, smIdType n6, smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
                                            const SMDS_MeshNode * n4,
                                            const SMDS_MeshNode * n5,
                                            const SMDS_MeshNode * n6,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -273,8 +247,8 @@ public:
                                      const SMDS_MeshNode * n5,
                                      const SMDS_MeshNode * n6);
 
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n5, int n6, int n7, int n8, int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n5, smIdType n6, smIdType n7, smIdType n8, smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -283,7 +257,7 @@ public:
                                            const SMDS_MeshNode * n6,
                                            const SMDS_MeshNode * n7,
                                            const SMDS_MeshNode * n8,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -293,43 +267,11 @@ public:
                                      const SMDS_MeshNode * n7,
                                      const SMDS_MeshNode * n8);
 
-  virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
-                                           const SMDS_MeshFace * f2,
-                                           const SMDS_MeshFace * f3,
-                                           const SMDS_MeshFace * f4, int ID);
-  virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
-                                     const SMDS_MeshFace * f2,
-                                     const SMDS_MeshFace * f3,
-                                     const SMDS_MeshFace * f4);
-
-  virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
-                                           const SMDS_MeshFace * f2,
-                                           const SMDS_MeshFace * f3,
-                                           const SMDS_MeshFace * f4,
-                                           const SMDS_MeshFace * f5, int ID);
-  virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
-                                     const SMDS_MeshFace * f2,
-                                     const SMDS_MeshFace * f3,
-                                     const SMDS_MeshFace * f4,
-                                     const SMDS_MeshFace * f5);
-
-  virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
-                                           const SMDS_MeshFace * f2,
-                                           const SMDS_MeshFace * f3,
-                                           const SMDS_MeshFace * f4,
-                                           const SMDS_MeshFace * f5,
-                                           const SMDS_MeshFace * f6, int ID);
-  virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
-                                     const SMDS_MeshFace * f2,
-                                     const SMDS_MeshFace * f3,
-                                     const SMDS_MeshFace * f4,
-                                     const SMDS_MeshFace * f5,
-                                     const SMDS_MeshFace * f6);
 
   // hexagonal prism
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6,
-                                           int n7, int n8, int n9, int n10, int n11, int n12,
-                                           int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType n6,
+                                           smIdType n7, smIdType n8, smIdType n9, smIdType n10, smIdType n11, smIdType n12,
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -342,7 +284,7 @@ public:
                                            const SMDS_MeshNode * n10,
                                            const SMDS_MeshNode * n11,
                                            const SMDS_MeshNode * n12,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -357,9 +299,9 @@ public:
                                      const SMDS_MeshNode * n12);
 
   // 2d order tetrahedron of 10 nodes
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n12,int n23,int n31,
-                                           int n14,int n24,int n34, int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n12,smIdType n23,smIdType n31,
+                                           smIdType n14,smIdType n24,smIdType n34, smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -370,7 +312,7 @@ public:
                                            const SMDS_MeshNode * n14,
                                            const SMDS_MeshNode * n24,
                                            const SMDS_MeshNode * n34,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -383,10 +325,10 @@ public:
                                      const SMDS_MeshNode * n34);
 
   // 2d order pyramid of 13 nodes
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
-                                           int n12,int n23,int n34,int n41,
-                                           int n15,int n25,int n35,int n45,
-                                           int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5,
+                                           smIdType n12,smIdType n23,smIdType n34,smIdType n41,
+                                           smIdType n15,smIdType n25,smIdType n35,smIdType n45,
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -400,7 +342,7 @@ public:
                                            const SMDS_MeshNode * n25,
                                            const SMDS_MeshNode * n35,
                                            const SMDS_MeshNode * n45,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -416,12 +358,12 @@ public:
                                      const SMDS_MeshNode * n45);
 
   // 2d order Pentahedron with 15 nodes
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3,
-                                           int n4, int n5, int n6,
-                                           int n12,int n23,int n31,
-                                           int n45,int n56,int n64,
-                                           int n14,int n25,int n36,
-                                           int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
+                                           smIdType n4, smIdType n5, smIdType n6,
+                                           smIdType n12,smIdType n23,smIdType n31,
+                                           smIdType n45,smIdType n56,smIdType n64,
+                                           smIdType n14,smIdType n25,smIdType n36,
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -437,7 +379,7 @@ public:
                                            const SMDS_MeshNode * n14,
                                            const SMDS_MeshNode * n25,
                                            const SMDS_MeshNode * n36,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -454,13 +396,60 @@ public:
                                      const SMDS_MeshNode * n25,
                                      const SMDS_MeshNode * n36);
 
+  // 2d order Pentahedron with 18 nodes
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
+                                           smIdType n4, smIdType n5, smIdType n6,
+                                           smIdType n12,smIdType n23,smIdType n31,
+                                           smIdType n45,smIdType n56,smIdType n64,
+                                           smIdType n14,smIdType n25,smIdType n36,
+                                           smIdType n1245, smIdType n2356, smIdType n1346,
+                                           smIdType ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
+                                           const SMDS_MeshNode * n2,
+                                           const SMDS_MeshNode * n3,
+                                           const SMDS_MeshNode * n4,
+                                           const SMDS_MeshNode * n5,
+                                           const SMDS_MeshNode * n6,
+                                           const SMDS_MeshNode * n12,
+                                           const SMDS_MeshNode * n23,
+                                           const SMDS_MeshNode * n31,
+                                           const SMDS_MeshNode * n45,
+                                           const SMDS_MeshNode * n56,
+                                           const SMDS_MeshNode * n64,
+                                           const SMDS_MeshNode * n14,
+                                           const SMDS_MeshNode * n25,
+                                           const SMDS_MeshNode * n36,
+                                           const SMDS_MeshNode * n1245,
+                                           const SMDS_MeshNode * n2356,
+                                           const SMDS_MeshNode * n1346,
+                                           smIdType ID);
+  virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
+                                     const SMDS_MeshNode * n2,
+                                     const SMDS_MeshNode * n3,
+                                     const SMDS_MeshNode * n4,
+                                     const SMDS_MeshNode * n5,
+                                     const SMDS_MeshNode * n6,
+                                     const SMDS_MeshNode * n12,
+                                     const SMDS_MeshNode * n23,
+                                     const SMDS_MeshNode * n31,
+                                     const SMDS_MeshNode * n45,
+                                     const SMDS_MeshNode * n56,
+                                     const SMDS_MeshNode * n64,
+                                     const SMDS_MeshNode * n14,
+                                     const SMDS_MeshNode * n25,
+                                     const SMDS_MeshNode * n36,
+                                     const SMDS_MeshNode * n1245,
+                                     const SMDS_MeshNode * n2356,
+                                     const SMDS_MeshNode * n1346);
+
+
   // 2d oreder Hexahedrons with 20 nodes
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n5, int n6, int n7, int n8,
-                                           int n12,int n23,int n34,int n41,
-                                           int n56,int n67,int n78,int n85,
-                                           int n15,int n26,int n37,int n48,
-                                           int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n5, smIdType n6, smIdType n7, smIdType n8,
+                                           smIdType n12,smIdType n23,smIdType n34,smIdType n41,
+                                           smIdType n56,smIdType n67,smIdType n78,smIdType n85,
+                                           smIdType n15,smIdType n26,smIdType n37,smIdType n48,
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -481,7 +470,7 @@ public:
                                            const SMDS_MeshNode * n26,
                                            const SMDS_MeshNode * n37,
                                            const SMDS_MeshNode * n48,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -504,14 +493,14 @@ public:
                                      const SMDS_MeshNode * n48);
 
   // 2d oreder Hexahedrons with 27 nodes
-  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
-                                           int n5, int n6, int n7, int n8,
-                                           int n12,int n23,int n34,int n41,
-                                           int n56,int n67,int n78,int n85,
-                                           int n15,int n26,int n37,int n48,
-                                           int n1234,int n1256,int n2367,int n3478,
-                                           int n1458,int n5678,int nCenter,
-                                           int ID);
+  virtual SMDS_MeshVolume* AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
+                                           smIdType n5, smIdType n6, smIdType n7, smIdType n8,
+                                           smIdType n12,smIdType n23,smIdType n34,smIdType n41,
+                                           smIdType n56,smIdType n67,smIdType n78,smIdType n85,
+                                           smIdType n15,smIdType n26,smIdType n37,smIdType n48,
+                                           smIdType n1234,smIdType n1256,smIdType n2367,smIdType n3478,
+                                           smIdType n1458,smIdType n5678,smIdType nCenter,
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                            const SMDS_MeshNode * n2,
                                            const SMDS_MeshNode * n3,
@@ -539,7 +528,7 @@ public:
                                            const SMDS_MeshNode * n1458,
                                            const SMDS_MeshNode * n5678,
                                            const SMDS_MeshNode * nCenter,
-                                           int ID);
+                                           smIdType ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                      const SMDS_MeshNode * n2,
                                      const SMDS_MeshNode * n3,
@@ -568,57 +557,48 @@ public:
                                      const SMDS_MeshNode * n5678,
                                      const SMDS_MeshNode * nCenter);
 
-  virtual SMDS_MeshFace* AddPolygonalFaceWithID (const std::vector<int> & nodes_ids,
-                                                 const int                ID);
+  virtual SMDS_MeshFace* AddPolygonalFaceWithID (const std::vector<smIdType> & nodes_ids,
+                                                 const smIdType                ID);
 
   virtual SMDS_MeshFace* AddPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*> & nodes,
-                                                 const int                                 ID);
+                                                 const smIdType                                 ID);
 
   virtual SMDS_MeshFace* AddPolygonalFace (const std::vector<const SMDS_MeshNode*> & nodes);
 
-  virtual SMDS_MeshFace* AddQuadPolygonalFaceWithID(const std::vector<int> & nodes_ids,
-                                                    const int                ID);
+  virtual SMDS_MeshFace* AddQuadPolygonalFaceWithID(const std::vector<smIdType> & nodes_ids,
+                                                    const smIdType                ID);
 
   virtual SMDS_MeshFace* AddQuadPolygonalFaceWithID(const std::vector<const SMDS_MeshNode*> & nodes,
-                                                    const int                                 ID);
+                                                    const smIdType                                 ID);
 
   virtual SMDS_MeshFace* AddQuadPolygonalFace(const std::vector<const SMDS_MeshNode*> & nodes);
 
   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
-    (const std::vector<int> & nodes_ids,
-     const std::vector<int> & quantities,
-     const int                ID);
+    (const std::vector<smIdType> & nodes_ids,
+     const std::vector<int>      & quantities,
+     const smIdType                ID);
 
   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
     (const std::vector<const SMDS_MeshNode*> & nodes,
      const std::vector<int>                  & quantities,
-                            const int                                 ID);
+     const smIdType                            ID);
 
   virtual SMDS_MeshVolume* AddPolyhedralVolume
-                           (const std::vector<const SMDS_MeshNode*> & nodes,
-                            const std::vector<int>                  & quantities);
+    (const std::vector<const SMDS_MeshNode*> & nodes,
+     const std::vector<int>                  & quantities);
 
   virtual SMDS_MeshVolume* AddVolumeFromVtkIds(const std::vector<vtkIdType>& vtkNodeIds);
 
-  virtual SMDS_MeshVolume* AddVolumeFromVtkIdsWithID(const std::vector<vtkIdType>& vtkNodeIds,
-                                                     const int ID);
-
   virtual SMDS_MeshFace* AddFaceFromVtkIds(const std::vector<vtkIdType>& vtkNodeIds);
 
-  virtual SMDS_MeshFace* AddFaceFromVtkIdsWithID(const std::vector<vtkIdType>& vtkNodeIds,
-                                                     const int ID);
   virtual void MoveNode(const SMDS_MeshNode *n, double x, double y, double z);
 
-  virtual void RemoveElement(const SMDS_MeshElement *        elem,
-                             std::list<const SMDS_MeshElement *>& removedElems,
-                             std::list<const SMDS_MeshElement *>& removedNodes,
-                             const bool                      removenodes = false);
+  virtual void RemoveElement(const SMDS_MeshElement *               elem,
+                             std::vector<const SMDS_MeshElement *>& removedElems,
+                             std::vector<const SMDS_MeshElement *>& removedNodes,
+                             const bool                             removenodes = false);
   virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
   virtual void RemoveNode(const SMDS_MeshNode * node);
-  virtual void Remove0DElement(const SMDS_Mesh0DElement * elem0d);
-  virtual void RemoveEdge(const SMDS_MeshEdge * edge);
-  virtual void RemoveFace(const SMDS_MeshFace * face);
-  virtual void RemoveVolume(const SMDS_MeshVolume * volume);
 
   /*! Remove only the given element and only if it is free.
    *  Method does not work for meshes with descendants.
@@ -636,25 +616,29 @@ public:
                           const int                nbnodes);
   bool ChangePolyhedronNodes(const SMDS_MeshElement *                 elem,
                              const std::vector<const SMDS_MeshNode*>& nodes,
-                             const std::vector<int> &                 quantities);
+                             const std::vector<int>&                  quantities);
+
+  void SetAllNodesNotMarked();
+  void SetAllCellsNotMarked();
 
-  virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
+  //virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
   // Renumber all nodes or elements.
-  virtual void compactMesh();
-
-  const SMDS_MeshNode *FindNode(int idnode) const;
-  const SMDS_MeshNode *FindNodeVtk(int idnode) const;
-  const SMDS_Mesh0DElement* Find0DElement(int idnode) const;
-  const SMDS_BallElement* FindBall(int idnode) const;
-  const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
-  const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2, int idnode3) const;
-  const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
-  const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
-  const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3,
-                                int idnode4, int idnode5, int idnode6) const;
-  const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4,
-                                int idnode5, int idnode6, int idnode7, int idnode8) const;
-  const SMDS_MeshElement *FindElement(int IDelem) const;
+
+  virtual void CompactMesh();
+  virtual bool IsCompacted();
+  virtual bool HasNumerationHoles();
+
+  template<class ELEMTYPE>
+    static const ELEMTYPE* DownCast( const SMDS_MeshElement* e )
+  {
+    return (( e && !e->IsNull() && ELEMTYPE::Type() == e->GetType() ) ?
+            static_cast<const ELEMTYPE*>(e) : 0 );
+  }
+
+  const SMDS_MeshNode *FindNode(smIdType idnode) const;
+  const SMDS_MeshNode *FindNodeVtk(vtkIdType idnode) const;
+  const SMDS_MeshElement *FindElementVtk(vtkIdType IDelem) const;
+  virtual const SMDS_MeshElement * FindElement(smIdType IDelem) const;
   static const SMDS_Mesh0DElement* Find0DElement(const SMDS_MeshNode * n);
   static const SMDS_BallElement* FindBall(const SMDS_MeshNode * n);
   static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
@@ -684,69 +668,44 @@ public:
                                        const SMDS_MeshNode *n7,
                                        const SMDS_MeshNode *n8);
 
-  const SMDS_MeshFace *FindFace(const std::vector<int>& nodes_ids) const;
-  static const SMDS_MeshFace* FindFace(const std::vector<const SMDS_MeshNode *>& nodes);
+  static const SMDS_MeshFace*    FindFace   (const std::vector<const SMDS_MeshNode *>& nodes);
   static const SMDS_MeshElement* FindElement(const std::vector<const SMDS_MeshNode *>& nodes,
                                              const SMDSAbs_ElementType                 type=SMDSAbs_All,
                                              const bool                                noMedium=true);
+  static int GetElementsByNodes(const std::vector<const SMDS_MeshNode *>& nodes,
+                                std::vector<const SMDS_MeshElement *>&    foundElems,
+                                const SMDSAbs_ElementType                 type=SMDSAbs_All);
+
+  virtual bool Contains( const SMDS_MeshElement* elem ) const;
 
   /*!
    * \brief Raise an exception if free memory (ram+swap) too low
-    * \param doNotRaise - if true, suppres exception, just return free memory size
+    * \param doNotRaise - if true, suppress exception, just return free memory size
     * \retval int - amount of available memory in MB or negative number in failure case
    */
-  static int CheckMemory(const bool doNotRaise=false) throw (std::bad_alloc);
+  static int CheckMemory(const bool doNotRaise=false);
 
-  int MaxNodeID() const;
-  int MinNodeID() const;
-  int MaxElementID() const;
-  int MinElementID() const;
+  virtual smIdType MaxNodeID() const;
+  virtual smIdType MinNodeID() const;
+  virtual smIdType MaxElementID() const;
+  virtual smIdType MinElementID() const;
 
   const SMDS_MeshInfo& GetMeshInfo() const { return myInfo; }
 
-  virtual int NbNodes() const;
-  virtual int Nb0DElements() const;
-  virtual int NbBalls() const;
-  virtual int NbEdges() const;
-  virtual int NbFaces() const;
-  virtual int NbVolumes() const;
-  virtual int NbSubMesh() const;
-
-  void DumpNodes() const;
-  void Dump0DElements() const;
-  void DumpEdges() const;
-  void DumpFaces() const;
-  void DumpVolumes() const;
-  void DebugStats() const;
+  virtual smIdType NbNodes() const;
+  virtual smIdType NbElements() const;
+  virtual smIdType Nb0DElements() const;
+  virtual smIdType NbBalls() const;
+  virtual smIdType NbEdges() const;
+  virtual smIdType NbFaces() const;
+  virtual smIdType NbVolumes() const;
+  virtual smIdType NbSubMesh() const;
 
   virtual ~SMDS_Mesh();
 
-  bool hasConstructionEdges();
-  bool hasConstructionFaces();
-  bool hasInverseElements();
-  void setConstructionEdges(bool);
-  void setConstructionFaces(bool);
-  void setInverseElements(bool);
-
-  /*!
-   * Checks if the element is present in mesh.
-   * Useful to determine dead pointers.
-   * Use this function for debug purpose only! Do not check in the code
-   * using it even in _DEBUG_ mode
-   */
-  bool Contains (const SMDS_MeshElement* elem) const;
-
-  typedef std::vector<SMDS_MeshNode *> SetOfNodes;
-  typedef std::vector<SMDS_MeshCell *> SetOfCells;
-
-  void updateNodeMinMax();
-  void updateBoundingBox();
   double getMaxDim();
-  int fromVtkToSmds(int vtkid);
+  smIdType FromVtkToSmds(vtkIdType  vtkid) const;
 
-  void incrementNodesCapacity(int nbNodes);
-  void incrementCellsCapacity(int nbCells);
-  void adjustStructure();
   void dumpGrid(std::string ficdump="dumpGrid");
   static int chunkSize;
 
@@ -754,45 +713,15 @@ public:
   inline void setMyModified() { this->myModified = true; }
 
   void Modified();
-  unsigned long GetMTime() const;
-  bool isCompacted();
+  vtkMTimeType GetMTime() const;
 
-protected:
+ protected:
   SMDS_Mesh(SMDS_Mesh * parent);
 
-  SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
-                                 const SMDS_MeshNode * node2,
-                                 const SMDS_MeshNode * node3,
-                                 int ID);
-  SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
-                                   const SMDS_MeshNode * node2,
-                                   const SMDS_MeshNode * node3,
-                                   const SMDS_MeshNode * node4,
-                                   int ID);
-  SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
-                                  const SMDS_MeshNode * n2);
-  SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
-                                  const SMDS_MeshNode *n2,
-                                  const SMDS_MeshNode *n3);
-  SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
-                                  const SMDS_MeshNode *n2,
-                                  const SMDS_MeshNode *n3,
-                                  const SMDS_MeshNode *n4);
-
-  bool registerElement(int ID, SMDS_MeshElement * element);
-
   void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
                             const SMDS_MeshElement *           element,
                             std::set<const SMDS_MeshElement*>& nodes);
 
-  inline void adjustmyCellsCapacity(int ID)
-  {
-    assert(ID >= 0);
-    myElementIDFactory->adjustMaxId(ID);
-    if (ID >= (int)myCells.size())
-      myCells.resize(ID+SMDS_Mesh::chunkSize,0);
-  }
-
   inline void adjustBoundingBox(double x, double y, double z)
   {
     if (x > xmax) xmax = x;
@@ -803,52 +732,34 @@ protected:
     else if (z < zmin) zmin = z;
   }
 
-  // Fields PRIVATE
-
-  //! index of this SMDS_mesh in the static vector<SMDS_Mesh*> _meshList
-  int myMeshId;
-
-  //! actual nodes coordinates, cells definition and reverse connectivity are stored in a vtkUnstructuredGrid
-  SMDS_UnstructuredGrid*      myGrid;
-
-  //! Small objects like SMDS_MeshNode are allocated by chunks to limit memory costs of new
-  ObjectPool<SMDS_MeshNode>* myNodePool;
+  void updateInverseElements( const SMDS_MeshElement *        element,
+                              const SMDS_MeshNode* const*     nodes,
+                              const int                       nbnodes,
+                              std::set<const SMDS_MeshNode*>& oldNodes );
 
-  //! Small objects like SMDS_VtkVolume are allocated by chunks to limit memory costs of new
-  ObjectPool<SMDS_VtkVolume>*   myVolumePool;
-  ObjectPool<SMDS_VtkFace>*     myFacePool;
-  ObjectPool<SMDS_VtkEdge>*     myEdgePool;
-  ObjectPool<SMDS_BallElement>* myBallPool;
+  void setNbShapes( size_t nbShapes );
 
-  //! SMDS_MeshNodes refer to vtk nodes (vtk id = index in myNodes),store reference to this mesh, and sub-shape
-  SetOfNodes             myNodes;
 
-  //! SMDS_MeshCells refer to vtk cells (vtk id != index in myCells),store reference to this mesh, and sub-shape
-  SetOfCells             myCells;
+  // Fields PRIVATE
 
-  //! a buffer to speed up elements addition by excluding some memory allocation
-  std::vector<vtkIdType> myNodeIds;
+  //! actual nodes coordinates, cells definition and reverse connectivity are stored in a vtkUnstructuredGrid
+  SMDS_UnstructuredGrid* myGrid;
 
-  //! for cells only: index = ID in vtkUnstructuredGrid, value = ID for SMDS users
-  std::vector<int>       myCellIdVtkToSmds;
+  //! Small objects like SMDS_MeshNode are allocated by chunks to limit memory costs of new
+  SMDS_NodeFactory*      myNodeFactory;
+  SMDS_ElementFactory*   myCellFactory;
 
   SMDS_Mesh *            myParent;
   std::list<SMDS_Mesh *> myChildren;
-  SMDS_MeshNodeIDFactory *myNodeIDFactory;
-  SMDS_MeshElementIDFactory *myElementIDFactory;
   SMDS_MeshInfo          myInfo;
 
   //! any add, remove or change of node or cell
-  bool myModified;
+  bool                   myModified;
   //! use a counter to keep track of modifications
-  unsigned long myModifTime, myCompactTime;
-
-  int myNodeMin;
-  int myNodeMax;
+  unsigned long          myModifTime, myCompactTime;
 
-  bool myHasConstructionEdges;
-  bool myHasConstructionFaces;
-  bool myHasInverseElements;
+  friend class SMDS_ElementHolder;
+  std::set< SMDS_ElementHolder* > myElemHolders;
 
   double xmin;
   double xmax;