From 8ccd0accecb190bd50d6a8ab23b2fb6bad13a3e7 Mon Sep 17 00:00:00 2001 From: Amaury Johnan <amjohnen@gmail.com> Date: Mon, 17 Jun 2013 12:20:38 +0000 Subject: [PATCH] move getTag(..) from nodalBasis to MElement --- FunctionSpace/LineLagrangeBasis.cpp | 2 +- FunctionSpace/QuadLagrangeBasis.cpp | 2 +- FunctionSpace/TetLagrangeBasis.cpp | 2 +- FunctionSpace/TriLagrangeBasis.cpp | 2 +- Geo/MElement.cpp | 118 +++++++++++++++++ Geo/MElement.h | 1 + Numeric/JacobianBasis.cpp | 6 +- Numeric/nodalBasis.cpp | 10 +- Numeric/nodalBasis.h | 122 ------------------ contrib/DiscreteIntegration/Integration3D.cpp | 10 +- 10 files changed, 136 insertions(+), 139 deletions(-) diff --git a/FunctionSpace/LineLagrangeBasis.cpp b/FunctionSpace/LineLagrangeBasis.cpp index 26c0bb64ba..c9ab665b93 100644 --- a/FunctionSpace/LineLagrangeBasis.cpp +++ b/FunctionSpace/LineLagrangeBasis.cpp @@ -33,7 +33,7 @@ LineLagrangeBasis::~LineLagrangeBasis(void){ } unsigned int LineLagrangeBasis::getTag(unsigned int order){ - unsigned int tag = nodalBasis::getTag(TYPE_LIN, order, false); + unsigned int tag = MElement::getTag(TYPE_LIN, order, false); if(tag) return tag; diff --git a/FunctionSpace/QuadLagrangeBasis.cpp b/FunctionSpace/QuadLagrangeBasis.cpp index b8f78f2f76..78c5cfa220 100644 --- a/FunctionSpace/QuadLagrangeBasis.cpp +++ b/FunctionSpace/QuadLagrangeBasis.cpp @@ -33,7 +33,7 @@ QuadLagrangeBasis::~QuadLagrangeBasis(void){ } unsigned int QuadLagrangeBasis::getTag(unsigned int order){ - unsigned int tag = nodalBasis::getTag(TYPE_QUA, order, false); + unsigned int tag = MElement::getTag(TYPE_QUA, order, false); if(tag) return tag; diff --git a/FunctionSpace/TetLagrangeBasis.cpp b/FunctionSpace/TetLagrangeBasis.cpp index 6d4fcbc321..b4cae893d6 100644 --- a/FunctionSpace/TetLagrangeBasis.cpp +++ b/FunctionSpace/TetLagrangeBasis.cpp @@ -33,7 +33,7 @@ TetLagrangeBasis::~TetLagrangeBasis(void){ } unsigned int TetLagrangeBasis::getTag(unsigned int order){ - unsigned int tag = nodalBasis::getTag(TYPE_TET, order, false); + unsigned int tag = MElement::getTag(TYPE_TET, order, false); if(tag) return tag; diff --git a/FunctionSpace/TriLagrangeBasis.cpp b/FunctionSpace/TriLagrangeBasis.cpp index e99e07974c..bf41e9765a 100644 --- a/FunctionSpace/TriLagrangeBasis.cpp +++ b/FunctionSpace/TriLagrangeBasis.cpp @@ -41,7 +41,7 @@ TriLagrangeBasis::~TriLagrangeBasis(void){ } unsigned int TriLagrangeBasis::getTag(unsigned int order){ - unsigned int tag = nodalBasis::getTag(TYPE_TRI, order, false); + unsigned int tag = MElement::getTag(TYPE_TRI, order, false); if(tag) return tag; diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index b36035c023..3eda847963 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -1804,6 +1804,124 @@ int MElement::DimensionFromTag(int tag) } } +int MElement::getTag(int parentTag, int order, bool serendip) +{ + switch (parentTag) { + case TYPE_PNT : + return MSH_PNT; + case TYPE_LIN : + 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; + case 4 : return MSH_LIN_5; + case 5 : return MSH_LIN_6; + case 6 : return MSH_LIN_7; + case 7 : return MSH_LIN_8; + case 8 : return MSH_LIN_9; + case 9 : return MSH_LIN_10; + case 10: return MSH_LIN_11; + default : Msg::Error("line order %i unknown", order); return 0; + } + break; + case TYPE_TRI : + switch(order) { + case 0 : return MSH_TRI_1; + case 1 : return MSH_TRI_3; + case 2 : return MSH_TRI_6; + case 3 : return serendip ? MSH_TRI_9 : MSH_TRI_10; + case 4 : return serendip ? MSH_TRI_12 : MSH_TRI_15; + case 5 : return serendip ? MSH_TRI_15I: MSH_TRI_21; + case 6 : return serendip ? MSH_TRI_18 : MSH_TRI_28; + case 7 : return serendip ? MSH_TRI_21I: MSH_TRI_36; + case 8 : return serendip ? MSH_TRI_24 : MSH_TRI_45; + case 9 : return serendip ? MSH_TRI_27 : MSH_TRI_55; + case 10: return serendip ? MSH_TRI_30 : MSH_TRI_66; + default : Msg::Error("triangle order %i unknown", order); return 0; + } + break; + case TYPE_QUA : + switch(order) { + case 0 : return MSH_QUA_1; + case 1 : return MSH_QUA_4; + case 2 : return serendip ? MSH_QUA_8 : MSH_QUA_9; + case 3 : return serendip ? MSH_QUA_12 : MSH_QUA_16; + case 4 : return serendip ? MSH_QUA_16I: MSH_QUA_25; + case 5 : return serendip ? MSH_QUA_20 : MSH_QUA_36; + case 6 : return serendip ? MSH_QUA_24 : MSH_QUA_49; + case 7 : return serendip ? MSH_QUA_28 : MSH_QUA_64; + case 8 : return serendip ? MSH_QUA_32 : MSH_QUA_81; + case 9 : return serendip ? MSH_QUA_36I: MSH_QUA_100; + case 10: return serendip ? MSH_QUA_40 : MSH_QUA_121; + default : Msg::Error("quad order %i unknown", order); return 0; + } + break; + case TYPE_TET : + switch(order) { + case 0 : return MSH_TET_1; + case 1 : return MSH_TET_4; + case 2 : return MSH_TET_10; + case 3 : return MSH_TET_20; + case 4 : return serendip ? MSH_TET_34 : MSH_TET_35; + case 5 : return serendip ? MSH_TET_52 : MSH_TET_56; + case 6 : return serendip ? MSH_TET_74 : MSH_TET_84; + case 7 : return serendip ? MSH_TET_100: MSH_TET_120; + case 8 : return serendip ? MSH_TET_130: MSH_TET_165; + case 9 : return serendip ? MSH_TET_164: MSH_TET_220; + case 10: return serendip ? MSH_TET_202: MSH_TET_286; + default : Msg::Error("terahedron order %i unknown", order); return 0; + } + break; + case TYPE_HEX : + switch(order) { + case 0 : return MSH_HEX_1; + case 1 : return MSH_HEX_8; + case 2 : return serendip ? MSH_HEX_20 : MSH_HEX_27; + case 3 : return serendip ? MSH_HEX_56 : MSH_HEX_64; + case 4 : return serendip ? MSH_HEX_98 : MSH_HEX_125; + case 5 : return serendip ? MSH_HEX_152: MSH_HEX_216; + case 6 : return serendip ? MSH_HEX_218: MSH_HEX_343; + case 7 : return serendip ? MSH_HEX_296: MSH_HEX_512; + case 8 : return serendip ? MSH_HEX_386: MSH_HEX_729; + case 9 : return serendip ? MSH_HEX_488: MSH_HEX_1000; + default : Msg::Error("hexahedron order %i unknown", order); return 0; + } + break; + case TYPE_PRI : + switch(order) { + case 0 : return MSH_PRI_1; + case 1 : return MSH_PRI_6; + case 2 : return serendip ? MSH_PRI_15 : MSH_PRI_18; + case 3 : return serendip ? MSH_PRI_38 : MSH_PRI_40; + case 4 : return serendip ? MSH_PRI_66 : MSH_PRI_75; + case 5 : return serendip ? MSH_PRI_102 : MSH_PRI_126; + case 6 : return serendip ? MSH_PRI_146 : MSH_PRI_196; + case 7 : return serendip ? MSH_PRI_198 : MSH_PRI_288; + case 8 : return serendip ? MSH_PRI_258 : MSH_PRI_405; + case 9 : return serendip ? MSH_PRI_326 : MSH_PRI_550; + default : Msg::Error("prism order %i unknown", order); return 0; + } + break; + case TYPE_PYR : + switch(order) { + case 0 : return MSH_PYR_1; + case 1 : return MSH_PYR_5; + case 2 : return serendip ? MSH_PYR_13 : MSH_PYR_14; + case 3: return serendip ? MSH_PYR_29 : MSH_PYR_30; + case 4: return serendip ? MSH_PYR_50 : MSH_PYR_55; + case 5: return serendip ? MSH_PYR_77 : MSH_PYR_91; + case 6: return serendip ? MSH_PYR_110 : MSH_PYR_140; + case 7: return serendip ? MSH_PYR_149 : MSH_PYR_204; + case 8: return serendip ? MSH_PYR_194 : MSH_PYR_285; + case 9: return serendip ? MSH_PYR_245 : MSH_PYR_385; + default : Msg::Error("pyramid order %i unknown", order); return 0; + } + break; + default : Msg::Error("unknown element type %i", parentTag); return 0; + } +} + MElement *MElementFactory::create(int type, std::vector<MVertex*> &v, int num, int part, bool owner, MElement *parent, MElement *d1, MElement *d2) diff --git a/Geo/MElement.h b/Geo/MElement.h index 06ed8d91df..910bab5210 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -369,6 +369,7 @@ class MElement static int OrderFromTag(int tag); static int SerendipityFromTag(int tag); static int DimensionFromTag(int tag); + static int getTag(int parentTag, int order, bool serendip = false); }; class MElementFactory{ diff --git a/Numeric/JacobianBasis.cpp b/Numeric/JacobianBasis.cpp index 4b4e661032..1acc387780 100644 --- a/Numeric/JacobianBasis.cpp +++ b/Numeric/JacobianBasis.cpp @@ -46,8 +46,8 @@ JacobianBasis::JacobianBasis(int tag) jacobianOrder = 0; break; } - jacType = polynomialBasis::getTag(parentType, jacobianOrder, false); - primJacType = polynomialBasis::getTag(parentType, primJacobianOrder, false); + jacType = MElement::getTag(parentType, jacobianOrder, false); + primJacType = MElement::getTag(parentType, primJacobianOrder, false); } // Store Bezier basis @@ -77,7 +77,7 @@ JacobianBasis::JacobianBasis(int tag) // Compute shape function gradients of primary mapping at barycenter, // in order to compute normal to straight element - const int primMapType = polynomialBasis::getTag(parentType, 1, false); + const int primMapType = MElement::getTag(parentType, 1, false); const nodalBasis *primMapBasis = BasisFactory::getNodalBasis(primMapType); numPrimMapNodes = primMapBasis->getNumShapeFunctions(); double xBar = 0., yBar = 0., zBar = 0.; diff --git a/Numeric/nodalBasis.cpp b/Numeric/nodalBasis.cpp index da3de9954c..f6375623b8 100644 --- a/Numeric/nodalBasis.cpp +++ b/Numeric/nodalBasis.cpp @@ -828,7 +828,7 @@ static void getFaceClosureTet(int iFace, int iSign, int iRotate, { closure.clear(); closure.resize((order + 1) * (order + 2) / 2); - closure.type = nodalBasis::getTag(TYPE_TRI, order, false); + closure.type = MElement::getTag(TYPE_TRI, order, false); switch (order){ case 0: @@ -925,7 +925,7 @@ static void generate2dEdgeClosureFull(nodalBasis::clCont &closure, if (serendip) break; } for (int r = 0; r < nNod*2 ; r++) { - closure[r].type = nodalBasis::getTag(TYPE_LIN, order); + closure[r].type = MElement::getTag(TYPE_LIN, order); closureRef[r] = 0; } } @@ -1141,7 +1141,7 @@ static void generateFaceClosureHex(nodalBasis::clCont &closure, int order, bool serendip, const fullMatrix<double> &points) { closure.clear(); - const nodalBasis &fsFace = *BasisFactory::getNodalBasis(nodalBasis::getTag(TYPE_QUA, order, serendip)); + const nodalBasis &fsFace = *BasisFactory::getNodalBasis(MElement::getTag(TYPE_QUA, order, serendip)); for (int iRotate = 0; iRotate < 4; iRotate++){ for (int iSign = 1; iSign >= -1; iSign -= 2){ for (int iFace = 0; iFace < 6; iFace++) { @@ -1230,7 +1230,7 @@ static void getFaceClosurePrism(int iFace, int iSign, int iRotate, // int order2node[5][4] = {{7, 9, 6, -1}, {12, 14, 13, -1}, {6, 10, 12, 8}, // {8, 13, 11, 7}, {9, 11, 14, 10}}; int nVertex = isTriangle ? 3 : 4; - closure.type = nodalBasis::getTag(isTriangle ? TYPE_TRI : TYPE_QUA, order); + closure.type = MElement::getTag(isTriangle ? TYPE_TRI : TYPE_QUA, order); for (int i = 0; i < nVertex; ++i){ int k = (nVertex + (iSign * i) + iRotate) % nVertex; //- iSign * iRotate closure[i] = order1node[iFace][k]; @@ -1354,7 +1354,7 @@ static void generate2dEdgeClosure(nodalBasis::clCont &closure, int order, int nN closure[j].push_back( nNod + (order-1)*j + i ); closure[nNod+j].push_back(nNod + (order-1)*(j+1) -i -1); } - closure[j].type = closure[nNod+j].type = nodalBasis::getTag(TYPE_LIN, order); + closure[j].type = closure[nNod+j].type = MElement::getTag(TYPE_LIN, order); } } diff --git a/Numeric/nodalBasis.h b/Numeric/nodalBasis.h index ead6c1ef4f..789783f948 100644 --- a/Numeric/nodalBasis.h +++ b/Numeric/nodalBasis.h @@ -55,8 +55,6 @@ class nodalBasis { virtual const std::vector<int> &getFullClosure(int id) const { return fullClosures[id]; } inline int getClosureId(int iFace, int iSign=1, int iRot=0) const; inline void breakClosureId(int i, int &iFace, int &iSign, int &iRot) const; - - static inline int getTag(int parentTag, int order, bool serendip = false); }; @@ -78,124 +76,4 @@ inline void nodalBasis::breakClosureId(int i, int &iFace, int &iSign, int &iRot) -inline int nodalBasis::getTag(int parentTag, int order, bool serendip) -{ - switch (parentTag) { - case TYPE_PNT : - return MSH_PNT; - case TYPE_LIN : - 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; - case 4 : return MSH_LIN_5; - case 5 : return MSH_LIN_6; - case 6 : return MSH_LIN_7; - case 7 : return MSH_LIN_8; - case 8 : return MSH_LIN_9; - case 9 : return MSH_LIN_10; - case 10: return MSH_LIN_11; - default : Msg::Error("line order %i unknown", order); return 0; - } - break; - case TYPE_TRI : - switch(order) { - case 0 : return MSH_TRI_1; - case 1 : return MSH_TRI_3; - case 2 : return MSH_TRI_6; - case 3 : return serendip ? MSH_TRI_9 : MSH_TRI_10; - case 4 : return serendip ? MSH_TRI_12 : MSH_TRI_15; - case 5 : return serendip ? MSH_TRI_15I: MSH_TRI_21; - case 6 : return serendip ? MSH_TRI_18 : MSH_TRI_28; - case 7 : return serendip ? MSH_TRI_21I: MSH_TRI_36; - case 8 : return serendip ? MSH_TRI_24 : MSH_TRI_45; - case 9 : return serendip ? MSH_TRI_27 : MSH_TRI_55; - case 10: return serendip ? MSH_TRI_30 : MSH_TRI_66; - default : Msg::Error("triangle order %i unknown", order); return 0; - } - break; - case TYPE_QUA : - switch(order) { - case 0 : return MSH_QUA_1; - case 1 : return MSH_QUA_4; - case 2 : return serendip ? MSH_QUA_8 : MSH_QUA_9; - case 3 : return serendip ? MSH_QUA_12 : MSH_QUA_16; - case 4 : return serendip ? MSH_QUA_16I: MSH_QUA_25; - case 5 : return serendip ? MSH_QUA_20 : MSH_QUA_36; - case 6 : return serendip ? MSH_QUA_24 : MSH_QUA_49; - case 7 : return serendip ? MSH_QUA_28 : MSH_QUA_64; - case 8 : return serendip ? MSH_QUA_32 : MSH_QUA_81; - case 9 : return serendip ? MSH_QUA_36I: MSH_QUA_100; - case 10: return serendip ? MSH_QUA_40 : MSH_QUA_121; - default : Msg::Error("quad order %i unknown", order); return 0; - } - break; - case TYPE_TET : - switch(order) { - case 0 : return MSH_TET_1; - case 1 : return MSH_TET_4; - case 2 : return MSH_TET_10; - case 3 : return MSH_TET_20; - case 4 : return serendip ? MSH_TET_34 : MSH_TET_35; - case 5 : return serendip ? MSH_TET_52 : MSH_TET_56; - case 6 : return serendip ? MSH_TET_74 : MSH_TET_84; - case 7 : return serendip ? MSH_TET_100: MSH_TET_120; - case 8 : return serendip ? MSH_TET_130: MSH_TET_165; - case 9 : return serendip ? MSH_TET_164: MSH_TET_220; - case 10: return serendip ? MSH_TET_202: MSH_TET_286; - default : Msg::Error("terahedron order %i unknown", order); return 0; - } - break; - case TYPE_HEX : - switch(order) { - case 0 : return MSH_HEX_1; - case 1 : return MSH_HEX_8; - case 2 : return serendip ? MSH_HEX_20 : MSH_HEX_27; - case 3 : return serendip ? MSH_HEX_56 : MSH_HEX_64; - case 4 : return serendip ? MSH_HEX_98 : MSH_HEX_125; - case 5 : return serendip ? MSH_HEX_152: MSH_HEX_216; - case 6 : return serendip ? MSH_HEX_218: MSH_HEX_343; - case 7 : return serendip ? MSH_HEX_296: MSH_HEX_512; - case 8 : return serendip ? MSH_HEX_386: MSH_HEX_729; - case 9 : return serendip ? MSH_HEX_488: MSH_HEX_1000; - default : Msg::Error("hexahedron order %i unknown", order); return 0; - } - break; - case TYPE_PRI : - switch(order) { - case 0 : return MSH_PRI_1; - case 1 : return MSH_PRI_6; - case 2 : return serendip ? MSH_PRI_15 : MSH_PRI_18; - case 3 : return serendip ? MSH_PRI_38 : MSH_PRI_40; - case 4 : return serendip ? MSH_PRI_66 : MSH_PRI_75; - case 5 : return serendip ? MSH_PRI_102 : MSH_PRI_126; - case 6 : return serendip ? MSH_PRI_146 : MSH_PRI_196; - case 7 : return serendip ? MSH_PRI_198 : MSH_PRI_288; - case 8 : return serendip ? MSH_PRI_258 : MSH_PRI_405; - case 9 : return serendip ? MSH_PRI_326 : MSH_PRI_550; - default : Msg::Error("prism order %i unknown", order); return 0; - } - break; - case TYPE_PYR : - switch(order) { - case 0 : return MSH_PYR_1; - case 1 : return MSH_PYR_5; - case 2 : return serendip ? MSH_PYR_13 : MSH_PYR_14; - case 3: return serendip ? MSH_PYR_29 : MSH_PYR_30; - case 4: return serendip ? MSH_PYR_50 : MSH_PYR_55; - case 5: return serendip ? MSH_PYR_77 : MSH_PYR_91; - case 6: return serendip ? MSH_PYR_110 : MSH_PYR_140; - case 7: return serendip ? MSH_PYR_149 : MSH_PYR_204; - case 8: return serendip ? MSH_PYR_194 : MSH_PYR_285; - case 9: return serendip ? MSH_PYR_245 : MSH_PYR_385; - default : Msg::Error("pyramid order %i unknown", order); return 0; - } - break; - default : Msg::Error("unknown element type %i", parentTag); return 0; - } -} - - - #endif diff --git a/contrib/DiscreteIntegration/Integration3D.cpp b/contrib/DiscreteIntegration/Integration3D.cpp index 3d2dbaba46..1716ca129f 100644 --- a/contrib/DiscreteIntegration/Integration3D.cpp +++ b/contrib/DiscreteIntegration/Integration3D.cpp @@ -1044,7 +1044,7 @@ bool DI_ElementLessThan::operator()(const DI_Element *e1, const DI_Element *e2) // DI_Line methods -------------------------------------------------------------------------------- const nodalBasis* DI_Line::getFunctionSpace(int o) const{ int order = (o == -1) ? getPolynomialOrder() : o; - int tag = polynomialBasis::getTag(TYPE_LIN, order); + int tag = MElement::getTag(TYPE_LIN, order); return BasisFactory::getNodalBasis(tag); } @@ -1065,7 +1065,7 @@ void DI_Line::computeIntegral() { const nodalBasis* DI_Triangle::getFunctionSpace(int o) const { int order = (o == -1) ? getPolynomialOrder() : o; - int tag = polynomialBasis::getTag(TYPE_TRI, order); + int tag = MElement::getTag(TYPE_TRI, order); return BasisFactory::getNodalBasis(tag); } void DI_Triangle::computeIntegral() { @@ -1089,7 +1089,7 @@ double DI_Triangle::quality() const { // DI_Quad methods -------------------------------------------------------------------------------- const nodalBasis* DI_Quad::getFunctionSpace(int o) const{ int order = (o == -1) ? getPolynomialOrder() : o; - int tag = polynomialBasis::getTag(TYPE_QUA, order); + int tag = MElement::getTag(TYPE_QUA, order); return BasisFactory::getNodalBasis(tag); } @@ -1113,7 +1113,7 @@ void DI_Quad::computeIntegral() { // DI_Tetra methods ------------------------------------------------------------------------------- const nodalBasis* DI_Tetra::getFunctionSpace(int o) const{ int order = (o == -1) ? getPolynomialOrder() : o; - int tag = polynomialBasis::getTag(TYPE_TET, order); + int tag = MElement::getTag(TYPE_TET, order); return BasisFactory::getNodalBasis(tag); } @@ -1128,7 +1128,7 @@ double DI_Tetra::quality() const { // Hexahedron methods ----------------------------------------------------------------------------- const nodalBasis* DI_Hexa::getFunctionSpace(int o) const{ int order = (o == -1) ? getPolynomialOrder() : o; - int tag = polynomialBasis::getTag(TYPE_HEX, order); + int tag = MElement::getTag(TYPE_HEX, order); return BasisFactory::getNodalBasis(tag); } void DI_Hexa::computeIntegral() { -- GitLab