27 template <
typename... T>
36 template <
typename T0>
47 template <
typename T0,
typename T1>
60 template <
typename T0,
typename T1,
typename T2>
75 template <
typename T0,
typename T1,
typename T2,
typename T3>
92 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4>
93 struct tuple<T0, T1, T2, T3, T4> {
111 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
112 struct tuple<T0, T1, T2, T3, T4, T5> {
132 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
133 struct tuple<T0, T1, T2, T3, T4, T5, T6> {
155 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7>
156 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7> {
180 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
182 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> {
208 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
209 typename T8,
typename T9>
210 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> {
238 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
239 typename T8,
typename T9,
typename T10>
240 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {
258 template <
typename... T>
266 template <
typename... T>
269 return tuple<T...>{args...};
272 template <
class... Types>
276 template <
class... Types>
285 template <
int i,
typename... T>
288 static_assert(i <
sizeof...(T),
"");
289 if constexpr (i == 0) {
292 if constexpr (i == 1) {
295 if constexpr (i == 2) {
298 if constexpr (i == 3) {
301 if constexpr (i == 4) {
304 if constexpr (i == 5) {
307 if constexpr (i == 6) {
310 if constexpr (i == 7) {
313 if constexpr (i == 8) {
316 if constexpr (i == 9) {
319 if constexpr (i == 10) {
329 template <
int i,
typename... T>
332 static_assert(i <
sizeof...(T),
"");
333 if constexpr (i == 0) {
336 if constexpr (i == 1) {
339 if constexpr (i == 2) {
342 if constexpr (i == 3) {
345 if constexpr (i == 4) {
348 if constexpr (i == 5) {
351 if constexpr (i == 6) {
354 if constexpr (i == 7) {
357 if constexpr (i == 8) {
360 if constexpr (i == 9) {
363 if constexpr (i == 10) {
378 template <
int i,
typename... T>
381 static_assert(i <
sizeof...(T),
"");
382 if constexpr (i == 0) {
385 if constexpr (i == 1) {
388 if constexpr (i == 2) {
391 if constexpr (i == 3) {
394 if constexpr (i == 4) {
397 if constexpr (i == 5) {
400 if constexpr (i == 6) {
403 if constexpr (i == 7) {
406 if constexpr (i == 8) {
409 if constexpr (i == 9) {
412 if constexpr (i == 10) {
427 template <
typename... S,
typename... T,
int... i>
429 std::integer_sequence<int, i...>)
431 return tuple{get<i>(x) + get<i>(y)...};
441 template <
typename... S,
typename... T>
444 static_assert(
sizeof...(S) ==
sizeof...(T));
445 return plus_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(S))>());
456 template <
typename... T,
int... i>
458 std::integer_sequence<int, i...>)
460 ((get<i>(x) += get<i>(y)), ...);
469 template <
typename... T>
472 return plus_equals_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
483 template <
typename... T,
int... i>
485 std::integer_sequence<int, i...>)
487 ((get<i>(x) -= get<i>(y)), ...);
496 template <
typename... T>
499 return minus_equals_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
512 template <
typename... S,
typename... T,
int... i>
514 std::integer_sequence<int, i...>)
516 return tuple{get<i>(x) - get<i>(y)...};
526 template <
typename... S,
typename... T>
529 static_assert(
sizeof...(S) ==
sizeof...(T));
530 return minus_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(S))>());
541 template <
typename... T,
int... i>
544 return tuple{-get<i>(x)...};
552 template <
typename... T>
555 return unary_minus_helper(x, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
568 template <
typename... S,
typename... T,
int... i>
570 std::integer_sequence<int, i...>)
572 return tuple{get<i>(x) / get<i>(y)...};
582 template <
typename... S,
typename... T>
585 static_assert(
sizeof...(S) ==
sizeof...(T));
586 return div_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(S))>());
598 template <
typename... T,
int... i>
601 return tuple{a / get<i>(x)...};
613 template <
typename... T,
int... i>
616 return tuple{get<i>(x) / a...};
625 template <
typename... T>
628 return div_helper(a, x, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
637 template <
typename... T>
640 return div_helper(x, a, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
653 template <
typename... S,
typename... T,
int... i>
655 std::integer_sequence<int, i...>)
657 return tuple{get<i>(x) * get<i>(y)...};
667 template <
typename... S,
typename... T>
670 static_assert(
sizeof...(S) ==
sizeof...(T));
671 return mult_helper(x, y, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(S))>());
683 template <
typename... T,
int... i>
686 return tuple{a * get<i>(x)...};
698 template <
typename... T,
int... i>
701 return tuple{get<i>(x) * a...};
710 template <
typename... T>
713 return mult_helper(a, x, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
722 template <
typename... T>
725 return mult_helper(x, a, std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
735 template <
typename... T, std::size_t... i>
739 (..., (out << (i == 0 ?
"" :
", ") << serac::get<i>(A)));
750 template <
typename... T>
753 return print_helper(out, A, std::make_integer_sequence<
size_t,
sizeof...(T)>());
766 template <
typename lambda,
typename... T,
int... i>
769 return f(get<i>(args)...);
781 template <
typename lambda,
typename... T>
784 return apply_helper(f, std::move(args), std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
790 template <
typename lambda,
typename... T,
int... i>
793 return f(get<i>(args)...);
805 template <
typename lambda,
typename... T>
808 return apply_helper(f, std::move(args), std::make_integer_sequence<
int,
static_cast<int>(
sizeof...(T))>());
819 template <
size_t I,
class T>
824 template <
size_t I,
class Head,
class... Tail>
830 template <
class Head,
class... Tail>
838 template <
typename T>
843 template <
typename... T>
850 template <
typename T>
857 template <
typename... T>
864 #include "serac/numerics/functional/tuple_tensor_dual_functions.hpp"
This file contains the interface used for initializing/terminating any hardware accelerator-related f...
#define SERAC_HOST_DEVICE
Macro that evaluates to __host__ __device__ when compiling with nvcc and does nothing on a host compi...
Accelerator functionality.
SERAC_HOST_DEVICE auto apply(lambda f, tuple< T... > &args)
a way of passing an n-tuple to a function that expects n separate arguments
constexpr SERAC_HOST_DEVICE auto plus_helper(const tuple< S... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the + operator of tuples.
constexpr SERAC_HOST_DEVICE auto operator*(const dual< gradient_type > &a, double b)
multiplication of a dual number and a non-dual number
Domain operator-(const Domain &a, const Domain &b)
create a new domain that is the set difference of a and b
constexpr T & get(variant< T0, T1 > &v)
Returns the variant member of specified type.
constexpr SERAC_HOST_DEVICE auto operator+(dual< gradient_type > a, double b)
addition of a dual number and a non-dual number
constexpr SERAC_HOST_DEVICE void plus_equals_helper(tuple< T... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the += operator of tuples.
auto & print_helper(std::ostream &out, const serac::tuple< T... > &A, std::integer_sequence< size_t, i... >)
helper used to implement printing a tuple of values
constexpr SERAC_HOST_DEVICE auto & operator-=(dual< gradient_type > &a, const dual< gradient_type > &b)
compound assignment (-) for dual numbers
constexpr SERAC_HOST_DEVICE auto unary_minus_helper(const tuple< T... > &x, std::integer_sequence< int, i... >)
A helper function for the - operator of tuples.
SERAC_HOST_DEVICE tuple< T... > make_tuple(const T &... args)
helper function for combining a list of values into a tuple
constexpr SERAC_HOST_DEVICE void minus_equals_helper(tuple< T... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the -= operator of tuples.
tuple(T...) -> tuple< T... >
Class template argument deduction rule for tuples.
constexpr SERAC_HOST_DEVICE auto type(const tuple< T... > &values)
a function intended to be used for extracting the ith type from a tuple.
SERAC_HOST_DEVICE auto apply_helper(lambda f, tuple< T... > &args, std::integer_sequence< int, i... >)
A helper to apply a lambda to a tuple.
constexpr SERAC_HOST_DEVICE auto & operator+=(dual< gradient_type > &a, const dual< gradient_type > &b)
compound assignment (+) for dual numbers
constexpr SERAC_HOST_DEVICE auto div_helper(const tuple< S... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the / operator of tuples.
std::ostream & operator<<(std::ostream &out, DoF dof)
stream output for DoF
constexpr SERAC_HOST_DEVICE auto minus_helper(const tuple< S... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the - operator of tuples.
constexpr SERAC_HOST_DEVICE auto mult_helper(const tuple< S... > &x, const tuple< T... > &y, std::integer_sequence< int, i... >)
A helper function for the * operator of tuples.
constexpr SERAC_HOST_DEVICE auto operator/(const dual< gradient_type > &a, double b)
division of a dual number by a non-dual number
Trait for checking if a type if a serac::tuple containing only serac::tuple.
Trait for checking if a type is a serac::tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v2 T2 v2
The third member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v9 T9 v9
The tenth member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v1 T1 v1
The second member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v5 T5 v5
The sixth member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v8 T8 v8
The ninth member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v0 T0 v0
The first member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v4 T4 v4
The fifth member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v6 T6 v6
The seventh member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v3 T3 v3
The fourth member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v10 T10 v10
The eleventh member of the tuple.
serac::tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 >::v7 T7 v7
The eighth member of the tuple.
T6 v6
The seventh member of the tuple.
T4 v4
The fifth member of the tuple.
T0 v0
The first member of the tuple.
T8 v8
The ninth member of the tuple.
T9 v9
The tenth member of the tuple.
T5 v5
The sixth member of the tuple.
T3 v3
The fourth member of the tuple.
T1 v1
The second member of the tuple.
T7 v7
The eighth member of the tuple.
T2 v2
The third member of the tuple.
T8 v8
The ninth member of the tuple.
T4 v4
The fifth member of the tuple.
T0 v0
The first member of the tuple.
T7 v7
The eighth member of the tuple.
T6 v6
The seventh member of the tuple.
T2 v2
The third member of the tuple.
T1 v1
The second member of the tuple.
T5 v5
The sixth member of the tuple.
T3 v3
The fourth member of the tuple.
T2 v2
The third member of the tuple.
T4 v4
The fifth member of the tuple.
T7 v7
The eighth member of the tuple.
T0 v0
The first member of the tuple.
T1 v1
The second member of the tuple.
T3 v3
The fourth member of the tuple.
T5 v5
The sixth member of the tuple.
T6 v6
The seventh member of the tuple.
T0 v0
The first member of the tuple.
T1 v1
The second member of the tuple.
T5 v5
The sixth member of the tuple.
T4 v4
The fifth member of the tuple.
T2 v2
The third member of the tuple.
T6 v6
The seventh member of the tuple.
T3 v3
The fourth member of the tuple.
T1 v1
The second member of the tuple.
T4 v4
The fifth member of the tuple.
T0 v0
The first member of the tuple.
T2 v2
The third member of the tuple.
T3 v3
The fourth member of the tuple.
T5 v5
The sixth member of the tuple.
T2 v2
The third member of the tuple.
T4 v4
The fifth member of the tuple.
T1 v1
The second member of the tuple.
T3 v3
The fourth member of the tuple.
T0 v0
The first member of the tuple.
T3 v3
The fourth member of the tuple.
T2 v2
The third member of the tuple.
T0 v0
The first member of the tuple.
T1 v1
The second member of the tuple.
T2 v2
The third member of the tuple.
T1 v1
The second member of the tuple.
T0 v0
The first member of the tuple.
T1 v1
The second member of the tuple.
T0 v0
The first member of the tuple.
T0 v0
The first member of the tuple.
Head type
the type at the specified index
a struct used to determine the type at index I of a tuple
This is a class that mimics most of std::tuple's interface, except that it is usable in CUDA kernels ...