www.mooseframework.org
GeneralizedMaxwellBase.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 /****************************************************************/
7 
9 
10 template <>
11 InputParameters
13 {
14  InputParameters params = validParams<LinearViscoelasticityBase>();
15  return params;
16 }
17 
18 GeneralizedMaxwellBase::GeneralizedMaxwellBase(const InputParameters & parameters)
19  : LinearViscoelasticityBase(parameters)
20 {
22 }
23 
24 void
26 {
27  RankTwoTensor effective_strain = _elastic_strain_old[_qp] + _creep_strain_old[_qp];
29  effective_strain += (*_driving_eigenstrain)[_qp];
30 
31  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
32  {
33  Real theta_i = computeTheta(_dt_old, _dashpot_viscosities[_qp][i]);
34  Real gamma = _dashpot_viscosities[_qp][i] / (_dt_old * theta_i);
35  _viscous_strains[_qp][i] =
36  _viscous_strains_old[_qp][i] *
37  ((_dashpot_viscosities[_qp][i] * gamma - _dt_old * (1. - theta_i) * gamma) /
38  (_dashpot_viscosities[_qp][i] * (1. + gamma)));
39  _viscous_strains[_qp][i] +=
40  effective_strain * ((_dashpot_viscosities[_qp][i] + _dt_old * (1. - theta_i) * gamma) /
41  (_dashpot_viscosities[_qp][i] * (1. + gamma)));
42  }
43 
45  {
46  Real theta_i = computeTheta(_dt_old, _dashpot_viscosities[_qp].back());
47  _viscous_strains[_qp].back() = effective_strain / theta_i;
48  _viscous_strains[_qp].back() -= _viscous_strains_old[_qp].back() * ((1. - theta_i) / theta_i);
49  }
50 }
51 
52 void
54 {
55 
58 
59  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
60  {
61  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp][i]);
62  Real gamma = _dashpot_viscosities[_qp][i] / (_dt * theta_i);
65  _springs_elasticity_tensors[_qp][i] * (gamma / (1. + gamma));
66  }
67 
69  {
70  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp].back());
71  Real gamma = _dashpot_viscosities[_qp].back() / (_dt * theta_i);
73 
74  mooseDoOnce(mooseWarning("Generalized Maxwell model with longterm viscosity may not converge "
75  "under Dirichlet boundary conditions"));
76  }
77 
80 }
81 
82 void
84 {
85  _apparent_creep_strain[_qp].zero();
86 
87  for (unsigned int i = 0; i < _springs_elasticity_tensors[_qp].size(); ++i)
88  {
89  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp][i]);
90  Real gamma = _dashpot_viscosities[_qp][i] / (_dt * theta_i);
92  (_springs_elasticity_tensors[_qp][i] * _viscous_strains[_qp][i]) * (gamma / (1. + gamma));
93  }
94 
96  {
97  Real theta_i = computeTheta(_dt, _dashpot_viscosities[_qp].back());
98  Real gamma = _dashpot_viscosities[_qp].back() / (_dt * theta_i);
100  (_first_elasticity_tensor[_qp] * _viscous_strains[_qp].back()) * gamma;
101  }
102 
104 
106  {
107  _apparent_creep_strain[_qp] +=
109  (*_driving_eigenstrain)[_qp];
110  _apparent_creep_strain[_qp] -= (*_driving_eigenstrain)[_qp];
111  }
112 }
virtual void computeQpApparentElasticityTensors() final
This method computes the apparent elasticity tensor used in the internal time-stepping scheme...
GeneralizedMaxwellBase(const InputParameters &parameters)
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 >()
InputParameters validParams< GeneralizedMaxwellBase >()
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.
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
previous value of the elastic strain for update purposes
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.
virtual void updateQpViscousStrains() final
Update the internal viscous strains at a quadrature point.
const MaterialProperty< std::vector< RankTwoTensor > > & _viscous_strains_old
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.
const MaterialProperty< RankTwoTensor > & _creep_strain_old
Previous value of the true creep strain for update purposes.
MaterialProperty< RankFourTensor > & _apparent_elasticity_tensor_inv
Inverse of the apparent elasticity tensor.