From 94a8223fa18b9c6b7a5fbabb47f98f40a3450b58 Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Thu, 21 Apr 2016 16:55:32 +0000
Subject: [PATCH] mesh compound v 1.0 beta

---
 Geo/GFace.cpp            | 50 ++++++++++++++++++++++++++++++++++++----
 Geo/discreteDiskFace.cpp | 24 ++++---------------
 Mesh/Generator.cpp       |  7 ++++--
 3 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index ddec9f76ac..68295e6da7 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -18,6 +18,7 @@
 #include "GaussLegendre1D.h"
 #include "Context.h"
 #include "OS.h"
+#include "discreteFace.h"
 
 #if defined(HAVE_MESH)
 #include "meshGFace.h"
@@ -1376,26 +1377,65 @@ bool GFace::fillPointCloud(double maxDist,
   return true;
 }
 
+
+#if defined(HAVE_MESH)
+static void meshCompound (GFace* gf, bool verbose) {
+
+  discreteFace *df = new discreteFace (gf->model(), gf->tag() + 100000);
+  
+  std::set<int> ec;
+  for (unsigned int i=0;i<gf->_compound.size();i++){
+    GFace *c = (GFace*)gf->_compound[i];
+    std::list<GEdge*> edges = c->edges();
+    for (std::list<GEdge*> :: iterator it = edges.begin() ; it != edges.end(); ++it){
+      std::set<int>::iterator found = ec.find((*it)->tag());
+      if (found == ec.end())ec.insert((*it)->tag());
+      else ec.erase(found);
+    }
+    df->triangles.insert(df->triangles.begin(), c->triangles.begin(),c->triangles.end());
+    df->mesh_vertices.insert(df->mesh_vertices.begin(), c->mesh_vertices.begin(),c->mesh_vertices.end());
+    c->triangles.clear();
+    c->mesh_vertices.clear();
+  }
+  std::vector<int> cedges;
+  cedges.insert(cedges.begin(), ec.begin(), ec.end());
+  df->setBoundEdges(gf->model(), cedges);
+  df->createGeometry();
+  df->mesh(verbose);
+  gf->triangles = df->triangles;
+  for (unsigned int i=0;i<df->mesh_vertices.size();i++){
+    MVertex *v = df->mesh_vertices[i];
+    v->setEntity(gf);
+    gf->mesh_vertices.push_back(v);
+  }
+  df->triangles.clear();
+  df->mesh_vertices.clear();
+
+  delete df;
+}
+#endif
+
 void GFace::mesh(bool verbose)
 {
 #if defined(HAVE_MESH)
 
   meshGFace mesher;
   mesher(this, verbose);
-
-  /*
   if (!_compound.empty()){ // Some faces are meshed together 
     if (_compound[0] == this){ //  I'm the one that makes the compound job
       bool ok = true;
-      for (unsigned int i=0;i<_compound.size();i++)
-	ok &= (_compound[i]->meshStatistics.status == GFace::PENDING);            
+      for (unsigned int i=0;i<_compound.size();i++){
+	GFace *gf = (GFace*)_compound[i];
+	ok &= (gf->meshStatistics.status == GFace::DONE);            
+      }
       if (!ok)meshStatistics.status = GFace::PENDING;
       else {
+	meshCompound(this, verbose);
 	return;
       }
     }
   }
-  */  
+    
 #endif
 }
 
diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp
index 95632f6046..11693baf26 100644
--- a/Geo/discreteDiskFace.cpp
+++ b/Geo/discreteDiskFace.cpp
@@ -226,20 +226,6 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int
   _order = p;
   _N = (p+1)*(p+2)/2;
 
-  int tagElementOrder;
-  switch (_order){
-  case 1:
-    tagElementOrder = MSH_TRI_3;
-    break;
-  case 2:
-    tagElementOrder = MSH_TRI_6;
-    break;
-  default:
-    tagElementOrder = -1;
-    Msg::Error("discreteDiskFace:: only p=1 or p=2 allowed");
-  }
-  //mynodalbasis = BasisFactory::getNodalBasis(tagElementOrder);
-
   std::map<MVertex*,MVertex*> v2v;// mesh vertex |-> face vertex
   std::map<MEdge,MVertex*,Less_Edge> ed2nodes; // edge to interior node(s)
   for (unsigned int i=0;i<mesh.size();i++){ // triangle by triangle
@@ -248,10 +234,10 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int
     for (unsigned int j=0; j<3; j++){ // loop over vertices AND edges of the current triangle
 
       MVertex *v = mesh[i]->getVertex(j);// firstly, edge vertices
-      if (v->onWhat() == gf) {
+      if (v->onWhat()->dim() == 2) {
 	std::map<MVertex*,MVertex*> :: iterator it = v2v.find(v);
 	if (it == v2v.end()){
-	  MFaceVertex *vv = new MFaceVertex ( v->x(),  v->y(),  v->z(), this, 0, 0);
+	  MFaceVertex *vv = new MFaceVertex ( v->x(),  v->y(),  v->z(), v->onWhat(), 0, 0);
 	  v2v[v] = vv;
 	  discrete_vertices.push_back(vv);
 	  vs.push_back(vv);
@@ -263,7 +249,7 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh, int
 	  discreteEdge *de = dynamic_cast<discreteEdge*> (v->onWhat());
 	  vs.push_back(de->getGeometricalVertex(v));
 	}
-	else Msg::Fatal("fatality");
+	else vs.push_back(v);
       }
       else vs.push_back(v);
     }
@@ -311,8 +297,6 @@ discreteDiskFace::~discreteDiskFace()
   if (oct)Octree_Delete(oct);
 }
 
-
-
 void discreteDiskFace::getBoundingEdges()
 {
 
@@ -383,7 +367,7 @@ void discreteDiskFace::getBoundingEdges()
 	    if (!(current->getVertex(k!=2 ?k+1 : 0 ) == neigs[i]->getVertex(j!=0 ? j-1 : 2) ||
 		  current->getVertex(k!=0 ?k-1 : 2 ) == neigs[i]->getVertex(j!=2 ? j+1 : 0))){
 	      neigs[i]->reverse();
-	      std::cout << "discreteDiskFace: triangle " << neigs[i]->getNum() << " has been reoriented." << std::endl;
+	      //	      std::cout << "discreteDiskFace: triangle " << neigs[i]->getNum() << " has been reoriented." << std::endl;
 	    }
 	    break;
 	  }
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index 82920af382..b2564396b8 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -784,6 +784,9 @@ static void Mesh3D(GModel *m)
           opt(gr);
         }
         double a = Cpu();
+
+	CTX::instance()->mesh.recombine3DLevel = 2;
+
         if (CTX::instance()->mesh.recombine3DLevel >= 0){
           Recombinator rec;
           rec.execute(gr);
@@ -793,8 +796,8 @@ static void Mesh3D(GModel *m)
           sup.execute(gr);
         }
         PostOp post;
-        post.execute(gr,CTX::instance()->mesh.recombine3DLevel,
-		     CTX::instance()->mesh.recombine3DConformity);
+	post.execute(gr,CTX::instance()->mesh.recombine3DLevel,3);
+	//			     CTX::instance()->mesh.recombine3DConformity);
         // 0: no pyramid, 1: single-step, 2: two-steps (conforming),
         // true: fill non-conformities with trihedra
         // while(LaplaceSmoothing (gr)){
-- 
GitLab