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 VIENNACORE_LOG_WARNING(
176 "One half-axis of BoxDistribution is smaller than "
177 "the grid Delta! This can lead to numerical errors "
178 "breaking the distribution!");
184template <
class T,
int D>
187 const std::vector<T> radii_;
193 for (
unsigned i = 0; i <
D; ++i) {
194 maxRadius_ = std::max(maxRadius_, std::abs(radii_[i]));
199 const Vec3D<viennahrle::CoordType> &candidate,
200 unsigned long pointId)
const override {
201 T distance = std::numeric_limits<T>::max();
202 Vec3D<viennahrle::CoordType> v{};
203 for (
unsigned i = 0; i <
D; ++i) {
204 v[i] = candidate[i] - initial[i];
207 if (pointId >= radii_.size()) {
208 Logger::getInstance()
209 .addError(
"Point ID " + std::to_string(pointId) +
210 " is out of bounds for CustomSphereDistribution with " +
211 std::to_string(radii_.size()) +
" radii!")
215 const auto radius = radii_[pointId];
216 if (std::abs(radius) <= gridDelta_) {
218 std::max(std::max(std::abs(v[0]), std::abs(v[1])), std::abs(v[2])) -
221 for (
unsigned i = 0; i <
D; ++i) {
222 T y = (v[(i + 1) %
D]);
224 if constexpr (
D == 3)
225 z = (v[(i + 2) %
D]);
226 T x = radius * radius - y * y - z * z;
229 T dirRadius = std::abs(v[i]) - std::sqrt(x);
230 if (std::abs(dirRadius) < std::abs(distance))
231 distance = dirRadius;
242 std::array<viennahrle::CoordType, 6>
getBounds()
const override {
243 std::array<viennahrle::CoordType, 6> bounds = {};
244 for (
unsigned i = 0; i <
D; ++i) {
245 bounds[2 * i] = -maxRadius_;
246 bounds[2 * i + 1] = maxRadius_;
254 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:198
void prepare(SmartPointer< Domain< T, D > > domain) override
Definition lsGeometricAdvectDistributions.hpp:253
bool useSurfacePointId() const override
Definition lsGeometricAdvectDistributions.hpp:251
CustomSphereDistribution(const std::vector< T > &radii)
Definition lsGeometricAdvectDistributions.hpp:192
std::array< viennahrle::CoordType, 6 > getBounds() const override
Sets bounds to the bounding box of the distribution.
Definition lsGeometricAdvectDistributions.hpp:242
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:37