www.mooseframework.org
TensorMechanicsPlasticMohrCoulomb.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 
11 #include "RankFourTensor.h"
12 #include "libmesh/utility.h"
13 
15 
17 
18 InputParameters
20 {
21  InputParameters params = TensorMechanicsPlasticModel::validParams();
22  params.addRequiredParam<UserObjectName>(
23  "cohesion",
24  "A TensorMechanicsHardening UserObject that defines hardening of the cohesion. "
25  "Physically the cohesion should not be negative.");
26  params.addRequiredParam<UserObjectName>(
27  "friction_angle",
28  "A TensorMechanicsHardening UserObject that defines hardening of the "
29  "friction angle (in radians). Physically the friction angle should be "
30  "between 0 and 90deg.");
31  params.addRequiredParam<UserObjectName>(
32  "dilation_angle",
33  "A TensorMechanicsHardening UserObject that defines hardening of the "
34  "dilation angle (in radians). Usually the dilation angle is not greater "
35  "than the friction angle, and it is between 0 and 90deg.");
36  params.addRangeCheckedParam<Real>(
37  "mc_edge_smoother",
38  25.0,
39  "mc_edge_smoother>=0 & mc_edge_smoother<=30",
40  "Smoothing parameter: the edges of the cone are smoothed by the given amount.");
41  MooseEnum tip_scheme("hyperbolic cap", "hyperbolic");
42  params.addParam<MooseEnum>(
43  "tip_scheme", tip_scheme, "Scheme by which the pyramid's tip will be smoothed.");
44  params.addRequiredRangeCheckedParam<Real>("mc_tip_smoother",
45  "mc_tip_smoother>=0",
46  "Smoothing parameter: the cone vertex at mean = "
47  "cohesion*cot(friction_angle), will be smoothed by "
48  "the given amount. Typical value is 0.1*cohesion");
49  params.addParam<Real>(
50  "cap_start",
51  0.0,
52  "For the 'cap' tip_scheme, smoothing is performed in the stress_mean > cap_start region");
53  params.addRangeCheckedParam<Real>("cap_rate",
54  0.0,
55  "cap_rate>=0",
56  "For the 'cap' tip_scheme, this controls how quickly the cap "
57  "degenerates to a hemisphere: small values mean a slow "
58  "degeneration to a hemisphere (and zero means the 'cap' will "
59  "be totally inactive). Typical value is 1/tensile_strength");
60  params.addParam<Real>("mc_lode_cutoff",
61  "If the second invariant of stress is less than this "
62  "amount, the Lode angle is assumed to be zero. This is "
63  "to gaurd against precision-loss problems, and this "
64  "parameter should be set small. Default = "
65  "0.00001*((yield_Function_tolerance)^2)");
66  params.addClassDescription("Non-associative Mohr-Coulomb plasticity with hardening/softening");
67 
68  return params;
69 }
70 
72  const InputParameters & parameters)
73  : TensorMechanicsPlasticModel(parameters),
74  _cohesion(getUserObject<TensorMechanicsHardeningModel>("cohesion")),
75  _phi(getUserObject<TensorMechanicsHardeningModel>("friction_angle")),
76  _psi(getUserObject<TensorMechanicsHardeningModel>("dilation_angle")),
77  _tip_scheme(getParam<MooseEnum>("tip_scheme")),
78  _small_smoother2(Utility::pow<2>(getParam<Real>("mc_tip_smoother"))),
79  _cap_start(getParam<Real>("cap_start")),
80  _cap_rate(getParam<Real>("cap_rate")),
81  _tt(getParam<Real>("mc_edge_smoother") * libMesh::pi / 180.0),
82  _costt(std::cos(_tt)),
83  _sintt(std::sin(_tt)),
84  _cos3tt(std::cos(3 * _tt)),
85  _sin3tt(std::sin(3 * _tt)),
86  _cos6tt(std::cos(6 * _tt)),
87  _sin6tt(std::sin(6 * _tt)),
88  _lode_cutoff(parameters.isParamValid("mc_lode_cutoff") ? getParam<Real>("mc_lode_cutoff")
89  : 1.0E-5 * Utility::pow<2>(_f_tol))
90 
91 {
92  if (_lode_cutoff < 0)
93  mooseError("mc_lode_cutoff must not be negative");
94 
95  // With arbitary UserObjects, it is impossible to check everything, and
96  // I think this is the best I can do
97  if (phi(0) < 0 || psi(0) < 0 || phi(0) > libMesh::pi / 2.0 || psi(0) > libMesh::pi / 2.0)
98  mooseError("Mohr-Coulomb friction and dilation angles must lie in [0, Pi/2]");
99  if (phi(0) < psi(0))
100  mooseError("Mohr-Coulomb friction angle must not be less than Mohr-Coulomb dilation angle");
101  if (cohesion(0) < 0)
102  mooseError("Mohr-Coulomb cohesion must not be negative");
103 
104  // check Abbo et al's convexity constraint (Eqn c.18 in their paper)
105  // With an arbitrary UserObject, it is impossible to check for all angles
106  // I think the following is the best we can do
107  Real sin_angle = std::sin(std::max(phi(0), psi(0)));
108  sin_angle = std::max(sin_angle, std::sin(std::max(phi(1E6), psi(1E6))));
109  Real rhs = std::sqrt(3) * (35 * std::sin(_tt) + 14 * std::sin(5 * _tt) - 5 * std::sin(7 * _tt)) /
110  16 / Utility::pow<5>(std::cos(_tt)) / (11 - 10 * std::cos(2 * _tt));
111  if (rhs <= sin_angle)
112  mooseError("Mohr-Coulomb edge smoothing angle is too small and a non-convex yield surface will "
113  "result. Please choose a larger value");
114 }
115 
116 Real
118 {
119  Real mean_stress = stress.trace() / 3.0;
120  Real sinphi = std::sin(phi(intnl));
121  Real cosphi = std::cos(phi(intnl));
122  Real sin3Lode = stress.sin3Lode(_lode_cutoff, 0);
123  if (std::abs(sin3Lode) <= _sin3tt)
124  {
125  // the non-edge-smoothed version
126  std::vector<Real> eigvals;
127  stress.symmetricEigenvalues(eigvals);
128  return mean_stress * sinphi +
129  std::sqrt(smooth(stress) +
130  0.25 * Utility::pow<2>(eigvals[2] - eigvals[0] +
131  (eigvals[2] + eigvals[0] - 2 * mean_stress) * sinphi)) -
132  cohesion(intnl) * cosphi;
133  }
134  else
135  {
136  // the edge-smoothed version
137  Real aaa, bbb, ccc;
138  abbo(sin3Lode, sinphi, aaa, bbb, ccc);
139  Real kk = aaa + bbb * sin3Lode + ccc * Utility::pow<2>(sin3Lode);
140  Real sibar2 = stress.secondInvariant();
141  return mean_stress * sinphi + std::sqrt(smooth(stress) + sibar2 * Utility::pow<2>(kk)) -
142  cohesion(intnl) * cosphi;
143  }
144 }
145 
147 TensorMechanicsPlasticMohrCoulomb::df_dsig(const RankTwoTensor & stress, const Real sin_angle) const
148 {
149  Real mean_stress = stress.trace() / 3.0;
150  RankTwoTensor dmean_stress = stress.dtrace() / 3.0;
151  Real sin3Lode = stress.sin3Lode(_lode_cutoff, 0);
152  if (std::abs(sin3Lode) <= _sin3tt)
153  {
154  // the non-edge-smoothed version
155  std::vector<Real> eigvals;
156  std::vector<RankTwoTensor> deigvals;
157  stress.dsymmetricEigenvalues(eigvals, deigvals);
158  Real tmp = eigvals[2] - eigvals[0] + (eigvals[2] + eigvals[0] - 2.0 * mean_stress) * sin_angle;
159  RankTwoTensor dtmp =
160  deigvals[2] - deigvals[0] + (deigvals[2] + deigvals[0] - 2.0 * dmean_stress) * sin_angle;
161  Real denom = std::sqrt(smooth(stress) + 0.25 * Utility::pow<2>(tmp));
162  return dmean_stress * sin_angle +
163  (0.5 * dsmooth(stress) * dmean_stress + 0.25 * tmp * dtmp) / denom;
164  }
165  else
166  {
167  // the edge-smoothed version
168  Real aaa, bbb, ccc;
169  abbo(sin3Lode, sin_angle, aaa, bbb, ccc);
170  Real kk = aaa + bbb * sin3Lode + ccc * Utility::pow<2>(sin3Lode);
171  RankTwoTensor dkk = (bbb + 2 * ccc * sin3Lode) * stress.dsin3Lode(_lode_cutoff);
172  Real sibar2 = stress.secondInvariant();
173  RankTwoTensor dsibar2 = stress.dsecondInvariant();
174  Real denom = std::sqrt(smooth(stress) + sibar2 * Utility::pow<2>(kk));
175  return dmean_stress * sin_angle + (0.5 * dsmooth(stress) * dmean_stress +
176  0.5 * dsibar2 * Utility::pow<2>(kk) + sibar2 * kk * dkk) /
177  denom;
178  }
179 }
180 
183  Real intnl) const
184 {
185  Real sinphi = std::sin(phi(intnl));
186  return df_dsig(stress, sinphi);
187 }
188 
189 Real
191  Real intnl) const
192 {
193  Real sin_angle = std::sin(phi(intnl));
194  Real cos_angle = std::cos(phi(intnl));
195  Real dsin_angle = cos_angle * dphi(intnl);
196  Real dcos_angle = -sin_angle * dphi(intnl);
197 
198  Real mean_stress = stress.trace() / 3.0;
199  Real sin3Lode = stress.sin3Lode(_lode_cutoff, 0);
200  if (std::abs(sin3Lode) <= _sin3tt)
201  {
202  // the non-edge-smoothed version
203  std::vector<Real> eigvals;
204  stress.symmetricEigenvalues(eigvals);
205  Real tmp = eigvals[2] - eigvals[0] + (eigvals[2] + eigvals[0] - 2 * mean_stress) * sin_angle;
206  Real dtmp = (eigvals[2] + eigvals[0] - 2 * mean_stress) * dsin_angle;
207  Real denom = std::sqrt(smooth(stress) + 0.25 * Utility::pow<2>(tmp));
208  return mean_stress * dsin_angle + 0.25 * tmp * dtmp / denom - dcohesion(intnl) * cos_angle -
209  cohesion(intnl) * dcos_angle;
210  }
211  else
212  {
213  // the edge-smoothed version
214  Real aaa, bbb, ccc;
215  abbo(sin3Lode, sin_angle, aaa, bbb, ccc);
216  Real daaa, dbbb, dccc;
217  dabbo(sin3Lode, sin_angle, daaa, dbbb, dccc);
218  Real kk = aaa + bbb * sin3Lode + ccc * Utility::pow<2>(sin3Lode);
219  Real dkk = (daaa + dbbb * sin3Lode + dccc * Utility::pow<2>(sin3Lode)) * dsin_angle;
220  Real sibar2 = stress.secondInvariant();
221  Real denom = std::sqrt(smooth(stress) + sibar2 * Utility::pow<2>(kk));
222  return mean_stress * dsin_angle + sibar2 * kk * dkk / denom - dcohesion(intnl) * cos_angle -
223  cohesion(intnl) * dcos_angle;
224  }
225 }
226 
229 {
230  Real sinpsi = std::sin(psi(intnl));
231  return df_dsig(stress, sinpsi);
232 }
233 
236  Real intnl) const
237 {
238  RankFourTensor dr_dstress;
239  Real sin_angle = std::sin(psi(intnl));
240  Real mean_stress = stress.trace() / 3.0;
241  RankTwoTensor dmean_stress = stress.dtrace() / 3.0;
242  Real sin3Lode = stress.sin3Lode(_lode_cutoff, 0);
243  if (std::abs(sin3Lode) <= _sin3tt)
244  {
245  // the non-edge-smoothed version
246  std::vector<Real> eigvals;
247  std::vector<RankTwoTensor> deigvals;
248  std::vector<RankFourTensor> d2eigvals;
249  stress.dsymmetricEigenvalues(eigvals, deigvals);
250  stress.d2symmetricEigenvalues(d2eigvals);
251 
252  Real tmp = eigvals[2] - eigvals[0] + (eigvals[2] + eigvals[0] - 2.0 * mean_stress) * sin_angle;
253  RankTwoTensor dtmp =
254  deigvals[2] - deigvals[0] + (deigvals[2] + deigvals[0] - 2.0 * dmean_stress) * sin_angle;
255  Real denom = std::sqrt(smooth(stress) + 0.25 * Utility::pow<2>(tmp));
256  Real denom3 = Utility::pow<3>(denom);
257  Real d2smooth_over_denom = d2smooth(stress) / denom;
258  RankTwoTensor numer = dsmooth(stress) * dmean_stress + 0.5 * tmp * dtmp;
259 
260  dr_dstress = 0.25 * tmp *
261  (d2eigvals[2] - d2eigvals[0] + (d2eigvals[2] + d2eigvals[0]) * sin_angle) / denom;
262 
263  for (unsigned i = 0; i < 3; ++i)
264  for (unsigned j = 0; j < 3; ++j)
265  for (unsigned k = 0; k < 3; ++k)
266  for (unsigned l = 0; l < 3; ++l)
267  {
268  dr_dstress(i, j, k, l) +=
269  0.5 * d2smooth_over_denom * dmean_stress(i, j) * dmean_stress(k, l);
270  dr_dstress(i, j, k, l) += 0.25 * dtmp(i, j) * dtmp(k, l) / denom;
271  dr_dstress(i, j, k, l) -= 0.25 * numer(i, j) * numer(k, l) / denom3;
272  }
273  }
274  else
275  {
276  // the edge-smoothed version
277  Real aaa, bbb, ccc;
278  abbo(sin3Lode, sin_angle, aaa, bbb, ccc);
279  RankTwoTensor dsin3Lode = stress.dsin3Lode(_lode_cutoff);
280  Real kk = aaa + bbb * sin3Lode + ccc * Utility::pow<2>(sin3Lode);
281  RankTwoTensor dkk = (bbb + 2 * ccc * sin3Lode) * dsin3Lode;
282  RankFourTensor d2kk = (bbb + 2 * ccc * sin3Lode) * stress.d2sin3Lode(_lode_cutoff);
283  for (unsigned i = 0; i < 3; ++i)
284  for (unsigned j = 0; j < 3; ++j)
285  for (unsigned k = 0; k < 3; ++k)
286  for (unsigned l = 0; l < 3; ++l)
287  d2kk(i, j, k, l) += 2 * ccc * dsin3Lode(i, j) * dsin3Lode(k, l);
288 
289  Real sibar2 = stress.secondInvariant();
290  RankTwoTensor dsibar2 = stress.dsecondInvariant();
291  RankFourTensor d2sibar2 = stress.d2secondInvariant();
292 
293  Real denom = std::sqrt(smooth(stress) + sibar2 * Utility::pow<2>(kk));
294  Real denom3 = Utility::pow<3>(denom);
295  Real d2smooth_over_denom = d2smooth(stress) / denom;
296  RankTwoTensor numer_full =
297  0.5 * dsmooth(stress) * dmean_stress + 0.5 * dsibar2 * kk * kk + sibar2 * kk * dkk;
298 
299  dr_dstress = (0.5 * d2sibar2 * Utility::pow<2>(kk) + sibar2 * kk * d2kk) / denom;
300  for (unsigned i = 0; i < 3; ++i)
301  for (unsigned j = 0; j < 3; ++j)
302  for (unsigned k = 0; k < 3; ++k)
303  for (unsigned l = 0; l < 3; ++l)
304  {
305  dr_dstress(i, j, k, l) +=
306  0.5 * d2smooth_over_denom * dmean_stress(i, j) * dmean_stress(k, l);
307  dr_dstress(i, j, k, l) +=
308  (dsibar2(i, j) * dkk(k, l) * kk + dkk(i, j) * dsibar2(k, l) * kk +
309  sibar2 * dkk(i, j) * dkk(k, l)) /
310  denom;
311  dr_dstress(i, j, k, l) -= numer_full(i, j) * numer_full(k, l) / denom3;
312  }
313  }
314  return dr_dstress;
315 }
316 
319  Real intnl) const
320 {
321  Real sin_angle = std::sin(psi(intnl));
322  Real dsin_angle = std::cos(psi(intnl)) * dpsi(intnl);
323 
324  Real mean_stress = stress.trace() / 3.0;
325  RankTwoTensor dmean_stress = stress.dtrace() / 3.0;
326  Real sin3Lode = stress.sin3Lode(_lode_cutoff, 0);
327 
328  if (std::abs(sin3Lode) <= _sin3tt)
329  {
330  // the non-edge-smoothed version
331  std::vector<Real> eigvals;
332  std::vector<RankTwoTensor> deigvals;
333  stress.dsymmetricEigenvalues(eigvals, deigvals);
334  Real tmp = eigvals[2] - eigvals[0] + (eigvals[2] + eigvals[0] - 2.0 * mean_stress) * sin_angle;
335  Real dtmp_dintnl = (eigvals[2] + eigvals[0] - 2 * mean_stress) * dsin_angle;
336  RankTwoTensor dtmp_dstress =
337  deigvals[2] - deigvals[0] + (deigvals[2] + deigvals[0] - 2.0 * dmean_stress) * sin_angle;
338  RankTwoTensor d2tmp_dstress_dintnl =
339  (deigvals[2] + deigvals[0] - 2.0 * dmean_stress) * dsin_angle;
340  Real denom = std::sqrt(smooth(stress) + 0.25 * Utility::pow<2>(tmp));
341  return dmean_stress * dsin_angle + 0.25 * dtmp_dintnl * dtmp_dstress / denom +
342  0.25 * tmp * d2tmp_dstress_dintnl / denom -
343  0.5 * (dsmooth(stress) * dmean_stress + 0.5 * tmp * dtmp_dstress) * 0.25 * tmp *
344  dtmp_dintnl / Utility::pow<3>(denom);
345  }
346  else
347  {
348  // the edge-smoothed version
349  Real aaa, bbb, ccc;
350  abbo(sin3Lode, sin_angle, aaa, bbb, ccc);
351  Real kk = aaa + bbb * sin3Lode + ccc * Utility::pow<2>(sin3Lode);
352 
353  Real daaa, dbbb, dccc;
354  dabbo(sin3Lode, sin_angle, daaa, dbbb, dccc);
355  Real dkk_dintnl = (daaa + dbbb * sin3Lode + dccc * Utility::pow<2>(sin3Lode)) * dsin_angle;
356  RankTwoTensor dkk_dstress = (bbb + 2 * ccc * sin3Lode) * stress.dsin3Lode(_lode_cutoff);
357  RankTwoTensor d2kk_dstress_dintnl =
358  (dbbb + 2 * dccc * sin3Lode) * stress.dsin3Lode(_lode_cutoff) * dsin_angle;
359 
360  Real sibar2 = stress.secondInvariant();
361  RankTwoTensor dsibar2 = stress.dsecondInvariant();
362  Real denom = std::sqrt(smooth(stress) + sibar2 * Utility::pow<2>(kk));
363 
364  return dmean_stress * dsin_angle +
365  (dsibar2 * kk * dkk_dintnl + sibar2 * dkk_dintnl * dkk_dstress +
366  sibar2 * kk * d2kk_dstress_dintnl) /
367  denom -
368  (0.5 * dsmooth(stress) * dmean_stress + 0.5 * dsibar2 * Utility::pow<2>(kk) +
369  sibar2 * kk * dkk_dstress) *
370  sibar2 * kk * dkk_dintnl / Utility::pow<3>(denom);
371  }
372 }
373 
374 Real
375 TensorMechanicsPlasticMohrCoulomb::cohesion(const Real internal_param) const
376 {
377  return _cohesion.value(internal_param);
378 }
379 
380 Real
381 TensorMechanicsPlasticMohrCoulomb::dcohesion(const Real internal_param) const
382 {
383  return _cohesion.derivative(internal_param);
384 }
385 
386 Real
387 TensorMechanicsPlasticMohrCoulomb::phi(const Real internal_param) const
388 {
389  return _phi.value(internal_param);
390 }
391 
392 Real
393 TensorMechanicsPlasticMohrCoulomb::dphi(const Real internal_param) const
394 {
395  return _phi.derivative(internal_param);
396 }
397 
398 Real
399 TensorMechanicsPlasticMohrCoulomb::psi(const Real internal_param) const
400 {
401  return _psi.value(internal_param);
402 }
403 
404 Real
405 TensorMechanicsPlasticMohrCoulomb::dpsi(const Real internal_param) const
406 {
407  return _psi.derivative(internal_param);
408 }
409 
410 void
412  const Real sin3lode, const Real sin_angle, Real & aaa, Real & bbb, Real & ccc) const
413 {
414  Real tmp1 = (sin3lode >= 0 ? _costt - sin_angle * _sintt / std::sqrt(3.0)
415  : _costt + sin_angle * _sintt / std::sqrt(3.0));
416  Real tmp2 = (sin3lode >= 0 ? _sintt + sin_angle * _costt / std::sqrt(3.0)
417  : -_sintt + sin_angle * _costt / std::sqrt(3.0));
418 
419  ccc = -_cos3tt * tmp1;
420  ccc += (sin3lode >= 0 ? -3 * _sin3tt * tmp2 : 3 * _sin3tt * tmp2);
421  ccc /= 18 * Utility::pow<3>(_cos3tt);
422 
423  bbb = (sin3lode >= 0 ? _sin6tt * tmp1 : -_sin6tt * tmp1);
424  bbb -= 6 * _cos6tt * tmp2;
425  bbb /= 18 * Utility::pow<3>(_cos3tt);
426 
427  aaa = (sin3lode >= 0 ? -sin_angle * _sintt / std::sqrt(3.0) - bbb * _sin3tt
428  : sin_angle * _sintt / std::sqrt(3.0) + bbb * _sin3tt);
429  aaa += -ccc * Utility::pow<2>(_sin3tt) + _costt;
430 }
431 
432 void
434  const Real sin3lode, const Real /*sin_angle*/, Real & daaa, Real & dbbb, Real & dccc) const
435 {
436  Real dtmp1 = (sin3lode >= 0 ? -_sintt / std::sqrt(3.0) : _sintt / std::sqrt(3.0));
437  Real dtmp2 = _costt / std::sqrt(3.0);
438 
439  dccc = -_cos3tt * dtmp1;
440  dccc += (sin3lode >= 0 ? -3 * _sin3tt * dtmp2 : 3 * _sin3tt * dtmp2);
441  dccc /= 18 * Utility::pow<3>(_cos3tt);
442 
443  dbbb = (sin3lode >= 0 ? _sin6tt * dtmp1 : -_sin6tt * dtmp1);
444  dbbb -= 6 * _cos6tt * dtmp2;
445  dbbb /= 18 * Utility::pow<3>(_cos3tt);
446 
447  daaa = (sin3lode >= 0 ? -_sintt / std::sqrt(3.0) - dbbb * _sin3tt
448  : _sintt / std::sqrt(3.0) + dbbb * _sin3tt);
449  daaa += -dccc * Utility::pow<2>(_sin3tt);
450 }
451 
452 Real
454 {
455  Real smoother2 = _small_smoother2;
456  if (_tip_scheme == "cap")
457  {
458  Real x = stress.trace() / 3.0 - _cap_start;
459  Real p = 0;
460  if (x > 0)
461  p = x * (1 - std::exp(-_cap_rate * x));
462  smoother2 += Utility::pow<2>(p);
463  }
464  return smoother2;
465 }
466 
467 Real
469 {
470  Real dsmoother2 = 0;
471  if (_tip_scheme == "cap")
472  {
473  Real x = stress.trace() / 3.0 - _cap_start;
474  Real p = 0;
475  Real dp_dx = 0;
476  if (x > 0)
477  {
478  p = x * (1 - std::exp(-_cap_rate * x));
479  dp_dx = (1 - std::exp(-_cap_rate * x)) + x * _cap_rate * std::exp(-_cap_rate * x);
480  }
481  dsmoother2 += 2 * p * dp_dx;
482  }
483  return dsmoother2;
484 }
485 
486 Real
488 {
489  Real d2smoother2 = 0;
490  if (_tip_scheme == "cap")
491  {
492  Real x = stress.trace() / 3.0 - _cap_start;
493  Real p = 0;
494  Real dp_dx = 0;
495  Real d2p_dx2 = 0;
496  if (x > 0)
497  {
498  p = x * (1 - std::exp(-_cap_rate * x));
499  dp_dx = (1 - std::exp(-_cap_rate * x)) + x * _cap_rate * std::exp(-_cap_rate * x);
500  d2p_dx2 = 2 * _cap_rate * std::exp(-_cap_rate * x) -
501  x * Utility::pow<2>(_cap_rate) * std::exp(-_cap_rate * x);
502  }
503  d2smoother2 += 2 * Utility::pow<2>(dp_dx) + 2 * p * d2p_dx2;
504  }
505  return d2smoother2;
506 }
507 
508 std::string
510 {
511  return "MohrCoulomb";
512 }
TensorMechanicsPlasticMohrCoulomb::flowPotential
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
The flow potential.
Definition: TensorMechanicsPlasticMohrCoulomb.C:228
TensorMechanicsPlasticMohrCoulomb::phi
virtual Real phi(const Real internal_param) const
friction angle as a function of internal parameter
Definition: TensorMechanicsPlasticMohrCoulomb.C:387
TensorMechanicsPlasticMohrCoulomb::dflowPotential_dintnl
RankTwoTensor dflowPotential_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to the internal parameter.
Definition: TensorMechanicsPlasticMohrCoulomb.C:318
TensorMechanicsPlasticMohrCoulomb::_lode_cutoff
Real _lode_cutoff
if secondInvariant < _lode_cutoff then set Lode angle to zero. This is to guard against precision-los...
Definition: TensorMechanicsPlasticMohrCoulomb.h:105
TensorMechanicsPlasticModel::validParams
static InputParameters validParams()
Definition: TensorMechanicsPlasticModel.C:18
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
defineLegacyParams
defineLegacyParams(TensorMechanicsPlasticMohrCoulomb)
libMesh
Definition: RANFSNormalMechanicalContact.h:24
TensorMechanicsPlasticMohrCoulomb::modelName
virtual std::string modelName() const override
Definition: TensorMechanicsPlasticMohrCoulomb.C:509
TensorMechanicsPlasticMohrCoulomb::_sintt
Real _sintt
sin(_tt)
Definition: TensorMechanicsPlasticMohrCoulomb.h:90
TensorMechanicsPlasticMohrCoulomb::df_dsig
RankTwoTensor df_dsig(const RankTwoTensor &stress, const Real sin_angle) const
d(yieldFunction)/d(stress), but with the ability to put friction or dilation angle into the result
Definition: TensorMechanicsPlasticMohrCoulomb.C:147
TensorMechanicsPlasticMohrCoulomb::_costt
Real _costt
cos(_tt)
Definition: TensorMechanicsPlasticMohrCoulomb.h:87
TensorMechanicsPlasticMohrCoulomb::dyieldFunction_dstress
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
Definition: TensorMechanicsPlasticMohrCoulomb.C:182
TensorMechanicsPlasticMohrCoulomb::_phi
const TensorMechanicsHardeningModel & _phi
Hardening model for phi.
Definition: TensorMechanicsPlasticMohrCoulomb.h:59
TensorMechanicsPlasticMohrCoulomb::_cohesion
const TensorMechanicsHardeningModel & _cohesion
Hardening model for cohesion.
Definition: TensorMechanicsPlasticMohrCoulomb.h:56
TensorMechanicsPlasticMohrCoulomb::_sin6tt
Real _sin6tt
sin(6*_tt)
Definition: TensorMechanicsPlasticMohrCoulomb.h:102
TensorMechanicsPlasticMohrCoulomb::_tt
Real _tt
edge smoothing parameter, in radians
Definition: TensorMechanicsPlasticMohrCoulomb.h:84
TensorMechanicsPlasticMohrCoulomb::validParams
static InputParameters validParams()
Definition: TensorMechanicsPlasticMohrCoulomb.C:19
TensorMechanicsPlasticMohrCoulomb::_small_smoother2
Real _small_smoother2
Square of tip smoothing parameter to smooth the cone at mean_stress = T.
Definition: TensorMechanicsPlasticMohrCoulomb.h:75
TensorMechanicsPlasticMohrCoulomb::_tip_scheme
MooseEnum _tip_scheme
The yield function is modified to f = s_m*sinphi + sqrt(a + s_bar^2 K^2) - C*cosphi where "a" depends...
Definition: TensorMechanicsPlasticMohrCoulomb.h:72
TensorMechanicsPlasticMohrCoulomb::dflowPotential_dstress
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
Definition: TensorMechanicsPlasticMohrCoulomb.C:235
TensorMechanicsPlasticMohrCoulomb::_psi
const TensorMechanicsHardeningModel & _psi
Hardening model for psi.
Definition: TensorMechanicsPlasticMohrCoulomb.h:62
TensorMechanicsPlasticMohrCoulomb::dpsi
virtual Real dpsi(const Real internal_param) const
d(psi)/d(internal_param);
Definition: TensorMechanicsPlasticMohrCoulomb.C:405
TensorMechanicsPlasticMohrCoulomb::smooth
virtual Real smooth(const RankTwoTensor &stress) const
returns the 'a' parameter - see doco for _tip_scheme
Definition: TensorMechanicsPlasticMohrCoulomb.C:453
TensorMechanicsPlasticMohrCoulomb::abbo
void abbo(const Real sin3lode, const Real sin_angle, Real &aaa, Real &bbb, Real &ccc) const
Computes Abbo et al's A, B and C parameters.
Definition: TensorMechanicsPlasticMohrCoulomb.C:411
TensorMechanicsPlasticMohrCoulomb::_sin3tt
Real _sin3tt
sin(3*_tt) - useful for making comparisons with Lode angle
Definition: TensorMechanicsPlasticMohrCoulomb.h:96
TensorMechanicsPlasticMohrCoulomb::dabbo
void dabbo(const Real sin3lode, const Real sin_angle, Real &daaa, Real &dbbb, Real &dccc) const
Computes derivatives of Abbo et al's A, B and C parameters wrt sin_angle.
Definition: TensorMechanicsPlasticMohrCoulomb.C:433
TensorMechanicsPlasticMohrCoulomb::_cap_start
Real _cap_start
smoothing parameter dictating when the 'cap' will start - see doco for _tip_scheme
Definition: TensorMechanicsPlasticMohrCoulomb.h:78
TensorMechanicsPlasticMohrCoulomb::_cos3tt
Real _cos3tt
cos(3*_tt)
Definition: TensorMechanicsPlasticMohrCoulomb.h:93
TensorMechanicsPlasticMohrCoulomb::d2smooth
virtual Real d2smooth(const RankTwoTensor &stress) const
returns the d^2a/dstress_mean^2 - see doco for _tip_scheme
Definition: TensorMechanicsPlasticMohrCoulomb.C:487
TensorMechanicsHardeningModel::derivative
virtual Real derivative(Real intnl) const
Definition: TensorMechanicsHardeningModel.C:47
TensorMechanicsPlasticMohrCoulomb::dyieldFunction_dintnl
Real dyieldFunction_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to the internal parameter.
Definition: TensorMechanicsPlasticMohrCoulomb.C:190
TensorMechanicsPlasticMohrCoulomb::yieldFunction
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models.
Definition: TensorMechanicsPlasticMohrCoulomb.C:117
TensorMechanicsHardeningModel::value
virtual Real value(Real intnl) const
Definition: TensorMechanicsHardeningModel.C:45
TensorMechanicsPlasticMohrCoulomb
Mohr-Coulomb plasticity, nonassociative with hardening/softening.
Definition: TensorMechanicsPlasticMohrCoulomb.h:33
TensorMechanicsPlasticMohrCoulomb::_cos6tt
Real _cos6tt
cos(6*_tt)
Definition: TensorMechanicsPlasticMohrCoulomb.h:99
TensorMechanicsPlasticMohrCoulomb::_cap_rate
Real _cap_rate
dictates how quickly the 'cap' degenerates to a hemisphere - see doco for _tip_scheme
Definition: TensorMechanicsPlasticMohrCoulomb.h:81
TensorMechanicsPlasticMohrCoulomb::dsmooth
virtual Real dsmooth(const RankTwoTensor &stress) const
returns the da/dstress_mean - see doco for _tip_scheme
Definition: TensorMechanicsPlasticMohrCoulomb.C:468
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
TensorMechanicsPlasticMohrCoulomb::cohesion
virtual Real cohesion(const Real internal_param) const
cohesion as a function of internal parameter
Definition: TensorMechanicsPlasticMohrCoulomb.C:375
TensorMechanicsPlasticModel
Plastic Model base class The virtual functions written below must be over-ridden in derived classes t...
Definition: TensorMechanicsPlasticModel.h:42
TensorMechanicsPlasticMohrCoulomb::psi
virtual Real psi(const Real internal_param) const
dilation angle as a function of internal parameter
Definition: TensorMechanicsPlasticMohrCoulomb.C:399
TensorMechanicsPlasticMohrCoulomb::dcohesion
virtual Real dcohesion(const Real internal_param) const
d(cohesion)/d(internal_param);
Definition: TensorMechanicsPlasticMohrCoulomb.C:381
TensorMechanicsPlasticMohrCoulomb::dphi
virtual Real dphi(const Real internal_param) const
d(phi)/d(internal_param);
Definition: TensorMechanicsPlasticMohrCoulomb.C:393
TensorMechanicsPlasticMohrCoulomb::TensorMechanicsPlasticMohrCoulomb
TensorMechanicsPlasticMohrCoulomb(const InputParameters &parameters)
Definition: TensorMechanicsPlasticMohrCoulomb.C:71
registerMooseObject
registerMooseObject("TensorMechanicsApp", TensorMechanicsPlasticMohrCoulomb)
RankTwoTensorTempl< Real >
TensorMechanicsPlasticMohrCoulomb.h
TensorMechanicsHardeningModel
Hardening Model base class.
Definition: TensorMechanicsHardeningModel.h:27