TTK
Loading...
Searching...
No Matches
DiscreteVectorField.h
Go to the documentation of this file.
1
27
28#pragma once
29
30// base code includes
31#include <DiscreteGradient.h>
32#include <Geometry.h>
34#include <Triangulation.h>
35#include <VisitedMask.h>
36
37#include <algorithm>
38#include <array>
39#include <functional>
40#include <queue>
41#include <set>
42#include <utility>
43
44using ttk::dcg::Cell;
45
46namespace ttk {
47
48 namespace dcvf {
49
51
55 struct CellOutExt : Cell {
56 explicit CellOutExt(const int dim, const SimplexId id) : Cell{dim, id} {
57 }
58 explicit CellOutExt(const int dim,
59 const SimplexId id,
60 const std::array<SimplexId, 3> &lowVerts,
61 const std::array<float, 3> &lowVertWeights,
62 const std::array<uint8_t, 3> &faces)
63 : Cell{dim, id}, lowVerts_{lowVerts},
64 lowVertWeights_{lowVertWeights}, faces_{faces} {
65 }
66
67 // ID values for Outward vertices in current Outward star
68 // (1 for edges, 2 for triangles, 3 for tetras)
69 const std::array<SimplexId, 3> lowVerts_{};
70 // (weightValue for) Outward vertices in current Outward star, align with
71 // lowVerts_ (1 for edges, 2 for triangles, 3 for tetras)
72 const std::array<float, 3> lowVertWeights_{};
73 // indices of faces (cells of dimensions dim_ - 1) in Outward star
74 // structure, only applicable for triangles (2 edge faces) and tetras (3
75 // triangle faces)
76 const std::array<uint8_t, 3> faces_{};
77 // if cell has been paired with another in current Outward star
78 bool paired_{false};
79 };
80
85
91 class DiscreteVectorField : virtual public Debug {
92
93 public:
95 this->setDebugMsgPrefix("DiscreteVectorField");
96#ifdef TTK_ENABLE_MPI
97 hasMPISupport_ = true;
98#endif
99 }
100
105 void setReverseFullOrbit(bool data) {
106 reverseFullOrbit = data;
107 }
108
113 template <typename dataType, typename triangulationType>
114 int buildField(const triangulationType &triangulation);
115
120 template <typename dataType, typename triangulationType>
121 bool compare(const triangulationType &triangulation,
122 SimplexId vertexA,
123 SimplexId vertexB,
124 float &weightValue) const;
125
134 inline void setInputVectorField(const void *const data,
135 const size_t mTime) {
136 inputVectorField_ = std::make_pair(data, mTime);
137 }
138
142 template <typename dataType>
144#ifndef TTK_ENABLE_KAMIKAZE
145 if(inputVectorField_.first == nullptr) {
146 this->printErr(
147 "Attempting to access vector before setting input vector field");
148 return {};
149 }
150#endif
151 vectorValue result;
152 const dataType *dataArray
153 = reinterpret_cast<const dataType *>(inputVectorField_.first);
154 result[0] = static_cast<float>(dataArray[3 * vertex + 0]);
155 result[1] = static_cast<float>(dataArray[3 * vertex + 1]);
156 result[2] = static_cast<float>(dataArray[3 * vertex + 2]);
157
158 return result;
159 }
160
165 if(data != nullptr) {
166 const auto dim{data->getDimensionality()};
167
172 data->preconditionEdges();
173 data->preconditionEdgeStars();
174
176 data->preconditionTriangles();
177 if(dim >= 2) {
179 }
180 if(dim == 2) {
181 data->preconditionCellEdges();
182 } else if(dim == 3) {
188 }
189 }
190 }
191
195 int getDimensionality() const;
196
201 int getNumberOfDimensions() const;
202
206 template <typename triangulationType>
207 SimplexId getNumberOfCells(const int dimension,
208 const triangulationType &triangulation) const;
209
213 template <typename dataType, typename triangulationType>
214 bool isBoundary(const Cell &cell,
215 const triangulationType &triangulation) const;
216
221 bool isCellCritical(const int cellDim, const SimplexId cellId) const;
222 bool isCellCritical(const Cell &cell) const;
223
228 template <typename triangulationType>
229 SimplexId getPairedCell(const Cell &cell,
230 const triangulationType &triangulation,
231 bool isReverse = false) const;
232
236 template <typename dataType, typename triangulationType>
237 int getAscendingPath(const Cell &cell,
238 std::vector<Cell> &vpath,
239 const triangulationType &triangulation,
240 const bool stopOnCycle) const;
241
246 template <typename dataType, typename triangulationType>
247 int getAscendingPathRecursive(const Cell &cell,
248 std::vector<Cell> &vpath,
249 const triangulationType &triangulation,
250 std::vector<char> &previousDescPaths,
251 std::vector<char> &previousAscPaths) const;
252
256 template <typename dataType, typename triangulationType>
257 int getDescendingPath(const Cell &cell,
258 std::vector<Cell> &vpath,
259 const triangulationType &triangulation,
260 const bool stopOnCycle) const;
261
266 template <typename dataType, typename triangulationType>
267 int getDescendingPathRecursive(const Cell &cell,
268 std::vector<Cell> &vpath,
269 const triangulationType &triangulation,
270 std::vector<char> &previousDescPaths,
271 std::vector<char> &previousAscPaths) const;
272
277 template <typename triangulationType>
278 bool getDescendingPathThroughWall(const Cell &saddle2,
279 const Cell &saddle1,
280 const std::vector<bool> &isVisited,
281 std::vector<Cell> *const vpath,
282 const triangulationType &triangulation,
283 const bool stopIfMultiConnected = false,
284 const bool enableCycleDetector
285 = false) const;
286
291 template <typename triangulationType>
293 const Cell &saddle1,
294 const Cell &saddle2,
295 const std::vector<bool> &isVisited,
296 std::vector<Cell> *const vpath,
297 const triangulationType &triangulation) const;
298
302 template <typename triangulationType>
303 int getDescendingWall(const Cell &cell,
304 VisitedMask &mask,
305 const triangulationType &triangulation,
306 std::vector<Cell> *const wall = nullptr,
307 std::vector<SimplexId> *const saddles
308 = nullptr) const;
309
313 template <typename triangulationType>
314 int getAscendingWall(const Cell &cell,
315 VisitedMask &mask,
316 const triangulationType &triangulation,
317 std::vector<Cell> *const wall = nullptr,
318 std::vector<SimplexId> *const saddles
319 = nullptr) const;
320
326 template <typename dataType, typename triangulationType>
329 const triangulationType &triangulation) const;
330
336 template <typename dataType, typename triangulationType>
339 const triangulationType &triangulation) const;
340
349 template <typename dataType, typename triangulationType>
351 const std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
352 std::vector<std::array<float, 3>> &points,
353 std::vector<char> &cellDimensions,
354 std::vector<SimplexId> &cellIds,
355 std::vector<char> &isOnBoundary,
356 std::vector<SimplexId> &PLVertexIdentifiers,
357 const triangulationType &triangulation) const;
358
363 template <typename dataType, typename triangulationType>
364 int setCriticalPoints(std::vector<std::array<float, 3>> &points,
365 std::vector<char> &cellDimensions,
366 std::vector<SimplexId> &cellIds,
367 std::vector<char> &isOnBoundary,
368 std::vector<SimplexId> &PLVertexIdentifiers,
369 const triangulationType &triangulation) const;
370
374 template <typename triangulationType>
376 std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
377 const triangulationType &triangulation) const;
378
379#ifdef TTK_ENABLE_MPI
383 void setCellToGhost(const int cellDim, const SimplexId cellId);
384
385#endif
389 int setManifoldSize(
390 const std::array<std::vector<SimplexId>, 4> &criticalCellsByDim,
391 const SimplexId *const ascendingManifold,
392 const SimplexId *const descendingManifold,
393 std::vector<SimplexId> &manifoldSize) const;
394
398 template <typename triangulationType>
399 int setVectorGlyphs(std::vector<std::array<float, 3>> &points,
400 std::vector<char> &points_pairOrigins,
401 std::vector<char> &cells_pairTypes,
402 std::vector<SimplexId> &cellsIds,
403 std::vector<char> &cellsDimensions,
404 const triangulationType &triangulation) const;
405
406 private:
410 using outwardStarType = std::array<std::vector<CellOutExt>, 4>;
411
421 template <typename dataType, typename triangulationType>
422 inline void OutwardStar(outwardStarType &os,
423 const SimplexId a,
424 const triangulationType &triangulation) const;
425
435 std::pair<size_t, SimplexId>
436 numUnpairedFaces(const CellOutExt &c, const outwardStarType &ls) const;
437 std::pair<size_t, SimplexId>
438 numUnpairedFacesTriangle(const CellOutExt &c,
439 const outwardStarType &ls) const;
440 std::pair<size_t, SimplexId>
441 numUnpairedFacesTetra(const CellOutExt &c,
442 const outwardStarType &ls) const;
443
450 template <typename triangulationType>
451 inline void pairCells(CellOutExt &alpha,
452 CellOutExt &beta,
453 const triangulationType &triangulation);
454
461 template <typename dataType, typename triangulationType>
462 int processOutwardStars(const triangulationType &triangulation);
463
467 void initMemory(const AbstractTriangulation &triangulation);
468
469 public:
473 template <typename dataType, typename triangulationType>
474 float getPersistence(const std::vector<Cell> &vpath,
475 const triangulationType &triangulation) const;
476
480 template <typename triangulationType>
481 int reverseAscendingPath(const std::vector<Cell> &vpath,
482 const triangulationType &triangulation) const;
483
487 template <typename triangulationType>
488 int reverseDescendingPath(const std::vector<Cell> &vpath,
489 const triangulationType &triangulation) const;
490
494 template <typename triangulationType>
495 int reverseAlternatingPath(const std::vector<Cell> &vpath,
496 const triangulationType &triangulation) const;
497
501 template <typename triangulationType>
503 const std::vector<Cell> &vpath,
504 const triangulationType &triangulation) const;
505
509 template <typename triangulationType>
511 const std::vector<Cell> &vpath,
512 const triangulationType &triangulation) const;
513
514 protected:
518
519 // spare storage for discrete vectors internal structure
520 std::array<std::vector<SimplexId>, 6> localVectors_{};
521 // former cache key (vector field pointer + timestamp)
522 std::pair<const void *, size_t> inputVectorField_{};
523 // pointer to either cache entry corresponding to inputVectorField_ or
524 // localVectors_ (because cache is not implemented)
525 std::array<std::vector<SimplexId>, 6> *vectors_{};
526 };
527
528 } // namespace dcvf
529} // namespace ttk
530
AbstractTriangulation is an interface class that defines an interface for efficient traversal methods...
virtual int getDimensionality() const
void setDebugMsgPrefix(const std::string &prefix)
Definition Debug.h:364
int printErr(const std::string &msg, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cerr) const
Definition Debug.h:149
int reverseAscendingPath(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
bool isCellCritical(const int cellDim, const SimplexId cellId) const
int setCriticalPoints(const std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, std::vector< std::array< float, 3 > > &points, std::vector< char > &cellDimensions, std::vector< SimplexId > &cellIds, std::vector< char > &isOnBoundary, std::vector< SimplexId > &PLVertexIdentifiers, const triangulationType &triangulation) const
std::array< std::vector< SimplexId >, 6 > localVectors_
int getAscendingWall(const Cell &cell, VisitedMask &mask, const triangulationType &triangulation, std::vector< Cell > *const wall=nullptr, std::vector< SimplexId > *const saddles=nullptr) const
SimplexId getPairedCell(const Cell &cell, const triangulationType &triangulation, bool isReverse=false) const
vectorValue getVectorValueAt(SimplexId &vertex) const
std::pair< const void *, size_t > inputVectorField_
std::array< std::vector< SimplexId >, 6 > * vectors_
int getDescendingPathRecursive(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation, std::vector< char > &previousDescPaths, std::vector< char > &previousAscPaths) const
int reverseDescendingPathOnWall(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
float getPersistence(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int getCriticalPoints(std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, const triangulationType &triangulation) const
SimplexId getCellLowerVertex(const Cell c, const triangulationType &triangulation) const
int getAscendingPath(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation, const bool stopOnCycle) const
SimplexId getNumberOfCells(const int dimension, const triangulationType &triangulation) const
int setVectorGlyphs(std::vector< std::array< float, 3 > > &points, std::vector< char > &points_pairOrigins, std::vector< char > &cells_pairTypes, std::vector< SimplexId > &cellsIds, std::vector< char > &cellsDimensions, const triangulationType &triangulation) const
int setManifoldSize(const std::array< std::vector< SimplexId >, 4 > &criticalCellsByDim, const SimplexId *const ascendingManifold, const SimplexId *const descendingManifold, std::vector< SimplexId > &manifoldSize) const
int buildField(const triangulationType &triangulation)
bool compare(const triangulationType &triangulation, SimplexId vertexA, SimplexId vertexB, float &weightValue) const
void getAscendingPathThroughWall(const Cell &saddle1, const Cell &saddle2, const std::vector< bool > &isVisited, std::vector< Cell > *const vpath, const triangulationType &triangulation) const
void preconditionTriangulation(AbstractTriangulation *const data)
bool isBoundary(const Cell &cell, const triangulationType &triangulation) const
int reverseAlternatingPath(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int getDescendingPath(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation, const bool stopOnCycle) const
void setInputVectorField(const void *const data, const size_t mTime)
int getDescendingWall(const Cell &cell, VisitedMask &mask, const triangulationType &triangulation, std::vector< Cell > *const wall=nullptr, std::vector< SimplexId > *const saddles=nullptr) const
SimplexId getCellGreaterVertex(const Cell c, const triangulationType &triangulation) const
int reverseDescendingPath(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int reverseAscendingPathOnWall(const std::vector< Cell > &vpath, const triangulationType &triangulation) const
int getAscendingPathRecursive(const Cell &cell, std::vector< Cell > &vpath, const triangulationType &triangulation, std::vector< char > &previousDescPaths, std::vector< char > &previousAscPaths) const
bool getDescendingPathThroughWall(const Cell &saddle2, const Cell &saddle1, const std::vector< bool > &isVisited, std::vector< Cell > *const vpath, const triangulationType &triangulation, const bool stopIfMultiConnected=false, const bool enableCycleDetector=false) const
SurfaceGeometrySmoother::Point vectorValue
TTK base package defining the standard types.
int SimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:22
CellOutExt(const int dim, const SimplexId id)
Auto-cleaning re-usable graph propagations data structure.
Definition VisitedMask.h:27
Cell()=default
Extended Cell structure for processOutwardStars.
CellOutExt(const int dim, const SimplexId id)
const std::array< float, 3 > lowVertWeights_
const std::array< SimplexId, 3 > lowVerts_
const std::array< uint8_t, 3 > faces_
CellOutExt(const int dim, const SimplexId id, const std::array< SimplexId, 3 > &lowVerts, const std::array< float, 3 > &lowVertWeights, const std::array< uint8_t, 3 > &faces)