diff --git a/Numeric/JacobianBasis.cpp b/Numeric/JacobianBasis.cpp index 9be19e2ec503dcb360501dea4ff945dbabf57138..76077e344f01397c4c175a927e411832bf52097e 100644 --- a/Numeric/JacobianBasis.cpp +++ b/Numeric/JacobianBasis.cpp @@ -1198,181 +1198,84 @@ const JacobianBasis *JacobianBases::find(int tag) JacobianBasis B; B.numLagPts = -1; - int order; - - - if (tag == MSH_PNT) { - B.numLagPts = 1; - B.exposants = generate1DExposants(0); - B.points = generate1DPoints(0); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, 0, 0); - /*std::vector< fullMatrix<double> > subPoints = generateSubPointsLine(0); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, 0, 0); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients);*/ - goto end; - } - - - switch (tag) { - case MSH_LIN_2: order = 1; break; - case MSH_LIN_3: order = 2; break; - case MSH_LIN_4: order = 3; break; - case MSH_LIN_5: order = 4; break; - case MSH_LIN_6: order = 5; break; - case MSH_LIN_7: order = 6; break; - case MSH_LIN_8: order = 7; break; - case MSH_LIN_9: order = 8; break; - case MSH_LIN_10: order = 9; break; - case MSH_LIN_11: order = 10; break; - default: order = -1; break; - } - if (order >= 0) { - int o = order - 1; - B.numLagPts = 2; - B.exposants = generate1DExposants(o); - B.points = generate1DPoints(o); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 0); - std::vector< fullMatrix<double> > subPoints = generateSubPointsLine(0); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 0); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); - goto end; - } - - - - switch (tag) { - case MSH_TRI_3 : order = 1; break; - case MSH_TRI_6 : order = 2; break; - case MSH_TRI_9 : - case MSH_TRI_10 : order = 3; break; - case MSH_TRI_12 : - case MSH_TRI_15 : order = 4; break; - case MSH_TRI_15I : - case MSH_TRI_21 : order = 5; break; - case MSH_TRI_18 : - case MSH_TRI_28 : order = 6; break; - case MSH_TRI_21I : - case MSH_TRI_36 : order = 7; break; - case MSH_TRI_24 : - case MSH_TRI_45 : order = 8; break; - case MSH_TRI_27 : - case MSH_TRI_55 : order = 9; break; - case MSH_TRI_30 : - case MSH_TRI_66 : order = 10; break; - default: order = -1; break; - } - if (order >= 0) { - int o = 2 * (order - 1); - B.numLagPts = 3; - B.exposants = generateExposantsTriangle(o); - B.points = gmshGeneratePointsTriangle(o,false); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 2); - std::vector< fullMatrix<double> > subPoints = generateSubPointsTriangle(o); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 2); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); - goto end; - } - - - switch (tag) { - case MSH_TET_4 : order = 1; break; - case MSH_TET_10 : order = 2; break; - case MSH_TET_20 : order = 3; break; - case MSH_TET_34 : - case MSH_TET_35 : order = 4; break; - case MSH_TET_52 : - case MSH_TET_56 : order = 5; break; - case MSH_TET_84 : order = 6; break; - case MSH_TET_120 : order = 7; break; - case MSH_TET_165 : order = 8; break; - case MSH_TET_220 : order = 9; break; - case MSH_TET_286 : order = 10; break; - default: order = -1; break; - } - if (order >= 0) { - int o = 3 * (order - 1); - B.numLagPts = 4; - B.exposants = generateExposantsTetrahedron(o); - B.points = gmshGeneratePointsTetrahedron(o,false); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 3); - std::vector< fullMatrix<double> > subPoints = generateSubPointsTetrahedron(o); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 3); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); - goto end; - } - - - switch (tag) { - case MSH_QUA_4 : order = 1; break; - case MSH_QUA_8 : - case MSH_QUA_9 : order = 2; break; - case MSH_QUA_12 : - case MSH_QUA_16 : order = 3; break; - case MSH_QUA_16I : - case MSH_QUA_25 : order = 4; break; - case MSH_QUA_20 : - case MSH_QUA_36 : order = 5; break; - case MSH_QUA_24 : - case MSH_QUA_49 : order = 6; break; - case MSH_QUA_28 : - case MSH_QUA_64 : order = 7; break; - case MSH_QUA_32 : - case MSH_QUA_81 : order = 8; break; - case MSH_QUA_36I : - case MSH_QUA_100 : order = 9; break; - case MSH_QUA_40 : - case MSH_QUA_121 : order = 10; break; - default: order = -1; break; - } - if (order >= 0) { - int o = 2 * order - 1; - B.numLagPts = 4; - B.exposants = generateExposantsQuad(o); - B.points = generatePointsQuad(o,false); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 0); - std::vector< fullMatrix<double> > subPoints = generateSubPointsQuad(o); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 0); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); - goto end; - } - - - switch (tag) { - case MSH_PRI_6 : order = 1; break; - case MSH_PRI_18 : order = 2; break; - default: order = -1; break; - } - if (order >= 0) { - int o = order * 3 - 1; // o=3*ord-2 on triangle base and =3*ord-1 for third dimension - B.numLagPts = 4; - B.exposants = generateExposantsPrism(o); - B.points = generatePointsPrism(o,false); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 2); - std::vector< fullMatrix<double> > subPoints = generateSubPointsPrism(o); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 2); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); - } - else { - Msg::Error("Unknown function space %d: reverting to TET_4", tag); - B.numLagPts = 4; - B.exposants = generateExposantsTetrahedron(0); - B.points = gmshGeneratePointsTetrahedron(0,false); - B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, 0, 3); - std::vector< fullMatrix<double> > subPoints = generateSubPointsTetrahedron(0); - B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, 0, 3); - const polynomialBasis *F = polynomialBases::find(tag); - generateGradShapes(B, B.points, F->monomials, F->coefficients); + const polynomialBasis *F = polynomialBases::find(tag); + int order = F->order; + switch (F->parentType) { + case TYPE_PNT : + B.numLagPts = 1; + B.exposants = generate1DExposants(0); + B.points = generate1DPoints(0); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, 0, 0); + break; + case TYPE_LIN : { + int o = order - 1; + B.numLagPts = 2; + B.exposants = generate1DExposants(o); + B.points = generate1DPoints(o); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 0); + std::vector< fullMatrix<double> > subPoints = generateSubPointsLine(0); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 0); + const polynomialBasis *F = polynomialBases::find(tag); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + break; + } + case TYPE_TRI : { + int o = 2 * (order - 1); + B.numLagPts = 3; + B.exposants = generateExposantsTriangle(o); + B.points = gmshGeneratePointsTriangle(o,false); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 2); + std::vector< fullMatrix<double> > subPoints = generateSubPointsTriangle(o); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 2); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + break; + } + case TYPE_TET : { + int o = 3 * (order - 1); + B.numLagPts = 4; + B.exposants = generateExposantsTetrahedron(o); + B.points = gmshGeneratePointsTetrahedron(o,false); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 3); + std::vector< fullMatrix<double> > subPoints = generateSubPointsTetrahedron(o); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 3); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + break; + } + case TYPE_QUA : { + int o = 2 * order - 1; + B.numLagPts = 4; + B.exposants = generateExposantsQuad(o); + B.points = generatePointsQuad(o,false); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 0); + std::vector< fullMatrix<double> > subPoints = generateSubPointsQuad(o); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 0); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + break; + } + case TYPE_PRI : { + int o = order * 3 - 1; // o=3*ord-2 on triangle base and =3*ord-1 for third dimension + B.numLagPts = 4; + B.exposants = generateExposantsPrism(o); + B.points = generatePointsPrism(o,false); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, o, 2); + std::vector< fullMatrix<double> > subPoints = generateSubPointsPrism(o); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, o, 2); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + break; + } + default : { + Msg::Error("Unknown function space %d: reverting to TET_4", tag); + B.numLagPts = 4; + B.exposants = generateExposantsTetrahedron(0); + B.points = gmshGeneratePointsTetrahedron(0,false); + B.matrixLag2Bez = generateLag2BezMatrix(B.exposants, B.points, 0, 3); + std::vector< fullMatrix<double> > subPoints = generateSubPointsTetrahedron(0); + B.divisor = generateDivisor(B.exposants, subPoints, B.matrixLag2Bez, 0, 3); + F = polynomialBases::find(MSH_TET_4); + generateGradShapes(B, B.points, F->monomials, F->coefficients); + } } - -end : - B.numDivisions = (int) pow(2., (int) B.points.size2()); fs.insert(std::make_pair(tag, B));