From 544db988bc23d68a401eadbc9cbf7cc2730a2318 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 20 Aug 2009 10:05:33 +0000
Subject: [PATCH] create api in base element class for hierarchical meshes :
 getParent, getChild

---
 Geo/MElement.h    |  5 +++++
 Geo/MElementCut.h | 56 ++++++++++-------------------------------------
 2 files changed, 16 insertions(+), 45 deletions(-)

diff --git a/Geo/MElement.h b/Geo/MElement.h
index fd82378833..4f90fc0f76 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -140,6 +140,11 @@ class MElement
     v.resize(0);
   }
 
+  // get parent and children for hierarchial grids
+  virtual MElement *getParent() const { return 0; }
+  virtual int getNumChildren() const { return 0; }
+  virtual MElement *getChild(int i) const { return 0; }
+
   //get the type of the element
   virtual int getType() const = 0;
 
diff --git a/Geo/MElementCut.h b/Geo/MElementCut.h
index bfccec95d1..fe7d524010 100644
--- a/Geo/MElementCut.h
+++ b/Geo/MElementCut.h
@@ -26,41 +26,7 @@ class MPolyhedron : public MElement {
   void _init();
  public:
   MPolyhedron(std::vector<MVertex*> v, int num=0, int part=0)
-    : MElement(num, part), _owner(false), _orig(0)
-  {
-    /*_parts.push_back(new MTetrahedron(v[0], v[1], v[2], v[3]));
-    for(unsigned int i = 4; i < v.size(); i++) {
-      unsigned int k;
-      double xyz[3] = {v[i]->x(), v[i]->y(), v[i]->z()};
-      for(k = 0; k < _parts.size(); k++) {
-        double uvw[3]; _parts[k]->xyz2uvw(xyz,uvw);
-        if(_parts[k]->isInside(uvw[0],uvw[1],uvw[2])) break;
-      }
-      if(k < _parts.size()) {
-        MTetrahedron tmp = *(_parts[k]);
-        delete _parts[k];
-        _parts.erase(_parts.begin() + k);
-        for(int t = 0; t < 4; t++) {
-          MTetrahedron *tet = new MTetrahedron(tmp.getFace(t).getVertex(0), tmp.getFace(t).getVertex(1),
-                                             tmp.getFace(t).getVertex(2), v[i]);
-          if(tet->getVolume() != 0) _parts.push_back(tet);
-          else delete tet;
-        }
-      }
-      else {
-        double dmin = 0.; int tet, face;
-        for(k = 0; k < _parts.size(); k++) {
-          for(int f = 0; f < 4; f++) {
-            double dist = v[i]->distance(_parts[k]->getFace(f).getVertex(0))
-                        + v[i]->distance(_parts[k]->getFace(f).getVertex(1))
-                        + v[i]->distance(_parts[k]->getFace(f).getVertex(2));
-            if(dmin == 0 || dist < dmin) {dmin = dist; tet = k; face = f;}
-          }
-        }
-        //_parts.push_back(new MTetrahedron());
-      }
-    }*/
-  }
+    : MElement(num, part), _owner(false), _orig(0) {}
   MPolyhedron(std::vector<MTetrahedron*> vT, int num=0, int part=0)
     : MElement(num, part), _owner(false), _orig(0)
   {
@@ -87,8 +53,8 @@ class MPolyhedron : public MElement {
   virtual int getNumVolumeVertices() const { return _innerVertices.size(); }
   virtual MVertex *getVertex(int num)
   {
-    return (num < _vertices.size()) ? _vertices[num] :
-                                      _innerVertices[num - _vertices.size()];
+    return (num < (int)_vertices.size()) ? 
+      _vertices[num] : _innerVertices[num - _vertices.size()];
   }
   virtual int getNumEdges() { return _edges.size(); }
   virtual MEdge getEdge(int num) { return _edges[num]; }
@@ -156,9 +122,9 @@ class MPolyhedron : public MElement {
   }
   virtual void writeMSH(FILE *fp, double version=1.0, bool binary=false, 
                         int num=0, int elementary=1, int physical=1);
-  virtual MElement *getFather() const { return _orig; }
-  virtual int getNumParts() const { return _parts.size(); }
-  virtual MElement *getPart(int i) const { return _parts[i]; }
+  virtual MElement *getParent() const { return _orig; }
+  virtual int getNumChildren() const { return _parts.size(); }
+  virtual MElement *getChild(int i) const { return _parts[i]; }
 };
 
 class MPolygon : public MElement {
@@ -212,8 +178,8 @@ class MPolygon : public MElement {
   virtual int getNumFaceVertices() const { return _innerVertices.size(); }
   virtual MVertex *getVertex(int num)
   {
-    return (num < _vertices.size()) ? _vertices[num] :
-                                      _innerVertices[num - _vertices.size()];
+    return (num < (int)_vertices.size()) ? 
+      _vertices[num] : _innerVertices[num - _vertices.size()];
   }
   virtual int getNumEdges() { return _vertices.size(); }
   virtual MEdge getEdge(int num)
@@ -272,9 +238,9 @@ class MPolygon : public MElement {
   }
   virtual void writeMSH(FILE *fp, double version=1.0, bool binary=false, 
                         int num=0, int elementary=1, int physical=1);
-  virtual MElement *getFather() const { return _orig; }
-  virtual int getNumParts() const { return _parts.size(); }
-  virtual MElement *getPart(int i) const { return _parts[i]; }
+  virtual MElement *getParent() const { return _orig; }
+  virtual int getNumChildren() const { return _parts.size(); }
+  virtual MElement *getChild(int i) const { return _parts[i]; }
 };
 
 class MTriangleBorder : public MTriangle {
-- 
GitLab