www.mooseframework.org
GeneralizedKelvinVoigtBase.C
Go to the documentation of this file.
1 /****************************************************************/
2 /* MOOSE - Multiphysics Object Oriented Simulation Environment */
3 /* */
4 /* All contents are licensed under LGPL V2.1 */
5 /* See LICENSE for full restrictions */
6 /****************************************************************/
8 
9 template <>
10 InputParameters
12 {
13  InputParameters params = validParams<LinearViscoelasticityBase>();
14  params.set<bool>("need_viscoelastic_properties_inverse") = true;
15  params.suppressParameter<bool>("need_viscoelastic_properties_inverse");
16  return params;
17 }
18 
19 GeneralizedKelvinVoigtBase::GeneralizedKelvinVoigtBase(const InputParameters & parameters)
20  : LinearViscoelasticityBase(parameters)
21 {
23 }
24 
25 void
27 {
28  RankTwoTensor effective_stress = _stress_old[_qp];
30  effective_stress += _instantaneous_elasticity_tensor[_qp] * (*_driving_eigenstrain)[_qp];
31 
32  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
33  {
34  Real theta_i = computeTheta(_dt_old, _dashpot_viscosities[_qp][i]);
35  Real gamma = _dashpot_viscosities[_qp][i] / (_dt_old * theta_i);
36  _viscous_strains[_qp][i] =
37  ((*_springs_elasticity_tensors_inv)[_qp][i] * effective_stress) / (theta_i * (1. + gamma));
38  _viscous_strains[_qp][i] += _viscous_strains_old[_qp][i] *
39  (gamma / (theta_i * (1. + gamma)) - (1. - theta_i) / theta_i);
40  }
41 
43  {
44  _viscous_strains[_qp].back() = ((*_first_elasticity_tensor_inv)[_qp] * effective_stress) *
45  (_dt_old / _dashpot_viscosities[_qp].back());
46  _viscous_strains[_qp].back() += _viscous_strains_old[_qp].back();
47  }
48 }
49 
50 void
52 {
54  _instantaneous_elasticity_tensor_inv[_qp] = (*_first_elasticity_tensor_inv)[_qp];
55  _apparent_elasticity_tensor_inv[_qp] = (*_first_elasticity_tensor_inv)[_qp];
56 
57  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
58  {
59  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp][i]);
60  Real gamma = _dashpot_viscosities[_qp][i] / (_dt * theta_i);
62  (*_springs_elasticity_tensors_inv)[_qp][i] / (1. + gamma);
63  }
64 
66  {
67  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp].back());
68  Real gamma = _dashpot_viscosities[_qp].back() / (_dt * theta_i);
69  _apparent_elasticity_tensor_inv[_qp] += (*_first_elasticity_tensor_inv)[_qp] / gamma;
70  }
71 
73 }
74 
75 void
77 {
78  _apparent_creep_strain[_qp].zero();
79 
80  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
81  {
82  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp][i]);
83  Real gamma = _dashpot_viscosities[_qp][i] / (_dt * theta_i);
84  _apparent_creep_strain[_qp] += _viscous_strains[_qp][i] * (gamma / (1. + gamma));
85  }
86 
88  _apparent_creep_strain[_qp] += _viscous_strains[_qp].back();
89 
91  {
92  RankFourTensor cumulated_driving_tensor;
93  cumulated_driving_tensor.zero();
94  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
95  {
96  double theta_i = computeTheta(_dt, _dashpot_viscosities[_qp][i]);
97  double gamma = _dashpot_viscosities[_qp][i] / (_dt * theta_i);
98  cumulated_driving_tensor += (*_springs_elasticity_tensors_inv)[_qp][i] / (1. + gamma);
99  }
100 
101  _apparent_creep_strain[_qp] +=
102  (_instantaneous_elasticity_tensor[_qp] * cumulated_driving_tensor) *
103  (*_driving_eigenstrain)[_qp];
104 
106  {
107  double theta_i = computeTheta(_dt, _dashpot_viscosities[_qp].back());
108  double gamma = _dashpot_viscosities[_qp].back() / (_dt * theta_i);
109  _apparent_creep_strain[_qp] += (*_driving_eigenstrain)[_qp] / gamma;
110  }
111  }
112 }
InputParameters validParams< GeneralizedKelvinVoigtBase >()
virtual void updateQpViscousStrains() final
Update the internal viscous strains at a quadrature point.
MaterialProperty< std::vector< RankTwoTensor > > & _viscous_strains
The internal strain variables required by the time-stepping procedure (generally, on a one-on-one bas...
InputParameters validParams< LinearViscoelasticityBase >()
virtual void computeQpApparentCreepStrain() final
This method computes the apparent creep strain corresponding to the current viscous_strain of each da...
bool _has_longterm_dashpot
Indicates if the spring-dashpot assembly has a single dashpot not associated with a spring...
MaterialProperty< std::vector< RankFourTensor > > & _springs_elasticity_tensors
List of elasticity tensor of each subsequent spring in the chain.
bool _need_viscoelastic_properties_inverse
If active, indicates that we need to call computeQpViscoelasticPropertiesInv()
MaterialProperty< RankFourTensor > & _instantaneous_elasticity_tensor
Instantaneous elasticity tensor. This IS the real elasticity tensor of the material.
MaterialProperty< RankFourTensor > & _apparent_elasticity_tensor
Apparent elasticity tensor. This is NOT the elasticity tensor of the material.
MaterialProperty< RankFourTensor > & _first_elasticity_tensor
Elasticity tensor of a stand-alone elastic spring in the chain.
MaterialProperty< std::vector< Real > > & _dashpot_viscosities
List of viscosities of each subsequent spring in the chain.
Real computeTheta(Real dt, Real viscosity) const
Provides theta as a function of the time step and a viscosity.
const MaterialProperty< RankTwoTensor > & _stress_old
previous value of the stress for update purposes
const MaterialProperty< std::vector< RankTwoTensor > > & _viscous_strains_old
GeneralizedKelvinVoigtBase(const InputParameters &parameters)
MaterialProperty< RankTwoTensor > & _apparent_creep_strain
The apparent creep strain resulting from the internal viscous strains.
This class is a base class for materials consisting of an assembly of linear springs and dashpots...
const MaterialProperty< RankTwoTensor > * _driving_eigenstrain
Pointer to the value of the driving eigenstrain.
bool _has_driving_eigenstrain
Indicates if the model is only driven by the stress, or also by an additional eigenstrain.
MaterialProperty< RankFourTensor > & _instantaneous_elasticity_tensor_inv
Inverse of the instaneous elasticity tensor.
virtual void computeQpApparentElasticityTensors() final
This method computes the apparent elasticity tensor used in the internal time-stepping scheme...
MaterialProperty< RankFourTensor > & _apparent_elasticity_tensor_inv
Inverse of the apparent elasticity tensor.