7#ifndef GOOSEFEM_DETAIL_H
8#define GOOSEFEM_DETAIL_H
13template <
size_t nd,
typename =
void>
17struct tensor<nd, typename std::enable_if_t<nd == 2>> {
26 static double inv(
const T& A, T& Ainv)
28 double det = A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
30 Ainv(0, 0) = A(1, 1) / det;
31 Ainv(0, 1) = -1.0 * A(0, 1) / det;
32 Ainv(1, 0) = -1.0 * A(1, 0) / det;
33 Ainv(1, 1) = A(0, 0) / det;
40struct tensor<nd, typename std::enable_if_t<nd == 3>> {
49 static double inv(
const T& A, T& Ainv)
51 double det = (A(0, 0) * A(1, 1) * A(2, 2) + A(0, 1) * A(1, 2) * A(2, 0) +
52 A(0, 2) * A(1, 0) * A(2, 1)) -
53 (A(0, 2) * A(1, 1) * A(2, 0) + A(0, 1) * A(1, 0) * A(2, 2) +
54 A(0, 0) * A(1, 2) * A(2, 1));
56 Ainv(0, 0) = (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)) / det;
57 Ainv(0, 1) = (A(0, 2) * A(2, 1) - A(0, 1) * A(2, 2)) / det;
58 Ainv(0, 2) = (A(0, 1) * A(1, 2) - A(0, 2) * A(1, 1)) / det;
60 Ainv(1, 0) = (A(1, 2) * A(2, 0) - A(1, 0) * A(2, 2)) / det;
61 Ainv(1, 1) = (A(0, 0) * A(2, 2) - A(0, 2) * A(2, 0)) / det;
62 Ainv(1, 2) = (A(0, 2) * A(1, 0) - A(0, 0) * A(1, 2)) / det;
64 Ainv(2, 0) = (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0)) / det;
65 Ainv(2, 1) = (A(0, 1) * A(2, 0) - A(0, 0) * A(2, 1)) / det;
66 Ainv(2, 2) = (A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0)) / det;
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Toolbox to perform finite element computations.