TTK
Loading...
Searching...
No Matches
ttkPersistenceDiagram.cpp
Go to the documentation of this file.
1#include <vtkCellData.h>
2#include <vtkDataSet.h>
3#include <vtkDoubleArray.h>
4#include <vtkFloatArray.h>
5#include <vtkIdTypeArray.h>
6#include <vtkInformation.h>
7#include <vtkNew.h>
8#include <vtkPointData.h>
9#include <vtkSmartPointer.h>
10
13#include <ttkUtils.h>
14
16
18 SetNumberOfInputPorts(1);
19 SetNumberOfOutputPorts(1);
20}
21
23 vtkInformation *info) {
24 if(port == 0) {
25 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet");
26 return 1;
27 }
28 return 0;
29}
30
32 vtkInformation *info) {
33 if(port == 0) {
34 info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkUnstructuredGrid");
35 return 1;
36 }
37 return 0;
38}
39
40template <typename scalarType, typename triangulationType>
41int ttkPersistenceDiagram::dispatch(
42 vtkUnstructuredGrid *outputCTPersistenceDiagram,
43 vtkDataArray *const inputScalarsArray,
44 const scalarType *const inputScalars,
45 scalarType *outputScalars,
46 SimplexId *outputOffsets,
47 int *outputMonotonyOffsets,
48 const SimplexId *const inputOrder,
49 const triangulationType *triangulation) {
50
51 int status{};
52 ttk::DiagramType CTDiagram{};
53
55 std::cout << "Chosen approx" << std::endl;
56 double *range = inputScalarsArray->GetRange(0);
57 this->setDeltaApproximate(range[1] - range[0]);
58 this->setOutputScalars(outputScalars);
59 this->setOutputOffsets(outputOffsets);
60 this->setOutputMonotonyOffsets(outputMonotonyOffsets);
61 }
62
63 status = this->execute(CTDiagram, inputScalars, inputScalarsArray->GetMTime(),
64 inputOrder, triangulation);
65
66 // something wrong in baseCode
67 if(status != 0) {
68 this->printErr("PersistenceDiagram::execute() error code: "
69 + std::to_string(status));
70 return 0;
71 }
72#ifdef TTK_ENABLE_MPI
73 if(!ttk::isRunningWithMPI())
74#endif
75 if(CTDiagram.empty()) {
76 this->printErr("Empty diagram!");
77 return 0;
78 }
79
80 vtkNew<vtkUnstructuredGrid> const vtu{};
81
82 // convert CTDiagram to vtkUnstructuredGrid
83#if defined(TTK_ENABLE_MPI) && defined(TTK_ENABLE_OPENMP)
84 if(!ttk::isRunningWithMPI()) {
85 DiagramToVTU(vtu, CTDiagram, inputScalarsArray, *this,
86 triangulation->getDimensionality(), this->ShowInsideDomain);
87 } else {
88 DiagramToDistributedVTU(vtu, CTDiagram, inputScalarsArray, *this,
89 triangulation->getDimensionality(),
90 this->ShowInsideDomain);
91 }
92#else
93 DiagramToVTU(vtu, CTDiagram, inputScalarsArray, *this,
94 triangulation->getDimensionality(), this->ShowInsideDomain);
95#endif
96 outputCTPersistenceDiagram->ShallowCopy(vtu);
97
98 if(this->ClearDGCache
101 this->printMsg("Clearing DiscreteGradient cache...");
103 }
104
105 return 1;
106}
107
109 vtkInformationVector **inputVector,
110 vtkInformationVector *outputVector) {
111
112 vtkDataSet *input = vtkDataSet::GetData(inputVector[0]);
113 vtkUnstructuredGrid *outputCTPersistenceDiagram
114 = vtkUnstructuredGrid::GetData(outputVector, 0);
115
117#ifndef TTK_ENABLE_KAMIKAZE
118 if(!triangulation) {
119 this->printErr("Wrong triangulation");
120 return 0;
121 }
122#endif
123
124 this->preconditionTriangulation(triangulation);
125
126 vtkDataArray *inputScalars = this->GetInputArrayToProcess(0, inputVector);
127#ifndef TTK_ENABLE_KAMIKAZE
128 if(!inputScalars) {
129 this->printErr("Wrong input scalars");
130 return 0;
131 }
132#endif
133
134 vtkDataArray *offsetField = this->GetOrderArray(
135 input, 0, triangulation, true, 1, ForceInputOffsetScalarField);
136
137#ifndef TTK_ENABLE_KAMIKAZE
138 if(!offsetField) {
139 this->printErr("Wrong input offsets");
140 return 0;
141 }
142 if(offsetField->GetDataType() != VTK_INT
143 and offsetField->GetDataType() != VTK_ID_TYPE) {
144 this->printErr("Input offset field type not supported");
145 return 0;
146 }
147#endif
148
149 vtkNew<ttkSimplexIdTypeArray> outputOffsets{};
150 outputOffsets->SetNumberOfComponents(1);
151 outputOffsets->SetNumberOfTuples(inputScalars->GetNumberOfTuples());
152 outputOffsets->SetName("outputOffsets");
153
154 vtkNew<vtkIntArray> outputMonotonyOffsets{};
155 outputMonotonyOffsets->SetNumberOfComponents(1);
156 outputMonotonyOffsets->SetNumberOfTuples(inputScalars->GetNumberOfTuples());
157 outputMonotonyOffsets->SetName("outputMonotonyffsets");
158 outputMonotonyOffsets->FillComponent(0, 0);
159
160 vtkSmartPointer<vtkDataArray> const outputScalars
161 = vtkSmartPointer<vtkDataArray>::Take(inputScalars->NewInstance());
162 outputScalars->SetNumberOfComponents(1);
163 outputScalars->SetNumberOfTuples(inputScalars->GetNumberOfTuples());
164 outputScalars->DeepCopy(inputScalars);
165 outputScalars->SetName("Cropped");
166
167 int status{};
169 inputScalars->GetDataType(), triangulation->getType(),
170 status = this->dispatch(
171 outputCTPersistenceDiagram, inputScalars,
172 static_cast<VTK_TT *>(ttkUtils::GetVoidPointer(inputScalars)),
173 static_cast<VTK_TT *>(ttkUtils::GetVoidPointer(outputScalars)),
174 static_cast<SimplexId *>(ttkUtils::GetVoidPointer(outputOffsets)),
175 static_cast<int *>(ttkUtils::GetVoidPointer(outputMonotonyOffsets)),
176 static_cast<SimplexId *>(ttkUtils::GetVoidPointer(offsetField)),
177 static_cast<TTK_TT *>(triangulation->getData())));
178
179 // shallow copy input Field Data
180 outputCTPersistenceDiagram->GetFieldData()->ShallowCopy(
181 input->GetFieldData());
182
183 return status;
184}
#define ttkNotUsed(x)
Mark function/method parameters that are not used in the function body at all.
Definition BaseClass.h:47
ttk::Triangulation * GetTriangulation(vtkDataSet *dataSet)
vtkDataArray * GetOrderArray(vtkDataSet *const inputData, const int scalarArrayIdx, ttk::Triangulation *triangulation, const bool getGlobalOrder=false, const int orderArrayIdx=0, const bool enforceOrderArrayIdx=false)
TTK VTK-filter for the computation of persistence diagrams.
int FillInputPortInformation(int port, vtkInformation *info) override
int FillOutputPortInformation(int port, vtkInformation *info) override
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
static void * GetVoidPointer(vtkDataArray *array, vtkIdType start=0)
Definition ttkUtils.cpp:226
int printErr(const std::string &msg, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cerr) const
Definition Debug.h:149
void setOutputMonotonyOffsets(void *data)
void preconditionTriangulation(AbstractTriangulation *triangulation)
void setDeltaApproximate(double data)
void setOutputScalars(void *data)
int execute(std::vector< PersistencePair > &CTDiagram, const scalarType *inputScalars, const size_t scalarsMTime, const SimplexId *inputOffsets, const triangulationType *triangulation, const std::vector< bool > *updateMask=nullptr)
void setOutputOffsets(void *data)
Triangulation is a class that provides time and memory efficient traversal methods on triangulations ...
AbstractTriangulation * getData()
Triangulation::Type getType() const
static void clearCache(const AbstractTriangulation &triangulation)
int SimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:22
std::vector< PersistencePair > DiagramType
Persistence Diagram type as a vector of Persistence pairs.
#define ttkVtkTemplateMacro(dataType, triangulationType, call)
Definition ttkMacros.h:69
int DiagramToVTU(vtkUnstructuredGrid *vtu, const ttk::DiagramType &diagram, vtkDataArray *const inputScalars, const ttk::Debug &dbg, const int dim, const bool embedInDomain)
Converts a Persistence Diagram in the ttk::DiagramType format to the VTK Unstructured Grid format (as...
vtkStandardNewMacro(ttkPersistenceDiagram)
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/| (_) |"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)