OGS
MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim > Class Template Referencefinal

Detailed Description

template<int DisplacementDim>
class MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >

A class for computing the BGRa creep model, which reads.

\[ \dot {\mathbf{\epsilon}}^{cr}=\sqrt{\frac{3}{2}}A \mathrm{e}^{-\frac{Q}{RT}} \left(\frac{\sigma_{eff}}{\sigma_0}\right)^n\frac{\mathbf{s}}{||\mathbf{s}||} \]

where \(\sigma_{eff}=\sqrt{\frac{3}{2}}||\mathbf{s}||\), \(A, \sigma_0, n, Q\) are parameter, and \(R\) is the gas constant.

Definition at line 39 of file CreepBGRa.h.

#include <CreepBGRa.h>

Inheritance diagram for MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >:
[legend]
Collaboration diagram for MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >:
[legend]

Public Types

using ResidualVectorType = Eigen::Matrix< double, KelvinVectorSize, 1 >
 
using JacobianMatrix = Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize, Eigen::RowMajor >
 
using KelvinVector = MathLib::KelvinVector::KelvinVectorType< DisplacementDim >
 
using KelvinMatrix = MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >
 
using Parameter = ParameterLib::Parameter< double >
 
- Public Types inherited from MaterialLib::Solids::LinearElasticIsotropic< DisplacementDim >
using KelvinVector = MathLib::KelvinVector::KelvinVectorType< DisplacementDim >
 
using KelvinMatrix = MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >
 
- Public Types inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
using KelvinVector = MathLib::KelvinVector::KelvinVectorType< DisplacementDim >
 
using KelvinMatrix = MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >
 

Public Member Functions

std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariablescreateMaterialStateVariables () const override
 
 CreepBGRa (typename LinearElasticIsotropic< DisplacementDim >::MaterialProperties mp, NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, Parameter const &A, Parameter const &n, Parameter const &sigma_f, Parameter const &Q)
 
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
 
ConstitutiveModel getConstitutiveModel () const override
 Gets the type of constitutive model. More...
 
double getTemperatureRelatedCoefficient (double const t, double const dt, ParameterLib::SpatialPosition const &x, double const T, double const deviatoric_stress_norm) const override
 
- Public Member Functions inherited from MaterialLib::Solids::LinearElasticIsotropic< DisplacementDim >
 LinearElasticIsotropic (MaterialProperties material_properties)
 
double computeFreeEnergyDensity (double const, ParameterLib::SpatialPosition const &, double const, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &) const override
 
std::optional< std::tuple< typename MechanicsBase< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename MechanicsBase< DisplacementDim >::KelvinMatrix > > integrateStress (MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
 
KelvinMatrix getElasticTensor (double const t, ParameterLib::SpatialPosition const &x, double const T) const
 
MaterialProperties getMaterialProperties () const
 
double getBulkModulus (double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const) const override
 
- Public Member Functions inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
virtual std::optional< std::tuple< KelvinVector, std::unique_ptr< MaterialStateVariables >, KelvinMatrix > > integrateStress (MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, MaterialStateVariables const &material_state_variables) const =0
 
virtual std::vector< InternalVariablegetInternalVariables () const
 
virtual double computeFreeEnergyDensity (double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, MaterialStateVariables const &material_state_variables) const =0
 
virtual ~MechanicsBase ()=default
 

Private Attributes

NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters
 
Parameter const & _a
 
Parameter const & _n
 A parameter determined by experiment. More...
 
Parameter const & _sigma_f
 Creep rate exponent n. More...
 
Parameter const & _q
 A stress scaling factor. More...
 

Additional Inherited Members

- Static Public Attributes inherited from MaterialLib::Solids::LinearElasticIsotropic< DisplacementDim >
static int const KelvinVectorSize
 
- Protected Attributes inherited from MaterialLib::Solids::LinearElasticIsotropic< DisplacementDim >
MaterialProperties _mp
 

Member Typedef Documentation

◆ JacobianMatrix

template<int DisplacementDim>
using MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::JacobianMatrix = Eigen::Matrix<double, KelvinVectorSize, KelvinVectorSize, Eigen::RowMajor>

Definition at line 44 of file CreepBGRa.h.

◆ KelvinMatrix

template<int DisplacementDim>
using MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::KelvinMatrix = MathLib::KelvinVector::KelvinMatrixType<DisplacementDim>

Definition at line 49 of file CreepBGRa.h.

◆ KelvinVector

template<int DisplacementDim>
using MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::KelvinVector = MathLib::KelvinVector::KelvinVectorType<DisplacementDim>

Definition at line 47 of file CreepBGRa.h.

◆ Parameter

template<int DisplacementDim>
using MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::Parameter = ParameterLib::Parameter<double>

Definition at line 52 of file CreepBGRa.h.

◆ ResidualVectorType

template<int DisplacementDim>
using MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::ResidualVectorType = Eigen::Matrix<double, KelvinVectorSize, 1>

Definition at line 43 of file CreepBGRa.h.

Constructor & Destructor Documentation

◆ CreepBGRa()

template<int DisplacementDim>
MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::CreepBGRa ( typename LinearElasticIsotropic< DisplacementDim >::MaterialProperties  mp,
NumLib::NewtonRaphsonSolverParameters  nonlinear_solver_parameters,
Parameter const &  A,
Parameter const &  n,
Parameter const &  sigma_f,
Parameter const &  Q 
)
inline

Definition at line 64 of file CreepBGRa.h.

69  : LinearElasticIsotropic<DisplacementDim>(std::move(mp)),
70  _nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)),
71  _a(A),
72  _n(n),
73  _sigma_f(sigma_f),
74  _q(Q)
75  {
76  }
Parameter const & _n
A parameter determined by experiment.
Definition: CreepBGRa.h:102
Parameter const & _q
A stress scaling factor.
Definition: CreepBGRa.h:104
NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters
Definition: CreepBGRa.h:99
Parameter const & _sigma_f
Creep rate exponent n.
Definition: CreepBGRa.h:103

Member Function Documentation

◆ createMaterialStateVariables()

template<int DisplacementDim>
std::unique_ptr< typename MechanicsBase<DisplacementDim>::MaterialStateVariables> MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::createMaterialStateVariables ( ) const
inlineoverridevirtual

Polymorphic creator for MaterialStateVariables objects specific for a material model.

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 58 of file CreepBGRa.h.

59  {
61  DisplacementDim>::createMaterialStateVariables();
62  }
std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > createMaterialStateVariables() const override
Definition: CreepBGRa.h:58
LinearElasticIsotropic(MaterialProperties material_properties)

◆ getConstitutiveModel()

template<int DisplacementDim>
ConstitutiveModel MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::getConstitutiveModel ( ) const
inlineoverridevirtual

Gets the type of constitutive model.

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 89 of file CreepBGRa.h.

References MaterialLib::Solids::CreepBGRa.

◆ getTemperatureRelatedCoefficient()

template<int DisplacementDim>
double MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::getTemperatureRelatedCoefficient ( double const  ,
double const  ,
ParameterLib::SpatialPosition const &  ,
double const  ,
double const   
) const
overridevirtual

Get temperature related coefficient for the global assembly if there is one.

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 143 of file CreepBGRa.cpp.

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 }
double mu(double const t, X const &x) const
Lamé's second parameter, the shear modulus.
double getCreepConstantCoefficient(const double A, const double n, const double sigma0)
Definition: CreepBGRa.cpp:27

References MaterialLib::Solids::Creep::getCreepConstantCoefficient(), and MaterialLib::PhysicalConstant::IdealGasConstant.

◆ integrateStress()

template<int DisplacementDim>
std::optional< std::tuple< typename CreepBGRa< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename CreepBGRa< DisplacementDim >::KelvinMatrix > > MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::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 at line 38 of file CreepBGRa.cpp.

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,
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 }
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
Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize, Eigen::RowMajor > JacobianMatrix
Definition: CreepBGRa.h:45
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
std::optional< int > solve(JacobianMatrix &jacobian) const
Definition: NewtonRaphson.h:56
static const double r

References MaterialLib::Solids::Creep::getCreepConstantCoefficient(), MaterialLib::PhysicalConstant::IdealGasConstant, MathLib::r, NumLib::NewtonRaphson< LinearSolver, JacobianMatrix, JacobianMatrixUpdate, ResidualVector, ResidualUpdate, SolutionUpdate >::solve(), and MaterialPropertyLib::temperature.

Member Data Documentation

◆ _a

template<int DisplacementDim>
Parameter const& MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::_a
private

Definition at line 101 of file CreepBGRa.h.

◆ _n

template<int DisplacementDim>
Parameter const& MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::_n
private

A parameter determined by experiment.

Definition at line 102 of file CreepBGRa.h.

◆ _nonlinear_solver_parameters

template<int DisplacementDim>
NumLib::NewtonRaphsonSolverParameters const MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::_nonlinear_solver_parameters
private

Definition at line 99 of file CreepBGRa.h.

◆ _q

template<int DisplacementDim>
Parameter const& MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::_q
private

A stress scaling factor.

Definition at line 104 of file CreepBGRa.h.

◆ _sigma_f

template<int DisplacementDim>
Parameter const& MaterialLib::Solids::Creep::CreepBGRa< DisplacementDim >::_sigma_f
private

Creep rate exponent n.

Definition at line 103 of file CreepBGRa.h.


The documentation for this class was generated from the following files: