From 4e09e144575cd542c4584612848fe96ed5984406 Mon Sep 17 00:00:00 2001
From: Thomas Toulorge <thomas.toulorge@mines-paristech.fr>
Date: Wed, 28 Nov 2012 13:16:17 +0000
Subject: [PATCH] Fixed generic 3D distortion computation

---
 Geo/MElement.cpp         | 18 ++++++++----
 Mesh/HighOrder.cpp       |  4 +--
 Mesh/qualityMeasures.cpp | 60 ++++++++++++++++++++--------------------
 3 files changed, 44 insertions(+), 38 deletions(-)

diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index d5a221c8bd..5f0d00f67f 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -112,19 +112,25 @@ void MElement::scaledJacRange(double &jmin, double &jmax)
 {
   jmin = jmax = 1.0;
 #if defined(HAVE_MESH)
-//  if (getType() == TYPE_PYR) return;
-  extern double mesh_functional_distorsion(MElement*,double,double);
+  extern double mesh_functional_distorsion_2D(MElement*,double,double);
+  extern double mesh_functional_distorsion_3D(MElement*,double,double,double);
   if (getPolynomialOrder() == 1) return;
   const bezierBasis *jac = getJacobianFuncSpace()->bezier;
   fullVector<double>Ji(jac->points.size1());
   for (int i=0;i<jac->points.size1();i++){
     double u = jac->points(i,0);
     double v = jac->points(i,1);
-    if (getType() == TYPE_QUA){
-      u = -1 + 2*u;
-      v = -1 + 2*v;
+    if (getDim() == 2) {
+      if (getType() == TYPE_QUA) {
+        u = -1 + 2*u;
+        v = -1 + 2*v;
+      }
+      Ji(i) = mesh_functional_distorsion_2D(this,u,v);
+    }
+    else {
+      double w = jac->points(i,2);
+      Ji(i) = mesh_functional_distorsion_3D(this,u,v,w);
     }
-    Ji(i) = mesh_functional_distorsion(this,u,v);
   }
   fullVector<double> Bi( jac->matrixLag2Bez.size1() );
   jac->matrixLag2Bez.mult(Ji,Bi);
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 8439e342d9..07e7077804 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -1325,7 +1325,7 @@ static void checkHighOrderTetrahedron(const char* cc, GModel *m,
                  avg / (count ? count : 1));
 }
 
-extern double mesh_functional_distorsion(MElement *t, double u, double v);
+extern double mesh_functional_distorsion_2D(MElement *t, double u, double v);
 
 void printJacobians(GModel *m, const char *nm)
 {
@@ -1343,7 +1343,7 @@ void printJacobians(GModel *m, const char *nm)
           double u = (double)i / (n - 1);
           double v = (double)k / (n - 1);
           t->pnt(u, v, 0, pt);
-          D[i][k] = mesh_functional_distorsion(t, u, v);
+          D[i][k] = mesh_functional_distorsion_2D(t, u, v);
           //X[i][k] = u;
           //Y[i][k] = v;
           //Z[i][k] = 0.0;
diff --git a/Mesh/qualityMeasures.cpp b/Mesh/qualityMeasures.cpp
index 4b1a646757..37b5f13bf4 100644
--- a/Mesh/qualityMeasures.cpp
+++ b/Mesh/qualityMeasures.cpp
@@ -208,7 +208,7 @@ double conditionNumberAndDerivativeOfTet(const double &x1, const double &y1, con
 }
 */
 
-double mesh_functional_distorsion(MElement *t, double u, double v)
+double mesh_functional_distorsion_2D(MElement *t, double u, double v)
 {
   // compute uncurved element jacobian d_u x and d_v x
   double mat[3][3];
@@ -253,25 +253,25 @@ static double MINQ (double a, double b, double c){
 
 double mesh_functional_distorsion_p2_bezier_refined(MTriangle *t)
 {
-  double J1 =mesh_functional_distorsion(t,0.0,0.0);
-  double J2 =mesh_functional_distorsion(t,1.0,0.0);
-  double J3 =mesh_functional_distorsion(t,0.0,1.0);
-  double J4 =mesh_functional_distorsion(t,0.5,0.0);
-  double J5 =mesh_functional_distorsion(t,0.5,0.5);
-  double J6 =mesh_functional_distorsion(t,0.0,0.5);
+  double J1 =mesh_functional_distorsion_2D(t,0.0,0.0);
+  double J2 =mesh_functional_distorsion_2D(t,1.0,0.0);
+  double J3 =mesh_functional_distorsion_2D(t,0.0,1.0);
+  double J4 =mesh_functional_distorsion_2D(t,0.5,0.0);
+  double J5 =mesh_functional_distorsion_2D(t,0.5,0.5);
+  double J6 =mesh_functional_distorsion_2D(t,0.0,0.5);
 
-  double J36 =mesh_functional_distorsion(t,0.0,.75);
-  double J35 =mesh_functional_distorsion(t,0.25,.75);
-  double J56 =mesh_functional_distorsion(t,0.25,.5);
+  double J36 =mesh_functional_distorsion_2D(t,0.0,.75);
+  double J35 =mesh_functional_distorsion_2D(t,0.25,.75);
+  double J56 =mesh_functional_distorsion_2D(t,0.25,.5);
 
-  double J16 =mesh_functional_distorsion(t,0.0,.25);
-  double J14 =mesh_functional_distorsion(t,0.25,.0);
-  double J46 =mesh_functional_distorsion(t,0.25,.25);
+  double J16 =mesh_functional_distorsion_2D(t,0.0,.25);
+  double J14 =mesh_functional_distorsion_2D(t,0.25,.0);
+  double J46 =mesh_functional_distorsion_2D(t,0.25,.25);
 
 
-  double J45 =mesh_functional_distorsion(t,0.5,.25);
-  double J52 =mesh_functional_distorsion(t,0.75,.25);
-  double J24 =mesh_functional_distorsion(t,0.75,.0);
+  double J45 =mesh_functional_distorsion_2D(t,0.5,.25);
+  double J52 =mesh_functional_distorsion_2D(t,0.75,.25);
+  double J24 =mesh_functional_distorsion_2D(t,0.75,.0);
 
   double d[15] = {
     J1,J6,J4,2*J16-0.5*(J1+J6),2*J14-0.5*(J1+J4),2*J46-0.5*(J6+J4),
@@ -282,12 +282,12 @@ double mesh_functional_distorsion_p2_bezier_refined(MTriangle *t)
 
 double mesh_functional_distorsion_p2_exact(MTriangle *t)
 {
-  double J1 =mesh_functional_distorsion(t,0.0,0.0);
-  double J2 =mesh_functional_distorsion(t,1.0,0.0);
-  double J3 =mesh_functional_distorsion(t,0.0,1.0);
-  double J4 =mesh_functional_distorsion(t,0.5,0.0);
-  double J5 =mesh_functional_distorsion(t,0.5,0.5);
-  double J6 =mesh_functional_distorsion(t,0.0,0.5);
+  double J1 =mesh_functional_distorsion_2D(t,0.0,0.0);
+  double J2 =mesh_functional_distorsion_2D(t,1.0,0.0);
+  double J3 =mesh_functional_distorsion_2D(t,0.0,1.0);
+  double J4 =mesh_functional_distorsion_2D(t,0.5,0.0);
+  double J5 =mesh_functional_distorsion_2D(t,0.5,0.5);
+  double J6 =mesh_functional_distorsion_2D(t,0.0,0.5);
 
   const double a = J1;
   const double b = -3*J1-J2+4*J4;
@@ -347,7 +347,7 @@ double mesh_functional_distorsion_pN(MElement *t)
       v = -1 + 2*v;
     }
 
-    Ji(i) = mesh_functional_distorsion(t,u,v);
+    Ji(i) = mesh_functional_distorsion_2D(t,u,v);
   }
 
   fullVector<double> Bi( jac->matrixLag2Bez.size1() );
@@ -406,16 +406,16 @@ double qmDistorsionOfMapping (MQuadrangle *e)
 }
 
 
-static double mesh_functional_distorsion(MTetrahedron *t, double u, double v, double w)
+double mesh_functional_distorsion_3D(MElement *t, double u, double v, double w)
 {
   // compute uncurved element jacobian d_u x and d_v x
   double mat[3][3];
-  t->getPrimaryJacobian(u, v, w, mat);
-  const double det1 = det3x3(mat);
-  t->getJacobian(u, v, w, mat);
-  const double detN = det3x3(mat);
+  const double det1 = t->getPrimaryJacobian(u, v, w, mat);
+//  const double det1 = det3x3(mat);
+  const double detN = t->getJacobian(u, v, w, mat);
+//  const double detN = det3x3(mat);
   if (det1 == 0 || detN == 0) return 0;
-  double dist = det1 / detN;
+  double dist = detN / det1;
   return dist;
 }
 
@@ -427,7 +427,7 @@ double qmDistorsionOfMapping(MTetrahedron *t)
     const double u = jac->points(i,0);
     const double v = jac->points(i,1);
     const double w = jac->points(i,2);
-    Ji(i) = mesh_functional_distorsion(t,u,v,w);
+    Ji(i) = mesh_functional_distorsion_3D(t,u,v,w);
   }
 
   fullVector<double> Bi( jac->matrixLag2Bez.size1() );
-- 
GitLab