https://mooseframework.inl.gov
GeneralizedMaxwellModel.C
Go to the documentation of this file.
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 
11 
12 registerMooseObject("SolidMechanicsApp", GeneralizedMaxwellModel);
13 
16 {
18  params.addClassDescription(
19  "Generalized Maxwell model composed of a parallel assembly of unit Maxwell modules");
20  params.addRequiredParam<Real>("young_modulus", "initial elastic modulus of the material");
21  params.addRequiredParam<Real>("poisson_ratio", "initial poisson ratio of the material");
22  params.addRequiredParam<std::vector<Real>>(
23  "creep_modulus", "list of the elastic moduli of the different springs in the material");
24  params.addRequiredParam<std::vector<Real>>(
25  "creep_viscosity",
26  "list of the characteristic times of the different dashpots in the material");
27  params.addParam<std::vector<Real>>(
28  "creep_ratio", "list of the poisson ratios of the different springs in the material");
29  params.set<bool>("force_recompute_properties") = false;
30  params.suppressParameter<bool>("force_recompute_properties");
31  return params;
32 }
33 
35  : GeneralizedMaxwellBase(parameters),
36  _Ci(getParam<std::vector<Real>>("creep_modulus").size()),
37  _eta_i(getParam<std::vector<Real>>("creep_viscosity")),
38  _Si(getParam<std::vector<Real>>("creep_modulus").size())
39 {
40  Real young_modulus = getParam<Real>("young_modulus");
41  Real poisson_ratio = getParam<Real>("poisson_ratio");
42 
43  _C0.fillFromInputVector({young_modulus, poisson_ratio}, RankFourTensor::symmetric_isotropic_E_nu);
44 
45  std::vector<Real> creep_modulus = getParam<std::vector<Real>>("creep_modulus");
46  std::vector<Real> creep_ratio;
47  if (isParamValid("creep_ratio"))
48  creep_ratio = getParam<std::vector<Real>>("creep_ratio");
49  else
50  creep_ratio.resize(_Ci.size(), poisson_ratio);
51 
52  if (creep_modulus.size() != _Ci.size())
53  mooseError("incompatible number of creep moduli and viscosities");
54  if (creep_ratio.size() != _Ci.size())
55  mooseError("incompatible number of creep ratios and viscosities");
56  if (_Ci.size() != _eta_i.size())
57  mooseError("incompatible number of creep ratios and viscosities");
58 
59  for (unsigned int i = 0; i < _Ci.size(); ++i)
60  {
61  _Ci[i].fillFromInputVector({creep_modulus[i], creep_ratio[i]},
63  _Si[i] = _Ci[i].invSymm();
64  _C0 -= _Ci[i];
65  }
66 
68  _S0.zero();
69  else
70  _S0 = _C0.invSymm();
71 
72  for (unsigned int i = 0; i < _eta_i.size(); ++i)
73  {
74  if (_eta_i[i] < 0 || MooseUtils::absoluteFuzzyEqual(_eta_i[i], 0.0))
75  mooseError("material viscosity must be strictly > 0");
76  }
77 
78  _components = _eta_i.size();
79  _has_longterm_dashpot = (_eta_i.size() == _Ci.size() + 1);
80 
83 }
84 
85 void
87 {
89 
90  for (unsigned int i = 0; i < _Ci.size(); ++i)
92 
93  for (unsigned int i = 0; i < _eta_i.size(); ++i)
94  (*_dashpot_viscosities[i])[_qp] = _eta_i[i];
95 }
96 
97 void
99 {
100  (*_first_elasticity_tensor_inv)[_qp] = _S0;
101 
102  for (unsigned int i = 0; i < _Si.size(); ++i)
104 }
std::vector< RankFourTensor > _Si
The inverse of each subsequent spring elasticity tensor.
std::vector< MaterialProperty< RankFourTensor > * > _springs_elasticity_tensors_inv
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void issueGuarantee(const MaterialPropertyName &prop_name, Guarantee guarantee)
This class represents an assembly of springs and dashpots following a generalized Maxwell model (an a...
virtual void computeQpViscoelasticPropertiesInv()
This method computes the inverse elasticity tensor of each spring in the system (if required)...
std::vector< MaterialProperty< RankFourTensor > * > _springs_elasticity_tensors
List of elasticity tensor of each subsequent spring in the chain.
GeneralizedMaxwellModel(const InputParameters &parameters)
void fillFromInputVector(const std::vector< T > &input, FillMethod fill_method)
void declareViscoelasticProperties()
Declare all necessary MaterialProperties for the model.
bool _has_longterm_dashpot
Indicates if the spring-dashpot assembly has a single dashpot not associated with a spring...
This class is an implementation of a generalized Maxwell model with constant mechanical properties...
registerMooseObject("SolidMechanicsApp", GeneralizedMaxwellModel)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void suppressParameter(const std::string &name)
bool isParamValid(const std::string &name) const
virtual void computeQpViscoelasticProperties()
This method assigns the mechanical properties of each spring and dashpot in the system.
std::vector< MaterialProperty< Real > * > _dashpot_viscosities
List of viscosities of each subsequent dashpot in the chain.
MaterialProperty< RankFourTensor > & _first_elasticity_tensor
Elasticity tensor of a stand-alone elastic spring in the chain.
RankFourTensor _S0
The inverse of the elasticity tensor of the first spring.
const T & getParam(const std::string &name) const
unsigned int _components
This is the number of internal variables required by the model.
static InputParameters validParams()
std::vector< Real > _eta_i
The viscosity of each dashpot.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
std::vector< RankFourTensor > _Ci
The elasticity tensor of each subsequent spring.
RankFourTensor _C0
The elasticity tensor associated with the first spring.
RankFourTensorTempl< T > invSymm() const
static InputParameters validParams()