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