3#include <hrleTypes.hpp>
6#include <vcVectorType.hpp>
10using namespace viennacore;
23 virtual bool isInside(
const Vec3D<viennahrle::CoordType> &initial,
24 const Vec3D<viennahrle::CoordType> &candidate,
33 const Vec3D<viennahrle::CoordType> &candidate,
34 unsigned long pointId)
const = 0;
37 virtual std::array<viennahrle::CoordType, 6>
getBounds()
const = 0;
49template <
class T,
int D>
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];
69 if (std::sqrt(dot) <= std::abs(
radius) + eps)
76 const Vec3D<viennahrle::CoordType> &candidate,
77 unsigned long )
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];
86 std::max(std::max(std::abs(v[0]), std::abs(v[1])), std::abs(v[2])) -
89 for (
unsigned i = 0; i <
D; ++i) {
90 T y = (v[(i + 1) %
D]);
97 T dirRadius = std::abs(v[i]) - std::sqrt(x);
98 if (std::abs(dirRadius) < std::abs(distance))
110 std::array<viennahrle::CoordType, 6>
getBounds()
const override {
111 std::array<viennahrle::CoordType, 6> bounds = {};
112 for (
unsigned i = 0; i <
D; ++i) {
114 bounds[2 * i + 1] =
radius;
122 gridDelta = domain->getGrid().getGridDelta();
128template <
class T,
int D>
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]) >
149 const Vec3D<viennahrle::CoordType> &candidate,
150 unsigned long )
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);
156 return (
posExtent[0] < 0) ? -distance : distance;
159 std::array<viennahrle::CoordType, 6>
getBounds()
const override {
160 std::array<viennahrle::CoordType, 6> bounds = {};
161 for (
unsigned i = 0; i <
D; ++i) {
171 gridDelta = domain->getGrid().getGridDelta();
173 for (
unsigned i = 0; i <
D; ++i) {
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!")
185template <
class T,
int D>
188 const std::vector<T> radii_;
194 for (
unsigned i = 0; i <
D; ++i) {
195 maxRadius_ = std::max(maxRadius_, std::abs(radii_[i]));
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];
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!")
216 const auto radius = radii_[pointId];
217 if (std::abs(radius) <= gridDelta_) {
219 std::max(std::max(std::abs(v[0]), std::abs(v[1])), std::abs(v[2])) -
222 for (
unsigned i = 0; i <
D; ++i) {
223 T y = (v[(i + 1) %
D]);
225 if constexpr (
D == 3)
226 z = (v[(i + 2) %
D]);
227 T x = radius * radius - y * y - z * z;
230 T dirRadius = std::abs(v[i]) - std::sqrt(x);
231 if (std::abs(dirRadius) < std::abs(distance))
232 distance = dirRadius;
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_;
255 gridDelta_ = domain->getGrid().getGridDelta();
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.
GeometricAdvectDistribution()=default
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