6#include <cuda_runtime.h>
10#include <hip/hip_runtime.h>
13#if defined(__CUDACC__) || defined(__HIPCC__)
15#include <ginkgo/extensions/kokkos.hpp>
16#include <ginkgo/ginkgo.hpp>
18#define PRECICE_HOST_DEVICE __host__ __device__
19#define PRECICE_MEMORY_SPACE __device__
20#define PRECICE_FMA Kokkos::fma
21#define PRECICE_LOG Kokkos::log
25#define PRECICE_HOST_DEVICE
26#define PRECICE_MEMORY_SPACE
27#define PRECICE_FMA std::fma
28#define PRECICE_LOG std::log
32#define NUMERICAL_ZERO_DIFFERENCE_DEVICE 1.0e-14
83template <
bool isDefinite>
132 :
_cPow2(math::pow_int<2>(c))
145 return std::sqrt(cPow2 + math::pow_int<2>(radius));
170 :
_cPow2(math::pow_int<2>(c))
173 throw std::invalid_argument{
"Shape parameter for radial-basis-function inverse multiquadric has to be larger than zero. Please update the \"shape-parameter\" attribute."};
186 return 1.0 /
std::sqrt(cPow2 + math::pow_int<2>(radius));
246 "Shape parameter for radial-basis-function gaussian has to be larger than zero. Please update the \"shape-parameter\" attribute."};
250 "Support radius for radial-basis-function gaussian has to be larger than zero. Please update the \"support-radius\" attribute."};
280 if (radius > supportRadius)
282 return std::exp(-math::pow_int<2>(shape * radius)) - deltaY;
323 "Support radius for radial-basis-function compact thin-plate-splines c2 has to be larger than zero. Please update the \"support-radius\" attribute."};
325 _r_inv = 1. / supportRadius;
342 const double p = radius * r_inv;
375 "Support radius for radial-basis-function compact polynomial c0 has to be larger than zero. Please update the \"support-radius\" attribute."};
377 _r_inv = 1. / supportRadius;
394 const double p = radius * r_inv;
397 return math::pow_int<2>(1.0 - p);
427 "Support radius for radial-basis-function compact polynomial c2 has to be larger than zero. Please update the \"support-radius\" attribute."};
430 _r_inv = 1. / supportRadius;
447 const double p = radius * r_inv;
450 return math::pow_int<4>(1.0 - p) *
PRECICE_FMA(4, p, 1);
480 "Support radius for radial-basis-function compact polynomial c4 has to be larger than zero. Please update the \"support-radius\" attribute."};
483 _r_inv = 1. / supportRadius;
500 const double p = radius * r_inv;
503 return math::pow_int<6>(1.0 - p) * (35 * math::pow_int<2>(p) +
PRECICE_FMA(18, p, 3));
533 "Support radius for radial-basis-function compact polynomial c6 has to be larger than zero. Please update the \"support-radius\" attribute."};
535 _r_inv = 1. / supportRadius;
552 const double p = radius * r_inv;
555 return math::pow_int<8>(1.0 - p) * (32.0 * math::pow_int<3>(p) + 25.0 * math::pow_int<2>(p) +
PRECICE_FMA(8.0, p, 1.0));
585 "Support radius for radial-basis-function compact polynomial c6 has to be larger than zero. Please update the \"support-radius\" attribute."};
587 _r_inv = 1. / supportRadius;
604 const double p = radius * r_inv;
607 return math::pow_int<10>(1.0 - p) * (1287.0 * math::pow_int<4>(p) + 1350.0 * math::pow_int<3>(p) + 630.0 * math::pow_int<2>(p) + 150.0 * p + 15);
622#undef PRECICE_MEMORY_SPACE
623#undef PRECICE_HOST_DEVICE
624#undef NUMERICAL_ZERO_DIFFERENCE_DEVICE
#define NUMERICAL_ZERO_DIFFERENCE_DEVICE
#define PRECICE_HOST_DEVICE
Wendland radial basis function with compact support.
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
double getSupportRadius() const
RadialBasisParameters getFunctionParameters()
double evaluate(double radius) const
CompactPolynomialC0(double supportRadius)
RadialBasisParameters _params
Wendland radial basis function with compact support.
CompactPolynomialC2(double supportRadius)
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
RadialBasisParameters _params
RadialBasisParameters getFunctionParameters()
double getSupportRadius() const
double evaluate(double radius) const
Wendland radial basis function with compact support.
CompactPolynomialC4(double supportRadius)
double evaluate(double radius) const
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
double getSupportRadius() const
RadialBasisParameters _params
RadialBasisParameters getFunctionParameters()
Wendland radial basis function with compact support.
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
RadialBasisParameters _params
double getSupportRadius() const
CompactPolynomialC6(double supportRadius)
double evaluate(double radius) const
const RadialBasisParameters getFunctionParameters()
Wendland radial basis function with compact support.
CompactPolynomialC8(double supportRadius)
const RadialBasisParameters getFunctionParameters()
double getSupportRadius() const
double evaluate(double radius) const
RadialBasisParameters _params
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
Radial basis function with compact support.
double getSupportRadius() const
RadialBasisParameters _params
double evaluate(double radius) const
RadialBasisParameters getFunctionParameters()
CompactThinPlateSplinesC2(double supportRadius)
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
Radial basis function with global and compact support.
double getSupportRadius() const
RadialBasisParameters _params
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
Gaussian(const double shape, const double supportRadius=std::numeric_limits< double >::infinity())
double evaluate(const double radius) const
static constexpr double cutoffThreshold
Below that value the function is supposed to be zero. Defines the support radius if not explicitly gi...
RadialBasisParameters getFunctionParameters()
double _supportRadius
Either explicitly set (from cutoffThreshold) or computed supportRadius.
Radial basis function with global support.
double evaluate(double radius) const
InverseMultiquadrics(double c)
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
RadialBasisParameters getFunctionParameters()
RadialBasisParameters _params
Radial basis function with global support.
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
double evaluate(double radius) const
RadialBasisParameters getFunctionParameters()
RadialBasisParameters _params
Radial basis function with global support.
double evaluate(double radius) const
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
RadialBasisParameters _params
RadialBasisParameters getFunctionParameters()
Radial basis function with global support.
RadialBasisParameters _params
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
double evaluate(double radius) const
RadialBasisParameters getFunctionParameters()
contains data mapping from points to meshes.
std::enable_if< std::is_arithmetic< Scalar >::value, bool >::type greater(Scalar A, Scalar B, Scalar tolerance=NUMERICAL_ZERO_DIFFERENCE)
Base class for RBF with compact support.
static constexpr bool hasCompactSupport()
Base class for RBF functions to distinguish positive definite functions.
static constexpr bool isStrictlyPositiveDefinite()
Base class for RBF without compact support.
static constexpr double getSupportRadius()
static constexpr bool hasCompactSupport()
Wrapper struct that is used to transfer RBF-specific parameters to the GPU.