www.mooseframework.org
HyperbolicViscoplasticityStressUpdate.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 
12 #include "Function.h"
13 #include "ElasticityTensorTools.h"
14 
15 registerMooseObject("SolidMechanicsApp", HyperbolicViscoplasticityStressUpdate);
16 
19 {
21  params.addClassDescription("This class uses the discrete material for a hyperbolic sine "
22  "viscoplasticity model in which the effective plastic strain is "
23  "solved for using a creep approach.");
24 
25  // Linear strain hardening parameters
26  params.addRequiredParam<Real>("yield_stress",
27  "The point at which plastic strain begins accumulating");
28  params.addRequiredParam<Real>("hardening_constant", "Hardening slope");
29 
30  // Viscoplasticity constitutive equation parameters
31  params.addRequiredParam<Real>("c_alpha",
32  "Viscoplasticity coefficient, scales the hyperbolic function");
33  params.addRequiredParam<Real>("c_beta",
34  "Viscoplasticity coefficient inside the hyperbolic sin function");
35  params.addDeprecatedParam<std::string>(
36  "plastic_prepend",
37  "",
38  "String that is prepended to the plastic_strain Material Property",
39  "This has been replaced by the 'base_name' parameter");
40  params.set<std::string>("effective_inelastic_strain_name") = "effective_plastic_strain";
41 
42  return params;
43 }
44 
45 HyperbolicViscoplasticityStressUpdate::HyperbolicViscoplasticityStressUpdate(
46  const InputParameters & parameters)
47  : RadialReturnStressUpdate(parameters),
48  _plastic_prepend(getParam<std::string>("plastic_prepend")),
49  _yield_stress(parameters.get<Real>("yield_stress")),
50  _hardening_constant(parameters.get<Real>("hardening_constant")),
51  _c_alpha(parameters.get<Real>("c_alpha")),
52  _c_beta(parameters.get<Real>("c_beta")),
53  _yield_condition(-1.0), // set to a non-physical value to catch uninitalized yield condition
54  _hardening_variable(declareProperty<Real>("hardening_variable")),
55  _hardening_variable_old(getMaterialPropertyOld<Real>("hardening_variable")),
56 
57  _plastic_strain(
58  declareProperty<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")),
59  _plastic_strain_old(
60  getMaterialPropertyOld<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain"))
61 {
62 }
63 
64 void
65 HyperbolicViscoplasticityStressUpdate::initQpStatefulProperties()
66 {
67  _hardening_variable[_qp] = 0.0;
68  _plastic_strain[_qp].zero();
69 }
70 
71 void
72 HyperbolicViscoplasticityStressUpdate::propagateQpStatefulProperties()
73 {
74  _hardening_variable[_qp] = _hardening_variable_old[_qp];
75  _plastic_strain[_qp] = _plastic_strain_old[_qp];
76 
77  propagateQpStatefulPropertiesRadialReturn();
78 }
79 
80 void
81 HyperbolicViscoplasticityStressUpdate::computeStressInitialize(
82  const Real & effective_trial_stress, const RankFourTensor & elasticity_tensor)
83 {
84  RadialReturnStressUpdate::computeStressInitialize(effective_trial_stress, elasticity_tensor);
85 
86  _yield_condition = effective_trial_stress - _hardening_variable_old[_qp] - _yield_stress;
87 
88  _hardening_variable[_qp] = _hardening_variable_old[_qp];
89  _plastic_strain[_qp] = _plastic_strain_old[_qp];
90 }
91 
92 Real
93 HyperbolicViscoplasticityStressUpdate::computeResidual(const Real & effective_trial_stress,
94  const Real & scalar)
95 {
96  Real residual = 0.0;
97 
98  mooseAssert(_yield_condition != -1.0,
99  "the yield stress was not updated by computeStressInitialize");
100 
101  if (_yield_condition > 0.0)
102  {
103  const Real xflow = _c_beta * (effective_trial_stress - (_three_shear_modulus * scalar) -
104  computeHardeningValue(scalar) - _yield_stress);
105  const Real xphi = _c_alpha * std::sinh(xflow);
106 
107  _xphidp = -_three_shear_modulus * _c_alpha * _c_beta * std::cosh(xflow);
108  _xphir = -_c_alpha * _c_beta * std::cosh(xflow);
109  residual = xphi * _dt - scalar;
110  }
111  return residual;
112 }
113 
114 Real
115 HyperbolicViscoplasticityStressUpdate::computeDerivative(const Real & /*effective_trial_stress*/,
116  const Real & /*scalar*/)
117 {
118  Real derivative = 1.0;
119  if (_yield_condition > 0.0)
120  derivative = _xphidp * _dt + _hardening_constant * _xphir * _dt - 1.0;
121 
122  return derivative;
123 }
124 
125 void
126 HyperbolicViscoplasticityStressUpdate::iterationFinalize(const Real & scalar)
127 {
128  if (_yield_condition > 0.0)
129  _hardening_variable[_qp] = computeHardeningValue(scalar);
130 }
131 
132 Real
133 HyperbolicViscoplasticityStressUpdate::computeHardeningValue(Real scalar)
134 {
135  return _hardening_variable_old[_qp] + (_hardening_constant * scalar);
136 }
137 
138 void
139 HyperbolicViscoplasticityStressUpdate::computeStressFinalize(
140  const RankTwoTensor & plasticStrainIncrement)
141 {
142  _plastic_strain[_qp] += plasticStrainIncrement;
143 }
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
static InputParameters validParams()
virtual void computeStressInitialize(const GenericReal< is_ad > &effective_trial_stress, const GenericRankFourTensor< is_ad > &elasticity_tensor)
Perform any necessary initialization before return mapping iterations.
T & set(const std::string &name, bool quiet_mode=false)
RadialReturnStressUpdate computes the radial return stress increment for an isotropic elastic-viscopl...
registerMooseObject("SolidMechanicsApp", HyperbolicViscoplasticityStressUpdate)
void addRequiredParam(const std::string &name, const std::string &doc_string)
InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
const Elem & get(const ElemType type_in)