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