OGS
Lubby2.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
9
10#include "MechanicsBase.h"
11
12namespace MaterialLib
13{
14namespace Solids
15{
16namespace Lubby2
17{
18//
19// Variables specific to the material model.
20//
22{
25 P const& GM0_,
26 P const& KM0_,
27 P const& etaK0_,
28 P const& etaM0_,
29 P const& mK_,
30 P const& mvK_,
31 P const& mvM_)
32 : GK0(GK0_),
33 GM0(GM0_),
34 KM0(KM0_),
35 etaK0(etaK0_),
36 etaM0(etaM0_),
37 mK(mK_),
38 mvK(mvK_),
39 mvM(mvM_)
40 {
41 }
42
43 // basic material parameters
44 P const& GK0;
45 P const& GM0;
46 P const& KM0;
47 P const& etaK0;
48 P const& etaM0;
49 P const& mK;
50 P const& mvK;
51 P const& mvM;
52};
53
54namespace detail
55{
56template <int DisplacementDim>
58{
59 LocalLubby2Properties(double const t,
62 : GM0(mp.GM0(t, x)[0]),
63 KM0(mp.KM0(t, x)[0]),
64 GK0(mp.GK0(t, x)[0]),
65 etaK0(mp.etaK0(t, x)[0]),
66 etaM0(mp.etaM0(t, x)[0]),
67 mK(mp.mK(t, x)[0]),
68 mvK(mp.mvK(t, x)[0]),
69 mvM(mp.mvM(t, x)[0])
70 {
71 }
72
73 void update(double const s_eff)
74 {
75 double const GM0_s_eff = GM0 * s_eff;
76 GK = GK0 * std::exp(mK * GM0_s_eff);
77 etaK = etaK0 * std::exp(mvK * GM0_s_eff);
78 etaM = etaM0 * std::exp(mvM * GM0_s_eff);
79 }
80
81 double const GM0;
82 double const KM0;
83 double const GK0;
84 double const etaK0;
85 double const etaM0;
86 double const mK;
87 double const mvK;
88 double const mvM;
89
90 // Solution dependent values.
91 double GK = std::numeric_limits<double>::quiet_NaN();
92 double etaK = std::numeric_limits<double>::quiet_NaN();
93 double etaM = std::numeric_limits<double>::quiet_NaN();
94};
95} // namespace detail
96
97template <int DisplacementDim>
98class Lubby2 final : public MechanicsBase<DisplacementDim>
99{
100public:
102 : public MechanicsBase<DisplacementDim>::MaterialStateVariables
103 {
105 {
106 // Previous time step values are not initialized and are set later.
109
110 // Initialize current time step values
111 eps_K_j.setZero(KelvinVectorSize);
112 eps_M_j.setZero(KelvinVectorSize);
113 }
114
116 {
119 }
120
121 void pushBackState() override
122 {
125 }
126
139
141 };
142
143 std::unique_ptr<
146 {
147 return std::unique_ptr<
150 }
151
152public:
153 static int const KelvinVectorSize =
159
160 static int const JacobianResidualSize =
161 3 * KelvinVectorSize; // Three is the number of components in the
162 // jacobian/residual, not the space dimension.
163 using ResidualVector = Eigen::Matrix<double, JacobianResidualSize, 1>;
164 using JacobianMatrix = Eigen::Matrix<double,
167 Eigen::RowMajor>;
168
169public:
170 explicit Lubby2(
171 NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters,
172 Lubby2MaterialProperties& material_properties)
173 : _nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)),
174 _mp(material_properties)
175 {
176 }
177
179 double const t,
181 double const dt,
182 KelvinVector const& eps,
183 KelvinVector const& sigma,
185 material_state_variables) const override
186 {
187 assert(dynamic_cast<MaterialStateVariables const*>(
188 &material_state_variables) != nullptr);
189 MaterialStateVariables state(static_cast<MaterialStateVariables const&>(
190 material_state_variables));
191
192 auto const& eps_K = state.eps_K_j;
193 auto const& eps_K_prev = state.eps_K_t;
194
195 auto const& eps_M = state.eps_M_j;
196
197 auto local_lubby2_properties =
199
200 // calculation of deviatoric parts
202 auto const& P_dev = Invariants::deviatoric_projection;
203 KelvinVector const epsd_i = P_dev * eps;
204
205 // initial guess as elastic predictor
206 KelvinVector sigd_j = 2.0 * (epsd_i - state.eps_M_t - state.eps_K_t);
207
208 // Calculate effective stress and update material properties
209 double sig_eff = Invariants::equivalentStress(sigd_j);
210 local_lubby2_properties.update(sig_eff);
211
212 auto const& eta_K = local_lubby2_properties.etaK;
213
214 // This is specific to the backward Euler time scheme and needs to be
215 // updated if other time schemes are used.
216 return (eps - eps_K - eps_M).dot(sigma) / 2 +
217 eps_K.dot(sigma - eta_K * (eps_K - eps_K_prev) / dt) / 2;
218 }
219
220 double getBulkModulus(double const t,
222 KelvinMatrix const* const /*C*/) const override
223 {
224 return _mp.KM0(t, x)[0];
225 }
226
227 std::optional<std::tuple<KelvinVector,
228 std::unique_ptr<typename MechanicsBase<
229 DisplacementDim>::MaterialStateVariables>,
232 MaterialPropertyLib::VariableArray const& variable_array_prev,
233 MaterialPropertyLib::VariableArray const& variable_array,
234 double const t, ParameterLib::SpatialPosition const& x, double const dt,
236 material_state_variables) const override;
237
238private:
241 double const dt,
242 const KelvinVector& strain_curr,
243 const KelvinVector& strain_t,
244 const KelvinVector& stress_curr,
245 const KelvinVector& stress_t,
246 const KelvinVector& strain_Kel_curr,
247 const KelvinVector& strain_Kel_t,
248 const KelvinVector& strain_Max_curr,
249 const KelvinVector& strain_Max_t,
250 ResidualVector& res,
251 detail::LocalLubby2Properties<DisplacementDim> const& properties) const;
252
255 double const t,
257 double const dt,
258 JacobianMatrix& Jac,
259 double s_eff,
260 const KelvinVector& sig_i,
261 const KelvinVector& eps_K_i,
262 detail::LocalLubby2Properties<DisplacementDim> const& properties) const;
263
264private:
267};
268
269extern template class Lubby2<2>;
270extern template class Lubby2<3>;
271
272} // namespace Lubby2
273} // namespace Solids
274} // namespace MaterialLib
std::optional< std::tuple< KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
Definition Lubby2.cpp:69
NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters
Definition Lubby2.h:265
double computeFreeEnergyDensity(double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
Definition Lubby2.h:178
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Definition Lubby2.h:157
Lubby2(NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, Lubby2MaterialProperties &material_properties)
Definition Lubby2.h:170
Eigen::Matrix< double, JacobianResidualSize, 1 > ResidualVector
Definition Lubby2.h:163
Lubby2MaterialProperties _mp
Definition Lubby2.h:266
Eigen::Matrix< double, JacobianResidualSize, JacobianResidualSize, Eigen::RowMajor > JacobianMatrix
Definition Lubby2.h:164
double getBulkModulus(double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const) const override
Definition Lubby2.h:220
static int const JacobianResidualSize
Definition Lubby2.h:160
static int const KelvinVectorSize
Definition Lubby2.h:153
std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > createMaterialStateVariables() const override
Definition Lubby2.h:145
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
Definition Lubby2.h:155
void calculateJacobianBurgers(double const t, ParameterLib::SpatialPosition const &x, double const dt, JacobianMatrix &Jac, double s_eff, const KelvinVector &sig_i, const KelvinVector &eps_K_i, detail::LocalLubby2Properties< DisplacementDim > const &properties) const
Calculates the 18x18 Jacobian.
Definition Lubby2.cpp:240
void calculateResidualBurgers(double const dt, const KelvinVector &strain_curr, const KelvinVector &strain_t, const KelvinVector &stress_curr, const KelvinVector &stress_t, const KelvinVector &strain_Kel_curr, const KelvinVector &strain_Kel_t, const KelvinVector &strain_Max_curr, const KelvinVector &strain_Max_t, ResidualVector &res, detail::LocalLubby2Properties< DisplacementDim > const &properties) const
Calculates the 18x1 residual vector.
Definition Lubby2.cpp:207
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
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Lubby2MaterialProperties(P const &GK0_, P const &GM0_, P const &KM0_, P const &etaK0_, P const &etaM0_, P const &mK_, P const &mvK_, P const &mvM_)
Definition Lubby2.h:24
ParameterLib::Parameter< double > P
Definition Lubby2.h:23
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
Definition Lubby2.h:127
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Definition Lubby2.h:129
LocalLubby2Properties(double const t, ParameterLib::SpatialPosition const &x, Lubby2MaterialProperties const &mp)
Definition Lubby2.h:59