From bbe37dced510c22bb238563099eab7dae9220813 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Thu, 3 Aug 2017 12:24:43 +0200
Subject: [PATCH] [utest] Added the analytic element volumes of curved edge
 triangle and quadrilateral

  elements, respectively,  in the tests for gradient of shape functions.
---
 Tests/NumLib/FeTestData/TestFeQUAD8.h | 25 ++++++++++++++----------
 Tests/NumLib/FeTestData/TestFeQUAD9.h | 27 +++++++++++++++-----------
 Tests/NumLib/FeTestData/TestFeTRI6.h  | 28 +++++++++++++++------------
 3 files changed, 47 insertions(+), 33 deletions(-)

diff --git a/Tests/NumLib/FeTestData/TestFeQUAD8.h b/Tests/NumLib/FeTestData/TestFeQUAD8.h
index 1de4e8bba9b..16231ab0c55 100644
--- a/Tests/NumLib/FeTestData/TestFeQUAD8.h
+++ b/Tests/NumLib/FeTestData/TestFeQUAD8.h
@@ -40,26 +40,31 @@ public:
     static const unsigned n_sample_pt_order3 = 3 * 3;
     static const unsigned global_dim = MeshElementType::dimension;
 
-    const double perturbation = -0.1;
+    const double a = 1.0;
+    const double perturbation = 0.1;
 
-    /// create a mesh element
+    /// create a 8 node quadrilateral element
     MeshElementType* createMeshElement()
     {
+        // Convex 8 node quadrilateral element with curved edges.
         auto** nodes = new MeshLib::Node*[e_nnodes];
         nodes[0] = new MeshLib::Node(0.0, 0.0, 0.0);
-        nodes[1] = new MeshLib::Node(1.0, 0.0, 0.0);
-        nodes[2] = new MeshLib::Node(1.0, 1.0, 0.0);
-        nodes[3] = new MeshLib::Node(0.0, 1.0, 0.0);
+        nodes[1] = new MeshLib::Node(a, 0.0, 0.0);
+        nodes[2] = new MeshLib::Node(a, a, 0.0);
+        nodes[3] = new MeshLib::Node(0.0, a, 0.0);
 
-        nodes[4] = new MeshLib::Node(0.5, perturbation, 0.0);
-        nodes[5] = new MeshLib::Node(1.0 - perturbation, 0.5, 0.0);
-        nodes[6] = new MeshLib::Node(0.5, 1.0 - perturbation, 0.0);
-        nodes[7] = new MeshLib::Node(perturbation, 0.5, 0.0);
+        nodes[4] = new MeshLib::Node(0.5 * a, -perturbation, 0.0);
+        nodes[5] = new MeshLib::Node(a + perturbation, 0.5 * a, 0.0);
+        nodes[6] = new MeshLib::Node(0.5 * a, a + perturbation, 0.0);
+        nodes[7] = new MeshLib::Node(-perturbation, 0.5 * a, 0.0);
 
         return new MeshElementType(nodes);
     }
 
-    double getVolume() const { return 1.26666666667; }
+    double getVolume() const
+    {
+        return a * a + 4 * (2.0 * a * perturbation / 3.0);
+    }
 };
 
 }  // namespace
diff --git a/Tests/NumLib/FeTestData/TestFeQUAD9.h b/Tests/NumLib/FeTestData/TestFeQUAD9.h
index bde49072424..1da551dfabd 100644
--- a/Tests/NumLib/FeTestData/TestFeQUAD9.h
+++ b/Tests/NumLib/FeTestData/TestFeQUAD9.h
@@ -40,27 +40,32 @@ public:
     static const unsigned n_sample_pt_order3 = 3 * 3;
     static const unsigned global_dim = MeshElementType::dimension;
 
-    const double perturbation = -0.1;
+    const double a = 1.0;
+    const double perturbation = 0.1;
 
-    /// create a mesh element
+    /// create a 9 node quadrilateral element
     MeshElementType* createMeshElement()
     {
+        // Convex 9 node quadrilateral element with curved edges.
         auto** nodes = new MeshLib::Node*[e_nnodes];
         nodes[0] = new MeshLib::Node(0.0, 0.0, 0.0);
-        nodes[1] = new MeshLib::Node(1.0, 0.0, 0.0);
-        nodes[2] = new MeshLib::Node(1.0, 1.0, 0.0);
-        nodes[3] = new MeshLib::Node(0.0, 1.0, 0.0);
+        nodes[1] = new MeshLib::Node(a, 0.0, 0.0);
+        nodes[2] = new MeshLib::Node(a, a, 0.0);
+        nodes[3] = new MeshLib::Node(0.0, a, 0.0);
 
-        nodes[4] = new MeshLib::Node(0.5, perturbation, 0.0);
-        nodes[5] = new MeshLib::Node(1.0 - perturbation, 0.5, 0.0);
-        nodes[6] = new MeshLib::Node(0.5, 1.0 - perturbation, 0.0);
-        nodes[7] = new MeshLib::Node(perturbation, 0.5, 0.0);
+        nodes[4] = new MeshLib::Node(0.5 * a, -perturbation, 0.0);
+        nodes[5] = new MeshLib::Node(a + perturbation, 0.5 * a, 0.0);
+        nodes[6] = new MeshLib::Node(0.5 * a, a + perturbation, 0.0);
+        nodes[7] = new MeshLib::Node(-perturbation, 0.5 * a, 0.0);
 
-        nodes[8] = new MeshLib::Node(0.45, 0.25, 0.0);
+        nodes[8] = new MeshLib::Node(0.45 * a, 0.25 * a, 0.0);
         return new MeshElementType(nodes);
     }
 
-    double getVolume() const { return 1.2666666666667; }
+    double getVolume() const
+    {
+        return a * a + 4 * (2.0 * a * perturbation / 3.0);
+    }
 };
 
 }  // namespace
diff --git a/Tests/NumLib/FeTestData/TestFeTRI6.h b/Tests/NumLib/FeTestData/TestFeTRI6.h
index 70a4a0ab8e9..121ce5f3b88 100644
--- a/Tests/NumLib/FeTestData/TestFeTRI6.h
+++ b/Tests/NumLib/FeTestData/TestFeTRI6.h
@@ -41,32 +41,36 @@ public:
     static const unsigned n_sample_pt_order2 = 3;
     static const unsigned n_sample_pt_order3 = 4;
     static const unsigned global_dim = MeshElementType::dimension;
+
+    const double a = 1.0;
     const double perturbation = 0.1;
 
-    /// create a mesh element
+    /// create a 6 node triangle element
     MeshElementType* createMeshElement()
     {
+        // Concave 6 node triangle element with curved edges.
         auto** nodes = new MeshLib::Node*[e_nnodes];
         nodes[0] = new MeshLib::Node(0.0, 0.0, 0.0);
-        nodes[1] = new MeshLib::Node(1.0, 0.0, 0.0);
-        nodes[2] = new MeshLib::Node(0.0, 1.0, 0.0);
+        nodes[1] = new MeshLib::Node(a, 0.0, 0.0);
+        nodes[2] = new MeshLib::Node(0.0, a, 0.0);
 
-        nodes[3] = new MeshLib::Node(0.5, perturbation, 0.0);
+        nodes[3] = new MeshLib::Node(0.5 * a, perturbation, 0.0);
         const double perturbation_hypotenuse =
-            0.5 * perturbation * std::sqrt(2.0);
-        nodes[4] = new MeshLib::Node(0.5 - perturbation_hypotenuse,
-                                     0.5 - perturbation_hypotenuse, 0.0);
-        nodes[5] = new MeshLib::Node(perturbation, 0.5, 0.0);
+            0.5 * perturbation * std::sqrt(2 * a * a);
+        nodes[4] = new MeshLib::Node(0.5 * a - perturbation_hypotenuse,
+                                     0.5 * a - perturbation_hypotenuse, 0.0);
+        nodes[5] = new MeshLib::Node(perturbation, 0.5 * a, 0.0);
 
         return new MeshElementType(nodes);
     }
 
     double getVolume() const
     {
-        // The length of hypotenuse is a_h=sqrt(2)
-        // Area = 0.5 - 2 * 2 * a * b /3 - 2 * a_h * b /3
-        // where a=1.0, b=perturbation
-        return 0.27238576250846036;
+        // The length of hypotenuse is a_h sqrt(2 * a * a)
+        // Area = a^2 /2 - 2 * 2 * a * b /3 - 2 * a_h * b /3
+        // where b=perturbation
+        return 0.5 * a * a - 4.0 * a * perturbation / 3.0 -
+               2.0 * std::sqrt(2 * a * a) * perturbation / 3.0;
     }
 };
 
-- 
GitLab