https://mooseframework.inl.gov
ExponentialEnergyBasedSoftening.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 
12 #include "MooseMesh.h"
13 
15 
18 {
20  params.addClassDescription(
21  "Softening model with an exponential softening response upon cracking. This "
22  "class is intended to be used with ComputeSmearedCrackingStress.");
23  params.addRangeCheckedParam<Real>(
24  "residual_stress",
25  0.0,
26  "residual_stress <= 1 & residual_stress >= 0",
27  "The fraction of the cracking stress allowed to be maintained following a crack.");
29  "fracture_toughness",
30  "fracture_toughness > 0",
31  "Fracture toughness used to calculate the softening slope. ");
32  return params;
33 }
34 
36  : SmearedCrackSofteningBase(parameters),
37  _residual_stress(getParam<Real>("residual_stress")),
38  _fracture_toughness(getParam<Real>("fracture_toughness"))
39 {
40 }
41 
42 void
44  Real & stiffness_ratio,
45  const Real /*strain*/,
46  const Real crack_initiation_strain,
47  const Real crack_max_strain,
48  const Real cracking_stress,
49  const Real youngs_modulus,
50  const Real poissons_ratio)
51 {
52  mooseAssert(crack_max_strain >= crack_initiation_strain,
53  "crack_max_strain must be >= crack_initiation_strain");
54 
55  unsigned int dim = _current_elem->dim();
56 
57  // Get estimate of element size
58  Real ele_len = 0.0;
59  if (dim == 3)
60  {
61  ele_len = std::cbrt(_current_elem->volume());
62  }
63  else
64  {
65  ele_len = std::sqrt(_current_elem->volume());
66  }
67 
68  // Calculate initial slope of exponential curve
69  const Real energy_release_rate = (_fracture_toughness * _fracture_toughness) *
70  (1 - poissons_ratio * poissons_ratio) / youngs_modulus;
71  const Real frac_stress_sqr = cracking_stress * cracking_stress;
72  const Real l_max = 2 * energy_release_rate * youngs_modulus / frac_stress_sqr;
73 
74  // Check against maximum allowed element size - avoid the divide by zero by capping at a large
75  // slope
76  Real initial_slope = -1e5 * youngs_modulus;
77  if (ele_len < l_max) // TODO: need to log if this isn't true
78  initial_slope =
79  -frac_stress_sqr / (energy_release_rate / ele_len - frac_stress_sqr / (2 * youngs_modulus));
80 
81  // Compute stress that follows exponental curve
82  stress = cracking_stress *
84  (1.0 - _residual_stress) * std::exp(initial_slope / cracking_stress *
85  (crack_max_strain - crack_initiation_strain)));
86  // Compute ratio of current stiffness to original stiffness
87  stiffness_ratio = stress * crack_initiation_strain / (crack_max_strain * cracking_stress);
88 }
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
unsigned int dim
virtual void computeCrackingRelease(Real &stress, Real &stiffness_ratio, const Real strain, const Real crack_initiation_strain, const Real crack_max_strain, const Real cracking_stress, const Real youngs_modulus, const Real poissons_ratio) override
Compute the effect of the cracking release model on the stress and stiffness in the direction of a si...
ExponentialEnergyBasedSoftening(const InputParameters &parameters)
static InputParameters validParams()
registerMooseObject("SolidMechanicsApp", ExponentialEnergyBasedSoftening)
SmearedCrackSofteningBase is the base class for a set of models that define the softening behavior of...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
ExponentialEnergyBasedSoftening is a smeared crack softening model that uses an exponential softening...
void addClassDescription(const std::string &doc_string)
const Real & _fracture_toughness
Fracture toughness.
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
const Real & _residual_stress
Residual stress after full softening.
const Elem *const & _current_elem