From 50522149e2996ee94bdd12c59ada0e07fd56e78d Mon Sep 17 00:00:00 2001 From: Tuomas Karna <tuomas.karna@uclouvain.be> Date: Tue, 4 Jan 2011 16:24:44 +0000 Subject: [PATCH] fullClosure for second order prisms --- Numeric/polynomialBasis.cpp | 42 +++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/Numeric/polynomialBasis.cpp b/Numeric/polynomialBasis.cpp index d2221f8ed6..81be8ed044 100644 --- a/Numeric/polynomialBasis.cpp +++ b/Numeric/polynomialBasis.cpp @@ -22,11 +22,14 @@ static void printClosure(polynomialBasis::clCont &fullClosure, std::vector<int> continue; } for (int j = 0; j < fullClosure[i].size(); j++) { - printf("%i ", fullClosure[i][j]); + printf("%2i ", fullClosure[i][j]); } printf (" -- "); for (int j = 0; j < closures[closureRef[i]].size(); j++) { - printf("%i-%i ", fullClosure[i][closures[closureRef[i]][j]], closures[i][j]); + std::string equalSign = "-"; + if (fullClosure[i][closures[closureRef[i]][j]] != closures[i][j]) + equalSign = "#"; + printf("%2i%s%2i ", fullClosure[i][closures[closureRef[i]][j]],equalSign.c_str(), closures[i][j]); } printf("\n"); } @@ -1206,6 +1209,41 @@ static void generateFaceClosurePrismFull(polynomialBasis::clCont &closureFull, s } static const int edges[] = {0, 1, 0, 2, 0, 3, 1, 2, 1, 4, 2, 5, 3, 4, 3, 5, 4, 5, -1}; addEdgeNodes(closureFull, edges, order); + if ( order < 2 ) + return; + // face center nodes for p2 prism + static const int faces[5][4] = {{0, 2, 1, -1}, {3, 4, 5, -1}, {0, 1, 4, 3}, {0, 3, 5, 2}, {1, 2, 5, 4}}; + + if ( order == 2 ) { + int nextFaceNode = 15; + int numFaces = 5; + int numFaceNodes = 4; + std::map<int,int> nodeSum2Face; + for (int iFace = 0; iFace < numFaces ; iFace ++) { + int nodeSum = 0; + for (int iNode = 0; iNode < numFaceNodes; iNode++ ) { + nodeSum += faces[iFace][iNode]; + } + nodeSum2Face[nodeSum] = iFace; + } + for (int i = 0; i < closureFull.size(); i++ ) { + for (int iFace = 0; iFace < numFaces; iFace++ ) { + int nodeSum = 0; + for (int iNode = 0; iNode < numFaceNodes; iNode++) + nodeSum += faces[iFace][iNode] < 0 ? faces[iFace][iNode] : closureFull[i][ faces[iFace][iNode] ]; + std::map<int,int>::iterator it = nodeSum2Face.find(nodeSum); + if (it == nodeSum2Face.end() ) + Msg::Error("Prism face not found"); + int mappedFaceId = it->second; + if ( mappedFaceId > 1) { + closureFull[i].push_back(nextFaceNode + mappedFaceId - 2); + } + } + } + } else { + Msg::Error("Prisms of order %d not implemented",order); + } + } static void generate2dEdgeClosure(polynomialBasis::clCont &closure, int order, int nNod = 3) -- GitLab