8#include <compile_time_options.h>
10#include <deal.II/base/tensor.h>
11#include <deal.II/base/utilities.h>
12#include <deal.II/base/vectorization.h>
34 template <
typename T, std::
size_t w
idth>
50 template <
typename T, std::
size_t w
idth>
51 unsigned int get_stride_size<dealii::VectorizedArray<T, width>> = width;
58 template <
typename Functor,
size_t... Is>
59 auto generate_iterators_impl(Functor f, std::index_sequence<Is...>)
60 -> std::array<
decltype(f(0)),
sizeof...(Is)>
79 template <
unsigned int length,
typename Functor>
81 -> std::array<
decltype(f(0)), length>
83 return generate_iterators_impl<>(f, std::make_index_sequence<length>());
95 for (
auto &it : iterators)
110 template <
typename Number>
113 return Number(0.5) * (std::abs(number) + number);
122 template <
typename Number>
125 return Number(0.5) * (std::abs(number) - number);
136 template <
int N,
typename T>
139 return dealii::Utilities::fixed_power<N, T>(x);
148 template <
typename T>
149 T
pow(
const T x,
const T b);
157 template <
typename T, std::
size_t w
idth>
158 dealii::VectorizedArray<T, width>
159 pow(
const dealii::VectorizedArray<T, width> x,
const T b);
168 template <
typename T, std::
size_t w
idth>
169 dealii::VectorizedArray<T, width>
170 pow(
const dealii::VectorizedArray<T, width> x,
171 const dealii::VectorizedArray<T, width> b);
202 template <
typename T>
211 template <
typename T, std::
size_t w
idth>
212 dealii::VectorizedArray<T, width>
213 fast_pow(
const dealii::VectorizedArray<T, width> x,
224 template <
typename T, std::
size_t w
idth>
225 dealii::VectorizedArray<T, width>
226 fast_pow(
const dealii::VectorizedArray<T, width> x,
227 const dealii::VectorizedArray<T, width> b,
242 template <
typename T,
typename V>
243 DEAL_II_ALWAYS_INLINE
inline T
load_value(
const V &vector,
unsigned int i)
245 static_assert(std::is_same_v<typename get_value_type<T>::type,
246 typename V::value_type>,
250 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
252 result = vector.local_element(i);
255 result.load(vector.get_values() + i);
266 template <
typename T,
typename T2>
267 DEAL_II_ALWAYS_INLINE
inline T
load_value(
const std::vector<T2> &vector,
270 if constexpr (std::is_same_v<typename get_value_type<T>::type, T2>) {
274 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
279 result.load(vector.data() + i);
286 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
290 for (
unsigned int k = 0; k < T::size(); ++k)
291 result[k] = vector[i + k];
304 template <
typename T,
typename V>
306 const unsigned int *js)
308 static_assert(std::is_same_v<typename get_value_type<T>::type,
309 typename V::value_type>,
313 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
315 result = vector.local_element(js[0]);
318 result.gather(vector.get_values(), js);
329 template <
typename T,
typename T2>
330 DEAL_II_ALWAYS_INLINE
inline T
load_value(
const std::vector<T2> &vector,
331 const unsigned int *js)
333 static_assert(std::is_same_v<typename get_value_type<T>::type, T2>,
337 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
339 result = vector[js[0]];
342 result.load(vector.data(), js);
354 template <
typename T,
typename V>
355 DEAL_II_ALWAYS_INLINE
inline void
358 static_assert(std::is_same_v<typename get_value_type<T>::type,
359 typename V::value_type>,
362 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
364 vector.local_element(i) = values;
367 values.store(vector.get_values() + i);
376 template <
typename T,
typename T2>
377 DEAL_II_ALWAYS_INLINE
inline void
378 store_value(std::vector<T2> &vector,
const T &values,
unsigned int i)
380 if constexpr (std::is_same_v<typename get_value_type<T>::type, T2>) {
383 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
388 values.store(vector.data() + i);
393 if constexpr (std::is_same_v<T, typename get_value_type<T>::type>) {
397 for (
unsigned int k = 0; k < T::size(); ++k)
398 vector[i + k] = values[k];
409 template <
int rank,
int dim, std::
size_t w
idth,
typename Number>
410 DEAL_II_ALWAYS_INLINE
inline dealii::Tensor<rank, dim, Number>
412 const dealii::Tensor<rank, dim, dealii::VectorizedArray<Number, width>>
414 const unsigned int k)
416 Assert(k < width, dealii::ExcMessage(
"Index past VectorizedArray width"));
417 dealii::Tensor<rank, dim, Number> result;
418 if constexpr (rank == 1) {
419 for (
unsigned int d = 0; d < dim; ++d)
420 result[d] = vectorized[d][k];
422 for (
unsigned int d = 0; d < dim; ++d)
435 template <
int rank,
int dim,
typename Number>
436 DEAL_II_ALWAYS_INLINE
inline dealii::Tensor<rank, dim, Number>
438 const unsigned int k [[maybe_unused]])
442 "The given index k must be zero for a serial tensor"));
452 template <
int rank,
int dim, std::
size_t w
idth,
typename Number>
454 dealii::Tensor<rank, dim, dealii::VectorizedArray<Number, width>> &result,
455 const dealii::Tensor<rank, dim, Number> &serial,
456 const unsigned int k)
458 Assert(k < width, dealii::ExcMessage(
"Index past VectorizedArray width"));
459 if constexpr (rank == 1) {
460 for (
unsigned int d = 0; d < dim; ++d)
461 result[d][k] = serial[d];
463 for (
unsigned int d = 0; d < dim; ++d)
475 template <
int rank,
int dim,
typename Number>
476 DEAL_II_ALWAYS_INLINE
inline void
478 const dealii::Tensor<rank, dim, Number> &serial,
479 const unsigned int k [[maybe_unused]])
483 "The given index k must be zero for a serial tensor"));
DEAL_II_ALWAYS_INLINE void assign_serial_tensor(dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &result, const dealii::Tensor< rank, dim, Number > &serial, const unsigned int k)
DEAL_II_ALWAYS_INLINE auto generate_iterators(Functor f) -> std::array< auto, length >
T pow(const T x, const T b)
DEAL_II_ALWAYS_INLINE void increment_iterators(T &iterators)
DEAL_II_ALWAYS_INLINE Number negative_part(const Number number)
DEAL_II_ALWAYS_INLINE void store_value(V &vector, const T &values, unsigned int i)
T fast_pow(const T x, const T b, const Bias bias=Bias::none)
DEAL_II_ALWAYS_INLINE T load_value(const V &vector, unsigned int i)
unsigned int get_stride_size
DEAL_II_ALWAYS_INLINE Number positive_part(const Number number)
DEAL_II_ALWAYS_INLINE dealii::Tensor< rank, dim, Number > serialize_tensor(const dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &vectorized, const unsigned int k)