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 "HyperbolicViscoplasticityStressUpdate.h" 11 : 12 : #include "Function.h" 13 : #include "ElasticityTensorTools.h" 14 : 15 : registerMooseObject("SolidMechanicsApp", HyperbolicViscoplasticityStressUpdate); 16 : 17 : InputParameters 18 28 : HyperbolicViscoplasticityStressUpdate::validParams() 19 : { 20 28 : InputParameters params = RadialReturnStressUpdate::validParams(); 21 28 : params.addClassDescription("This class uses the discrete material for a hyperbolic sine " 22 : "viscoplasticity model in which the effective plastic strain is " 23 : "solved for using a creep approach."); 24 : 25 : // Linear strain hardening parameters 26 56 : params.addRequiredParam<Real>("yield_stress", 27 : "The point at which plastic strain begins accumulating"); 28 56 : params.addRequiredParam<Real>("hardening_constant", "Hardening slope"); 29 : 30 : // Viscoplasticity constitutive equation parameters 31 56 : params.addRequiredParam<Real>("c_alpha", 32 : "Viscoplasticity coefficient, scales the hyperbolic function"); 33 56 : params.addRequiredParam<Real>("c_beta", 34 : "Viscoplasticity coefficient inside the hyperbolic sin function"); 35 56 : params.addDeprecatedParam<std::string>( 36 : "plastic_prepend", 37 : "", 38 : "String that is prepended to the plastic_strain Material Property", 39 : "This has been replaced by the 'base_name' parameter"); 40 28 : params.set<std::string>("effective_inelastic_strain_name") = "effective_plastic_strain"; 41 : 42 28 : return params; 43 0 : } 44 : 45 21 : HyperbolicViscoplasticityStressUpdate::HyperbolicViscoplasticityStressUpdate( 46 21 : const InputParameters & parameters) 47 : : RadialReturnStressUpdate(parameters), 48 42 : _plastic_prepend(getParam<std::string>("plastic_prepend")), 49 21 : _yield_stress(parameters.get<Real>("yield_stress")), 50 21 : _hardening_constant(parameters.get<Real>("hardening_constant")), 51 21 : _c_alpha(parameters.get<Real>("c_alpha")), 52 21 : _c_beta(parameters.get<Real>("c_beta")), 53 21 : _yield_condition(-1.0), // set to a non-physical value to catch uninitalized yield condition 54 21 : _hardening_variable(declareProperty<Real>("hardening_variable")), 55 42 : _hardening_variable_old(getMaterialPropertyOld<Real>("hardening_variable")), 56 : 57 21 : _plastic_strain( 58 42 : declareProperty<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")), 59 21 : _plastic_strain_old( 60 42 : getMaterialPropertyOld<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")) 61 : { 62 21 : } 63 : 64 : void 65 80 : HyperbolicViscoplasticityStressUpdate::initQpStatefulProperties() 66 : { 67 80 : _hardening_variable[_qp] = 0.0; 68 80 : _plastic_strain[_qp].zero(); 69 80 : } 70 : 71 : void 72 0 : HyperbolicViscoplasticityStressUpdate::propagateQpStatefulProperties() 73 : { 74 0 : _hardening_variable[_qp] = _hardening_variable_old[_qp]; 75 0 : _plastic_strain[_qp] = _plastic_strain_old[_qp]; 76 : 77 0 : propagateQpStatefulPropertiesRadialReturn(); 78 0 : } 79 : 80 : void 81 13248 : HyperbolicViscoplasticityStressUpdate::computeStressInitialize( 82 : const Real & effective_trial_stress, const RankFourTensor & elasticity_tensor) 83 : { 84 : RadialReturnStressUpdate::computeStressInitialize(effective_trial_stress, elasticity_tensor); 85 : 86 13248 : _yield_condition = effective_trial_stress - _hardening_variable_old[_qp] - _yield_stress; 87 : 88 13248 : _hardening_variable[_qp] = _hardening_variable_old[_qp]; 89 13248 : _plastic_strain[_qp] = _plastic_strain_old[_qp]; 90 13248 : } 91 : 92 : Real 93 61984 : HyperbolicViscoplasticityStressUpdate::computeResidual(const Real & effective_trial_stress, 94 : const Real & scalar) 95 : { 96 : Real residual = 0.0; 97 : 98 : mooseAssert(_yield_condition != -1.0, 99 : "the yield stress was not updated by computeStressInitialize"); 100 : 101 61984 : if (_yield_condition > 0.0) 102 : { 103 123368 : const Real xflow = _c_beta * (effective_trial_stress - (_three_shear_modulus * scalar) - 104 61684 : computeHardeningValue(scalar) - _yield_stress); 105 61684 : const Real xphi = _c_alpha * std::sinh(xflow); 106 : 107 61684 : _xphidp = -_three_shear_modulus * _c_alpha * _c_beta * std::cosh(xflow); 108 61684 : _xphir = -_c_alpha * _c_beta * std::cosh(xflow); 109 61684 : residual = xphi * _dt - scalar; 110 : } 111 61984 : return residual; 112 : } 113 : 114 : Real 115 61984 : HyperbolicViscoplasticityStressUpdate::computeDerivative(const Real & /*effective_trial_stress*/, 116 : const Real & /*scalar*/) 117 : { 118 : Real derivative = 1.0; 119 61984 : if (_yield_condition > 0.0) 120 61684 : derivative = _xphidp * _dt + _hardening_constant * _xphir * _dt - 1.0; 121 : 122 61984 : return derivative; 123 : } 124 : 125 : void 126 49056 : HyperbolicViscoplasticityStressUpdate::iterationFinalize(const Real & scalar) 127 : { 128 49056 : if (_yield_condition > 0.0) 129 48756 : _hardening_variable[_qp] = computeHardeningValue(scalar); 130 49056 : } 131 : 132 : Real 133 110440 : HyperbolicViscoplasticityStressUpdate::computeHardeningValue(Real scalar) 134 : { 135 110440 : return _hardening_variable_old[_qp] + (_hardening_constant * scalar); 136 : } 137 : 138 : void 139 13248 : HyperbolicViscoplasticityStressUpdate::computeStressFinalize( 140 : const RankTwoTensor & plasticStrainIncrement) 141 : { 142 13248 : _plastic_strain[_qp] += plasticStrainIncrement; 143 13248 : }