https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15registerMooseObject("SolidMechanicsApp", PlasticTruss);
16
19{
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
60void
67
68void
73
74void
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
124Real
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
136Real
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}
registerMooseObject("SolidMechanicsApp", PlasticTruss)
virtual Real value(Real t, const Point &p) const
virtual Real timeDerivative(Real t, const Point &p) const
bool isParamSetByUser(const std::string &name) const
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
unsigned int _qp
const InputParameters & parameters() const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
const MaterialProperty< Real > & _total_stretch_old
const Real _hardening_constant
const MaterialProperty< Real > & _hardening_variable_old
virtual void initQpStatefulProperties()
MaterialProperty< Real > & _hardening_variable
const Function *const _hardening_function
Real _absolute_tolerance
convergence tolerance
const MaterialProperty< Real > & _stress_old
virtual void computeQpStress()
static InputParameters validParams()
const MaterialProperty< Real > & _plastic_strain_old
virtual void computeQpStrain()
Real _relative_tolerance
PlasticTruss(const InputParameters &parameters)
virtual Real computeHardeningDerivative(Real scalar)
MaterialProperty< Real > & _plastic_strain
const unsigned int _max_its
maximum no. of iterations
virtual Real computeHardeningValue(Real scalar)
MaterialProperty< Real > & _axial_stress
const VariableValue & _youngs_modulus
virtual void initQpStatefulProperties()
MaterialProperty< Real > & _total_stretch
MaterialProperty< Real > & _elastic_stretch
T sign(T x)