From 6e2d6d78936b51ee238605fb993e960d65179470 Mon Sep 17 00:00:00 2001
From: Amaury Johnan <amjohnen@gmail.com>
Date: Wed, 4 Jan 2012 10:57:52 +0000
Subject: [PATCH]

---
 Mesh/meshRecombine2D.h     |   5 +-
 Mesh/meshRecombine2D_2.cpp | 184 ++++++++++++++++++++++++-------------
 2 files changed, 122 insertions(+), 67 deletions(-)

diff --git a/Mesh/meshRecombine2D.h b/Mesh/meshRecombine2D.h
index 31aab68bc1..f0be64f148 100644
--- a/Mesh/meshRecombine2D.h
+++ b/Mesh/meshRecombine2D.h
@@ -336,7 +336,7 @@ class Rec2d_vertex {
   
   public :
     Rec2d_vertex(MVertex *, std::list<MTriangle*> &,
-                 std::map<MVertex*, std::set<GEdge*> > &);
+                 std::map<MVertex*, std::set<GEdge*> > &, bool);
     
     inline void changeNumEl(int c) {_numEl += c;}
     double getReward();
@@ -407,6 +407,9 @@ class TrianglesUnion {
       return _ValEdge/_NumEdge * _ValVert/_NumVert * _ValVert/_NumVert;
     }
   
+    static void clear() {_NumEdge = 0; _NumVert = 0;
+      _ValEdge = .0, _ValVert = .0;}
+
   private:  
     double _computeEdgeLength(GFace*, MVertex**, double *u, double *v,
                               int numIntermedPoint= 1);
diff --git a/Mesh/meshRecombine2D_2.cpp b/Mesh/meshRecombine2D_2.cpp
index dccf2ed103..3bd734bcc6 100644
--- a/Mesh/meshRecombine2D_2.cpp
+++ b/Mesh/meshRecombine2D_2.cpp
@@ -18,7 +18,8 @@
 #include "OpenFile.h"//pas propre
 #include "Field.h"
 #include "OS.h"
-#define HORIZ2 2
+#define HORIZ2 1
+#define SMOOTH 0
 
 double **Rec2d_vertex::_Vvalues = NULL;
 double **Rec2d_vertex::_Vbenefs = NULL;
@@ -31,20 +32,23 @@ int Recombine2D::ra = 0;
 
 /*
   a faire :
-  - modifier gain des edges
   - fonction retournant qualite
   - verifier la qualite
   - action supplementaire (faire classe de base)
   - Faire un super conteneur pour les actions
   - pourquoi infini
+  - pourquoi premier pas meilleur
   - implementer field
-  - si qu1, ajouter (Comment g�rer)
-  - limiter sequence
+  ~ limiter sequence
 */
 
 Recombine2D::Recombine2D(GFace *gf)
 : _horizon(0), _gf(gf), _benef(.0), _applied(true)
-{ 
+{
+  //GModel::current()->createTopologyFromMesh(1);
+  int popopo = 0;
+  
+  TrianglesUnion::clear();
   Msg::Warning("[meshRecombine2D] Alignement computation ok uniquely for xy or yz plane mesh !");
   
   // be able to compute geometrical angle at corners
@@ -65,11 +69,15 @@ Recombine2D::Recombine2D(GFace *gf)
   // Find all Vertices and edges
   std::map<MVertex*, std::list<MTriangle*> > mapVert;
   std::map<MEdge, std::list<MTriangle*>, Less_Edge> mapEdge;
+  std::map<MVertex*, std::list<MEdge> > mapVtoE;
   for (unsigned int i = 0; i < gf->triangles.size(); i++) {
     MTriangle *t = gf->triangles[i];
     for (int j = 0; j < 3; j++) {
       mapVert[t->getVertex(j)].push_back(t);
       mapEdge[t->getEdge(j)].push_back(t);
+      for (int k = 0; k < 3; k++) {
+        mapVtoE[t->getVertex(j)].push_back(t->getEdge(k));
+      }
     }
   }
   
@@ -81,7 +89,13 @@ Recombine2D::Recombine2D(GFace *gf)
   for (; itvert != mapVert.end(); itvert++) {
     if (itvert->second.size() == 4 && itvert->first->onWhat()->dim() == 2)
       fourTri.push_back(itvert);
-    Rec2d_vertex *n = new Rec2d_vertex(itvert->first, itvert->second, mapCornerVert);
+    std::list<MEdge>::iterator itti = mapVtoE[itvert->first].begin();
+    bool ab = false;
+    for (; itti != mapVtoE[itvert->first].end(); ++itti) {
+      if (mapEdge[*itti].size() == 1) ab = true;
+    }
+    if (ab) ++popopo;
+    Rec2d_vertex *n = new Rec2d_vertex(itvert->first, itvert->second, mapCornerVert, ab);
     itV2N = mapV2N.insert(itV2N, std::make_pair(itvert->first,n));
     TrianglesUnion::_NumVert++;
     TrianglesUnion::_ValVert += n->getReward();
@@ -168,8 +182,8 @@ Recombine2D::Recombine2D(GFace *gf)
   TrianglesUnion::addRec();
   //_setQuads.sort(lessTriUnion());
   
-  laplaceSmoothing(_gf,10);
-  
+  if (SMOOTH) laplaceSmoothing(_gf,10);
+  Msg::Error("%d", popopo);
   _recombine(true);
   _applied = false;
 }
@@ -181,12 +195,13 @@ void Recombine2D::_recombine(bool a)
   
   int i = 0;
   std::list<TrianglesUnion*> vectTu;
+  TrianglesUnion::addRec();
   
   while (!_setQuads.empty() && i < 2000) {
     TrianglesUnion *tu;
-  laplaceSmoothing(_gf,1);
-    if (/*true ||*/ _lastQuad.empty()) {
-      if (vectTu.size() < 2)
+  if (SMOOTH) laplaceSmoothing(_gf,1);
+    if (_lastQuad.empty()) {
+      if (/*true ||*/ vectTu.size() < 2 || i % 1 == 0)
         tu = *std::max_element(_setQuads.begin(), _setQuads.end(), lessTriUnion());
       else {
         vectTu.pop_front();
@@ -197,7 +212,7 @@ void Recombine2D::_recombine(bool a)
       vectTu.insert(vectTu.begin(), tu);
       
             Msg::Info("------------------ %d", _setQuads.size());
-      _lookAhead2(vectTu, HORIZ2);
+      _lookAhead(vectTu, HORIZ2);
     }
     else {
       tu = *_lastQuad.begin();
@@ -224,7 +239,7 @@ void Recombine2D::_recombine(bool a)
     tu->select();
     _quads.push_back(tu->createQuad());
     _removeImpossible(tu);
-    { // draw Mesh
+    if (i % 5 == 0) { // draw Mesh
       Msg::Info("Expected return %lf", tu->getReturn());
       _applied = false;
       apply(true);
@@ -359,7 +374,7 @@ void Recombine2D::_lookAhead(std::list<TrianglesUnion*> &candidate, int horiz)
     if (/*true ||*/ best /*|| (((int)(Cpu()*100) - t) % 5 == 0 && newt)*/) { // draw mesh
       newt = false;
       apply(false);
-  laplaceSmoothing(_gf,1);
+  if (SMOOTH) laplaceSmoothing(_gf,1);
       CTX::instance()->mesh.changed = (ENT_ALL);
       FlGui::instance()->check();
       drawContext::global()->draw();
@@ -455,31 +470,39 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
   int num=0;
   
   while (current > 0) {
+        //Msg::Info(" ");
     bool best = false;
-    // set first acceptable action for each step
+    // add max of actions in sequence
     while (current < horiz && vecIt[current-1] != la.end()) {
       vecIt[current] = vecIt[current-1];
+      //vecIt[current].print();
       while (++vecIt[current] != lastLayer[currentLayer]
+             && vecIt[current] != la.end()
              && (*vecIt[current])->isIn(setTri)         );
-      vecIt[current].print(); lastLayer[currentLayer].print();
-      if (vecIt[current] != lastLayer[currentLayer]) {
+      if (vecIt[current] != lastLayer[currentLayer] && vecIt[current] == la.end())
+        {Msg::Error("Ca a foir� mec");Msg::Error(" ");}
+      if (vecIt[current] != lastLayer[currentLayer] && vecIt[current] != la.end()) {
         (*vecIt[current])->addTri(setTri);
         (*vecIt[current])->addInfluence(numbers, values, modifiedVert);
+        if (currentLayer < maxLayer) {
+          if (current == numLayer[currentLayer])
+            lastLayer[currentLayer] = --la.end();
+          _addNeighbors(horiz, vecIt, current, &la);
+          if (current == numLayer[currentLayer])
+            ++lastLayer[currentLayer];
+          lastLayer[currentLayer+1] = la.end();
+        }
         ++current;
       }
       else {
-        Msg::Info("in else");
+        //Msg::Info("in else");
         if (!haveSequence) {
           ++maxLayer;
-          list_actions::iterator it = --la.end();
-          //it.print();
-          //la.sizes();
+          --lastLayer[currentLayer];
           for (int i = numLayer[currentLayer]; i < current; ++i) {
             _addNeighbors(horiz, vecIt, i, &la);
           }
-          //la.sizes();
-          lastLayer[currentLayer] = ++it;
-          //it.print();
+          ++lastLayer[currentLayer];
           ++currentLayer;
           lastLayer[currentLayer] = la.end();
           numLayer[currentLayer] = current;
@@ -488,30 +511,28 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
           /*for (int i = numLayer[currentLayer]; i < current; ++i) {
             _addNeighbors(horiz, vecIt, i, &la);
           }*/
+          //Msg::Error("++layer'");
           ++currentLayer;
           lastLayer[currentLayer] = la.end();
           numLayer[currentLayer] = current;
         }
-        else
+        else{
+          //Msg::Error("++current : %d/%d", current, horiz);
+          //if(lastLayer[currentLayer] != la.end())
+          //Msg::Error(" ");
           ++current;
-        
-        
-        /*if (!haveSequence)
-          ++maxLayer;
-        if (currentLayer < maxLayer) {
-          for (int i = numLayer[currentLayer]; i < current; ++i) {
-            _addNeighbors(horiz, vecIt, i, &la);
-          }
-          ++currentLayer;
-          lastLayer[currentLayer] = la.end();
-          numLayer[currentLayer] = current;
         }
-        else
-          ++current;*/
       }
     }
     haveSequence = true;
-    Msg::Info("maxLayer %d, current %d", maxLayer, current);
+    //Msg::Info("maxLayer %d, current %d", maxLayer, current);
+    
+/*Msg::Info("LAYER %d - num{%d,%d} - last :", currentLayer, numLayer[0], numLayer[1]);
+lastLayer[0].print();
+lastLayer[1].print();
+Msg::Info("current %d - iterator : ", current-1);
+vecIt[current-1].print();
+Msg::Info(" ");*/
 
     { // color
       for (int i = 1; i < current &&  vecIt[i] != la.end(); ++i) {
@@ -552,6 +573,14 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
           }
         }
       }
+      else { //color
+        TrianglesUnion *tu = *vecIt[0];
+        unsigned int col;
+        col = CTX::instance()->packColor(190, 130, 0, 255);
+        for (int j = 0; j < tu->getNumTriangles(); ++j) {
+          tu->getTriangle(j)->setCol(col);
+        }
+      }
     }
     else { //color
       TrianglesUnion *tu = *vecIt[0];
@@ -562,7 +591,7 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
       }
     }
     
-    if (true || best /*|| (((int)(Cpu()*100) - t) % 5 == 0 && newt)*/) { // draw mesh
+    if (/*true ||*/ best /*|| (((int)(Cpu()*100) - t) % 5 == 0 && newt)*/) { // draw mesh
       //newt = false;
       apply(false);
       CTX::instance()->mesh.changed = (ENT_ALL);
@@ -575,7 +604,7 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
       double t = Cpu();
       while (Cpu() - t < .0001);
       //if (i % 1 == 0)
-      if (/*false && best &&*/ !Msg::GetAnswer("Continue ?", 1, "no", "yes"))
+      if (false && best && !Msg::GetAnswer("Continue ?", 1, "no", "yes"))
         Msg::Info("I continue anyway :p");
       best = false;
     }
@@ -595,28 +624,39 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
       }
     }
     
-    if (vecIt[current-1] != lastLayer[currentLayer] ||
-        --current - 1 >= numLayer[currentLayer] ||
-        --currentLayer >= 0                           ) {
-      bool lessLayer = false;
+    if (vecIt[current-1] != la.end() || --current > 0) {
       do {
+        while (current-1 < numLayer[currentLayer])
+          --currentLayer;
         (*vecIt[current-1])->removeTri(setTri);
         (*vecIt[current-1])->removeInfluence(numbers, values, modifiedVert);
-        Msg::Info("current %d, currentLayer %d", current, currentLayer);
+        //Msg::Info(" - current %d, currentLayer %d", current, currentLayer);
         if (currentLayer < maxLayer) {
           _removeNeighbors(horiz, current - 1, &la);
-          lastLayer[currentLayer+1] = la.end();
           if (current-1 == numLayer[currentLayer])
             lastLayer[currentLayer] = la.end();
+          else
+            lastLayer[currentLayer+1] = la.end();
         }
-        while (++vecIt[current-1] != lastLayer[currentLayer]
-               && (*vecIt[current-1])->isIn(setTri)         );
-        Msg::Info("b %d, %d - %d, %d", vecIt[current-1] == lastLayer[currentLayer], current, numLayer[currentLayer], currentLayer);
-      } while (vecIt[current-1] == lastLayer[currentLayer] &&
-               (--current - 1 >= numLayer[currentLayer] ||
-                --currentLayer >= 0                       )  );
-        Msg::Info("current %d, currentLayer %d", current, currentLayer);
-      if (current > 0 && currentLayer >= 0) {
+        while (++vecIt[current-1] != la.end() && (*vecIt[current-1])->isIn(setTri)) {
+          //Msg::Info(" - - curent %d & layer %d & numLayer %d", current, currentLayer, numLayer[currentLayer]);
+          //vecIt[current-1].print(); lastLayer[currentLayer].print();
+          if (vecIt[current-1] == lastLayer[currentLayer]) {
+            //Msg::Warning("++layer");
+            ++currentLayer;
+            numLayer[currentLayer] = current - 1;
+          }
+        }
+        if (currentLayer < maxLayer && vecIt[current-1] == lastLayer[currentLayer]) {
+          //Msg::Warning("++ layer");
+          //vecIt[current-1].print(); lastLayer[currentLayer].print();
+          ++currentLayer;
+          numLayer[currentLayer] = current - 1;
+        }
+        //Msg::Info("b %d, %d - %d, %d", vecIt[current-1] == lastLayer[currentLayer], current-2, numLayer[currentLayer], currentLayer);
+      } while (vecIt[current-1] == la.end() && --current > 0);
+        //Msg::Info("current %d, currentLayer %d", current, currentLayer);
+      if (current > 0) {
         (*vecIt[current-1])->addTri(setTri);
         (*vecIt[current-1])->addInfluence(numbers, values, modifiedVert);
         if (currentLayer < maxLayer) {
@@ -629,9 +669,17 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
         }
       }
     }
+/*    if (current > 0) {
+Msg::Info("layer %d - num{%d,%d} - last :", currentLayer, numLayer[0], numLayer[1]);
+lastLayer[0].print();
+lastLayer[1].print();
+Msg::Info("current %d - iterator : ", current-1);
+vecIt[current-1].print();
+Msg::Info(" ");
+}*/
   }
   
-  { // color
+  /*{ // color
     for (int i = 1; i < bestSequence.size(); ++i) {
       TrianglesUnion *tu = bestSequence[i].first;
       unsigned int col = CTX::instance()->packColor(50, 200, 0, 255);
@@ -639,7 +687,7 @@ void Recombine2D::_lookAhead2(std::list<TrianglesUnion*> &candidate, int horiz)
         tu->getTriangle(j)->setCol(col);
       }
     }
-  }
+  }*/
 
   candidate.clear();
   for (int i = 0; i < bestSequence.size(); ++i) {
@@ -655,6 +703,7 @@ void Recombine2D::_getIncompatibles(const TrianglesUnion *tu, setTriUnion &set)
       it = _possibleActions.find(tu->getTriangle(i));
       if (it == _possibleActions.end()) {
         Msg::Error("[Rec2D] error no triangle !, stopping with partially filled set");
+        Msg::Error(" ");
       }
       _lessActions.insert(*it);
     }
@@ -853,14 +902,15 @@ int Recombine2D::apply(bool a)
 {
   //Msg::Info("(%d, %d, %d)", _quads.size(), _gf->triangles.size(), _isolated.size());
   if (a) {
-    std::vector<MTriangle*> triangles2;
-    for (int i = 0; i < _gf->triangles.size(); i++) {
-      if (_isolated.find(_gf->triangles[i]) != _isolated.end())
-        delete _gf->triangles[i];
-      else
-        triangles2.push_back(_gf->triangles[i]);
-    }
-    _gf->triangles = triangles2;
+    _gf->triangles.clear();
+    //std::vector<MTriangle*> triangles2;
+    //for (int i = 0; i < _gf->triangles.size(); i++) {
+    //  if (_isolated.find(_gf->triangles[i]) != _isolated.end())
+    //    delete _gf->triangles[i];
+    //  else
+    //    triangles2.push_back(_gf->triangles[i]);
+    //}
+    //_gf->triangles = triangles2;
     _gf->quadrangles = _quads;
     _isolated.clear();
   }
@@ -943,10 +993,11 @@ void Recombine2D::_removeImpossible(TrianglesUnion *tu)
 
 Rec2d_vertex::Rec2d_vertex(MVertex *v,
                            std::list<MTriangle*> &setTri,
-                           std::map<MVertex*, std::set<GEdge*> > &mapVert)
+                           std::map<MVertex*, std::set<GEdge*> > &mapVert, bool a)
 : _numEl(setTri.size()), _angle(.0)
 {
   _onWhat = v->onWhat()->dim() - 1;
+  if (a) _onWhat = 1;
   
   if (_onWhat < 0) {
     std::map<MVertex*, std::set<GEdge*> >::iterator it = mapVert.find(v);
@@ -1141,6 +1192,7 @@ TrianglesUnion::TrianglesUnion(GFace *gf,
     double length = _computeEdgeLength(gf, vert, u, v, 0);
     double a = .0;
     _boundEdgeValue += length / sumlc * (a + (2-a)*_computeAlignment(*ite2, t, mapEdge));
+    _boundEdgeValue = 1;
   }
   _boundEdgeValue /= 2.;
   _numboundEdge = 2;
-- 
GitLab