From e48f5c9e1d8fd65bd2d510d5bfd7352d6c230244 Mon Sep 17 00:00:00 2001
From: Pierre-Alexandre Beaufort <pierre-alexandre.beaufort@uclouvain.be>
Date: Wed, 14 Sep 2016 07:54:22 +0000
Subject: [PATCH] the linear system is only modified if the initial harmonic
 map is not one-to-one (1st order)

---
 Geo/discreteDiskFace.cpp | 18 +++++++++++-------
 Geo/discreteDiskFace.h   |  3 ++-
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp
index b7724e6bea..b52d22a38c 100644
--- a/Geo/discreteDiskFace.cpp
+++ b/Geo/discreteDiskFace.cpp
@@ -284,12 +284,15 @@ discreteDiskFace::discreteDiskFace(GFace *gf, triangulation* diskTriangulation,
   _totLength = geoTriangulation->bord.rbegin()->first;
   _U0 = geoTriangulation->bord.rbegin()->second;
   orderVertices(_totLength, _U0, _coords);
-  parametrize();
+  parametrize(false);
   buildOct(CAD);
   printParamMesh();
-  if (_order > 1 && !checkOrientationUV()){
-    Msg::Info("discreteDiskFace:: parametrization is not one-to-one; the parametric mesh is going to be corrected.");
-    optimize();
+  if (!checkOrientationUV()){
+    Msg::Info("discreteDiskFace:: parametrization is not one-to-one; it is going to be corrected.");
+    if(_order==1)
+      parametrize(true);
+    else
+      optimize();
     buildOct(CAD);
     printParamMesh();
   }
@@ -336,7 +339,7 @@ void discreteDiskFace::buildOct(std::vector<GFace*> *CAD) const
   Octree_Arrange(oct);
 }
 
-bool discreteDiskFace::parametrize()// const
+bool discreteDiskFace::parametrize(bool one2one)// const
 { // #improveme
 
 
@@ -349,7 +352,7 @@ bool discreteDiskFace::parametrize()// const
   dofManager<double> myAssemblerU(lsys_u);   // hashing
   dofManager<double> myAssemblerV(lsys_v);
 
-  if(_order>1){
+  if(!one2one){
     for(size_t i = 0; i < _U0.size(); i++){
       MVertex *v = _U0[i];
       const double theta = 2 * M_PI * _coords[i];
@@ -389,7 +392,8 @@ bool discreteDiskFace::parametrize()// const
   }
 
 
-  if(_order==1){
+  if(one2one){
+    Msg::Info("discreteDiskFace::parametrize \t Modifying discrete system");
     checklsys(lsys_u,&myAssemblerU,1);
     checklsys(lsys_v,&myAssemblerV,0);
   }
diff --git a/Geo/discreteDiskFace.h b/Geo/discreteDiskFace.h
index b5aed56fa9..1719fe3d39 100644
--- a/Geo/discreteDiskFace.h
+++ b/Geo/discreteDiskFace.h
@@ -26,6 +26,7 @@
 #include "linearSystemCSR.h"
 #include "dofManager.h"
 
+
 inline int nodeLocalNum(MElement* e, MVertex* v)
 {
   for(int i=0; i<e->getNumVertices(); i++)
@@ -219,7 +220,7 @@ class  discreteDiskFaceTriangle {
 class discreteDiskFace : public GFace {
   GFace *_parent;
   void buildOct(std::vector<GFace*> *CAD = NULL) const;
-  bool parametrize();// const;
+  bool parametrize(bool);// const;
   void checklsys(linearSystemCSRTaucs<double>*,dofManager<double>*,int);
   void putOnView(bool,bool);
   bool checkOrientationUV();
-- 
GitLab