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

Bug Fix: ReferenceSpace compatible with Gmsh MElements (automatic)

parent 8be32242
No related branches found
No related tags found
No related merge requests found
......@@ -28,9 +28,9 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
nFunction = nVertex + nEdge + nFace + nCell;
// Alloc Temporary Space //
const unsigned int orderMinus = order - 1;
const unsigned int orderMinusTwo = order - 2;
const unsigned int orderMinusThree = order - 3;
const int orderMinus = order - 1;
const int orderMinusTwo = order - 2;
const int orderMinusThree = order - 3;
Polynomial* legendre = new Polynomial[order];
Polynomial* sclLegendre = new Polynomial[order];
......@@ -72,11 +72,11 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
}
// Edge Based //
for(unsigned int s = 0; s < 2; s++){
for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = nVertex;
for(unsigned int l = 1; l < order; l++){
for(unsigned int e = 0; e < 6; e++){
for(int e = 0; e < 6; e++){
(*(*basis)[s])[i] =
new Polynomial(intLegendre[l].compose
(lagrange[(*(*edgeV[s])[e])[0]] -
......@@ -84,19 +84,18 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
,
lagrange[(*(*edgeV[s])[e])[0]] +
lagrange[(*(*edgeV[s])[e])[1]]));
i++;
}
}
}
// Face Based //
for(unsigned int s = 0; s < 6; s++){
for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = nVertex + nEdge;
for(unsigned int l1 = 1; l1 < orderMinus; l1++){
for(unsigned int l2 = 0; l1 + l2 - 1 < orderMinusTwo; l2++){
for(unsigned int f = 0; f < 4; f++){
for(int l1 = 1; l1 < orderMinus; l1++){
for(int l2 = 0; l1 + l2 - 1 < orderMinusTwo; l2++){
for(int f = 0; f < 4; f++){
Polynomial sum =
lagrange[(*(*faceV[s])[f])[0]] +
lagrange[(*(*faceV[s])[f])[1]] +
......@@ -116,7 +115,6 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
*
sclLegendre[l2].compose
(lagrange[(*(*faceV[s])[f])[2]] * 2 - sum, sum));
i++;
}
}
......@@ -134,10 +132,9 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = nVertex + nEdge + nFace;
for(unsigned int l1 = 1; l1 < orderMinusTwo; l1++){
for(unsigned int l2 = 0; l2 + l1 - 1 < orderMinusThree; l2++){
for(unsigned int l3 = 0; l3 + l2 + l1 - 1 < orderMinusThree; l3++){
for(int l1 = 1; l1 < orderMinusTwo; l1++){
for(int l2 = 0; l2 + l1 - 1 < orderMinusThree; l2++){
for(int l3 = 0; l3 + l2 + l1 - 1 < orderMinusThree; l3++){
(*(*basis)[s])[i] =
new Polynomial(intLegendre[l1].compose(sub, add) *
lagrange[2] *
......@@ -145,7 +142,6 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
oneMinusFour) *
lagrange[3] *
legendre[l3].compose(twoFourMinusOne));
i++;
}
}
......
#include <sstream>
#include "TetReferenceSpace.h"
#include "MTetrahedron.h"
using namespace std;
......@@ -11,28 +12,23 @@ TetReferenceSpace::TetReferenceSpace(void){
nEdge = 6;
refEdge = new unsigned int*[nEdge];
for(unsigned int i = 0; i < nEdge; i++)
refEdge[i] = new unsigned int[2];
refEdge[0][0] = 0; refEdge[0][1] = 1;
refEdge[1][0] = 1; refEdge[1][1] = 2;
refEdge[2][0] = 2; refEdge[2][1] = 0;
refEdge[3][0] = 0; refEdge[3][1] = 3;
refEdge[4][0] = 1; refEdge[4][1] = 3;
refEdge[5][0] = 2; refEdge[5][1] = 3;
for(unsigned int i = 0; i < nEdge; i++){
refEdge[i] = new unsigned int[2];
refEdge[i][0] = MTetrahedron::edges_tetra(i, 0);
refEdge[i][1] = MTetrahedron::edges_tetra(i, 1);
}
// Face Definition //
nFace = 4;
refFace = new unsigned int*[nFace];
for(unsigned int i = 0; i < nFace; i++)
refFace[i] = new unsigned int[3];
for(unsigned int i = 0; i < nFace; i++){
refFace[i] = new unsigned int[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);
}
refFace[0][0] = 0; refFace[0][1] = 1; refFace[0][2] = 2;
refFace[1][0] = 0; refFace[1][1] = 1; refFace[1][2] = 3;
refFace[2][0] = 1; refFace[2][1] = 2; refFace[2][2] = 3;
refFace[3][0] = 2; refFace[3][1] = 0; refFace[3][2] = 3;
// Init All //
init();
}
......
......@@ -25,8 +25,8 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
nFunction = nVertex + nEdge + nFace + nCell;
// Alloc Some Space //
const unsigned int orderPlus = order + 1;
const unsigned int orderMinus = order - 1;
const int orderPlus = order + 1;
const int orderMinus = order - 1;
Polynomial* legendre = new Polynomial[orderPlus];
Polynomial* intLegendre = new Polynomial[orderPlus];
......@@ -57,7 +57,7 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
// Edge Based (Nedelec) //
for(unsigned int s = 0; s < nRefSpace; s++){
for(unsigned int e = 0; e < 3; e++){
for(int e = 0; e < 3; e++){
vector<Polynomial> tmp1 = lagrange[(*(*edgeV[s])[e])[1]].gradient();
vector<Polynomial> tmp2 = lagrange[(*(*edgeV[s])[e])[0]].gradient();
......@@ -82,8 +82,8 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = 3;
for(unsigned int l = 1; l < orderPlus; l++){
for(unsigned int e = 0; e < 3; e++){
for(int l = 1; l < orderPlus; l++){
for(int e = 0; e < 3; e++){
(*(*basis)[s])[i] =
new vector<Polynomial>
((intLegendre[l].compose(lagrange[(*(*edgeV[s])[e])[0]] -
......@@ -101,7 +101,7 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
// Preliminaries
const Polynomial p = lagrange[2] * 2 - Polynomial(1, 0, 0, 0);
for(unsigned int l = 0; l < orderPlus; l++){
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);
......@@ -131,7 +131,7 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
// Type 1
for(unsigned int l1 = 1; l1 < order; l1++){
for(unsigned int l2 = 0; l2 + l1 - 1 < orderMinus; l2++){
for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
vector<Polynomial> tmp1 = v[l2].gradient();
vector<Polynomial> tmp2 = u[l1].gradient();
......@@ -155,7 +155,7 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
// Type 2
for(unsigned int l1 = 1; l1 < order; l1++){
for(unsigned int l2 = 0; l2 + l1 - 1 < orderMinus; l2++){
for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
vector<Polynomial> tmp1 = v[l2].gradient();
vector<Polynomial> tmp2 = u[l1].gradient();
......@@ -178,7 +178,7 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
}
// Type 3
for(unsigned int l = 0; l < orderMinus; l++){
for(int l = 0; l < orderMinus; l++){
vector<Polynomial> subGradL1L2V(subGradL1L2);
subGradL1L2V[0].mul(v[l]);
......
......@@ -25,7 +25,7 @@ TriNodeBasis::TriNodeBasis(unsigned int order){
nFunction = nVertex + nEdge + nFace + nCell;
// Alloc Some Space //
const unsigned int orderMinus = order - 1;
const int orderMinus = order - 1;
Polynomial* legendre = new Polynomial[order];
Polynomial* intLegendre = new Polynomial[order];
......@@ -64,7 +64,7 @@ TriNodeBasis::TriNodeBasis(unsigned int order){
unsigned int i = nVertex;
for(unsigned int l = 1; l < order; l++){
for(unsigned int e = 0; e < 3; e++){
for(int e = 0; e < 3; e++){
(*(*basis)[s])[i] =
new Polynomial(intLegendre[l].compose(lagrange[(*(*edgeV[s])[e])[1]] -
lagrange[(*(*edgeV[s])[e])[0]]
......@@ -78,16 +78,17 @@ TriNodeBasis::TriNodeBasis(unsigned int order){
// Cell Based //
const Polynomial p = (lagrange[2] * 2) - Polynomial(1, 0, 0, 0);
const unsigned int orderMinusTwo = order - 2;
const int orderMinusTwo = order - 2;
for(unsigned int s = 0; s < nRefSpace; s++){
unsigned int i = nVertex + nEdge;
for(unsigned int l1 = 1; l1 < orderMinus; l1++){
for(unsigned int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){
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]) *
lagrange[1] + lagrange[0])
*
legendre[l2].compose(p) * lagrange[2]);
i++;
......
#include <sstream>
#include "TriReferenceSpace.h"
#include "MTriangle.h"
using namespace std;
......@@ -11,12 +12,11 @@ TriReferenceSpace::TriReferenceSpace(void){
nEdge = 3;
refEdge = new unsigned int*[nEdge];
for(unsigned int i = 0; i < nEdge; i++)
refEdge[i] = new unsigned int[2];
refEdge[0][0] = 0; refEdge[0][1] = 1;
refEdge[1][0] = 1; refEdge[1][1] = 2;
refEdge[2][0] = 2; refEdge[2][1] = 0;
for(unsigned int i = 0; i < nEdge; i++){
refEdge[i] = new unsigned int[2];
refEdge[i][0] = MTriangle::edges_tri(i, 0);
refEdge[i][1] = MTriangle::edges_tri(i, 1);
}
// Face Definition //
nFace = 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment