https://mooseframework.inl.gov
SolidMechanicsPlasticIsotropicSD.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 
13 registerMooseObjectRenamed("SolidMechanicsApp",
14  TensorMechanicsPlasticIsotropicSD,
15  "01/01/2025 00:00",
17 
20 {
22  params.addRequiredParam<Real>("b", "A constant to model the influence of pressure");
23  params.addParam<Real>(
24  "c", 0.0, "A constant to model the influence of strength differential effect");
25  params.addParam<bool>("associative", true, "Flag for flow-rule, true if not specified");
26  params.addClassDescription("IsotropicSD plasticity for pressure sensitive materials and also "
27  "models the strength differential effect");
28  return params;
29 }
30 
32  const InputParameters & parameters)
33  : SolidMechanicsPlasticJ2(parameters),
34  _b(getParam<Real>("b")),
35  _c(getParam<Real>("c")),
36  _associative(getParam<bool>("associative"))
37 {
38  _a = 1.0 / (_b + std::pow(1.0 / std::sqrt(27.0) - _c / 27.0, 1.0 / 3.0));
39  for (unsigned i = 0; i < 3; ++i)
40  for (unsigned j = 0; j < 3; ++j)
41  for (unsigned k = 0; k < 3; ++k)
42  for (unsigned l = 0; l < 3; ++l)
43  _h(i, j, k, l) = ((i == k) * (j == l) - 1.0 / 3.0 * (i == j) * (k == l));
44 }
45 
46 Real
47 SolidMechanicsPlasticIsotropicSD::dphi_dj2(const Real j2, const Real j3) const
48 {
49  return std::pow(j2, 1.0 / 2.0) / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
50 }
51 
52 Real
53 SolidMechanicsPlasticIsotropicSD::dphi_dj3(const Real j2, const Real j3) const
54 {
55  return -_c / (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
56 }
57 
58 Real
59 SolidMechanicsPlasticIsotropicSD::dfj2_dj2(const Real j2, const Real j3) const
60 {
61  return std::pow(j2, -1.0 / 2.0) / (4 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0)) -
62  j2 / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
63 }
64 
65 Real
66 SolidMechanicsPlasticIsotropicSD::dfj2_dj3(const Real j2, const Real j3) const
67 {
68  return _c * std::pow(j2, 1.0 / 2.0) /
69  (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
70 }
71 
72 Real
73 SolidMechanicsPlasticIsotropicSD::dfj3_dj2(const Real j2, const Real j3) const
74 {
75  return _c * std::pow(j2, 1.0 / 2.0) /
76  (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
77 }
78 
79 Real
80 SolidMechanicsPlasticIsotropicSD::dfj3_dj3(const Real j2, const Real j3) const
81 {
82  return -_c * _c * 2.0 / (9 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
83 }
84 
87 {
89 }
90 
93 {
95  const Real trace = stress.trace();
96  for (unsigned i = 0; i < 3; ++i)
97  for (unsigned j = 0; j < 3; ++j)
98  a(i, j) = (trace - stress(i, j)) * -1 * (i == j) + stress(i, j) * (i != j);
99 
100  return a;
101 }
102 
103 Real
105 {
106  return _a * (_b * stress.trace() +
107  std::pow(std::pow(stress.secondInvariant(), 1.5) - _c * stress.thirdInvariant(),
108  1.0 / 3.0)) -
109  yieldStrength(intnl);
110 }
111 
114  Real /*intnl*/) const
115 {
116  const RankTwoTensor sDev = stress.deviatoric();
117  const Real j2 = stress.secondInvariant();
118  const Real j3 = stress.thirdInvariant();
119  return _a * (_b * dI_sigma() + dphi_dj2(j2, j3) * _h.innerProductTranspose(dj2_dSkl(sDev)) +
120  dphi_dj3(j2, j3) * _h.innerProductTranspose(sDev.ddet()));
121 }
122 
125  Real /*intnl*/) const
126 {
127  if (_associative)
128  {
129  const RankTwoTensor sDev = stress.deviatoric();
130  const RankTwoTensor dj2 = dj2_dSkl(sDev);
131  const RankTwoTensor dj3 = sDev.ddet();
132  const Real j2 = stress.secondInvariant();
133  const Real j3 = stress.thirdInvariant();
134  return _a * (dfj2_dj2(j2, j3) *
136  dfj2_dj3(j2, j3) *
138  dfj3_dj2(j2, j3) *
140  dfj3_dj3(j2, j3) *
142  }
143  else
145 }
146 
149 {
150  if (_associative)
151  return dyieldFunction_dstress(stress, intnl);
152  else
154 }
RankFourTensorTempl< Real > outerProduct(const RankTwoTensorTempl< Real > &b) const
Real dfj3_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J2
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticIsotropicSD, "01/01/2025 00:00", SolidMechanicsPlasticIsotropicSD)
Real dfj2_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J3
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Real dfj3_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J3
RankTwoTensorTempl< T > innerProductTranspose(const RankTwoTensorTempl< T > &) const
const bool _associative
Flag for flow-rule, true if not specified.
const Real _b
A constant to model the influence of pressure.
static InputParameters validParams()
RankTwoTensor dI_sigma() const
derivative of the trace with respect to sigma rank two tensor
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticIsotropicSD)
void addRequiredParam(const std::string &name, const std::string &doc_string)
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.
RankTwoTensor dj2_dSkl(const RankTwoTensor &stress) const
derivative of the second invariant with respect to the stress deviatoric tensor
Real dphi_dj2(const Real j2, const Real j3) const
derivative of phi with respect to J2, phi is b*I1 + (J2^{3/2} - c*J3)^{1/3}
RankTwoTensorTempl< Real > deviatoric() const
J2 plasticity, associative, with hardning.
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
Real dphi_dj3(const Real j2, const Real j3) const
derivative of phi with respect to J3
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the tensor derivative of the yield_function with respect to the stress tensor...
SolidMechanicsPlasticIsotropicSD(const InputParameters &parameters)
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly...
Real _c
A constant to model the influence of strength differential effect.
virtual Real yieldStrength(Real intnl) const
YieldStrength.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
RankTwoTensorTempl< Real > ddet() const
IsotropicSD plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Real _a
A constant used in the constructor that depends on _b and _c.
Real dfj2_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J2
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the yield_function with respect to the stress tensor.
MooseUnits pow(const MooseUnits &, int)
static const std::string k
Definition: NS.h:130
RankFourTensor _h
Comes from transforming the stress tensor to the deviatoric stress tensor.