Skip to content
Snippets Groups Projects
Commit 708a843e authored by Nicolas Marsic's avatar Nicolas Marsic
Browse files

TetEdgeBasis: Problem with orientations -- RefBasis is wrong -- Node sorting...

TetEdgeBasis: Problem with orientations -- RefBasis is wrong -- Node sorting is not the solution :-(
parent f53fb375
No related branches found
No related tags found
No related merge requests found
...@@ -123,7 +123,7 @@ Basis* BasisGenerator::tetZaglmayrGen(unsigned int basisType, ...@@ -123,7 +123,7 @@ Basis* BasisGenerator::tetZaglmayrGen(unsigned int basisType,
unsigned int order){ unsigned int order){
switch(basisType){ switch(basisType){
case 0: return new TetNodeBasis(order); case 0: return new TetNodeBasis(order);
//case 1: return new TetEdgeBasis(order); case 1: return new TetEdgeBasis(order);
case 2: throw Exception("2-form not implemented on Tetrahedrons"); case 2: throw Exception("2-form not implemented on Tetrahedrons");
case 3: throw Exception("3-form not implemented on Tetrahedrons"); case 3: throw Exception("3-form not implemented on Tetrahedrons");
......
...@@ -40,7 +40,7 @@ set(SRC ...@@ -40,7 +40,7 @@ set(SRC
# HexEdgeBasis.cpp # HexEdgeBasis.cpp
TetNodeBasis.cpp TetNodeBasis.cpp
# TetEdgeBasis.cpp TetEdgeBasis.cpp
FunctionSpace.cpp FunctionSpace.cpp
FunctionSpaceScalar.cpp FunctionSpaceScalar.cpp
......
...@@ -38,7 +38,7 @@ EvaluatedBasis(const BasisVector& basis, ...@@ -38,7 +38,7 @@ EvaluatedBasis(const BasisVector& basis,
scalar = false; scalar = false;
nFunction = basis.getNFunction(); nFunction = basis.getNFunction();
nPoint = point.size1(); nPoint = point.size1();
// Alloc // // Alloc //
eBasis = new vector<fullMatrix<double>*>(nRefSpace); eBasis = new vector<fullMatrix<double>*>(nRefSpace);
......
...@@ -100,6 +100,12 @@ EvaluatedBasis::getEvaluation(unsigned int refSpace) const{ ...@@ -100,6 +100,12 @@ EvaluatedBasis::getEvaluation(unsigned int refSpace) const{
inline const fullMatrix<double>& inline const fullMatrix<double>&
EvaluatedBasis::getEvaluation(const MElement& element) const{ EvaluatedBasis::getEvaluation(const MElement& element) const{
/*
std::cout << element.getNum()
<< ": "
<< refSpace->getReferenceSpace(element)
<< std::endl;
*/
return *(*eBasis)[refSpace->getReferenceSpace(element)]; return *(*eBasis)[refSpace->getReferenceSpace(element)];
} }
......
...@@ -75,7 +75,7 @@ void FunctionSpace::build(const GroupOfElement& goe, ...@@ -75,7 +75,7 @@ void FunctionSpace::build(const GroupOfElement& goe,
fPerFace = basis->getNFaceBased() / nFace; fPerFace = basis->getNFaceBased() / nFace;
else else
fPerFace = 0; fPerFace = 0;
fPerCell = basis->getNCellBased(); // We always got 1 cell fPerCell = basis->getNCellBased(); // We always got 1 cell
// Build Dof // // Build Dof //
......
...@@ -234,7 +234,7 @@ unsigned int ReferenceSpace::getReferenceSpace(const MElement& elem) const{ ...@@ -234,7 +234,7 @@ unsigned int ReferenceSpace::getReferenceSpace(const MElement& elem) const{
vertex[i].first = i; vertex[i].first = i;
vertex[i].second = element.getVertex(i); vertex[i].second = element.getVertex(i);
} }
// Sort Them with repsect to Vertex Global ID // // Sort Them with repsect to Vertex Global ID //
// (vertex[i].second->getNum) // // (vertex[i].second->getNum) //
std::sort(vertex.begin(), vertex.end(), sortPredicate); std::sort(vertex.begin(), vertex.end(), sortPredicate);
......
#include "TetEdgeBasis.h" #include "TetEdgeBasis.h"
#include "TetReferenceSpace.h"
#include "Legendre.h" #include "Legendre.h"
using namespace std; using namespace std;
TetEdgeBasis::TetEdgeBasis(int order){ TetEdgeBasis::TetEdgeBasis(unsigned int order){
// Reference Space //
refSpace = new TetReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace();
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 // // Set Basis Type //
this->order = order; this->order = order;
type = 1; type = 1;
dim = 3; dim = 3;
nVertex = 0; nVertex = 0;
nEdge = 6 * (order + 1); nEdge = 6 * (order + 1);
nFace = 4 * (order + 1) * (order - 1); nFace = 4 * (order + 1) * (order - 1);
nCell = (order + 1) * (order - 1) * (order - 2) / 2; nCell = (order + 1) * (order - 1) * (order - 2) / 2;
nFunction = nVertex + nEdge + nFace + nCell;
nEdgeClosure = 2;
nFaceClosure = 6;
size = nVertex + nEdge + nFace + nCell;
// Alloc Temporary Space // // Alloc Temporary Space //
const int orderPlus = order + 1; const int orderPlus = order + 1;
const int orderMinus = order - 1; const int orderMinus = order - 1;
const int orderMinusTwo = order - 2; const int orderMinusTwo = order - 2;
Polynomial lagrange[4];
Polynomial* legendre = new Polynomial[orderMinus]; Polynomial* legendre = new Polynomial[orderMinus];
Polynomial* sclLegendre = new Polynomial[orderMinus]; Polynomial* sclLegendre = new Polynomial[orderMinus];
Polynomial* intLegendre = new Polynomial[orderPlus]; Polynomial* intLegendre = new Polynomial[orderPlus];
...@@ -35,122 +40,91 @@ TetEdgeBasis::TetEdgeBasis(int order){ ...@@ -35,122 +40,91 @@ TetEdgeBasis::TetEdgeBasis(int order){
Legendre::legendre(legendre, orderMinusTwo); Legendre::legendre(legendre, orderMinusTwo);
Legendre::scaled(sclLegendre, orderMinusTwo); Legendre::scaled(sclLegendre, orderMinusTwo);
Legendre::intScaled(intLegendre, orderPlus); Legendre::intScaled(intLegendre, orderPlus);
// Vertices definig Edges & Permutations // // Lagrange Polynomial //
const int edgeV[2][6][2] = const Polynomial lagrange[4] =
{ {
{ {0, 1}, {1, 2}, {2, 0}, Polynomial(Polynomial(1, 0, 0, 0) -
{3, 0}, {3, 2}, {3, 1} }, Polynomial(1, 1, 0, 0) -
Polynomial(1, 0, 1, 0) -
{ {1, 0}, {2, 1}, {0, 2}, Polynomial(1, 0, 0, 1)),
{0, 3}, {2, 3}, {1, 3} }
}; Polynomial(Polynomial(1, 1, 0, 0)),
// Vertices definig Faces & Permutations // Polynomial(Polynomial(1, 0, 1, 0)),
const int faceV[6][4][3] =
{ Polynomial(Polynomial(1, 0, 0, 1))
{ {0, 2, 1}, {0, 1, 3}, {0, 3, 2}, {3, 1, 2} },
{ {2, 0, 1}, {1, 0, 3}, {3, 0, 2}, {1, 3, 2} },
{ {2, 1, 0}, {1, 3, 0}, {3, 2, 0}, {1, 2, 3} },
{ {1, 2, 0}, {3, 1, 0}, {2, 3, 0}, {2, 1, 3} },
{ {1, 0, 2}, {3, 0, 1}, {2, 0, 3}, {2, 3, 1} },
{ {0, 1, 2}, {0, 3, 1}, {0, 2, 3}, {3, 2, 1} },
}; };
// Basis //
node = new vector<vector<Polynomial>*>(nVertex);
edge = new vector<vector<vector<Polynomial>*>*>(2);
face = new vector<vector<vector<Polynomial>*>*>(6);
cell = new vector<vector<Polynomial>*>(nCell);
(*edge)[0] = new vector<vector<Polynomial>*>(nEdge);
(*edge)[1] = new vector<vector<Polynomial>*>(nEdge);
(*face)[0] = new vector<vector<Polynomial>*>(nFace);
(*face)[1] = new vector<vector<Polynomial>*>(nFace);
(*face)[2] = new vector<vector<Polynomial>*>(nFace);
(*face)[3] = new vector<vector<Polynomial>*>(nFace);
(*face)[4] = new vector<vector<Polynomial>*>(nFace);
(*face)[5] = new vector<vector<Polynomial>*>(nFace);
// Lagrange //
lagrange[0] =
Polynomial(1, 0, 0, 0) -
Polynomial(1, 1, 0, 0) -
Polynomial(1, 0, 1, 0) -
Polynomial(1, 0, 0, 1);
lagrange[1] = // Basis //
Polynomial(1, 1, 0, 0); basis = new vector<vector<const vector<Polynomial>*>*>(nRefSpace);
lagrange[2] =
Polynomial(1, 0, 1, 0);
lagrange[3] = for(unsigned int s = 0; s < nRefSpace; s++)
Polynomial(1, 0, 0, 1); (*basis)[s] = new vector<const vector<Polynomial>*>(nFunction);
// Edge Based (Nedelec) // // Edge Based (Nedelec) //
for(int c = 0; c < 2; c++){ for(unsigned int s = 0; s < nRefSpace; s++){
for(int e = 0; e < 6; e++){ for(int e = 0; e < 6; e++){
vector<Polynomial> tmp = lagrange[edgeV[c][e][1]].gradient(); vector<Polynomial> tmp1 = lagrange[(*(*edgeV[s])[e])[1]].gradient();
vector<Polynomial> tmp2 = lagrange[(*(*edgeV[s])[e])[0]].gradient();
tmp[0].mul(lagrange[edgeV[c][e][0]]);
tmp[1].mul(lagrange[edgeV[c][e][0]]); tmp1[0].mul(lagrange[(*(*edgeV[s])[e])[0]]);
tmp[2].mul(lagrange[edgeV[c][e][0]]); tmp1[1].mul(lagrange[(*(*edgeV[s])[e])[0]]);
tmp1[2].mul(lagrange[(*(*edgeV[s])[e])[0]]);
(*(*edge)[c])[e] =
new vector<Polynomial>(lagrange[edgeV[c][e][0]].gradient()); tmp2[0].mul(lagrange[(*(*edgeV[s])[e])[1]]);
tmp2[1].mul(lagrange[(*(*edgeV[s])[e])[1]]);
tmp2[2].mul(lagrange[(*(*edgeV[s])[e])[1]]);
(*(*edge)[c])[e]->at(0).mul(lagrange[edgeV[c][e][1]]); tmp1[0].sub(tmp2[0]);
(*(*edge)[c])[e]->at(1).mul(lagrange[edgeV[c][e][1]]); tmp1[1].sub(tmp2[1]);
(*(*edge)[c])[e]->at(2).mul(lagrange[edgeV[c][e][1]]); tmp1[2].sub(tmp2[2]);
(*(*edge)[c])[e]->at(0).sub(tmp[0]); (*(*basis)[s])[e] = new vector<Polynomial>(tmp1);
(*(*edge)[c])[e]->at(1).sub(tmp[1]);
(*(*edge)[c])[e]->at(2).sub(tmp[2]);
} }
} }
// Edge Based (High Order) // // Edge Based (High Order) //
for(int c = 0; c < 2; c++){ for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = 0; unsigned int i = 6;
for(int l = 1; l < orderPlus; l++){ for(int l = 1; l < orderPlus; l++){
for(int e = 0; e < 6; e++){ for(int e = 0; e < 6; e++){
(*(*edge)[c])[i + 6] = (*(*basis)[s])[i] =
new vector<Polynomial> new vector<Polynomial>
(intLegendre[l].compose ((intLegendre[l].compose(lagrange[(*(*edgeV[s])[e])[0]] -
(lagrange[edgeV[c][e][0]] - lagrange[edgeV[c][e][1]], lagrange[(*(*edgeV[s])[e])[1]]
lagrange[edgeV[c][e][0]] + lagrange[edgeV[c][e][1]]).gradient()); ,
lagrange[(*(*edgeV[s])[e])[0]] +
lagrange[(*(*edgeV[s])[e])[1]])).gradient());
i++; i++;
} }
} }
} }
// Face Based // // Face Based //
for(int c = 0; c < 6; c++){ for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = 0; unsigned int i = nEdge;
for(int l1 = 1; l1 < order; l1++){ for(unsigned int l1 = 1; l1 < order; l1++){
for(int l2 = 0; l2 + l1 - 1 < orderMinus; l2++){ for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
for(int f = 0; f < 4; f++){ for(int f = 0; f < 4; f++){
// Preliminary Type 1 // Preliminary Type 1
Polynomial sum = Polynomial sum =
lagrange[faceV[c][f][0]] + lagrange[(*(*faceV[s])[f])[0]] +
lagrange[faceV[c][f][1]] + lagrange[(*(*faceV[s])[f])[1]] +
lagrange[faceV[c][f][2]]; lagrange[(*(*faceV[s])[f])[2]];
Polynomial u = intLegendre[l1].compose
(lagrange[faceV[c][f][0]] - lagrange[faceV[c][f][1]],
lagrange[faceV[c][f][0]] + lagrange[faceV[c][f][1]]);
Polynomial v = lagrange[faceV[c][f][2]] * sclLegendre[l2].compose Polynomial u =
(lagrange[faceV[c][f][2]] * 2 - sum, sum); intLegendre[l1].compose(lagrange[(*(*faceV[s])[f])[0]] -
lagrange[(*(*faceV[s])[f])[1]]
,
lagrange[(*(*faceV[s])[f])[0]] +
lagrange[(*(*faceV[s])[f])[1]]);
Polynomial v =
lagrange[(*(*faceV[s])[f])[2]] *
sclLegendre[l2].compose(lagrange[(*(*faceV[s])[f])[2]] * 2 - sum, sum);
// Preliminary Type 2 // Preliminary Type 2
vector<Polynomial> gradU = u.gradient(); vector<Polynomial> gradU = u.gradient();
...@@ -172,18 +146,18 @@ TetEdgeBasis::TetEdgeBasis(int order){ ...@@ -172,18 +146,18 @@ TetEdgeBasis::TetEdgeBasis(int order){
subGradUV[2].sub(uGradV[2]); subGradUV[2].sub(uGradV[2]);
// Preliminary Type 3 // Preliminary Type 3
vector<Polynomial> gradL1 = lagrange[faceV[c][f][0]].gradient(); vector<Polynomial> gradL1 = lagrange[(*(*faceV[s])[f])[0]].gradient();
vector<Polynomial> gradL2 = lagrange[faceV[c][f][1]].gradient(); vector<Polynomial> gradL2 = lagrange[(*(*faceV[s])[f])[1]].gradient();
vector<Polynomial> l2GradL1(gradL1); vector<Polynomial> l2GradL1(gradL1);
l2GradL1[0].mul(lagrange[faceV[c][f][1]]); l2GradL1[0].mul(lagrange[(*(*faceV[s])[f])[1]]);
l2GradL1[1].mul(lagrange[faceV[c][f][1]]); l2GradL1[1].mul(lagrange[(*(*faceV[s])[f])[1]]);
l2GradL1[2].mul(lagrange[faceV[c][f][1]]); l2GradL1[2].mul(lagrange[(*(*faceV[s])[f])[1]]);
vector<Polynomial> l1GradL2(gradL2); vector<Polynomial> l1GradL2(gradL2);
l1GradL2[0].mul(lagrange[faceV[c][f][0]]); l1GradL2[0].mul(lagrange[(*(*faceV[s])[f])[0]]);
l1GradL2[1].mul(lagrange[faceV[c][f][0]]); l1GradL2[1].mul(lagrange[(*(*faceV[s])[f])[0]]);
l1GradL2[2].mul(lagrange[faceV[c][f][0]]); l1GradL2[2].mul(lagrange[(*(*faceV[s])[f])[0]]);
vector<Polynomial> subGradL1L2V(l2GradL1); vector<Polynomial> subGradL1L2V(l2GradL1);
subGradL1L2V[0].sub(l1GradL2[0]); subGradL1L2V[0].sub(l1GradL2[0]);
...@@ -196,20 +170,20 @@ TetEdgeBasis::TetEdgeBasis(int order){ ...@@ -196,20 +170,20 @@ TetEdgeBasis::TetEdgeBasis(int order){
// Type 1 // Type 1
(*(*face)[c])[i] = (*(*basis)[s])[i] =
new vector<Polynomial>((u * v).gradient()); new vector<Polynomial>((u * v).gradient());
i++; i++;
// Type 2 // Type 2
(*(*face)[c])[i] = (*(*basis)[s])[i] =
new vector<Polynomial>(subGradUV); new vector<Polynomial>(subGradUV);
i++; i++;
// Type 3 // Type 3
if(l1 == 1){ if(l1 == 1){
(*(*face)[c])[i] = (*(*basis)[s])[i] =
new vector<Polynomial>(subGradL1L2V); new vector<Polynomial>(subGradL1L2V);
i++; i++;
...@@ -219,126 +193,126 @@ TetEdgeBasis::TetEdgeBasis(int order){ ...@@ -219,126 +193,126 @@ TetEdgeBasis::TetEdgeBasis(int order){
} }
} }
// Cell Based // // Cell Based //
Polynomial one(1, 0, 0, 0); const Polynomial one(1, 0, 0, 0);
unsigned int i = 0; for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = nEdge + nFace;
for(int l1 = 1; l1 < orderMinus; l1++){
for(int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){
for(int l3 = 0; l3 + l2 + l1 - 1 < orderMinusTwo; l3++){
// Preliminary Type 1
Polynomial u = intLegendre[l1].compose
(lagrange[0] - lagrange[1],
lagrange[0] + lagrange[1]);
Polynomial v = lagrange[2] * sclLegendre[l2].compose
(lagrange[2] * 2 - (one - lagrange[3]), one - lagrange[3]);
Polynomial w = lagrange[3] * legendre[l3].compose
(lagrange[3] * 2 - one);
// Preliminary Type 2
vector<Polynomial> gradU = u.gradient();
vector<Polynomial> gradV = v.gradient();
vector<Polynomial> gradW = w.gradient();
vector<Polynomial> vwGradU(gradU);
vwGradU[0].mul(v);
vwGradU[1].mul(v);
vwGradU[2].mul(v);
vwGradU[0].mul(w);
vwGradU[1].mul(w);
vwGradU[2].mul(w);
vector<Polynomial> uwGradV(gradV);
uwGradV[0].mul(u);
uwGradV[1].mul(u);
uwGradV[2].mul(u);
uwGradV[0].mul(w);
uwGradV[1].mul(w);
uwGradV[2].mul(w);
vector<Polynomial> uvGradW(gradW);
uvGradW[0].mul(u);
uvGradW[1].mul(u);
uvGradW[2].mul(u);
uvGradW[0].mul(v);
uvGradW[1].mul(v);
uvGradW[2].mul(v);
vector<Polynomial> term1(vwGradU);
term1[0].sub(uwGradV[0]);
term1[1].sub(uwGradV[1]);
term1[2].sub(uwGradV[2]);
term1[0].add(uvGradW[0]);
term1[1].add(uvGradW[1]);
term1[2].add(uvGradW[2]);
vector<Polynomial> term2(vwGradU);
term2[0].add(uwGradV[0]);
term2[1].add(uwGradV[1]);
term2[2].add(uwGradV[2]);
term2[0].sub(uvGradW[0]);
term2[1].sub(uvGradW[1]);
term2[2].sub(uvGradW[2]);
// Preliminary Type 3
vector<Polynomial> gradL1 = lagrange[0].gradient();
vector<Polynomial> gradL2 = lagrange[1].gradient();
vector<Polynomial> l2GradL1(gradL1);
l2GradL1[0].mul(lagrange[1]);
l2GradL1[1].mul(lagrange[1]);
l2GradL1[2].mul(lagrange[1]);
vector<Polynomial> l1GradL2(gradL2);
l1GradL2[0].mul(lagrange[0]);
l1GradL2[1].mul(lagrange[0]);
l1GradL2[2].mul(lagrange[0]);
vector<Polynomial> subGradL1L2VW(l2GradL1);
subGradL1L2VW[0].sub(l1GradL2[0]);
subGradL1L2VW[1].sub(l1GradL2[1]);
subGradL1L2VW[2].sub(l1GradL2[2]);
subGradL1L2VW[0].mul(v);
subGradL1L2VW[1].mul(v);
subGradL1L2VW[2].mul(v);
subGradL1L2VW[0].mul(w);
subGradL1L2VW[1].mul(w);
subGradL1L2VW[2].mul(w);
// Type 1
(*cell)[i] = new vector<Polynomial>((u * v * w).gradient());
i++;
// Type 2 -- Part 1
(*cell)[i] = new vector<Polynomial>(term1);
i++;
// Type 2 -- Part 2
(*cell)[i] = new vector<Polynomial>(term2);
i++;
// Type 3 for(int l1 = 1; l1 < orderMinus; l1++){
if(l1 == 1){ for(int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){
(*cell)[i] = new vector<Polynomial>(subGradL1L2VW); for(int l3 = 0; l3 + l2 + l1 - 1 < orderMinusTwo; l3++){
// Preliminary Type 1
Polynomial u = intLegendre[l1].compose
(lagrange[0] - lagrange[1],
lagrange[0] + lagrange[1]);
Polynomial v = lagrange[2] * sclLegendre[l2].compose
(lagrange[2] * 2 - (one - lagrange[3]), one - lagrange[3]);
Polynomial w = lagrange[3] * legendre[l3].compose
(lagrange[3] * 2 - one);
// Preliminary Type 2
vector<Polynomial> gradU = u.gradient();
vector<Polynomial> gradV = v.gradient();
vector<Polynomial> gradW = w.gradient();
vector<Polynomial> vwGradU(gradU);
vwGradU[0].mul(v);
vwGradU[1].mul(v);
vwGradU[2].mul(v);
vwGradU[0].mul(w);
vwGradU[1].mul(w);
vwGradU[2].mul(w);
vector<Polynomial> uwGradV(gradV);
uwGradV[0].mul(u);
uwGradV[1].mul(u);
uwGradV[2].mul(u);
uwGradV[0].mul(w);
uwGradV[1].mul(w);
uwGradV[2].mul(w);
vector<Polynomial> uvGradW(gradW);
uvGradW[0].mul(u);
uvGradW[1].mul(u);
uvGradW[2].mul(u);
uvGradW[0].mul(v);
uvGradW[1].mul(v);
uvGradW[2].mul(v);
vector<Polynomial> term1(vwGradU);
term1[0].sub(uwGradV[0]);
term1[1].sub(uwGradV[1]);
term1[2].sub(uwGradV[2]);
term1[0].add(uvGradW[0]);
term1[1].add(uvGradW[1]);
term1[2].add(uvGradW[2]);
vector<Polynomial> term2(vwGradU);
term2[0].add(uwGradV[0]);
term2[1].add(uwGradV[1]);
term2[2].add(uwGradV[2]);
term2[0].sub(uvGradW[0]);
term2[1].sub(uvGradW[1]);
term2[2].sub(uvGradW[2]);
// Preliminary Type 3
vector<Polynomial> gradL1 = lagrange[0].gradient();
vector<Polynomial> gradL2 = lagrange[1].gradient();
vector<Polynomial> l2GradL1(gradL1);
l2GradL1[0].mul(lagrange[1]);
l2GradL1[1].mul(lagrange[1]);
l2GradL1[2].mul(lagrange[1]);
vector<Polynomial> l1GradL2(gradL2);
l1GradL2[0].mul(lagrange[0]);
l1GradL2[1].mul(lagrange[0]);
l1GradL2[2].mul(lagrange[0]);
vector<Polynomial> subGradL1L2VW(l2GradL1);
subGradL1L2VW[0].sub(l1GradL2[0]);
subGradL1L2VW[1].sub(l1GradL2[1]);
subGradL1L2VW[2].sub(l1GradL2[2]);
subGradL1L2VW[0].mul(v);
subGradL1L2VW[1].mul(v);
subGradL1L2VW[2].mul(v);
subGradL1L2VW[0].mul(w);
subGradL1L2VW[1].mul(w);
subGradL1L2VW[2].mul(w);
// Type 1
(*(*basis)[s])[i] = new vector<Polynomial>((u * v * w).gradient());
i++;
// Type 2 -- Part 1
(*(*basis)[s])[i] = new vector<Polynomial>(term1);
i++; i++;
// Type 2 -- Part 2
(*(*basis)[s])[i] = new vector<Polynomial>(term2);
i++;
// Type 3
if(l1 == 1){
(*(*basis)[s])[i] = new vector<Polynomial>(subGradL1L2VW);
i++;
}
} }
} }
} }
} }
// Free Temporary Sapce // // Free Temporary Sapce //
delete[] legendre; delete[] legendre;
delete[] sclLegendre; delete[] sclLegendre;
...@@ -346,38 +320,17 @@ TetEdgeBasis::TetEdgeBasis(int order){ ...@@ -346,38 +320,17 @@ TetEdgeBasis::TetEdgeBasis(int order){
} }
TetEdgeBasis::~TetEdgeBasis(void){ TetEdgeBasis::~TetEdgeBasis(void){
// Vertex Based // // ReferenceSpace //
for(int i = 0; i < nVertex; i++) delete refSpace;
delete (*node)[i];
delete node;
// Edge Based //
for(int c = 0; c < 2; c++){
for(int i = 0; i < nEdge; i++)
delete (*(*edge)[c])[i];
delete (*edge)[c];
}
delete edge;
// Basis //
for(unsigned int i = 0; i < nRefSpace; i++){
for(unsigned int j = 0; j < nFunction; j++)
delete (*(*basis)[i])[j];
// Face Based // delete (*basis)[i];
for(int c = 0; c < 6; c++){
for(int i = 0; i < nFace; i++)
delete (*(*face)[c])[i];
delete (*face)[c];
} }
delete face; delete basis;
// Cell Based //
for(int i = 0; i < nCell; i++)
delete (*cell)[i];
delete cell;
} }
...@@ -20,7 +20,7 @@ class TetEdgeBasis: public BasisVector{ ...@@ -20,7 +20,7 @@ class TetEdgeBasis: public BasisVector{
//! @param order The order of the Basis //! @param order The order of the Basis
//! //!
//! Returns a new Edge-Basis for Tetrahedra of the given order //! Returns a new Edge-Basis for Tetrahedra of the given order
TetEdgeBasis(int order); TetEdgeBasis(unsigned int order);
//! Deletes this Basis //! Deletes this Basis
//! //!
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment