diff --git a/FunctionSpace/Basis.h b/FunctionSpace/Basis.h index 6cd443357a881066c751f63b1deec58579ff3415..9c0ceb0e98e85f5c9b100725cc071336def3fafe 100644 --- a/FunctionSpace/Basis.h +++ b/FunctionSpace/Basis.h @@ -2,6 +2,7 @@ #define _BASIS_H_ #include "MElement.h" +#include "ReferenceSpace.h" /** @interface Basis @@ -43,6 +44,8 @@ class Basis{ protected: + ReferenceSpace* refSpace; + bool scalar; bool local; @@ -78,17 +81,11 @@ class Basis{ unsigned int getNFunction(void) const; // Reference Element // + const ReferenceSpace& getReferenceSpace(void) const; + virtual unsigned int getNOrientation(void) const = 0; virtual unsigned int getOrientation(const MElement& element) const = 0; - virtual void mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const = 0; - - // Functions Ordering // - virtual std::vector<size_t> - getFunctionOrdering(const MElement& element) const = 0; - // Direct Access to Evaluated Functions // virtual void getFunctions(fullMatrix<double>& retValues, const MElement& element, @@ -115,6 +112,8 @@ class Basis{ virtual const fullMatrix<double>& getPreEvaluatedDerivatives(unsigned int orientation) const = 0; + virtual std::string toString(void) const = 0; + protected: // 'Constructor' // Basis(void); @@ -327,4 +326,8 @@ inline unsigned int Basis::getNFunction(void) const{ return nFunction; } +inline const ReferenceSpace& Basis::getReferenceSpace(void) const{ + return *refSpace; +} + #endif diff --git a/FunctionSpace/BasisHierarchical0From.cpp b/FunctionSpace/BasisHierarchical0From.cpp index cc3a579c4c40fd2f5f7f2711945c4aeca7aba402..7f5a1597f5b5f5e17aa1890f13edd99cae3e178e 100644 --- a/FunctionSpace/BasisHierarchical0From.cpp +++ b/FunctionSpace/BasisHierarchical0From.cpp @@ -59,49 +59,6 @@ getOrientation(const MElement& element) const{ return refSpace->getReferenceSpace(element); } -void BasisHierarchical0From::mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const{ - return refSpace->mapFromXYZtoABC(element, xyz, abc); -} - -vector<size_t> BasisHierarchical0From:: -getFunctionOrdering(const MElement& element) const{ - vector<size_t> ordering(nFunction); - - for(size_t i = 0; i < nFunction; i++) - ordering[i] = i; - - /* - if(element.getNum() == 5){ - ordering[0] = 0; - ordering[1] = 1; - ordering[2] = 2; - ordering[3] = 3; - ordering[4] = 4; - ordering[5] = 5; - ordering[6] = 6; - ordering[7] = 7; - ordering[8] = 8; - ordering[9] = 9; - } - - else{ - ordering[0] = 2; - ordering[1] = 0; - ordering[2] = 1; - ordering[3] = 7; - ordering[4] = 8; - ordering[5] = 3; - ordering[6] = 4; - ordering[7] = 5; - ordering[8] = 6; - ordering[9] = 9; - } - */ - return ordering; -} - void BasisHierarchical0From:: getFunctions(fullMatrix<double>& retValues, const MElement& element, diff --git a/FunctionSpace/BasisHierarchical0From.h b/FunctionSpace/BasisHierarchical0From.h index 96377520d72d392c672e0e6d9889b018f396593d..b2ee85c0edf9fbfdb6d05a87cfc33421ba41c763 100644 --- a/FunctionSpace/BasisHierarchical0From.h +++ b/FunctionSpace/BasisHierarchical0From.h @@ -16,8 +16,7 @@ class BasisHierarchical0From: public BasisLocal{ protected: // Orientation // - ReferenceSpace* refSpace; - unsigned int nRefSpace; + unsigned int nRefSpace; // Basis // Polynomial*** basis; @@ -39,13 +38,6 @@ class BasisHierarchical0From: public BasisLocal{ virtual unsigned int getNOrientation(void) const; virtual unsigned int getOrientation(const MElement& element) const; - virtual void mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const; - - virtual std::vector<size_t> - getFunctionOrdering(const MElement& element) const; - virtual void getFunctions(fullMatrix<double>& retValues, const MElement& element, double u, double v, double w) const; diff --git a/FunctionSpace/BasisHierarchical1From.cpp b/FunctionSpace/BasisHierarchical1From.cpp index fa94def81bbf88b53f34abd806d41e8cea0391c5..ea8e5442e1659fdb1cf4b9ab6bc710ddead33ffa 100644 --- a/FunctionSpace/BasisHierarchical1From.cpp +++ b/FunctionSpace/BasisHierarchical1From.cpp @@ -59,22 +59,6 @@ getOrientation(const MElement& element) const{ return refSpace->getReferenceSpace(element); } -void BasisHierarchical1From::mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const{ - return refSpace->mapFromXYZtoABC(element, xyz, abc); -} - -vector<size_t> BasisHierarchical1From:: -getFunctionOrdering(const MElement& element) const{ - vector<size_t> ordering(nFunction); - - for(size_t i = 0; i < nFunction; i++) - ordering[i] = i; - - return ordering; -} - void BasisHierarchical1From:: getFunctions(fullMatrix<double>& retValues, const MElement& element, diff --git a/FunctionSpace/BasisHierarchical1From.h b/FunctionSpace/BasisHierarchical1From.h index f72d061ef5c28ea3bed87dbacd557237b2f29354..9c67fca2c4931723fac29193c5d11151361ef5c9 100644 --- a/FunctionSpace/BasisHierarchical1From.h +++ b/FunctionSpace/BasisHierarchical1From.h @@ -16,8 +16,7 @@ class BasisHierarchical1From: public BasisLocal{ protected: // Orientation // - ReferenceSpace* refSpace; - unsigned int nRefSpace; + unsigned int nRefSpace; // Basis // std::vector<Polynomial>*** basis; @@ -39,13 +38,6 @@ class BasisHierarchical1From: public BasisLocal{ virtual unsigned int getNOrientation(void) const; virtual unsigned int getOrientation(const MElement& element) const; - virtual void mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const; - - virtual std::vector<size_t> - getFunctionOrdering(const MElement& element) const; - virtual void getFunctions(fullMatrix<double>& retValues, const MElement& element, double u, double v, double w) const; diff --git a/FunctionSpace/BasisLagrange.cpp b/FunctionSpace/BasisLagrange.cpp index 592af30b3c9eaec9969623cda5b69011581745ea..7e5584cd16160cac62a7e3124e7a18e83d0801a9 100644 --- a/FunctionSpace/BasisLagrange.cpp +++ b/FunctionSpace/BasisLagrange.cpp @@ -29,7 +29,7 @@ unsigned int BasisLagrange:: getOrientation(const MElement& element) const{ return 0; } - +/* static bool sortPredicate(const std::pair<size_t, size_t>& a, const std::pair<size_t, size_t>& b){ @@ -85,7 +85,7 @@ void BasisLagrange::mapFromXYZtoABC(const MElement& element, vector<size_t> BasisLagrange:: getFunctionOrdering(const MElement& element) const{ - /* + static bool once = true; if(once){ @@ -99,11 +99,11 @@ getFunctionOrdering(const MElement& element) const{ once = false; } - */ + vector<int> rNodeId = reducedNodeId(element); const size_t closureId = matchClosure(rNodeId, lBasis->fullClosures); - /* + vector<int>& closure = lBasis->fullClosures[closureId]; vector<size_t> myClosure(closure.size()); @@ -112,7 +112,7 @@ getFunctionOrdering(const MElement& element) const{ myClosure[i] = closure[i]; return myClosure; - */ + vector<size_t> c(10); if(closureId == 0){ @@ -143,7 +143,7 @@ getFunctionOrdering(const MElement& element) const{ return c; } - +*/ void BasisLagrange:: getFunctions(fullMatrix<double>& retValues, const MElement& element, @@ -307,3 +307,7 @@ project(const MElement& element, // Return ; return newCoef; } + +std::string BasisLagrange::toString(void) const{ + return std::string("BasisLagrange::toString() not Implemented"); +} diff --git a/FunctionSpace/BasisLagrange.h b/FunctionSpace/BasisLagrange.h index 23cd49da568d2d821051d0728e884be44b62003f..913be52da98aa8d617ccc5f834350eb781869c98 100644 --- a/FunctionSpace/BasisLagrange.h +++ b/FunctionSpace/BasisLagrange.h @@ -43,13 +43,6 @@ class BasisLagrange: public BasisLocal{ virtual unsigned int getNOrientation(void) const; virtual unsigned int getOrientation(const MElement& element) const; - virtual void mapFromXYZtoABC(const MElement& element, - const fullVector<double>& xyz, - double abc[3]) const; - - virtual std::vector<size_t> - getFunctionOrdering(const MElement& element) const; - virtual void getFunctions(fullMatrix<double>& retValues, const MElement& element, double u, double v, double w) const; @@ -86,6 +79,8 @@ class BasisLagrange: public BasisLocal{ const std::vector<double>& coef, const FunctionSpaceVector& fSpace); + virtual std::string toString(void) const; + protected: BasisLagrange(void); }; diff --git a/FunctionSpace/FunctionSpace.cpp b/FunctionSpace/FunctionSpace.cpp index bc3488878c10072737750b2b2b7aca06f76be29c..ef98d9eae5c8fa0d40f98f71e3b4fc20c42dede9 100644 --- a/FunctionSpace/FunctionSpace.cpp +++ b/FunctionSpace/FunctionSpace.cpp @@ -114,19 +114,8 @@ void FunctionSpace::buildDof(void){ for(unsigned int j = 0; j < nDof; j++) insertDof(myDof[j], trueDof, j); - // Dof Orderning - vector<size_t> dofOrder = (*basis)[0]->getFunctionOrdering(*(element[i])); - vector<const Dof*> trueDofOrdered(nDof); - - for(size_t j = 0; j < nDof; j++) - trueDofOrdered[dofOrder[j]] = trueDof[j]; - /* - for(size_t j = 0; j < nDof; j++) - cout << dofOrder[j] << "\t"; - cout << endl; - */ // Create new GroupOfDof - GroupOfDof* god = new GroupOfDof(*(element[i]), trueDofOrdered); + GroupOfDof* god = new GroupOfDof(*(element[i]), trueDof); (*group)[i] = god; // Map GOD @@ -162,26 +151,39 @@ vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ // Const_Cast // MElement& element = const_cast<MElement&>(elem); - // Get Element Data // - const unsigned int nVertex = element.getNumPrimaryVertices(); - const unsigned int nEdge = element.getNumEdges(); - const unsigned int nFace = element.getNumFaces(); + // Create New Element With Permuted Vertices // + // Permutation + const vector<size_t>& vPerm = + (*this->basis)[0]->getReferenceSpace().getNodeIndexFromABCtoUVW(elem); + // Permuted Vertices + const size_t nVertex = element.getNumPrimaryVertices(); vector<MVertex*> vertex(nVertex); + + for(size_t i = 0; i < nVertex; i++) + vertex[i] = element.getVertex(vPerm[i]); + + // New Element + MElementFactory factory; + MElement* permElement = factory.create(elem.getTypeForMSH(), vertex); + + // Edge & Face from Permuted Element // + const size_t nEdge = permElement->getNumEdges(); + const size_t nFace = permElement->getNumFaces(); + vector<MEdge> edge(nEdge); vector<MFace> face(nFace); - for(unsigned int i = 0; i < nVertex; i++) - vertex[i] = element.getVertex(i); + for(size_t i = 0; i < nEdge; i++) + edge[i] = permElement->getEdge(i); - for(unsigned int i = 0; i < nEdge; i++) - edge[i] = element.getEdge(i); + for(size_t i = 0; i < nFace; i++) + face[i] = permElement->getFace(i); - for(unsigned int i = 0; i < nFace; i++) - face[i] = element.getFace(i); + delete permElement; // Create Dof // - unsigned int nDof = + size_t nDof = fPerVertex * nVertex + fPerEdge * nEdge + fPerFace * nFace + @@ -189,34 +191,34 @@ vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ vector<Dof> myDof(nDof); - unsigned int it = 0; + size_t it = 0; // Add Vertex Based Dof // - for(unsigned int i = 0; i < nVertex; i++){ - for(unsigned int j = 0; j < fPerVertex; j++){ + for(size_t i = 0; i < nVertex; i++){ + for(size_t j = 0; j < fPerVertex; j++){ myDof[it].setDof(mesh->getGlobalId(*vertex[i]), j); it++; } } // Add Edge Based Dof // - for(unsigned int i = 0; i < nEdge; i++){ - for(unsigned int j = 0; j < fPerEdge; j++){ + for(size_t i = 0; i < nEdge; i++){ + for(size_t j = 0; j < fPerEdge; j++){ myDof[it].setDof(mesh->getGlobalId(edge[i]), j); it++; } } // Add Face Based Dof // - for(unsigned int i = 0; i < nFace; i++){ - for(unsigned int j = 0; j < fPerFace; j++){ + for(size_t i = 0; i < nFace; i++){ + for(size_t j = 0; j < fPerFace; j++){ myDof[it].setDof(mesh->getGlobalId(face[i]), j); it++; } } // Add Cell Based Dof // - for(unsigned int j = 0; j < fPerCell; j++){ + for(size_t j = 0; j < fPerCell; j++){ myDof[it].setDof(mesh->getGlobalId(element), j); it++; } @@ -224,9 +226,11 @@ vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ return myDof; } -const GroupOfDof& FunctionSpace::getGoDFromElement(const MElement& element) const{ - const map<const MElement*, const GroupOfDof*, ElementComparator>::iterator it = - eToGod->find(&element); +const GroupOfDof& FunctionSpace:: +getGoDFromElement(const MElement& element) const{ + + const map<const MElement*, const GroupOfDof*, ElementComparator>::iterator + it = eToGod->find(&element); if(it == eToGod->end()) throw diff --git a/FunctionSpace/FunctionSpaceScalar.cpp b/FunctionSpace/FunctionSpaceScalar.cpp index 8e888e9c49a12cc6398bda1f81199f50329a9c1c..1c294d6a85add94ad1abb0b82f0298075c32beed 100644 --- a/FunctionSpace/FunctionSpaceScalar.cpp +++ b/FunctionSpace/FunctionSpaceScalar.cpp @@ -14,87 +14,10 @@ double FunctionSpaceScalar:: interpolate(const MElement& element, const std::vector<double>& coef, const fullVector<double>& xyz) const{ - /* - // Const Cast For MElement // - MElement& eelement = - const_cast<MElement&>(element); - - // Get Reference coordinate // - double phys[3] = {xyz(0), xyz(1), xyz(2)}; - double uvw[3]; - double abc[3]; - - eelement.xyz2uvw(phys, uvw); - - // Compute coordinate in abc Space // - std::vector<size_t> order = (*basis)[0]->getFunctionOrdering(element); - double abcMat[3][3]; - double abcPnt[3][3]; - - element.getNode(0, abcPnt[0][0], abcPnt[0][1], abcPnt[0][2]); - element.getNode(1, abcPnt[1][0], abcPnt[1][1], abcPnt[1][2]); - element.getNode(2, abcPnt[2][0], abcPnt[2][1], abcPnt[2][2]); - - std::cout << order[0] << " | " - << order[1] << " | " - << order[2] << std::endl; - - abcMat[0][0] = abcPnt[0][0]; - abcMat[0][1] = abcPnt[1][0]; - abcMat[0][2] = abcPnt[2][0]; - - abcMat[1][0] = abcPnt[0][1]; - abcMat[1][1] = abcPnt[1][1]; - abcMat[1][2] = abcPnt[2][1]; - - abcMat[2][0] = abcPnt[0][2]; - abcMat[2][1] = abcPnt[1][2]; - abcMat[2][2] = abcPnt[2][2]; - - for(size_t i = 0; i < 3; i++){ - for(size_t j = 0; j < 3; j++) - std::cout << abcMat[i][j] << "\t"; - std::cout << std::endl; - } - std::cout << std::endl; - - double phiUVW[3]; - element.getShapeFunctions(uvw[0], uvw[1], uvw[2], phiUVW); - - size_t trueOrder[3]; - - for(size_t i = 0; i < 3; i++){ - size_t idx; - - for(idx = 0; order[idx] != i; idx++) - ; - - trueOrder[i] = idx; - } - - abc[0] = - abcMat[0][0] * phiUVW[trueOrder[0]] + - abcMat[0][1] * phiUVW[trueOrder[1]] + - abcMat[0][2] * phiUVW[trueOrder[2]]; - - abc[1] = - abcMat[1][0] * phiUVW[trueOrder[0]] + - abcMat[1][1] * phiUVW[trueOrder[1]] + - abcMat[1][2] * phiUVW[trueOrder[2]]; - - abc[2] = - abcMat[2][0] * phiUVW[trueOrder[0]] + - abcMat[2][1] * phiUVW[trueOrder[1]] + - abcMat[2][2] * phiUVW[trueOrder[2]]; - - uvw[0] = abc[0]; - uvw[1] = abc[1]; - uvw[2] = abc[2]; - */ // Get ABC Space coordinate // double abc[3]; - (*basis)[0]->mapFromXYZtoABC(element, xyz, abc); + (*basis)[0]->getReferenceSpace().mapFromXYZtoABC(element, xyz, abc); // Get Basis Functions // const unsigned int nFun = (*basis)[0]->getNFunction(); @@ -117,11 +40,15 @@ interpolateInRefSpace(const MElement& element, const std::vector<double>& coef, const fullVector<double>& uvw) const{ + // Get ABC Space coordinate // + double abc[3]; + (*basis)[0]->getReferenceSpace().mapFromUVWtoABC(element, uvw, abc); + // Get Basis Functions // const unsigned int nFun = (*basis)[0]->getNFunction(); fullMatrix<double> fun(nFun, 1); - (*basis)[0]->getFunctions(fun, element, uvw(0), uvw(1), uvw(2)); + (*basis)[0]->getFunctions(fun, element, abc[0], abc[1], abc[2]); // Interpolate (in Reference Place) // double val = 0; diff --git a/FunctionSpace/QuadNodeBasis.cpp b/FunctionSpace/QuadNodeBasis.cpp index 1e3c333d897c4647a5df1fc1c9097e0bb994fbe7..f75cdb87f6058ce8bff258299f3f250b59aa7d37 100644 --- a/FunctionSpace/QuadNodeBasis.cpp +++ b/FunctionSpace/QuadNodeBasis.cpp @@ -4,17 +4,16 @@ using namespace std; -QuadNodeBasis::QuadNodeBasis(unsigned int order){ - /* +QuadNodeBasis::QuadNodeBasis(size_t order){ // Reference Space // refSpace = new QuadReferenceSpace; nRefSpace = refSpace->getNReferenceSpace(); - const vector<const vector<const vector<unsigned int>*>*>& - edgeV = refSpace->getAllEdge(); + const vector<vector<vector<size_t> > >& + edgeIdx = refSpace->getEdgeNodeIndex(); - const vector<const vector<const vector<unsigned int>*>*>& - faceV = refSpace->getAllFace(); + const vector<vector<vector<size_t> > >& + faceIdx = refSpace->getFaceNodeIndex(); // Set Basis Type // this->order = order; @@ -66,11 +65,11 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ // Basis // basis = new Polynomial**[nRefSpace]; - for(unsigned int s = 0; s < nRefSpace; s++) + for(size_t s = 0; s < nRefSpace; s++) basis[s] = new Polynomial*[nFunction]; // Vertex Based // - for(unsigned int s = 0; s < nRefSpace; s++){ + for(size_t s = 0; s < nRefSpace; s++){ basis[s][0] = new Polynomial(lagrange[0]); basis[s][1] = new Polynomial(lagrange[1]); basis[s][2] = new Polynomial(lagrange[2]); @@ -78,17 +77,17 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ } // Edge Based // - for(unsigned int s = 0; s < nRefSpace; s++){ - unsigned int i = nVertex; + for(size_t s = 0; s < nRefSpace; s++){ + size_t i = nVertex; - for(unsigned int e = 0; e < 4; e++){ - for(unsigned int l = 1; l < order; l++){ + for(size_t e = 0; e < 4; e++){ + for(size_t l = 1; l < order; l++){ basis[s][i] = - new Polynomial(legendre[l].compose(lifting[(*(*edgeV[s])[e])[1]] - - lifting[(*(*edgeV[s])[e])[0]]) + new Polynomial(legendre[l].compose(lifting[edgeIdx[s][e][1]] - + lifting[edgeIdx[s][e][0]]) * - (lagrange[(*(*edgeV[s])[e])[0]] + - lagrange[(*(*edgeV[s])[e])[1]])); + (lagrange[edgeIdx[s][e][0]] + + lagrange[edgeIdx[s][e][1]])); i++; } @@ -97,22 +96,22 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ // Face Based // - // NB: We use (*(*faceV[s])[f])[] + // NB: We use (*(*faceIdx[s])[f])[] // where f = 0, because triangles // have only ONE face: the face '0' - for(unsigned int s = 0; s < nRefSpace; s++){ - unsigned int i = nVertex + nEdge; + for(size_t s = 0; s < nRefSpace; s++){ + size_t i = nVertex + nEdge; - for(unsigned int l1 = 1; l1 < order; l1++){ - for(unsigned int l2 = 1; l2 < order; l2++){ + for(size_t l1 = 1; l1 < order; l1++){ + for(size_t l2 = 1; l2 < order; l2++){ basis[s][i] = - new Polynomial(legendre[l1].compose(lifting[(*(*faceV[s])[0])[0]] - - lifting[(*(*faceV[s])[0])[1]]) + new Polynomial(legendre[l1].compose(lifting[faceIdx[s][0][0]] - + lifting[faceIdx[s][0][1]]) * - legendre[l2].compose(lifting[(*(*faceV[s])[0])[0]] - - lifting[(*(*faceV[s])[0])[3]])); + legendre[l2].compose(lifting[faceIdx[s][0][0]] - + lifting[faceIdx[s][0][3]])); i++; } @@ -132,8 +131,8 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ Polynomial mapY(Polynomial(0.5, 0, 1, 0) + Polynomial(0.5, 0, 0, 0)); - for(unsigned int s = 0; s < nRefSpace; s++){ - for(unsigned int i = 0; i < nFunction; i++){ + for(size_t s = 0; s < nRefSpace; s++){ + for(size_t i = 0; i < nFunction; i++){ Polynomial* tmp; tmp = basis[s][i]; basis[s][i] = new Polynomial(tmp->compose(mapX, mapY)); @@ -143,22 +142,19 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ // Free Temporary Sapce // delete[] legendre; - */ } QuadNodeBasis::~QuadNodeBasis(void){ - /* // ReferenceSpace // delete refSpace; // Basis // - for(unsigned int i = 0; i < nRefSpace; i++){ - for(unsigned int j = 0; j < nFunction; j++) + for(size_t i = 0; i < nRefSpace; i++){ + for(size_t j = 0; j < nFunction; j++) delete basis[i][j]; delete[] basis[i]; } delete[] basis; - */ } diff --git a/FunctionSpace/QuadNodeBasis.h b/FunctionSpace/QuadNodeBasis.h index 7bc159aa1d63c4cf9559fdf2a04f3cdb2ee4c85d..96c69c6d6e231a81d7b7093001d72bc0bea23a75 100644 --- a/FunctionSpace/QuadNodeBasis.h +++ b/FunctionSpace/QuadNodeBasis.h @@ -24,7 +24,7 @@ class QuadNodeBasis: public BasisHierarchical0From{ //! @param order The order of the Basis //! //! Returns a new Node-Basis for Quads of the given order - QuadNodeBasis(unsigned int order); + QuadNodeBasis(size_t order); //! @return Deletes this Basis //! diff --git a/FunctionSpace/QuadReferenceSpace.cpp b/FunctionSpace/QuadReferenceSpace.cpp index 111ed806e8cf9ca4a8db551decf64b6d9fb29a1b..47495dd8d718e063b1e65e4d0f3b0d504ab6cf53 100644 --- a/FunctionSpace/QuadReferenceSpace.cpp +++ b/FunctionSpace/QuadReferenceSpace.cpp @@ -5,64 +5,39 @@ using namespace std; QuadReferenceSpace::QuadReferenceSpace(void){ - /* // Vertex Definition // nVertex = 4; // Edge Definition // - nEdge = 4; - refEdge = new size_t*[nEdge]; + const size_t nEdge = 4; + refEdgeNodeIdx.resize(nEdge); for(size_t i = 0; i < nEdge; i++){ - refEdge[i] = new size_t[2]; - refEdge[i][0] = MQuadrangle::edges_quad(i, 0); - refEdge[i][1] = MQuadrangle::edges_quad(i, 1); + refEdgeNodeIdx[i].resize(2); // Two Nodes per Edge + refEdgeNodeIdx[i][0] = MQuadrangle::edges_quad(i, 0); + refEdgeNodeIdx[i][1] = MQuadrangle::edges_quad(i, 1); } // Face Definition // - // Number of face - nFace = 1; + refFaceNodeIdx.resize(1); // One Face per Triangle + refFaceNodeIdx[0].resize(4); // Four Nodes per Face - // Number of node per face - nNodeInFace = new size_t[nFace]; - nNodeInFace[0] = 4; - - // Reference Face - refFace = new size_t*[nFace]; - refFace[0] = new size_t[4]; - - refFace[0][0] = 0; - refFace[0][1] = 1; - refFace[0][2] = 2; - refFace[0][3] = 3; + refFaceNodeIdx[0][0] = 0; + refFaceNodeIdx[0][1] = 1; + refFaceNodeIdx[0][2] = 2; + refFaceNodeIdx[0][3] = 3; // Init All // init(); - */ } QuadReferenceSpace::~QuadReferenceSpace(void){ - /* - // Delete Ref Edge // - for(size_t i = 0; i < nEdge; i++) - delete[] refEdge[i]; - - delete[] refEdge; - - // Delete Ref Face // - for(size_t i = 0; i < nFace; i++) - delete[] refFace[i]; - - delete[] refFace; - delete[] nNodeInFace; - */ } string QuadReferenceSpace::toLatex(void) const{ - //const size_t nPerm = pTree->getNPermutation(); - stringstream stream; - //vector<size_t> perm(nVertex); - /* + const size_t nRefSpace = refSpaceNodeId.size(); + stringstream stream; + stream << "\\documentclass{article}" << endl << endl << "\\usepackage{longtable}" << endl @@ -71,29 +46,32 @@ string QuadReferenceSpace::toLatex(void) const{ << "\\begin{document}" << endl << "\\tikzstyle{vertex} = [circle, fill = black!25]" << endl - << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl << endl + << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl + << endl << "\\begin{longtable}{ccc}" << endl << endl; - for(size_t p = 0; p < nPerm; p++){ - pTree->fillWithPermutation(p, perm); - + for(size_t s = 0; s < nRefSpace; s++){ stream << "\\begin{tikzpicture}" << endl - << "\\node[vertex] (n0) at(0, 0) {$" << perm[0] << "$};" << endl - << "\\node[vertex] (n1) at(3, 0) {$" << perm[1] << "$};" << endl - << "\\node[vertex] (n2) at(3, 3) {$" << perm[2] << "$};" << endl - << "\\node[vertex] (n3) at(0, 3) {$" << perm[3] << "$};" << endl + << "\\node[vertex] (n0) at(0, 0) {$" << refSpaceNodeId[s][0] << "$};" + << endl + << "\\node[vertex] (n1) at(3, 0) {$" << refSpaceNodeId[s][1] << "$};" + << endl + << "\\node[vertex] (n2) at(3, 3) {$" << refSpaceNodeId[s][2] << "$};" + << endl + << "\\node[vertex] (n3) at(0, 3) {$" << refSpaceNodeId[s][3] << "$};" + << endl << endl; - for(size_t i = 0; i < 4; i++) + for(size_t e = 0; e < 4; e++) stream << "\\path[line]" - << " (n" << (*(*(*edge)[p])[i])[0] << ")" + << " (n" << orderedEdgeNodeIdx[s][e][0] << ")" << " -- " - << " (n" << (*(*(*edge)[p])[i])[1] << ");" + << " (n" << orderedEdgeNodeIdx[s][e][1] << ");" << endl; - if((p + 1) % 3) + if((s + 1) % 3) stream << "\\end{tikzpicture} & " << endl << endl; else @@ -102,6 +80,6 @@ string QuadReferenceSpace::toLatex(void) const{ stream << "\\end{longtable}" << endl << "\\end{document}" << endl; - */ + return stream.str(); } diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp index de56c4278e15b7df92106c676b442642d790a222..ed14cfcdd821204ebb4178170be5583a59376535 100644 --- a/FunctionSpace/ReferenceSpace.cpp +++ b/FunctionSpace/ReferenceSpace.cpp @@ -125,56 +125,35 @@ findCyclicPermutation(list<size_t>& listOfTrueReferenceSpace, } } -static bool isFacePermutation(vector<size_t>& refNode, - vector<size_t>& testNode){ - const size_t size = refNode.size(); - bool match = false; - - if(size != testNode.size()) - return false; - - for(size_t i = 0; i < size && !match; i++){ - bool submatch = true; - - for(size_t j = 0; j < size && submatch; j++) - if(refNode[j] != testNode[j]) - submatch = false; - - if(!submatch){ - size_t tmp0 = testNode[0]; - size_t tmp1 = testNode[1]; - - for(size_t k = 1; k < size + 1; k++){ - testNode[k % size] = tmp0; - tmp0 = tmp1; - tmp1 = testNode[(k + 1) % size]; - } - } +ReferenceSpace::triple ReferenceSpace:: +isCyclicPermutation(vector<size_t>& pTest, + vector<size_t>& pRef){ - else - match = true; - } + // Node IDs of Reference Space first Face + const size_t nNodeInFaceZero = refFaceNodeIdx[0].size(); + vector<size_t> refNode(nNodeInFaceZero); - return match; -} + for(size_t i = 0; i < nNodeInFaceZero; i++) + refNode[i] = pRef[refFaceNodeIdx[0][i]]; -static bool haveSameNode(vector<size_t>& face0, - vector<size_t>& face1){ - const size_t size = face0.size(); - bool matchIsPossible = true; + // Corresponding Face in Test Permutation + size_t testFaceId = findCorrespondingFace(refNode, pTest); - for(size_t i = 0; i < size && matchIsPossible; i++){ - bool submatch = false; + // Node IDs of Test Permutation correspnding Face + const size_t nNodeInFaceTest = refFaceNodeIdx[testFaceId].size(); + vector<size_t> testNode(nNodeInFaceTest); - for(size_t j = 0; j < size && !submatch; j++){ - if(face0[i] == face1[j]) - submatch = true; - } + for(size_t i = 0; i < nNodeInFaceTest; i++) + testNode[i] = pTest[refFaceNodeIdx[testFaceId][i]]; - matchIsPossible = submatch; - } + // Return Triple // + triple tri = { + isFacePermutation(refNode, testNode), + getRefIndexPermutation(pRef, pTest), + getReverseIndexPermutation(pRef, pTest) + }; - return matchIsPossible; + return tri; } size_t ReferenceSpace::findCorrespondingFace(vector<size_t>& face, @@ -208,8 +187,41 @@ size_t ReferenceSpace::findCorrespondingFace(vector<size_t>& face, return f; } -static vector<size_t> getRefIndexPermutation(vector<size_t>& ref, - vector<size_t>& test){ +bool ReferenceSpace::isFacePermutation(vector<size_t>& refNode, + vector<size_t>& testNode){ + const size_t size = refNode.size(); + bool match = false; + + if(size != testNode.size()) + return false; + + for(size_t i = 0; i < size && !match; i++){ + bool submatch = true; + + for(size_t j = 0; j < size && submatch; j++) + if(refNode[j] != testNode[j]) + submatch = false; + + if(!submatch){ + size_t tmp0 = testNode[0]; + size_t tmp1 = testNode[1]; + + for(size_t k = 1; k < size + 1; k++){ + testNode[k % size] = tmp0; + tmp0 = tmp1; + tmp1 = testNode[(k + 1) % size]; + } + } + + else + match = true; + } + + return match; +} + +vector<size_t> ReferenceSpace::getRefIndexPermutation(vector<size_t>& ref, + vector<size_t>& test){ const size_t size = ref.size(); vector<size_t> idxVec(ref.size()); size_t idx; @@ -226,8 +238,8 @@ static vector<size_t> getRefIndexPermutation(vector<size_t>& ref, return idxVec; } -static vector<size_t> getReverseIndexPermutation(vector<size_t>& ref, - vector<size_t>& test){ +vector<size_t> ReferenceSpace::getReverseIndexPermutation(vector<size_t>& ref, + vector<size_t>& test){ const size_t size = ref.size(); vector<size_t> idxVec(ref.size()); size_t idx; @@ -244,35 +256,23 @@ static vector<size_t> getReverseIndexPermutation(vector<size_t>& ref, return idxVec; } -ReferenceSpace::triple ReferenceSpace:: -isCyclicPermutation(vector<size_t>& pTest, - vector<size_t>& pRef){ - - // Node IDs of Reference Space first Face - const size_t nNodeInFaceZero = refFaceNodeIdx[0].size(); - vector<size_t> refNode(nNodeInFaceZero); - - for(size_t i = 0; i < nNodeInFaceZero; i++) - refNode[i] = pRef[refFaceNodeIdx[0][i]]; - - // Corresponding Face in Test Permutation - size_t testFaceId = findCorrespondingFace(refNode, pTest); +bool ReferenceSpace::haveSameNode(vector<size_t>& face0, + vector<size_t>& face1){ + const size_t size = face0.size(); + bool matchIsPossible = true; - // Node IDs of Test Permutation correspnding Face - const size_t nNodeInFaceTest = refFaceNodeIdx[testFaceId].size(); - vector<size_t> testNode(nNodeInFaceTest); + for(size_t i = 0; i < size && matchIsPossible; i++){ + bool submatch = false; - for(size_t i = 0; i < nNodeInFaceTest; i++) - testNode[i] = pTest[refFaceNodeIdx[testFaceId][i]]; + for(size_t j = 0; j < size && !submatch; j++){ + if(face0[i] == face1[j]) + submatch = true; + } - // Return Triple // - triple tri = { - isFacePermutation(refNode, testNode), - getRefIndexPermutation(pRef, pTest), - getReverseIndexPermutation(pRef, pTest) - }; + matchIsPossible = submatch; + } - return tri; + return matchIsPossible; } void ReferenceSpace::getOrderedEdge(void){ @@ -421,13 +421,25 @@ size_t ReferenceSpace::getPermutationIdx(const MElement& element) const{ void ReferenceSpace::mapFromXYZtoABC(const MElement& element, const fullVector<double>& xyz, - double abc[3]){ + double abc[3]) const{ // Get UVW coordinate // double phys[3] = {xyz(0), xyz(1), xyz(2)}; double uvw[3]; element.xyz2uvw(phys, uvw); + // Get ABC coordinate // + fullVector<double> uuvw(3); + uuvw(0) = uvw[0]; + uuvw(1) = uvw[1]; + uuvw(2) = uvw[2]; + + mapFromUVWtoABC(element, uuvw, abc); +} + +void ReferenceSpace::mapFromUVWtoABC(const MElement& element, + const fullVector<double>& uvw, + double abc[3]) const{ // Compute coordinate in ABC Space // // ABC node coordinate double** abcMat = new double*[nVertex]; @@ -440,7 +452,7 @@ void ReferenceSpace::mapFromXYZtoABC(const MElement& element, // UVW (order 1) shape functions double* phiUVW = new double[nVertex]; - element.getShapeFunctions(uvw[0], uvw[1], uvw[2], phiUVW, 1); + element.getShapeFunctions(uvw(0), uvw(1), uvw(2), phiUVW, 1); // Element Permutation Index // const size_t permutationIdx = getPermutationIdx(element); diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h index ffdf867992f480b3999b604da35fd336122420f8..e951efb3b145fa902faef160301d16d908f30787 100644 --- a/FunctionSpace/ReferenceSpace.h +++ b/FunctionSpace/ReferenceSpace.h @@ -55,18 +55,22 @@ class ReferenceSpace{ size_t getNReferenceSpace(void) const; size_t getReferenceSpace(const MElement& element) const; - const std::vector<std::vector<size_t> >& - getNodeId(void) const; - const std::vector<std::vector<std::vector<size_t> > >& getEdgeNodeIndex(void) const; const std::vector<std::vector<std::vector<size_t> > >& getFaceNodeIndex(void) const; + const std::vector<size_t>& + getNodeIndexFromABCtoUVW(const MElement& element) const; + + void mapFromUVWtoABC(const MElement& element, + const fullVector<double>& xyz, + double abc[3]) const; + void mapFromXYZtoABC(const MElement& element, const fullVector<double>& xyz, - double abc[3]); + double abc[3]) const; void getJacobian(const MElement& element, const fullVector<double>& xyz, @@ -80,6 +84,7 @@ class ReferenceSpace{ void init(void); + private: void getOrderedEdge(void); void getOrderedFace(void); @@ -94,6 +99,20 @@ class ReferenceSpace{ size_t findCorrespondingFace(std::vector<size_t>& face, std::vector<size_t>& node); + static bool isFacePermutation(std::vector<size_t>& refNode, + std::vector<size_t>& testNode); + + std::vector<size_t> getRefIndexPermutation(std::vector<size_t>& ref, + std::vector<size_t>& test); + + std::vector<size_t> getReverseIndexPermutation(std::vector<size_t>& ref, + std::vector<size_t>& test); + + static bool haveSameNode(std::vector<size_t>& face0, + std::vector<size_t>& face1); + + size_t getPermutationIdx(const MElement& element) const; + static void orderRefEntityForGivenRefSpace(std::vector<size_t>& refEntityNodeIdx, std::vector<size_t>& refSpaceNodeId, @@ -102,8 +121,6 @@ class ReferenceSpace{ static void correctQuadFaceNodeIdx(std::vector<size_t>& correctedQuadFaceNodeIdx); - size_t getPermutationIdx(const MElement& element) const; - static bool sortPredicate(const std::pair<size_t, size_t>& a, const std::pair<size_t, size_t>& b); }; @@ -188,6 +205,12 @@ ReferenceSpace::getFaceNodeIndex(void) const{ return orderedFaceNodeIdx; } +inline +const std::vector<size_t>& +ReferenceSpace::getNodeIndexFromABCtoUVW(const MElement& element) const{ + return ABCtoUVWIndex[getPermutationIdx(element)]; +} + inline size_t ReferenceSpace::getReferenceSpace(const MElement& element) const{ return pTree->getTagFromPermutation(getPermutationIdx(element)); diff --git a/FunctionSpace/TetNodeBasis.cpp b/FunctionSpace/TetNodeBasis.cpp index 4af8626ad8b277d1acc17ec412c93fa710d8b939..c9854688a42b77c605fc85f5d13e87f95b69b88c 100644 --- a/FunctionSpace/TetNodeBasis.cpp +++ b/FunctionSpace/TetNodeBasis.cpp @@ -4,17 +4,16 @@ using namespace std; -TetNodeBasis::TetNodeBasis(unsigned int order){ - /* +TetNodeBasis::TetNodeBasis(size_t order){ // Reference Space // refSpace = new TetReferenceSpace; nRefSpace = refSpace->getNReferenceSpace(); - const vector<const vector<const vector<unsigned int>*>*>& - edgeV = refSpace->getAllEdge(); + const vector<vector<vector<size_t> > >& + edgeIdx = refSpace->getEdgeNodeIndex(); - const vector<const vector<const vector<unsigned int>*>*>& - faceV = refSpace->getAllFace(); + const vector<vector<vector<size_t> > >& + faceIdx = refSpace->getFaceNodeIndex(); // Set Basis Type // this->order = order; @@ -61,11 +60,11 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ // Basis // basis = new Polynomial**[nRefSpace]; - for(unsigned int s = 0; s < nRefSpace; s++) + for(size_t s = 0; s < nRefSpace; s++) basis[s] = new Polynomial*[nFunction]; // Vertex Based // - for(unsigned int s = 0; s < nRefSpace; s++){ + for(size_t s = 0; s < nRefSpace; s++){ basis[s][0] = new Polynomial(lagrange[0]); basis[s][1] = new Polynomial(lagrange[1]); basis[s][2] = new Polynomial(lagrange[2]); @@ -73,18 +72,18 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ } // Edge Based // - for(unsigned int s = 0; s < nRefSpace; s++){ - unsigned int i = nVertex; + for(size_t s = 0; s < nRefSpace; s++){ + size_t i = nVertex; for(int e = 0; e < 6; e++){ - for(unsigned int l = 1; l < order; l++){ + for(size_t l = 1; l < order; l++){ basis[s][i] = new Polynomial(intLegendre[l].compose - (lagrange[(*(*edgeV[s])[e])[0]] - - lagrange[(*(*edgeV[s])[e])[1]] + (lagrange[edgeIdx[s][e][0]] - + lagrange[edgeIdx[s][e][1]] , - lagrange[(*(*edgeV[s])[e])[0]] + - lagrange[(*(*edgeV[s])[e])[1]])); + lagrange[edgeIdx[s][e][0]] + + lagrange[edgeIdx[s][e][1]])); i++; } } @@ -93,31 +92,31 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ // Face Based // // TO CHECK: Are Triangles face matching tets ? - for(unsigned int s = 0; s < nRefSpace; s++){ - unsigned int i = nVertex + nEdge; + for(size_t s = 0; s < nRefSpace; s++){ + size_t i = nVertex + nEdge; for(int f = 0; f < 4; f++){ for(int l1 = 1; l1 < orderMinus; l1++){ for(int l2 = 0; l1 + l2 - 1 < orderMinusTwo; l2++){ Polynomial sum = - lagrange[(*(*faceV[s])[f])[0]] + - lagrange[(*(*faceV[s])[f])[1]] + - lagrange[(*(*faceV[s])[f])[2]]; + lagrange[faceIdx[s][f][0]] + + lagrange[faceIdx[s][f][1]] + + lagrange[faceIdx[s][f][2]]; basis[s][i] = new Polynomial(intLegendre[l1].compose - (lagrange[(*(*faceV[s])[f])[0]] - - lagrange[(*(*faceV[s])[f])[1]] + (lagrange[faceIdx[s][f][0]] - + lagrange[faceIdx[s][f][1]] , - lagrange[(*(*faceV[s])[f])[0]] + - lagrange[(*(*faceV[s])[f])[1]]) + lagrange[faceIdx[s][f][0]] + + lagrange[faceIdx[s][f][1]]) * - lagrange[(*(*faceV[s])[f])[2]] + lagrange[faceIdx[s][f][2]] * sclLegendre[l2].compose - (lagrange[(*(*faceV[s])[f])[2]] * 2 - sum, sum)); + (lagrange[faceIdx[s][f][2]] * 2 - sum, sum)); i++; } } @@ -132,8 +131,8 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ const Polynomial sub = lagrange[0] - lagrange[1]; const Polynomial add = lagrange[0] + lagrange[1]; - for(unsigned int s = 0; s < nRefSpace; s++){ - unsigned int i = nVertex + nEdge + nFace; + for(size_t s = 0; s < nRefSpace; s++){ + size_t i = nVertex + nEdge + nFace; for(int l1 = 1; l1 < orderMinusTwo; l1++){ for(int l2 = 0; l2 + l1 - 1 < orderMinusThree; l2++){ @@ -155,22 +154,19 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ delete[] legendre; delete[] sclLegendre; delete[] intLegendre; - */ } TetNodeBasis::~TetNodeBasis(void){ - /* // ReferenceSpace // delete refSpace; // Basis // - for(unsigned int i = 0; i < nRefSpace; i++){ - for(unsigned int j = 0; j < nFunction; j++) + for(size_t i = 0; i < nRefSpace; i++){ + for(size_t j = 0; j < nFunction; j++) delete basis[i][j]; delete[] basis[i]; } delete[] basis; - */ } diff --git a/FunctionSpace/TetNodeBasis.h b/FunctionSpace/TetNodeBasis.h index b1ffb219306f65b57aeeab3e04076089efe62058..3eff8cf0754aeb284ef05d259484aa676096b458 100644 --- a/FunctionSpace/TetNodeBasis.h +++ b/FunctionSpace/TetNodeBasis.h @@ -20,7 +20,7 @@ class TetNodeBasis: public BasisHierarchical0From{ //! @param order The order of the Basis //! //! Returns a new Node-Basis for Tetrahedra of the given order - TetNodeBasis(unsigned int order); + TetNodeBasis(size_t order); //! Deletes this Basis //! diff --git a/FunctionSpace/TetReferenceSpace.cpp b/FunctionSpace/TetReferenceSpace.cpp index 839f956229ad01e959fe4e4419faac98d38de60b..402d9104df9feed0af1cb70314c4e2a7c2e7c7df 100644 --- a/FunctionSpace/TetReferenceSpace.cpp +++ b/FunctionSpace/TetReferenceSpace.cpp @@ -5,67 +5,41 @@ using namespace std; TetReferenceSpace::TetReferenceSpace(void){ - /* // Vertex Definition // nVertex = 4; // Edge Definition // - nEdge = 6; - refEdge = new size_t*[nEdge]; + const size_t nEdge = 6; + refEdgeNodeIdx.resize(nEdge); for(size_t i = 0; i < nEdge; i++){ - refEdge[i] = new size_t[2]; - refEdge[i][0] = MTetrahedron::edges_tetra(i, 0); - refEdge[i][1] = MTetrahedron::edges_tetra(i, 1); + refEdgeNodeIdx[i].resize(2); // Two Nodes per Edge + refEdgeNodeIdx[i][0] = MTetrahedron::edges_tetra(i, 0); + refEdgeNodeIdx[i][1] = MTetrahedron::edges_tetra(i, 1); } // Face Definition // - // Number of face - nFace = 4; - - // Number of node per face - nNodeInFace = new size_t[nFace]; - - for(size_t f = 0; f < nFace; f++) - nNodeInFace[f] = 3; - - // Reference Face - refFace = new size_t*[nFace]; + size_t nFace = 4; + refFaceNodeIdx.resize(nFace); for(size_t i = 0; i < nFace; i++){ - refFace[i] = new size_t[3]; - refFace[i][0] = MTetrahedron::faces_tetra(i, 0); - refFace[i][1] = MTetrahedron::faces_tetra(i, 1); - refFace[i][2] = MTetrahedron::faces_tetra(i, 2); + refFaceNodeIdx[i].resize(3); // Three Nodes per Face + refFaceNodeIdx[i][0] = MTetrahedron::faces_tetra(i, 0); + refFaceNodeIdx[i][1] = MTetrahedron::faces_tetra(i, 1); + refFaceNodeIdx[i][2] = MTetrahedron::faces_tetra(i, 2); } // Init All // init(); - */ } TetReferenceSpace::~TetReferenceSpace(void){ - /* - // Delete Ref Edge // - for(size_t i = 0; i < nEdge; i++) - delete[] refEdge[i]; - - delete[] refEdge; - - // Delete Ref Face // - for(size_t i = 0; i < nFace; i++) - delete[] refFace[i]; - - delete[] refFace; - delete[] nNodeInFace; - */ } string TetReferenceSpace::toLatex(void) const{ - //const size_t nPerm = pTree->getNPermutation(); - stringstream stream; - //vector<size_t> perm; - /* + const size_t nRefSpace = refSpaceNodeId.size(); + stringstream stream; + stream << "\\documentclass{article}" << endl << endl << "\\usepackage{longtable}" << endl @@ -74,29 +48,32 @@ string TetReferenceSpace::toLatex(void) const{ << "\\begin{document}" << endl << "\\tikzstyle{vertex} = [circle, fill = black!25]" << endl - << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl << endl + << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl + << endl << "\\begin{longtable}{ccc}" << endl << endl; - for(size_t p = 0; p < nPerm; p++){ - pTree->fillWithPermutation(p, perm); - + for(size_t s = 0; s < nRefSpace; s++){ stream << "\\begin{tikzpicture}" << endl - << "\\node[vertex] (n0) at(0, 0) {$" << perm[0] << "$};" << endl - << "\\node[vertex] (n1) at(3, 0) {$" << perm[1] << "$};" << endl - << "\\node[vertex] (n2) at(0, 3) {$" << perm[2] << "$};" << endl - << "\\node[vertex] (n3) at(1, 1) {$" << perm[3] << "$};" << endl + << "\\node[vertex] (n0) at(0, 0) {$" << refSpaceNodeId[s][0] << "$};" + << endl + << "\\node[vertex] (n1) at(3, 0) {$" << refSpaceNodeId[s][1] << "$};" + << endl + << "\\node[vertex] (n2) at(0, 3) {$" << refSpaceNodeId[s][2] << "$};" + << endl + << "\\node[vertex] (n3) at(1, 1) {$" << refSpaceNodeId[s][3] << "$};" + << endl << endl; - for(size_t i = 0; i < 6; i++) + for(size_t e = 0; e < 6; e++) stream << "\\path[line]" - << " (n" << (*(*(*edge)[p])[i])[0] << ")" + << " (n" << orderedEdgeNodeIdx[s][e][0] << ")" << " -- " - << " (n" << (*(*(*edge)[p])[i])[1] << ");" + << " (n" << orderedEdgeNodeIdx[s][e][1] << ");" << endl; - if((p + 1) % 3) + if((s + 1) % 3) stream << "\\end{tikzpicture} & " << endl << endl; else @@ -105,6 +82,6 @@ string TetReferenceSpace::toLatex(void) const{ stream << "\\end{longtable}" << endl << "\\end{document}" << endl; - */ + return stream.str(); } diff --git a/FunctionSpace/TriReferenceSpace.cpp b/FunctionSpace/TriReferenceSpace.cpp index 2b7acabe43cd6630796d7619774a36f270cbfb9e..e7b9399f6233fca7e7fe6fd624c97650226e5414 100644 --- a/FunctionSpace/TriReferenceSpace.cpp +++ b/FunctionSpace/TriReferenceSpace.cpp @@ -34,8 +34,8 @@ TriReferenceSpace::~TriReferenceSpace(void){ } string TriReferenceSpace::toLatex(void) const{ - const size_t nRefSpace = refSpaceNodeId.size(); - stringstream stream; + const size_t nRefSpace = refSpaceNodeId.size(); + stringstream stream; stream << "\\documentclass{article}" << endl << endl @@ -45,7 +45,8 @@ string TriReferenceSpace::toLatex(void) const{ << "\\begin{document}" << endl << "\\tikzstyle{vertex} = [circle, fill = black!25]" << endl - << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl << endl + << "\\tikzstyle{line} = [draw, thick, black, -latex']" << endl + << endl << "\\begin{longtable}{ccc}" << endl << endl;