diff --git a/FunctionSpace/LineLagrangeBasis.cpp b/FunctionSpace/LineLagrangeBasis.cpp index c224d580214321e0063f38a01767819638bebd8a..ec2eb76cfcfcc9a152ecd5be8bca6f92a0943b5b 100644 --- a/FunctionSpace/LineLagrangeBasis.cpp +++ b/FunctionSpace/LineLagrangeBasis.cpp @@ -44,8 +44,10 @@ unsigned int LineLagrangeBasis::getTag(unsigned int order){ fullMatrix<double> LineLagrangeBasis:: linePoint(unsigned int order){ - fullMatrix<double> line(order + 1, 1); - line(0 ,0) = 0; + 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.; diff --git a/FunctionSpace/LineReferenceSpace.cpp b/FunctionSpace/LineReferenceSpace.cpp index d4d41069dd02ad999328ea232a3f37a2400363b6..7ba0eb2d4aad1b8c1999650fe137835fdce09971 100644 --- a/FunctionSpace/LineReferenceSpace.cpp +++ b/FunctionSpace/LineReferenceSpace.cpp @@ -9,12 +9,11 @@ LineReferenceSpace::LineReferenceSpace(void){ // Edge Definition // nEdge = 1; - refEdge = new unsigned int*[nEdge]; + refEdge = new unsigned int*[nEdge]; + refEdge[0] = new unsigned int[2]; - for(unsigned int i = 0; i < nEdge; i++) - refEdge[i] = new unsigned int[2]; - - refEdge[0][0] = 0; refEdge[0][1] = 1; + refEdge[0][0] = 0; + refEdge[0][1] = 1; // Face Definition // nFace = 0; diff --git a/FunctionSpace/TetEdgeBasis.cpp b/FunctionSpace/TetEdgeBasis.cpp index afffb7e2fe982f0b8f3e7fd7ae5a6c468c6d61f5..73795d0341dae4168b0994a698efd5639c47ab39 100644 --- a/FunctionSpace/TetEdgeBasis.cpp +++ b/FunctionSpace/TetEdgeBasis.cpp @@ -105,6 +105,8 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){ } // Face Based // + // TO CHECK: Are Triangles face matching tets ? + for(unsigned int s = 0; s < nRefSpace; s++){ unsigned int i = nEdge; @@ -335,4 +337,3 @@ TetEdgeBasis::~TetEdgeBasis(void){ delete[] basis; } - diff --git a/FunctionSpace/TetNodeBasis.cpp b/FunctionSpace/TetNodeBasis.cpp index 37971f323cde740a0898ed833b8bd1674a104789..27cb84d6ef6c631fc34fdf914332ead9a7430ead 100644 --- a/FunctionSpace/TetNodeBasis.cpp +++ b/FunctionSpace/TetNodeBasis.cpp @@ -90,6 +90,8 @@ 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; diff --git a/FunctionSpace/TetReferenceSpace.cpp b/FunctionSpace/TetReferenceSpace.cpp index 247172bb05bf39fdf8b7d2f61e7aec9cc9f128d7..585744aa12d98b90f125ec7b5a98b748c46d2b65 100644 --- a/FunctionSpace/TetReferenceSpace.cpp +++ b/FunctionSpace/TetReferenceSpace.cpp @@ -89,14 +89,3 @@ string TetReferenceSpace::toLatex(void) const{ return stream.str(); } - -/* -#include <iostream> -int main(void){ - TetReferenceSpace p; - - cout << p.toLatex() << endl; - - return 0; -} -*/ diff --git a/FunctionSpace/TriEdgeBasis.cpp b/FunctionSpace/TriEdgeBasis.cpp index f9c1fe7704ee626ab1a03fad95f226971e808e83..088215ee1211d87925a03499249bbcb6835fe874 100644 --- a/FunctionSpace/TriEdgeBasis.cpp +++ b/FunctionSpace/TriEdgeBasis.cpp @@ -12,6 +12,9 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ const vector<const vector<const vector<unsigned int>*>*>& edgeV = refSpace->getAllEdge(); + const vector<const vector<const vector<unsigned int>*>*>& + faceV = refSpace->getAllFace(); + // Set Basis Type // this->order = order; @@ -30,8 +33,6 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ Polynomial* legendre = new Polynomial[orderPlus]; Polynomial* intLegendre = new Polynomial[orderPlus]; - Polynomial* u = new Polynomial[orderPlus]; - Polynomial* v = new Polynomial[orderPlus]; // Legendre Polynomial // Legendre::legendre(legendre, order); @@ -99,50 +100,76 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ // Face Based // + // NB: We use (*(*faceV[s])[f])[] + // where f = 0, because triangles + // have only ONE face: the face '0' + + // TO CHECK: Are Triangles face matching tets ? + + // Alloc Temp + Polynomial** u = new Polynomial*[nRefSpace]; + Polynomial** v = new Polynomial*[nRefSpace]; + Polynomial* p = new Polynomial[nRefSpace]; + vector<Polynomial>** subGrad = new vector<Polynomial>*[nRefSpace]; + + for(unsigned int s = 0; s < nRefSpace; s++) + u[s] = new Polynomial[orderPlus]; + + for(unsigned int s = 0; s < nRefSpace; s++) + v[s] = new Polynomial[orderPlus]; + // Preliminaries - const Polynomial p = lagrange[2] * 2 - Polynomial(1, 0, 0, 0); + for(unsigned int s = 0; s < nRefSpace; s++){ + p[s] = lagrange[(*(*faceV[s])[0])[2]] * 2 - Polynomial(1, 0, 0, 0); - for(int l = 0; l < orderPlus; l++){ - u[l] = intLegendre[l].compose(lagrange[1] - lagrange[0], - lagrange[0] + lagrange[1]); - v[l] = legendre[l].compose(p); - v[l].mul(lagrange[2]); - } + // Polynomial u(x) & v(x) + for(int l = 0; l < orderPlus; l++){ + u[s][l] = intLegendre[l].compose(lagrange[(*(*faceV[s])[0])[1]] - + lagrange[(*(*faceV[s])[0])[0]], + lagrange[(*(*faceV[s])[0])[0]] + + lagrange[(*(*faceV[s])[0])[1]]); - vector<Polynomial> gradL1 = lagrange[0].gradient(); - vector<Polynomial> gradL2 = lagrange[1].gradient(); + v[s][l] = legendre[l].compose(p[s]); + v[s][l].mul(lagrange[(*(*faceV[s])[0])[2]]); + } - vector<Polynomial> l2GradL1(gradL1); - l2GradL1[0].mul(lagrange[1]); - l2GradL1[1].mul(lagrange[1]); - l2GradL1[2].mul(lagrange[1]); + // Differences of grad(u) and grad(v) + vector<Polynomial> gradL1 = lagrange[(*(*faceV[s])[0])[0]].gradient(); + vector<Polynomial> gradL2 = lagrange[(*(*faceV[s])[0])[1]].gradient(); - vector<Polynomial> l1GradL2(gradL2); - l1GradL2[0].mul(lagrange[0]); - l1GradL2[1].mul(lagrange[0]); - l1GradL2[2].mul(lagrange[0]); + vector<Polynomial> l2GradL1(gradL1); + l2GradL1[0].mul(lagrange[(*(*faceV[s])[0])[1]]); + l2GradL1[1].mul(lagrange[(*(*faceV[s])[0])[1]]); + l2GradL1[2].mul(lagrange[(*(*faceV[s])[0])[1]]); - vector<Polynomial> subGradL1L2(l2GradL1); - subGradL1L2[0].sub(l1GradL2[0]); - subGradL1L2[1].sub(l1GradL2[1]); - subGradL1L2[2].sub(l1GradL2[2]); + vector<Polynomial> l1GradL2(gradL2); + l1GradL2[0].mul(lagrange[(*(*faceV[s])[0])[0]]); + l1GradL2[1].mul(lagrange[(*(*faceV[s])[0])[0]]); + l1GradL2[2].mul(lagrange[(*(*faceV[s])[0])[0]]); + subGrad[s] = new vector<Polynomial>(3); + (*subGrad[s])[0].sub(l1GradL2[0]); + (*subGrad[s])[1].sub(l1GradL2[1]); + (*subGrad[s])[2].sub(l1GradL2[2]); + } + + // Face Basis for(unsigned int s = 0; s < nRefSpace; s++){ unsigned int i = nEdge; // Type 1 for(unsigned int l1 = 1; l1 < order; l1++){ for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){ - vector<Polynomial> tmp1 = v[l2].gradient(); - vector<Polynomial> tmp2 = u[l1].gradient(); + vector<Polynomial> tmp1 = v[s][l2].gradient(); + vector<Polynomial> tmp2 = u[s][l1].gradient(); - tmp1[0].mul(u[l1]); - tmp1[1].mul(u[l1]); - tmp1[2].mul(u[l1]); + tmp1[0].mul(u[s][l1]); + tmp1[1].mul(u[s][l1]); + tmp1[2].mul(u[s][l1]); - tmp2[0].mul(v[l2]); - tmp2[1].mul(v[l2]); - tmp2[2].mul(v[l2]); + tmp2[0].mul(v[s][l2]); + tmp2[1].mul(v[s][l2]); + tmp2[2].mul(v[s][l2]); tmp2[0].add(tmp1[0]); tmp2[1].add(tmp1[1]); @@ -157,16 +184,16 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ // Type 2 for(unsigned int l1 = 1; l1 < order; l1++){ for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){ - vector<Polynomial> tmp1 = v[l2].gradient(); - vector<Polynomial> tmp2 = u[l1].gradient(); + vector<Polynomial> tmp1 = v[s][l2].gradient(); + vector<Polynomial> tmp2 = u[s][l1].gradient(); - tmp1[0].mul(u[l1]); - tmp1[1].mul(u[l1]); - tmp1[2].mul(u[l1]); + tmp1[0].mul(u[s][l1]); + tmp1[1].mul(u[s][l1]); + tmp1[2].mul(u[s][l1]); - tmp2[0].mul(v[l2]); - tmp2[1].mul(v[l2]); - tmp2[2].mul(v[l2]); + tmp2[0].mul(v[s][l2]); + tmp2[1].mul(v[s][l2]); + tmp2[2].mul(v[s][l2]); tmp2[0].sub(tmp1[0]); tmp2[1].sub(tmp1[1]); @@ -180,11 +207,11 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ // Type 3 for(int l = 0; l < orderMinus; l++){ - vector<Polynomial> subGradL1L2V(subGradL1L2); + vector<Polynomial> subGradL1L2V(*subGrad[s]); - subGradL1L2V[0].mul(v[l]); - subGradL1L2V[1].mul(v[l]); - subGradL1L2V[2].mul(v[l]); + subGradL1L2V[0].mul(v[s][l]); + subGradL1L2V[1].mul(v[s][l]); + subGradL1L2V[2].mul(v[s][l]); basis[s][i] = new vector<Polynomial>(subGradL1L2V); @@ -193,10 +220,21 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ } // Free Temporary Sapce // + for(unsigned int s = 0; s < nRefSpace; s++) + delete[] u[s]; + + for(unsigned int s = 0; s < nRefSpace; s++) + delete[] v[s]; + + for(unsigned int s = 0; s < nRefSpace; s++) + delete subGrad[s]; + delete[] legendre; delete[] intLegendre; + delete[] p; delete[] u; delete[] v; + delete[] subGrad; } TriEdgeBasis::~TriEdgeBasis(void){ diff --git a/FunctionSpace/TriNodeBasis.cpp b/FunctionSpace/TriNodeBasis.cpp index dfad8d928d268956994455bd76eebb0081b4050d..3a0cefd789f4ab94f295fe539027684fe1370bbf 100644 --- a/FunctionSpace/TriNodeBasis.cpp +++ b/FunctionSpace/TriNodeBasis.cpp @@ -12,6 +12,9 @@ TriNodeBasis::TriNodeBasis(unsigned int order){ const vector<const vector<const vector<unsigned int>*>*>& edgeV = refSpace->getAllEdge(); + const vector<const vector<const vector<unsigned int>*>*>& + faceV = refSpace->getAllFace(); + // Set BasisTwo Type // this->order = order; @@ -77,6 +80,13 @@ TriNodeBasis::TriNodeBasis(unsigned int order){ } // Face Based // + + // NB: We use (*(*faceV[s])[f])[] + // where f = 0, because triangles + // have only ONE face: the face '0' + + // TO CHECK: Are Triangles face matching tets ? + const Polynomial p = (lagrange[2] * 2) - Polynomial(1, 0, 0, 0); const int orderMinusTwo = order - 2; @@ -86,11 +96,16 @@ TriNodeBasis::TriNodeBasis(unsigned int order){ for(int l1 = 1; l1 < orderMinus; l1++){ for(int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){ basis[s][i] = - new Polynomial(intLegendre[l1].compose(lagrange[1] - lagrange[0], - lagrange[1] + lagrange[0]) + new Polynomial(intLegendre[l1].compose(lagrange[(*(*faceV[s])[0])[1]] - + lagrange[(*(*faceV[s])[0])[0]] + , + lagrange[(*(*faceV[s])[0])[0]] + + lagrange[(*(*faceV[s])[0])[1]]) * - legendre[l2].compose(p) * lagrange[2]); + legendre[l2].compose(lagrange[(*(*faceV[s])[0])[2]]) + * + lagrange[(*(*faceV[s])[0])[2]]); i++; } } diff --git a/FunctionSpace/TriReferenceSpace.cpp b/FunctionSpace/TriReferenceSpace.cpp index e4a1d15850f16d43224d50b872964812253f13b5..92720d547cb1c07357c8a383e49f93ea7eff8af5 100644 --- a/FunctionSpace/TriReferenceSpace.cpp +++ b/FunctionSpace/TriReferenceSpace.cpp @@ -19,8 +19,13 @@ TriReferenceSpace::TriReferenceSpace(void){ } // Face Definition // - nFace = 0; - refFace = NULL; + nFace = 1; + refFace = new unsigned int*[nFace]; + refFace[0] = new unsigned int[3]; + + refFace[0][0] = 0; + refFace[0][1] = 1; + refFace[0][2] = 2; // Init All // init(); @@ -32,6 +37,12 @@ TriReferenceSpace::~TriReferenceSpace(void){ delete[] refEdge[i]; delete[] refEdge; + + // Delete Ref Face // + for(unsigned int i = 0; i < nFace; i++) + delete[] refFace[i]; + + delete[] refFace; } string TriReferenceSpace::toLatex(void) const{ @@ -75,14 +86,3 @@ string TriReferenceSpace::toLatex(void) const{ return stream.str(); } - -/* -#include <iostream> -int main(void){ - TriReferenceSpace p; - - cout << p.toLatex() << endl; - - return 0; -} -*/