From 74aaa18ebf5b01231cb2f4b163954507a074d855 Mon Sep 17 00:00:00 2001
From: Amaury Johnan <amjohnen@gmail.com>
Date: Wed, 15 Feb 2012 15:59:48 +0000
Subject: [PATCH]

---
 Mesh/meshGFaceRecombine.cpp | 41 +++++++++++++++++++++++--------------
 Mesh/meshGFaceRecombine.h   |  3 +--
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index 1bc42878ec..e17b72ff11 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -19,6 +19,7 @@
 #include "MTriangle.h"
 #include "MQuadrangle.h"
 #include "PView.h"
+#include "meshGFace.h"
 #ifdef REC2D_SMOOTH
   #include "meshGFaceOptimize.h"
 #endif
@@ -50,6 +51,8 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf)
   }
   Recombine2D::_current = this;
   
+  orientMeshGFace orienter;
+  orienter(_gf);
   Rec2DVertex::initStaticTable();
   backgroundMesh::set(_gf);
   _bgm = backgroundMesh::current();
@@ -57,13 +60,17 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf)
   _numChange = 0;
   
   static int po = -1;
-  if (po < 1)
+  if (++po < 1)
     Msg::Warning("FIXME Why {mesh 2} then {mesh 0} then {mesh 2} imply not corner vertices");
   
   static int pi = -1;
-  if (pi < 1)
+  if (++pi < 1)
     Msg::Warning("FIXME Why more vertices after first mesh generation");
   
+  static int pu = -1;
+  if (++pu < 1)
+    Msg::Error("FIXME QualAngle et application action...");
+  
   // Be able to compute geometrical angle at corners
   std::map<MVertex*, AngleData> mapCornerVert;
   {
@@ -84,7 +91,6 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf)
     // triangles
     for (unsigned int i = 0; i < gf->triangles.size(); ++i) {
       MTriangle *t = gf->triangles[i];
-      //Msg::Info("[%d %d %d]", t->getVertex(0)->getNum(), t->getVertex(1)->getNum(), t->getVertex(2)->getNum());
       t->setVolumePositive();
       static int tia = -1;
       if (++tia < 1) Msg::Warning("FIXME Sometimes negative volume");
@@ -105,7 +111,7 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf)
           rv[j] = new Rec2DVertex(v);
           mapVert[v] = rv[j];
         }
-        rv[j]->add(rel, false); //up data
+        rv[j]->add(rel, false);
       }
       for (int j = 0; j < 3; ++j) {
         Rec2DEdge *re;
@@ -244,10 +250,6 @@ bool Recombine2D::recombine()
     delete nextAction;
   }
   
-  //Rec2DData::iter_rv it = Rec2DData::firstVertex();
-  //for (; it != Rec2DData::lastVertex(); ++it) {
-  //  Msg::Info("%d -> %g", (*it)->getMVertex()->getNum(), (*it)->getQualAngle());
-  //}
   _data->printState();
 #ifdef REC2D_SMOOTH
     laplaceSmoothing(_gf,100);
@@ -980,11 +982,13 @@ Rec2DTwoTri2Quad::~Rec2DTwoTri2Quad()
 
 void Rec2DTwoTri2Quad::_computeGlobVal()
 {
-  double valEdge = - REC2D_EDGE_BASE * _edges[4]->getQual();
+  double valEdge = -REC2D_EDGE_BASE * _edges[4]->getQual();
   for (int i = 0; i < 4; ++i)
     valEdge += REC2D_EDGE_QUAD * _edges[i]->getQual();
   
   double valVert = _vertices[0]->getGain(-1) + _vertices[1]->getGain(-1);
+  valVert += _vertices[0]->getGainMerge(_triangles[0], _triangles[1]);
+  valVert += _vertices[1]->getGainMerge(_triangles[0], _triangles[1]);
   
   _globValIfExecuted =
     Rec2DData::getGlobalValue(4*REC2D_EDGE_QUAD - REC2D_EDGE_BASE,
@@ -1421,8 +1425,6 @@ void Rec2DVertex::initQualAngle()
   for (unsigned int i = 0; i < _elements.size(); ++i)
     _sumQualAngle += _angle2Qual(_elements[i]->getAngle(this));
   Rec2DData::addVert(1, _sumQualAngle/_elements.size());
-  //if (_v->getNum() < 5)
-  //  Msg::Info("ini %d %g", _v->getNum(), _sumQualAngle/_elements.size());
 }
 
 Rec2DEdge* Rec2DVertex::getCommonEdge(Rec2DVertex *rv0, Rec2DVertex *rv1)
@@ -1645,6 +1647,17 @@ double Rec2DVertex::getGain(int n) const
          - fabs(2./M_PI * _angle/(_elements.size() + n) - 1.);
 }
 
+double Rec2DVertex::getGainMerge(Rec2DElement *rel1, Rec2DElement *rel2)
+{
+  double diffQualAngle;
+  diffQualAngle = _angle2Qual(rel1->getAngle(this) + rel2->getAngle(this));
+  diffQualAngle -= _angle2Qual(rel1->getAngle(this));
+  diffQualAngle -= _angle2Qual(rel2->getAngle(this));
+  
+  return (_sumQualAngle + diffQualAngle) / (_elements.size() - 1)
+         - _sumQualAngle / _elements.size();
+}
+
 void Rec2DVertex::add(Rec2DEdge *re)
 {
   for (unsigned int i = 0; i < _edges.size(); ++i) {
@@ -1698,8 +1711,6 @@ void Rec2DVertex::add(Rec2DElement *rel, bool compQualAngle)
   _elements.push_back(rel);
   if (_isMesh && compQualAngle)
     Rec2DData::addValVert(_sumQualAngle/_elements.size());
-  //if (_v->getNum() < 5)
-  //  Msg::Info("add %d %g", _v->getNum(), _sumQualAngle/_elements.size());
 }
 
 bool Rec2DVertex::has(Rec2DElement *rel) const
@@ -1723,8 +1734,6 @@ void Rec2DVertex::remove(Rec2DElement *rel)
       _elements.pop_back();
       if (_isMesh && !_elements.empty())
         Rec2DData::addValVert(_sumQualAngle/_elements.size());
-      //if (_v->getNum() < 5)
-      //  Msg::Info("rmv %d %g", _v->getNum(), _sumQualAngle/_elements.size());
       return;
     }
     ++i;
@@ -1932,6 +1941,8 @@ double Rec2DElement::getAngle(Rec2DVertex *rv)
   int i2 = (index+1)%_numEdge;
   double ang =  atan2(vert[i2]->v() - rv->v(), vert[i2]->u() - rv->u())
                 - atan2(vert[i0]->v() - rv->v(), vert[i0]->u() - rv->u());
+  static int a = -1;
+  if (++a < 1) Msg::Warning("FIXME use real angle instead of parametric angle");
   if (ang < 0.)
     return ang + 2*M_PI;
   if (ang >= 2*M_PI)
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index 5c1095fa32..eac015caa8 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -43,8 +43,6 @@ struct moreRec2DNode {
   bool operator()(Rec2DNode*, Rec2DNode*) const;
 };
 
-//typedef std::list<Rec2DAction*> setofRec2DAction;
-
 class Recombine2D {
   private :
     GFace *_gf;
@@ -303,6 +301,7 @@ class Rec2DVertex {
     double getGain(int) const;
     void initQualAngle();
     inline double getQualAngle() {return _sumQualAngle/_elements.size();}
+    double getGainMerge(Rec2DElement*, Rec2DElement*);
     
     inline void setOnBoundary();
     inline bool getOnBoundary() const {return _onWhat < 1;}
-- 
GitLab