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