35 #include <boost/core/ignore_unused.hpp> 48 namespace LibUtilities
59 bool isVertex(
int x,
int y,
int z,
int npts){
60 return (x==0 && y==0 && z==0) || (x==(npts-1) && y==0 && z==0) || (x==0 && y==(npts-1) && z==0) || (x==0 && y==0 && z==(npts-1));
63 bool isEdge_01(
int x,
int y,
int z,
int npts){
64 boost::ignore_unused(x, npts);
68 bool isEdge_12(
int x,
int y,
int z,
int npts){
69 return z==0 && x + y == npts -1;
72 bool isEdge_20(
int x,
int y,
int z,
int npts){
73 boost::ignore_unused(y, npts);
77 bool isEdge_03(
int x,
int y,
int z,
int npts){
78 boost::ignore_unused(z, npts);
82 bool isEdge_13(
int x,
int y,
int z,
int npts){
83 return y==0 && x + z == npts -1;
86 bool isEdge_23(
int x,
int y,
int z,
int npts){
87 return x==0 && y + z == npts -1;
90 bool isEdge(
int x,
int y,
int z,
int npts){
91 return isEdge_01(x,y,z,npts)||isEdge_12(x,y,z,npts)||isEdge_20(x,y,z,npts)
92 ||isEdge_03(x,y,z,npts)||isEdge_13(x,y,z,npts)||isEdge_23(x,y,z,npts);
95 bool isFace_012(
int x,
int y,
int z,
int npts){
96 boost::ignore_unused(x, y, npts);
100 bool isFace_013(
int x,
int y,
int z,
int npts){
101 boost::ignore_unused(x, z, npts);
105 bool isFace_123(
int x,
int y,
int z,
int npts){
106 return x+y+z==npts-1;
109 bool isFace_203(
int x,
int y,
int z,
int npts){
110 boost::ignore_unused(y, z, npts);
114 bool isFace(
int x,
int y,
int z,
int npts){
115 return isFace_012(x, y, z, npts) || isFace_013(x, y, z, npts)
116 || isFace_123(x, y, z, npts) || isFace_203(x, y, z, npts);
129 for(
unsigned int z=0, index=0; z<npts; ++z){
130 for(
unsigned int y=0; y<npts-z; ++y){
131 for(
unsigned int x=0; x<npts-z-y; ++x, ++index){
153 vector<int> iEdge_01;
154 vector<int> iEdge_12;
155 vector<int> iEdge_20;
156 vector<int> iEdge_03;
157 vector<int> iEdge_13;
158 vector<int> iEdge_23;
159 vector<int> iFace_012;
160 vector<int> iFace_013;
161 vector<int> iFace_123;
162 vector<int> iFace_203;
163 vector<int> interiorVolumePoints;
167 for(
int z=0, index=0; z<npts; ++z){
168 for(
int y=0; y<npts-z; ++y){
169 for(
int x=0; x<npts-z-y; ++x, ++index){
171 if( isVertex(x,y,z,npts) ){
173 vertex.push_back(index);
175 }
else if( isEdge(x,y,z,npts) ){
177 if( isEdge_01(x,y,z,npts) ){
179 iEdge_01.push_back(index);
181 }
else if( isEdge_12(x,y,z,npts) ){
183 iEdge_12.push_back(index);
185 }
else if( isEdge_20(x,y,z,npts) ){
187 iEdge_20.insert(iEdge_20.begin(), index);
189 }
else if( isEdge_03(x,y,z,npts) ){
191 iEdge_03.push_back(index);
193 }
else if( isEdge_13(x,y,z,npts) ){
195 iEdge_13.push_back(index);
197 }
else if( isEdge_23(x,y,z,npts) ){
199 iEdge_23.push_back(index);
203 }
else if( isFace(x,y,z,npts) ) {
205 if( isFace_012(x,y,z,npts) ){
207 iFace_012.push_back(index);
209 }
else if( isFace_013(x,y,z,npts) ){
211 iFace_013.push_back(index);
213 }
else if( isFace_123(x,y,z,npts) ){
215 iFace_123.push_back(index);
217 }
else if( isFace_203(x,y,z,npts) ){
219 iFace_203.push_back(index);
224 interiorVolumePoints.push_back(index);
232 for(
unsigned int n=0; n<vertex.size(); ++n){
234 map.push_back(vertex[n]);
237 for(
unsigned int n=0; n<iEdge_01.size(); ++n){
239 map.push_back(iEdge_01[n]);
242 for(
unsigned int n=0; n<iEdge_12.size(); ++n){
244 map.push_back(iEdge_12[n]);
247 for(
unsigned int n=0; n<iEdge_20.size(); ++n){
249 map.push_back(iEdge_20[n]);
252 for(
unsigned int n=0; n<iEdge_03.size(); ++n){
254 map.push_back(iEdge_03[n]);
257 for(
unsigned int n=0; n<iEdge_13.size(); ++n){
259 map.push_back(iEdge_13[n]);
262 for(
unsigned int n=0; n<iEdge_23.size(); ++n){
264 map.push_back(iEdge_23[n]);
267 for(
unsigned int n=0; n<iFace_012.size(); ++n){
269 map.push_back(iFace_012[n]);
272 for(
unsigned int n=0; n<iFace_013.size(); ++n){
274 map.push_back(iFace_013[n]);
277 for(
unsigned int n=0; n<iFace_123.size(); ++n){
279 map.push_back(iFace_123[n]);
282 for(
unsigned int n=0; n<iFace_203.size(); ++n){
284 map.push_back(iFace_203[n]);
287 for(
unsigned int n=0; n<interiorVolumePoints.size(); ++n){
289 map.push_back(interiorVolumePoints[n]);
297 for(
unsigned int index=0; index<map.size(); ++index){
299 points[0][index] =
m_points[0][index];
300 points[1][index] =
m_points[1][index];
301 points[2][index] =
m_points[2][index];
305 for(
unsigned int index=0; index<map.size(); ++index){
307 m_points[0][index] = points[0][map[index]];
308 m_points[1][index] = points[1][map[index]];
309 m_points[2][index] = points[2][map[index]];
342 std::shared_ptr<NekMatrix<NekDouble> > mat =
343 m_util->GetInterpolationMatrix(xi);
344 Vmath::Vcopy(mat->GetRows() * mat->GetColumns(), mat->GetRawPtr(),
364 returnval->Initialize();
static std::shared_ptr< PointsBaseType > Create(const PointsKey &key)
Array< OneD, DataType > m_weights
std::shared_ptr< NodalUtilTetrahedron > m_util
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void CalculateInterpMatrix(const Array< OneD, const NekDouble > &xi, const Array< OneD, const NekDouble > &yi, const Array< OneD, const NekDouble > &zi, Array< OneD, NekDouble > &interp)
void CalculateDerivMatrix()
virtual void CalculatePoints()
void NodalPointReorder3d()
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
PointsManagerT & PointsManager(void)
Defines a specification for a set of points.
3D Evenly-spaced points on a Tetrahedron
virtual void CalculateDerivMatrix()
unsigned int GetTotNumPoints() const
Array< OneD, DataType > m_points[3]
bool RegisterCreator(const KeyType &key, const CreateFuncType &createFunc)
Register the given function and associate it with the key. The return value is just to facilitate cal...
virtual void CalculateWeights()
unsigned int GetRows() const
MatrixSharedPtrType m_derivmatrix[3]
unsigned int GetNumPoints() const
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Array< OneD, DataType > & GetPtr()
static bool initPointsManager[]