https://mooseframework.inl.gov
Loading...
Searching...
No Matches
HyperbolicViscoplasticityStressUpdate.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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"
14
15registerMooseObject("SolidMechanicsApp", HyperbolicViscoplasticityStressUpdate);
16
18HyperbolicViscoplasticityStressUpdate::validParams()
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
45HyperbolicViscoplasticityStressUpdate::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
64void
65HyperbolicViscoplasticityStressUpdate::initQpStatefulProperties()
66{
67 _hardening_variable[_qp] = 0.0;
68 _plastic_strain[_qp].zero();
69}
70
71void
72HyperbolicViscoplasticityStressUpdate::propagateQpStatefulProperties()
73{
74 _hardening_variable[_qp] = _hardening_variable_old[_qp];
75 _plastic_strain[_qp] = _plastic_strain_old[_qp];
76
77 propagateQpStatefulPropertiesRadialReturn();
78}
79
80void
81HyperbolicViscoplasticityStressUpdate::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
92Real
93HyperbolicViscoplasticityStressUpdate::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
114Real
115HyperbolicViscoplasticityStressUpdate::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
125void
126HyperbolicViscoplasticityStressUpdate::iterationFinalize(const Real & scalar)
127{
128 if (_yield_condition > 0.0)
129 _hardening_variable[_qp] = computeHardeningValue(scalar);
130}
131
132Real
133HyperbolicViscoplasticityStressUpdate::computeHardeningValue(Real scalar)
134{
135 return _hardening_variable_old[_qp] + (_hardening_constant * scalar);
136}
137
138void
139HyperbolicViscoplasticityStressUpdate::computeStressFinalize(
140 const RankTwoTensor & plasticStrainIncrement)
141{
142 _plastic_strain[_qp] += plasticStrainIncrement;
143}
registerMooseObject("SolidMechanicsApp", HyperbolicViscoplasticityStressUpdate)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
RadialReturnStressUpdate computes the radial return stress increment for an isotropic elastic-viscopl...
virtual void computeStressInitialize(const GenericReal< is_ad > &effective_trial_stress, const GenericRankFourTensor< is_ad > &elasticity_tensor)
Perform any necessary initialization before return mapping iterations.
const Elem & get(const ElemType type_in)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real