7#ifndef GOOSEFEM_DETAIL_H
8#define GOOSEFEM_DETAIL_H
13template <
size_t nd,
typename =
void>
18struct tensor<nd, typename std::enable_if_t<nd == 2>> {
27 static double inv(
const T& A, T& Ainv)
29 double det = A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
31 Ainv(0, 0) = A(1, 1) /
det;
32 Ainv(0, 1) = -1.0 * A(0, 1) /
det;
33 Ainv(1, 0) = -1.0 * A(1, 0) /
det;
34 Ainv(1, 1) = A(0, 0) /
det;
41struct tensor<nd, typename std::enable_if_t<nd == 3>> {
50 static double inv(
const T& A, T& Ainv)
52 double det = (A(0, 0) * A(1, 1) * A(2, 2) + A(0, 1) * A(1, 2) * A(2, 0) +
53 A(0, 2) * A(1, 0) * A(2, 1)) -
54 (A(0, 2) * A(1, 1) * A(2, 0) + A(0, 1) * A(1, 0) * A(2, 2) +
55 A(0, 0) * A(1, 2) * A(2, 1));
57 Ainv(0, 0) = (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)) / det;
58 Ainv(0, 1) = (A(0, 2) * A(2, 1) - A(0, 1) * A(2, 2)) / det;
59 Ainv(0, 2) = (A(0, 1) * A(1, 2) - A(0, 2) * A(1, 1)) / det;
61 Ainv(1, 0) = (A(1, 2) * A(2, 0) - A(1, 0) * A(2, 2)) / det;
62 Ainv(1, 1) = (A(0, 0) * A(2, 2) - A(0, 2) * A(2, 0)) / det;
63 Ainv(1, 2) = (A(0, 2) * A(1, 0) - A(0, 0) * A(1, 2)) / det;
65 Ainv(2, 0) = (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0)) / det;
66 Ainv(2, 1) = (A(0, 1) * A(2, 0) - A(0, 0) * A(2, 1)) / det;
67 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.
void det(const T &A, R &ret)
Same as Det() but writes to externally allocated output.
void inv(const T &A, R &ret)
Same as Inv() but writes to externally allocated output.
Toolbox to perform finite element computations.