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