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 16 : HyperbolicViscoplasticityStressUpdate::validParams() 19 : { 20 16 : InputParameters params = RadialReturnStressUpdate::validParams(); 21 16 : 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 32 : params.addRequiredParam<Real>("yield_stress", 27 : "The point at which plastic strain begins accumulating"); 28 32 : params.addRequiredParam<Real>("hardening_constant", "Hardening slope"); 29 : 30 : // Viscoplasticity constitutive equation parameters 31 32 : params.addRequiredParam<Real>("c_alpha", 32 : "Viscoplasticity coefficient, scales the hyperbolic function"); 33 32 : params.addRequiredParam<Real>("c_beta", 34 : "Viscoplasticity coefficient inside the hyperbolic sin function"); 35 32 : 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 16 : params.set<std::string>("effective_inelastic_strain_name") = "effective_plastic_strain"; 41 : 42 16 : return params; 43 0 : } 44 : 45 12 : HyperbolicViscoplasticityStressUpdate::HyperbolicViscoplasticityStressUpdate( 46 12 : const InputParameters & parameters) 47 : : RadialReturnStressUpdate(parameters), 48 24 : _plastic_prepend(getParam<std::string>("plastic_prepend")), 49 12 : _yield_stress(parameters.get<Real>("yield_stress")), 50 12 : _hardening_constant(parameters.get<Real>("hardening_constant")), 51 12 : _c_alpha(parameters.get<Real>("c_alpha")), 52 12 : _c_beta(parameters.get<Real>("c_beta")), 53 12 : _yield_condition(-1.0), // set to a non-physical value to catch uninitalized yield condition 54 12 : _hardening_variable(declareProperty<Real>("hardening_variable")), 55 24 : _hardening_variable_old(getMaterialPropertyOld<Real>("hardening_variable")), 56 : 57 12 : _plastic_strain( 58 24 : declareProperty<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")), 59 12 : _plastic_strain_old( 60 24 : getMaterialPropertyOld<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")) 61 : { 62 12 : } 63 : 64 : void 65 48 : HyperbolicViscoplasticityStressUpdate::initQpStatefulProperties() 66 : { 67 48 : _hardening_variable[_qp] = 0.0; 68 48 : _plastic_strain[_qp].zero(); 69 48 : } 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 8008 : HyperbolicViscoplasticityStressUpdate::computeStressInitialize( 82 : const Real & effective_trial_stress, const RankFourTensor & elasticity_tensor) 83 : { 84 : RadialReturnStressUpdate::computeStressInitialize(effective_trial_stress, elasticity_tensor); 85 : 86 8008 : _yield_condition = effective_trial_stress - _hardening_variable_old[_qp] - _yield_stress; 87 : 88 8008 : _hardening_variable[_qp] = _hardening_variable_old[_qp]; 89 8008 : _plastic_strain[_qp] = _plastic_strain_old[_qp]; 90 8008 : } 91 : 92 : Real 93 37560 : 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 37560 : if (_yield_condition > 0.0) 102 : { 103 74760 : const Real xflow = _c_beta * (effective_trial_stress - (_three_shear_modulus * scalar) - 104 37380 : computeHardeningValue(scalar) - _yield_stress); 105 37380 : const Real xphi = _c_alpha * std::sinh(xflow); 106 : 107 37380 : _xphidp = -_three_shear_modulus * _c_alpha * _c_beta * std::cosh(xflow); 108 37380 : _xphir = -_c_alpha * _c_beta * std::cosh(xflow); 109 37380 : residual = xphi * _dt - scalar; 110 : } 111 37560 : return residual; 112 : } 113 : 114 : Real 115 37560 : HyperbolicViscoplasticityStressUpdate::computeDerivative(const Real & /*effective_trial_stress*/, 116 : const Real & /*scalar*/) 117 : { 118 : Real derivative = 1.0; 119 37560 : if (_yield_condition > 0.0) 120 37380 : derivative = _xphidp * _dt + _hardening_constant * _xphir * _dt - 1.0; 121 : 122 37560 : return derivative; 123 : } 124 : 125 : void 126 29744 : HyperbolicViscoplasticityStressUpdate::iterationFinalize(const Real & scalar) 127 : { 128 29744 : if (_yield_condition > 0.0) 129 29564 : _hardening_variable[_qp] = computeHardeningValue(scalar); 130 29744 : } 131 : 132 : Real 133 66944 : HyperbolicViscoplasticityStressUpdate::computeHardeningValue(Real scalar) 134 : { 135 66944 : return _hardening_variable_old[_qp] + (_hardening_constant * scalar); 136 : } 137 : 138 : void 139 8008 : HyperbolicViscoplasticityStressUpdate::computeStressFinalize( 140 : const RankTwoTensor & plasticStrainIncrement) 141 : { 142 8008 : _plastic_strain[_qp] += plasticStrainIncrement; 143 8008 : }