55 operator char()
const {
60 template <
typename triangulationType>
63 triangulationType *tri_{};
67 std::vector<edgeScheme> edgesSortId_{};
68 std::vector<triScheme> trianglesSortId_{};
72 explicit Mesh(triangulationType *tri) : tri_{tri} {
86 edgesSortId_.resize(nbEdges_);
87 trianglesSortId_.resize(nbTriangles_);
94 tri_->preconditionVertexNeighbors();
95 tri_->preconditionVertexEdges();
96 tri_->preconditionVertexTriangles();
97 tri_->preconditionVertexStars();
98 tri_->preconditionTriangleEdges();
100 nbVerts_ = tri_->getNumberOfVertices();
101 nbEdges_ = tri_->getNumberOfEdges();
102 nbTriangles_ = tri_->getNumberOfTriangles();
108 return tri_->getDimensionality();
124 return tri_->getNumberOfCells();
128 return tri_->getVertexNeighborNumber(v);
134 tri_->getVertexNeighbor(v, local_v, res);
138 return tri_->getVertexEdgeNumber(e);
144 tri_->getVertexEdge(v, local_e, res);
148 return tri_->getVertexTriangleNumber(v);
154 tri_->getVertexTriangle(v, local_c, res);
160 tri_->getEdgeVertex(e, local_id, res);
164 return tri_->getEdgeTriangleNumber(e);
170 tri_->getEdgeTriangle(e, local_t, res);
174 return tri_->getTriangleEdgeNumber(t);
180 tri_->getTriangleEdge(t, local_id, res);
196 const bool increasingOrder)
const;
199 const bool increasingOrder,
203 const bool increasingOrder)
const;
206 const bool increasingOrder,
224 template <
typename triangulationType>
227#ifdef TTK_ENABLE_OPENMP
228#pragma omp parallel for schedule(static)
230 for(
idEdge ei = 0; ei < nbEdges_; ++ei) {
232 tri_->getEdgeVertex(ei, 0, v0);
233 tri_->getEdgeVertex(ei, 1, v1);
235 edgesSortId_[ei] = lowerThan(v0, v1);
239 template <
typename triangulationType>
245#ifdef TTK_ENABLE_OPENMP
246#pragma omp parallel for schedule(static)
248 for(
idCell ti = 0; ti < nbTriangles_; ++ti) {
260 trianglesSortId_[ti] = 0;
263 trianglesSortId_[ti] = 1;
266 trianglesSortId_[ti] = 3;
274 trianglesSortId_[ti] = 2;
277 trianglesSortId_[ti] = 4;
280 trianglesSortId_[ti] = 5;
286 template <
typename triangulationType>
288 const idEdge e,
const bool increasingOrder)
const {
290 tri_->getEdgeVertex(e, 0, v0);
291 tri_->getEdgeVertex(e, 1, v1);
292 if(edgesSortId_[e] ==
static_cast<edgeScheme>(increasingOrder)) {
293 return std::make_tuple(v0, v1);
295 return std::make_tuple(v1, v0);
299 template <
typename triangulationType>
301 const bool increasingOrder,
304 tri_->getEdgeVertex(e, 0, v0);
305 tri_->getEdgeVertex(e, 1, v1);
306 if(edgesSortId_[e] ==
static_cast<edgeScheme>(increasingOrder)) {
307 std::get<0>(oEdge) = v0;
308 std::get<1>(oEdge) = v1;
310 std::get<0>(oEdge) = v1;
311 std::get<1>(oEdge) = v0;
315 template <
typename triangulationType>
317 const idCell ti,
const bool increasingOrder)
const {
323 switch(trianglesSortId_[ti]) {
326 return std::make_tuple(e0, e1, e2);
328 return std::make_tuple(e2, e1, e0);
332 return std::make_tuple(e0, e2, e1);
334 return std::make_tuple(e1, e2, e0);
338 return std::make_tuple(e1, e0, e2);
340 return std::make_tuple(e2, e0, e1);
344 return std::make_tuple(e2, e0, e1);
346 return std::make_tuple(e1, e0, e2);
350 return std::make_tuple(e1, e2, e0);
352 return std::make_tuple(e0, e2, e1);
356 return std::make_tuple(e2, e1, e0);
358 return std::make_tuple(e0, e1, e2);
361#ifndef TTK_ENABLE_KAMIKAZE
362 std::cerr <<
"[Mesh]: error, unknownk case in triangleSortId_ : "
363 <<
static_cast<unsigned>(trianglesSortId_[ti]) <<
" at " << ti
367 return std::make_tuple(nullEdge, nullEdge, nullEdge);
370 template <
typename triangulationType>
373 const bool increasingOrder,
380 switch(trianglesSortId_[ti]) {
382 if(increasingOrder) {
383 std::get<0>(oTriangle) = e0;
384 std::get<1>(oTriangle) = e1;
385 std::get<2>(oTriangle) = e2;
387 std::get<0>(oTriangle) = e2;
388 std::get<1>(oTriangle) = e1;
389 std::get<2>(oTriangle) = e0;
394 if(increasingOrder) {
395 std::get<0>(oTriangle) = e0;
396 std::get<1>(oTriangle) = e2;
397 std::get<2>(oTriangle) = e1;
399 std::get<0>(oTriangle) = e1;
400 std::get<1>(oTriangle) = e2;
401 std::get<2>(oTriangle) = e0;
406 if(increasingOrder) {
407 std::get<0>(oTriangle) = e1;
408 std::get<1>(oTriangle) = e0;
409 std::get<2>(oTriangle) = e2;
411 std::get<0>(oTriangle) = e2;
412 std::get<1>(oTriangle) = e0;
413 std::get<2>(oTriangle) = e1;
418 if(increasingOrder) {
419 std::get<0>(oTriangle) = e2;
420 std::get<1>(oTriangle) = e0;
421 std::get<2>(oTriangle) = e1;
423 std::get<0>(oTriangle) = e1;
424 std::get<1>(oTriangle) = e0;
425 std::get<2>(oTriangle) = e2;
430 if(increasingOrder) {
431 std::get<0>(oTriangle) = e1;
432 std::get<1>(oTriangle) = e2;
433 std::get<2>(oTriangle) = e0;
435 std::get<0>(oTriangle) = e0;
436 std::get<1>(oTriangle) = e2;
437 std::get<2>(oTriangle) = e1;
442 if(increasingOrder) {
443 std::get<0>(oTriangle) = e2;
444 std::get<1>(oTriangle) = e1;
445 std::get<2>(oTriangle) = e0;
447 std::get<0>(oTriangle) = e0;
448 std::get<1>(oTriangle) = e1;
449 std::get<2>(oTriangle) = e2;
453#ifndef TTK_ENABLE_KAMIKAZE
454 std::cerr <<
"[Mesh]: error, unknownk case in triangleSortId_ : "
455 <<
static_cast<unsigned>(trianglesSortId_[ti]) <<
" at "
464 template <
typename triangulationType>
468 if(edgesSortId_[e0] == 0) {
477 if(edgesSortId_[e1] == 0) {
486 return lowerThan(e0v1, e1v1);
487 return lowerThan(e0v0, e1v0);
490 template <
typename triangulationType>
495 if(std::get<0>(l0) == std::get<0>(l1)) {
496 return compareEdges(std::get<1>(l0), std::get<1>(l1), lowerThan);
498 return compareEdges(std::get<0>(l0), std::get<0>(l1), lowerThan);
501 template <
typename triangulationType>
503 std::stringstream res;
504 res <<
" edges: " << std::endl;
505 for(
idEdge i = 0; i < nbEdges_; ++i) {
509 res << i <<
" : " << v0 <<
" " << v1 << std::endl;
515 template <
typename triangulationType>
517 std::stringstream res;
521 res << v0 <<
" " << v1;
bool compareEdges(const idEdge e0, const idEdge e1, const VertCompFN &lowerThan) const
orderedTriangle getOrderedTriangle(const idCell t, const bool increasingOrder) const
idEdge getNumberOfEdges() const
std::string printEdges() const
idEdge getVertexEdgeNumber(const idEdge e) const
void setTriangulation(triangulationType *tri)
void getVertexTriangle(const idVertex v, const idCell local_c, idCell &res) const
void getTriangleEdge(const idCell t, const char local_id, idEdge &res) const
void getVertexNeighbor(const idVertex v, const idVertex local_v, idVertex &res)
idVertex getVertexNeighborNumber(const idVertex v) const
std::string printEdge(const idEdge e) const
idCell getNumberOfTriangles() const
SimplexId getDimensionality() const
void preSortTriangles(const VertCompFN &lowerThan)
idCell getVertexTriangleNumber(const idVertex v) const
Mesh(triangulationType *tri)
bool compareLinks(const linkEdge &l0, const linkEdge &l1, const VertCompFN &lowerTan) const
void getVertexEdge(const idVertex v, const idEdge local_e, idEdge &res) const
idVertex getNumberOfVertices() const
orderedEdge getOrderedEdge(const idEdge e, const bool increasingOrder) const
idEdge getTriangleEdgeNumber(const idCell t) const
void preSortEdges(const VertCompFN &lowerThan)
triangulationType * getTriangulation()
idCell getEdgeTriangleNumber(const idEdge e) const
void getEdgeTriangle(const idEdge e, const idCell local_t, idCell &res) const
idCell getNumberOfCells() const
void getEdgeVertex(const idEdge e, const char local_id, idVertex &res) const
std::pair< idEdge, idEdge > linkEdge
std::function< bool(const idVertex, const idVertex)> VertCompFN
SimplexId idCell
Cell index in vect_cellList_.
std::tuple< idEdge, idEdge, idEdge > orderedTriangle
Triangle represented by its 3 edges Edges are sorted by their starting vertex (see orderedEdge)
std::tuple< idVertex, idVertex > orderedEdge
Edge represented by its 2 vertices, lower then upper.
SimplexId idVertex
Vertex index in scalars_.
SimplexId idEdge
Edge index in vect_edgeList_.
TTK base package defining the standard types.
int SimplexId
Identifier type for simplices of any dimension.