50void l2_piola(O&& r,
const P& U,
const Q& ,
double detJ,
const R& )
52 assert(U.extent(0) == r.extent(0));
53 assert(U.extent(1) == r.extent(1));
54 for (std::size_t i = 0; i < U.extent(0); ++i)
55 for (std::size_t j = 0; j < U.extent(1); ++j)
56 r(i, j) = U(i, j) / detJ;
64 using T =
typename std::decay_t<O>::value_type;
65 using Z =
typename impl::scalar_value_type_t<T>;
66 for (std::size_t p = 0; p < U.extent(0); ++p)
69 for (std::size_t i = 0; i < r.extent(1); ++i)
72 for (std::size_t k = 0; k < K.extent(0); ++k)
73 acc +=
static_cast<Z
>(K(k, i)) * U(p, k);
84 using T =
typename std::decay_t<O>::value_type;
85 using Z =
typename impl::scalar_value_type_t<T>;
86 for (std::size_t p = 0; p < U.extent(0); ++p)
88 for (std::size_t i = 0; i < r.extent(1); ++i)
91 for (std::size_t k = 0; k < J.extent(1); ++k)
92 acc +=
static_cast<Z
>(J(i, k)) * U(p, k);
97 std::transform(r.data_handle(), r.data_handle() + r.size(), r.data_handle(),
98 [detJ](
auto ri) { return ri / static_cast<Z>(detJ); });
107 = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE;
108 using T =
typename std::decay_t<O>::value_type;
109 using Z =
typename impl::scalar_value_type_t<T>;
110 for (std::size_t p = 0; p < U.extent(0); ++p)
112 MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
113 const T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, 2>>
114 _U(U.data_handle() + p * U.extent(1), J.extent(1), J.extent(1));
115 MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
116 T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, 2>>
117 _r(r.data_handle() + p * r.extent(1), K.extent(1), K.extent(1));
119 for (std::size_t i = 0; i < _r.extent(0); ++i)
121 for (std::size_t j = 0; j < _r.extent(1); ++j)
124 for (std::size_t k = 0; k < K.extent(0); ++k)
125 for (std::size_t l = 0; l < _U.extent(1); ++l)
126 acc +=
static_cast<Z
>(K(k, i)) * _U(k, l) *
static_cast<Z
>(K(l, j));
139 = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE;
140 using T =
typename std::decay_t<O>::value_type;
141 using Z =
typename impl::scalar_value_type_t<T>;
142 for (std::size_t p = 0; p < U.extent(0); ++p)
144 MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
145 const T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, 2>>
146 _U(U.data_handle() + p * U.extent(1), J.extent(1), J.extent(1));
147 MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
148 T, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t, 2>>
149 _r(r.data_handle() + p * r.extent(1), J.extent(0), J.extent(0));
152 for (std::size_t i = 0; i < _r.extent(0); ++i)
154 for (std::size_t j = 0; j < _r.extent(1); ++j)
157 for (std::size_t k = 0; k < J.extent(1); ++k)
158 for (std::size_t l = 0; l < _U.extent(1); ++l)
159 acc +=
static_cast<Z
>(J(i, k)) * _U(k, l) *
static_cast<Z
>(J(j, l));
165 std::transform(r.data_handle(), r.data_handle() + r.size(), r.data_handle(),
166 [detJ](
auto ri) { return ri / static_cast<Z>(detJ * detJ); });