From 5d0ac6ddf2f4a7431392d9aa1b9bf425b0521e69 Mon Sep 17 00:00:00 2001
From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be>
Date: Mon, 7 Apr 2014 16:16:17 +0000
Subject: [PATCH] element P1Mini + dg : update dgConservationLawPorous

---
 Common/GmshDefines.h      |  3 ++-
 Numeric/BasisFactory.cpp  | 41 ++++++++++++++++++++++-----------------
 Numeric/CMakeLists.txt    |  1 +
 Numeric/miniBasis.cpp     | 37 +++++++++++++++++++++++++++++++++++
 Numeric/miniBasis.h       |  8 ++++++++
 Numeric/nodalBasis.h      |  1 +
 Numeric/polynomialBasis.h |  1 +
 7 files changed, 73 insertions(+), 19 deletions(-)
 create mode 100644 Numeric/miniBasis.cpp
 create mode 100644 Numeric/miniBasis.h

diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h
index 9742f84b15..3b7c867589 100644
--- a/Common/GmshDefines.h
+++ b/Common/GmshDefines.h
@@ -209,8 +209,9 @@
 #define MSH_TRI_SUB 135
 #define MSH_TET_SUB 136
 #define MSH_TET_16  137
+#define MSH_TRI_MINI 138
 
-#define MSH_NUM_TYPE 137
+#define MSH_NUM_TYPE 138
 
 // Geometric entities
 #define ENT_NONE     0
diff --git a/Numeric/BasisFactory.cpp b/Numeric/BasisFactory.cpp
index 96f5153011..356fdec336 100644
--- a/Numeric/BasisFactory.cpp
+++ b/Numeric/BasisFactory.cpp
@@ -5,6 +5,7 @@
 
 #include "GmshDefines.h"
 #include "GmshMessage.h"
+#include "miniBasis.h"
 #include "polynomialBasis.h"
 #include "pyramidalBasis.h"
 #include "pointsGenerators.h"
@@ -25,25 +26,29 @@ const nodalBasis* BasisFactory::getNodalBasis(int tag)
   }
   // Get the parent type to see which kind of basis
   // we want to create
-  int parentType = ElementType::ParentTypeFromTag(tag);
   nodalBasis* F = NULL;
-
-  switch(parentType) {
-    case(TYPE_PNT):
-    case(TYPE_LIN):
-    case(TYPE_TRI):
-    case(TYPE_QUA):
-    case(TYPE_PRI):
-    case(TYPE_TET):
-    case(TYPE_HEX):
-      F = new polynomialBasis(tag);
-      break;
-    case(TYPE_PYR):
-      F = new pyramidalBasis(tag);
-      break;
-    default:
-      Msg::Error("Unknown type of element %d (in BasisFactory)", tag);
-      return NULL;
+  if (tag == MSH_TRI_MINI) {
+    F = new miniBasis();
+  }
+  else {
+    int parentType = ElementType::ParentTypeFromTag(tag);
+    switch(parentType) {
+      case(TYPE_PNT):
+      case(TYPE_LIN):
+      case(TYPE_TRI):
+      case(TYPE_QUA):
+      case(TYPE_PRI):
+      case(TYPE_TET):
+      case(TYPE_HEX):
+        F = new polynomialBasis(tag);
+        break;
+      case(TYPE_PYR):
+        F = new pyramidalBasis(tag);
+        break;
+      default:
+        Msg::Error("Unknown type of element %d (in BasisFactory)", tag);
+        return NULL;
+    }
   }
 
   std::pair<std::map<int, nodalBasis*>::const_iterator, bool> inserted;
diff --git a/Numeric/CMakeLists.txt b/Numeric/CMakeLists.txt
index d7a0f85162..6977d241ce 100644
--- a/Numeric/CMakeLists.txt
+++ b/Numeric/CMakeLists.txt
@@ -8,6 +8,7 @@ set(SRC
     fullMatrix.cpp
   BasisFactory.cpp
   discreteFrechetDistance.cpp
+  miniBasis.cpp
     nodalBasis.cpp
 	polynomialBasis.cpp
 	pyramidalBasis.cpp
diff --git a/Numeric/miniBasis.cpp b/Numeric/miniBasis.cpp
new file mode 100644
index 0000000000..b893ebc0c2
--- /dev/null
+++ b/Numeric/miniBasis.cpp
@@ -0,0 +1,37 @@
+#include "miniBasis.h"
+#include "BasisFactory.h"
+miniBasis::miniBasis()
+{
+  type = MSH_TRI_MINI;
+  parentType = TYPE_TRI;
+  order = 3;
+  dimension = 2;
+  numFaces = 3;
+  serendip = false;
+  const nodalBasis &p1 = *BasisFactory::getNodalBasis(MSH_TRI_3);
+  closures = p1.closures;
+  fullClosures = p1.fullClosures;
+  for(size_t i = 0; i < fullClosures.size(); ++i) {
+    fullClosures[i].push_back(3);
+  }
+  closureRef = p1.closureRef;
+  points = p1.points;
+  points.resize(4, 2);
+  points(0, 0) = 0.; points(0, 1) = 0.;
+  points(1, 0) = 1.; points(1, 1) = 0.;
+  points(2, 0) = 0.; points(2, 1) = 1.;
+  points(3, 0) = 1./3; points(3, 1) = 1./3;
+  monomials.resize(6, 2);
+  monomials(0, 0) = 0.; monomials(0, 1) = 0.;
+  monomials(1, 0) = 1.; monomials(1, 1) = 0.;
+  monomials(2, 0) = 0.; monomials(2, 1) = 1.;
+  monomials(3, 0) = 1.; monomials(3, 1) = 1.;
+  monomials(4, 0) = 2.; monomials(4, 1) = 1.;
+  monomials(5, 0) = 1.; monomials(5, 1) = 2.;
+  coefficients.resize(4, 6);
+  coefficients.setAll(0.);
+  coefficients(0, 0) = 1.; coefficients(0, 1) = -1.; coefficients(0, 2) = -1.;
+  coefficients(1, 1) = 1.;
+  coefficients(2, 2) = 1.;
+  coefficients(3, 3) = 1.; coefficients(3, 4) = -1.; coefficients(3, 5) = -1.; 
+}
diff --git a/Numeric/miniBasis.h b/Numeric/miniBasis.h
new file mode 100644
index 0000000000..631980ab31
--- /dev/null
+++ b/Numeric/miniBasis.h
@@ -0,0 +1,8 @@
+#ifndef _MINI_BASIS_H_
+#define _MINI_BASIS_H_
+#include "polynomialBasis.h"
+class miniBasis : public polynomialBasis { // mini is NOT a real nodal basis but in GMSH, only the nodal basis have closure and mini have closure so...
+  public:
+    miniBasis();
+};
+#endif
diff --git a/Numeric/nodalBasis.h b/Numeric/nodalBasis.h
index e35f948e09..25b855610b 100644
--- a/Numeric/nodalBasis.h
+++ b/Numeric/nodalBasis.h
@@ -15,6 +15,7 @@ class nodalBasis {
   bool serendip;
   fullMatrix<double> points;
 
+  nodalBasis() {};
   nodalBasis(int tag);
   virtual ~nodalBasis() {}
 
diff --git a/Numeric/polynomialBasis.h b/Numeric/polynomialBasis.h
index 3ecc83619a..ef60d077d9 100644
--- a/Numeric/polynomialBasis.h
+++ b/Numeric/polynomialBasis.h
@@ -79,6 +79,7 @@ class polynomialBasis : public nodalBasis
   fullMatrix<double> monomials;
   fullMatrix<double> coefficients;
 
+  polynomialBasis() {};
   polynomialBasis(int tag);
   ~polynomialBasis();
 
-- 
GitLab