From 70e039d86fed0e4f7d7e91713e34da75afc208b8 Mon Sep 17 00:00:00 2001 From: Nicolas Marsic <nicolas.marsic@gmail.com> Date: Mon, 8 Apr 2013 14:38:34 +0000 Subject: [PATCH] Triangle Cell is now a *FACE* with an *ORIENTATION* -- Seems to work --- FunctionSpace/LineLagrangeBasis.cpp | 6 +- FunctionSpace/LineReferenceSpace.cpp | 9 +- FunctionSpace/TetEdgeBasis.cpp | 3 +- FunctionSpace/TetNodeBasis.cpp | 2 + FunctionSpace/TetReferenceSpace.cpp | 11 --- FunctionSpace/TriEdgeBasis.cpp | 124 +++++++++++++++++---------- FunctionSpace/TriNodeBasis.cpp | 21 ++++- FunctionSpace/TriReferenceSpace.cpp | 26 +++--- 8 files changed, 124 insertions(+), 78 deletions(-) diff --git a/FunctionSpace/LineLagrangeBasis.cpp b/FunctionSpace/LineLagrangeBasis.cpp index c224d58021..ec2eb76cfc 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 d4d41069dd..7ba0eb2d4a 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 afffb7e2fe..73795d0341 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 37971f323c..27cb84d6ef 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 247172bb05..585744aa12 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 f9c1fe7704..088215ee12 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 dfad8d928d..3a0cefd789 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 e4a1d15850..92720d547c 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; -} -*/ -- GitLab