OGS
KelvinVector-impl.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#include <cmath>
5
6namespace MathLib
7{
8namespace KelvinVector
9{
10template <int KelvinVectorSize>
12 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v)
13{
14 assert(std::abs(trace(deviatoric_v)) <=
15 4e-12 * diagonal(deviatoric_v).norm());
16 return std::sqrt(3 * J2(deviatoric_v));
17}
18
19template <int KelvinVectorSize>
21 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v)
22{
23 return std::sqrt(deviatoric_v.transpose() * deviatoric_v);
24}
25
26template <int KelvinVectorSize>
28 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v)
29{
30 assert(std::abs(trace(deviatoric_v)) <=
31 4e-12 * diagonal(deviatoric_v).norm());
32 return 0.5 * deviatoric_v.transpose() * deviatoric_v;
33}
34
37template <int KelvinVectorSize>
39 Eigen::Matrix<double, KelvinVectorSize, 1> const& deviatoric_v)
40{
41 assert(std::abs(trace(deviatoric_v)) <=
42 4e-12 * diagonal(deviatoric_v).norm());
43 return determinant(deviatoric_v);
44}
45
46template <int KelvinVectorSize>
48 Eigen::Matrix<double, KelvinVectorSize, 1> const& v)
49{
50 return v.template topLeftCorner<3, 1>();
51}
52
54template <int KelvinVectorSize>
56 Eigen::Matrix<double, KelvinVectorSize, 1> const& v)
57{
58 return diagonal(v).sum();
59}
60
61//
62// Initialization of static Invariant variables.
63//
64
66{
67template <int KelvinVectorSize>
68Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize>
70{
71 Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> P_dev =
72 Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize>::Identity();
73
74 P_dev.template topLeftCorner<3, 3>() -=
75 1. / 3. * Eigen::Matrix<double, 3, 3>::Ones();
76 return P_dev;
77}
78
79template <int KelvinVectorSize>
80Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize>
82{
83 Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> P_sph =
84 Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize>::Zero();
85
86 P_sph.template topLeftCorner<3, 3>().setConstant(1. / 3.);
87 return P_sph;
88}
89
90template <int KelvinVectorSize>
91Eigen::Matrix<double, KelvinVectorSize, 1> initIdentity2()
92{
93 Eigen::Matrix<double, KelvinVectorSize, 1> ivec =
94 Eigen::Matrix<double, KelvinVectorSize, 1>::Zero();
95
96 ivec.template topLeftCorner<3, 1>().setConstant(1.);
97 return ivec;
98}
99
100template <int KelvinVectorSize>
101Eigen::Matrix<double, KelvinVectorSize, 1> initOnes2()
102{
103 Eigen::Matrix<double, KelvinVectorSize, 1> ivec =
104 Eigen::Matrix<double, KelvinVectorSize, 1>::Ones();
105
106 ivec.template bottomLeftCorner<KelvinVectorSize - 3, 1>().setConstant(
107 std::sqrt(2.));
108
109 return ivec;
110}
111} // namespace KelvinVector_detail
112
113template <int KelvinVectorSize>
114const Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize>
117
118template <int KelvinVectorSize>
119Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize> const
122
123template <int KelvinVectorSize>
124const Eigen::Matrix<double, KelvinVectorSize, 1>
127
128template <int KelvinVectorSize>
129const Eigen::Matrix<double, KelvinVectorSize, 1>
132
133} // namespace KelvinVector
134} // namespace MathLib
Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize > initSphericalProjection()
Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize > initDeviatoricProjection()
Eigen::Matrix< double, KelvinVectorSize, 1 > initOnes2()
Eigen::Matrix< double, KelvinVectorSize, 1 > initIdentity2()
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)