8#include <compile_time_options.h>
10#include <deal.II/base/function.h>
17 template <
int dim,
typename Number,
typename Callable>
18 class ToFunction :
public dealii::Function<dim, Number>
21 ToFunction(
const Callable &callable,
const unsigned int k)
22 : dealii::Function<dim, Number>(1)
28 Number value(
const dealii::Point<dim> &point,
29 unsigned int )
const override
31 return callable_(point)[k_];
35 const Callable callable_;
36 const unsigned int k_;
71 template <
int dim,
typename Number,
typename Callable>
72 ToFunction<dim, Number, Callable>
to_function(
const Callable &callable,
82 template <
typename FT,
83 int problem_dim = FT::dimension,
84 typename TT =
typename FT::value_type,
85 typename T =
typename TT::value_type>
86 DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor<1, problem_dim, T>
89 dealii::Tensor<1, problem_dim, T> result;
90 for (
unsigned int k = 0; k < problem_dim; ++k)
91 result[k] = flux_ij[k] * c_ij;
99 template <
typename FT,
int problem_dim = FT::dimension>
100 DEAL_II_HOST_DEVICE_ALWAYS_INLINE FT
add(
const FT &flux_left_ij,
101 const FT &flux_right_ij)
104 for (
unsigned int k = 0; k < problem_dim; ++k)
105 result[k] = flux_left_ij[k] + flux_right_ij[k];
116 template <
typename T>
117 class is_dereferenceable
119 template <
typename C>
120 static auto test(...) -> std::false_type;
122 template <
typename C>
123 static auto test(C *) ->
decltype(*std::declval<C>(), std::true_type());
126 using type =
decltype(test<T>(
nullptr));
127 static constexpr auto value = type::value;
130 template <
typename T,
typename>
131 auto dereference(T &t) ->
decltype(dereference(*t)) &;
133 template <
typename T>
134 auto dereference(T &t) -> T &
135 requires(!is_dereferenceable<T>::value)
140 template <
typename T>
141 auto dereference(T &t) ->
decltype(*t) &
142 requires is_dereferenceable<T>::value
168#define ACCESSOR_READ_ONLY(member) \
169 inline const auto &member() const \
171 return dereference(member##_); \
180#define ACCESSOR(member) \
181 inline auto &member() \
183 return dereference(member##_); \
193#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member) \
194 inline const auto &member() const \
211#define ACCESSOR_CONTAINER_READ_ONLY(container, member) \
212 inline const auto &member() const \
214 return dereference(dereference(container).member); \
231#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) || \
232 defined(__SYCL_DEVICE_ONLY__)
233#define RYUJIN_DEVICE_COMPILATION_PASS
243#define RYUJIN_PRAGMA(x) _Pragma(#x)
260#define RYUJIN_UNLIKELY(x) (__builtin_expect(!!(x), 0))
DEAL_II_HOST_DEVICE_ALWAYS_INLINE dealii::Tensor< 1, problem_dim, T > contract(const FT &flux_ij, const TT &c_ij)
ToFunction< dim, Number, Callable > to_function(const Callable &callable, const unsigned int k)
DEAL_II_HOST_DEVICE_ALWAYS_INLINE FT add(const FT &flux_left_ij, const FT &flux_right_ij)