https://mooseframework.inl.gov
SolidMechanicsHardeningCubic.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 #include "libmesh/utility.h"
12 
14 registerMooseObjectRenamed("SolidMechanicsApp",
15  TensorMechanicsHardeningCubic,
16  "01/01/2025 00:00",
18 
21 {
23  params.addRequiredParam<Real>(
24  "value_0", "The value of the parameter for all internal_parameter <= internal_0");
25  params.addParam<Real>("value_residual",
26  "The value of the parameter for internal_parameter >= "
27  "internal_limit. Default = value_0, ie perfect "
28  "plasticity");
29  params.addParam<Real>(
30  "internal_0", 0.0, "The value of the internal_parameter when hardening begins");
31  params.addParam<Real>("internal_limit",
32  1.0,
33  "The value of the internal_parameter when hardening "
34  "ends. This hardening forms a cubic between "
35  "(internal_0, value_0) and (internal_limit, "
36  "value_residual) that is smooth at internal_0 and "
37  "internal_limit");
38  params.addClassDescription("Hardening is Cubic");
39  return params;
40 }
41 
43  : SolidMechanicsHardeningModel(parameters),
44  _val_0(getParam<Real>("value_0")),
45  _val_res(parameters.isParamValid("value_residual") ? getParam<Real>("value_residual") : _val_0),
46  _intnl_0(getParam<Real>("internal_0")),
47  _intnl_limit(getParam<Real>("internal_limit")),
48  _half_intnl_limit(0.5 * (_intnl_limit - _intnl_0)),
49  _alpha((_val_0 - _val_res) / (4.0 * Utility::pow<3>(_half_intnl_limit))),
50  _beta(-3.0 * _alpha * Utility::pow<2>(_half_intnl_limit))
51 {
52  if (_intnl_limit <= _intnl_0)
53  mooseError("internal_limit must be greater than internal_0 in Cubic Hardening");
54 }
55 
56 Real
58 {
59  const Real x = intnl - _intnl_0;
60  if (x <= 0.0)
61  return _val_0;
62  else if (intnl >= _intnl_limit)
63  return _val_res;
64  else
65  return _alpha * Utility::pow<3>(x - _half_intnl_limit) + _beta * (x - _half_intnl_limit) +
66  0.5 * (_val_0 + _val_res);
67 }
68 
69 Real
71 {
72  const Real x = intnl - _intnl_0;
73  if (x <= 0.0)
74  return 0.0;
75  else if (intnl >= _intnl_limit)
76  return 0.0;
77  else
78  return 3.0 * _alpha * Utility::pow<2>(x - _half_intnl_limit) + _beta;
79 }
80 
81 std::string
83 {
84  return "Cubic";
85 }
registerMooseObject("SolidMechanicsApp", SolidMechanicsHardeningCubic)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
virtual Real value(Real intnl) const override
Real _half_intnl_limit
convenience parameter for cubic
void addRequiredParam(const std::string &name, const std::string &doc_string)
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsHardeningCubic, "01/01/2025 00:00", SolidMechanicsHardeningCubic)
virtual Real derivative(Real intnl) const override
const std::vector< double > x
Real _val_0
value is cubic between _val_0 at internal_parameter=_intnl_0, at _val_res at internal_parameter=_intn...
SolidMechanicsHardeningCubic(const InputParameters &parameters)
Real _alpha
convenience parameter for cubic
Real _intnl_0
value is cubic between _val_0 at internal_parameter=_intnl_0, at _val_res at internal_parameter=_intn...
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real _val_res
value is cubic between _val_0 at internal_parameter=_intnl_0, at _val_res at internal_parameter=_intn...
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
Real _intnl_limit
value is cubic between _val_0 at internal_parameter=_intnl_0, at _val_res at internal_parameter=_intn...
virtual std::string modelName() const override
Real _beta
convenience parameter for cubic
Cubic hardening value = _val_0 for p <= _intnl_0 value = _val_res for p >= _intnl_limit value = cubic...