35 #ifndef NEKMESHUTILS_MESHELEMENTS_ALIGNMENT 36 #define NEKMESHUTILS_MESHELEMENTS_ALIGNMENT 40 namespace NekMeshUtils
51 HOTriangle(std::vector<int> pVertId, std::vector<T> pSurfVerts)
75 int np = ((int)sqrt(8.0 * surfVerts.size() + 1.0) - 1) / 2;
76 std::vector<T> tmp(np * np);
78 for (n = 0; n < nrot; ++n)
80 for (cnt = i = 0; i < np; ++i)
82 for (j = 0; j < np - i; ++j, cnt++)
84 tmp[i * np + j] = surfVerts[cnt];
87 for (cnt = i = 0; i < np; ++i)
89 for (j = 0; j < np - i; ++j, cnt++)
91 surfVerts[cnt] = tmp[(np - 1 - i - j) * np + i];
111 int np = ((int)sqrt(8.0 * surfVerts.size() + 1.0) - 1) / 2;
112 std::vector<T> tmp(np * np);
114 for (cnt = i = 0; i < np; ++i)
116 for (j = 0; j < np - i; ++j, cnt++)
118 tmp[i * np + np - i - 1 - j] = surfVerts[cnt];
122 for (cnt = i = 0; i < np; ++i)
124 for (j = 0; j < np - i; ++j, cnt++)
126 surfVerts[cnt] = tmp[i * np + j];
136 if (vertId[0] == this->vertId[0])
138 if (vertId[1] == this->vertId[1] || vertId[1] == this->vertId[2])
140 if (vertId[1] == this->vertId[2])
147 else if (vertId[0] == this->vertId[1])
149 if (vertId[1] == this->vertId[0] || vertId[1] == this->vertId[2])
151 if (vertId[1] == this->vertId[0])
161 else if (vertId[0] == this->vertId[2])
163 if (vertId[1] == this->vertId[0] || vertId[1] == this->vertId[1])
165 if (vertId[1] == this->vertId[1])
185 struct HOSurfHash : std::unary_function<HOSurfSharedPtr, std::size_t>
193 std::vector<int> ids = p->vertId;
194 std::sort(ids.begin(), ids.end());
200 HOSurfSharedPtr
const &p2);
202 typedef std::unordered_set<HOSurfSharedPtr, HOSurfHash>
HOSurfSet;
228 int np = (int)(sqrt((
NekDouble)surfVerts.size()) + 0.5);
229 for (
int i = 0; i < np; ++i)
231 for (
int j = 0; j < np/2; ++j)
233 swap(surfVerts[i*np + j], surfVerts[i*np + np-j-1]);
240 int np = (int)(sqrt((
NekDouble)surfVerts.size()) + 0.5);
242 for (
int j = 0; j < np; ++j)
244 for (
int i = 0; i < np/2; ++i)
246 swap(surfVerts[i*np + j], surfVerts[(np-i-1)*np + j]);
253 int np = (int)(sqrt((
NekDouble)surfVerts.size()) + 0.5);
254 std::vector<T> tmp(surfVerts.size());
256 for (
int i = 0; i < np; ++i)
258 for (
int j = 0; j < np; ++j)
260 tmp[i*np+j] = surfVerts[j*np+i];
273 int vmap[4] = {-1, -1, -1, -1};
276 for (
int i = 0; i < 4; ++i)
278 for (
int j = 0; j < 4; ++j)
280 if (this->vertId[j] == vertId[i])
288 "Could not determine mapping between vertex IDs");
293 if (vmap[1] == (vmap[0]+1) % 4)
std::size_t hash_range(Iter first, Iter last)
std::unordered_set< HOSurfSharedPtr, HOSurfHash > HOSurfSet
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
std::vector< T > surfVerts
The quadrilateral surface vertices – templated so that this can either be nodes or IDs...
std::vector< int > vertId
The quadrilateral vertex IDs.
std::vector< T > surfVerts
The triangle surface vertices – templated so that this can either be nodes or IDs.
std::vector< int > vertId
The triangle vertex IDs.
void Rotate(int nrot)
Rotates the triangle of data points inside surfVerts counter-clockwise nrot times.
HOQuadrilateral(std::vector< int > pVertId)
bool operator==(ElmtConfig const &c1, ElmtConfig const &c2)
Compares two element config structs.
std::size_t operator()(HOSurfSharedPtr const &p) const
HOTriangle(std::vector< int > pVertId)
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
A lightweight struct for dealing with high-order triangle alignment.
A lightweight struct for dealing with high-order quadrilateral alignment.
#define NEKMESHUTILS_EXPORT
std::shared_ptr< HOSurf > HOSurfSharedPtr
HOQuadrilateral(std::vector< int > pVertId, std::vector< T > pSurfVerts)
void Reflect()
Reflect data points inside surfVerts.
HOTriangle(std::vector< int > pVertId, std::vector< T > pSurfVerts)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
HOTriangle< NodeSharedPtr > HOSurf