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