21template <
typename T,
typename =
void>
22struct scalar_value_type
29struct scalar_value_type<
T,
std::
void_t<typename T::value_type>>
31 typedef typename T::value_type value_type;
35using scalar_value_type_t =
typename scalar_value_type<T>::value_type;
44 contravariantPiola = 3,
45 doubleCovariantPiola = 4,
46 doubleContravariantPiola = 5,
56template <
typename O,
typename P,
typename Q,
typename R>
61 for (std::size_t
i = 0;
i <
U.extent(0); ++
i)
62 for (std::size_t
j = 0;
j <
U.extent(1); ++
j)
73template <
typename O,
typename P,
typename Q,
typename R>
77 using T =
typename std::decay_t<O>::value_type;
78 using Z =
typename impl::scalar_value_type_t<T>;
79 for (std::size_t
p = 0;
p <
U.extent(0); ++
p)
82 for (std::size_t
i = 0;
i <
r.extent(1); ++
i)
85 for (std::size_t
k = 0;
k <
K.extent(0); ++
k)
100template <
typename O,
typename P,
typename Q,
typename R>
104 using T =
typename std::decay_t<O>::value_type;
105 using Z =
typename impl::scalar_value_type_t<T>;
106 for (std::size_t
p = 0;
p <
U.extent(0); ++
p)
108 for (std::size_t
i = 0;
i <
r.extent(1); ++
i)
111 for (std::size_t
k = 0;
k <
J.extent(1); ++
k)
117 std::transform(
r.data_handle(),
r.data_handle() +
r.size(),
r.data_handle(),
118 [
detJ](
auto ri) { return ri / static_cast<Z>(detJ); });
128template <
typename O,
typename P,
typename Q,
typename R>
132 using T =
typename std::decay_t<O>::value_type;
133 using Z =
typename impl::scalar_value_type_t<T>;
134 for (std::size_t
p = 0;
p <
U.extent(0); ++
p)
136 md::mdspan<const T, md::dextents<std::size_t, 2>>
_U(
137 U.data_handle() +
p *
U.extent(1),
K.extent(0),
K.extent(0));
138 md::mdspan<T, md::dextents<std::size_t, 2>>
_r(
139 r.data_handle() +
p *
r.extent(1),
K.extent(1),
K.extent(1));
141 for (std::size_t
i = 0;
i <
_r.extent(0); ++
i)
143 for (std::size_t
j = 0;
j <
_r.extent(1); ++
j)
146 for (std::size_t
k = 0;
k <
K.extent(0); ++
k)
147 for (std::size_t
l = 0;
l <
_U.extent(1); ++
l)
163template <
typename O,
typename P,
typename Q,
typename R>
167 using T =
typename std::decay_t<O>::value_type;
168 using Z =
typename impl::scalar_value_type_t<T>;
169 for (std::size_t
p = 0;
p <
U.extent(0); ++
p)
171 md::mdspan<const T, md::dextents<std::size_t, 2>>
_U(
172 U.data_handle() +
p *
U.extent(1),
J.extent(1),
J.extent(1));
173 md::mdspan<T, md::dextents<std::size_t, 2>>
_r(
174 r.data_handle() +
p *
r.extent(1),
J.extent(0),
J.extent(0));
177 for (std::size_t
i = 0;
i <
_r.extent(0); ++
i)
179 for (std::size_t
j = 0;
j <
_r.extent(1); ++
j)
182 for (std::size_t
k = 0;
k <
J.extent(1); ++
k)
183 for (std::size_t
l = 0;
l <
_U.extent(1); ++
l)
190 std::transform(
r.data_handle(),
r.data_handle() +
r.size(),
r.data_handle(),
191 [
detJ](
auto ri) { return ri / static_cast<Z>(detJ * detJ); });
A finite element.
Definition finite-element.h:138
Information about finite element maps.
Definition maps.h:15
void l2_piola(O &&r, const P &U, const Q &, double detJ, const R &)
L2 Piola map.
Definition maps.h:57
void covariant_piola(O &&r, const P &U, const Q &, double, const R &K)
Covariant Piola map.
Definition maps.h:74
void contravariant_piola(O &&r, const P &U, const Q &J, double detJ, const R &)
Contravariant Piola map.
Definition maps.h:101
void double_contravariant_piola(O &&r, const P &U, const Q &J, double detJ, const R &)
Double contravariant Piola map.
Definition maps.h:164
void double_covariant_piola(O &&r, const P &U, const Q &, double, const R &K)
Double covariant Piola map.
Definition maps.h:129
type
Map type.
Definition maps.h:40