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

** ReferenceSpace:

     -- Minimal number of reference space (at least for tet, tri and quad)
     -- Automatic generation of these reference space
     -- New interface
     -- Modification of TriNodeBasis accordingly

** Need to compute Dof permutations automaticaly

** All Basis are commented (exept for TriNodeBasis)

** WARNING: Memory leak somewhere
parent ca29a67a
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
using namespace std; using namespace std;
TetNedelecBasis::TetNedelecBasis(void){ TetNedelecBasis::TetNedelecBasis(void){
/*
// Reference Space // // Reference Space //
refSpace = new TetReferenceSpace; refSpace = new TetReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -66,9 +67,11 @@ TetNedelecBasis::TetNedelecBasis(void){ ...@@ -66,9 +67,11 @@ TetNedelecBasis::TetNedelecBasis(void){
basis[s][e] = new vector<Polynomial>(tmp2); basis[s][e] = new vector<Polynomial>(tmp2);
} }
} }
*/
} }
TetNedelecBasis::~TetNedelecBasis(void){ TetNedelecBasis::~TetNedelecBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -81,4 +84,5 @@ TetNedelecBasis::~TetNedelecBasis(void){ ...@@ -81,4 +84,5 @@ TetNedelecBasis::~TetNedelecBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
TetNodeBasis::TetNodeBasis(unsigned int order){ TetNodeBasis::TetNodeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new TetReferenceSpace; refSpace = new TetReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -154,9 +155,11 @@ TetNodeBasis::TetNodeBasis(unsigned int order){ ...@@ -154,9 +155,11 @@ TetNodeBasis::TetNodeBasis(unsigned int order){
delete[] legendre; delete[] legendre;
delete[] sclLegendre; delete[] sclLegendre;
delete[] intLegendre; delete[] intLegendre;
*/
} }
TetNodeBasis::~TetNodeBasis(void){ TetNodeBasis::~TetNodeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -169,4 +172,5 @@ TetNodeBasis::~TetNodeBasis(void){ ...@@ -169,4 +172,5 @@ TetNodeBasis::~TetNodeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
TetReferenceSpace::TetReferenceSpace(void){ TetReferenceSpace::TetReferenceSpace(void){
/*
// Vertex Definition // // Vertex Definition //
nVertex = 4; nVertex = 4;
...@@ -40,9 +41,11 @@ TetReferenceSpace::TetReferenceSpace(void){ ...@@ -40,9 +41,11 @@ TetReferenceSpace::TetReferenceSpace(void){
// Init All // // Init All //
init(); init();
*/
} }
TetReferenceSpace::~TetReferenceSpace(void){ TetReferenceSpace::~TetReferenceSpace(void){
/*
// Delete Ref Edge // // Delete Ref Edge //
for(size_t i = 0; i < nEdge; i++) for(size_t i = 0; i < nEdge; i++)
delete[] refEdge[i]; delete[] refEdge[i];
...@@ -55,13 +58,14 @@ TetReferenceSpace::~TetReferenceSpace(void){ ...@@ -55,13 +58,14 @@ TetReferenceSpace::~TetReferenceSpace(void){
delete[] refFace; delete[] refFace;
delete[] nNodeInFace; delete[] nNodeInFace;
*/
} }
string TetReferenceSpace::toLatex(void) const{ string TetReferenceSpace::toLatex(void) const{
const size_t nPerm = pTree->getNPermutation(); //const size_t nPerm = pTree->getNPermutation();
stringstream stream; stringstream stream;
vector<size_t> perm; //vector<size_t> perm;
/*
stream << "\\documentclass{article}" << endl << endl stream << "\\documentclass{article}" << endl << endl
<< "\\usepackage{longtable}" << endl << "\\usepackage{longtable}" << endl
...@@ -101,6 +105,6 @@ string TetReferenceSpace::toLatex(void) const{ ...@@ -101,6 +105,6 @@ string TetReferenceSpace::toLatex(void) const{
stream << "\\end{longtable}" << endl stream << "\\end{longtable}" << endl
<< "\\end{document}" << endl; << "\\end{document}" << endl;
*/
return stream.str(); return stream.str();
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
TriEdgeBasis::TriEdgeBasis(unsigned int order){ TriEdgeBasis::TriEdgeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new TriReferenceSpace; refSpace = new TriReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -235,9 +236,11 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){ ...@@ -235,9 +236,11 @@ TriEdgeBasis::TriEdgeBasis(unsigned int order){
delete[] u; delete[] u;
delete[] v; delete[] v;
delete[] subGrad; delete[] subGrad;
*/
} }
TriEdgeBasis::~TriEdgeBasis(void){ TriEdgeBasis::~TriEdgeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -250,4 +253,5 @@ TriEdgeBasis::~TriEdgeBasis(void){ ...@@ -250,4 +253,5 @@ TriEdgeBasis::~TriEdgeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
using namespace std; using namespace std;
TriLagrangeReferenceSpace::TriLagrangeReferenceSpace(unsigned int order){ TriLagrangeReferenceSpace::TriLagrangeReferenceSpace(unsigned int order){
/*
// Vertex Definition // // Vertex Definition //
nVertex = 3; nVertex = 3;
...@@ -41,9 +42,11 @@ TriLagrangeReferenceSpace::TriLagrangeReferenceSpace(unsigned int order){ ...@@ -41,9 +42,11 @@ TriLagrangeReferenceSpace::TriLagrangeReferenceSpace(unsigned int order){
nNodePerCell; nNodePerCell;
getLagrangeNode(); getLagrangeNode();
*/
} }
TriLagrangeReferenceSpace::~TriLagrangeReferenceSpace(void){ TriLagrangeReferenceSpace::~TriLagrangeReferenceSpace(void){
/*
// Delete Ref Edge // // Delete Ref Edge //
for(size_t i = 0; i < nEdge; i++) for(size_t i = 0; i < nEdge; i++)
delete[] refEdge[i]; delete[] refEdge[i];
...@@ -55,4 +58,5 @@ TriLagrangeReferenceSpace::~TriLagrangeReferenceSpace(void){ ...@@ -55,4 +58,5 @@ TriLagrangeReferenceSpace::~TriLagrangeReferenceSpace(void){
delete[] refFace[i]; delete[] refFace[i];
delete[] refFace; delete[] refFace;
*/
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
using namespace std; using namespace std;
TriNedelecBasis::TriNedelecBasis(void){ TriNedelecBasis::TriNedelecBasis(void){
/*
// Reference Space // // Reference Space //
refSpace = new TriReferenceSpace; refSpace = new TriReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -63,9 +64,11 @@ TriNedelecBasis::TriNedelecBasis(void){ ...@@ -63,9 +64,11 @@ TriNedelecBasis::TriNedelecBasis(void){
basis[s][e] = new vector<Polynomial>(tmp2); basis[s][e] = new vector<Polynomial>(tmp2);
} }
} }
*/
} }
TriNedelecBasis::~TriNedelecBasis(void){ TriNedelecBasis::~TriNedelecBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -78,4 +81,5 @@ TriNedelecBasis::~TriNedelecBasis(void){ ...@@ -78,4 +81,5 @@ TriNedelecBasis::~TriNedelecBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -4,16 +4,16 @@ ...@@ -4,16 +4,16 @@
using namespace std; using namespace std;
TriNodeBasis::TriNodeBasis(unsigned int order){ TriNodeBasis::TriNodeBasis(size_t order){
// Reference Space // // Reference Space //
refSpace = new TriReferenceSpace; refSpace = new TriReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
const vector<const vector<const vector<unsigned int>*>*>& const vector<vector<vector<size_t> > >&
edgeV = refSpace->getAllEdge(); edgeIdx = refSpace->getEdgeNodeIndex();
const vector<const vector<const vector<unsigned int>*>*>& const vector<vector<vector<size_t> > >&
faceV = refSpace->getAllFace(); faceIdx = refSpace->getFaceNodeIndex();
// Set BasisTwo Type // // Set BasisTwo Type //
this->order = order; this->order = order;
...@@ -51,28 +51,28 @@ TriNodeBasis::TriNodeBasis(unsigned int order){ ...@@ -51,28 +51,28 @@ TriNodeBasis::TriNodeBasis(unsigned int order){
// Basis // // Basis //
basis = new Polynomial**[nRefSpace]; basis = new Polynomial**[nRefSpace];
for(unsigned int s = 0; s < nRefSpace; s++) for(size_t s = 0; s < nRefSpace; s++)
basis[s] = new Polynomial*[nFunction]; basis[s] = new Polynomial*[nFunction];
// Vertex Based // // Vertex Based //
for(unsigned int s = 0; s < nRefSpace; s++){ for(size_t s = 0; s < nRefSpace; s++){
basis[s][0] = new Polynomial(lagrange[0]); basis[s][0] = new Polynomial(lagrange[0]);
basis[s][1] = new Polynomial(lagrange[1]); basis[s][1] = new Polynomial(lagrange[1]);
basis[s][2] = new Polynomial(lagrange[2]); basis[s][2] = new Polynomial(lagrange[2]);
} }
// Edge Based // // Edge Based //
for(unsigned int s = 0; s < nRefSpace; s++){ for(size_t s = 0; s < nRefSpace; s++){
unsigned int i = nVertex; size_t i = nVertex;
for(unsigned int e = 0; e < 3; e++){ for(size_t e = 0; e < 3; e++){
for(unsigned int l = 1; l < order; l++){ for(size_t l = 1; l < order; l++){
basis[s][i] = basis[s][i] =
new Polynomial(intLegendre[l].compose(lagrange[(*(*edgeV[s])[e])[1]] - new Polynomial(intLegendre[l].compose(lagrange[edgeIdx[s][e][1]] -
lagrange[(*(*edgeV[s])[e])[0]] lagrange[edgeIdx[s][e][0]]
, ,
lagrange[(*(*edgeV[s])[e])[0]] + lagrange[edgeIdx[s][e][0]] +
lagrange[(*(*edgeV[s])[e])[1]])); lagrange[edgeIdx[s][e][1]]));
i++; i++;
} }
} }
...@@ -80,30 +80,30 @@ TriNodeBasis::TriNodeBasis(unsigned int order){ ...@@ -80,30 +80,30 @@ TriNodeBasis::TriNodeBasis(unsigned int order){
// Face Based // // Face Based //
// NB: We use (*(*faceV[s])[f])[] // NB: We use (*(*faceIdx[s])[f])[]
// where f = 0, because triangles // where f = 0, because triangles
// have only ONE face: the face '0' // have only ONE face: the face '0'
const int orderMinusTwo = order - 2; const int orderMinusTwo = order - 2;
for(unsigned int s = 0; s < nRefSpace; s++){ for(size_t s = 0; s < nRefSpace; s++){
unsigned int i = nVertex + nEdge; size_t i = nVertex + nEdge;
for(int l1 = 1; l1 < orderMinus; l1++){ for(int l1 = 1; l1 < orderMinus; l1++){
for(int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){ for(int l2 = 0; l2 + l1 - 1 < orderMinusTwo; l2++){
basis[s][i] = basis[s][i] =
new Polynomial(intLegendre[l1].compose(lagrange[(*(*faceV[s])[0])[1]] - new Polynomial(intLegendre[l1].compose(lagrange[faceIdx[s][0][1]] -
lagrange[(*(*faceV[s])[0])[0]] lagrange[faceIdx[s][0][0]]
, ,
lagrange[(*(*faceV[s])[0])[0]] + lagrange[faceIdx[s][0][0]] +
lagrange[(*(*faceV[s])[0])[1]]) lagrange[faceIdx[s][0][1]])
* *
legendre[l2].compose((lagrange[(*(*faceV[s])[0])[2]] * 2) legendre[l2].compose((lagrange[faceIdx[s][0][2]] * 2)
- -
Polynomial(1, 0, 0, 0)) Polynomial(1, 0, 0, 0))
* *
lagrange[(*(*faceV[s])[0])[2]]); lagrange[faceIdx[s][0][2]]);
i++; i++;
} }
} }
...@@ -119,8 +119,8 @@ TriNodeBasis::~TriNodeBasis(void){ ...@@ -119,8 +119,8 @@ TriNodeBasis::~TriNodeBasis(void){
delete refSpace; delete refSpace;
// Basis // // Basis //
for(unsigned int i = 0; i < nRefSpace; i++){ for(size_t i = 0; i < nRefSpace; i++){
for(unsigned int j = 0; j < nFunction; j++) for(size_t j = 0; j < nFunction; j++)
delete basis[i][j]; delete basis[i][j];
delete[] basis[i]; delete[] basis[i];
......
...@@ -20,7 +20,7 @@ class TriNodeBasis: public BasisHierarchical0From{ ...@@ -20,7 +20,7 @@ class TriNodeBasis: public BasisHierarchical0From{
//! @param order The order of the Basis //! @param order The order of the Basis
//! //!
//! Returns a new Node-Basis for Triangles of the given order //! Returns a new Node-Basis for Triangles of the given order
TriNodeBasis(unsigned int order); TriNodeBasis(size_t order);
//! Deletes this Basis //! Deletes this Basis
//! //!
......
...@@ -9,54 +9,33 @@ TriReferenceSpace::TriReferenceSpace(void){ ...@@ -9,54 +9,33 @@ TriReferenceSpace::TriReferenceSpace(void){
nVertex = 3; nVertex = 3;
// Edge Definition // // Edge Definition //
nEdge = 3; const size_t nEdge = 3;
refEdge = new size_t*[nEdge]; refEdgeNodeIdx.resize(nEdge);
for(size_t i = 0; i < nEdge; i++){ for(size_t i = 0; i < nEdge; i++){
refEdge[i] = new size_t[2]; refEdgeNodeIdx[i].resize(2); // Two Nodes per Edge
refEdge[i][0] = MTriangle::edges_tri(i, 0); refEdgeNodeIdx[i][0] = MTriangle::edges_tri(i, 0);
refEdge[i][1] = MTriangle::edges_tri(i, 1); refEdgeNodeIdx[i][1] = MTriangle::edges_tri(i, 1);
} }
// Face Definition // // Face Definition //
// Number of face refFaceNodeIdx.resize(1); // One Face per Triangle
nFace = 1; refFaceNodeIdx[0].resize(3); // Three Nodes per Face
// Number of node per face refFaceNodeIdx[0][0] = 0;
nNodeInFace = new size_t[nFace]; refFaceNodeIdx[0][1] = 1;
nNodeInFace[0] = 3; refFaceNodeIdx[0][2] = 2;
// Reference Face
refFace = new size_t*[nFace];
refFace[0] = new size_t[3];
refFace[0][0] = 0;
refFace[0][1] = 1;
refFace[0][2] = 2;
// Init All // // Init All //
init(); init();
} }
TriReferenceSpace::~TriReferenceSpace(void){ TriReferenceSpace::~TriReferenceSpace(void){
// Delete Ref Edge //
for(size_t i = 0; i < nEdge; i++)
delete[] refEdge[i];
delete[] refEdge;
// Delete Ref Face //
for(size_t i = 0; i < nFace; i++)
delete[] refFace[i];
delete[] refFace;
delete[] nNodeInFace;
} }
string TriReferenceSpace::toLatex(void) const{ string TriReferenceSpace::toLatex(void) const{
const size_t nPerm = pTree->getNPermutation(); const size_t nRefSpace = refSpaceNodeId.size();
stringstream stream; stringstream stream;
vector<size_t> perm(nVertex);
stream << "\\documentclass{article}" << endl << endl stream << "\\documentclass{article}" << endl << endl
...@@ -70,24 +49,25 @@ string TriReferenceSpace::toLatex(void) const{ ...@@ -70,24 +49,25 @@ string TriReferenceSpace::toLatex(void) const{
<< "\\begin{longtable}{ccc}" << endl << endl; << "\\begin{longtable}{ccc}" << endl << endl;
for(size_t p = 0; p < nPerm; p++){ for(size_t s = 0; s < nRefSpace; s++){
pTree->fillWithPermutation(p, perm);
stream << "\\begin{tikzpicture}" << endl stream << "\\begin{tikzpicture}" << endl
<< "\\node[vertex] (n0) at(0, 0) {$" << perm[0] << "$};" << endl << "\\node[vertex] (n0) at(0, 0) {$" << refSpaceNodeId[s][0] << "$};"
<< "\\node[vertex] (n1) at(3, 0) {$" << perm[1] << "$};" << endl << endl
<< "\\node[vertex] (n2) at(0, 3) {$" << perm[2] << "$};" << endl << "\\node[vertex] (n1) at(3, 0) {$" << refSpaceNodeId[s][1] << "$};"
<< endl
<< "\\node[vertex] (n2) at(0, 3) {$" << refSpaceNodeId[s][2] << "$};"
<< endl
<< endl; << endl;
for(size_t i = 0; i < 3; i++) for(size_t e = 0; e < 3; e++)
stream << "\\path[line]" stream << "\\path[line]"
<< " (n" << (*(*(*edge)[p])[i])[0] << ")" << " (n" << orderedEdgeNodeIdx[s][e][0] << ")"
<< " -- " << " -- "
<< " (n" << (*(*(*edge)[p])[i])[1] << ");" << " (n" << orderedEdgeNodeIdx[s][e][1] << ");"
<< endl; << endl;
if((p + 1) % 3) if((s + 1) % 3)
stream << "\\end{tikzpicture} & " << endl << endl; stream << "\\end{tikzpicture} & " << endl << endl;
else else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment