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 "GeneralizedKelvinVoigtModel.h" 11 : 12 : registerMooseObject("SolidMechanicsApp", GeneralizedKelvinVoigtModel); 13 : 14 : InputParameters 15 168 : GeneralizedKelvinVoigtModel::validParams() 16 : { 17 168 : InputParameters params = GeneralizedKelvinVoigtBase::validParams(); 18 168 : params.addClassDescription( 19 : "Generalized Kelvin-Voigt model composed of a serial assembly of unit Kelvin-Voigt modules"); 20 336 : params.addRequiredParam<Real>("young_modulus", "initial elastic modulus of the material"); 21 336 : params.addRequiredParam<Real>("poisson_ratio", "initial poisson ratio of the material"); 22 336 : params.addRequiredParam<std::vector<Real>>( 23 : "creep_modulus", "list of the elastic moduli of the different springs in the material"); 24 336 : params.addRequiredParam<std::vector<Real>>( 25 : "creep_viscosity", 26 : "list of the characteristic times of the different dashpots in the material"); 27 336 : params.addParam<std::vector<Real>>( 28 : "creep_ratio", "list of the poisson ratios of the different springs in the material"); 29 168 : params.set<bool>("force_recompute_properties") = false; 30 168 : params.suppressParameter<bool>("force_recompute_properties"); 31 168 : return params; 32 0 : } 33 : 34 126 : GeneralizedKelvinVoigtModel::GeneralizedKelvinVoigtModel(const InputParameters & parameters) 35 : : GeneralizedKelvinVoigtBase(parameters), 36 252 : _Ci(getParam<std::vector<Real>>("creep_modulus").size()), 37 252 : _eta_i(getParam<std::vector<Real>>("creep_viscosity")), 38 378 : _Si(getParam<std::vector<Real>>("creep_modulus").size()) 39 : { 40 252 : Real young_modulus = getParam<Real>("young_modulus"); 41 252 : Real poisson_ratio = getParam<Real>("poisson_ratio"); 42 : 43 126 : _C0.fillFromInputVector({young_modulus, poisson_ratio}, RankFourTensor::symmetric_isotropic_E_nu); 44 126 : _S0 = _C0.invSymm(); 45 : 46 378 : std::vector<Real> creep_modulus = getParam<std::vector<Real>>("creep_modulus"); 47 : std::vector<Real> creep_ratio; 48 252 : if (isParamValid("creep_ratio")) 49 0 : creep_ratio = getParam<std::vector<Real>>("creep_ratio"); 50 : else 51 126 : creep_ratio.resize(_Ci.size(), poisson_ratio); 52 : 53 126 : if (creep_modulus.size() != _Ci.size()) 54 0 : mooseError("incompatible number of creep moduli and viscosities"); 55 126 : if (creep_ratio.size() != _Ci.size()) 56 0 : mooseError("incompatible number of creep ratios and viscosities"); 57 126 : if (!(_Ci.size() == _eta_i.size() || _Ci.size() + 1 == _eta_i.size())) 58 0 : mooseError("incompatible number of creep ratios and viscosities"); 59 : 60 315 : for (unsigned int i = 0; i < _Ci.size(); ++i) 61 : { 62 189 : _Ci[i].fillFromInputVector({creep_modulus[i], creep_ratio[i]}, 63 : RankFourTensor::symmetric_isotropic_E_nu); 64 189 : _Si[i] = _Ci[i].invSymm(); 65 : } 66 : 67 357 : for (unsigned int i = 0; i < _eta_i.size(); ++i) 68 : { 69 231 : if (_eta_i[i] < 0 || MooseUtils::absoluteFuzzyEqual(_eta_i[i], 0.0)) 70 0 : mooseError("material viscosity must be strictly > 0"); 71 : } 72 : 73 126 : _components = _eta_i.size(); 74 126 : _has_longterm_dashpot = (_eta_i.size() == _Ci.size() + 1); 75 : 76 126 : issueGuarantee(_elasticity_tensor_name, Guarantee::ISOTROPIC); 77 126 : declareViscoelasticProperties(); 78 126 : } 79 : 80 : void 81 6688 : GeneralizedKelvinVoigtModel::computeQpViscoelasticProperties() 82 : { 83 6688 : _first_elasticity_tensor[_qp] = _C0; 84 : 85 16320 : for (unsigned int i = 0; i < _Ci.size(); ++i) 86 9632 : (*_springs_elasticity_tensors[i])[_qp] = _Ci[i]; 87 : 88 18816 : for (unsigned int i = 0; i < _eta_i.size(); ++i) 89 12128 : (*_dashpot_viscosities[i])[_qp] = _eta_i[i]; 90 6688 : } 91 : 92 : void 93 6688 : GeneralizedKelvinVoigtModel::computeQpViscoelasticPropertiesInv() 94 : { 95 6688 : (*_first_elasticity_tensor_inv)[_qp] = _S0; 96 : 97 16320 : for (unsigned int i = 0; i < _Si.size(); ++i) 98 9632 : (*_springs_elasticity_tensors_inv[i])[_qp] = _Si[i]; 99 6688 : }