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 VIENNACORE_LOG_WARNING("PointData: Tried to access out of bounds index! "
41 "Returning nullptr instead.");
42 return nullptr;
43 }
44
45 template <class DataType>
46 static void appendTranslateData(DataType &currentData, const DataType &source,
47 const std::vector<unsigned> &indices) {
48 currentData.reserve(currentData.size() + indices.size());
49 for (unsigned int index : indices) {
50 currentData.push_back(source[index]);
51 }
52 }
53
54public:
55 template <class... Args> static auto New(Args &&...args) {
56 return SmartPointer<PointData>::New(std::forward<Args>(args)...);
57 }
58
61 const std::string &label = "Scalars") {
62 scalarData.push_back(scalars);
63 scalarDataLabels.push_back(label);
64 }
65
68 const std::string &label = "Scalars") {
69 scalarData.push_back(std::move(scalars));
70 scalarDataLabels.push_back(label);
71 }
72
75 const std::string &label = "Vectors") {
76 vectorData.push_back(vectors);
77 vectorDataLabels.push_back(label);
78 }
79
82 const std::string &label = "Vectors") {
83 vectorData.push_back(std::move(vectors));
84 vectorDataLabels.push_back(label);
85 }
86
89 const std::string &label = "Scalars") {
90 if (int i = getScalarDataIndex(label); i != -1) {
91 scalarData[i] = scalars;
92 } else {
93 insertNextScalarData(scalars, label);
94 }
95 }
96
99 const std::string &label = "Scalars") {
100 if (int i = getScalarDataIndex(label); i != -1) {
101 scalarData[i] = std::move(scalars);
102 } else {
103 insertNextScalarData(std::move(scalars), label);
104 }
105 }
106
109 const std::string &label = "Vectors") {
110 if (int i = getVectorDataIndex(label); i != -1) {
111 vectorData[i] = vectors;
112 } else {
113 insertNextVectorData(vectors, label);
114 }
115 }
116
119 std::string label = "Vectors") {
120 if (int i = getVectorDataIndex(label); i != -1) {
121 vectorData[i] = std::move(vectors);
122 } else {
123 insertNextVectorData(std::move(vectors), label);
124 }
125 }
126
128 unsigned getScalarDataSize() const { return scalarData.size(); }
129
131 unsigned getVectorDataSize() const { return vectorData.size(); }
132
134 return indexPointerOrNull(scalarData, index);
135 }
136
137 const ScalarDataType *getScalarData(int index) const {
138 return indexPointerOrNull(scalarData, index);
139 }
140
141 ScalarDataType *getScalarData(const std::string &searchLabel,
142 bool noWarning = false) {
143 if (int i = getScalarDataIndex(searchLabel); i != -1) {
144 return &(scalarData[i]);
145 }
146 if (!noWarning) {
147 VIENNACORE_LOG_WARNING(
148 "PointData attempted to access scalar data labeled '" + searchLabel +
149 "', which does not exist. Returning nullptr instead.");
150 }
151 return nullptr;
152 }
153
154 const ScalarDataType *getScalarData(const std::string &searchLabel,
155 bool noWarning = false) const {
156 if (int i = getScalarDataIndex(searchLabel); i != -1) {
157 return &(scalarData[i]);
158 }
159 if (!noWarning) {
160 VIENNACORE_LOG_WARNING(
161 "PointData attempted to access scalar data labeled '" + searchLabel +
162 "', which does not exist. Returning nullptr instead.");
163 }
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 VIENNACORE_LOG_WARNING(
207 "PointData attempted to access vector data labeled '" + searchLabel +
208 "', which does not exist. Returning nullptr instead.");
209 }
210 return nullptr;
211 }
212
213 const VectorDataType *getVectorData(const std::string &searchLabel,
214 bool noWarning = false) const {
215 if (int i = getVectorDataIndex(searchLabel); i != -1) {
216 return &(vectorData[i]);
217 }
218 if (!noWarning) {
219 VIENNACORE_LOG_WARNING(
220 "PointData attempted to access vector data labeled '" + searchLabel +
221 "', which does not exist. Returning nullptr instead.");
222 }
223 return nullptr;
224 }
225
226 int getVectorDataIndex(const std::string &searchLabel) const {
227 for (int i = 0; i < vectorDataLabels.size(); ++i) {
228 if (vectorDataLabels[i] == searchLabel) {
229 return i;
230 }
231 }
232 return -1;
233 }
234
235 std::string getVectorDataLabel(int index) const {
236 return (index >= 0 && index < vectorDataLabels.size())
237 ? vectorDataLabels[index]
238 : "";
239 }
240
241 void setVectorDataLabel(int index, std::string newLabel) {
242 vectorDataLabels[index] = std::move(newLabel);
243 }
244
246 void eraseVectorData(int index) {
247 vectorData.erase(vectorData.begin() + index);
248 vectorDataLabels.erase(vectorDataLabels.begin() + index);
249 }
250
252 void append(const PointData &passedData) {
253 scalarData.insert(scalarData.end(), passedData.scalarData.begin(),
254 passedData.scalarData.end());
255 scalarDataLabels.insert(scalarDataLabels.end(),
256 passedData.scalarDataLabels.begin(),
257 passedData.scalarDataLabels.end());
258 vectorData.insert(vectorData.end(), passedData.vectorData.begin(),
259 passedData.vectorData.end());
260 vectorDataLabels.insert(vectorDataLabels.end(),
261 passedData.vectorDataLabels.begin(),
262 passedData.vectorDataLabels.end());
263 }
264
269 void translateFromData(const PointData &source,
270 const std::vector<unsigned> &indices) {
271 // scalars
272 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
274 auto currentData = --scalarData.end();
275 appendTranslateData(*currentData, source.scalarData[j], indices);
276 }
277
278 // vectors
279 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
281 auto currentData = --vectorData.end();
282 appendTranslateData(*currentData, source.vectorData[j], indices);
283 }
284 }
285
289 const PointData &source,
290 const std::vector<std::vector<unsigned>> &indicesVector) {
291 // scalars
292 for (unsigned j = 0; j < source.getScalarDataSize(); ++j) {
294 auto currentData = --scalarData.end();
295 for (const auto &i : indicesVector) {
296 appendTranslateData(*currentData, source.scalarData[j], i);
297 }
298 }
299
300 // vectors
301 for (unsigned j = 0; j < source.getVectorDataSize(); ++j) {
303 auto currentData = --vectorData.end();
304 for (const auto &i : indicesVector) {
305 appendTranslateData(*currentData, source.vectorData[j], i);
306 }
307 }
308 }
309
311 void clear() {
312 scalarData.clear();
313 scalarDataLabels.clear();
314 vectorData.clear();
315 vectorDataLabels.clear();
316 }
317
319 bool empty() { return scalarData.empty() && vectorData.empty(); }
320
322 std::ostream &serialize(std::ostream &stream) {
323 // HEADER
324 // identifier: "PointData"
325 // 4 byte: number of scalar data sets
326 // 4 byte: number of vector data sets
327 stream << "lsPointData";
328 uint32_t numberOfScalarData = scalarData.size();
329 uint32_t numberOfVectorData = vectorData.size();
330 stream.write(reinterpret_cast<const char *>(&numberOfScalarData),
331 sizeof(uint32_t));
332 stream.write(reinterpret_cast<const char *>(&numberOfVectorData),
333 sizeof(uint32_t));
334
335 // Scalar Data
336 {
337 auto labelIt = scalarDataLabels.begin();
338 // iterate over all scalar data sets
339 for (auto data : scalarData) {
340 // write name of scalar data and size of set
341 uint32_t sizeOfName = labelIt->length();
342 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
343 stream << *labelIt;
344 uint32_t numberOfValues = data.size();
345 stream.write(reinterpret_cast<const char *>(&numberOfValues),
346 sizeof(uint32_t));
347 // iterate over scalars in data set
348 for (auto value : data) {
349 stream.write(reinterpret_cast<const char *>(&value),
350 sizeof(typename ScalarDataType::value_type));
351 }
352 ++labelIt;
353 }
354 }
355
356 // Vector Data
357 {
358 auto labelIt = vectorDataLabels.begin();
359 // iterate over all vector data sets
360 for (auto data : vectorData) {
361 // write name of vector data and size of set
362 uint32_t sizeOfName = labelIt->length();
363 stream.write(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
364 stream << *labelIt;
365 uint32_t numberOfVectors = data.size();
366 stream.write(reinterpret_cast<const char *>(&numberOfVectors),
367 sizeof(uint32_t));
368 // iterate over vectors in data set
369 for (auto vector : data) {
370 // over values in vector
371 for (auto value : vector) {
372 stream.write(
373 reinterpret_cast<const char *>(&value),
374 sizeof(typename VectorDataType::value_type::value_type));
375 }
376 }
377 ++labelIt;
378 }
379 }
380
381 return stream;
382 }
383
385 std::istream &deserialize(std::istream &stream) {
386 char identifier[11];
387 stream.read(identifier, 11);
388 if (std::string(identifier).compare(0, 11, "lsPointData")) {
389 Logger::getInstance()
390 .addError("Reading PointData from stream failed. Header could "
391 "not be found.")
392 .print();
393 return stream;
394 }
395
396 // read number of data sets
397 unsigned numberOfScalarData = 0;
398 unsigned numberOfVectorData = 0;
399 stream.read(reinterpret_cast<char *>(&numberOfScalarData),
400 sizeof(uint32_t));
401 stream.read(reinterpret_cast<char *>(&numberOfVectorData),
402 sizeof(uint32_t));
403
404 // read scalar data
405 for (unsigned i = 0; i < numberOfScalarData; ++i) {
406 uint32_t sizeOfName;
407 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
408 std::vector<char> dataLabel(sizeOfName);
409 stream.read(dataLabel.data(), sizeOfName);
410 uint32_t numberOfValues;
411 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
412 ScalarDataType scalarData;
413 scalarData.resize(numberOfValues);
414 // read all scalar values into the data
415 for (auto &value : scalarData) {
416 stream.read(reinterpret_cast<char *>(&value),
417 sizeof(typename ScalarDataType::value_type));
418 }
419 // now add this scalar data to current PointData
420 insertNextScalarData(scalarData,
421 std::string(dataLabel.begin(), dataLabel.end()));
422 }
423
424 // read vector data
425 for (unsigned i = 0; i < numberOfVectorData; ++i) {
426 uint32_t sizeOfName;
427 stream.read(reinterpret_cast<char *>(&sizeOfName), sizeof(uint32_t));
428 std::vector<char> dataLabel(sizeOfName);
429 stream.read(dataLabel.data(), sizeOfName);
430 uint32_t numberOfValues;
431 stream.read(reinterpret_cast<char *>(&numberOfValues), sizeof(uint32_t));
432 VectorDataType vectorData;
433 vectorData.resize(numberOfValues);
434 // read all vector values into the vector data
435 for (auto &vector : vectorData) {
436 for (auto &value : vector) {
437 stream.read(reinterpret_cast<char *>(&value),
438 sizeof(typename VectorDataType::value_type::value_type));
439 }
440 }
441 // now add this scalar data to current PointData
442 insertNextVectorData(vectorData,
443 std::string(dataLabel.begin(), dataLabel.end()));
444 }
445
446 return stream;
447 }
448};
449
450// add all template specialisations for this class
452
453} // namespace viennals
double T
Definition Epitaxy.cpp:12
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:311
static auto New(Args &&...args)
Definition lsPointData.hpp:55
void setScalarDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:182
int getVectorDataIndex(const std::string &searchLabel) const
Definition lsPointData.hpp:226
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:98
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:269
void insertNextScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:60
void insertReplaceVectorData(VectorDataType &&vectors, std::string label="Vectors")
insert new vector data array
Definition lsPointData.hpp:118
void setVectorDataLabel(int index, std::string newLabel)
Definition lsPointData.hpp:241
ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false)
Definition lsPointData.hpp:141
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:288
std::ostream & serialize(std::ostream &stream)
Serialize PointData into a binary stream.
Definition lsPointData.hpp:322
void append(const PointData &passedData)
Append the passed PointData to this one.
Definition lsPointData.hpp:252
const VectorDataType * getVectorData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:213
const ScalarDataType * getScalarData(const std::string &searchLabel, bool noWarning=false) const
Definition lsPointData.hpp:154
std::vector< T > ScalarDataType
Definition lsPointData.hpp:23
unsigned getScalarDataSize() const
get the number of different scalar data arrays saved
Definition lsPointData.hpp:128
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:235
const VectorDataType * getVectorData(int index) const
Definition lsPointData.hpp:196
ScalarDataType * getScalarData(int index)
Definition lsPointData.hpp:133
const ScalarDataType * getScalarData(int index) const
Definition lsPointData.hpp:137
unsigned getVectorDataSize() const
get the number of different vector data arrays saved
Definition lsPointData.hpp:131
void insertNextScalarData(ScalarDataType &&scalars, const std::string &label="Scalars")
insert new scalar data array
Definition lsPointData.hpp:67
void insertNextVectorData(VectorDataType &&vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:81
void insertReplaceVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert or replace vector data array
Definition lsPointData.hpp:108
bool empty()
Return whether this object is empty.
Definition lsPointData.hpp:319
void insertReplaceScalarData(const ScalarDataType &scalars, const std::string &label="Scalars")
insert or replace scalar data array
Definition lsPointData.hpp:88
void insertNextVectorData(const VectorDataType &vectors, const std::string &label="Vectors")
insert new vector data array
Definition lsPointData.hpp:74
std::istream & deserialize(std::istream &stream)
Deserialize PointData from a binary stream.
Definition lsPointData.hpp:385
void eraseVectorData(int index)
Delete the vector data at index.
Definition lsPointData.hpp:246
#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:37