ViennaLS
Loading...
Searching...
No Matches
lsDomain.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <cstring>
6#include <limits>
7
8#include <hrleDomain.hpp>
9#include <hrleFillDomainWithSignedDistance.hpp>
10
11#include <lsPointData.hpp>
12
13#include <vcLogger.hpp>
14#include <vcSmartPointer.hpp>
15#include <vcVectorType.hpp>
16
17#define LS_DOMAIN_SERIALIZATION_VERSION 0
18
19namespace viennals {
20
21using namespace viennacore;
22
23// Boundary condition alias for easier access
24using BoundaryConditionEnum = viennahrle::BoundaryType;
25
28template <class T, int D> class Domain {
29public:
30 // TYPEDEFS
31 typedef T ValueType;
32 typedef viennahrle::Grid<D> GridType;
33 typedef viennahrle::Domain<T, D> DomainType;
35 typedef std::vector<std::pair<viennahrle::Index<D>, T>> PointValueVectorType;
37 typedef std::vector<bool> VoidPointMarkersType;
38
39private:
40 // PRIVATE MEMBER VARIABLES
41 GridType grid;
42 DomainType domain;
43 int levelSetWidth = 1;
44 PointDataType pointData;
45 VoidPointMarkersType voidPointMarkers;
46
47public:
48 // STATIC CONSTANTS
49 static constexpr int dimensions = D;
50
51 // PUBLIC MEMBER VARIABLES
52 static constexpr T POS_VALUE = std::numeric_limits<T>::max();
53 static constexpr T NEG_VALUE = std::numeric_limits<T>::lowest();
54
56 Domain(viennahrle::CoordType gridDelta = 1.0) {
57 viennahrle::IndexType gridMin[D], gridMax[D];
58 BoundaryType boundaryCons[D];
59 for (unsigned i = 0; i < D; ++i) {
60 gridMin[i] = 0;
61 gridMax[i] = 0;
62 boundaryCons[i] = BoundaryType::INFINITE_BOUNDARY;
63 }
64
65 grid = GridType(gridMin, gridMax, gridDelta, boundaryCons);
66 domain.deepCopy(grid, DomainType(grid, T(POS_VALUE)));
67 }
68
69 Domain(const viennahrle::CoordType *bounds, BoundaryType *boundaryConditions,
70 viennahrle::CoordType gridDelta = 1.0) {
71 viennahrle::IndexType gridMin[D], gridMax[D];
72 for (unsigned i = 0; i < D; ++i) {
73 gridMin[i] = std::floor(bounds[2 * i] / gridDelta);
74 gridMax[i] = std::ceil(bounds[2 * i + 1] / gridDelta);
75 }
76
77 grid = GridType(gridMin, gridMax, gridDelta, boundaryConditions);
78 domain.deepCopy(grid, DomainType(grid, T(POS_VALUE)));
79 }
80
81 Domain(std::vector<viennahrle::CoordType> bounds,
82 std::vector<unsigned> boundaryConditions,
83 viennahrle::CoordType gridDelta = 1.0) {
84 BoundaryType boundaryCons[D];
85 for (unsigned i = 0; i < D; ++i) {
86 boundaryCons[i] = static_cast<BoundaryType>(boundaryConditions[i]);
87 }
88 auto newDomain =
89 SmartPointer<Domain<T, D>>::New(bounds.data(), boundaryCons, gridDelta);
90 this->deepCopy(newDomain);
91 }
92
95 Domain(PointValueVectorType pointData, viennahrle::CoordType *bounds,
96 BoundaryType *boundaryConditions,
97 viennahrle::CoordType gridDelta = 1.0) {
98 auto newDomain =
99 SmartPointer<Domain<T, D>>::New(bounds, boundaryConditions, gridDelta);
100 this->deepCopy(newDomain);
101 viennahrle::FillDomainWithSignedDistance(domain, pointData, T(NEG_VALUE),
102 T(POS_VALUE));
103 }
104
105 Domain(GridType passedGrid) : grid(passedGrid) {
106 domain.deepCopy(grid, DomainType(grid, T(POS_VALUE)));
107 }
108
109 Domain(SmartPointer<Domain> passedDomain) { deepCopy(passedDomain); }
110
111 // Convenience function to create a new domain.
112 template <class... Args> static auto New(Args &&...args) {
113 return SmartPointer<Domain>::New(std::forward<Args>(args)...);
114 }
115
118 void finalize(int newWidth) { levelSetWidth = newWidth; }
119
122 void finalize() {}
123
125 void deepCopy(const SmartPointer<Domain<T, D>> passedDomain) {
126 grid = passedDomain->grid;
127 domain.deepCopy(grid, passedDomain->domain);
128 levelSetWidth = passedDomain->levelSetWidth;
129 pointData = passedDomain->pointData;
130 }
131
136 void insertPoints(PointValueVectorType pointData, bool sort = true) {
137 viennahrle::FillDomainWithSignedDistance(domain, pointData, T(NEG_VALUE),
138 T(POS_VALUE), sort);
139 }
140
142 const GridType &getGrid() const { return grid; }
143
145 GridType &getGrid() { return grid; }
146
148 DomainType &getDomain() { return domain; }
149
150 const DomainType &getDomain() const { return domain; }
151
154 unsigned getNumberOfSegments() const { return domain.getNumberOfSegments(); }
155
157 unsigned getNumberOfPoints() const { return domain.getNumberOfPoints(); }
158
159 int getLevelSetWidth() const { return levelSetWidth; }
160
161 void setLevelSetWidth(int width) { levelSetWidth = width; }
162
163 // clear all additional data
164 void clearMetaData() { pointData.clear(); }
165
167 PointDataType &getPointData() { return pointData; }
168
169 const PointDataType &getPointData() const { return pointData; }
170
172 VoidPointMarkersType &getVoidPointMarkers() { return voidPointMarkers; }
173
175 return voidPointMarkers;
176 }
177
179 void print(std::ostream &out = std::cout) {
180 out << "Grid pointer: " << &grid << std::endl;
181 out << "lsDomain: " << &domain << std::endl;
182 out << "DomainSegments: " << std::endl;
183 for (unsigned i = 0; i < getNumberOfSegments(); ++i) {
184 out << &(domain.getDomainSegment(i)) << std::endl;
185 }
186 domain.print(out);
187 }
188
190 std::ostream &serialize(std::ostream &stream) {
191 // Save header to identify Domain
192 stream << "lsDomain";
193
194 // now write format version number
195 char formatVersion = LS_DOMAIN_SERIALIZATION_VERSION;
196 stream.write(&formatVersion, 1);
197
198 // serialize grid
199 grid.serialize(stream);
200
201 // serialize hrleDomain which saves LS values
202 domain.serialize(stream);
203
204 // serialize Domain members
205 // level set width as 32bit uint
206 const uint32_t width = levelSetWidth;
207 stream.write(reinterpret_cast<const char *>(&width), sizeof(uint32_t));
208
209 // serialize pointData if there is any point data associated with this
210 // Domain mark whether there is point data or not (1/0)
211 char hasPointData = (pointData.empty()) ? 0 : 1;
212 stream.write(&hasPointData, 1);
213 if (hasPointData == 1) {
214 pointData.serialize(stream);
215 }
216
217 return stream;
218 }
219
221 std::istream &deserialize(std::istream &stream) {
222 // Check identifier
223 char identifier[8];
224 stream.read(identifier, 8);
225 if (std::memcmp(identifier, "lsDomain", 8) != 0) {
226 Logger::getInstance()
227 .addError(
228 "Reading Domain from stream failed. Header could not be found.")
229 .print();
230 return stream;
231 }
232
233 // check format version for compatibility
234 char formatVersion;
235 stream.read(&formatVersion, 1);
236 if (formatVersion > LS_DOMAIN_SERIALIZATION_VERSION) {
237 Logger::getInstance()
238 .addError("Reading Domain of version " +
239 std::to_string(formatVersion) + " with reader of version " +
240 std::to_string(LS_DOMAIN_SERIALIZATION_VERSION) +
241 " failed.")
242 .print();
243 return stream;
244 }
245
246 // read in the grid
247 grid.deserialize(stream);
248
249 // read in the hrleDoamin
250 // grid pointer in hrleDomain is implicitly set
251 // to the correct grid already since they were
252 // initialized together
253 domain.deserialize(stream);
254
255 // read in the level set width
256 uint32_t width;
257 stream.read(reinterpret_cast<char *>(&width), sizeof(uint32_t));
258 levelSetWidth = width;
259
260 // check wether there is point data to read
261 char hasPointData;
262 stream.read(&hasPointData, 1);
263 if (hasPointData == 1) {
264 pointData.clear();
265 pointData.deserialize(stream);
266 }
267
268 return stream;
269 }
270};
271
272// add all template specialisations for this class
274
275} // namespace viennals
constexpr int D
Definition Epitaxy.cpp:11
double T
Definition Epitaxy.cpp:12
std::vector< std::pair< viennahrle::Index< D >, T > > PointValueVectorType
Definition lsDomain.hpp:35
Domain(std::vector< viennahrle::CoordType > bounds, std::vector< unsigned > boundaryConditions, viennahrle::CoordType gridDelta=1.0)
Definition lsDomain.hpp:81
viennahrle::Domain< T, D > DomainType
Definition lsDomain.hpp:33
Domain(PointValueVectorType pointData, viennahrle::CoordType *bounds, BoundaryType *boundaryConditions, viennahrle::CoordType gridDelta=1.0)
initialise Domain with domain size "bounds", filled with point/value pairs in pointData
Definition lsDomain.hpp:95
Domain(const viennahrle::CoordType *bounds, BoundaryType *boundaryConditions, viennahrle::CoordType gridDelta=1.0)
Definition lsDomain.hpp:69
viennahrle::Grid< D > GridType
Definition lsDomain.hpp:32
static constexpr T NEG_VALUE
Definition lsDomain.hpp:53
T ValueType
Definition lsDomain.hpp:31
void clearMetaData()
Definition lsDomain.hpp:164
void deepCopy(const SmartPointer< Domain< T, D > > passedDomain)
copy all values of "passedDomain" to this Domain
Definition lsDomain.hpp:125
unsigned getNumberOfSegments() const
returns the number of segments, the levelset is split into. This is useful for algorithm parallelisat...
Definition lsDomain.hpp:154
void finalize()
this function finalizes the levelset, so it is ready for use by other algorithms
Definition lsDomain.hpp:122
void print(std::ostream &out=std::cout)
prints basic information and all memebers of the levelset structure
Definition lsDomain.hpp:179
std::vector< bool > VoidPointMarkersType
Definition lsDomain.hpp:37
PointData< T > PointDataType
Definition lsDomain.hpp:36
void finalize(int newWidth)
this function sets a new levelset width and finalizes the levelset, so it is ready for use by other a...
Definition lsDomain.hpp:118
Domain(SmartPointer< Domain > passedDomain)
Definition lsDomain.hpp:109
static constexpr T POS_VALUE
Definition lsDomain.hpp:52
BoundaryConditionEnum BoundaryType
Definition lsDomain.hpp:34
const DomainType & getDomain() const
Definition lsDomain.hpp:150
VoidPointMarkersType & getVoidPointMarkers()
get reference to the voidPoints markers for all points
Definition lsDomain.hpp:172
const VoidPointMarkersType & getVoidPointMarkers() const
Definition lsDomain.hpp:174
const PointDataType & getPointData() const
Definition lsDomain.hpp:169
PointDataType & getPointData()
get reference to point data saved in the level set
Definition lsDomain.hpp:167
DomainType & getDomain()
get const reference to the underlying hrleDomain data structure
Definition lsDomain.hpp:148
Domain(GridType passedGrid)
Definition lsDomain.hpp:105
int getLevelSetWidth() const
Definition lsDomain.hpp:159
Domain(viennahrle::CoordType gridDelta=1.0)
initalise an empty infinite Domain
Definition lsDomain.hpp:56
std::istream & deserialize(std::istream &stream)
Deserialize Domain from binary stream.
Definition lsDomain.hpp:221
GridType & getGrid()
get mutable reference to the grid on which the level set is defined
Definition lsDomain.hpp:145
static auto New(Args &&...args)
Definition lsDomain.hpp:112
const GridType & getGrid() const
get reference to the grid on which the levelset is defined
Definition lsDomain.hpp:142
unsigned getNumberOfPoints() const
returns the number of defined points
Definition lsDomain.hpp:157
std::ostream & serialize(std::ostream &stream)
Serializes the Domain into a binary stream.
Definition lsDomain.hpp:190
void setLevelSetWidth(int width)
Definition lsDomain.hpp:161
void insertPoints(PointValueVectorType pointData, bool sort=true)
re-initalise Domain with the point/value pairs in pointData This is similar to lsFromMesh with the di...
Definition lsDomain.hpp:136
static constexpr int dimensions
Definition lsDomain.hpp:49
This class holds data associated with points in space.
Definition lsPointData.hpp:22
#define LS_DOMAIN_SERIALIZATION_VERSION
Definition lsDomain.hpp:17
#define PRECOMPILE_PRECISION_DIMENSION(className)
Definition lsPreCompileMacros.hpp:24
Definition lsAdvect.hpp:41
viennahrle::BoundaryType BoundaryConditionEnum
Definition lsDomain.hpp:24