00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _SMDS_Mesh_HeaderFile
00028 #define _SMDS_Mesh_HeaderFile
00029
00030 #include "SMESH_SMDS.hxx"
00031
00032 #include "SMDS_MeshNode.hxx"
00033 #include "SMDS_MeshCell.hxx"
00034 #include "SMDS_Mesh0DElement.hxx"
00035 #include "SMDS_MeshEdge.hxx"
00036 #include "SMDS_MeshFace.hxx"
00037 #include "SMDS_MeshVolume.hxx"
00038 #include "SMDS_MeshNodeIDFactory.hxx"
00039 #include "SMDS_MeshElementIDFactory.hxx"
00040 #include "SMDS_MeshInfo.hxx"
00041 #include "SMDS_ElemIterator.hxx"
00042 #include "SMDS_VolumeOfNodes.hxx"
00043 #include "SMDS_VtkEdge.hxx"
00044 #include "SMDS_VtkFace.hxx"
00045 #include "SMDS_VtkVolume.hxx"
00046 #include "ObjectPool.hxx"
00047 #include "SMDS_UnstructuredGrid.hxx"
00048
00049 #include <boost/shared_ptr.hpp>
00050 #include <set>
00051 #include <list>
00052 #include <vector>
00053 #include <vtkSystemIncludes.h>
00054
00055 #include "Utils_SALOME_Exception.hxx"
00056 #define MYASSERT(val) if (!(val)) throw SALOME_Exception(LOCALIZED("assertion not verified"));
00057
00058 class SMDS_EXPORT SMDS_Mesh:public SMDS_MeshObject{
00059 public:
00060 friend class SMDS_MeshIDFactory;
00061 friend class SMDS_MeshNodeIDFactory;
00062 friend class SMDS_MeshElementIDFactory;
00063 friend class SMDS_MeshVolumeVtkNodes;
00064 friend class SMDS_MeshNode;
00065
00066 SMDS_Mesh();
00067
00069 static std::vector<SMDS_Mesh*> _meshList;
00070
00072 inline SMDS_UnstructuredGrid* getGrid() {return myGrid; }
00073 inline int getMeshId() {return myMeshId; }
00074
00075 SMDS_NodeIteratorPtr nodesIterator (bool idInceasingOrder=false) const;
00076 SMDS_0DElementIteratorPtr elements0dIterator(bool idInceasingOrder=false) const;
00077 SMDS_EdgeIteratorPtr edgesIterator (bool idInceasingOrder=false) const;
00078 SMDS_FaceIteratorPtr facesIterator (bool idInceasingOrder=false) const;
00079 SMDS_VolumeIteratorPtr volumesIterator (bool idInceasingOrder=false) const;
00080 SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
00081
00082 SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
00083
00084 SMDS_Mesh *AddSubMesh();
00085
00086 virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
00087 virtual SMDS_MeshNode* AddNode(double x, double y, double z);
00088
00089 virtual SMDS_Mesh0DElement* Add0DElementWithID(int n, int ID);
00090 virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, int ID);
00091 virtual SMDS_Mesh0DElement* Add0DElement (const SMDS_MeshNode * n);
00092
00093 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
00094 virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00095 const SMDS_MeshNode * n2,
00096 int ID);
00097 virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00098 const SMDS_MeshNode * n2);
00099
00100
00101 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID);
00102 virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00103 const SMDS_MeshNode * n2,
00104 const SMDS_MeshNode * n12,
00105 int ID);
00106 virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00107 const SMDS_MeshNode * n2,
00108 const SMDS_MeshNode * n12);
00109
00110 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
00111 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00112 const SMDS_MeshNode * n2,
00113 const SMDS_MeshNode * n3,
00114 int ID);
00115 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00116 const SMDS_MeshNode * n2,
00117 const SMDS_MeshNode * n3);
00118
00119 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
00120 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00121 const SMDS_MeshNode * n2,
00122 const SMDS_MeshNode * n3,
00123 const SMDS_MeshNode * n4,
00124 int ID);
00125 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00126 const SMDS_MeshNode * n2,
00127 const SMDS_MeshNode * n3,
00128 const SMDS_MeshNode * n4);
00129
00130 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
00131 const SMDS_MeshEdge * e2,
00132 const SMDS_MeshEdge * e3, int ID);
00133 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
00134 const SMDS_MeshEdge * e2,
00135 const SMDS_MeshEdge * e3);
00136
00137 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
00138 const SMDS_MeshEdge * e2,
00139 const SMDS_MeshEdge * e3,
00140 const SMDS_MeshEdge * e4, int ID);
00141 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
00142 const SMDS_MeshEdge * e2,
00143 const SMDS_MeshEdge * e3,
00144 const SMDS_MeshEdge * e4);
00145
00146
00147 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3,
00148 int n12,int n23,int n31, int ID);
00149 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00150 const SMDS_MeshNode * n2,
00151 const SMDS_MeshNode * n3,
00152 const SMDS_MeshNode * n12,
00153 const SMDS_MeshNode * n23,
00154 const SMDS_MeshNode * n31,
00155 int ID);
00156 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00157 const SMDS_MeshNode * n2,
00158 const SMDS_MeshNode * n3,
00159 const SMDS_MeshNode * n12,
00160 const SMDS_MeshNode * n23,
00161 const SMDS_MeshNode * n31);
00162
00163
00164 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
00165 int n12,int n23,int n34,int n41, int ID);
00166 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00167 const SMDS_MeshNode * n2,
00168 const SMDS_MeshNode * n3,
00169 const SMDS_MeshNode * n4,
00170 const SMDS_MeshNode * n12,
00171 const SMDS_MeshNode * n23,
00172 const SMDS_MeshNode * n34,
00173 const SMDS_MeshNode * n41,
00174 int ID);
00175 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00176 const SMDS_MeshNode * n2,
00177 const SMDS_MeshNode * n3,
00178 const SMDS_MeshNode * n4,
00179 const SMDS_MeshNode * n12,
00180 const SMDS_MeshNode * n23,
00181 const SMDS_MeshNode * n34,
00182 const SMDS_MeshNode * n41);
00183
00184 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
00185 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00186 const SMDS_MeshNode * n2,
00187 const SMDS_MeshNode * n3,
00188 const SMDS_MeshNode * n4,
00189 int ID);
00190 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00191 const SMDS_MeshNode * n2,
00192 const SMDS_MeshNode * n3,
00193 const SMDS_MeshNode * n4);
00194
00195 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00196 int n5, int ID);
00197 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00198 const SMDS_MeshNode * n2,
00199 const SMDS_MeshNode * n3,
00200 const SMDS_MeshNode * n4,
00201 const SMDS_MeshNode * n5,
00202 int ID);
00203 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00204 const SMDS_MeshNode * n2,
00205 const SMDS_MeshNode * n3,
00206 const SMDS_MeshNode * n4,
00207 const SMDS_MeshNode * n5);
00208
00209 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00210 int n5, int n6, int ID);
00211 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00212 const SMDS_MeshNode * n2,
00213 const SMDS_MeshNode * n3,
00214 const SMDS_MeshNode * n4,
00215 const SMDS_MeshNode * n5,
00216 const SMDS_MeshNode * n6,
00217 int ID);
00218 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00219 const SMDS_MeshNode * n2,
00220 const SMDS_MeshNode * n3,
00221 const SMDS_MeshNode * n4,
00222 const SMDS_MeshNode * n5,
00223 const SMDS_MeshNode * n6);
00224
00225 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00226 int n5, int n6, int n7, int n8, int ID);
00227 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00228 const SMDS_MeshNode * n2,
00229 const SMDS_MeshNode * n3,
00230 const SMDS_MeshNode * n4,
00231 const SMDS_MeshNode * n5,
00232 const SMDS_MeshNode * n6,
00233 const SMDS_MeshNode * n7,
00234 const SMDS_MeshNode * n8,
00235 int ID);
00236 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00237 const SMDS_MeshNode * n2,
00238 const SMDS_MeshNode * n3,
00239 const SMDS_MeshNode * n4,
00240 const SMDS_MeshNode * n5,
00241 const SMDS_MeshNode * n6,
00242 const SMDS_MeshNode * n7,
00243 const SMDS_MeshNode * n8);
00244
00245 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00246 const SMDS_MeshFace * f2,
00247 const SMDS_MeshFace * f3,
00248 const SMDS_MeshFace * f4, int ID);
00249 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00250 const SMDS_MeshFace * f2,
00251 const SMDS_MeshFace * f3,
00252 const SMDS_MeshFace * f4);
00253
00254 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00255 const SMDS_MeshFace * f2,
00256 const SMDS_MeshFace * f3,
00257 const SMDS_MeshFace * f4,
00258 const SMDS_MeshFace * f5, int ID);
00259 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00260 const SMDS_MeshFace * f2,
00261 const SMDS_MeshFace * f3,
00262 const SMDS_MeshFace * f4,
00263 const SMDS_MeshFace * f5);
00264
00265 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00266 const SMDS_MeshFace * f2,
00267 const SMDS_MeshFace * f3,
00268 const SMDS_MeshFace * f4,
00269 const SMDS_MeshFace * f5,
00270 const SMDS_MeshFace * f6, int ID);
00271 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00272 const SMDS_MeshFace * f2,
00273 const SMDS_MeshFace * f3,
00274 const SMDS_MeshFace * f4,
00275 const SMDS_MeshFace * f5,
00276 const SMDS_MeshFace * f6);
00277
00278
00279 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00280 int n12,int n23,int n31,
00281 int n14,int n24,int n34, int ID);
00282 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00283 const SMDS_MeshNode * n2,
00284 const SMDS_MeshNode * n3,
00285 const SMDS_MeshNode * n4,
00286 const SMDS_MeshNode * n12,
00287 const SMDS_MeshNode * n23,
00288 const SMDS_MeshNode * n31,
00289 const SMDS_MeshNode * n14,
00290 const SMDS_MeshNode * n24,
00291 const SMDS_MeshNode * n34,
00292 int ID);
00293 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00294 const SMDS_MeshNode * n2,
00295 const SMDS_MeshNode * n3,
00296 const SMDS_MeshNode * n4,
00297 const SMDS_MeshNode * n12,
00298 const SMDS_MeshNode * n23,
00299 const SMDS_MeshNode * n31,
00300 const SMDS_MeshNode * n14,
00301 const SMDS_MeshNode * n24,
00302 const SMDS_MeshNode * n34);
00303
00304
00305 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
00306 int n12,int n23,int n34,int n41,
00307 int n15,int n25,int n35,int n45,
00308 int ID);
00309 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00310 const SMDS_MeshNode * n2,
00311 const SMDS_MeshNode * n3,
00312 const SMDS_MeshNode * n4,
00313 const SMDS_MeshNode * n5,
00314 const SMDS_MeshNode * n12,
00315 const SMDS_MeshNode * n23,
00316 const SMDS_MeshNode * n34,
00317 const SMDS_MeshNode * n41,
00318 const SMDS_MeshNode * n15,
00319 const SMDS_MeshNode * n25,
00320 const SMDS_MeshNode * n35,
00321 const SMDS_MeshNode * n45,
00322 int ID);
00323 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00324 const SMDS_MeshNode * n2,
00325 const SMDS_MeshNode * n3,
00326 const SMDS_MeshNode * n4,
00327 const SMDS_MeshNode * n5,
00328 const SMDS_MeshNode * n12,
00329 const SMDS_MeshNode * n23,
00330 const SMDS_MeshNode * n34,
00331 const SMDS_MeshNode * n41,
00332 const SMDS_MeshNode * n15,
00333 const SMDS_MeshNode * n25,
00334 const SMDS_MeshNode * n35,
00335 const SMDS_MeshNode * n45);
00336
00337
00338 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3,
00339 int n4, int n5, int n6,
00340 int n12,int n23,int n31,
00341 int n45,int n56,int n64,
00342 int n14,int n25,int n36,
00343 int ID);
00344 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00345 const SMDS_MeshNode * n2,
00346 const SMDS_MeshNode * n3,
00347 const SMDS_MeshNode * n4,
00348 const SMDS_MeshNode * n5,
00349 const SMDS_MeshNode * n6,
00350 const SMDS_MeshNode * n12,
00351 const SMDS_MeshNode * n23,
00352 const SMDS_MeshNode * n31,
00353 const SMDS_MeshNode * n45,
00354 const SMDS_MeshNode * n56,
00355 const SMDS_MeshNode * n64,
00356 const SMDS_MeshNode * n14,
00357 const SMDS_MeshNode * n25,
00358 const SMDS_MeshNode * n36,
00359 int ID);
00360 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00361 const SMDS_MeshNode * n2,
00362 const SMDS_MeshNode * n3,
00363 const SMDS_MeshNode * n4,
00364 const SMDS_MeshNode * n5,
00365 const SMDS_MeshNode * n6,
00366 const SMDS_MeshNode * n12,
00367 const SMDS_MeshNode * n23,
00368 const SMDS_MeshNode * n31,
00369 const SMDS_MeshNode * n45,
00370 const SMDS_MeshNode * n56,
00371 const SMDS_MeshNode * n64,
00372 const SMDS_MeshNode * n14,
00373 const SMDS_MeshNode * n25,
00374 const SMDS_MeshNode * n36);
00375
00376
00377 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00378 int n5, int n6, int n7, int n8,
00379 int n12,int n23,int n34,int n41,
00380 int n56,int n67,int n78,int n85,
00381 int n15,int n26,int n37,int n48,
00382 int ID);
00383 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00384 const SMDS_MeshNode * n2,
00385 const SMDS_MeshNode * n3,
00386 const SMDS_MeshNode * n4,
00387 const SMDS_MeshNode * n5,
00388 const SMDS_MeshNode * n6,
00389 const SMDS_MeshNode * n7,
00390 const SMDS_MeshNode * n8,
00391 const SMDS_MeshNode * n12,
00392 const SMDS_MeshNode * n23,
00393 const SMDS_MeshNode * n34,
00394 const SMDS_MeshNode * n41,
00395 const SMDS_MeshNode * n56,
00396 const SMDS_MeshNode * n67,
00397 const SMDS_MeshNode * n78,
00398 const SMDS_MeshNode * n85,
00399 const SMDS_MeshNode * n15,
00400 const SMDS_MeshNode * n26,
00401 const SMDS_MeshNode * n37,
00402 const SMDS_MeshNode * n48,
00403 int ID);
00404 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00405 const SMDS_MeshNode * n2,
00406 const SMDS_MeshNode * n3,
00407 const SMDS_MeshNode * n4,
00408 const SMDS_MeshNode * n5,
00409 const SMDS_MeshNode * n6,
00410 const SMDS_MeshNode * n7,
00411 const SMDS_MeshNode * n8,
00412 const SMDS_MeshNode * n12,
00413 const SMDS_MeshNode * n23,
00414 const SMDS_MeshNode * n34,
00415 const SMDS_MeshNode * n41,
00416 const SMDS_MeshNode * n56,
00417 const SMDS_MeshNode * n67,
00418 const SMDS_MeshNode * n78,
00419 const SMDS_MeshNode * n85,
00420 const SMDS_MeshNode * n15,
00421 const SMDS_MeshNode * n26,
00422 const SMDS_MeshNode * n37,
00423 const SMDS_MeshNode * n48);
00424
00425 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
00426 const int ID);
00427
00428 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
00429 const int ID);
00430
00431 virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
00432
00433 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00434 (std::vector<int> nodes_ids,
00435 std::vector<int> quantities,
00436 const int ID);
00437
00438 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00439 (std::vector<const SMDS_MeshNode*> nodes,
00440 std::vector<int> quantities,
00441 const int ID);
00442
00443 virtual SMDS_MeshVolume* AddPolyhedralVolume
00444 (std::vector<const SMDS_MeshNode*> nodes,
00445 std::vector<int> quantities);
00446
00447 virtual SMDS_MeshVolume* AddVolumeFromVtkIds(const std::vector<vtkIdType>& vtkNodeIds);
00448
00449 virtual SMDS_MeshVolume* AddVolumeFromVtkIdsWithID(const std::vector<vtkIdType>& vtkNodeIds,
00450 const int ID);
00451
00452 virtual void RemoveElement(const SMDS_MeshElement * elem,
00453 std::list<const SMDS_MeshElement *>& removedElems,
00454 std::list<const SMDS_MeshElement *>& removedNodes,
00455 const bool removenodes = false);
00456 virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
00457 virtual void RemoveNode(const SMDS_MeshNode * node);
00458 virtual void Remove0DElement(const SMDS_Mesh0DElement * elem0d);
00459 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
00460 virtual void RemoveFace(const SMDS_MeshFace * face);
00461 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
00462
00467 virtual void RemoveFreeElement(const SMDS_MeshElement * elem);
00468
00469 virtual void Clear();
00470
00471 virtual bool RemoveFromParent();
00472 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
00473
00474 bool ChangeElementNodes(const SMDS_MeshElement * elem,
00475 const SMDS_MeshNode * nodes[],
00476 const int nbnodes);
00477 bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
00478 const std::vector<const SMDS_MeshNode*>& nodes,
00479 const std::vector<int> & quantities);
00480
00481 virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
00482
00483 virtual void compactMesh();
00484
00485 const SMDS_MeshNode *FindNode(int idnode) const;
00486 const SMDS_MeshNode *FindNodeVtk(int idnode) const;
00487 const SMDS_Mesh0DElement* Find0DElement(int idnode) const;
00488 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
00489 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2, int idnode3) const;
00490 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
00491 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
00492 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3,
00493 int idnode4, int idnode5, int idnode6) const;
00494 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4,
00495 int idnode5, int idnode6, int idnode7, int idnode8) const;
00496 const SMDS_MeshElement *FindElement(int IDelem) const;
00497 static const SMDS_Mesh0DElement* Find0DElement(const SMDS_MeshNode * n);
00498 static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
00499 const SMDS_MeshNode * n2);
00500 static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
00501 const SMDS_MeshNode * n2,
00502 const SMDS_MeshNode * n3);
00503 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00504 const SMDS_MeshNode *n2,
00505 const SMDS_MeshNode *n3);
00506 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00507 const SMDS_MeshNode *n2,
00508 const SMDS_MeshNode *n3,
00509 const SMDS_MeshNode *n4);
00510 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00511 const SMDS_MeshNode *n2,
00512 const SMDS_MeshNode *n3,
00513 const SMDS_MeshNode *n4,
00514 const SMDS_MeshNode *n5,
00515 const SMDS_MeshNode *n6);
00516 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00517 const SMDS_MeshNode *n2,
00518 const SMDS_MeshNode *n3,
00519 const SMDS_MeshNode *n4,
00520 const SMDS_MeshNode *n5,
00521 const SMDS_MeshNode *n6,
00522 const SMDS_MeshNode *n7,
00523 const SMDS_MeshNode *n8);
00524
00525 const SMDS_MeshFace *FindFace(const std::vector<int>& nodes_ids) const;
00526 static const SMDS_MeshFace* FindFace(const std::vector<const SMDS_MeshNode *>& nodes);
00527 static const SMDS_MeshElement* FindElement(const std::vector<const SMDS_MeshNode *>& nodes,
00528 const SMDSAbs_ElementType type=SMDSAbs_All,
00529 const bool noMedium=true);
00530
00536 static int CheckMemory(const bool doNotRaise=false) throw (std::bad_alloc);
00537
00538 int MaxNodeID() const;
00539 int MinNodeID() const;
00540 int MaxElementID() const;
00541 int MinElementID() const;
00542
00543 const SMDS_MeshInfo& GetMeshInfo() const { return myInfo; }
00544
00545 int NbNodes() const;
00546 int Nb0DElements() const;
00547 int NbEdges() const;
00548 int NbFaces() const;
00549 int NbVolumes() const;
00550 int NbSubMesh() const;
00551 void DumpNodes() const;
00552 void Dump0DElements() const;
00553 void DumpEdges() const;
00554 void DumpFaces() const;
00555 void DumpVolumes() const;
00556 void DebugStats() const;
00557 SMDS_Mesh *boundaryFaces();
00558 SMDS_Mesh *boundaryEdges();
00559 virtual ~SMDS_Mesh();
00560 bool hasConstructionEdges();
00561 bool hasConstructionFaces();
00562 bool hasInverseElements();
00563 void setConstructionEdges(bool);
00564 void setConstructionFaces(bool);
00565 void setInverseElements(bool);
00566
00573 bool Contains (const SMDS_MeshElement* elem) const;
00574
00575 typedef std::vector<SMDS_MeshNode *> SetOfNodes;
00576 typedef std::vector<SMDS_MeshCell *> SetOfCells;
00577
00578 void updateNodeMinMax();
00579 void updateBoundingBox();
00580 double getMaxDim();
00581 int fromVtkToSmds(int vtkid);
00582
00583 void incrementNodesCapacity(int nbNodes);
00584 void incrementCellsCapacity(int nbCells);
00585 void adjustStructure();
00586 void dumpGrid(string ficdump="dumpGrid");
00587 static int chunkSize;
00588
00590 inline void setMyModified() { this->myModified = true; }
00591
00592 void Modified();
00593 unsigned long GetMTime();
00594 bool isCompacted();
00595
00596 protected:
00597 SMDS_Mesh(SMDS_Mesh * parent);
00598
00599 SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
00600 const SMDS_MeshNode * node2,
00601 const SMDS_MeshNode * node3,
00602 int ID);
00603 SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
00604 const SMDS_MeshNode * node2,
00605 const SMDS_MeshNode * node3,
00606 const SMDS_MeshNode * node4,
00607 int ID);
00608
00609 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
00610 const SMDS_MeshNode * n2);
00611 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
00612 const SMDS_MeshNode *n2,
00613 const SMDS_MeshNode *n3);
00614 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
00615 const SMDS_MeshNode *n2,
00616 const SMDS_MeshNode *n3,
00617 const SMDS_MeshNode *n4);
00618
00619 bool registerElement(int ID, SMDS_MeshElement * element);
00620
00621 void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
00622 const SMDS_MeshElement * element,
00623 std::set<const SMDS_MeshElement*>& nodes);
00624
00625 inline void adjustmyCellsCapacity(int ID)
00626 {
00627 assert(ID >= 0);
00628 myElementIDFactory->adjustMaxId(ID);
00629 if (ID >= myCells.size())
00630 myCells.resize(ID+SMDS_Mesh::chunkSize,0);
00631 }
00632
00633 inline void adjustBoundingBox(double x, double y, double z)
00634 {
00635 if (x > xmax) xmax = x;
00636 else if (x < xmin) xmin = x;
00637 if (y > ymax) ymax = y;
00638 else if (y < ymin) ymin = y;
00639 if (z > zmax) zmax = z;
00640 else if (z < zmin) zmin = z;
00641 }
00642
00643
00644
00646 int myMeshId;
00647
00649 SMDS_UnstructuredGrid* myGrid;
00650
00652 ObjectPool<SMDS_MeshNode>* myNodePool;
00653
00655 ObjectPool<SMDS_VtkVolume>* myVolumePool;
00656 ObjectPool<SMDS_VtkFace>* myFacePool;
00657 ObjectPool<SMDS_VtkEdge>* myEdgePool;
00658
00660 SetOfNodes myNodes;
00661
00663 SetOfCells myCells;
00664
00666
00667
00669 std::vector<int> myCellIdVtkToSmds;
00670
00671 SMDS_Mesh * myParent;
00672 std::list<SMDS_Mesh *> myChildren;
00673 SMDS_MeshNodeIDFactory *myNodeIDFactory;
00674 SMDS_MeshElementIDFactory *myElementIDFactory;
00675 SMDS_MeshInfo myInfo;
00676
00678 unsigned long myModifTime, myCompactTime;
00679
00680 int myNodeMin;
00681 int myNodeMax;
00682
00683 bool myHasConstructionEdges;
00684 bool myHasConstructionFaces;
00685 bool myHasInverseElements;
00686
00688 bool myModified;
00689
00690 double xmin;
00691 double xmax;
00692 double ymin;
00693 double ymax;
00694 double zmin;
00695 double zmax;
00696 };
00697
00698
00699 #endif