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
Branches
Tags
No related merge requests found
Showing
with 409 additions and 362 deletions
...@@ -81,6 +81,10 @@ class Basis{ ...@@ -81,6 +81,10 @@ class Basis{
virtual unsigned int getNOrientation(void) const = 0; virtual unsigned int getNOrientation(void) const = 0;
virtual unsigned int getOrientation(const MElement& element) const = 0; virtual unsigned int getOrientation(const MElement& element) const = 0;
virtual void mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const = 0;
// Functions Ordering // // Functions Ordering //
virtual std::vector<size_t> virtual std::vector<size_t>
getFunctionOrdering(const MElement& element) const = 0; getFunctionOrdering(const MElement& element) const = 0;
......
...@@ -59,6 +59,12 @@ getOrientation(const MElement& element) const{ ...@@ -59,6 +59,12 @@ getOrientation(const MElement& element) const{
return refSpace->getReferenceSpace(element); return refSpace->getReferenceSpace(element);
} }
void BasisHierarchical0From::mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const{
return refSpace->mapFromXYZtoABC(element, xyz, abc);
}
vector<size_t> BasisHierarchical0From:: vector<size_t> BasisHierarchical0From::
getFunctionOrdering(const MElement& element) const{ getFunctionOrdering(const MElement& element) const{
vector<size_t> ordering(nFunction); vector<size_t> ordering(nFunction);
...@@ -66,6 +72,33 @@ getFunctionOrdering(const MElement& element) const{ ...@@ -66,6 +72,33 @@ getFunctionOrdering(const MElement& element) const{
for(size_t i = 0; i < nFunction; i++) for(size_t i = 0; i < nFunction; i++)
ordering[i] = i; ordering[i] = i;
/*
if(element.getNum() == 5){
ordering[0] = 0;
ordering[1] = 1;
ordering[2] = 2;
ordering[3] = 3;
ordering[4] = 4;
ordering[5] = 5;
ordering[6] = 6;
ordering[7] = 7;
ordering[8] = 8;
ordering[9] = 9;
}
else{
ordering[0] = 2;
ordering[1] = 0;
ordering[2] = 1;
ordering[3] = 7;
ordering[4] = 8;
ordering[5] = 3;
ordering[6] = 4;
ordering[7] = 5;
ordering[8] = 6;
ordering[9] = 9;
}
*/
return ordering; return ordering;
} }
......
...@@ -39,6 +39,10 @@ class BasisHierarchical0From: public BasisLocal{ ...@@ -39,6 +39,10 @@ class BasisHierarchical0From: public BasisLocal{
virtual unsigned int getNOrientation(void) const; virtual unsigned int getNOrientation(void) const;
virtual unsigned int getOrientation(const MElement& element) const; virtual unsigned int getOrientation(const MElement& element) const;
virtual void mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const;
virtual std::vector<size_t> virtual std::vector<size_t>
getFunctionOrdering(const MElement& element) const; getFunctionOrdering(const MElement& element) const;
......
...@@ -59,6 +59,12 @@ getOrientation(const MElement& element) const{ ...@@ -59,6 +59,12 @@ getOrientation(const MElement& element) const{
return refSpace->getReferenceSpace(element); return refSpace->getReferenceSpace(element);
} }
void BasisHierarchical1From::mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const{
return refSpace->mapFromXYZtoABC(element, xyz, abc);
}
vector<size_t> BasisHierarchical1From:: vector<size_t> BasisHierarchical1From::
getFunctionOrdering(const MElement& element) const{ getFunctionOrdering(const MElement& element) const{
vector<size_t> ordering(nFunction); vector<size_t> ordering(nFunction);
......
...@@ -39,6 +39,10 @@ class BasisHierarchical1From: public BasisLocal{ ...@@ -39,6 +39,10 @@ class BasisHierarchical1From: public BasisLocal{
virtual unsigned int getNOrientation(void) const; virtual unsigned int getNOrientation(void) const;
virtual unsigned int getOrientation(const MElement& element) const; virtual unsigned int getOrientation(const MElement& element) const;
virtual void mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const;
virtual std::vector<size_t> virtual std::vector<size_t>
getFunctionOrdering(const MElement& element) const; getFunctionOrdering(const MElement& element) const;
......
...@@ -78,6 +78,11 @@ static size_t matchClosure(vector<int>& reduced, ...@@ -78,6 +78,11 @@ static size_t matchClosure(vector<int>& reduced,
return i; return i;
} }
void BasisLagrange::mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const{
}
vector<size_t> BasisLagrange:: vector<size_t> BasisLagrange::
getFunctionOrdering(const MElement& element) const{ getFunctionOrdering(const MElement& element) const{
/* /*
......
...@@ -43,6 +43,10 @@ class BasisLagrange: public BasisLocal{ ...@@ -43,6 +43,10 @@ class BasisLagrange: public BasisLocal{
virtual unsigned int getNOrientation(void) const; virtual unsigned int getNOrientation(void) const;
virtual unsigned int getOrientation(const MElement& element) const; virtual unsigned int getOrientation(const MElement& element) const;
virtual void mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]) const;
virtual std::vector<size_t> virtual std::vector<size_t>
getFunctionOrdering(const MElement& element) const; getFunctionOrdering(const MElement& element) const;
......
...@@ -14,7 +14,7 @@ double FunctionSpaceScalar:: ...@@ -14,7 +14,7 @@ double FunctionSpaceScalar::
interpolate(const MElement& element, interpolate(const MElement& element,
const std::vector<double>& coef, const std::vector<double>& coef,
const fullVector<double>& xyz) const{ const fullVector<double>& xyz) const{
/*
// Const Cast For MElement // // Const Cast For MElement //
MElement& eelement = MElement& eelement =
const_cast<MElement&>(element); const_cast<MElement&>(element);
...@@ -34,11 +34,11 @@ interpolate(const MElement& element, ...@@ -34,11 +34,11 @@ interpolate(const MElement& element,
element.getNode(0, abcPnt[0][0], abcPnt[0][1], abcPnt[0][2]); element.getNode(0, abcPnt[0][0], abcPnt[0][1], abcPnt[0][2]);
element.getNode(1, abcPnt[1][0], abcPnt[1][1], abcPnt[1][2]); element.getNode(1, abcPnt[1][0], abcPnt[1][1], abcPnt[1][2]);
element.getNode(2, abcPnt[2][0], abcPnt[2][1], abcPnt[2][2]); element.getNode(2, abcPnt[2][0], abcPnt[2][1], abcPnt[2][2]);
/*
std::cout << order[0] << " | " std::cout << order[0] << " | "
<< order[1] << " | " << order[1] << " | "
<< order[2] << std::endl; << order[2] << std::endl;
*/
abcMat[0][0] = abcPnt[0][0]; abcMat[0][0] = abcPnt[0][0];
abcMat[0][1] = abcPnt[1][0]; abcMat[0][1] = abcPnt[1][0];
abcMat[0][2] = abcPnt[2][0]; abcMat[0][2] = abcPnt[2][0];
...@@ -50,14 +50,14 @@ interpolate(const MElement& element, ...@@ -50,14 +50,14 @@ interpolate(const MElement& element,
abcMat[2][0] = abcPnt[0][2]; abcMat[2][0] = abcPnt[0][2];
abcMat[2][1] = abcPnt[1][2]; abcMat[2][1] = abcPnt[1][2];
abcMat[2][2] = abcPnt[2][2]; abcMat[2][2] = abcPnt[2][2];
/*
for(size_t i = 0; i < 3; i++){ for(size_t i = 0; i < 3; i++){
for(size_t j = 0; j < 3; j++) for(size_t j = 0; j < 3; j++)
std::cout << abcMat[i][j] << "\t"; std::cout << abcMat[i][j] << "\t";
std::cout << std::endl; std::cout << std::endl;
} }
std::cout << std::endl; std::cout << std::endl;
*/
double phiUVW[3]; double phiUVW[3];
element.getShapeFunctions(uvw[0], uvw[1], uvw[2], phiUVW); element.getShapeFunctions(uvw[0], uvw[1], uvw[2], phiUVW);
...@@ -90,12 +90,17 @@ interpolate(const MElement& element, ...@@ -90,12 +90,17 @@ interpolate(const MElement& element,
uvw[0] = abc[0]; uvw[0] = abc[0];
uvw[1] = abc[1]; uvw[1] = abc[1];
uvw[2] = abc[2]; uvw[2] = abc[2];
*/
// Get ABC Space coordinate //
double abc[3];
(*basis)[0]->mapFromXYZtoABC(element, xyz, abc);
// Get Basis Functions // // Get Basis Functions //
const unsigned int nFun = (*basis)[0]->getNFunction(); const unsigned int nFun = (*basis)[0]->getNFunction();
fullMatrix<double> fun(nFun, 1); fullMatrix<double> fun(nFun, 1);
(*basis)[0]->getFunctions(fun, element, uvw[0], uvw[1], uvw[2]); (*basis)[0]->getFunctions(fun, element, abc[0], abc[1], abc[2]);
// Interpolate (in Reference Place) // // Interpolate (in Reference Place) //
double val = 0; double val = 0;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
LineEdgeBasis::LineEdgeBasis(unsigned int order){ LineEdgeBasis::LineEdgeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new LineReferenceSpace; refSpace = new LineReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -71,9 +72,11 @@ LineEdgeBasis::LineEdgeBasis(unsigned int order){ ...@@ -71,9 +72,11 @@ LineEdgeBasis::LineEdgeBasis(unsigned int order){
// Free Temporary Space // // Free Temporary Space //
delete[] intLegendre; delete[] intLegendre;
*/
} }
LineEdgeBasis::~LineEdgeBasis(void){ LineEdgeBasis::~LineEdgeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -86,4 +89,5 @@ LineEdgeBasis::~LineEdgeBasis(void){ ...@@ -86,4 +89,5 @@ LineEdgeBasis::~LineEdgeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
LineNedelecBasis::LineNedelecBasis(void){ LineNedelecBasis::LineNedelecBasis(void){
/*
// Reference Space // // Reference Space //
refSpace = new LineReferenceSpace; refSpace = new LineReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -41,9 +42,11 @@ LineNedelecBasis::LineNedelecBasis(void){ ...@@ -41,9 +42,11 @@ LineNedelecBasis::LineNedelecBasis(void){
// Nedelec // // Nedelec //
basis[0][0] = new vector<Polynomial>(first); basis[0][0] = new vector<Polynomial>(first);
basis[1][0] = new vector<Polynomial>(second); basis[1][0] = new vector<Polynomial>(second);
*/
} }
LineNedelecBasis::~LineNedelecBasis(void){ LineNedelecBasis::~LineNedelecBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -56,4 +59,5 @@ LineNedelecBasis::~LineNedelecBasis(void){ ...@@ -56,4 +59,5 @@ LineNedelecBasis::~LineNedelecBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
LineNodeBasis::LineNodeBasis(unsigned int order){ LineNodeBasis::LineNodeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new LineReferenceSpace; refSpace = new LineReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -66,9 +67,11 @@ LineNodeBasis::LineNodeBasis(unsigned int order){ ...@@ -66,9 +67,11 @@ LineNodeBasis::LineNodeBasis(unsigned int order){
// Free Temporary Sapce // // Free Temporary Sapce //
delete[] intLegendre; delete[] intLegendre;
*/
} }
LineNodeBasis::~LineNodeBasis(void){ LineNodeBasis::~LineNodeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -81,4 +84,5 @@ LineNodeBasis::~LineNodeBasis(void){ ...@@ -81,4 +84,5 @@ LineNodeBasis::~LineNodeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
using namespace std; using namespace std;
LineReferenceSpace::LineReferenceSpace(void){ LineReferenceSpace::LineReferenceSpace(void){
/*
// Vertex Definition // // Vertex Definition //
nVertex = 2; nVertex = 2;
...@@ -21,20 +22,23 @@ LineReferenceSpace::LineReferenceSpace(void){ ...@@ -21,20 +22,23 @@ LineReferenceSpace::LineReferenceSpace(void){
// Init All // // Init All //
init(); init();
*/
} }
LineReferenceSpace::~LineReferenceSpace(void){ LineReferenceSpace::~LineReferenceSpace(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];
delete[] refEdge; delete[] refEdge;
*/
} }
string LineReferenceSpace::toLatex(void) const{ string LineReferenceSpace::toLatex(void) const{
const size_t nPerm = pTree->getNPermutation(); //const size_t nPerm = pTree->getNPermutation();
stringstream stream; stringstream stream;
/*
stream << "\\documentclass{article}" << endl << endl stream << "\\documentclass{article}" << endl << endl
<< "\\usepackage{longtable}" << endl << "\\usepackage{longtable}" << endl
...@@ -64,6 +68,6 @@ string LineReferenceSpace::toLatex(void) const{ ...@@ -64,6 +68,6 @@ string LineReferenceSpace::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;
QuadEdgeBasis::QuadEdgeBasis(unsigned int order){ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new QuadReferenceSpace; refSpace = new QuadReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -238,9 +239,11 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){ ...@@ -238,9 +239,11 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
// Free Temporary Sapce // // Free Temporary Sapce //
delete[] legendre; delete[] legendre;
delete[] intLegendre; delete[] intLegendre;
*/
} }
QuadEdgeBasis::~QuadEdgeBasis(void){ QuadEdgeBasis::~QuadEdgeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -253,4 +256,5 @@ QuadEdgeBasis::~QuadEdgeBasis(void){ ...@@ -253,4 +256,5 @@ QuadEdgeBasis::~QuadEdgeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
QuadNedelecBasis::QuadNedelecBasis(void){ QuadNedelecBasis::QuadNedelecBasis(void){
/*
// Reference Space // // Reference Space //
refSpace = new QuadReferenceSpace; refSpace = new QuadReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -105,9 +106,11 @@ QuadNedelecBasis::QuadNedelecBasis(void){ ...@@ -105,9 +106,11 @@ QuadNedelecBasis::QuadNedelecBasis(void){
delete old; delete old;
} }
} }
*/
} }
QuadNedelecBasis::~QuadNedelecBasis(void){ QuadNedelecBasis::~QuadNedelecBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -120,4 +123,5 @@ QuadNedelecBasis::~QuadNedelecBasis(void){ ...@@ -120,4 +123,5 @@ QuadNedelecBasis::~QuadNedelecBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
QuadNodeBasis::QuadNodeBasis(unsigned int order){ QuadNodeBasis::QuadNodeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new QuadReferenceSpace; refSpace = new QuadReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -142,9 +143,11 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){ ...@@ -142,9 +143,11 @@ QuadNodeBasis::QuadNodeBasis(unsigned int order){
// Free Temporary Sapce // // Free Temporary Sapce //
delete[] legendre; delete[] legendre;
*/
} }
QuadNodeBasis::~QuadNodeBasis(void){ QuadNodeBasis::~QuadNodeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -157,4 +160,5 @@ QuadNodeBasis::~QuadNodeBasis(void){ ...@@ -157,4 +160,5 @@ QuadNodeBasis::~QuadNodeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
QuadReferenceSpace::QuadReferenceSpace(void){ QuadReferenceSpace::QuadReferenceSpace(void){
/*
// Vertex Definition // // Vertex Definition //
nVertex = 4; nVertex = 4;
...@@ -37,9 +38,11 @@ QuadReferenceSpace::QuadReferenceSpace(void){ ...@@ -37,9 +38,11 @@ QuadReferenceSpace::QuadReferenceSpace(void){
// Init All // // Init All //
init(); init();
*/
} }
QuadReferenceSpace::~QuadReferenceSpace(void){ QuadReferenceSpace::~QuadReferenceSpace(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];
...@@ -52,13 +55,14 @@ QuadReferenceSpace::~QuadReferenceSpace(void){ ...@@ -52,13 +55,14 @@ QuadReferenceSpace::~QuadReferenceSpace(void){
delete[] refFace; delete[] refFace;
delete[] nNodeInFace; delete[] nNodeInFace;
*/
} }
string QuadReferenceSpace::toLatex(void) const{ string QuadReferenceSpace::toLatex(void) const{
const size_t nPerm = pTree->getNPermutation(); //const size_t nPerm = pTree->getNPermutation();
stringstream stream; stringstream stream;
vector<size_t> perm(nVertex); //vector<size_t> perm(nVertex);
/*
stream << "\\documentclass{article}" << endl << endl stream << "\\documentclass{article}" << endl << endl
<< "\\usepackage{longtable}" << endl << "\\usepackage{longtable}" << endl
...@@ -98,6 +102,6 @@ string QuadReferenceSpace::toLatex(void) const{ ...@@ -98,6 +102,6 @@ string QuadReferenceSpace::toLatex(void) const{
stream << "\\end{longtable}" << endl stream << "\\end{longtable}" << endl
<< "\\end{document}" << endl; << "\\end{document}" << endl;
*/
return stream.str(); return stream.str();
} }
...@@ -7,55 +7,12 @@ ...@@ -7,55 +7,12 @@
using namespace std; using namespace std;
ReferenceSpace::ReferenceSpace(void){ ReferenceSpace::ReferenceSpace(void){
// Init to NULL //
nEdge = 0;
refEdge = NULL;
//permutedRefEdge = NULL;
edge = NULL;
nFace = 0;
nNodeInFace = NULL;
refFace = NULL;
//permutedRefFace = NULL;
face = NULL;
// Defining Ref Edge and Face in // // Defining Ref Edge and Face in //
// Derived Class // // Derived Class //
} }
ReferenceSpace::~ReferenceSpace(void){ ReferenceSpace::~ReferenceSpace(void){
const size_t nPerm = pTree->getNPermutation();
// Destroy Tree //
delete pTree; delete pTree;
// Delete Permutated Edge //
for(size_t p = 0; p < nPerm; p++){
for(size_t i = 0; i < nEdge; i++){
//delete[] permutedRefEdge[p][i];
delete (*(*edge)[p])[i];
}
//delete[] permutedRefEdge[p];
delete (*edge)[p];
}
//delete[] permutedRefEdge;
delete edge;
// Delete Permutated Face //
for(size_t p = 0; p < nPerm; p++){
for(size_t i = 0; i < nFace; i++){
//delete[] permutedRefFace[p][i];
delete (*(*face)[p])[i];
}
//delete[] permutedRefFace[p];
delete (*face)[p];
}
//delete[] permutedRefFace;
delete face;
} }
void ReferenceSpace::init(void){ void ReferenceSpace::init(void){
...@@ -67,22 +24,51 @@ void ReferenceSpace::init(void){ ...@@ -67,22 +24,51 @@ void ReferenceSpace::init(void){
pTree = new PermutationTree(vertexSeq); pTree = new PermutationTree(vertexSeq);
// Edges & Faces //
getEdge();
getFace();
// Cyclic Permutation // // Cyclic Permutation //
findCyclicPermutation(); list<size_t> listOfTrueReferenceSpace;
list<vector<size_t> > listOfRefNodeIndexPermutation;
list<vector<size_t> > listOfReverseNodeIndexPermutation;
findCyclicPermutation(listOfTrueReferenceSpace,
listOfRefNodeIndexPermutation,
listOfReverseNodeIndexPermutation);
// Iterators //
list<size_t>::iterator refSpaceIt = listOfTrueReferenceSpace.begin();
// Reference Spaces Node Id //
const size_t nRefSpace = listOfTrueReferenceSpace.size();
refSpaceNodeId.resize(nRefSpace);
for(size_t i = 0; i < nRefSpace; i++, refSpaceIt++){
refSpaceNodeId[i].resize(nVertex);
pTree->fillWithPermutation(*refSpaceIt, refSpaceNodeId[i]);
}
// ABC space to UVW space shape function index mapping //
const size_t nPermutation = pTree->getNPermutation();
ABCtoUVWIndex.resize(nPermutation);
ABCtoUVWIndex.assign(listOfReverseNodeIndexPermutation.begin(),
listOfReverseNodeIndexPermutation.end());
// UVW space to ABC space shape function index mapping //
UVWtoABCIndex.resize(nPermutation);
UVWtoABCIndex.assign(listOfRefNodeIndexPermutation.begin(),
listOfRefNodeIndexPermutation.end());
// Ordered Edges & Faces Node Index//
getOrderedEdge();
getOrderedFace();
} }
void ReferenceSpace::findCyclicPermutation(void){ void ReferenceSpace::
findCyclicPermutation(list<size_t>& listOfTrueReferenceSpace,
list<vector<size_t> >& listOfRefNodeIndexPermutation,
list<vector<size_t> >& listOfReverseNodeIndexPermutation){
// Alloc Some Data // // Alloc Some Data //
const size_t nPerm = pTree->getNPermutation(); const size_t nPerm = pTree->getNPermutation();
list<size_t> listOfTrueReferenceSpace;
list<vector<size_t> > listOfRefNodeIndexPermutation;
list<vector<size_t> > listOfReverseNodeIndexPermutation;
vector<size_t> pTest(nVertex); vector<size_t> pTest(nVertex);
vector<size_t> pRef(nVertex); vector<size_t> pRef(nVertex);
...@@ -90,12 +76,13 @@ void ReferenceSpace::findCyclicPermutation(void){ ...@@ -90,12 +76,13 @@ void ReferenceSpace::findCyclicPermutation(void){
list<size_t>::iterator end; list<size_t>::iterator end;
triple match; triple match;
// Values For unPermutedIndex //
vector<size_t> unPermutedIndex(nVertex); vector<size_t> unPermutedIndex(nVertex);
for(size_t i = 0; i < nVertex; i++) for(size_t i = 0; i < nVertex; i++)
unPermutedIndex[i] = i; unPermutedIndex[i] = i;
// Find Cyclic Permutation // Find Cyclic Permutation //
for(size_t i = 0; i < nPerm; i++){ for(size_t i = 0; i < nPerm; i++){
// No match // No match
match.first = false; match.first = false;
...@@ -193,19 +180,22 @@ static bool haveSameNode(vector<size_t>& face0, ...@@ -193,19 +180,22 @@ static bool haveSameNode(vector<size_t>& face0,
size_t ReferenceSpace::findCorrespondingFace(vector<size_t>& face, size_t ReferenceSpace::findCorrespondingFace(vector<size_t>& face,
vector<size_t>& node){ vector<size_t>& node){
// Init Stuff // // Init Stuff //
const size_t nFace = refFaceNodeIdx.size();
const size_t faceSize = face.size(); const size_t faceSize = face.size();
bool match = false; bool match = false;
size_t f = 0; size_t f = 0;
vector<size_t> testFace(faceSize); vector<size_t> testFace(faceSize);
size_t nNodeInFace;
// Test All Face until match // Test All Face until match
while(!match && f < nFace){ while(!match && f < nFace){
nNodeInFace = refFaceNodeIdx[f].size();
if(nNodeInFace[f] == faceSize){ if(nNodeInFace == faceSize){
// Get face f nodes // Get face f nodes
for(size_t i = 0; i < faceSize; i++) for(size_t i = 0; i < faceSize; i++)
testFace[i] = node[refFace[f][i]]; testFace[i] = node[refFaceNodeIdx[f][i]];
// Look if match // Look if match
match = haveSameNode(testFace, face); match = haveSameNode(testFace, face);
...@@ -259,19 +249,21 @@ isCyclicPermutation(vector<size_t>& pTest, ...@@ -259,19 +249,21 @@ isCyclicPermutation(vector<size_t>& pTest,
vector<size_t>& pRef){ vector<size_t>& pRef){
// Node IDs of Reference Space first Face // Node IDs of Reference Space first Face
vector<size_t> refNode(nNodeInFace[0]); const size_t nNodeInFaceZero = refFaceNodeIdx[0].size();
vector<size_t> refNode(nNodeInFaceZero);
for(size_t i = 0; i < nNodeInFace[0]; i++) for(size_t i = 0; i < nNodeInFaceZero; i++)
refNode[i] = pRef[refFace[0][i]]; refNode[i] = pRef[refFaceNodeIdx[0][i]];
// Corresponding Face in Test Permutation // Corresponding Face in Test Permutation
size_t testFaceId = findCorrespondingFace(refNode, pTest); size_t testFaceId = findCorrespondingFace(refNode, pTest);
// Node IDs of Test Permutation correspnding Face // Node IDs of Test Permutation correspnding Face
vector<size_t> testNode(nNodeInFace[testFaceId]); const size_t nNodeInFaceTest = refFaceNodeIdx[testFaceId].size();
vector<size_t> testNode(nNodeInFaceTest);
for(size_t i = 0; i < nNodeInFace[testFaceId]; i++) for(size_t i = 0; i < nNodeInFaceTest; i++)
testNode[i] = pTest[refFace[testFaceId][i]]; testNode[i] = pTest[refFaceNodeIdx[testFaceId][i]];
// Return Triple // // Return Triple //
triple tri = { triple tri = {
...@@ -283,229 +275,125 @@ isCyclicPermutation(vector<size_t>& pTest, ...@@ -283,229 +275,125 @@ isCyclicPermutation(vector<size_t>& pTest,
return tri; return tri;
} }
void ReferenceSpace::getEdge(void){ void ReferenceSpace::getOrderedEdge(void){
const size_t nPerm = pTree->getNPermutation(); // Fill orderedEdgeNodeIdx[s][e] //
// (for all reference space 's' and edge 'e') such that: //
// //
// refSpaceNodeId[s][orderedEdgeNodeIdx[s][e][0]] < //
// refSpaceNodeId[s][orderedEdgeNodeIdx[s][e][1]] //
// Alloc // Alloc
vector<const vector<unsigned int>*>* tmp; const size_t nEdge = refEdgeNodeIdx.size();
edge = new vector<const vector<const vector<unsigned int>*>*>(nPerm); const size_t nRefSpace = refSpaceNodeId.size();
/*
// All Edges have two nodes orderedEdgeNodeIdx.resize(nRefSpace);
unsigned int* nNodeInEdge = new unsigned int[nEdge];
for(unsigned int e = 0; e < nEdge; e++)
nNodeInEdge[e] = 2;
// Get Edge nodes depending on the orientation
// (edge 1 = [1 2] for orientation 1)
// ( = [4 1] for orientation 2)
getPermutedRefEntity(&permutedRefEdge,
refEdge,
nNodeInEdge,
nEdge);
delete[] nNodeInEdge;
*/
// Populate Edge // Populate Edge
for(size_t p = 0; p < nPerm; p++){ for(size_t s = 0; s < nRefSpace; s++){
tmp = new vector<const vector<unsigned int>*>(nEdge); orderedEdgeNodeIdx[s].resize(nEdge);
for(size_t e = 0; e < nEdge; e++) for(size_t e = 0; e < nEdge; e++){
(*tmp)[e] = getOrderedEdge(p, e); orderedEdgeNodeIdx[s][e].resize(2);
(*edge)[p] = tmp; orderRefEntityForGivenRefSpace(refEdgeNodeIdx[e],
refSpaceNodeId[s],
orderedEdgeNodeIdx[s][e]);
}
} }
} }
void ReferenceSpace::getFace(void){ void ReferenceSpace::getOrderedFace(void){
const size_t nPerm = pTree->getNPermutation(); // Fill orderedEdgeNodeIdx[s][f] //
// (for all reference space 's' and face 'f') such that: //
// //
// refSpaceNodeId[s][orderedFaceNodeIdx[s][f][0]] < //
// refSpaceNodeId[s][orderedFaceNodeIdx[s][f][1]] < //
// refSpaceNodeId[s][orderedFaceNodeIdx[s][f][2]] < //
// (refSpaceNodeId[s][orderedFaceNodeIdx[s][f][3]]) (Quad Face) //
// //
// If we have a Quad face, a correction is needed such that: //
// //
// orderedFaceNodeIdx[s][f][2] //
// is *opposite* to //
// orderedFaceNodeIdx[s][f][0] //
// Alloc // Alloc
vector<const vector<unsigned int>*>* tmp; const size_t nFace = refFaceNodeIdx.size();
face = new vector<const vector<const vector<unsigned int>*>*>(nPerm); const size_t nRefSpace = refSpaceNodeId.size();
/*
// Get Face nodes depending on the orientation
// (face 1 = [1 2 3 4] for orientation 1)
// ( = [4 1 2 3] for orientation 2)
getPermutedRefEntity(&permutedRefFace,
refFace,
nNodeInFace,
nFace);
*/
// Populate Face
for(size_t p = 0; p < nPerm; p++){
tmp = new vector<const vector<unsigned int>*>(nFace);
for(size_t f = 0; f < nFace; f++){ orderedFaceNodeIdx.resize(nRefSpace);
// Dending on the number of node per face
// The ordering strategy is different
switch(nNodeInFace[f]){ // Populate Face
case 3: (*tmp)[f] = getOrderedTriFace(p, f); break; for(size_t s = 0; s < nRefSpace; s++){
case 4: (*tmp)[f] = getOrderedQuadFace(p, f); break; orderedFaceNodeIdx[s].resize(nFace);
default: for(size_t f = 0; f < nFace; f++){
throw Exception("I can handle face with %d nodes", size_t nNodeInFace = refFaceNodeIdx[f].size();
nNodeInFace[f]);
}
}
(*face)[p] = tmp; orderedFaceNodeIdx[s][f].resize(nNodeInFace);
}
}
/*
void ReferenceSpace::getPermutedRefEntity(unsigned int**** permutedRefEntity,
unsigned int** refEntity,
unsigned int* nNodeInEntity,
unsigned int nEntity){
// Alloc PermutedRefEntity
(*permutedRefEntity) = new unsigned int**[nPerm];
for(unsigned int p = 0; p < nPerm; p++){
(*permutedRefEntity)[p] = new unsigned int*[nEntity];
for(unsigned int e = 0; e < nEntity; e++)
(*permutedRefEntity)[p][e] = new unsigned int[nNodeInEntity[e]];
}
// Generate Permuted Ref Entity orderRefEntityForGivenRefSpace(refFaceNodeIdx[f],
for(unsigned int p = 0; p < nPerm; p++){ refSpaceNodeId[s],
for(unsigned int e = 0; e < nEntity; e++){ orderedFaceNodeIdx[s][f]);
for(unsigned int n = 0; n < nNodeInEntity[e]; n++) if(nNodeInFace == 4)
(*permutedRefEntity)[p][e][n] = perm[p][refEntity[e][n]]; correctQuadFaceNodeIdx(orderedFaceNodeIdx[s][f]);
} }
} }
} }
*/
const vector<unsigned int>* ReferenceSpace::
getOrderedEdge(unsigned int permutation,
unsigned int edge){
/**************************************************************************
* I want to know how I need to take the values of refEdge[edge] *
* (i.e the node *index* of a given edge) so that the corresponding *
* values in permutation (i.e perm[permutation][refEdge[edge]]) are going *
* from the smallest value to the biggest. *
**************************************************************************/
// Alloc
vector<unsigned int>* ordered = new vector<unsigned int>(2);
// Permutation
vector<size_t> perm(nVertex);
pTree->fillWithPermutation(permutation, perm);
// Order refEdge
orderRefEntityForGivenPermutation(refEdge[edge],
perm,
*ordered);
// Return ordered
return ordered;
}
const std::vector<unsigned int>* ReferenceSpace:: void ReferenceSpace::
getOrderedTriFace(unsigned int permutation, orderRefEntityForGivenRefSpace(vector<size_t>& refEntityNodeIdx,
unsigned int face){ vector<size_t>& refSpaceNodeId,
vector<size_t>& orderedEntityNodeIdx){
/*********************************************** // Get Size
* Same as getOrderedEdge, but I with refFace. * const size_t size = orderedEntityNodeIdx.size();
***********************************************/
// Alloc // Ref Entity Node *ID*
vector<unsigned int>* ordered = new vector<unsigned int>(3); vector<pair<size_t, size_t> > refEntityNodeId(size);
// Permutation for(size_t i = 0; i < size; i++){
vector<size_t> perm(nVertex); refEntityNodeId[i].first = i; // Node Id INDEX
pTree->fillWithPermutation(permutation, perm); refEntityNodeId[i].second = refSpaceNodeId[refEntityNodeIdx[i]]; // Node Id
}
// Order refFace // Sort it with repsect to second entry (Node ID)
orderRefEntityForGivenPermutation(refFace[face], std::sort(refEntityNodeId.begin(), refEntityNodeId.end(), sortPredicate);
perm,
*ordered);
// Return ordered // Populate orderedEntityNodeIdx (Usign sorted Node ID old Index)
return ordered; for(size_t i = 0; i < size; i++)
orderedEntityNodeIdx[i] = refEntityNodeIdx[refEntityNodeId[i].first];
} }
const std::vector<unsigned int>* ReferenceSpace:: void ReferenceSpace::
getOrderedQuadFace(unsigned int permutation, correctQuadFaceNodeIdx(vector<size_t>& correctedQuadFaceNodeIdx){
unsigned int face){
/*********************************************************************
* Same as getOrderedFace, but refFace has 4 nodes. *
* *
* In that case, *
* I need node at ordered[2] to be *opposite* to node at ordered[0]. *
* --> If not make a permutation such *
* that node opposite at ordered[2] *
* is at ordered[0] *
*********************************************************************/
// Alloc
vector<unsigned int>* ordered = new vector<unsigned int>(4);
// Permutation
vector<size_t> perm(nVertex);
pTree->fillWithPermutation(permutation, perm);
// Order refFace // Get : //
orderRefEntityForGivenPermutation(refFace[face], // correctedQuadFaceNodeIdx[2] //
perm, // is *opposite* to //
*ordered); // correctedQuadFaceNodeIdx[0] //
// Get ordered[2] opposite to ordered[0] size_t opposite = (correctedQuadFaceNodeIdx[0] + 2) % 4;
unsigned int opposite = ((*ordered)[0] + 2) % 4;
if((*ordered)[2] != opposite){ if(correctedQuadFaceNodeIdx[2] != opposite){
// Find opposite node index // Find opposite node index
unsigned int tmp; size_t tmp;
unsigned int idx = 1; size_t idx = 1;
while((*ordered)[idx] != opposite)
idx++;
// Swap ordered[2] and ordered[idx]
tmp = (*ordered)[2];
(*ordered)[2] = opposite;
(*ordered)[idx] = tmp;
}
// Return
return ordered;
}
void ReferenceSpace::
orderRefEntityForGivenPermutation(size_t* refEntity,
vector<size_t>& permutation,
vector<unsigned int>& orderedEntity){
// Get Size
const unsigned int size = orderedEntity.size();
// Copy srcSort in sorted while(correctedQuadFaceNodeIdx[idx] != opposite)
vector<pair<unsigned int, unsigned int> > sorted(size); idx++;
for(unsigned int i = 0; i < size; i++){ // Swap correctedQuadFaceNodeIdx[2] and correctedQuadFaceNodeIdx[idx]
sorted[i].first = i; tmp = correctedQuadFaceNodeIdx[2];
sorted[i].second = permutation[refEntity[i]]; correctedQuadFaceNodeIdx[2] = opposite;
correctedQuadFaceNodeIdx[idx] = tmp;
} }
// Sort it with repsect to second entry
std::sort(sorted.begin(), sorted.end(), sortPredicate);
// Swap with respect to srcSwap
for(unsigned int i = 0; i < size; i++)
orderedEntity[i] = refEntity[sorted[i].first];
} }
size_t ReferenceSpace::getReferenceSpace(const MElement& elem) const{ size_t ReferenceSpace::getPermutationIdx(const MElement& element) const{
// Const_Cast //
MElement& element = const_cast<MElement&>(elem);
// Get Primary Vertices Global ID // // Get Primary Vertices Global ID //
const int nVertex = element.getNumPrimaryVertices(); vector<pair<size_t, size_t> > vertexGlobalId(nVertex);
vector<pair<unsigned int, unsigned int> > vertexGlobalId(nVertex);
for(int i = 0; i < nVertex; i++){ for(size_t i = 0; i < nVertex; i++){
vertexGlobalId[i].first = i; vertexGlobalId[i].first = i;
vertexGlobalId[i].second = element.getVertex(i)->getNum(); vertexGlobalId[i].second = element.getVertex(i)->getNum();
} }
...@@ -517,7 +405,7 @@ size_t ReferenceSpace::getReferenceSpace(const MElement& elem) const{ ...@@ -517,7 +405,7 @@ size_t ReferenceSpace::getReferenceSpace(const MElement& elem) const{
// Reduce Vertex Global ID // // Reduce Vertex Global ID //
vector<size_t> vertexReducedId(nVertex); vector<size_t> vertexReducedId(nVertex);
for(int i = 0; i < nVertex; i++) for(size_t i = 0; i < nVertex; i++)
vertexReducedId[vertexGlobalId[i].first] = i; vertexReducedId[vertexGlobalId[i].first] = i;
// Tree Lookup // // Tree Lookup //
...@@ -531,37 +419,114 @@ size_t ReferenceSpace::getReferenceSpace(const MElement& elem) const{ ...@@ -531,37 +419,114 @@ size_t ReferenceSpace::getReferenceSpace(const MElement& elem) const{
} }
} }
void ReferenceSpace::mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]){
// Get UVW coordinate //
double phys[3] = {xyz(0), xyz(1), xyz(2)};
double uvw[3];
element.xyz2uvw(phys, uvw);
// Compute coordinate in ABC Space //
// ABC node coordinate
double** abcMat = new double*[nVertex];
for(size_t i = 0; i < nVertex; i++)
abcMat[i] = new double[3];
for(size_t i = 0; i < nVertex; i++)
element.getNode(i, abcMat[i][0], abcMat[i][1], abcMat[i][2]);
// UVW (order 1) shape functions
double* phiUVW = new double[nVertex];
element.getShapeFunctions(uvw[0], uvw[1], uvw[2], phiUVW, 1);
// Element Permutation Index //
const size_t permutationIdx = getPermutationIdx(element);
// Map From UVW to ABC //
abc[0] = 0;
for(size_t i = 0; i < nVertex; i++)
abc[0] += abcMat[i][0] * phiUVW[ABCtoUVWIndex[permutationIdx][i]];
abc[1] = 0;
for(size_t i = 0; i < nVertex; i++)
abc[1] += abcMat[i][1] * phiUVW[ABCtoUVWIndex[permutationIdx][i]];
abc[2] = 0;
for(size_t i = 0; i < nVertex; i++)
abc[2] += abcMat[i][2] * phiUVW[ABCtoUVWIndex[permutationIdx][i]];
// Free //
delete[] phiUVW;
for(size_t i = 0; i < nVertex; i++)
delete[] abcMat[i];
delete[] abcMat;
}
void ReferenceSpace::getJacobian(const MElement& element,
const fullVector<double>& xyz,
fullMatrix<double>& jac) const{
}
string ReferenceSpace::toString(void) const{ string ReferenceSpace::toString(void) const{
const size_t nPerm = pTree->getNPermutation(); const size_t nRefSpace = refSpaceNodeId.size();
const size_t nEdge = refEdgeNodeIdx.size();
const size_t nFace = refFaceNodeIdx.size();
stringstream stream; stringstream stream;
// ReferenceSpaces // // Permutation Tree //
stream << "Reference Spaces:" << endl stream << "Permutation Tree:" << endl
<< pTree->toString() << endl; << pTree->toString() << endl;
stream << "Edges Permutations:" << endl; // Reference Space //
stream << "Reference Space Node IDs:" << endl;
for(size_t i = 0; i < nPerm; i++){ for(size_t s = 0; s < nRefSpace; s++){
stream << " * RefSpace #" << i + 1 << ":" << endl; stream << " ** Reference Space #" << s + 1 << ": [";
for(size_t j = 0; j < nEdge; j++) for(size_t v = 0; v < nVertex - 1; v++)
stream << " -- [" stream << refSpaceNodeId[s][v] << ", ";
<< edge->at(i)->at(j)->at(0) << ", "
<< edge->at(i)->at(j)->at(1) << "]" << endl; stream << refSpaceNodeId[s][nVertex - 1] << "]" << endl;
} }
stream << "Faces Permutations:" << endl; stream << endl << "Ordered Edge Node Index:" << endl;
for(size_t i = 0; i < nPerm; i++){ for(size_t s = 0; s < nRefSpace; s++){
stream << " * RefSpace #" << i + 1 << ":" << endl; stream << " ** Reference Space #" << s + 1 << ":"
<< endl;
for(size_t j = 0; j < nFace; j++) for(size_t e = 0; e < nEdge; e++)
stream << " -- [" stream << " -- ["
<< face->at(i)->at(j)->at(0) << ", " << orderedEdgeNodeIdx[s][e][0] << ", "
<< face->at(i)->at(j)->at(1) << ", " << orderedEdgeNodeIdx[s][e][1] << "]"
<< face->at(i)->at(j)->at(2) << "]" << endl; << endl;
}
stream << endl << "Ordered Face Node Index:" << endl;
for(size_t s = 0; s < nRefSpace; s++){
stream << " ** Reference Space #" << s + 1 << ":"
<< endl;
for(size_t f = 0; f < nFace; f++){
const size_t nNodeInFace = orderedFaceNodeIdx[s][f].size();
stream << " -- [";
for(size_t n = 0; n < nNodeInFace - 1; n++)
stream << orderedFaceNodeIdx[s][f][n] << ", ";
stream << orderedFaceNodeIdx[s][f][nNodeInFace - 1] << "]"
<< endl;
}
} }
stream << endl;
return stream.str(); return stream.str();
} }
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
#include <vector> #include <vector>
#include <list> #include <list>
#include <stack>
#include <string> #include <string>
#include "MElement.h" #include "MElement.h"
#include "fullMatrix.h"
#include "PermutationTree.h" #include "PermutationTree.h"
/** /**
...@@ -28,70 +28,51 @@ class ReferenceSpace{ ...@@ -28,70 +28,51 @@ class ReferenceSpace{
} triple; } triple;
protected: protected:
// Element Definition //
size_t nVertex;
std::vector<std::vector<size_t> > refEdgeNodeIdx;
std::vector<std::vector<size_t> > refFaceNodeIdx;
// Permutation Tree // // Permutation Tree //
PermutationTree* pTree; PermutationTree* pTree;
////////////////////////////////////////////////////////////////////////// // Reference Spaces Node Ids //
// !!! CHANGE VARIABLES NAME !!! // std::vector<std::vector<size_t> > refSpaceNodeId;
// //
// perm = nodeReducedGlobalId //
// refEntity = entityNodeIndex //
// entity = orientedEntityNodeIndex //
// //
// !!! I'm Working on *BOTH* indexes and global IDs !!! //
// //
// 16 + //
// |\ ---> NodeIndex = [v0 v1 v2] //
// | \ ---> GlobalID = [17 42 16] //
// | \ ---> ReducedGlobalId = [1 2 0 ] ---> Permutation = 3 //
// 17 +---+ 42 //
// //
// * refEdge[e][i] = ith INDEX of edge[e] //
// For example refEdge[1] = [1 2] because edge[1] //
// - - //
// is made of nodes v1 and v2 //
// - - //
// //
// * edge[p][e][i] = ith INDEX of edge[e] in orientation[p] //
// such that GlobalID[edge[p][e][0]] > GlobalId[edge[p][e][0]] //
// For example edge[3][1] = [2 1] because edge[1] goes from v2 to v1 //
// - - - - //
//////////////////////////////////////////////////////////////////////////
// Number of Vertices //
size_t nVertex;
// Edge Permutation // // ABC space to UVW space shape function index mapping //
size_t nEdge; std::vector<std::vector<size_t> > ABCtoUVWIndex;
size_t** refEdge;
//unsigned int*** permutedRefEdge;
std::vector<const std::vector<const std::vector<unsigned int>*>*>* edge;
// Face Permutation // // UVW space to ABC space shape function index mapping //
size_t nFace; std::vector<std::vector<size_t> > UVWtoABCIndex;
size_t* nNodeInFace;
size_t** refFace; // Ordered Edge & Face Node Index //
//unsigned int*** permutedRefFace; std::vector<std::vector<std::vector<size_t> > > orderedEdgeNodeIdx;
std::vector<const std::vector<const std::vector<unsigned int>*>*>* face; std::vector<std::vector<std::vector<size_t> > > orderedFaceNodeIdx;
public: public:
virtual ~ReferenceSpace(void); virtual ~ReferenceSpace(void);
size_t getNReferenceSpace(void) const; size_t getNReferenceSpace(void) const;
size_t getReferenceSpace(const MElement& element) const; size_t getReferenceSpace(const MElement& element) const;
/*
std::vector<std::vector<size_t> > getEdgeIndex(size_t referenceSpaceId) const;
std::vector<std::vector<size_t> > getFaceIndex(size_t referenceSpaceId) const;
*/
const std::vector<const std::vector<const std::vector<unsigned int>*>*>&
getAllEdge(void) const;
const std::vector<const std::vector<const std::vector<unsigned int>*>*>& const std::vector<std::vector<size_t> >&
getAllFace(void) const; getNodeId(void) const;
virtual std::string toString(void) const; const std::vector<std::vector<std::vector<size_t> > >&
getEdgeNodeIndex(void) const;
const std::vector<std::vector<std::vector<size_t> > >&
getFaceNodeIndex(void) const;
void mapFromXYZtoABC(const MElement& element,
const fullVector<double>& xyz,
double abc[3]);
void getJacobian(const MElement& element,
const fullVector<double>& xyz,
fullMatrix<double>& jac) const;
virtual std::string toString(void) const;
virtual std::string toLatex(void) const; virtual std::string toLatex(void) const;
protected: protected:
...@@ -99,38 +80,32 @@ class ReferenceSpace{ ...@@ -99,38 +80,32 @@ class ReferenceSpace{
void init(void); void init(void);
void getEdge(void); void getOrderedEdge(void);
void getFace(void); void getOrderedFace(void);
void findCyclicPermutation
(std::list<size_t>& listOfTrueReferenceSpace,
std::list<std::vector<size_t> >& listOfRefNodeIndexPermutation,
std::list<std::vector<size_t> >& listOfReverseNodeIndexPermutation);
void findCyclicPermutation(void);
triple isCyclicPermutation(std::vector<size_t>& pTest, triple isCyclicPermutation(std::vector<size_t>& pTest,
std::vector<size_t>& pRef); std::vector<size_t>& pRef);
size_t findCorrespondingFace(std::vector<size_t>& face, size_t findCorrespondingFace(std::vector<size_t>& face,
std::vector<size_t>& node); std::vector<size_t>& node);
/* static void
void getPermutedRefEntity(unsigned int**** permutedRefEntity, orderRefEntityForGivenRefSpace(std::vector<size_t>& refEntityNodeIdx,
unsigned int** refEntity, std::vector<size_t>& refSpaceNodeId,
unsigned int* nNodeInEntity, std::vector<size_t>& orderedEntityNodeIdx);
unsigned int nEntity);
*/
const std::vector<unsigned int>* getOrderedEdge(unsigned int permutation,
unsigned int edge);
const std::vector<unsigned int>* getOrderedTriFace(unsigned int permutation,
unsigned int face);
const std::vector<unsigned int>* getOrderedQuadFace(unsigned int permutation,
unsigned int face);
static void static void
orderRefEntityForGivenPermutation(size_t* refEntity, correctQuadFaceNodeIdx(std::vector<size_t>& correctedQuadFaceNodeIdx);
std::vector<size_t>& permutation,
std::vector<unsigned int>& orderedEntity); size_t getPermutationIdx(const MElement& element) const;
static bool sortPredicate(const std::pair<unsigned int, unsigned int>& a, static bool sortPredicate(const std::pair<size_t, size_t>& a,
const std::pair<unsigned int, unsigned int>& b); const std::pair<size_t, size_t>& b);
}; };
...@@ -198,26 +173,30 @@ class ReferenceSpace{ ...@@ -198,26 +173,30 @@ class ReferenceSpace{
////////////////////// //////////////////////
inline size_t ReferenceSpace::getNReferenceSpace(void) const{ inline size_t ReferenceSpace::getNReferenceSpace(void) const{
return pTree->getNPermutation(); return refSpaceNodeId.size();
} }
inline inline
const std::vector<const std::vector<const std::vector<unsigned int>*>*>& const std::vector<std::vector<std::vector<size_t> > >&
ReferenceSpace::getAllEdge(void) const{ ReferenceSpace::getEdgeNodeIndex(void) const{
return *edge; return orderedEdgeNodeIdx;
} }
inline inline
const std::vector<const std::vector<const std::vector<unsigned int>*>*>& const std::vector<std::vector<std::vector<size_t> > >&
ReferenceSpace::getAllFace(void) const{ ReferenceSpace::getFaceNodeIndex(void) const{
return *face; return orderedFaceNodeIdx;
} }
inline
size_t ReferenceSpace::getReferenceSpace(const MElement& element) const{
return pTree->getTagFromPermutation(getPermutationIdx(element));
}
inline inline
bool bool
ReferenceSpace::sortPredicate(const std::pair<unsigned int, unsigned int>& a, ReferenceSpace::sortPredicate(const std::pair<size_t, size_t>& a,
const std::pair<unsigned int, unsigned int>& b){ const std::pair<size_t, size_t>& b){
return a.second < b.second; return a.second < b.second;
} }
......
...@@ -21,6 +21,7 @@ ReferenceSpaceLagrange::~ReferenceSpaceLagrange(void){ ...@@ -21,6 +21,7 @@ ReferenceSpaceLagrange::~ReferenceSpaceLagrange(void){
} }
void ReferenceSpaceLagrange::getLagrangeNode(void){ void ReferenceSpaceLagrange::getLagrangeNode(void){
/*
const size_t nPerm = pTree->getNPermutation(); const size_t nPerm = pTree->getNPermutation();
// Alloc // // Alloc //
...@@ -58,6 +59,7 @@ void ReferenceSpaceLagrange::getLagrangeNode(void){ ...@@ -58,6 +59,7 @@ void ReferenceSpaceLagrange::getLagrangeNode(void){
// Insert in node // Insert in node
(*node)[p] = tmp; (*node)[p] = tmp;
} }
*/
} }
void ReferenceSpaceLagrange::edgeSeq(vector<unsigned int>& vec, void ReferenceSpaceLagrange::edgeSeq(vector<unsigned int>& vec,
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using namespace std; using namespace std;
TetEdgeBasis::TetEdgeBasis(unsigned int order){ TetEdgeBasis::TetEdgeBasis(unsigned int order){
/*
// Reference Space // // Reference Space //
refSpace = new TetReferenceSpace; refSpace = new TetReferenceSpace;
nRefSpace = refSpace->getNReferenceSpace(); nRefSpace = refSpace->getNReferenceSpace();
...@@ -321,9 +322,11 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){ ...@@ -321,9 +322,11 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
delete[] legendre; delete[] legendre;
delete[] sclLegendre; delete[] sclLegendre;
delete[] intLegendre; delete[] intLegendre;
*/
} }
TetEdgeBasis::~TetEdgeBasis(void){ TetEdgeBasis::~TetEdgeBasis(void){
/*
// ReferenceSpace // // ReferenceSpace //
delete refSpace; delete refSpace;
...@@ -336,4 +339,5 @@ TetEdgeBasis::~TetEdgeBasis(void){ ...@@ -336,4 +339,5 @@ TetEdgeBasis::~TetEdgeBasis(void){
} }
delete[] basis; delete[] basis;
*/
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment