TTK
Loading...
Searching...
No Matches
RegularGridTriangulation.cpp
Go to the documentation of this file.
2#include <numeric>
3#include <string>
4
9
11 const SimplexId v0, const SimplexId v1) const {
12 // loop over v0 edges to find the one between v0 and v1
13 const auto nEdges = this->getVertexEdgeNumberInternal(v0);
14 for(SimplexId i = 0; i < nEdges; ++i) {
15 SimplexId e{};
16 std::array<SimplexId, 2> eVerts{};
17 this->getVertexEdgeInternal(v0, i, e);
18 this->getEdgeVertexInternal(e, 0, eVerts[0]);
19 this->getEdgeVertexInternal(e, 1, eVerts[1]);
20 if((v0 == eVerts[0] && v1 == eVerts[1])
21 || (v0 == eVerts[1] && v1 == eVerts[0])) {
22 return e;
23 }
24 }
25
26 return -1;
27}
28
30 std::array<SimplexId, 3> &verts) const {
31 std::sort(verts.begin(), verts.end());
32
33 // loop over verts[0] triangles to find the one shared by all 3
34 const auto nTriangles = this->getVertexTriangleNumberInternal(verts[0]);
35 for(SimplexId i = 0; i < nTriangles; ++i) {
36 SimplexId t{};
37 std::array<SimplexId, 3> tVerts{};
38 this->getVertexTriangleInternal(verts[0], i, t);
39 this->getTriangleVertexInternal(t, 0, tVerts[0]);
40 this->getTriangleVertexInternal(t, 1, tVerts[1]);
41 this->getTriangleVertexInternal(t, 2, tVerts[2]);
42 std::sort(tVerts.begin(), tVerts.end());
43 if(tVerts == verts) {
44 return t;
45 }
46 }
47
48 return -1;
49}
50
51#ifdef TTK_ENABLE_MPI
52
53int ttk::RegularGridTriangulation::getVertexRankInternal(
54 const SimplexId lvid) const {
55
56 if(this->vertexGhost_[lvid] == 0) {
57 return ttk::MPIrank_;
58 }
59
60#ifndef TTK_ENABLE_KAMIKAZE
61 if(this->neighborRanks_.empty()) {
62 this->printErr("Empty neighborsRanks_!");
63 return -1;
64 }
65#endif // TTK_ENABLE_KAMIKAZE
66 const auto p{this->getVertGlobalCoords(lvid)};
67 for(const auto neigh : this->neighborRanks_) {
68 const auto &bbox{this->neighborVertexBBoxes_[neigh]};
69 if(p[0] >= bbox[0] && p[0] <= bbox[1] && p[1] >= bbox[2] && p[1] <= bbox[3]
70 && p[2] >= bbox[4] && p[2] <= bbox[5]) {
71 return neigh;
72 }
73 }
74 return -1;
75}
76
77int ttk::RegularGridTriangulation::getEdgeRankInternal(
78 const SimplexId lvid) const {
79
80 ttk::SimplexId minId{-1};
81 int cellMinRank;
82 this->TTK_TRIANGULATION_INTERNAL(getEdgeStar)(lvid, 0, minId);
83 const auto nStar{this->TTK_TRIANGULATION_INTERNAL(getEdgeStarNumber)(lvid)};
84 cellMinRank = this->getCellRankInternal(minId);
85 for(SimplexId i = 1; i < nStar; ++i) {
86 SimplexId sid{-1};
87 this->TTK_TRIANGULATION_INTERNAL(getEdgeStar)(lvid, i, sid);
88 // rule: an edge is owned by the cell in its star with the
89 // lowest rank id
90 int cellRank = this->getCellRankInternal(sid);
91 if(cellRank < cellMinRank) {
92 cellMinRank = cellRank;
93 }
94 }
95 return cellMinRank;
96}
97
98int ttk::RegularGridTriangulation::getTriangleRankInternal(
99 const SimplexId lvid) const {
100
101 ttk::SimplexId minId{-1};
102 int cellMinRank;
103 this->TTK_TRIANGULATION_INTERNAL(getTriangleStar)(lvid, 0, minId);
104 const auto nStar{
106 cellMinRank = this->getCellRankInternal(minId);
107 for(SimplexId i = 1; i < nStar; ++i) {
108 SimplexId sid{-1};
109 this->TTK_TRIANGULATION_INTERNAL(getTriangleStar)(lvid, i, sid);
110 // rule: a triangle is owned by the cell in its star with the
111 // lowest rank id
112 int cellRank = this->getCellRankInternal(sid);
113 if(cellRank < cellMinRank) {
114 cellMinRank = cellRank;
115 }
116 }
117 return cellMinRank;
118}
119
120ttk::SimplexId ttk::RegularGridTriangulation::getVertexGlobalIdInternal(
121 const SimplexId lvid) const {
122 if(!ttk::isRunningWithMPI()) {
123 return lvid;
124 }
125
126#ifndef TTK_ENABLE_KAMIKAZE
127 if(lvid > this->TTK_TRIANGULATION_INTERNAL(getNumberOfVertices)() - 1
128 || lvid < 0) {
129 return -1;
130 }
131 if(this->metaGrid_ == nullptr) {
132 return -1;
133 }
134#endif // TTK_ENABLE_KAMIKAZE
135
136 const auto p{this->getVertGlobalCoords(lvid)};
137 const auto &dims{this->metaGrid_->getGridDimensions()};
138
139 // global coordinates to identifier (inverse of vertexToPosition)
140 return p[0] + p[1] * dims[0] + p[2] * dims[0] * dims[1];
141}
142
143ttk::SimplexId ttk::RegularGridTriangulation::getVertexLocalIdInternal(
144 const SimplexId gvid) const {
145 if(!ttk::isRunningWithMPI()) {
146 return gvid;
147 }
148
149#ifndef TTK_ENABLE_KAMIKAZE
150 if(this->metaGrid_ == nullptr) {
151 return -1;
152 }
153 if(gvid
154 > this->metaGrid_->TTK_TRIANGULATION_INTERNAL(getNumberOfVertices)() - 1
155 || gvid < 0) {
156 return -1;
157 }
158#endif // TTK_ENABLE_KAMIKAZE
159
160 const auto p{this->getVertLocalCoords(gvid)};
161 const auto &dims{this->getGridDimensions()};
162
163 if(p[0] < 0 || p[1] < 0 || p[2] < 0 || p[0] > dims[0] - 1
164 || p[1] > dims[1] - 1 || p[2] > dims[2] - 1) {
165 return -1;
166 }
167
168 // local coordinates to identifier (inverse of vertexToPosition)
169 return p[0] + p[1] * dims[0] + p[2] * dims[0] * dims[1];
170}
171
172ttk::SimplexId ttk::RegularGridTriangulation::getCellGlobalIdInternal(
173 const SimplexId lcid) const {
174 if(!ttk::isRunningWithMPI()) {
175 return lcid;
176 }
177
178#ifndef TTK_ENABLE_KAMIKAZE
179 if(lcid > this->TTK_TRIANGULATION_INTERNAL(getNumberOfCells)() - 1
180 || lcid < 0) {
181 return -1;
182 }
183 if(this->metaGrid_ == nullptr) {
184 return -1;
185 }
186#endif // TTK_ENABLE_KAMIKAZE
187
188 // local cube coordinates
189 std::array<SimplexId, 3> p{};
190 if(this->dimensionality_ == 3) {
191 this->tetrahedronToPosition(lcid, p.data());
192 } else if(this->dimensionality_ == 2) {
193 this->triangleToPosition2d(lcid, p.data());
194 }
195
196 // global cube coordinates
197 p[0] += this->localGridOffset_[0];
198 p[1] += this->localGridOffset_[1];
199 p[2] += this->localGridOffset_[2];
200
201 const auto &dims{this->metaGrid_->getGridDimensions()};
202
203 // global coordinates to identifier (inverse of tetrahedronToPosition)
204 const auto globCubeId{p[0] + p[1] * (dims[0] - 1)
205 + p[2] * (dims[0] - 1) * (dims[1] - 1)};
206
207 const auto nCellsPerCube{this->dimensionality_ == 3 ? 6 : 2};
208 return globCubeId * nCellsPerCube + lcid % nCellsPerCube;
209}
210
211ttk::SimplexId ttk::RegularGridTriangulation::getCellLocalIdInternal(
212 const SimplexId gcid) const {
213 if(!ttk::isRunningWithMPI()) {
214 return gcid;
215 }
216
217#ifndef TTK_ENABLE_KAMIKAZE
218 if(this->metaGrid_ == nullptr) {
219 return -1;
220 }
221 if(gcid > this->metaGrid_->TTK_TRIANGULATION_INTERNAL(getNumberOfCells)() - 1
222 || gcid < 0) {
223 return -1;
224 }
225#endif // TTK_ENABLE_KAMIKAZE
226
227 // global cube coordinates
228 std::array<SimplexId, 3> p{};
229 if(this->dimensionality_ == 3) {
230 this->metaGrid_->tetrahedronToPosition(gcid, p.data());
231 } else if(this->dimensionality_ == 2) {
232 this->metaGrid_->triangleToPosition2d(gcid, p.data());
233 }
234
235 // local cube coordinates
236 p[0] -= this->localGridOffset_[0];
237 p[1] -= this->localGridOffset_[1];
238 p[2] -= this->localGridOffset_[2];
239
240 const auto &dims{this->getGridDimensions()};
241 if(p[0] < 0 || p[1] < 0 || p[2] < 0 || p[0] >= dims[0] - 1
242 || p[1] >= dims[1] - 1 || (p[2] >= dims[2] - 1 && dims[2] != 1)) {
243 return -1;
244 }
245 // local coordinates to identifier (inverse of tetrahedronToPosition)
246 const auto locCubeId{p[0] + p[1] * (dims[0] - 1)
247 + p[2] * (dims[0] - 1) * (dims[1] - 1)};
248
249 const auto nCellsPerCube{this->dimensionality_ == 3 ? 6 : 2};
250 return locCubeId * nCellsPerCube + gcid % nCellsPerCube;
251}
252
253ttk::SimplexId ttk::RegularGridTriangulation::getEdgeGlobalIdInternal(
254 const SimplexId leid) const {
255 if(!ttk::isRunningWithMPI()) {
256 return leid;
257 }
258
259#ifndef TTK_ENABLE_KAMIKAZE
260 if(leid > this->getNumberOfEdgesInternal() - 1 || leid < 0) {
261 return -1;
262 }
263 if(this->metaGrid_ == nullptr) {
264 return -1;
265 }
266#endif // TTK_ENABLE_KAMIKAZE
267
268 if(this->dimensionality_ == 1) {
269 return this->getCellGlobalIdInternal(leid);
270 }
271
272 // local vertices ids
273 SimplexId lv0{}, lv1{};
274 this->getEdgeVertexInternal(leid, 0, lv0);
275 this->getEdgeVertexInternal(leid, 1, lv1);
276
277 // global vertices ids
278 const auto gv0 = this->getVertexGlobalId(lv0);
279 const auto gv1 = this->getVertexGlobalId(lv1);
280 if(gv0 == -1 || gv1 == -1) {
281 return -1;
282 }
283
284 return this->metaGrid_->findEdgeFromVertices(gv0, gv1);
285}
286
287ttk::SimplexId ttk::RegularGridTriangulation::getEdgeLocalIdInternal(
288 const SimplexId geid) const {
289 if(!ttk::isRunningWithMPI()) {
290 return geid;
291 }
292
293#ifndef TTK_ENABLE_KAMIKAZE
294 if(this->metaGrid_ == nullptr) {
295 return -1;
296 }
297 if(geid > this->metaGrid_->getNumberOfEdgesInternal() - 1 || geid < 0) {
298 return -1;
299 }
300#endif // TTK_ENABLE_KAMIKAZE
301
302 if(this->dimensionality_ == 1) {
303 return this->getCellLocalIdInternal(geid);
304 }
305
306 // global vertices ids
307 SimplexId gv0{}, gv1{};
308 this->metaGrid_->getEdgeVertexInternal(geid, 0, gv0);
309 this->metaGrid_->getEdgeVertexInternal(geid, 1, gv1);
310
311 // local vertices ids
312 const auto lv0 = this->getVertexLocalId(gv0);
313 const auto lv1 = this->getVertexLocalId(gv1);
314 if(lv0 == -1 || lv1 == -1) {
315 return -1;
316 }
317
318 return this->findEdgeFromVertices(lv0, lv1);
319}
320
321ttk::SimplexId ttk::RegularGridTriangulation::getTriangleGlobalIdInternal(
322 const SimplexId ltid) const {
323 if(!ttk::isRunningWithMPI()) {
324 return ltid;
325 }
326
327#ifndef TTK_ENABLE_KAMIKAZE
328 if(ltid > this->getNumberOfTrianglesInternal() - 1 || ltid < 0) {
329 return -1;
330 }
331 if(this->metaGrid_ == nullptr) {
332 return -1;
333 }
334#endif // TTK_ENABLE_KAMIKAZE
335
336 if(this->dimensionality_ == 2) {
337 return this->getCellGlobalIdInternal(ltid);
338 }
339
340 // local vertices ids
341 SimplexId lv0{}, lv1{}, lv2{};
342 this->getTriangleVertexInternal(ltid, 0, lv0);
343 this->getTriangleVertexInternal(ltid, 1, lv1);
344 this->getTriangleVertexInternal(ltid, 2, lv2);
345
346 // global vertices ids
347 std::array<SimplexId, 3> globVerts{
348 this->getVertexGlobalId(lv0),
349 this->getVertexGlobalId(lv1),
350 this->getVertexGlobalId(lv2),
351 };
352 for(const auto gv : globVerts) {
353 if(gv == -1) {
354 return -1;
355 }
356 }
357
358 return this->metaGrid_->findTriangleFromVertices(globVerts);
359}
360
361ttk::SimplexId ttk::RegularGridTriangulation::getTriangleLocalIdInternal(
362 const SimplexId gtid) const {
363 if(!ttk::isRunningWithMPI()) {
364 return gtid;
365 }
366
367#ifndef TTK_ENABLE_KAMIKAZE
368 if(this->metaGrid_ == nullptr) {
369 return -1;
370 }
371 if(gtid > this->metaGrid_->getNumberOfTrianglesInternal() - 1 || gtid < 0) {
372 return -1;
373 }
374#endif // TTK_ENABLE_KAMIKAZE
375
376 if(this->dimensionality_ == 2) {
377 return this->getCellGlobalIdInternal(gtid);
378 }
379
380 // local vertices ids
381 SimplexId gv0{}, gv1{}, gv2{};
382 this->metaGrid_->getTriangleVertexInternal(gtid, 0, gv0);
383 this->metaGrid_->getTriangleVertexInternal(gtid, 1, gv1);
384 this->metaGrid_->getTriangleVertexInternal(gtid, 2, gv2);
385
386 // global vertices ids
387 std::array<SimplexId, 3> locVerts{
388 this->getVertexLocalId(gv0),
389 this->getVertexLocalId(gv1),
390 this->getVertexLocalId(gv2),
391 };
392 for(const auto lv : locVerts) {
393 if(lv == -1) {
394 return -1;
395 }
396 }
397
398 return this->findTriangleFromVertices(locVerts);
399}
400
401int ttk::RegularGridTriangulation::preconditionDistributedVertices() {
402 if(this->hasPreconditionedDistributedVertices_) {
403 return 0;
404 }
405 if(!isRunningWithMPI()) {
406 return -1;
407 }
408 if(this->vertexGhost_ == nullptr) {
409 if(ttk::isRunningWithMPI()) {
410 this->printErr("Missing vertex ghost array!");
411 }
412 return -3;
413 }
414 // number of local vertices (with ghost vertices...)
415 const auto nLocVertices{this->getNumberOfVertices()};
416 this->neighborVertexBBoxes_.resize(ttk::MPIsize_);
417 auto &localBBox{this->neighborVertexBBoxes_[ttk::MPIrank_]};
418 // "good" starting values?
419 ttk::SimplexId localBBox_x_min{this->localGridOffset_[0]
420 + this->dimensions_[0]},
421 localBBox_y_min{this->localGridOffset_[1] + this->dimensions_[1]},
422 localBBox_z_min{this->localGridOffset_[2] + this->dimensions_[2]};
423 ttk::SimplexId localBBox_x_max{this->localGridOffset_[0]},
424 localBBox_y_max{this->localGridOffset_[1]},
425 localBBox_z_max{this->localGridOffset_[2]};
426#ifdef TTK_ENABLE_OPENMP
427#pragma omp parallel for reduction( \
428 min \
429 : localBBox_x_min, localBBox_y_min, localBBox_z_min) \
430 reduction(max \
431 : localBBox_x_max, localBBox_y_max, localBBox_z_max)
432#endif
433 for(SimplexId lvid = 0; lvid < nLocVertices; ++lvid) {
434 // only keep non-ghost vertices
435 if(this->vertexGhost_[lvid] != 0) {
436 continue;
437 }
438 // local vertex coordinates
439 std::array<SimplexId, 3> p{};
440 p = this->getVertGlobalCoords(lvid);
441
442 if(p[0] < localBBox_x_min) {
443 localBBox_x_min = p[0];
444 }
445 if(p[0] > localBBox_x_max) {
446 localBBox_x_max = p[0];
447 }
448 if(p[1] < localBBox_y_min) {
449 localBBox_y_min = p[1];
450 }
451 if(p[1] > localBBox_y_max) {
452 localBBox_y_max = p[1];
453 }
454 if(p[2] < localBBox_z_min) {
455 localBBox_z_min = p[2];
456 }
457 if(p[2] > localBBox_z_max) {
458 localBBox_z_max = p[2];
459 }
460 }
461
462 localBBox = {
463 localBBox_x_min, localBBox_x_max, localBBox_y_min,
464 localBBox_y_max, localBBox_z_min, localBBox_z_max,
465 };
466
467 for(size_t i = 0; i < this->neighborRanks_.size(); ++i) {
468 const auto neigh{this->neighborRanks_[i]};
469 MPI_Sendrecv(this->neighborVertexBBoxes_[ttk::MPIrank_].data(), 6,
470 ttk::getMPIType(SimplexId{}), neigh, ttk::MPIrank_,
471 this->neighborVertexBBoxes_[neigh].data(), 6,
472 ttk::getMPIType(SimplexId{}), neigh, neigh, ttk::MPIcomm_,
473 MPI_STATUS_IGNORE);
474 }
475
476 this->hasPreconditionedDistributedVertices_ = true;
477
478 return 0;
479}
480
481int ttk::RegularGridTriangulation::preconditionExchangeGhostCells() {
482
483 if(this->hasPreconditionedExchangeGhostCells_) {
484 return 0;
485 }
486 if(!ttk::hasInitializedMPI()) {
487 return -1;
488 }
489
490 // number of local cells (with ghost cells...)
491 const auto nLocCells{this->getNumberOfCells()};
492
493 int cellRank = 0;
494 for(LongSimplexId lcid = 0; lcid < nLocCells; ++lcid) {
495 cellRank = this->getCellRankInternal(lcid);
496 if(cellRank != ttk::MPIrank_) {
497 // store ghost cell global ids (per rank)
498 this->ghostCellsPerOwner_[cellRank].emplace_back(
499 this->getCellGlobalIdInternal(lcid));
500 }
501 }
502
503 // for each rank, store the global id of local cells that are ghost cells of
504 // other ranks.
505 const auto MIT{ttk::getMPIType(ttk::SimplexId{})};
506 this->remoteGhostCells_.resize(ttk::MPIsize_);
507 // number of owned cells that are ghost cells of other ranks
508 std::vector<size_t> nOwnedGhostCellsPerRank(ttk::MPIsize_);
509
510 for(const auto neigh : this->neighborRanks_) {
511 // 1. send to neigh number of ghost cells owned by neigh
512 const auto nCells{this->ghostCellsPerOwner_[neigh].size()};
513 MPI_Sendrecv(&nCells, 1, ttk::getMPIType(nCells), neigh, ttk::MPIrank_,
514 &nOwnedGhostCellsPerRank[neigh], 1, ttk::getMPIType(nCells),
515 neigh, neigh, ttk::MPIcomm_, MPI_STATUS_IGNORE);
516 this->remoteGhostCells_[neigh].resize(nOwnedGhostCellsPerRank[neigh]);
517
518 // 2. send to neigh list of ghost cells owned by neigh
519 MPI_Sendrecv(this->ghostCellsPerOwner_[neigh].data(),
520 this->ghostCellsPerOwner_[neigh].size(), MIT, neigh,
521 ttk::MPIrank_, this->remoteGhostCells_[neigh].data(),
522 this->remoteGhostCells_[neigh].size(), MIT, neigh, neigh,
523 ttk::MPIcomm_, MPI_STATUS_IGNORE);
524 }
525
526 this->hasPreconditionedExchangeGhostCells_ = true;
527 return 0;
528}
529
530int ttk::RegularGridTriangulation::preconditionExchangeGhostVertices() {
531
532 if(this->hasPreconditionedExchangeGhostVertices_) {
533 return 0;
534 }
535 if((!ttk::hasInitializedMPI()) || (!ttk::isRunningWithMPI())) {
536 return -1;
537 }
538
539 this->ghostVerticesPerOwner_.resize(ttk::MPIsize_);
540
541 // number of local vertices (with ghost vertices...)
542 const auto nLocVertices{this->getNumberOfVertices()};
543
544 for(LongSimplexId lvid = 0; lvid < nLocVertices; ++lvid) {
545 if(this->getVertexRankInternal(lvid) != ttk::MPIrank_) {
546 // store ghost cell global ids (per rank)
547 this->ghostVerticesPerOwner_[this->getVertexRankInternal(lvid)]
548 .emplace_back(this->getVertexGlobalIdInternal(lvid));
549 }
550 }
551
552 // for each rank, store the global id of local cells that are ghost cells of
553 // other ranks.
554 const auto MIT{ttk::getMPIType(ttk::SimplexId{})};
555 this->remoteGhostVertices_.resize(ttk::MPIsize_);
556 // number of owned cells that are ghost cells of other ranks
557 std::vector<size_t> nOwnedGhostVerticesPerRank(ttk::MPIsize_);
558
559 for(const auto neigh : this->neighborRanks_) {
560 // 1. send to neigh number of ghost cells owned by neigh
561 const auto nVerts{this->ghostVerticesPerOwner_[neigh].size()};
562 MPI_Sendrecv(&nVerts, 1, ttk::getMPIType(nVerts), neigh, ttk::MPIrank_,
563 &nOwnedGhostVerticesPerRank[neigh], 1, ttk::getMPIType(nVerts),
564 neigh, neigh, ttk::MPIcomm_, MPI_STATUS_IGNORE);
565 this->remoteGhostVertices_[neigh].resize(nOwnedGhostVerticesPerRank[neigh]);
566
567 // 2. send to neigh list of ghost cells owned by neigh
568 MPI_Sendrecv(this->ghostVerticesPerOwner_[neigh].data(),
569 this->ghostVerticesPerOwner_[neigh].size(), MIT, neigh,
570 ttk::MPIrank_, this->remoteGhostVertices_[neigh].data(),
571 this->remoteGhostVertices_[neigh].size(), MIT, neigh, neigh,
572 ttk::MPIcomm_, MPI_STATUS_IGNORE);
573 }
574
575 this->hasPreconditionedExchangeGhostVertices_ = true;
576 return 0;
577}
578#endif
#define TTK_TRIANGULATION_INTERNAL(NAME)
int ImplicitTriangulationCRTP< Derived >::TTK_TRIANGULATION_INTERNAL getEdgeStar(const SimplexId &edgeId, const int &localStarId, SimplexId &starId) const
SimplexId ImplicitTriangulationCRTP< Derived >::TTK_TRIANGULATION_INTERNAL getTriangleStarNumber(const SimplexId &triangleId) const
SimplexId ImplicitTriangulationCRTP< Derived >::TTK_TRIANGULATION_INTERNAL getEdgeStarNumber(const SimplexId &edgeId) const
int ImplicitTriangulationCRTP< Derived >::TTK_TRIANGULATION_INTERNAL getTriangleStar(const SimplexId &triangleId, const int &localStarId, SimplexId &starId) const
virtual SimplexId getVertexEdgeNumberInternal(const SimplexId &ttkNotUsed(vertexId)) const
virtual int getEdgeVertexInternal(const SimplexId &ttkNotUsed(edgeId), const int &ttkNotUsed(localVertexId), SimplexId &ttkNotUsed(vertexId)) const
virtual SimplexId getVertexTriangleNumberInternal(const SimplexId &ttkNotUsed(vertexId)) const
virtual int getVertexTriangleInternal(const SimplexId &ttkNotUsed(vertexId), const int &ttkNotUsed(localTriangleId), SimplexId &ttkNotUsed(triangleId)) const
virtual int getTriangleVertexInternal(const SimplexId &ttkNotUsed(triangleId), const int &ttkNotUsed(localVertexId), SimplexId &ttkNotUsed(vertexId)) const
virtual int getVertexEdgeInternal(const SimplexId &ttkNotUsed(vertexId), const int &ttkNotUsed(localEdgeId), SimplexId &ttkNotUsed(edgeId)) const
void setDebugMsgPrefix(const std::string &prefix)
Definition Debug.h:364
SimplexId findEdgeFromVertices(const SimplexId v0, const SimplexId v1) const
SimplexId findTriangleFromVertices(std::array< SimplexId, 3 > &verts) const
COMMON_EXPORTS int MPIsize_
Definition BaseClass.cpp:10
int SimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:22
COMMON_EXPORTS int MPIrank_
Definition BaseClass.cpp:9
long long int LongSimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:15