8#include <compile_time_options.h>
10#include <deal.II/base/function.h>
22 template <
int dim,
typename Number,
typename Callable>
23 class ToFunction :
public dealii::Function<dim, Number>
26 ToFunction(
const Callable &callable,
const unsigned int k)
27 : dealii::Function<dim, Number>(1)
33 Number value(
const dealii::Point<dim> &point,
34 unsigned int )
const override
36 return callable_(point)[k_];
40 const Callable callable_;
41 const unsigned int k_;
70 template <
int dim,
typename Number,
typename Callable>
71 ToFunction<dim, Number, Callable>
to_function(
const Callable &callable,
81 template <
typename FT,
82 int problem_dim = FT::dimension,
83 typename TT =
typename FT::value_type,
84 typename T =
typename TT::value_type>
85 DEAL_II_ALWAYS_INLINE
inline dealii::Tensor<1, problem_dim, T>
88 dealii::Tensor<1, problem_dim, T> result;
89 for (
unsigned int k = 0; k < problem_dim; ++k)
90 result[k] = flux_ij[k] * c_ij;
98 template <
typename FT,
int problem_dim = FT::dimension>
99 DEAL_II_ALWAYS_INLINE
inline FT
add(
const FT &flux_left_ij,
100 const FT &flux_right_ij)
103 for (
unsigned int k = 0; k < problem_dim; ++k)
104 result[k] = flux_left_ij[k] + flux_right_ij[k];
122#define AssertThrowSIMD(variable, condition, exception) \
123 if constexpr (std::is_same< \
124 typename std::remove_const<decltype(variable)>::type, \
127 typename std::remove_const<decltype(variable)>::type, \
129 AssertThrow(condition(variable), exception); \
131 for (unsigned int k = 0; k < decltype(variable)::size(); ++k) { \
132 AssertThrow(condition((variable)[k]), exception); \
139 template <
typename T>
140 class is_dereferenceable
142 template <
typename C>
143 static auto test(...) -> std::false_type;
145 template <
typename C>
146 static auto test(C *) ->
decltype(*std::declval<C>(), std::true_type());
149 using type =
decltype(test<T>(
nullptr));
150 static constexpr auto value = type::value;
153 template <
typename T,
typename>
154 auto dereference(T &t) ->
decltype(dereference(*t)) &;
156 template <
typename T>
157 auto dereference(T &t) -> T &
158 requires(!is_dereferenceable<T>::value)
163 template <
typename T>
164 auto dereference(T &t) ->
decltype(*t) &
165 requires is_dereferenceable<T>::value
186#define ACCESSOR_READ_ONLY(member) \
187 inline const auto &member() const \
189 return dereference(member##_); \
198#define ACCESSOR(member) \
199 inline auto &member() \
201 return dereference(member##_); \
211#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member) \
212 inline const auto &member() const \
223#define ASM_LABEL(label) asm("#" label);
ToFunction< dim, Number, Callable > to_function(const Callable &callable, const unsigned int k)
DEAL_II_ALWAYS_INLINE FT add(const FT &flux_left_ij, const FT &flux_right_ij)
DEAL_II_ALWAYS_INLINE dealii::Tensor< 1, problem_dim, T > contract(const FT &flux_ij, const TT &c_ij)