OGS
CreepBGRa.cpp
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 "CreepBGRa.h"
5
6#include <Eigen/LU>
7#include <limits>
8
11
12namespace MPL = MaterialPropertyLib;
13
14namespace MaterialLib
15{
16namespace Solids
17{
18namespace Creep
19{
20double getCreepConstantCoefficient(const double A, const double n,
21 const double sigma0)
22{
23 return A * std::pow(1.5, 0.5 * (1 + n)) / std::pow(sigma0, n);
24}
25
26template <int DisplacementDim>
27std::optional<std::tuple<typename CreepBGRa<DisplacementDim>::KelvinVector,
28 std::unique_ptr<typename MechanicsBase<
29 DisplacementDim>::MaterialStateVariables>,
32 MaterialPropertyLib::VariableArray const& variable_array_prev,
33 MaterialPropertyLib::VariableArray const& variable_array, double const t,
34 ParameterLib::SpatialPosition const& x, double const dt,
36 /*material_state_variables*/) const
37{
38 auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
39 variable_array.mechanical_strain);
40 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
41 variable_array_prev.mechanical_strain);
42 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
43 variable_array_prev.stress);
44 auto const T = variable_array_prev.temperature;
45
47
48 Eigen::FullPivLU<Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize,
49 Eigen::RowMajor>>
50 linear_solver;
51
52 const auto C = this->getElasticTensor(t, x, T);
53 KelvinVector sigma_try = sigma_prev + C * (eps_m - eps_m_prev);
54
55 auto const& deviatoric_matrix = Invariants::deviatoric_projection;
56
57 double const norm_s_try =
58 Invariants::FrobeniusNorm(deviatoric_matrix * sigma_try);
59 // In case |s_{try}| is zero and _n < 3 (rare case).
60 if (norm_s_try < std::numeric_limits<double>::epsilon() * C(0, 0))
61 {
62 return {std::make_tuple(sigma_try, createMaterialStateVariables(), C)};
63 }
64
65 ResidualVectorType solution = sigma_try;
66
67 const double A = _a(t, x)[0];
68 const double n = _n(t, x)[0];
69 const double sigma0 = _sigma_f(t, x)[0];
70 const double Q = _q(t, x)[0];
71
72 const double constant_coefficient =
73 getCreepConstantCoefficient(A, n, sigma0);
74
75 const double b =
76 dt * constant_coefficient *
78
79 double const G2b = 2.0 * b * this->_mp.mu(t, x);
80
81 auto const update_jacobian = [&solution, &G2b, &n](JacobianMatrix& jacobian)
82 {
83 auto const& D = Invariants::deviatoric_projection;
84 KelvinVector const s_n1 = D * solution;
85 double const norm_s_n1 = Invariants::FrobeniusNorm(s_n1);
86 double const pow_norm_s_n1_n_minus_one_2b_G =
87 G2b * std::pow(norm_s_n1, n - 1);
88 jacobian = KelvinMatrix::Identity() +
89 (pow_norm_s_n1_n_minus_one_2b_G * D +
90 (n - 1) * G2b * std::pow(norm_s_n1, n - 3) * s_n1 *
91 s_n1.transpose());
92 };
93
94 auto const update_residual =
95 [&solution, &G2b, &n, &sigma_try](ResidualVectorType& r)
96 {
97 KelvinVector const s_n1 = Invariants::deviatoric_projection * solution;
98 double const norm_s_n1 = Invariants::FrobeniusNorm(s_n1);
99 double const pow_norm_s_n1_n_minus_one_2b_G =
100 G2b * std::pow(norm_s_n1, n - 1);
101 r = solution - sigma_try + pow_norm_s_n1_n_minus_one_2b_G * s_n1;
102 };
103
104 auto const update_solution = [&](ResidualVectorType const& increment)
105 { solution += increment; };
106
107 auto newton_solver =
108 NumLib::NewtonRaphson(linear_solver, update_jacobian, update_residual,
109 update_solution, _nonlinear_solver_parameters);
110
111 JacobianMatrix jacobian;
112 auto const success_iterations = newton_solver.solve(jacobian);
113
114 if (!success_iterations)
115 {
116 return {};
117 }
118
119 // If *success_iterations>0, tangentStiffness = J_(sigma)^{-1}C
120 // where J_(sigma) is the Jacobian of the last local Newton-Raphson
121 // iteration, which is already LU decomposed.
122 KelvinMatrix tangentStiffness =
123 (*success_iterations == 0) ? C : linear_solver.solve(C);
124
125 return {std::make_tuple(solution, createMaterialStateVariables(),
126 tangentStiffness)};
127}
128
129template <int DisplacementDim>
131 double const t, double const dt, ParameterLib::SpatialPosition const& x,
132 double const T, double const deviatoric_stress_norm) const
133{
134 const double A = _a(t, x)[0];
135 const double n = _n(t, x)[0];
136 const double sigma0 = _sigma_f(t, x)[0];
137 const double Q = _q(t, x)[0];
138
139 const double constant_coefficient =
140 getCreepConstantCoefficient(A, n, sigma0);
141
142 return 2.0 * constant_coefficient *
143 std::exp(-Q /
145 this->_mp.mu(t, x) * std::pow(deviatoric_stress_norm, n - 1) * dt *
147}
148
149template class CreepBGRa<2>;
150template class CreepBGRa<3>;
151
152} // namespace Creep
153} // namespace Solids
154} // namespace MaterialLib
A class for computing the BGRa creep model, which reads.
Definition CreepBGRa.h:32
Parameter const & _n
A parameter determined by experiment.
Definition CreepBGRa.h:94
Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize, Eigen::RowMajor > JacobianMatrix
Definition CreepBGRa.h:36
Eigen::Matrix< double, KelvinVectorSize, 1 > ResidualVectorType
Definition CreepBGRa.h:35
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Definition CreepBGRa.h:41
Parameter const & _q
A stress scaling factor.
Definition CreepBGRa.h:96
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
Definition CreepBGRa.h:39
NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters
Definition CreepBGRa.h:91
Parameter const & _sigma_f
Creep rate exponent n.
Definition CreepBGRa.h:95
double getTemperatureRelatedCoefficient(double const t, double const dt, ParameterLib::SpatialPosition const &x, double const T, double const deviatoric_stress_norm) const override
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 CreepBGRa.cpp:31
std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > createMaterialStateVariables() const override
Definition CreepBGRa.h:50
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
double getCreepConstantCoefficient(const double A, const double n, const double sigma0)
Definition CreepBGRa.cpp:20