19template <
typename T0,
typename T1,
typename T2>
24 "process_qf_arg not implemented for arg type");
37template <
typename T,
int n,
int m>
38MFEM_HOST_DEVICE
inline
43 for (
int i = 0; i < m; i++)
45 for (
int j = 0; j < n; j++)
47 arg(j, i).value =
u((i * n) + j);
53MFEM_HOST_DEVICE
inline
62MFEM_HOST_DEVICE
inline
72template <
typename T,
int n>
73MFEM_HOST_DEVICE
inline
79 for (
int i = 0; i < n; i++)
82 arg(i).gradient = v(i);
86template <
typename T,
int n,
int m>
87MFEM_HOST_DEVICE
inline
93 for (
int i = 0; i < m; i++)
95 for (
int j = 0; j < n; j++)
97 arg(j, i).value =
u((i * n) + j);
98 arg(j, i).gradient = v((i * n) + j);
103template <
typename T,
int n>
104MFEM_HOST_DEVICE
inline
109 for (
size_t i = 0; i < n; i++)
115template <
typename T,
int n,
int m>
116MFEM_HOST_DEVICE
inline
121 for (
size_t i = 0; i < n; i++)
123 for (
size_t j = 0; j < m; j++)
125 r(i + n * j) = x(i, j).value;
130template <
typename arg_type>
131MFEM_HOST_DEVICE
inline
138 const auto u_qp =
Reshape(&
u(0, qp),
u.GetShape()[0]);
143template <
size_t num_fields,
typename qf_args>
144MFEM_HOST_DEVICE
inline
151 for_constexpr<tuple_size<qf_args>::value>([&](
auto i)
157template <
typename T,
int n,
int m>
158MFEM_HOST_DEVICE
inline
163 for (
size_t i = 0; i < n; i++)
165 for (
size_t j = 0; j < m; j++)
167 r(i + n * j) = x(i, j).gradient;
172template <
typename T,
int n>
173MFEM_HOST_DEVICE
inline
178 for (
size_t i = 0; i < n; i++)
180 r(i) = x(i).gradient;
185MFEM_HOST_DEVICE
inline
193template <
typename T0,
typename T1>
194MFEM_HOST_DEVICE
inline
198 "process_qf_arg not implemented for arg type");
202MFEM_HOST_DEVICE
inline
211MFEM_HOST_DEVICE
inline
219template <
typename T,
int n>
220MFEM_HOST_DEVICE
inline
225 for (
int i = 0; i < n; i++)
231template <
typename T,
int n,
int m>
232MFEM_HOST_DEVICE
inline
237 for (
int i = 0; i < m; i++)
239 for (
int j = 0; j < n; j++)
241 arg(j, i) =
u((i * n) + j);
246template <
typename arg_type>
247MFEM_HOST_DEVICE
inline
250 const auto u_qp =
Reshape(&
u(0, qp),
u.GetShape()[0]);
254template <
size_t num_fields,
typename qf_args>
255MFEM_HOST_DEVICE
inline
261 for_constexpr<tuple_size<qf_args>::value>([&](
auto i)
267template <
typename T0,
typename T1>
268MFEM_HOST_DEVICE
inline
272 "process_qf_result not implemented for result type");
277MFEM_HOST_DEVICE
inline
286MFEM_HOST_DEVICE
inline
295MFEM_HOST_DEVICE
inline
303template <
typename T,
int n>
304MFEM_HOST_DEVICE
inline
309 for (
size_t i = 0; i < n; i++)
315template <
typename T,
int n,
int m>
316MFEM_HOST_DEVICE
inline
321 for (
size_t i = 0; i < n; i++)
323 for (
size_t j = 0; j < m; j++)
325 r(i + n * j) = x(i, j);
330template <
typename T,
int n,
int m>
331MFEM_HOST_DEVICE
inline
337 for (
int i = 0; i < m; i++)
339 for (
int j = 0; j < n; j++)
341 arg(j, i) =
u((i * n) + j);
A basic generic Tensor class, appropriate for use on the GPU.
MFEM_HOST_DEVICE auto & GetShape() const
Returns the shape of the tensor.
constexpr bool always_false
MFEM_HOST_DEVICE void process_derivative_from_native_dual(DeviceTensor< 1, T > &r, const tensor< dual< T, T >, n, m > &x)
MFEM_HOST_DEVICE void process_qf_result(DeviceTensor< 1, T > &r, const tensor< dual< T, T >, n > &x)
MFEM_HOST_DEVICE zero & get(zero &x)
let zero be accessed like a tuple
MFEM_HOST_DEVICE void process_qf_args(const std::array< DeviceTensor< 2 >, num_fields > &u, const std::array< DeviceTensor< 2 >, num_fields > &v, qf_args &args, const int &qp)
MFEM_HOST_DEVICE void process_qf_arg(const T0 &, const T1 &, T2 &)
real_t u(const Vector &xvec)
MFEM_HOST_DEVICE DeviceTensor< sizeof...(Dims), T > Reshape(T *ptr, Dims... dims)
Wrap a pointer as a DeviceTensor with automatically deduced template parameters.
Dual number struct (value plus gradient)
gradient_type gradient
the partial derivatives of value w.r.t. some other quantity
value_type value
the actual numerical value
Implementation of the tensor class.