Line data Source code
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 : 10 : #include "ADExponentialSoftening.h" 11 : 12 : #include "MooseMesh.h" 13 : 14 : registerMooseObject("SolidMechanicsApp", ADExponentialSoftening); 15 : 16 : InputParameters 17 124 : ADExponentialSoftening::validParams() 18 : { 19 124 : InputParameters params = ADSmearedCrackSofteningBase::validParams(); 20 124 : params.addClassDescription( 21 : "Softening model with an exponential softening response upon cracking. This " 22 : "class is intended to be used with ADComputeSmearedCrackingStress and relies on automatic " 23 : "differentiation."); 24 372 : params.addRangeCheckedParam<Real>( 25 : "residual_stress", 26 248 : 0.0, 27 : "residual_stress <= 1 & residual_stress >= 0", 28 : "The fraction of the cracking stress allowed to be maintained following a crack."); 29 372 : params.addRangeCheckedParam<Real>( 30 : "alpha", 31 248 : -1.0, 32 : "alpha <= 0", 33 : "Initial slope of the exponential softening curve at crack initiation. " 34 : "If not specified, it is equal to the negative of the Young's modulus."); 35 372 : params.addRangeCheckedParam<Real>( 36 : "beta", 37 248 : 1.0, 38 : "beta >= 0", 39 : "Multiplier applied to alpha to control the exponential softening " 40 : "behavior."); 41 124 : return params; 42 0 : } 43 : 44 93 : ADExponentialSoftening::ADExponentialSoftening(const InputParameters & parameters) 45 : : ADSmearedCrackSofteningBase(parameters), 46 93 : _residual_stress(getParam<Real>("residual_stress")), 47 186 : _alpha(getParam<Real>("alpha")), 48 93 : _alpha_set_by_user(parameters.isParamSetByUser("alpha")), 49 279 : _beta(getParam<Real>("beta")) 50 : { 51 93 : } 52 : 53 : void 54 180240 : ADExponentialSoftening::computeCrackingRelease(ADReal & stress, 55 : ADReal & stiffness_ratio, 56 : const ADReal & /*strain*/, 57 : const ADReal & crack_initiation_strain, 58 : const ADReal & crack_max_strain, 59 : const ADReal & cracking_stress, 60 : const ADReal & youngs_modulus, 61 : const ADReal & /*poissons_ratio*/) 62 : { 63 : using std::exp; 64 : 65 : mooseAssert(crack_max_strain >= crack_initiation_strain, 66 : "crack_max_strain must be >= crack_initiation_strain"); 67 : 68 180240 : ADReal alpha = 0.0; 69 180240 : if (_alpha_set_by_user) 70 0 : alpha = _alpha; 71 : else 72 180240 : alpha = -youngs_modulus; 73 : 74 : // Compute stress that follows exponental curve 75 : stress = 76 360480 : cracking_stress * (_residual_stress + (1.0 - _residual_stress) * 77 360480 : exp(alpha * _beta / cracking_stress * 78 180240 : (crack_max_strain - crack_initiation_strain))); 79 : // Compute ratio of current stiffness to original stiffness 80 180240 : stiffness_ratio = stress * crack_initiation_strain / (crack_max_strain * cracking_stress); 81 180240 : }