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>
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."};
217 return std::abs(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)
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;
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;
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;
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;
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;
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
constexpr T pow_int(const T x)
Computes the power of a given number by an integral exponent given at compile time,...
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
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
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()
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()
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
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
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.
double evaluate(double radius) const
InverseMultiquadrics(double c)
PRECICE_HOST_DEVICE double operator()(const double radius, const RadialBasisParameters params) const
RadialBasisParameters getFunctionParameters()
RadialBasisParameters _params
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.
provides general mathematical constants and functions.
constexpr T pow_int(const T x)
Computes the power of a given number by an integral exponent given at compile time,...
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.