OGS 6.1.0-1721-g6382411ad
KelvinVector.cpp
Go to the documentation of this file.
1 
10 #include "KelvinVector.h"
11 
12 #include "BaseLib/Error.h"
13 
14 namespace MathLib
15 {
16 namespace KelvinVector
17 {
18 template <>
19 double Invariants<6>::determinant(Eigen::Matrix<double, 6, 1> const& v)
20 {
21  return v(0) * v(1) * v(2) + v(3) * v(4) * v(5) / std::sqrt(2.) -
22  v(3) * v(3) * v(2) / 2. - v(4) * v(4) * v(0) / 2. -
23  v(5) * v(5) * v(1) / 2.;
24 }
25 
26 template <>
27 double Invariants<4>::determinant(Eigen::Matrix<double, 4, 1> const& v)
28 {
29  return v(2) * (v(0) * v(1) - v(3) * v(3) / 2.);
30 }
31 
32 template <>
33 Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> inverse(
34  Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> const& v)
35 {
36  assert(Invariants<4>::determinant(v) != 0);
37 
38  Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> inv;
39  inv(0) = v(1) * v(2);
40  inv(1) = v(0) * v(2);
41  inv(2) = v(0) * v(1) - v(3) * v(3) / 2.;
42  inv(3) = -v(3) * v(2);
43  return inv / Invariants<4>::determinant(v);
44 }
45 
46 template <>
47 Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> inverse(
48  Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> const& v)
49 {
50  assert(Invariants<6>::determinant(v) != 0);
51 
52  Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> inv;
53  inv(0) = v(1) * v(2) - v(4) * v(4) / 2.;
54  inv(1) = v(0) * v(2) - v(5) * v(5) / 2.;
55  inv(2) = v(0) * v(1) - v(3) * v(3) / 2.;
56  inv(3) = v(4) * v(5) / std::sqrt(2.) - v(3) * v(2);
57  inv(4) = v(3) * v(5) / std::sqrt(2.) - v(4) * v(0);
58  inv(5) = v(4) * v(3) / std::sqrt(2.) - v(1) * v(5);
59  return inv / Invariants<6>::determinant(v);
60 }
61 
62 template <>
63 Eigen::Matrix<double, 3, 3> kelvinVectorToTensor(
64  Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> const& v)
65 {
66  Eigen::Matrix<double, 3, 3> m;
67  m << v[0], v[3] / std::sqrt(2.), 0, v[3] / std::sqrt(2.), v[1], 0, 0, 0,
68  v[2];
69  return m;
70 }
71 
72 template <>
73 Eigen::Matrix<double, 3, 3> kelvinVectorToTensor(
74  Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> const& v)
75 {
76  Eigen::Matrix<double, 3, 3> m;
77  m << v[0], v[3] / std::sqrt(2.), v[5] / std::sqrt(2.), v[3] / std::sqrt(2.),
78  v[1], v[4] / std::sqrt(2.), v[5] / std::sqrt(2.), v[4] / std::sqrt(2.),
79  v[2];
80  return m;
81 }
82 
83 template <>
84 Eigen::Matrix<double, 3, 3> kelvinVectorToTensor(Eigen::Matrix<double,
85  Eigen::Dynamic,
86  1,
87  Eigen::ColMajor,
88  Eigen::Dynamic,
89  1> const& v)
90 {
91  if (v.size() == 4)
92  {
93  Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> v4;
94  v4 << v[0], v[1], v[2], v[3];
95  return kelvinVectorToTensor(v4);
96  }
97  if (v.size() == 6)
98  {
99  Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> v6;
100  v6 << v[0], v[1], v[2], v[3], v[4], v[5];
101  return kelvinVectorToTensor(v6);
102  }
103  OGS_FATAL(
104  "Conversion of dynamic Kelvin vector of size %d to a tensor is not "
105  "possible. Kelvin vector must be of size 4 or 6.",
106  v.size());
107 }
108 
109 template <>
110 KelvinVectorType<2> tensorToKelvin<2>(Eigen::Matrix<double, 3, 3> const& m)
111 {
112  assert(std::abs(m(0, 1) - m(1, 0)) <
113  std::numeric_limits<double>::epsilon());
114  assert(m(0, 2) == 0);
115  assert(m(1, 2) == 0);
116  assert(m(2, 0) == 0);
117  assert(m(2, 1) == 0);
118 
120  v << m(0, 0), m(1, 1), m(2, 2), m(0, 1) * std::sqrt(2.);
121  return v;
122 }
123 
124 template <>
125 KelvinVectorType<3> tensorToKelvin<3>(Eigen::Matrix<double, 3, 3> const& m)
126 {
127  assert(std::abs(m(0, 1) - m(1, 0)) <
128  std::numeric_limits<double>::epsilon());
129  assert(std::abs(m(1, 2) - m(2, 1)) <
130  std::numeric_limits<double>::epsilon());
131  assert(std::abs(m(0, 2) - m(2, 0)) <
132  std::numeric_limits<double>::epsilon());
133 
135  v << m(0, 0), m(1, 1), m(2, 2), m(0, 1) * std::sqrt(2.),
136  m(1, 2) * std::sqrt(2.), m(0, 2) * std::sqrt(2.);
137  return v;
138 }
139 
140 template <>
141 Eigen::Matrix<double, 4, 1> kelvinVectorToSymmetricTensor(
142  Eigen::Matrix<double, 4, 1, Eigen::ColMajor, 4, 1> const& v)
143 {
144  Eigen::Matrix<double, 4, 1> m;
145  m << v[0], v[1], v[2], v[3] / std::sqrt(2.);
146  return m;
147 }
148 
149 template <>
150 Eigen::Matrix<double, 6, 1> kelvinVectorToSymmetricTensor(
151  Eigen::Matrix<double, 6, 1, Eigen::ColMajor, 6, 1> const& v)
152 {
153  Eigen::Matrix<double, 6, 1> m;
154  m << v[0], v[1], v[2], v[3] / std::sqrt(2.), v[4] / std::sqrt(2.),
155  v[5] / std::sqrt(2.);
156  return m;
157 }
158 
159 template <>
160 Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor, Eigen::Dynamic, 1>
161 kelvinVectorToSymmetricTensor(Eigen::Matrix<double,
162  Eigen::Dynamic,
163  1,
164  Eigen::ColMajor,
165  Eigen::Dynamic,
166  1> const& v)
167 {
168  if (v.size() == 4)
169  {
170  return kelvinVectorToSymmetricTensor<4>(v);
171  }
172  else if (v.size() == 6)
173  {
174  return kelvinVectorToSymmetricTensor<6>(v);
175  }
176  else
177  {
178  OGS_FATAL(
179  "Kelvin vector to tensor conversion expected an input vector of "
180  "size 4 or 6, but a vector of size %d was given.",
181  v.size());
182  }
183 }
184 } // namespace KelvinVector
185 } // namespace MathLib
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
KelvinVectorType< 3 > tensorToKelvin< 3 >(Eigen::Matrix< double, 3, 3 > const &m)
#define OGS_FATAL(fmt,...)
Definition: Error.h:71
static double determinant(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Determinant of a matrix in Kelvin vector representation.
Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > inverse(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
KelvinVectorType< 2 > tensorToKelvin< 2 >(Eigen::Matrix< double, 3, 3 > const &m)
Eigen::Matrix< double, KelvinVectorDimensions< DisplacementDim >::value, 1, Eigen::ColMajor > KelvinVectorType
Definition: KelvinVector.h:49