ViennaLS
Loading...
Searching...
No Matches
lsPointData.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <cstdint>
6#include <utility>
7#include <vector>
8
9#include <lsConcepts.hpp>
10
11#include <vcLogger.hpp>
12#include <vcSmartPointer.hpp>
13
14namespace viennals {
15
16using namespace viennacore;
17
19template <class T = double,
21class PointData {
22public:
23 typedef std::vector<T> ScalarDataType;
24 typedef std::vector<Vec3D<T>> VectorDataType;
25
26private:
27 std::vector<ScalarDataType> scalarData;
28 std::vector<std::string> scalarDataLabels;
29 std::vector<VectorDataType> vectorData;
30 std::vector<std::string> vectorDataLabels;
31
32 template <class VectorType, class ReturnType = std::conditional_t<
33 std::is_const_v<VectorType>,
34 const typename VectorType::value_type *,
35 typename VectorType::value_type *>>
36 static ReturnType indexPointerOrNull(VectorType &v, int index) {
37 if (index >= 0 && index < v.size())
38 return &(v[index]);
39 else
40 Logger::getInstance()
41 .addWarning("PointData: Tried to access out of bounds index! "
42 "Returned nullptr instead.")
43 .print();
44 return nullptr;
45 }
46
47 template <class DataType>
48 static void appendTranslateData(DataType &currentData, const DataType &source,
49 const std::vector<unsigned> &indices) {
50 currentData.reserve(currentData.size() + indices.size());
51 for (unsigned int index : indices) {
52 currentData.push_back(source[index]);
53 }
54 }
55
56public:
57 template <class... Args> static auto New(Args &&...args) {
58 return SmartPointer<PointData>::New(std::forward<Args>(args)...);
59 }
60
63 const std::string &label = "Scalars") {
64 scalarData.push_back(scalars);
65 scalarDataLabels.push_back(label);
66 }
67
70 const std::string &label = "Scalars") {
71 scalarData.push_back(std::move(scalars));
72 scalarDataLabels.push_back(label);
73 }
74
77 const std::string &label = "Vectors") {
78 vectorData.push_back(vectors);
79 vectorDataLabels.push_back(label);
80 }
81
84 const std::string &label = "Vectors") {
85 vectorData.push_back(std::move(vectors));
86 vectorDataLabels.push_back(label);
87 }
88
91 const std::string &label = "Scalars") {
92 if (int i = getScalarDataIndex(label); i != -1) {
93 scalarData[i] = scalars;
94 } else {
95 insertNextScalarData(scalars, label);
96 }
97 }
98
101 const std::string &label = "Scalars") {
102 if (int i = getScalarDataIndex(label); i != -1) {
103 scalarData[i] = std::move(scalars);
104 } else {
105 insertNextScalarData(std::move(scalars), label);
106 }
107 }
108
111 const std::string &label = "Vectors") {
112 if (int i = getVectorDataIndex(label); i != -1) {
113 vectorData[i] = vectors;
114 } else {
115 insertNextVectorData(vectors, label);
116 }
117 }
118
121 std::string label = "Vectors") {
122 if (int i = getVectorDataIndex(label); i != -1) {
123 vectorData[i] = std::move(vectors);
124 } else {
125 insertNextVectorData(std::move(vectors), label);
126 }
127 }
128
130 unsigned getScalarDataSize() const { return scalarData.size(); }
131
133 unsigned getVectorDataSize() const { return vectorData.size(); }
134
136 return indexPointerOrNull(scalarData, index);
137 }
138
139 const ScalarDataType *getScalarData(int index) const {
140 return indexPointerOrNull(scalarData, index);
141 }
142
143 ScalarDataType *getScalarData(const std::string &searchLabel,
144 bool noWarning = false) {
145 if (int i = getScalarDataIndex(searchLabel); i != -1) {
146 return &(scalarData[i]);
147 }
148 if (!noWarning)
149 Logger::getInstance()
150 .addWarning("PointData attempted to access scalar data labeled '" +
151 searchLabel +
152 "', which does not exist. Returning nullptr instead.")
153 .print();
154 return nullptr;
155 }
156
157 const ScalarDataType *getScalarData(const std::string &searchLabel,
158 bool noWarning = false) const {
159 if (int i = getScalarDataIndex(searchLabel); i != -1) {
160 return &(scalarData[i]);
161 }
162 if (!noWarning)
163 Logger::getInstance()
164 .addWarning("PointData attempted to access scalar data labeled '" +
165 searchLabel +
166 "', which does not exist. Returning nullptr instead.")
167 .print();
168 return nullptr;
169 }
170
171 int getScalarDataIndex(const std::string &searchLabel) const {
172 for (int i = 0; i < scalarDataLabels.size(); ++i) {
173 if (scalarDataLabels[i] == searchLabel) {
174 return i;
175 }
176 }
177 return -1;
178 }
179
180 std::string getScalarDataLabel(int index) const {
181 return (index >= 0 && index < scalarDataLabels.size())
182 ? scalarDataLabels[index]
183 : "";
184 }
185
186 void setScalarDataLabel(int index, std::string newLabel) {
187 scalarDataLabels[index] = std::move(newLabel);
188 }
189
191 void eraseScalarData(int index) {
192 scalarData.erase(scalarData.begin() + index);
193 scalarDataLabels.erase(scalarDataLabels.begin() + index);
194 }
195
197 return indexPointerOrNull(vectorData, index);
198 }
199
200 const VectorDataType *getVectorData(int index) const {
201 return indexPointerOrNull(vectorData, index);
202 }
203
204 VectorDataType *getVectorData(const std::string &searchLabel,
205 bool noWarning = false) {
206 if (int i = getVectorDataIndex(searchLabel); i != -1) {
207 return &(vectorData[i]);
208 }
209 if (!noWarning)
210 Logger::getInstance()
211 .addWarning("PointData attempted to access vector data labeled '" +
212 searchLabel +
213 "', which does not exist. Returning nullptr instead.")
214 .print();
215 return nullptr;
216 }
217
218 const VectorDataType *getVectorData(const std::string &searchLabel,
219 bool noWarning = false) const {
220 if (int i = getVectorDataIndex(searchLabel); i != -1) {
221 return &(vectorData[i]);
222 }
223 if (!noWarning)
224 Logger::getInstance()
225 .addWarning("PointData attempted to access vector data labeled '" +
226 searchLabel +
227 "', which does not exist. Returning nullptr instead.")
228 .print();
229 return nullptr;
230 }
231
232 int getVectorDataIndex(const std::string &searchLabel) const {
233 for (int i = 0; i < vectorDataLabels.size(); ++i) {
234 if (vectorDataLabels[i] == searchLabel) {
235 return i;
236 }
237 }
238 return -1;
239 }
240
241 std::string getVectorDataLabel(int index) const {
242 return (index >= 0 && index < vectorDataLabels.size())
243 ? vectorDataLabels[index]
244 : "";
245 }
246
247 void setVectorDataLabel(int index, std::string newLabel) {
248 vectorDataLabels[index] = std::move(newLabel);
249 }
250
252 void eraseVectorData(int index) {
253 vectorData.erase(vectorData.begin() + index);
254 vectorDataLabels.erase(vectorDataLabels.begin() + index);
255 }
256
258 void append(const PointData &passedData) {
259 scalarData.insert(scalarData.end(), passedData.scalarData.begin(),
260 passedData.scalarData.end());
261 scalarDataLabels.insert(scalarDataLabels.end(),
262 passedData.scalarDataLabels.begin(),
263 passedData.scalarDataLabels.end());
264 vectorData.insert(vectorData.end(), passedData.vectorData.begin(),
265 passedData.vectorData.end());
266 vectorDataLabels.insert(vectorDataLabels.end(),
267 passedData.vectorDataLabels.begin(),
268 passedData.vectorDataLabels.end());
269 }
270
275 void translateFromData(const PointData &source,
276 const std::vector<unsigned> &indices) {
277 // scalars
278 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
280 auto currentData = --scalarData.end();
281 appendTranslateData(*currentData, source.scalarData[j], indices);
282 }
283
284 // vectors
285 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
287 auto currentData = --vectorData.end();
288 appendTranslateData(*currentData, source.vectorData[j], indices);
289 }
290 }
291
295 const PointData &source,
296 const std::vector<std::vector<unsigned>> &indicesVector) {
297 // scalars
298 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
300 auto currentData = --scalarData.end();
301 for (const auto &i : indicesVector) {
302 appendTranslateData(*currentData, source.scalarData[j], i);
303 }
304 }
305
306 // vectors
307 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
309 auto currentData = --vectorData.end();
310 for (const auto &i : indicesVector) {
311 appendTranslateData(*currentData, source.vectorData[j], i);
312 }
313 }
314 }
315
317 void clear() {
318 scalarData.clear();
319 scalarDataLabels.clear();
320 vectorData.clear();
321 vectorDataLabels.clear();
322 }
323
325 bool empty() { return scalarData.empty() && vectorData.empty(); }
326
328 std::ostream &serialize(std::ostream &stream) {
329 // HEADER
330 // identifier: "PointData"
331 // 4 byte: number of scalar data sets
332 // 4 byte: number of vector data sets
333 stream << "lsPointData";
334 uint32_t numberOfScalarData = scalarData.size();
335 uint32_t numberOfVectorData = vectorData.size();
336 stream.write(reinterpret_cast<const char *>(&numberOfScalarData),
337 sizeof(uint32_t));
338 stream.write(reinterpret_cast<const char *>(&numberOfVectorData),
339 sizeof(uint32_t));
340
341 // Scalar Data
342 {
343 auto labelIt = scalarDataLabels.begin();
344 // iterate over all scalar data sets
345 for (auto data : scalarData) {
346 // write name of scalar data and size of set
347 uint32_t sizeOfName = labelIt->length();
348 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
349 stream << *labelIt;
350 uint32_t numberOfValues = data.size();
351 stream.write(reinterpret_cast<const char *>(&numberOfValues),
352 sizeof(uint32_t));
353 // iterate over scalars in data set
354 for (auto value : data) {
355 stream.write(reinterpret_cast<const char *>(&value),
356 sizeof(typename ScalarDataType::value_type));
357 }
358 ++labelIt;
359 }
360 }
361
362 // Vector Data
363 {
364 auto labelIt = vectorDataLabels.begin();
365 // iterate over all vector data sets
366 for (auto data : vectorData) {
367 // write name of vector data and size of set
368 uint32_t sizeOfName = labelIt->length();
369 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
370 stream << *labelIt;
371 uint32_t numberOfVectors = data.size();
372 stream.write(reinterpret_cast<const char *>(&numberOfVectors),
373 sizeof(uint32_t));
374 // iterate over vectors in data set
375 for (auto vector : data) {
376 // over values in vector
377 for (auto value : vector) {
378 stream.write(
379 reinterpret_cast<const char *>(&value),
380 sizeof(typename VectorDataType::value_type::value_type));
381 }
382 }
383 ++labelIt;
384 }
385 }
386
387 return stream;
388 }
389
391 std::istream &deserialize(std::istream &stream) {
392 char identifier[11];
393 stream.read(identifier, 11);
394 if (std::string(identifier).compare(0, 11, "lsPointData")) {
395 Logger::getInstance()
396 .addWarning("Reading PointData from stream failed. Header could "
397 "not be found.")
398 .print();
399 return stream;
400 }
401
402 // read number of data sets
403 unsigned numberOfScalarData = 0;
404 unsigned numberOfVectorData = 0;
405 stream.read(reinterpret_cast<char *>(&numberOfScalarData),
406 sizeof(uint32_t));
407 stream.read(reinterpret_cast<char *>(&numberOfVectorData),
408 sizeof(uint32_t));
409
410 // read scalar data
411 for (unsigned i = 0; i < numberOfScalarData; ++i) {
412 uint32_t sizeOfName;
413 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
414 std::vector<char> dataLabel(sizeOfName);
415 stream.read(dataLabel.data(), sizeOfName);
416 uint32_t numberOfValues;
417 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
418 ScalarDataType scalarData;
419 scalarData.resize(numberOfValues);
420 // read all scalar values into the data
421 for (auto &value : scalarData) {
422 stream.read(reinterpret_cast<char *>(&value),
423 sizeof(typename ScalarDataType::value_type));
424 }
425 // now add this scalar data to current PointData
426 insertNextScalarData(scalarData,
427 std::string(dataLabel.begin(), dataLabel.end()));
428 }
429
430 // read vector data
431 for (unsigned i = 0; i < numberOfVectorData; ++i) {
432 uint32_t sizeOfName;
433 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
434 std::vector<char> dataLabel(sizeOfName);
435 stream.read(dataLabel.data(), sizeOfName);
436 uint32_t numberOfValues;
437 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
438 VectorDataType vectorData;
439 vectorData.resize(numberOfValues);
440 // read all vector values into the vector data
441 for (auto &vector : vectorData) {
442 for (auto &value : vector) {
443 stream.read(reinterpret_cast<char *>(&value),
444 sizeof(typename VectorDataType::value_type::value_type));
445 }
446 }
447 // now add this scalar data to current PointData
448 insertNextVectorData(vectorData,
449 std::string(dataLabel.begin(), dataLabel.end()));
450 }
451
452 return stream;
453 }
454};
455
456// add all template specialisations for this class
458
459} // namespace viennals
This class holds data associated with points in space.
Definition lsPointData.hpp:21
std::vector< Vec3D< T > > VectorDataType
Definition lsPointData.hpp:24
void clear()
Delete all data stored in this object.
Definition lsPointData.hpp:317
static auto New(Args &&...args)
Definition lsPointData.hpp:57
void setScalarDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:186
int getVectorDataIndex(const std::string &searchLabel) const
Definition lsPointData.hpp:232
int getScalarDataIndex(const std::string &searchLabel) const
Definition lsPointData.hpp:171
void insertReplaceScalarData(ScalarDataType &&scalars, const std::string &label="Scalars")
insert or replace scalar data array
Definition lsPointData.hpp:100
VectorDataType * getVectorData(const std::string &searchLabel, bool noWarning=false)
Definition lsPointData.hpp:204
void eraseScalarData(int index)
Delete the scalar data at index.
Definition lsPointData.hpp:191
void translateFromData(const PointData &source, const std::vector< unsigned > &indices)
Add data in the passed source pointData into this data according to the indices passed....
Definition lsPointData.hpp:275
void insertNextScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:62
void insertReplaceVectorData(VectorDataType &&vectors, std::string label="Vectors")
insert new vector data array
Definition lsPointData.hpp:120
void setVectorDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:247
ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false)
Definition lsPointData.hpp:143
void translateFromMultiData(const PointData &source, const std::vector< std::vector< unsigned > > &indicesVector)
Same as translateFromData, but the indices are given as a vector, as is the case when collecting indi...
Definition lsPointData.hpp:294
std::ostream & serialize(std::ostream &stream)
Serialize PointData into a binary stream.
Definition lsPointData.hpp:328
void append(const PointData &passedData)
Append the passed PointData to this one.
Definition lsPointData.hpp:258
const VectorDataType * getVectorData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:218
const ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:157
std::vector< T > ScalarDataType
Definition lsPointData.hpp:23
unsigned getScalarDataSize() const
get the number of different scalar data arrays saved
Definition lsPointData.hpp:130
VectorDataType * getVectorData(int index)
Definition lsPointData.hpp:196
std::string getScalarDataLabel(int index) const
Definition lsPointData.hpp:180
std::string getVectorDataLabel(int index) const
Definition lsPointData.hpp:241
const VectorDataType * getVectorData(int index) const
Definition lsPointData.hpp:200
ScalarDataType * getScalarData(int index)
Definition lsPointData.hpp:135
const ScalarDataType * getScalarData(int index) const
Definition lsPointData.hpp:139
unsigned getVectorDataSize() const
get the number of different vector data arrays saved
Definition lsPointData.hpp:133
void insertNextScalarData(ScalarDataType &&scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:69
void insertNextVectorData(VectorDataType &&vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:83
void insertReplaceVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert or replace vector data array
Definition lsPointData.hpp:110
bool empty()
Return whether this object is empty.
Definition lsPointData.hpp:325
void insertReplaceScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert or replace scalar data array
Definition lsPointData.hpp:90
void insertNextVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:76
std::istream & deserialize(std::istream &stream)
Deserialize PointData from a binary stream.
Definition lsPointData.hpp:391
void eraseVectorData(int index)
Delete the vector data at index.
Definition lsPointData.hpp:252
#define PRECOMPILE_PRECISION(className)
Definition lsPreCompileMacros.hpp:30
constexpr AssignType assignable
Definition lsConcepts.hpp:10
std::enable_if_t< std::is_floating_point_v< T >, AssignType > IsFloatingPoint
Definition lsConcepts.hpp:22
Definition lsAdvect.hpp:36
double T
Definition pyWrap.cpp:69