51void l2_piola(O&& r,
const P& U,
const Q& ,
double detJ,
const R& )
53 assert(U.extent(0) == r.extent(0));
54 assert(U.extent(1) == r.extent(1));
55 for (std::size_t i = 0; i < U.extent(0); ++i)
56 for (std::size_t j = 0; j < U.extent(1); ++j)
57 r(i, j) = U(i, j) / detJ;
65 using T =
typename std::decay_t<O>::value_type;
66 using Z =
typename impl::scalar_value_type_t<T>;
67 for (std::size_t p = 0; p < U.extent(0); ++p)
70 for (std::size_t i = 0; i < r.extent(1); ++i)
73 for (std::size_t k = 0; k < K.extent(0); ++k)
74 acc +=
static_cast<Z
>(K(k, i)) * U(p, k);
85 using T =
typename std::decay_t<O>::value_type;
86 using Z =
typename impl::scalar_value_type_t<T>;
87 for (std::size_t p = 0; p < U.extent(0); ++p)
89 for (std::size_t i = 0; i < r.extent(1); ++i)
92 for (std::size_t k = 0; k < J.extent(1); ++k)
93 acc +=
static_cast<Z
>(J(i, k)) * U(p, k);
98 std::transform(r.data_handle(), r.data_handle() + r.size(), r.data_handle(),
99 [detJ](
auto ri) { return ri / static_cast<Z>(detJ); });
107 using T =
typename std::decay_t<O>::value_type;
108 using Z =
typename impl::scalar_value_type_t<T>;
109 for (std::size_t p = 0; p < U.extent(0); ++p)
111 md::mdspan<const T, md::dextents<std::size_t, 2>> _U(
112 U.data_handle() + p * U.extent(1), K.extent(0), K.extent(0));
113 md::mdspan<T, md::dextents<std::size_t, 2>> _r(
114 r.data_handle() + p * r.extent(1), K.extent(1), K.extent(1));
116 for (std::size_t i = 0; i < _r.extent(0); ++i)
118 for (std::size_t j = 0; j < _r.extent(1); ++j)
121 for (std::size_t k = 0; k < K.extent(0); ++k)
122 for (std::size_t l = 0; l < _U.extent(1); ++l)
123 acc +=
static_cast<Z
>(K(k, i)) * _U(k, l) *
static_cast<Z
>(K(l, j));
135 using T =
typename std::decay_t<O>::value_type;
136 using Z =
typename impl::scalar_value_type_t<T>;
137 for (std::size_t p = 0; p < U.extent(0); ++p)
139 md::mdspan<const T, md::dextents<std::size_t, 2>> _U(
140 U.data_handle() + p * U.extent(1), J.extent(1), J.extent(1));
141 md::mdspan<T, md::dextents<std::size_t, 2>> _r(
142 r.data_handle() + p * r.extent(1), J.extent(0), J.extent(0));
145 for (std::size_t i = 0; i < _r.extent(0); ++i)
147 for (std::size_t j = 0; j < _r.extent(1); ++j)
150 for (std::size_t k = 0; k < J.extent(1); ++k)
151 for (std::size_t l = 0; l < _U.extent(1); ++l)
152 acc +=
static_cast<Z
>(J(i, k)) * _U(k, l) *
static_cast<Z
>(J(j, l));
158 std::transform(r.data_handle(), r.data_handle() + r.size(), r.data_handle(),
159 [detJ](
auto ri) { return ri / static_cast<Z>(detJ * detJ); });