OGS
KelvinVector.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <Eigen/Core>
7
8#include "BaseLib/Error.h"
9
10namespace MathLib
11{
15namespace KelvinVector
16{
18constexpr int kelvin_vector_dimensions(int const displacement_dim)
19{
20 if (displacement_dim == 2)
21 {
22 return 4;
23 }
24 else if (displacement_dim == 3)
25 {
26 return 6;
27 }
29 "Cannot convert displacement dimension {} to kelvin vector dimension.",
30 displacement_dim);
31}
32
33//
34// Kelvin vector and matrix templates for given displacement dimension.
35//
36
40template <int DisplacementDim>
42 Eigen::Matrix<double, kelvin_vector_dimensions(DisplacementDim), 1,
43 Eigen::ColMajor>;
44
48template <int DisplacementDim>
50 Eigen::Matrix<double, kelvin_vector_dimensions(DisplacementDim),
51 kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor>;
52
54template <int DisplacementDim>
55constexpr auto KVzero()
56{
58}
59
61template <int DisplacementDim>
62constexpr auto KMzero()
63{
65}
66
68template <int DisplacementDim>
69constexpr auto KVnan()
70{
72 std::numeric_limits<double>::quiet_NaN());
73}
74
76template <int DisplacementDim>
77constexpr auto KMnan()
78{
80 std::numeric_limits<double>::quiet_NaN());
81}
82
86template <int KelvinVectorSize>
87struct Invariants final
88{
89 static_assert(KelvinVectorSize == 4 || KelvinVectorSize == 6,
90 "KelvinVector invariants for vectors of size different than "
91 "4 or 6 is not allowed.");
94 static Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> const
98 static Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> const
101 static Eigen::Matrix<double, KelvinVectorSize, 1> const identity2;
102
105 static Eigen::Matrix<double, KelvinVectorSize, 1> const ones2;
106
108 static double determinant(
109 Eigen::Matrix<double, KelvinVectorSize, 1> const& v);
110
113 static double equivalentStress(
114 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v);
115
117 static double FrobeniusNorm(
118 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v);
119
122 static double J2(
123 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v);
124
127 static double J3(
128 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v);
129
131 static double trace(Eigen::Matrix<double, KelvinVectorSize, 1> const& v);
132
135 static Eigen::Vector3d diagonal(
136 Eigen::Matrix<double, KelvinVectorSize, 1> const& v);
137};
138
139//
140// Inverses of a Kelvin vector.
141//
142
145template <int KelvinVectorSize>
146Eigen::Matrix<double, KelvinVectorSize, 1, Eigen::ColMajor, KelvinVectorSize, 1>
147inverse(Eigen::Matrix<double,
148 KelvinVectorSize,
149 1,
150 Eigen::ColMajor,
151 KelvinVectorSize,
152 1> const& v);
153
156template <int KelvinVectorSize>
157Eigen::Matrix<double, 3, 3> kelvinVectorToTensor(Eigen::Matrix<double,
158 KelvinVectorSize,
159 1,
160 Eigen::ColMajor,
161 KelvinVectorSize,
162 1> const& v);
163
166template <int DisplacementDim>
168 Eigen::Matrix<double, 3, 3> const& m);
169
181template <int KelvinVectorSize>
182Eigen::Matrix<double, KelvinVectorSize, 1, Eigen::ColMajor, KelvinVectorSize, 1>
183kelvinVectorToSymmetricTensor(Eigen::Matrix<double,
184 KelvinVectorSize,
185 1,
186 Eigen::ColMajor,
187 KelvinVectorSize,
188 1> const& v);
189
197template <typename Derived>
198Eigen::Matrix<double, Eigen::MatrixBase<Derived>::RowsAtCompileTime, 1>
199symmetricTensorToKelvinVector(Eigen::MatrixBase<Derived> const& v)
200{
201 static_assert(
202 (Eigen::MatrixBase<Derived>::ColsAtCompileTime == 1) ||
203 (Eigen::MatrixBase<Derived>::ColsAtCompileTime == Eigen::Dynamic),
204 "KelvinVector must be a column vector");
205 if (v.cols() != 1)
206 {
207 OGS_FATAL(
208 "KelvinVector must be a column vector, but input has {:d} columns.",
209 v.cols());
210 }
211
212 Eigen::Matrix<double, Eigen::MatrixBase<Derived>::RowsAtCompileTime, 1>
213 result;
214 if (v.rows() == 4)
215 {
216 result.resize(4, 1);
217 result << v[0], v[1], v[2], v[3] * std::sqrt(2.);
218 }
219 else if (v.rows() == 6)
220 {
221 result.resize(6, 1);
222 result << v[0], v[1], v[2], v[3] * std::sqrt(2.), v[4] * std::sqrt(2.),
223 v[5] * std::sqrt(2.);
224 }
225 else
226 {
227 OGS_FATAL(
228 "Symmetric tensor to Kelvin vector conversion expected an input "
229 "vector of size 4 or 6, but a vector of size {:d} was given.",
230 v.size());
231 }
232 return result;
233}
234
239template <int DisplacementDim>
241 std::vector<double> const& values)
242{
243 constexpr int kelvin_vector_size =
244 kelvin_vector_dimensions(DisplacementDim);
245
246 if (values.size() != kelvin_vector_size)
247 {
248 OGS_FATAL(
249 "Symmetric tensor to Kelvin vector conversion expected an input "
250 "vector of size {:d}, but a vector of size {:d} was given.",
251 kelvin_vector_size, values.size());
252 }
253
255 Eigen::Map<typename MathLib::KelvinVector::KelvinVectorType<
256 DisplacementDim> const>(
257 values.data(), kelvin_vector_dimensions(DisplacementDim), 1));
258}
259
263template <int DisplacementDim>
264Eigen::Matrix<double, DisplacementDim,
265 kelvin_vector_dimensions(DisplacementDim)>
266liftVectorToKelvin(Eigen::Matrix<double, DisplacementDim, 1> const& v);
267
270template <int DisplacementDim>
271Eigen::Matrix<double, DisplacementDim, 1> reduceKelvinToVector(
272 Eigen::Matrix<double, DisplacementDim,
273 kelvin_vector_dimensions(DisplacementDim)> const& m);
274
279template <int DisplacementDim>
281 Eigen::Matrix<double, DisplacementDim, DisplacementDim, Eigen::ColMajor,
282 DisplacementDim, DisplacementDim> const& transformation);
283
284} // namespace KelvinVector
285} // namespace MathLib
286
287#include "KelvinVector-impl.h"
#define OGS_FATAL(...)
Definition Error.h:19
Eigen::Matrix< double, DisplacementDim, 1 > reduceKelvinToVector(Eigen::Matrix< double, DisplacementDim, kelvin_vector_dimensions(DisplacementDim)> const &m)
KelvinMatrixType< DisplacementDim > fourthOrderRotationMatrix(Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::ColMajor, DisplacementDim, DisplacementDim > const &transformation)
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
constexpr auto KVnan()
Returns an expressions for a Kelvin vector filled with NaN.
Eigen::Matrix< double, Eigen::MatrixBase< Derived >::RowsAtCompileTime, 1 > symmetricTensorToKelvinVector(Eigen::MatrixBase< Derived > const &v)
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
constexpr auto KMzero()
Returns an expressions for a Kelvin matrix filled with zero.
constexpr auto KVzero()
Returns an expressions for a Kelvin vector filled with zero.
Eigen::Matrix< double, DisplacementDim, kelvin_vector_dimensions(DisplacementDim)> liftVectorToKelvin(Eigen::Matrix< double, DisplacementDim, 1 > const &v)
constexpr auto KMnan()
Returns an expressions for a Kelvin matrix filled with NaN.
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > inverse(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
static const double v
static Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize > const spherical_projection
static double FrobeniusNorm(Eigen::Matrix< double, KelvinVectorSize, 1 > const &deviatoric_v)
Get the norm of the deviatoric stress.
static Eigen::Matrix< double, KelvinVectorSize, 1 > const identity2
Kelvin mapping of 2nd order identity tensor.
static Eigen::Vector3d diagonal(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
static Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize > const deviatoric_projection
static Eigen::Matrix< double, KelvinVectorSize, 1 > const ones2
static double trace(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Trace of the corresponding tensor.
static double J2(Eigen::Matrix< double, KelvinVectorSize, 1 > const &deviatoric_v)
static double determinant(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Determinant of a matrix in Kelvin vector representation.
static double equivalentStress(Eigen::Matrix< double, KelvinVectorSize, 1 > const &deviatoric_v)
static double J3(Eigen::Matrix< double, KelvinVectorSize, 1 > const &deviatoric_v)