www.mooseframework.org
ReturnMappingModel.C
Go to the documentation of this file.
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 "ReturnMappingModel.h"
11 
13 #include "Conversion.h"
14 
15 template <>
16 InputParameters
18 {
19  InputParameters params = validParams<ConstitutiveModel>();
21  params.addParam<Real>("max_inelastic_increment",
22  1e-4,
23  "The maximum inelastic strain increment allowed in a time step");
24  params.addParam<bool>("compute_material_timestep_limit",
25  false,
26  "Whether to compute the matl_timestep_limit material property");
27  return params;
28 }
29 
30 ReturnMappingModel::ReturnMappingModel(const InputParameters & parameters,
31  const std::string inelastic_strain_name)
32  : ConstitutiveModel(parameters),
34  _effective_strain_increment(0),
35  _effective_inelastic_strain(
36  declareProperty<Real>("effective_" + inelastic_strain_name + "_strain")),
37  _effective_inelastic_strain_old(
38  getMaterialPropertyOld<Real>("effective_" + inelastic_strain_name + "_strain")),
39  _max_inelastic_increment(parameters.get<Real>("max_inelastic_increment")),
40  _compute_matl_timestep_limit(getParam<bool>("compute_material_timestep_limit")),
41  _matl_timestep_limit(
42  _compute_matl_timestep_limit ? &declareProperty<Real>("matl_timestep_limit") : NULL)
43 {
44 }
45 
46 void
48 {
49  _effective_inelastic_strain[_qp] = 0.0;
50 }
51 
52 void
53 ReturnMappingModel::computeStress(const Elem & current_elem,
54  const SymmElasticityTensor & elasticityTensor,
55  const SymmTensor & stress_old,
56  SymmTensor & strain_increment,
57  SymmTensor & stress_new)
58 {
59  // Given the stretching, compute the stress increment and add it to the old stress. Also update
60  // the creep strain
61  // stress = stressOld + stressIncrement
62  if (_t_step == 0 && !_app.isRestarting())
63  {
65  (*_matl_timestep_limit)[_qp] = std::numeric_limits<Real>::max();
66  return;
67  }
68 
69  stress_new = elasticityTensor * strain_increment;
70  stress_new += stress_old;
71 
72  SymmTensor inelastic_strain_increment;
73  computeStress(current_elem,
74  elasticityTensor,
75  stress_old,
76  strain_increment,
77  stress_new,
78  inelastic_strain_increment);
79 }
80 
81 void
82 ReturnMappingModel::computeStress(const Elem & /*current_elem*/,
83  const SymmElasticityTensor & elasticityTensor,
84  const SymmTensor & stress_old,
85  SymmTensor & strain_increment,
86  SymmTensor & stress_new,
87  SymmTensor & inelastic_strain_increment)
88 {
89  // compute deviatoric trial stress
90  SymmTensor dev_trial_stress(stress_new);
91  dev_trial_stress.addDiag(-dev_trial_stress.trace() / 3.0);
92 
93  // compute effective trial stress
94  Real dts_squared = dev_trial_stress.doubleContraction(dev_trial_stress);
95  Real effective_trial_stress = std::sqrt(1.5 * dts_squared);
96 
97  // compute effective strain increment
98  SymmTensor dev_strain_increment(strain_increment);
99  dev_strain_increment.addDiag(-strain_increment.trace() / 3.0);
100  _effective_strain_increment = dev_strain_increment.doubleContraction(dev_strain_increment);
102 
103  const SymmIsotropicElasticityTensor * iso_e_t =
104  dynamic_cast<const SymmIsotropicElasticityTensor *>(&elasticityTensor);
105  if (!iso_e_t)
106  mooseError("Models derived from ReturnMappingModel require a SymmIsotropicElasticityTensor");
107  _three_shear_modulus = 3.0 * iso_e_t->shearModulus();
108 
109  computeStressInitialize(effective_trial_stress, elasticityTensor);
110 
111  Real scalar;
112  returnMappingSolve(effective_trial_stress, scalar, _console);
113 
114  // compute inelastic and elastic strain increments
115  if (scalar != 0.0)
116  inelastic_strain_increment = dev_trial_stress * (1.5 * scalar / effective_trial_stress);
117  else
118  inelastic_strain_increment = 0.0;
119 
120  strain_increment -= inelastic_strain_increment;
122 
123  // compute stress increment
124  stress_new = elasticityTensor * strain_increment;
125 
126  // update stress
127  stress_new += stress_old;
128 
129  computeStressFinalize(inelastic_strain_increment);
131  (*_matl_timestep_limit)[_qp] = computeTimeStepLimit();
132 }
133 
134 Real
135 ReturnMappingModel::computeReferenceResidual(const Real effective_trial_stress, const Real scalar)
136 {
137  return effective_trial_stress / _three_shear_modulus - scalar;
138 }
139 
140 Real
142 {
143  Real scalar_inelastic_strain_incr;
144 
145  scalar_inelastic_strain_incr =
147  if (MooseUtils::absoluteFuzzyEqual(scalar_inelastic_strain_incr, 0.0))
148  return std::numeric_limits<Real>::max();
149 
150  return _dt * _max_inelastic_increment / scalar_inelastic_strain_incr;
151 }
152 
153 void
154 ReturnMappingModel::outputIterationSummary(std::stringstream * iter_output,
155  const unsigned int total_it)
156 {
157  if (iter_output)
158  {
159  *iter_output << "At element " << _current_elem->id() << " _qp=" << _qp << " Coordinates "
160  << _q_point[_qp] << " block=" << _current_elem->subdomain_id() << '\n';
161  }
163 }
SymmTensor::trace
Real trace() const
Definition: SymmTensor.h:97
validParams< ReturnMappingModel >
InputParameters validParams< ReturnMappingModel >()
Definition: ReturnMappingModel.C:17
SymmIsotropicElasticityTensor
Defines an Isotropic Elasticity Tensor.
Definition: SymmIsotropicElasticityTensor.h:33
ReturnMappingModel::_effective_strain_increment
Real _effective_strain_increment
Definition: ReturnMappingModel.h:92
SingleVariableReturnMappingSolution::outputIterationSummary
virtual void outputIterationSummary(std::stringstream *iter_output, const unsigned int total_it)
Output summary information for the convergence history of the model.
Definition: SingleVariableReturnMappingSolution.C:347
ConstitutiveModel
Definition: ConstitutiveModel.h:22
ReturnMappingModel::_effective_inelastic_strain_old
const MaterialProperty< Real > & _effective_inelastic_strain_old
Definition: ReturnMappingModel.h:98
ReturnMappingModel::_compute_matl_timestep_limit
const bool _compute_matl_timestep_limit
Definition: ReturnMappingModel.h:100
SymmIsotropicElasticityTensor.h
SymmTensor::doubleContraction
Real doubleContraction(const SymmTensor &rhs) const
Definition: SymmTensor.h:259
SymmElasticityTensor
This class defines a basic set of capabilities any elasticity tensor should have.
Definition: SymmElasticityTensor.h:55
ReturnMappingModel::computeStressFinalize
virtual void computeStressFinalize(const SymmTensor &)
Perform any necessary steps to finalize state after return mapping iterations.
Definition: ReturnMappingModel.h:90
ReturnMappingModel::computeStressInitialize
virtual void computeStressInitialize(Real, const SymmElasticityTensor &)
Perform any necessary initialization before return mapping iterations.
Definition: ReturnMappingModel.h:81
ReturnMappingModel::computeReferenceResidual
virtual Real computeReferenceResidual(const Real effective_trial_stress, const Real scalar) override
Compute a reference quantity to be used for checking relative convergence.
Definition: ReturnMappingModel.C:135
ReturnMappingModel::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ReturnMappingModel.C:47
SymmTensor::addDiag
void addDiag(Real value)
Definition: SymmTensor.h:281
SingleVariableReturnMappingSolution::returnMappingSolve
void returnMappingSolve(const Real effective_trial_stress, Real &scalar, const ConsoleStream &console)
Perform the return mapping iterations.
Definition: SingleVariableReturnMappingSolution.C:96
ReturnMappingModel::outputIterationSummary
void outputIterationSummary(std::stringstream *iter_output, const unsigned int total_it) override
Output summary information for the convergence history of the model.
Definition: ReturnMappingModel.C:154
ReturnMappingModel::computeStress
virtual void computeStress(const Elem &current_elem, const SymmElasticityTensor &elasticityTensor, const SymmTensor &stress_old, SymmTensor &strain_increment, SymmTensor &stress_new) override
Definition: ReturnMappingModel.C:53
ReturnMappingModel::ReturnMappingModel
ReturnMappingModel(const InputParameters &parameters, const std::string inelastic_strain_name="")
Definition: ReturnMappingModel.C:30
ReturnMappingModel::_max_inelastic_increment
Real _max_inelastic_increment
Definition: ReturnMappingModel.h:99
SymmTensor
Definition: SymmTensor.h:21
validParams< SingleVariableReturnMappingSolution >
InputParameters validParams< SingleVariableReturnMappingSolution >()
ReturnMappingModel::_effective_inelastic_strain
MaterialProperty< Real > & _effective_inelastic_strain
Definition: ReturnMappingModel.h:97
SingleVariableReturnMappingSolution
Base class that provides capability for Newton return mapping iterations on a single variable.
Definition: SingleVariableReturnMappingSolution.h:24
ReturnMappingModel::computeTimeStepLimit
Real computeTimeStepLimit()
Compute the limiting value of the time step for this material.
Definition: ReturnMappingModel.C:141
ReturnMappingModel.h
SymmIsotropicElasticityTensor::shearModulus
Real shearModulus() const
Return the shear modulus...
Definition: SymmIsotropicElasticityTensor.C:69
validParams< ConstitutiveModel >
InputParameters validParams< ConstitutiveModel >()
Definition: ConstitutiveModel.C:16
ReturnMappingModel::_three_shear_modulus
Real _three_shear_modulus
3 * shear modulus
Definition: ReturnMappingModel.h:95