https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
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
42void
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}
registerMooseObject("SolidMechanicsApp", ExponentialEnergyBasedSoftening)
unsigned int dim
ExponentialEnergyBasedSoftening is a smeared crack softening model that uses an exponential softening...
ExponentialEnergyBasedSoftening(const InputParameters &parameters)
const Real & _fracture_toughness
Fracture toughness.
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...
const Real & _residual_stress
Residual stress after full softening.
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
const Elem *const & _current_elem
SmearedCrackSofteningBase is the base class for a set of models that define the softening behavior of...
static InputParameters validParams()