ViennaLS
Loading...
Searching...
No Matches
lsGeometricAdvectDistributions.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <hrleTypes.hpp>
4
5#include <vcLogger.hpp>
6#include <vcVectorType.hpp>
7
8namespace viennals {
9
10using namespace viennacore;
11
15template <class T, int D> class GeometricAdvectDistribution {
16public:
18
23 virtual bool isInside(const Vec3D<viennahrle::CoordType> &initial,
24 const Vec3D<viennahrle::CoordType> &candidate,
25 double eps) const {
26 return true;
27 }
28
32 virtual T getSignedDistance(const Vec3D<viennahrle::CoordType> &initial,
33 const Vec3D<viennahrle::CoordType> &candidate,
34 unsigned long pointId) const = 0;
35
37 virtual std::array<viennahrle::CoordType, 6> getBounds() const = 0;
38
39 virtual bool useSurfacePointId() const { return false; }
40
41 virtual ~GeometricAdvectDistribution() = default;
42
43 virtual void prepare(SmartPointer<Domain<T, D>> domain) {}
44 virtual void finalize() {}
45};
46
49template <class T, int D>
51
52public:
53 const T radius = 0.;
54 const T radius2;
56
57 SphereDistribution(const T passedRadius)
58 : radius(passedRadius), radius2(radius * radius) {}
59
60 bool isInside(const Vec3D<viennahrle::CoordType> &initial,
61 const Vec3D<viennahrle::CoordType> &candidate,
62 double eps) const override {
63 viennahrle::CoordType dot = 0.;
64 for (unsigned i = 0; i < D; ++i) {
65 double tmp = candidate[i] - initial[i];
66 dot += tmp * tmp;
67 }
68
69 if (std::sqrt(dot) <= std::abs(radius) + eps)
70 return true;
71 else
72 return false;
73 }
74
75 T getSignedDistance(const Vec3D<viennahrle::CoordType> &initial,
76 const Vec3D<viennahrle::CoordType> &candidate,
77 unsigned long /*pointId*/) const override {
78 T distance = std::numeric_limits<T>::max();
79 Vec3D<viennahrle::CoordType> v{};
80 for (unsigned i = 0; i < D; ++i) {
81 v[i] = candidate[i] - initial[i];
82 }
83
84 if (std::abs(radius) <= gridDelta) {
85 distance =
86 std::max(std::max(std::abs(v[0]), std::abs(v[1])), std::abs(v[2])) -
87 std::abs(radius);
88 } else {
89 for (unsigned i = 0; i < D; ++i) {
90 T y = (v[(i + 1) % D]);
91 T z = 0;
92 if constexpr (D == 3)
93 z = (v[(i + 2) % D]);
94 T x = radius2 - y * y - z * z;
95 if (x < 0.)
96 continue;
97 T dirRadius = std::abs(v[i]) - std::sqrt(x);
98 if (std::abs(dirRadius) < std::abs(distance))
99 distance = dirRadius;
100 }
101 }
102 // return distance;
103 if (radius < 0) {
104 return -distance;
105 } else {
106 return distance;
107 }
108 }
109
110 std::array<viennahrle::CoordType, 6> getBounds() const override {
111 std::array<viennahrle::CoordType, 6> bounds = {};
112 for (unsigned i = 0; i < D; ++i) {
113 bounds[2 * i] = -radius;
114 bounds[2 * i + 1] = radius;
115 }
116 return bounds;
117 }
118
119 bool useSurfacePointId() const override { return true; }
120
121 void prepare(SmartPointer<Domain<T, D>> domain) override {
122 gridDelta = domain->getGrid().getGridDelta();
123 }
124};
125
128template <class T, int D>
130public:
131 const VectorType<T, 3> posExtent;
133
134 BoxDistribution(const std::array<T, 3> &halfAxes) : posExtent(halfAxes) {}
135
136 bool isInside(const Vec3D<viennahrle::CoordType> &initial,
137 const Vec3D<viennahrle::CoordType> &candidate,
138 double eps) const override {
139 for (unsigned i = 0; i < D; ++i) {
140 if (std::abs(candidate[i] - initial[i]) >
141 (std::abs(posExtent[i]) + eps)) {
142 return false;
143 }
144 }
145 return true;
146 }
147
148 T getSignedDistance(const Vec3D<viennahrle::CoordType> &initial,
149 const Vec3D<viennahrle::CoordType> &candidate,
150 unsigned long /*pointId*/) const override {
151 T distance = std::numeric_limits<T>::lowest();
152 for (unsigned i = 0; i < D; ++i) {
153 T vector = std::abs(candidate[i] - initial[i]);
154 distance = std::max(vector - std::abs(posExtent[i]), distance);
155 }
156 return (posExtent[0] < 0) ? -distance : distance;
157 }
158
159 std::array<viennahrle::CoordType, 6> getBounds() const override {
160 std::array<viennahrle::CoordType, 6> bounds = {};
161 for (unsigned i = 0; i < D; ++i) {
162 bounds[2 * i] = -posExtent[i];
163 bounds[2 * i + 1] = posExtent[i];
164 }
165 return bounds;
166 }
167
168 bool useSurfacePointId() const override { return true; }
169
170 void prepare(SmartPointer<Domain<T, D>> domain) override {
171 gridDelta = domain->getGrid().getGridDelta();
172
173 for (unsigned i = 0; i < D; ++i) {
174 if (std::abs(posExtent[i]) < gridDelta) {
175 Logger::getInstance()
176 .addWarning("One half-axis of BoxDistribution is smaller than "
177 "the grid Delta! This can lead to numerical errors "
178 "breaking the distribution!")
179 .print();
180 }
181 }
182 }
183};
184
185template <class T, int D>
187
188 const std::vector<T> radii_;
189 T gridDelta_ = 0;
190 T maxRadius_ = 0;
191
192public:
193 CustomSphereDistribution(const std::vector<T> &radii) : radii_(radii) {
194 for (unsigned i = 0; i < D; ++i) {
195 maxRadius_ = std::max(maxRadius_, std::abs(radii_[i]));
196 }
197 }
198
199 T getSignedDistance(const Vec3D<viennahrle::CoordType> &initial,
200 const Vec3D<viennahrle::CoordType> &candidate,
201 unsigned long pointId) const override {
202 T distance = std::numeric_limits<T>::max();
203 Vec3D<viennahrle::CoordType> v{};
204 for (unsigned i = 0; i < D; ++i) {
205 v[i] = candidate[i] - initial[i];
206 }
207
208 if (pointId >= radii_.size()) {
209 Logger::getInstance()
210 .addError("Point ID " + std::to_string(pointId) +
211 " is out of bounds for CustomSphereDistribution with " +
212 std::to_string(radii_.size()) + " radii!")
213 .print();
214 return distance;
215 }
216 const auto radius = radii_[pointId];
217 if (std::abs(radius) <= gridDelta_) {
218 distance =
219 std::max(std::max(std::abs(v[0]), std::abs(v[1])), std::abs(v[2])) -
220 std::abs(radius);
221 } else {
222 for (unsigned i = 0; i < D; ++i) {
223 T y = (v[(i + 1) % D]);
224 T z = 0;
225 if constexpr (D == 3)
226 z = (v[(i + 2) % D]);
227 T x = radius * radius - y * y - z * z;
228 if (x < 0.)
229 continue;
230 T dirRadius = std::abs(v[i]) - std::sqrt(x);
231 if (std::abs(dirRadius) < std::abs(distance))
232 distance = dirRadius;
233 }
234 }
235 // return distance;
236 if (radius < 0) {
237 return -distance;
238 } else {
239 return distance;
240 }
241 }
242
243 std::array<viennahrle::CoordType, 6> getBounds() const override {
244 std::array<viennahrle::CoordType, 6> bounds = {};
245 for (unsigned i = 0; i < D; ++i) {
246 bounds[2 * i] = -maxRadius_;
247 bounds[2 * i + 1] = maxRadius_;
248 }
249 return bounds;
250 }
251
252 bool useSurfacePointId() const override { return true; }
253
254 void prepare(SmartPointer<Domain<T, D>> domain) override {
255 gridDelta_ = domain->getGrid().getGridDelta();
256 }
257};
258} // namespace viennals
constexpr int D
Definition Epitaxy.cpp:11
double T
Definition Epitaxy.cpp:12
T gridDelta
Definition lsGeometricAdvectDistributions.hpp:132
BoxDistribution(const std::array< T, 3 > &halfAxes)
Definition lsGeometricAdvectDistributions.hpp:134
bool isInside(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, double eps) const override
Quick check whether a point relative to the distributions center is inside the distribution....
Definition lsGeometricAdvectDistributions.hpp:136
std::array< viennahrle::CoordType, 6 > getBounds() const override
Sets bounds to the bounding box of the distribution.
Definition lsGeometricAdvectDistributions.hpp:159
bool useSurfacePointId() const override
Definition lsGeometricAdvectDistributions.hpp:168
void prepare(SmartPointer< Domain< T, D > > domain) override
Definition lsGeometricAdvectDistributions.hpp:170
const VectorType< T, 3 > posExtent
Definition lsGeometricAdvectDistributions.hpp:131
T getSignedDistance(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, unsigned long) const override
Returns the signed distance of a point relative to the distributions center. This is the signed manha...
Definition lsGeometricAdvectDistributions.hpp:148
T getSignedDistance(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, unsigned long pointId) const override
Returns the signed distance of a point relative to the distributions center. This is the signed manha...
Definition lsGeometricAdvectDistributions.hpp:199
void prepare(SmartPointer< Domain< T, D > > domain) override
Definition lsGeometricAdvectDistributions.hpp:254
bool useSurfacePointId() const override
Definition lsGeometricAdvectDistributions.hpp:252
CustomSphereDistribution(const std::vector< T > &radii)
Definition lsGeometricAdvectDistributions.hpp:193
std::array< viennahrle::CoordType, 6 > getBounds() const override
Sets bounds to the bounding box of the distribution.
Definition lsGeometricAdvectDistributions.hpp:243
Class containing all information about the level set, including the dimensions of the domain,...
Definition lsDomain.hpp:27
virtual ~GeometricAdvectDistribution()=default
virtual void prepare(SmartPointer< Domain< T, D > > domain)
Definition lsGeometricAdvectDistributions.hpp:43
virtual bool isInside(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, double eps) const
Quick check whether a point relative to the distributions center is inside the distribution....
Definition lsGeometricAdvectDistributions.hpp:23
virtual T getSignedDistance(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, unsigned long pointId) const =0
Returns the signed distance of a point relative to the distributions center. This is the signed manha...
virtual void finalize()
Definition lsGeometricAdvectDistributions.hpp:44
virtual bool useSurfacePointId() const
Definition lsGeometricAdvectDistributions.hpp:39
virtual std::array< viennahrle::CoordType, 6 > getBounds() const =0
Sets bounds to the bounding box of the distribution.
T gridDelta
Definition lsGeometricAdvectDistributions.hpp:55
bool isInside(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, double eps) const override
Quick check whether a point relative to the distributions center is inside the distribution....
Definition lsGeometricAdvectDistributions.hpp:60
bool useSurfacePointId() const override
Definition lsGeometricAdvectDistributions.hpp:119
std::array< viennahrle::CoordType, 6 > getBounds() const override
Sets bounds to the bounding box of the distribution.
Definition lsGeometricAdvectDistributions.hpp:110
const T radius2
Definition lsGeometricAdvectDistributions.hpp:54
T getSignedDistance(const Vec3D< viennahrle::CoordType > &initial, const Vec3D< viennahrle::CoordType > &candidate, unsigned long) const override
Returns the signed distance of a point relative to the distributions center. This is the signed manha...
Definition lsGeometricAdvectDistributions.hpp:75
SphereDistribution(const T passedRadius)
Definition lsGeometricAdvectDistributions.hpp:57
const T radius
Definition lsGeometricAdvectDistributions.hpp:53
void prepare(SmartPointer< Domain< T, D > > domain) override
Definition lsGeometricAdvectDistributions.hpp:121
Definition lsAdvect.hpp:36