GooseFEM 1.4.1.dev2+g78f16df
Loading...
Searching...
No Matches
detail.h
Go to the documentation of this file.
1
7#ifndef GOOSEFEM_DETAIL_H
8#define GOOSEFEM_DETAIL_H
9
10namespace GooseFEM {
11namespace detail {
12
13template <size_t nd, typename = void>
14struct tensor {};
15
16template <size_t nd>
17struct tensor<nd, typename std::enable_if_t<nd == 2>> {
25 template <class T>
26 static double inv(const T& A, T& Ainv)
27 {
28 double det = A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
29
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;
34
35 return det;
36 }
37};
38
39template <size_t nd>
40struct tensor<nd, typename std::enable_if_t<nd == 3>> {
48 template <class T>
49 static double inv(const T& A, T& Ainv)
50 {
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));
55
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;
59
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;
63
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;
67
68 return det;
69 }
70};
71
72} // namespace detail
73} // namespace GooseFEM
74
75#endif
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:177
Toolbox to perform finite element computations.
Definition Allocate.h:14