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