diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h index adc4bae0686bb4acfd4dac6c7b2b693423fe1169..b954314d4d5d13465f3a3aa5f45e93638207069b 100644 --- a/Common/GmshDefines.h +++ b/Common/GmshDefines.h @@ -142,6 +142,12 @@ #define MSH_TET_164 82 #define MSH_TET_202 83 #define MSH_NUM_TYPE 84 +#define MSH_LIN_1 85 +#define MSH_TRI_1 86 +#define MSH_QUA_1 87 +#define MSH_TET_1 88 +#define MSH_HEX_1 89 +#define MSH_PRI_1 90 // Geometric entities #define ENT_NONE 0 diff --git a/Geo/MLine.cpp b/Geo/MLine.cpp index 4771a12613fd9a27bea33fa5972bd3fdf60a32f0..66e84489c29464304f97e2ddb5acd3518f715669 100644 --- a/Geo/MLine.cpp +++ b/Geo/MLine.cpp @@ -14,6 +14,7 @@ const polynomialBasis* MLine::getFunctionSpace(int o) const int order = (o == -1) ? getPolynomialOrder() : o; switch (order) { + case 0: return polynomialBases::find(MSH_LIN_1); case 1: return polynomialBases::find(MSH_LIN_2); case 2: return polynomialBases::find(MSH_LIN_3); case 3: return polynomialBases::find(MSH_LIN_4); diff --git a/Geo/MPrism.cpp b/Geo/MPrism.cpp index 22586f844df6f32916430fca77f0eb810bd185e2..ea385278fb5ed115ecaee1339f81bf4e3a5c6cad 100644 --- a/Geo/MPrism.cpp +++ b/Geo/MPrism.cpp @@ -38,6 +38,7 @@ const polynomialBasis* MPrism::getFunctionSpace(int o) const if ((nv == 0) && (o == -1)) { switch (order) { + case 0: return polynomialBases::find(MSH_PRI_1); case 1: return polynomialBases::find(MSH_PRI_6); case 2: return polynomialBases::find(MSH_PRI_18); default: Msg::Error("Order %d prism function space not implemented", order); @@ -45,6 +46,7 @@ const polynomialBasis* MPrism::getFunctionSpace(int o) const } else { switch (order) { + case 0: return polynomialBases::find(MSH_PRI_1); case 1: return polynomialBases::find(MSH_PRI_6); case 2: return polynomialBases::find(MSH_PRI_18); default: Msg::Error("Order %d prism function space not implemented", order); diff --git a/Geo/MQuadrangle.cpp b/Geo/MQuadrangle.cpp index 13eb65e2cc4487ec3d87ed35b64dbcf6689beb1c..0563ae6d29f0fecd4fd95368bedf569f771d0258 100644 --- a/Geo/MQuadrangle.cpp +++ b/Geo/MQuadrangle.cpp @@ -24,6 +24,7 @@ const polynomialBasis* MQuadrangle::getFunctionSpace(int o) const if ((nf == 0) && (o == -1)) { switch (order) { + case 0: return polynomialBases::find(MSH_QUA_1); case 1: return polynomialBases::find(MSH_QUA_4); case 2: return polynomialBases::find(MSH_QUA_8); case 3: return polynomialBases::find(MSH_QUA_12); @@ -37,6 +38,7 @@ const polynomialBasis* MQuadrangle::getFunctionSpace(int o) const } } switch (order) { + case 0: return polynomialBases::find(MSH_QUA_1); case 1: return polynomialBases::find(MSH_QUA_4); case 2: return polynomialBases::find(MSH_QUA_9); case 3: return polynomialBases::find(MSH_QUA_16); diff --git a/Geo/MTetrahedron.cpp b/Geo/MTetrahedron.cpp index aea4336b8d0f60d29fdbbdbca6119483fa19f8de..83785d50e3a53ea0d4c8e754cadf94af27165ab6 100644 --- a/Geo/MTetrahedron.cpp +++ b/Geo/MTetrahedron.cpp @@ -125,6 +125,7 @@ const polynomialBasis* MTetrahedron::getFunctionSpace(int o) const if ((nv == 0) && (o == -1)) { switch (order) { + case 0: return polynomialBases::find(MSH_TET_1); case 1: return polynomialBases::find(MSH_TET_4); case 2: return polynomialBases::find(MSH_TET_10); case 3: return polynomialBases::find(MSH_TET_20); @@ -140,6 +141,7 @@ const polynomialBasis* MTetrahedron::getFunctionSpace(int o) const } else { switch (order) { + case 0: return polynomialBases::find(MSH_TET_1); case 1: return polynomialBases::find(MSH_TET_4); case 2: return polynomialBases::find(MSH_TET_10); case 3: return polynomialBases::find(MSH_TET_20); diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp index 721fa4de2268d4eae79e250f639abf4311cddfd1..0c4f6322bad7be7d23a6c2145752a039f632f3a2 100644 --- a/Geo/MTriangle.cpp +++ b/Geo/MTriangle.cpp @@ -84,6 +84,7 @@ const polynomialBasis* MTriangle::getFunctionSpace(int o) const if ((nf == 0) && (o == -1)) { switch (order) { + case 0: return polynomialBases::find(MSH_TRI_1); case 1: return polynomialBases::find(MSH_TRI_3); case 2: return polynomialBases::find(MSH_TRI_6); case 3: return polynomialBases::find(MSH_TRI_9); @@ -99,6 +100,7 @@ const polynomialBasis* MTriangle::getFunctionSpace(int o) const } else { switch (order) { + case 0: return polynomialBases::find(MSH_TRI_1); case 1: return polynomialBases::find(MSH_TRI_3); case 2: return polynomialBases::find(MSH_TRI_6); case 3: return polynomialBases::find(MSH_TRI_10); @@ -117,12 +119,14 @@ const polynomialBasis* MTriangle::getFunctionSpace(int o) const const JacobianBasis* MTriangle::getJacobianFuncSpace(int o) const { + int order = (o == -1) ? getPolynomialOrder() : o; int nf = getNumFaceVertices(); if ((nf == 0) && (o == -1)) { switch (order) { + case 0: return JacobianBases::find(MSH_TRI_1); case 1: return JacobianBases::find(MSH_TRI_3); case 2: return JacobianBases::find(MSH_TRI_6); case 3: return JacobianBases::find(MSH_TRI_9); diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp index 79d31aca83abeb8d822118abd92556f42adb1065..da15f93cde44b302de0595cfd0882b05de1fac0c 100644 --- a/Numeric/polynomialBasis.cpp +++ b/Numeric/polynomialBasis.cpp @@ -14,6 +14,7 @@ static int getTriangleType (int order) { switch(order) { + case 0 : return MSH_TRI_1; case 1 : return MSH_TRI_3; case 2 : return MSH_TRI_6; case 3 : return MSH_TRI_10; @@ -29,6 +30,7 @@ static int getTriangleType (int order) { } static int getQuadType (int order) { switch(order) { + case 0 : return MSH_QUA_1; case 1 : return MSH_QUA_4; case 2 : return MSH_QUA_9; case 3 : return MSH_QUA_16; @@ -44,6 +46,7 @@ static int getQuadType (int order) { } static int getLineType (int order) { switch(order) { + case 0 : return MSH_LIN_1; case 1 : return MSH_LIN_2; case 2 : return MSH_LIN_3; case 3 : return MSH_LIN_4; @@ -1018,6 +1021,16 @@ static void generate1dVertexClosure(polynomialBasis::clCont &closure) closure[1].type = MSH_PNT; } +static void generateClosureOrder0(polynomialBasis::clCont &closure, int nb) +{ + closure.clear(); + closure.resize(nb); + for (int i=0; i < nb; i++) { + closure[i].push_back(0); + closure[i].type = MSH_PNT; + } +} + std::map<int, polynomialBasis> polynomialBases::fs; const polynomialBasis *polynomialBases::find(int tag) @@ -1034,6 +1047,13 @@ const polynomialBasis *polynomialBases::find(int tag) F.points = generate1DPoints(0); F.parentType = TYPE_PNT; break; + case MSH_LIN_1 : + F.numFaces = 2; + F.monomials = generate1DMonomials(0); + F.points = generate1DPoints(0); + generateClosureOrder0(F.closures,2); + F.parentType = TYPE_LIN; + break; case MSH_LIN_2 : F.numFaces = 2; F.monomials = generate1DMonomials(1); @@ -1104,6 +1124,13 @@ const polynomialBasis *polynomialBases::find(int tag) F.parentType = TYPE_LIN; generate1dVertexClosure(F.closures); break; + case MSH_TRI_1 : + F.numFaces = 3; + F.monomials = generatePascalTriangle(0); + F.points = gmshGeneratePointsTriangle(0, false); + F.parentType = TYPE_TRI; + generateClosureOrder0(F.closures,6); + break; case MSH_TRI_3 : F.numFaces = 3; F.monomials = generatePascalTriangle(1); @@ -1230,6 +1257,13 @@ const polynomialBasis *polynomialBases::find(int tag) F.parentType = TYPE_TRI; generate2dEdgeClosure(F.closures, 10); break; + case MSH_TET_1 : + F.numFaces = 4; + F.monomials = generatePascalTetrahedron(0); + F.points = gmshGeneratePointsTetrahedron(0, false); + F.parentType = TYPE_TET; + generateClosureOrder0(F.closures,24); + break; case MSH_TET_4 : F.numFaces = 4; F.monomials = generatePascalTetrahedron(1); @@ -1349,6 +1383,13 @@ const polynomialBasis *polynomialBases::find(int tag) F.parentType = TYPE_TET; generateFaceClosureTet(F.closures, 10); break; + case MSH_QUA_1 : + F.numFaces = 4; + F.monomials = generatePascalQuad(0); + F.points = gmshGeneratePointsQuad(0,false); + F.parentType = TYPE_QUA; + generateClosureOrder0(F.closures,8); + break; case MSH_QUA_4 : F.numFaces = 4; F.monomials = generatePascalQuad(1); @@ -1482,6 +1523,13 @@ const polynomialBasis *polynomialBases::find(int tag) F.parentType = TYPE_QUA; generate2dEdgeClosure(F.closures, 10, 4); break; + case MSH_PRI_1 : + F.numFaces = 5; + F.monomials = generatePascalPrism(0); + F.points = gmshGeneratePointsPrism(1, false); + F.parentType = TYPE_PRI; + generateClosureOrder0(F.closures,48); + break; case MSH_PRI_6 : F.numFaces = 5; F.monomials = generatePascalPrism(1);