23template <
typename T,
typename =
void>
24struct scalar_value_type
31struct scalar_value_type<
T,
std::
void_t<typename T::value_type>>
33 typedef typename T::value_type value_type;
37using scalar_value_type_t =
typename scalar_value_type<T>::value_type;
138 std::size_t
offset = 0, std::size_t
n = 1)
140 for (std::size_t
i = 0;
i <
perm.size(); ++
i)
141 for (std::size_t
b = 0;
b <
n; ++
b)
154 std::span<E>
data, std::span<const int>
emap,
157 for (std::size_t
i = 0;
i <
perm.size(); ++
i)
158 for (std::size_t
b = 0;
b <
n; ++
b)
186 const std::size_t dim =
perm.size();
188 for (std::size_t
b = 0;
b <
n; ++
b)
190 for (std::size_t
i = 0;
i < dim; ++
i)
213template <std::
floating_po
int T>
214std::vector<std::size_t>
217 return math::transpose_lu<T>(
A);
251template <
typename T,
typename E>
253 md::mdspan<
const T, md::dextents<std::size_t, 2>> M,
254 std::span<E>
data, std::size_t
offset = 0, std::size_t
n = 1)
256 using U =
typename impl::scalar_value_type_t<E>;
258 const std::size_t dim =
v_size_t.size();
268 for (std::size_t
b = 0;
b <
n; ++
b)
270 for (std::size_t
i = 0;
i < dim; ++
i)
272 for (std::size_t
j =
i + 1;
j < dim; ++
j)
279 for (std::size_t
i = 1;
i <= dim; ++
i)
282 for (std::size_t
j = 0;
j < dim -
i; ++
j)
292 for (std::size_t
i = 0;
i < dim; ++
i)
294 for (std::size_t
j =
i + 1;
j < dim; ++
j)
296 const U Mij =
static_cast<U>(M(
i,
j));
297 for (std::size_t
b = 0;
b <
n; ++
b)
304 for (std::size_t
i = 1;
i <= dim; ++
i)
306 const U Mdiag =
static_cast<U>(M(dim -
i, dim -
i));
307 for (std::size_t
b = 0;
b <
n; ++
b)
310 for (std::size_t
j = 0;
j < dim -
i; ++
j)
312 const U Mij =
static_cast<U>(M(dim -
i,
j));
313 for (std::size_t
b = 0;
b <
n; ++
b)
342template <
typename T,
typename E>
344 std::span<const std::size_t>
v_size_t,
345 md::mdspan<
const T, md::dextents<std::size_t, 2>> M, std::span<E>
data,
346 std::size_t
offset = 0, std::size_t
n = 1)
348 using U =
typename impl::scalar_value_type_t<E>;
350 const std::size_t dim =
v_size_t.size();
353 for (std::size_t
b = 0;
b <
n; ++
b)
355 for (std::size_t
i = 0;
i < dim; ++
i)
357 for (std::size_t
j =
i + 1;
j < dim; ++
j)
363 for (std::size_t
i = 1;
i <= dim; ++
i)
366 *=
static_cast<U>(M(dim -
i, dim -
i));
367 for (std::size_t
j = 0;
j < dim -
i; ++
j)
A finite element.
Definition finite-element.h:138
Matrix and permutation pre-computation.
Definition precompute.h:18
std::vector< std::size_t > prepare_matrix(std::pair< std::vector< T >, std::array< std::size_t, 2 > > &A)
Prepare a square matrix.
Definition precompute.h:215
void apply_permutation(std::span< const std::size_t > perm, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) permutation .
Definition precompute.h:137
void apply_inv_permutation_right(std::span< const std::size_t > perm, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) permutation to some transposed data.
Definition precompute.h:182
void prepare_permutation(std::span< std::size_t > perm)
Prepare a permutation.
Definition precompute.cpp:10
void apply_permutation_mapped(std::span< const std::size_t > perm, std::span< E > data, std::span< const int > emap, std::size_t n=1)
Permutation of mapped data.
Definition precompute.h:153
void apply_tranpose_matrix_right(std::span< const std::size_t > v_size_t, md::mdspan< const T, md::dextents< std::size_t, 2 > > M, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) matrix to some transposed data.
Definition precompute.h:343
void apply_matrix(std::span< const std::size_t > v_size_t, md::mdspan< const T, md::dextents< std::size_t, 2 > > M, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) matrix.
Definition precompute.h:252