From 7cb101c19c5d8e3f9637d840cd2492db79366352 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 21 Sep 2012 05:34:40 +0000
Subject: [PATCH] more work on MSH3

---
 Geo/GModelIO_MSH.cpp |  2 +-
 Geo/MElement.cpp     | 53 +++++++++++++++++++-----------------
 Geo/MElement.h       |  4 ---
 Geo/MSubElement.cpp  | 64 --------------------------------------------
 Geo/MSubElement.h    |  8 ------
 5 files changed, 29 insertions(+), 102 deletions(-)

diff --git a/Geo/GModelIO_MSH.cpp b/Geo/GModelIO_MSH.cpp
index 3e949fd2fb..00127caa3b 100644
--- a/Geo/GModelIO_MSH.cpp
+++ b/Geo/GModelIO_MSH.cpp
@@ -55,7 +55,7 @@ int GModel::readMSH(const std::string &name)
   }
 
   char str[256] = "";
-  double version = 2.2;
+  double version = 0.;
   bool binary = false, swap = false, postpro = false;
   int minVertex = 0;
   std::map<int, std::vector<int> > entities[4];
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 02a359fb22..eb8341bab3 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -710,42 +710,45 @@ double MElement::integrateFlux(double val[], int face, int pOrder, int order)
   return result;
 }
 
-void MElement::_fillInfoMSH(std::vector<int> &info, int elementary,
-                            std::vector<short> *ghosts)
-{
-  info.clear();
-  info.push_back(0);
-  info.push_back(elementary);
-  if(_partition)
-    info.push_back(_partition);
-  if(ghosts)
-    info.insert(info.end(), ghosts->begin(), ghosts->end());
-  info[0] = info.size() - 1;
-  std::vector<int> verts;
-  getVerticesIdForMSH(verts);
-  info.insert(info.end(), verts.begin(), verts.end());
-}
-
 void MElement::writeMSH(FILE *fp, bool binary, int elementary,
                         std::vector<short> *ghosts)
 {
+  int num = getNum();
   int type = getTypeForMSH();
   if(!type) return;
 
-  std::vector<int> info;
-  _fillInfoMSH(info, elementary, ghosts);
-
   // if necessary, change the ordering of the vertices to get positive volume
   setVolumePositive();
 
+  std::vector<int> info;
+  info.push_back(0);
+  info.push_back(elementary);
+  if(getParent())
+    info.push_back(getParent()->getNum());
+  if(getPartition()){
+    if(ghosts){
+      info.push_back(1 + ghosts->size());
+      info.push_back(getPartition());
+      info.insert(info.end(), ghosts->begin(), ghosts->end());
+    }
+    else{
+      info.push_back(1);
+      info.push_back(getPartition());
+    }
+  }
+  info[0] = info.size() - 1;
+  std::vector<int> verts;
+  getVerticesIdForMSH(verts);
+  info.insert(info.end(), verts.begin(), verts.end());
+
   if(!binary){
-    fprintf(fp, "%d %d", _num, type);
+    fprintf(fp, "%d %d", num, type);
     for(unsigned int i = 0; i < info.size(); i++)
       fprintf(fp, " %d", info[i]);
     fprintf(fp, "\n");
   }
   else{
-    fwrite(&_num, sizeof(int), 1, fp);
+    fwrite(&num, sizeof(int), 1, fp);
     fwrite(&type, sizeof(int), 1, fp);
     fwrite(&info[0], sizeof(int), info.size(), fp);
   }
@@ -1225,10 +1228,10 @@ int MElement::getInfoMSH(const int typeMSH, const char **const name)
   case MSH_PYR_13  : if(name) *name = "Pyramid 13";       return 5 + 8;
   case MSH_PYR_14  : if(name) *name = "Pyramid 14";       return 5 + 8 + 1;
   case MSH_POLYH_  : if(name) *name = "Polyhedron";       return 0;
-  case MSH_PNT_SUB: if(name) *name = "Point Xfem";      return 1;
-  case MSH_LIN_SUB: if(name) *name = "Line Xfem";       return 2;
-  case MSH_TRI_SUB: if(name) *name = "Triangle Xfem";   return 3;
-  case MSH_TET_SUB: if(name) *name = "Tetrahedron Xfem";return 4;
+  case MSH_PNT_SUB : if(name) *name = "Point Xfem";       return 1;
+  case MSH_LIN_SUB : if(name) *name = "Line Xfem";        return 2;
+  case MSH_TRI_SUB : if(name) *name = "Triangle Xfem";    return 3;
+  case MSH_TET_SUB : if(name) *name = "Tetrahedron Xfem"; return 4;
   default:
     Msg::Error("Unknown type of element %d", typeMSH);
     if(name) *name = "Unknown";
diff --git a/Geo/MElement.h b/Geo/MElement.h
index d1d33ad50c..7630b6664d 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -40,10 +40,6 @@ class MElement
                    int faceIndex=-1);
   void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
                    double *x, double *y, double *z, SVector3 *n);
-  // fill the vector of integers that will be written after the element number
-  // and type in writeMSH
-  virtual void _fillInfoMSH(std::vector<int> &info, int elementary=1,
-                            std::vector<short> *ghosts=0);
  public :
   MElement(int num=0, int part=0);
   virtual ~MElement(){}
diff --git a/Geo/MSubElement.cpp b/Geo/MSubElement.cpp
index 6dcdf8d79a..7640a3eb06 100644
--- a/Geo/MSubElement.cpp
+++ b/Geo/MSubElement.cpp
@@ -16,22 +16,6 @@ MSubTetrahedron::~MSubTetrahedron()
     delete _orig;
 }
 
-void MSubTetrahedron::_fillInfoMSH(std::vector<int> &info, int elementary,
-                                   std::vector<short> *ghosts)
-{
-  info.clear();
-  info.push_back(0);
-  info.push_back(getParent()->getNum());
-  if(getPartition())
-    info.push_back(getPartition());
-  if(ghosts)
-    info.insert(info.end(), ghosts->begin(), ghosts->end());
-  info[0] = info.size() - 1;
-  std::vector<int> verts;
-  getVerticesIdForMSH(verts);
-  info.insert(info.end(), verts.begin(), verts.end());
-}
-
 const polynomialBasis* MSubTetrahedron::getFunctionSpace(int order) const
 {
   if(_orig) return _orig->getFunctionSpace(order);
@@ -130,22 +114,6 @@ MSubTriangle::~MSubTriangle()
     delete _orig;
 }
 
-void MSubTriangle::_fillInfoMSH(std::vector<int> &info, int elementary,
-                                std::vector<short> *ghosts)
-{
-  info.clear();
-  info.push_back(0);
-  info.push_back(getParent()->getNum());
-  if(getPartition())
-    info.push_back(getPartition());
-  if(ghosts)
-    info.insert(info.end(), ghosts->begin(), ghosts->end());
-  info[0] = info.size() - 1;
-  std::vector<int> verts;
-  getVerticesIdForMSH(verts);
-  info.insert(info.end(), verts.begin(), verts.end());
-}
-
 const polynomialBasis* MSubTriangle::getFunctionSpace(int order) const
 {
   if(_orig) return _orig->getFunctionSpace(order);
@@ -241,22 +209,6 @@ MSubLine::~MSubLine()
     delete _orig;
 }
 
-void MSubLine::_fillInfoMSH(std::vector<int> &info, int elementary,
-                            std::vector<short> *ghosts)
-{
-  info.clear();
-  info.push_back(0);
-  info.push_back(getParent()->getNum());
-  if(getPartition())
-    info.push_back(getPartition());
-  if(ghosts)
-    info.insert(info.end(), ghosts->begin(), ghosts->end());
-  info[0] = info.size() - 1;
-  std::vector<int> verts;
-  getVerticesIdForMSH(verts);
-  info.insert(info.end(), verts.begin(), verts.end());
-}
-
 const polynomialBasis* MSubLine::getFunctionSpace(int order) const
 {
   if(_orig) return _orig->getFunctionSpace(order);
@@ -347,22 +299,6 @@ MSubPoint::~MSubPoint()
     delete _orig;
 }
 
-void MSubPoint::_fillInfoMSH(std::vector<int> &info, int elementary,
-                             std::vector<short> *ghosts)
-{
-  info.clear();
-  info.push_back(0);
-  info.push_back(getParent()->getNum());
-  if(getPartition())
-    info.push_back(getPartition());
-  if(ghosts)
-    info.insert(info.end(), ghosts->begin(), ghosts->end());
-  info[0] = info.size() - 1;
-  std::vector<int> verts;
-  getVerticesIdForMSH(verts);
-  info.insert(info.end(), verts.begin(), verts.end());
-}
-
 const polynomialBasis* MSubPoint::getFunctionSpace(int order) const
 {
   if(_orig) return _orig->getFunctionSpace(order);
diff --git a/Geo/MSubElement.h b/Geo/MSubElement.h
index 563686b404..4f241d1fac 100644
--- a/Geo/MSubElement.h
+++ b/Geo/MSubElement.h
@@ -24,8 +24,6 @@ class MSubTetrahedron : public MTetrahedron
   MElement* _orig;
   std::vector<MElement*> _parents;
   IntPt *_intpt;
-  virtual void _fillInfoMSH(std::vector<int> &info, int elementary=1,
-                            std::vector<short> *ghosts=0);
  public:
   MSubTetrahedron(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3, int num=0,
                   int part=0, bool owner=false, MElement* orig=NULL)
@@ -61,8 +59,6 @@ class MSubTriangle : public MTriangle
   MElement* _orig;
   std::vector<MElement*> _parents;
   IntPt *_intpt;
-  virtual void _fillInfoMSH(std::vector<int> &info, int elementary=1,
-                            std::vector<short> *ghosts=0);
  public:
   MSubTriangle(MVertex *v0, MVertex *v1, MVertex *v2, int num=0, int part=0,
                bool owner=false, MElement* orig=NULL)
@@ -97,8 +93,6 @@ class MSubLine : public MLine
   MElement* _orig;
   std::vector<MElement*> _parents;
   IntPt *_intpt;
-  virtual void _fillInfoMSH(std::vector<int> &info, int elementary=1,
-                            std::vector<short> *ghosts=0);
  public:
   MSubLine(MVertex *v0, MVertex *v1, int num=0, int part=0, bool owner=false, MElement* orig=NULL)
     : MLine(v0, v1, num, part), _owner(owner), _orig(orig), _intpt(0) {}
@@ -132,8 +126,6 @@ class MSubPoint : public MPoint
   MElement* _orig;
   std::vector<MElement*> _parents;
   IntPt *_intpt;
-  virtual void _fillInfoMSH(std::vector<int> &info, int elementary=1,
-                            std::vector<short> *ghosts=0);
  public:
   MSubPoint(MVertex *v0, int num=0, int part=0, bool owner=false, MElement* orig=NULL)
     : MPoint(v0, num, part), _owner(owner), _orig(orig), _intpt(0) {}
-- 
GitLab