diff --git a/FunctionSpace/BasisGenerator.cpp b/FunctionSpace/BasisGenerator.cpp index 82f64d50411061475ed51c89906df8e74639d4a9..06c52de106d1b728dca5a8e243af245ad18ddbc8 100644 --- a/FunctionSpace/BasisGenerator.cpp +++ b/FunctionSpace/BasisGenerator.cpp @@ -14,6 +14,7 @@ #include "QuadNodeBasis.h" #include "QuadEdgeBasis.h" +#include "QuadLagrangeBasis.h" #include "TetNodeBasis.h" #include "TetEdgeBasis.h" @@ -71,7 +72,7 @@ BasisLocal* BasisGenerator::generateLagrange(unsigned int elementType, switch(elementType){ case TYPE_LIN: return new LineLagrangeBasis(order); case TYPE_TRI: return new TriLagrangeBasis(order); - case TYPE_QUA: throw Exception("Lagrange Basis on Quads not Implemented"); + case TYPE_QUA: return new QuadLagrangeBasis(order); case TYPE_TET: return new TetLagrangeBasis(order); case TYPE_HEX: throw Exception("Lagrange Basis on Hexs not Implemented"); diff --git a/FunctionSpace/CMakeLists.txt b/FunctionSpace/CMakeLists.txt index d93e55d8510b80c6a33084990b8771598648e727..c73a7d795f8bf65c4f26c6683cf899550f24452b 100644 --- a/FunctionSpace/CMakeLists.txt +++ b/FunctionSpace/CMakeLists.txt @@ -33,6 +33,7 @@ set(SRC QuadNodeBasis.cpp # QuadEdgeBasis.cpp + QuadLagrangeBasis.cpp TetNodeBasis.cpp TetEdgeBasis.cpp diff --git a/FunctionSpace/LineLagrangeBasis.cpp b/FunctionSpace/LineLagrangeBasis.cpp index ec2eb76cfcfcc9a152ecd5be8bca6f92a0943b5b..26c0bb64bad857f2cccab6e73c382525fbc660f4 100644 --- a/FunctionSpace/LineLagrangeBasis.cpp +++ b/FunctionSpace/LineLagrangeBasis.cpp @@ -1,5 +1,6 @@ #include "Exception.h" #include "LineLagrangeBasis.h" +#include "pointsGenerators.h" LineLagrangeBasis::LineLagrangeBasis(unsigned int order){ // If order 0 (Nedelec): use order 1 @@ -22,7 +23,8 @@ LineLagrangeBasis::LineLagrangeBasis(unsigned int order){ lBasis = new polynomialBasis(getTag(order)); // Init Lagrange Point // - lPoint = new fullMatrix<double>(linePoint(order)); + lPoint = new fullMatrix<double> + (gmshGeneratePointsLine(order)); } LineLagrangeBasis::~LineLagrangeBasis(void){ @@ -41,23 +43,3 @@ unsigned int LineLagrangeBasis::getTag(unsigned int order){ ("Can't instanciate an order %d Lagrangian Basis for a Line", order); } - -fullMatrix<double> LineLagrangeBasis:: -linePoint(unsigned int order){ - fullMatrix<double> line(order + 1, 3); - line(0, 0) = 0; - line(0, 1) = 0; - line(0, 2) = 0; - - if(order > 0){ - line(0, 0) = -1.; - line(1, 0) = 1.; - - double dd = 2. / order; - - for(unsigned int i = 2; i < order + 1; i++) - line(i, 0) = -1. + dd * (i - 1); - } - - return line; -} diff --git a/FunctionSpace/LineLagrangeBasis.h b/FunctionSpace/LineLagrangeBasis.h index a1b7d77faaca5a1aa218ee4e436c990aad4b19e8..af48c318d8f729a36f226c598009437547601a91 100644 --- a/FunctionSpace/LineLagrangeBasis.h +++ b/FunctionSpace/LineLagrangeBasis.h @@ -31,11 +31,6 @@ class LineLagrangeBasis: public BasisLagrange{ //! @return Returns the @em tag of a @em Line of //! the given order static unsigned int getTag(unsigned int order); - - //! @param order A natural number - //! @return Returns Lagrangian Points on a Line - //! for the given Order - static fullMatrix<double> linePoint(unsigned int order); }; #endif diff --git a/FunctionSpace/QuadLagrangeBasis.cpp b/FunctionSpace/QuadLagrangeBasis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b8f78f2f7629f48d4bb6e5ff4db424560ad7c324 --- /dev/null +++ b/FunctionSpace/QuadLagrangeBasis.cpp @@ -0,0 +1,45 @@ +#include "Exception.h" +#include "QuadLagrangeBasis.h" +#include "pointsGenerators.h" + +QuadLagrangeBasis::QuadLagrangeBasis(unsigned int order){ + // If order 0 (Nedelec): use order 1 + if(order == 0) + order = 1; + + // Set Basis Type // + this->order = order; + + type = 0; + dim = 2; + + nVertex = 4; + nEdge = 4 * (order - 1); + nFace = (order - 1) * (order - 1); + nCell = 0; + nFunction = nVertex + nEdge + nFace + nCell; + + // Init polynomialBasis // + lBasis = new polynomialBasis(getTag(order)); + + // Init Lagrange Point // + lPoint = new fullMatrix<double> + (gmshGeneratePointsQuadrangle(order, false)); +} + +QuadLagrangeBasis::~QuadLagrangeBasis(void){ + delete lBasis; + delete lPoint; +} + +unsigned int QuadLagrangeBasis::getTag(unsigned int order){ + unsigned int tag = nodalBasis::getTag(TYPE_QUA, order, false); + + if(tag) + return tag; + + else + throw Exception + ("Can't instanciate an order %d Lagrangian Basis for a Quadrangle", + order); +} diff --git a/FunctionSpace/QuadLagrangeBasis.h b/FunctionSpace/QuadLagrangeBasis.h new file mode 100644 index 0000000000000000000000000000000000000000..b1efbd50d3a0ebbb8296cbd45deaddd480ccd0cf --- /dev/null +++ b/FunctionSpace/QuadLagrangeBasis.h @@ -0,0 +1,36 @@ +#ifndef _QUADLAGRANGEBASIS_H_ +#define _QUADLAGRANGEBASIS_H_ + +#include "BasisLagrange.h" + +/** + @class QuadLagrangeBasis + @brief Lagrange Basis for Quadrangles + + This class can instantiate a @em Lagrange @em Basis + for a Quadrangle and for a given Order.@n + + It uses + <a href="http://geuz.org/gmsh/">gmsh</a> Basis. + */ + +class QuadLagrangeBasis: public BasisLagrange{ + public: + //! @param order A natural number + //! + //! Returns a new QuadLagrangeBasis + //! of the given Order + QuadLagrangeBasis(unsigned int order); + + //! Deletes this Basis + //! + virtual ~QuadLagrangeBasis(void); + + private: + //! @param order A natural number + //! @return Returns the @em tag of a @em Quadrangle of + //! the given order + static unsigned int getTag(unsigned int order); +}; + +#endif diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp index a2e89c8ade7857fe0102b8c9be918f85d08b14ca..0a89ba922ba471a3731877f1d1eee98a6d2c6b27 100644 --- a/FunctionSpace/ReferenceSpace.cpp +++ b/FunctionSpace/ReferenceSpace.cpp @@ -290,11 +290,14 @@ inOrder(unsigned int permutation, unsigned int c, unsigned int d){ + unsigned int opposite; + unsigned int v; unsigned int k = 0; vector<unsigned int>* inorder = new vector<unsigned int>(4); + // Take nodes in order // for(unsigned int i = 0; i < nVertex; i++){ v = perm[permutation][i]; @@ -304,6 +307,26 @@ inOrder(unsigned int permutation, } } + // We need node at inoder[2] to be // + // opposite to node at inorder[0] // + // --> if not make a permutation such // + // that node opposite at inorder[2] // + // is at inorder[0] // + + opposite = ((*inorder)[0] + 2) % 4; + if((*inorder)[2] != opposite){ + // Find opposite node index + unsigned int tmp; + unsigned int idx = 1; + while((*inorder)[idx] != opposite) + idx++; + + // Swap inorder[2] and inorder[idx] + tmp = (*inorder)[2]; + (*inorder)[2] = opposite; + (*inorder)[idx] = tmp; + } + return inorder; } @@ -324,24 +347,6 @@ unsigned int ReferenceSpace::getPermutation(const MElement& elem) const{ // (vertex[i].second->getNum) // std::sort(vertex.begin(), vertex.end(), sortPredicate); - - /***************************************************************** - * What does that do ? * - * Tree lookup needs vertices in the range [0 .. nVertex[. * - * * - * So we need to convert the node ID from 'element.getVertex()' * - * to a number between [0 .. nVertex[. * - * * - * The convertion is such that the smallest node ID * - * gets the converted ID '0'. * - * Then the second smallest the ID '1'. * - * And so on... * - * * - * The sorting of the vector 'vertex' with respect * - * to the element.getVertex() IDs does that job * - *****************************************************************/ - - // Tree Lookup // try{ return treeLookup(&pTreeRoot, vertex); diff --git a/FunctionSpace/TetLagrangeBasis.cpp b/FunctionSpace/TetLagrangeBasis.cpp index 2c2c382b792fe363b2de559e5495c68d582fe834..6d4fcbc321b7081d8596a5584166813f9e39cd20 100644 --- a/FunctionSpace/TetLagrangeBasis.cpp +++ b/FunctionSpace/TetLagrangeBasis.cpp @@ -1,5 +1,6 @@ #include "Exception.h" #include "TetLagrangeBasis.h" +#include "pointsGenerators.h" TetLagrangeBasis::TetLagrangeBasis(unsigned int order){ // If order 0 (Nedelec): use order 1 @@ -22,7 +23,8 @@ TetLagrangeBasis::TetLagrangeBasis(unsigned int order){ lBasis = new polynomialBasis(getTag(order)); // Init Lagrange Point // - lPoint = new fullMatrix<double>(tetPoint(order)); + lPoint = new fullMatrix<double> + (gmshGeneratePointsTetrahedron(order, false)); } TetLagrangeBasis::~TetLagrangeBasis(void){ @@ -41,336 +43,3 @@ unsigned int TetLagrangeBasis::getTag(unsigned int order){ ("Can't instanciate an order %d Lagrangian Basis for a Tetrahedron", order); } - -fullMatrix<double> TetLagrangeBasis:: -tetPoint(unsigned int order){ - unsigned int nbPoints = (order + 1) * (order + 2) * (order + 3) / 6; - fullMatrix<double> point(nbPoints, 3); - - double overOrder = (order == 0 ? 1. : 1. / order); - - point(0, 0) = 0.; - point(0, 1) = 0.; - point(0, 2) = 0.; - - if(order > 0){ - point(1, 0) = order; - point(1, 1) = 0; - point(1, 2) = 0; - - point(2, 0) = 0.; - point(2, 1) = order; - point(2, 2) = 0.; - - point(3, 0) = 0.; - point(3, 1) = 0.; - point(3, 2) = order; - - if(order > 1){ - for(unsigned int k = 0; k < (order - 1); k++){ - point(4 + k, 0) = k + 1; - point(4 + order - 1 + k, 0) = order - 1 - k; - point(4 + 2 * (order - 1) + k, 0) = 0.; - point(4 + 3 * (order - 1) + k, 0) = 0.; - point(4 + 4 * (order - 1) + k, 0) = 0.; - point(4 + 5 * (order - 1) + k, 0) = k+1; - - point(4 + k, 1) = 0.; - point(4 + order - 1 + k, 1) = k + 1; - point(4 + 2 * (order - 1) + k, 1) = order - 1 - k; - point(4 + 3 * (order - 1) + k, 1) = 0.; - point(4 + 4 * (order - 1) + k, 1) = k+1; - point(4 + 5 * (order - 1) + k, 1) = 0.; - - point(4 + k, 2) = 0.; - point(4 + order - 1 + k, 2) = 0.; - point(4 + 2 * (order - 1) + k, 2) = 0.; - point(4 + 3 * (order - 1) + k, 2) = order - 1 - k; - point(4 + 4 * (order - 1) + k, 2) = order - 1 - k; - point(4 + 5 * (order - 1) + k, 2) = order - 1 - k; - } - - if(order > 2){ - unsigned int ns = 4 + 6 * (order - 1); - unsigned int nbdofface = nbdoftriangle(order - 3); - - double *u = new double[nbdofface]; - double *v = new double[nbdofface]; - double *w = new double[nbdofface]; - - nodepositionface0(order - 3, u, v, w); - - // u-v plane - - for(unsigned int i = 0; i < nbdofface; i++){ - point(ns + i, 0) = u[i] * (order - 3) + 1.; - point(ns + i, 1) = v[i] * (order - 3) + 1.; - point(ns + i, 2) = w[i] * (order - 3); - } - - ns = ns + nbdofface; - - // u-w plane - - nodepositionface1(order - 3, u, v, w); - - for(unsigned int i=0; i < nbdofface; i++){ - point(ns + i, 0) = u[i] * (order - 3) + 1.; - point(ns + i, 1) = v[i] * (order - 3) ; - point(ns + i, 2) = w[i] * (order - 3) + 1.; - } - - // v-w plane - - ns = ns + nbdofface; - - nodepositionface2(order - 3, u, v, w); - - for(unsigned int i = 0; i < nbdofface; i++){ - point(ns + i, 0) = u[i] * (order - 3); - point(ns + i, 1) = v[i] * (order - 3) + 1.; - point(ns + i, 2) = w[i] * (order - 3) + 1.; - } - - // u-v-w plane - - ns = ns + nbdofface; - - nodepositionface3(order - 3, u, v, w); - - for(unsigned int i = 0; i < nbdofface; i++){ - point(ns + i, 0) = u[i] * (order - 3) + 1.; - point(ns + i, 1) = v[i] * (order - 3) + 1.; - point(ns + i, 2) = w[i] * (order - 3) + 1.; - } - - ns = ns + nbdofface; - - delete [] u; - delete [] v; - delete [] w; - - if(order > 3){ - fullMatrix<double> interior = tetPoint(order - 4); - - for(int k = 0; k < interior.size1(); k++){ - point(ns + k, 0) = 1. + interior(k, 0) * (order - 4); - point(ns + k, 1) = 1. + interior(k, 1) * (order - 4); - point(ns + k, 2) = 1. + interior(k, 2) * (order - 4); - } - } - } - } - } - - point.scale(overOrder); - return point; -} - -unsigned int TetLagrangeBasis::nbdoftriangle(unsigned int order){ - return (order + 1) * (order + 2) / 2; -} - -void TetLagrangeBasis:: -nodepositionface0(unsigned int order, double *u, double *v, double *w){ - - unsigned int ndofT = nbdoftriangle(order); - - if(order == 0){ - u[0] = 0.; - v[0] = 0.; - w[0] = 0.; - return; - } - - u[0]= 0.; v[0]= 0.; w[0] = 0.; - u[1]= 0.; v[1]= order; w[1] = 0.; - u[2]= order; v[2]= 0.; w[2] = 0.; - - // edges - for(unsigned int k = 0; k < (order - 1); k++){ - u[3 + k] = 0.; - v[3 + k] = k + 1; - w[3 + k] = 0.; - - u[3 + order - 1 + k] = k + 1; - v[3 + order - 1 + k] = order - 1 - k ; - w[3 + order - 1 + k] = 0.; - - u[3 + 2 * (order - 1) + k] = order - 1 - k; - v[3 + 2 * (order - 1) + k] = 0.; - w[3 + 2 * (order - 1) + k] = 0.; - } - - if(order > 2){ - unsigned int nbdoftemp = nbdoftriangle(order - 3); - - nodepositionface0(order - 3, &u[3 + 3 * (order - 1)], &v[3 + 3 * (order - 1)], - &w[3 + 3* (order - 1)]); - - for(unsigned int k = 0; k < nbdoftemp; k++){ - u[3 + k + 3 * (order - 1)] = u[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - v[3 + k + 3 * (order - 1)] = v[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - w[3 + k + 3 * (order - 1)] = w[3 + k + 3 * (order - 1)] * (order - 3); - } - } - - for(unsigned int k = 0; k < ndofT; k++){ - u[k] = u[k] / order; - v[k] = v[k] / order; - w[k] = w[k] / order; - } -} - -void TetLagrangeBasis::nodepositionface1 -(unsigned int order, double *u, double *v, double *w){ - - unsigned int ndofT = nbdoftriangle(order); - - if(order == 0){ - u[0] = 0.; - v[0] = 0.; - w[0] = 0.; - return; - } - - u[0] = 0.; v[0]= 0.; w[0] = 0.; - u[1] = order; v[1]= 0.; w[1] = 0.; - u[2] = 0.; v[2]= 0.; w[2] = order; - - // edges - for(unsigned int k = 0; k < (order - 1); k++){ - u[3 + k] = k + 1; - v[3 + k] = 0.; - w[3 + k] = 0.; - - u[3 + order - 1 + k] = order - 1 - k; - v[3 + order - 1 + k] = 0.; - w[3 + order - 1+ k ] = k + 1; - - u[3 + 2 * (order - 1) + k] = 0. ; - v[3 + 2 * (order - 1) + k] = 0.; - w[3 + 2 * (order - 1) + k] = order - 1 - k; - } - - if(order > 2){ - unsigned int nbdoftemp = nbdoftriangle(order - 3); - - nodepositionface1(order - 3, &u[3 + 3 * (order - 1)], &v[3 + 3 * (order -1 )], - &w[3 + 3 * (order - 1)]); - - for(unsigned int k = 0; k < nbdoftemp; k++){ - u[3 + k + 3 * (order - 1)] = u[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - v[3 + k + 3 * (order - 1)] = v[3 + k + 3 * (order - 1)] * (order - 3); - w[3 + k + 3 * (order - 1)] = w[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - } - } - - for (unsigned int k = 0; k < ndofT; k++){ - u[k] = u[k] / order; - v[k] = v[k] / order; - w[k] = w[k] / order; - } -} - -void TetLagrangeBasis:: -nodepositionface2(unsigned int order, double *u, double *v, double *w){ - - unsigned int ndofT = nbdoftriangle(order); - - if(order == 0){ - u[0] = 0.; - v[0] = 0.; - w[0] = 0.; - return; - } - - u[0]= 0.; v[0]= 0.; w[0] = 0.; - u[1]= 0.; v[1]= 0.; w[1] = order; - u[2]= 0.; v[2]= order; w[2] = 0.; - - // edges - for(unsigned int k = 0; k < (order - 1); k++){ - u[3 + k] = 0.; - v[3 + k] = 0.; - w[3 + k] = k + 1; - - u[3 + order - 1 + k] = 0.; - v[3 + order - 1 + k] = k + 1; - w[3 + order - 1 + k] = order - 1 - k; - - u[3 + 2 * (order - 1) + k] = 0.; - v[3 + 2 * (order - 1) + k] = order - 1 - k; - w[3 + 2 * (order - 1) + k] = 0.; - } - - if(order > 2){ - unsigned int nbdoftemp = nbdoftriangle(order - 3); - - nodepositionface2(order - 3, &u[3 + 3 * (order - 1)], &v[3 + 3 * (order - 1)], - &w[3 + 3 * (order - 1)]); - - for(unsigned int k = 0; k < nbdoftemp; k++){ - u[3 + k + 3 * (order - 1)] = u[3 + k + 3 * (order - 1)] * (order - 3); - v[3 + k + 3 * (order - 1)] = v[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - w[3 + k + 3 * (order - 1)] = w[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - } - } - - for(unsigned int k = 0; k < ndofT; k++){ - u[k] = u[k] / order; - v[k] = v[k] / order; - w[k] = w[k] / order; - } -} - -void TetLagrangeBasis:: -nodepositionface3(unsigned int order, double *u, double *v, double *w){ - - unsigned int ndofT = nbdoftriangle(order); - - if(order == 0){ - u[0] = 0.; - v[0] = 0.; - w[0] = 0.; - return; - } - - u[0]= 0.; v[0]= 0.; w[0] = order; - u[1]= order; v[1]= 0.; w[1] = 0.; - u[2]= 0.; v[2]= order; w[2] = 0.; - - // edges - for(unsigned int k = 0; k < (order - 1); k++){ - u[3 + k] = k + 1; - v[3 + k] = 0.; - w[3 + k] = order - 1 - k; - - u[3 + order - 1 + k] = order - 1 - k; - v[3 + order - 1 + k] = k + 1; - w[3 + order - 1 + k] = 0.; - - u[3 + 2 * (order - 1) + k] = 0.; - v[3 + 2 * (order - 1) + k] = order - 1 - k; - w[3 + 2 * (order - 1) + k] = k + 1; - } - - if(order > 2){ - unsigned int nbdoftemp = nbdoftriangle(order - 3); - - nodepositionface3(order - 3, &u[3 + 3 * (order - 1)], &v[3 + 3 * (order - 1)], - &w[3 + 3 * (order - 1)]); - - for(unsigned int k = 0; k < nbdoftemp; k++){ - u[3 + k + 3 * (order - 1)] = u[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - v[3 + k + 3 * (order - 1)] = v[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - w[3 + k + 3 * (order - 1)] = w[3 + k + 3 * (order - 1)] * (order - 3) + 1.; - } - } - - for (unsigned int k = 0; k < ndofT; k++){ - u[k] = u[k] / order; - v[k] = v[k] / order; - w[k] = w[k] / order; - } -} diff --git a/FunctionSpace/TetLagrangeBasis.h b/FunctionSpace/TetLagrangeBasis.h index 27f7e5a6ecf181025c677e6d020f6d3a9bad7b5a..ef7d8db129286fbf533e4bc173d586dcdd3382bc 100644 --- a/FunctionSpace/TetLagrangeBasis.h +++ b/FunctionSpace/TetLagrangeBasis.h @@ -31,30 +31,6 @@ class TetLagrangeBasis: public BasisLagrange{ //! @return Returns the @em tag of a @em Tetrahedron of //! the given order static unsigned int getTag(unsigned int order); - - //! @param order A natural number - //! @return Returns Lagrangian Points on a Tetrahedron - //! for the given Order - static fullMatrix<double> tetPoint(unsigned int order); - - //! Unknown gmsh function - static unsigned int nbdoftriangle(unsigned int order); - - //! Unknown gmsh function - static void nodepositionface0(unsigned int order, - double *u, double *v, double *w); - - //! Unknown gmsh function - static void nodepositionface1(unsigned int order, - double *u, double *v, double *w); - - //! Unknown gmsh function - static void nodepositionface2(unsigned int order, - double *u, double *v, double *w); - - //! Unknown gmsh function - static void nodepositionface3(unsigned int order, - double *u, double *v, double *w); }; #endif diff --git a/FunctionSpace/TriLagrangeBasis.cpp b/FunctionSpace/TriLagrangeBasis.cpp index 0812ff9b9ddff60283426ed2147043e480b57bf6..3da698d557160f36b788150c4c4355dda44378ed 100644 --- a/FunctionSpace/TriLagrangeBasis.cpp +++ b/FunctionSpace/TriLagrangeBasis.cpp @@ -1,5 +1,6 @@ #include "Exception.h" #include "TriLagrangeBasis.h" +#include "pointsGenerators.h" TriLagrangeBasis::TriLagrangeBasis(unsigned int order){ // If order 0 (Nedelec): use order 1 @@ -22,7 +23,8 @@ TriLagrangeBasis::TriLagrangeBasis(unsigned int order){ lBasis = new polynomialBasis(getTag(order)); // Init Lagrange Point // - lPoint = new fullMatrix<double>(triPoint(order)); + lPoint = new fullMatrix<double> + (gmshGeneratePointsTriangle(order, false)); } TriLagrangeBasis::~TriLagrangeBasis(void){ @@ -41,72 +43,3 @@ unsigned int TriLagrangeBasis::getTag(unsigned int order){ ("Can't instanciate an order %d Lagrangian Basis for a Triangle", order); } - -fullMatrix<double> TriLagrangeBasis:: -triPoint(unsigned int order){ - unsigned int nbPoints = (order + 1) * (order + 2) / 2; - fullMatrix<double> point(nbPoints, 3); - - point(0, 0) = 0; - point(0, 1) = 0; - point(0, 2) = 0; - - if(order > 0){ - double dd = 1. / order; - - point(1, 0) = 1; - point(1, 1) = 0; - point(1, 2) = 0; - - point(2, 0) = 0; - point(2, 1) = 1; - point(2, 2) = 0; - - unsigned int index = 3; - - if(order > 1){ - double ksi = 0; - double eta = 0; - - for(unsigned int i = 0; i < order - 1; i++, index++){ - ksi += dd; - - point(index, 0) = ksi; - point(index, 1) = eta; - point(index, 2) = 0; - } - - ksi = 1.; - - for(unsigned int i = 0; i < order - 1; i++, index++){ - ksi -= dd; - eta += dd; - - point(index, 0) = ksi; - point(index, 1) = eta; - point(index, 2) = 0; - } - - eta = 1.; - ksi = 0.; - - for(unsigned int i = 0; i < order - 1; i++, index++){ - eta -= dd; - - point(index, 0) = ksi; - point(index, 1) = eta; - point(index, 2) = 0; - } - - if(order > 2){ - fullMatrix<double> inner = triPoint(order - 3); - - inner.scale(1. - 3. * dd); - inner.add(dd); - point.copy(inner, 0, nbPoints - index, 0, 2, index, 0); - } - } - } - - return point; -} diff --git a/FunctionSpace/TriLagrangeBasis.h b/FunctionSpace/TriLagrangeBasis.h index 272a21f32d84e27dea05dbe852389e507260aa40..a49ab78c9f842ef98e4323a25928baff68e2f440 100644 --- a/FunctionSpace/TriLagrangeBasis.h +++ b/FunctionSpace/TriLagrangeBasis.h @@ -31,11 +31,6 @@ class TriLagrangeBasis: public BasisLagrange{ //! @return Returns the @em tag of a @em Triangle of //! the given order static unsigned int getTag(unsigned int order); - - //! @param order A natural number - //! @return Returns Lagrangian Points on a Triangle - //! for the given Order - static fullMatrix<double> triPoint(unsigned int order); }; #endif