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