www.mooseframework.org
PlasticTruss.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 
10 #include "PlasticTruss.h"
11 #include "Function.h"
12 #include "MooseException.h"
13 #include "MathUtils.h"
14 
15 registerMooseObject("TensorMechanicsApp", PlasticTruss);
16 
18 
19 InputParameters
21 {
22  InputParameters params = LinearElasticTruss::validParams();
23  params.addClassDescription(
24  "Computes the stress and strain for a truss element with plastic behavior defined by either "
25  "linear hardening or a user-defined hardening function.");
26  params.addRequiredParam<Real>("yield_stress",
27  "Yield stress after which plastic strain starts accumulating");
28  params.addParam<Real>("hardening_constant", 0.0, "Hardening slope");
29  params.addParam<FunctionName>("hardening_function",
30  "Engineering stress as a function of plastic strain");
31  params.addParam<Real>(
32  "absolute_tolerance", 1e-10, "Absolute convergence tolerance for Newton iteration");
33  params.addParam<Real>(
34  "relative_tolerance", 1e-8, "Relative convergence tolerance for Newton iteration");
35  return params;
36 }
37 
38 PlasticTruss::PlasticTruss(const InputParameters & parameters)
39  : LinearElasticTruss(parameters),
40  _yield_stress(getParam<Real>("yield_stress")), // Read from input file
41  _hardening_constant(getParam<Real>("hardening_constant")),
42  _hardening_function(isParamValid("hardening_function") ? &getFunction("hardening_function")
43  : NULL),
44  _absolute_tolerance(parameters.get<Real>("absolute_tolerance")),
45  _relative_tolerance(parameters.get<Real>("relative_tolerance")),
46  _total_stretch_old(getMaterialPropertyOld<Real>(_base_name + "total_stretch")),
47  _plastic_strain(declareProperty<Real>(_base_name + "plastic_stretch")),
48  _plastic_strain_old(getMaterialPropertyOld<Real>(_base_name + "plastic_stretch")),
49  _stress_old(getMaterialPropertyOld<Real>(_base_name + "axial_stress")),
50  _hardening_variable(declareProperty<Real>(_base_name + "hardening_variable")),
51  _hardening_variable_old(getMaterialPropertyOld<Real>(_base_name + "hardening_variable")),
52  _max_its(1000)
53 {
54  if (!parameters.isParamSetByUser("hardening_constant") && !isParamValid("hardening_function"))
55  mooseError("PlasticTruss: Either hardening_constant or hardening_function must be defined");
56 
57  if (parameters.isParamSetByUser("hardening_constant") && isParamValid("hardening_function"))
58  mooseError("PlasticTruss: Only the hardening_constant or only the hardening_function can be "
59  "defined but not both");
60 }
61 
62 void
64 {
66  _plastic_strain[_qp] = 0.0;
67  _hardening_variable[_qp] = 0.0;
68 }
69 
70 void
72 {
74 }
75 
76 void
78 {
79  Real strain_increment = _total_stretch[_qp] - _total_stretch_old[_qp];
80  Real trial_stress = _stress_old[_qp] + _youngs_modulus[_qp] * strain_increment;
81 
84 
85  Real yield_condition = std::abs(trial_stress) - _hardening_variable[_qp] - _yield_stress;
86  Real iteration = 0;
87  Real plastic_strain_increment = 0.0;
88  Real elastic_strain_increment = strain_increment;
89 
90  if (yield_condition > 0.0)
91  {
92  Real residual = std::abs(trial_stress) - _hardening_variable[_qp] - _yield_stress -
93  _youngs_modulus[_qp] * plastic_strain_increment;
94 
95  Real reference_residual =
96  std::abs(trial_stress) - _youngs_modulus[_qp] * plastic_strain_increment;
97 
98  while (std::abs(residual) > _absolute_tolerance ||
99  std::abs(residual / reference_residual) > _relative_tolerance)
100  {
101  _hardening_variable[_qp] = computeHardeningValue(plastic_strain_increment);
102  Real hardening_slope = computeHardeningDerivative(plastic_strain_increment);
103 
104  Real scalar = (std::abs(trial_stress) - _hardening_variable[_qp] - _yield_stress -
105  _youngs_modulus[_qp] * plastic_strain_increment) /
106  (_youngs_modulus[_qp] + hardening_slope);
107  plastic_strain_increment += scalar;
108 
109  residual = std::abs(trial_stress) - _hardening_variable[_qp] - _yield_stress -
110  _youngs_modulus[_qp] * plastic_strain_increment;
111 
112  reference_residual = std::abs(trial_stress) - _youngs_modulus[_qp] * plastic_strain_increment;
113 
114  ++iteration;
115  if (iteration > _max_its) // not converging
116  throw MooseException("PlasticTruss: Plasticity model did not converge");
117  }
118  plastic_strain_increment *= MathUtils::sign(trial_stress);
119  _plastic_strain[_qp] += plastic_strain_increment;
120  elastic_strain_increment = strain_increment - plastic_strain_increment;
121  }
123  _axial_stress[_qp] = _stress_old[_qp] + _youngs_modulus[_qp] * elastic_strain_increment;
124 }
125 
126 Real
128 {
130  {
131  const Real strain_old = _plastic_strain_old[_qp];
132  const Point p;
133 
134  return _hardening_function->value(std::abs(strain_old) + scalar, p) - _yield_stress;
135  }
136 
137  return _hardening_variable_old[_qp] + _hardening_constant * scalar;
138 }
139 
141 {
143  {
144  const Real strain_old = _plastic_strain_old[_qp];
145  const Point p;
146 
147  return _hardening_function->timeDerivative(std::abs(strain_old), p);
148  }
149 
150  return _hardening_constant;
151 }
TrussMaterial::_current_length
Real _current_length
Definition: TrussMaterial.h:47
PlasticTruss::_yield_stress
Real _yield_stress
Definition: PlasticTruss.h:35
registerMooseObject
registerMooseObject("TensorMechanicsApp", PlasticTruss)
PlasticTruss::_hardening_function
const Function * _hardening_function
Definition: PlasticTruss.h:37
TrussMaterial::initQpStatefulProperties
virtual void initQpStatefulProperties()
Definition: TrussMaterial.C:55
PlasticTruss::PlasticTruss
PlasticTruss(const InputParameters &parameters)
Definition: PlasticTruss.C:38
PlasticTruss::_stress_old
const MaterialProperty< Real > & _stress_old
Definition: PlasticTruss.h:46
PlasticTruss::_total_stretch_old
const MaterialProperty< Real > & _total_stretch_old
Definition: PlasticTruss.h:43
PlasticTruss::_plastic_strain
MaterialProperty< Real > & _plastic_strain
Definition: PlasticTruss.h:44
PlasticTruss::_plastic_strain_old
const MaterialProperty< Real > & _plastic_strain_old
Definition: PlasticTruss.h:45
PlasticTruss::computeQpStress
virtual void computeQpStress()
Definition: PlasticTruss.C:77
PlasticTruss::_hardening_constant
const Real _hardening_constant
Definition: PlasticTruss.h:36
PlasticTruss::computeHardeningValue
virtual Real computeHardeningValue(Real scalar)
Definition: PlasticTruss.C:127
PlasticTruss.h
defineLegacyParams
defineLegacyParams(PlasticTruss)
PlasticTruss::_absolute_tolerance
Real _absolute_tolerance
convergence tolerance
Definition: PlasticTruss.h:40
PlasticTruss::_hardening_variable_old
const MaterialProperty< Real > & _hardening_variable_old
Definition: PlasticTruss.h:49
LinearElasticTruss
Definition: LinearElasticTruss.h:19
PlasticTruss::computeQpStrain
virtual void computeQpStrain()
Definition: PlasticTruss.C:71
PlasticTruss
Definition: PlasticTruss.h:19
PlasticTruss::initQpStatefulProperties
virtual void initQpStatefulProperties()
Definition: PlasticTruss.C:63
PlasticTruss::computeHardeningDerivative
virtual Real computeHardeningDerivative(Real scalar)
Definition: PlasticTruss.C:140
TrussMaterial::_total_stretch
MaterialProperty< Real > & _total_stretch
Definition: TrussMaterial.h:41
LinearElasticTruss::validParams
static InputParameters validParams()
Definition: LinearElasticTruss.C:17
TrussMaterial::_youngs_modulus
const VariableValue & _youngs_modulus
Definition: TrussMaterial.h:39
PlasticTruss::_hardening_variable
MaterialProperty< Real > & _hardening_variable
Definition: PlasticTruss.h:48
TrussMaterial::_axial_stress
MaterialProperty< Real > & _axial_stress
Definition: TrussMaterial.h:43
TrussMaterial::_origin_length
Real _origin_length
Definition: TrussMaterial.h:46
PlasticTruss::validParams
static InputParameters validParams()
Definition: PlasticTruss.C:20
TrussMaterial::_elastic_stretch
MaterialProperty< Real > & _elastic_stretch
Definition: TrussMaterial.h:42
PlasticTruss::_relative_tolerance
Real _relative_tolerance
Definition: PlasticTruss.h:41
PlasticTruss::_max_its
const unsigned int _max_its
maximum no. of iterations
Definition: PlasticTruss.h:52