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
112 void finalize(int newWidth) { levelSetWidth = newWidth; }
113
116 void finalize() {}
117
119 void deepCopy(const SmartPointer<Domain<T, D>> passedDomain) {
120 grid = passedDomain->grid;
121 domain.deepCopy(grid, passedDomain->domain);
122 levelSetWidth = passedDomain->levelSetWidth;
123 pointData = passedDomain->pointData;
124 }
125
130 void insertPoints(PointValueVectorType pointData, bool sort = true) {
131 viennahrle::FillDomainWithSignedDistance(domain, pointData, T(NEG_VALUE),
132 T(POS_VALUE), sort);
133 }
134
136 const GridType &getGrid() const { return grid; }
137
139 GridType &getGrid() { return grid; }
140
142 DomainType &getDomain() { return domain; }
143
144 const DomainType &getDomain() const { return domain; }
145
148 unsigned getNumberOfSegments() const { return domain.getNumberOfSegments(); }
149
151 unsigned getNumberOfPoints() const { return domain.getNumberOfPoints(); }
152
153 int getLevelSetWidth() const { return levelSetWidth; }
154
155 void setLevelSetWidth(int width) { levelSetWidth = width; }
156
157 // clear all additional data
158 void clearMetaData() { pointData.clear(); }
159
161 PointDataType &getPointData() { return pointData; }
162
163 const PointDataType &getPointData() const { return pointData; }
164
166 VoidPointMarkersType &getVoidPointMarkers() { return voidPointMarkers; }
167
169 return voidPointMarkers;
170 }
171
173 void print(std::ostream &out = std::cout) {
174 out << "Grid pointer: " << &grid << std::endl;
175 out << "lsDomain: " << &domain << std::endl;
176 out << "DomainSegments: " << std::endl;
177 for (unsigned i = 0; i < getNumberOfSegments(); ++i) {
178 out << &(domain.getDomainSegment(i)) << std::endl;
179 }
180 domain.print(out);
181 }
182
184 std::ostream &serialize(std::ostream &stream) {
185 // Save header to identify Domain
186 stream << "lsDomain";
187
188 // now write format version number
189 char formatVersion = LS_DOMAIN_SERIALIZATION_VERSION;
190 stream.write(&formatVersion, 1);
191
192 // serialize grid
193 grid.serialize(stream);
194
195 // serialize hrleDomain which saves LS values
196 domain.serialize(stream);
197
198 // serialize Domain members
199 // level set width as 32bit uint
200 const uint32_t width = levelSetWidth;
201 stream.write(reinterpret_cast<const char *>(&width), sizeof(uint32_t));
202
203 // serialize pointData if there is any point data associated with this
204 // Domain mark whether there is point data or not (1/0)
205 char hasPointData = (pointData.empty()) ? 0 : 1;
206 stream.write(&hasPointData, 1);
207 if (hasPointData == 1) {
208 pointData.serialize(stream);
209 }
210
211 return stream;
212 }
213
215 std::istream &deserialize(std::istream &stream) {
216 // Check identifier
217 char identifier[8];
218 stream.read(identifier, 8);
219 if (std::string(identifier).compare(0, 8, "lsDomain")) {
220 Logger::getInstance()
221 .addWarning(
222 "Reading Domain from stream failed. Header could not be found.")
223 .print();
224 return stream;
225 }
226
227 // check format version for compatibility
228 char formatVersion;
229 stream.read(&formatVersion, 1);
230 if (formatVersion > LS_DOMAIN_SERIALIZATION_VERSION) {
231 Logger::getInstance()
232 .addWarning(
233 "Reading Domain of version " + std::to_string(formatVersion) +
234 " with reader of version " +
235 std::to_string(LS_DOMAIN_SERIALIZATION_VERSION) + " failed.")
236 .print();
237 return stream;
238 }
239
240 // read in the grid
241 grid.deserialize(stream);
242
243 // read in the hrleDoamin
244 // grid pointer in hrleDomain is implicitly set
245 // to the correct grid already since they were
246 // initialized together
247 domain.deserialize(stream);
248
249 // read in the level set width
250 uint32_t width;
251 stream.read(reinterpret_cast<char *>(&width), sizeof(uint32_t));
252 levelSetWidth = width;
253
254 // check wether there is point data to read
255 char hasPointData;
256 stream.read(&hasPointData, 1);
257 if (hasPointData == 1) {
258 pointData.clear();
259 pointData.deserialize(stream);
260 }
261
262 return stream;
263 }
264};
265
266// add all template specialisations for this class
268
269} // 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:158
void deepCopy(const SmartPointer< Domain< T, D > > passedDomain)
copy all values of "passedDomain" to this Domain
Definition lsDomain.hpp:119
unsigned getNumberOfSegments() const
returns the number of segments, the levelset is split into. This is useful for algorithm parallelisat...
Definition lsDomain.hpp:148
void finalize()
this function finalizes the levelset, so it is ready for use by other algorithms
Definition lsDomain.hpp:116
void print(std::ostream &out=std::cout)
prints basic information and all memebers of the levelset structure
Definition lsDomain.hpp:173
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:112
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:144
VoidPointMarkersType & getVoidPointMarkers()
get reference to the voidPoints markers for all points
Definition lsDomain.hpp:166
const VoidPointMarkersType & getVoidPointMarkers() const
Definition lsDomain.hpp:168
const PointDataType & getPointData() const
Definition lsDomain.hpp:163
PointDataType & getPointData()
get reference to point data saved in the level set
Definition lsDomain.hpp:161
DomainType & getDomain()
get const reference to the underlying hrleDomain data structure
Definition lsDomain.hpp:142
Domain(GridType passedGrid)
Definition lsDomain.hpp:104
int getLevelSetWidth() const
Definition lsDomain.hpp:153
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:215
GridType & getGrid()
get mutable reference to the grid on which the level set is defined
Definition lsDomain.hpp:139
const GridType & getGrid() const
get reference to the grid on which the levelset is defined
Definition lsDomain.hpp:136
unsigned getNumberOfPoints() const
returns the number of defined points
Definition lsDomain.hpp:151
std::ostream & serialize(std::ostream &stream)
Serializes the Domain into a binary stream.
Definition lsDomain.hpp:184
void setLevelSetWidth(int width)
Definition lsDomain.hpp:155
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:130
static constexpr int dimensions
Definition lsDomain.hpp:48
This class holds data associated with points in space.
Definition lsPointData.hpp:20
#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:70
double T
Definition pyWrap.cpp:68