ViennaLS
Loading...
Searching...
No Matches
lsPointData.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <array>
6#include <cstdint>
7#include <utility>
8#include <vector>
9
10#include <lsConcepts.hpp>
11
12#include <vcLogger.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<std::array<T, 3>> 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:
59 const std::string &label = "Scalars") {
60 scalarData.push_back(scalars);
61 scalarDataLabels.push_back(label);
62 }
63
66 const std::string &label = "Scalars") {
67 scalarData.push_back(std::move(scalars));
68 scalarDataLabels.push_back(label);
69 }
70
73 const std::string &label = "Vectors") {
74 vectorData.push_back(vectors);
75 vectorDataLabels.push_back(label);
76 }
77
80 const std::string &label = "Vectors") {
81 vectorData.push_back(std::move(vectors));
82 vectorDataLabels.push_back(label);
83 }
84
87 const std::string &label = "Scalars") {
88 if (int i = getScalarDataIndex(label); i != -1) {
89 scalarData[i] = scalars;
90 } else {
91 insertNextScalarData(scalars, label);
92 }
93 }
94
97 const std::string &label = "Scalars") {
98 if (int i = getScalarDataIndex(label); i != -1) {
99 scalarData[i] = std::move(scalars);
100 } else {
101 insertNextScalarData(std::move(scalars), label);
102 }
103 }
104
107 const std::string &label = "Vectors") {
108 if (int i = getVectorDataIndex(label); i != -1) {
109 vectorData[i] = vectors;
110 } else {
111 insertNextVectorData(vectors, label);
112 }
113 }
114
117 std::string label = "Vectors") {
118 if (int i = getVectorDataIndex(label); i != -1) {
119 vectorData[i] = std::move(vectors);
120 } else {
121 insertNextVectorData(std::move(vectors), label);
122 }
123 }
124
126 unsigned getScalarDataSize() const { return scalarData.size(); }
127
129 unsigned getVectorDataSize() const { return vectorData.size(); }
130
132 return indexPointerOrNull(scalarData, index);
133 }
134
135 const ScalarDataType *getScalarData(int index) const {
136 return indexPointerOrNull(scalarData, index);
137 }
138
139 ScalarDataType *getScalarData(const std::string &searchLabel,
140 bool noWarning = false) {
141 if (int i = getScalarDataIndex(searchLabel); i != -1) {
142 return &(scalarData[i]);
143 }
144 if (!noWarning)
145 Logger::getInstance()
146 .addWarning("PointData attempted to access scalar data labeled '" +
147 searchLabel +
148 "', which does not exist. Returning nullptr instead.")
149 .print();
150 return nullptr;
151 }
152
153 const ScalarDataType *getScalarData(const std::string &searchLabel,
154 bool noWarning = false) const {
155 if (int i = getScalarDataIndex(searchLabel); i != -1) {
156 return &(scalarData[i]);
157 }
158 if (!noWarning)
159 Logger::getInstance()
160 .addWarning("PointData attempted to access scalar data labeled '" +
161 searchLabel +
162 "', which does not exist. Returning nullptr instead.")
163 .print();
164 return nullptr;
165 }
166
167 int getScalarDataIndex(const std::string &searchLabel) const {
168 for (int i = 0; i < scalarDataLabels.size(); ++i) {
169 if (scalarDataLabels[i] == searchLabel) {
170 return i;
171 }
172 }
173 return -1;
174 }
175
176 std::string getScalarDataLabel(int index) const {
177 return (index >= 0 && index < scalarDataLabels.size())
178 ? scalarDataLabels[index]
179 : "";
180 }
181
182 void setScalarDataLabel(int index, std::string newLabel) {
183 scalarDataLabels[index] = std::move(newLabel);
184 }
185
187 void eraseScalarData(int index) {
188 scalarData.erase(scalarData.begin() + index);
189 scalarDataLabels.erase(scalarDataLabels.begin() + index);
190 }
191
193 return indexPointerOrNull(vectorData, index);
194 }
195
196 const VectorDataType *getVectorData(int index) const {
197 return indexPointerOrNull(vectorData, index);
198 }
199
200 VectorDataType *getVectorData(const std::string &searchLabel,
201 bool noWarning = false) {
202 if (int i = getVectorDataIndex(searchLabel); i != -1) {
203 return &(vectorData[i]);
204 }
205 if (!noWarning)
206 Logger::getInstance()
207 .addWarning("PointData attempted to access vector data labeled '" +
208 searchLabel +
209 "', which does not exist. Returning nullptr instead.")
210 .print();
211 return nullptr;
212 }
213
214 const VectorDataType *getVectorData(const std::string &searchLabel,
215 bool noWarning = false) const {
216 if (int i = getVectorDataIndex(searchLabel); i != -1) {
217 return &(vectorData[i]);
218 }
219 if (!noWarning)
220 Logger::getInstance()
221 .addWarning("PointData attempted to access vector data labeled '" +
222 searchLabel +
223 "', which does not exist. Returning nullptr instead.")
224 .print();
225 return nullptr;
226 }
227
228 int getVectorDataIndex(const std::string &searchLabel) const {
229 for (int i = 0; i < vectorDataLabels.size(); ++i) {
230 if (vectorDataLabels[i] == searchLabel) {
231 return i;
232 }
233 }
234 return -1;
235 }
236
237 std::string getVectorDataLabel(int index) const {
238 return (index >= 0 && index < vectorDataLabels.size())
239 ? vectorDataLabels[index]
240 : "";
241 }
242
243 void setVectorDataLabel(int index, std::string newLabel) {
244 vectorDataLabels[index] = std::move(newLabel);
245 }
246
248 void eraseVectorData(int index) {
249 vectorData.erase(vectorData.begin() + index);
250 vectorDataLabels.erase(vectorDataLabels.begin() + index);
251 }
252
254 void append(const PointData &passedData) {
255 scalarData.insert(scalarData.end(), passedData.scalarData.begin(),
256 passedData.scalarData.end());
257 scalarDataLabels.insert(scalarDataLabels.end(),
258 passedData.scalarDataLabels.begin(),
259 passedData.scalarDataLabels.end());
260 vectorData.insert(vectorData.end(), passedData.vectorData.begin(),
261 passedData.vectorData.end());
262 vectorDataLabels.insert(vectorDataLabels.end(),
263 passedData.vectorDataLabels.begin(),
264 passedData.vectorDataLabels.end());
265 }
266
271 void translateFromData(const PointData &source,
272 const std::vector<unsigned> &indices) {
273 // scalars
274 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
276 auto currentData = --scalarData.end();
277 appendTranslateData(*currentData, source.scalarData[j], indices);
278 }
279
280 // vectors
281 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
283 auto currentData = --vectorData.end();
284 appendTranslateData(*currentData, source.vectorData[j], indices);
285 }
286 }
287
291 const PointData &source,
292 const std::vector<std::vector<unsigned>> &indicesVector) {
293 // scalars
294 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
296 auto currentData = --scalarData.end();
297 for (const auto &i : indicesVector) {
298 appendTranslateData(*currentData, source.scalarData[j], i);
299 }
300 }
301
302 // vectors
303 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
305 auto currentData = --vectorData.end();
306 for (const auto &i : indicesVector) {
307 appendTranslateData(*currentData, source.vectorData[j], i);
308 }
309 }
310 }
311
313 void clear() {
314 scalarData.clear();
315 scalarDataLabels.clear();
316 vectorData.clear();
317 vectorDataLabels.clear();
318 }
319
321 bool empty() { return scalarData.empty() && vectorData.empty(); }
322
324 std::ostream &serialize(std::ostream &stream) {
325 // HEADER
326 // identifier: "PointData"
327 // 4 byte: number of scalar data sets
328 // 4 byte: number of vector data sets
329 stream << "lsPointData";
330 uint32_t numberOfScalarData = scalarData.size();
331 uint32_t numberOfVectorData = vectorData.size();
332 stream.write(reinterpret_cast<const char *>(&numberOfScalarData),
333 sizeof(uint32_t));
334 stream.write(reinterpret_cast<const char *>(&numberOfVectorData),
335 sizeof(uint32_t));
336
337 // Scalar Data
338 {
339 auto labelIt = scalarDataLabels.begin();
340 // iterate over all scalar data sets
341 for (auto data : scalarData) {
342 // write name of scalar data and size of set
343 uint32_t sizeOfName = labelIt->length();
344 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
345 stream << *labelIt;
346 uint32_t numberOfValues = data.size();
347 stream.write(reinterpret_cast<const char *>(&numberOfValues),
348 sizeof(uint32_t));
349 // iterate over scalars in data set
350 for (auto value : data) {
351 stream.write(reinterpret_cast<const char *>(&value),
352 sizeof(typename ScalarDataType::value_type));
353 }
354 ++labelIt;
355 }
356 }
357
358 // Vector Data
359 {
360 auto labelIt = vectorDataLabels.begin();
361 // iterate over all vector data sets
362 for (auto data : vectorData) {
363 // write name of vector data and size of set
364 uint32_t sizeOfName = labelIt->length();
365 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
366 stream << *labelIt;
367 uint32_t numberOfVectors = data.size();
368 stream.write(reinterpret_cast<const char *>(&numberOfVectors),
369 sizeof(uint32_t));
370 // iterate over vectors in data set
371 for (auto vector : data) {
372 // over values in vector
373 for (auto value : vector) {
374 stream.write(
375 reinterpret_cast<const char *>(&value),
376 sizeof(typename VectorDataType::value_type::value_type));
377 }
378 }
379 ++labelIt;
380 }
381 }
382
383 return stream;
384 }
385
387 std::istream &deserialize(std::istream &stream) {
388 char identifier[11];
389 stream.read(identifier, 11);
390 if (std::string(identifier).compare(0, 11, "lsPointData")) {
391 Logger::getInstance()
392 .addWarning("Reading PointData from stream failed. Header could "
393 "not be found.")
394 .print();
395 return stream;
396 }
397
398 // read number of data sets
399 unsigned numberOfScalarData = 0;
400 unsigned numberOfVectorData = 0;
401 stream.read(reinterpret_cast<char *>(&numberOfScalarData),
402 sizeof(uint32_t));
403 stream.read(reinterpret_cast<char *>(&numberOfVectorData),
404 sizeof(uint32_t));
405
406 // read scalar data
407 for (unsigned i = 0; i < numberOfScalarData; ++i) {
408 uint32_t sizeOfName;
409 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
410 std::vector<char> dataLabel(sizeOfName);
411 stream.read(dataLabel.data(), sizeOfName);
412 uint32_t numberOfValues;
413 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
414 ScalarDataType scalarData;
415 scalarData.resize(numberOfValues);
416 // read all scalar values into the data
417 for (auto &value : scalarData) {
418 stream.read(reinterpret_cast<char *>(&value),
419 sizeof(typename ScalarDataType::value_type));
420 }
421 // now add this scalar data to current PointData
422 insertNextScalarData(scalarData,
423 std::string(dataLabel.begin(), dataLabel.end()));
424 }
425
426 // read vector data
427 for (unsigned i = 0; i < numberOfVectorData; ++i) {
428 uint32_t sizeOfName;
429 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
430 std::vector<char> dataLabel(sizeOfName);
431 stream.read(dataLabel.data(), sizeOfName);
432 uint32_t numberOfValues;
433 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
434 VectorDataType vectorData;
435 vectorData.resize(numberOfValues);
436 // read all vector values into the vector data
437 for (auto &vector : vectorData) {
438 for (auto &value : vector) {
439 stream.read(reinterpret_cast<char *>(&value),
440 sizeof(typename VectorDataType::value_type::value_type));
441 }
442 }
443 // now add this scalar data to current PointData
444 insertNextVectorData(vectorData,
445 std::string(dataLabel.begin(), dataLabel.end()));
446 }
447
448 return stream;
449 }
450};
451
452// add all template specialisations for this class
454
455} // namespace viennals
This class holds data associated with points in space.
Definition lsPointData.hpp:21
void clear()
Delete all data stored in this object.
Definition lsPointData.hpp:313
void setScalarDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:182
int getVectorDataIndex(const std::string &searchLabel) const
Definition lsPointData.hpp:228
std::vector< std::array< T, 3 > > VectorDataType
Definition lsPointData.hpp:24
int getScalarDataIndex(const std::string &searchLabel) const
Definition lsPointData.hpp:167
void insertReplaceScalarData(ScalarDataType &&scalars, const std::string &label="Scalars")
insert or replace scalar data array
Definition lsPointData.hpp:96
VectorDataType * getVectorData(const std::string &searchLabel, bool noWarning=false)
Definition lsPointData.hpp:200
void eraseScalarData(int index)
Delete the scalar data at index.
Definition lsPointData.hpp:187
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:271
void insertNextScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:58
void insertReplaceVectorData(VectorDataType &&vectors, std::string label="Vectors")
insert new vector data array
Definition lsPointData.hpp:116
void setVectorDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:243
ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false)
Definition lsPointData.hpp:139
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:290
std::ostream & serialize(std::ostream &stream)
Serialize PointData into a binary stream.
Definition lsPointData.hpp:324
void append(const PointData &passedData)
Append the passed PointData to this one.
Definition lsPointData.hpp:254
const VectorDataType * getVectorData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:214
const ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:153
std::vector< T > ScalarDataType
Definition lsPointData.hpp:23
unsigned getScalarDataSize() const
get the number of different scalar data arrays saved
Definition lsPointData.hpp:126
VectorDataType * getVectorData(int index)
Definition lsPointData.hpp:192
std::string getScalarDataLabel(int index) const
Definition lsPointData.hpp:176
std::string getVectorDataLabel(int index) const
Definition lsPointData.hpp:237
const VectorDataType * getVectorData(int index) const
Definition lsPointData.hpp:196
ScalarDataType * getScalarData(int index)
Definition lsPointData.hpp:131
const ScalarDataType * getScalarData(int index) const
Definition lsPointData.hpp:135
unsigned getVectorDataSize() const
get the number of different vector data arrays saved
Definition lsPointData.hpp:129
void insertNextScalarData(ScalarDataType &&scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:65
void insertNextVectorData(VectorDataType &&vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:79
void insertReplaceVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert or replace vector data array
Definition lsPointData.hpp:106
bool empty()
Return whether this object is empty.
Definition lsPointData.hpp:321
void insertReplaceScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert or replace scalar data array
Definition lsPointData.hpp:86
void insertNextVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:72
std::istream & deserialize(std::istream &stream)
Deserialize PointData from a binary stream.
Definition lsPointData.hpp:387
void eraseVectorData(int index)
Delete the vector data at index.
Definition lsPointData.hpp:248
#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:65