www.mooseframework.org
ComputeMultipleInelasticStress.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 
11 
12 #include "StressUpdateBase.h"
13 #include "MooseException.h"
14 #include "DamageBase.h"
15 
17 
19 
20 InputParameters
22 {
23  InputParameters params = ComputeFiniteStrainElasticStress::validParams();
24  params.addClassDescription("Compute state (stress and internal parameters such as plastic "
25  "strains and internal parameters) using an iterative process. "
26  "Combinations of creep models and plastic models may be used.");
27  params.addParam<unsigned int>("max_iterations",
28  30,
29  "Maximum number of the stress update "
30  "iterations over the stress change after all "
31  "update materials are called");
32  params.addParam<Real>("relative_tolerance",
33  1e-5,
34  "Relative convergence tolerance for the stress "
35  "update iterations over the stress change "
36  "after all update materials are called");
37  params.addParam<Real>("absolute_tolerance",
38  1e-5,
39  "Absolute convergence tolerance for the stress "
40  "update iterations over the stress change "
41  "after all update materials are called");
42  params.addParam<bool>(
43  "internal_solve_full_iteration_history",
44  false,
45  "Set to true to output stress update iteration information over the stress change");
46  params.addParam<bool>("perform_finite_strain_rotations",
47  true,
48  "Tensors are correctly rotated in "
49  "finite-strain simulations. For "
50  "optimal performance you can set "
51  "this to 'false' if you are only "
52  "ever using small strains");
53  MooseEnum tangent_operator("elastic nonlinear", "nonlinear");
54  params.addParam<MooseEnum>(
55  "tangent_operator",
56  tangent_operator,
57  "Type of tangent operator to return. 'elastic': return the "
58  "elasticity tensor. 'nonlinear': return the full, general consistent tangent "
59  "operator.");
60  params.addRequiredParam<std::vector<MaterialName>>(
61  "inelastic_models",
62  "The material objects to use to calculate stress and inelastic strains. "
63  "Note: specify creep models first and plasticity models second.");
64  params.addParam<std::vector<Real>>("combined_inelastic_strain_weights",
65  "The combined_inelastic_strain Material Property is a "
66  "weighted sum of the model inelastic strains. This parameter "
67  "is a vector of weights, of the same length as "
68  "inelastic_models. Default = '1 1 ... 1'. This "
69  "parameter is set to 1 if the number of models = 1");
70  params.addParam<bool>(
71  "cycle_models", false, "At timestep N use only inelastic model N % num_models.");
72  params.addParam<MaterialName>("damage_model", "Name of the damage model");
73 
74  return params;
75 }
76 
79  _max_iterations(parameters.get<unsigned int>("max_iterations")),
80  _relative_tolerance(parameters.get<Real>("relative_tolerance")),
81  _absolute_tolerance(parameters.get<Real>("absolute_tolerance")),
82  _internal_solve_full_iteration_history(getParam<bool>("internal_solve_full_iteration_history")),
83  _perform_finite_strain_rotations(getParam<bool>("perform_finite_strain_rotations")),
84  _elastic_strain_old(getMaterialPropertyOld<RankTwoTensor>(_base_name + "elastic_strain")),
85  _strain_increment(getMaterialProperty<RankTwoTensor>(_base_name + "strain_increment")),
86  _inelastic_strain(declareProperty<RankTwoTensor>(_base_name + "combined_inelastic_strain")),
87  _inelastic_strain_old(
88  getMaterialPropertyOld<RankTwoTensor>(_base_name + "combined_inelastic_strain")),
89  _tangent_operator_type(getParam<MooseEnum>("tangent_operator").getEnum<TangentOperatorEnum>()),
90  _num_models(getParam<std::vector<MaterialName>>("inelastic_models").size()),
91  _tangent_computation_flag(_num_models, false),
92  _tangent_calculation_method(TangentCalculationMethod::ELASTIC),
93  _inelastic_weights(isParamValid("combined_inelastic_strain_weights")
94  ? getParam<std::vector<Real>>("combined_inelastic_strain_weights")
95  : std::vector<Real>(_num_models, true)),
96  _consistent_tangent_operator(_num_models),
97  _cycle_models(getParam<bool>("cycle_models")),
98  _matl_timestep_limit(declareProperty<Real>("matl_timestep_limit")),
99  _identity_symmetric_four(RankFourTensor::initIdentitySymmetricFour),
100  _all_models_isotropic(true),
101  _damage_model(isParamValid("damage_model")
102  ? dynamic_cast<DamageBase *>(&getMaterial("damage_model"))
103  : nullptr)
104 {
105  if (_inelastic_weights.size() != _num_models)
106  mooseError(
107  "ComputeMultipleInelasticStress: combined_inelastic_strain_weights must contain the same "
108  "number of entries as inelastic_models ",
109  _inelastic_weights.size(),
110  " ",
111  _num_models);
112 }
113 
114 void
116 {
118  _inelastic_strain[_qp].zero();
119 }
120 
121 void
123 {
126 
127  std::vector<MaterialName> models = getParam<std::vector<MaterialName>>("inelastic_models");
128 
129  for (unsigned int i = 0; i < _num_models; ++i)
130  {
131  StressUpdateBase * rrr = dynamic_cast<StressUpdateBase *>(&getMaterialByName(models[i]));
132 
133  if (rrr)
134  {
135  _models.push_back(rrr);
138  mooseError("Model " + models[i] +
139  " requires an isotropic elasticity tensor, but the one supplied is not "
140  "guaranteed isotropic");
141  }
142  else
143  mooseError("Model " + models[i] + " is not compatible with ComputeMultipleInelasticStress");
144  }
145 
146  // Check if tangent calculation methods are consistent. If all models have
147  // TangentOperatorEnum::ELASTIC or tangent_operator is set by the user as elasic, then the tangent
148  // is never calculated: J_tot = C. If PARTIAL and NONE models are present, utilize PARTIAL
149  // formulation: J_tot = (I + J_1 + ... J_N)^-1 C. If FULL and NONE models are present, utilize
150  // FULL formulation: J_tot = J_1 * C^-1 * J_2 * C^-1 * ... J_N * C. If PARTIAL and FULL models are
151  // present, error out.
152 
154  {
155  bool full_present = false;
156  bool partial_present = false;
157  for (unsigned int i = 0; i < _num_models; ++i)
158  {
159  if (_models[i]->getTangentCalculationMethod() == TangentCalculationMethod::FULL)
160  {
161  full_present = true;
162  _tangent_computation_flag[i] = true;
164  }
165  else if (_models[i]->getTangentCalculationMethod() == TangentCalculationMethod::PARTIAL)
166  {
167  partial_present = true;
168  _tangent_computation_flag[i] = true;
170  }
171  }
172  if (full_present && partial_present)
173  mooseError("In ",
174  _name,
175  ": Models that calculate the full tangent operator and the partial tangent "
176  "operator are being combined. Either set tangent_operator to elastic, implement "
177  "the corrent tangent formulations, or use different models.");
178  }
179 
180  if (isParamValid("damage_model") && !_damage_model)
181  paramError("damage_model",
182  "Damage Model " + _damage_model->name() +
183  " is not compatible with ComputeMultipleInelasticStress");
184 }
185 
186 void
188 {
189  if (_damage_model)
190  {
192  _damage_model->setQp(_qp);
194  }
196 
197  if (_damage_model)
198  {
199  _damage_model->setQp(_qp);
204 
205  const Real damage_timestep_limit = _damage_model->computeTimeStepLimit();
206  if (_matl_timestep_limit[_qp] > damage_timestep_limit)
207  _matl_timestep_limit[_qp] = damage_timestep_limit;
208  }
209 
212 }
213 
214 void
216 {
217  RankTwoTensor elastic_strain_increment;
218  RankTwoTensor combined_inelastic_strain_increment;
219 
220  if (_num_models == 0)
221  {
223 
224  // If the elasticity tensor values have changed and the tensor is isotropic,
225  // use the old strain to calculate the old stress
228  else
229  {
230  if (_damage_model)
232  else
233  _stress[_qp] = _stress_old[_qp] + _elasticity_tensor[_qp] * _strain_increment[_qp];
234  }
235  if (_fe_problem.currentlyComputingJacobian())
237 
238  _matl_timestep_limit[_qp] = std::numeric_limits<Real>::max();
239  }
240  else
241  {
242  if (_num_models == 1 || _cycle_models)
243  updateQpStateSingleModel((_t_step - 1) % _num_models,
244  elastic_strain_increment,
245  combined_inelastic_strain_increment);
246  else
247  updateQpState(elastic_strain_increment, combined_inelastic_strain_increment);
248 
249  _elastic_strain[_qp] = _elastic_strain_old[_qp] + elastic_strain_increment;
250  _inelastic_strain[_qp] = _inelastic_strain_old[_qp] + combined_inelastic_strain_increment;
251  }
252 }
253 
254 void
255 ComputeMultipleInelasticStress::finiteStrainRotation(const bool force_elasticity_rotation)
256 {
257  _elastic_strain[_qp] =
258  _rotation_increment[_qp] * _elastic_strain[_qp] * _rotation_increment[_qp].transpose();
259  _stress[_qp] = _rotation_increment[_qp] * _stress[_qp] * _rotation_increment[_qp].transpose();
260  _inelastic_strain[_qp] =
261  _rotation_increment[_qp] * _inelastic_strain[_qp] * _rotation_increment[_qp].transpose();
262 
263  if (force_elasticity_rotation ||
267  _Jacobian_mult[_qp].rotate(_rotation_increment[_qp]);
268 }
269 
270 void
272  RankTwoTensor & combined_inelastic_strain_increment)
273 {
275  {
276  _console << std::endl
277  << "iteration output for ComputeMultipleInelasticStress solve:"
278  << " time=" << _t << " int_pt=" << _qp << std::endl;
279  }
280  Real l2norm_delta_stress;
281  Real first_l2norm_delta_stress = 1.0;
282  unsigned int counter = 0;
283 
284  std::vector<RankTwoTensor> inelastic_strain_increment;
285  inelastic_strain_increment.resize(_num_models);
286 
287  for (unsigned i_rmm = 0; i_rmm < _models.size(); ++i_rmm)
288  inelastic_strain_increment[i_rmm].zero();
289 
290  RankTwoTensor stress_max, stress_min;
291 
292  do
293  {
294  for (unsigned i_rmm = 0; i_rmm < _num_models; ++i_rmm)
295  {
296  _models[i_rmm]->setQp(_qp);
297 
298  // initially assume the strain is completely elastic
299  elastic_strain_increment = _strain_increment[_qp];
300  // and subtract off all inelastic strain increments calculated so far
301  // except the one that we're about to calculate
302  for (unsigned j_rmm = 0; j_rmm < _num_models; ++j_rmm)
303  if (i_rmm != j_rmm)
304  elastic_strain_increment -= inelastic_strain_increment[j_rmm];
305 
306  // form the trial stress, with the check for changed elasticity constants
308  _stress[_qp] =
309  _elasticity_tensor[_qp] * (_elastic_strain_old[_qp] + elastic_strain_increment);
310  else
311  {
312  if (_damage_model)
313  _stress[_qp] = _undamaged_stress_old + _elasticity_tensor[_qp] * elastic_strain_increment;
314  else
315  _stress[_qp] = _stress_old[_qp] + _elasticity_tensor[_qp] * elastic_strain_increment;
316  }
317 
318  // given a trial stress (_stress[_qp]) and a strain increment (elastic_strain_increment)
319  // let the i^th model produce an admissible stress (as _stress[_qp]), and decompose
320  // the strain increment into an elastic part (elastic_strain_increment) and an
321  // inelastic part (inelastic_strain_increment[i_rmm])
323  elastic_strain_increment,
324  inelastic_strain_increment[i_rmm],
326 
327  if (i_rmm == 0)
328  {
329  stress_max = _stress[_qp];
330  stress_min = _stress[_qp];
331  }
332  else
333  {
334  for (unsigned int i = 0; i < LIBMESH_DIM; ++i)
335  {
336  for (unsigned int j = 0; j < LIBMESH_DIM; ++j)
337  {
338  if (_stress[_qp](i, j) > stress_max(i, j))
339  stress_max(i, j) = _stress[_qp](i, j);
340  else if (stress_min(i, j) > _stress[_qp](i, j))
341  stress_min(i, j) = _stress[_qp](i, j);
342  }
343  }
344  }
345  }
346 
347  // now check convergence in the stress:
348  // once the change in stress is within tolerance after each recompute material
349  // consider the stress to be converged
350  l2norm_delta_stress = (stress_max - stress_min).L2norm();
351  if (counter == 0 && l2norm_delta_stress > 0.0)
352  first_l2norm_delta_stress = l2norm_delta_stress;
353 
355  {
356  _console << "stress iteration number = " << counter << "\n"
357  << " relative l2 norm delta stress = "
358  << (0 == first_l2norm_delta_stress ? 0
359  : l2norm_delta_stress / first_l2norm_delta_stress)
360  << "\n"
361  << " stress convergence relative tolerance = " << _relative_tolerance << "\n"
362  << " absolute l2 norm delta stress = " << l2norm_delta_stress << "\n"
363  << " stress convergence absolute tolerance = " << _absolute_tolerance << std::endl;
364  }
365  ++counter;
366  } while (counter < _max_iterations && l2norm_delta_stress > _absolute_tolerance &&
367  (l2norm_delta_stress / first_l2norm_delta_stress) > _relative_tolerance &&
368  _num_models != 1);
369 
370  if (counter == _max_iterations && l2norm_delta_stress > _absolute_tolerance &&
371  (l2norm_delta_stress / first_l2norm_delta_stress) > _relative_tolerance)
372  throw MooseException("Max stress iteration hit during ComputeMultipleInelasticStress solve!");
373 
374  combined_inelastic_strain_increment.zero();
375  for (unsigned i_rmm = 0; i_rmm < _num_models; ++i_rmm)
376  combined_inelastic_strain_increment +=
377  _inelastic_weights[i_rmm] * inelastic_strain_increment[i_rmm];
378 
379  if (_fe_problem.currentlyComputingJacobian())
381 
382  _matl_timestep_limit[_qp] = 0.0;
383  for (unsigned i_rmm = 0; i_rmm < _num_models; ++i_rmm)
384  _matl_timestep_limit[_qp] += 1.0 / _models[i_rmm]->computeTimeStepLimit();
385 
386  if (MooseUtils::absoluteFuzzyEqual(_matl_timestep_limit[_qp], 0.0))
387  _matl_timestep_limit[_qp] = std::numeric_limits<Real>::max();
388  else
389  _matl_timestep_limit[_qp] = 1.0 / _matl_timestep_limit[_qp];
390 }
391 
392 void
394 {
398  {
400  for (unsigned i_rmm = 0; i_rmm < _num_models; ++i_rmm)
401  A += _consistent_tangent_operator[i_rmm];
402  mooseAssert(A.isSymmetric(), "Tangent operator isn't symmetric");
403  _Jacobian_mult[_qp] = A.invSymm() * _elasticity_tensor[_qp];
404  }
405  else
406  {
407  const RankFourTensor E_inv = _elasticity_tensor[_qp].invSymm();
409  for (unsigned i_rmm = 1; i_rmm < _num_models; ++i_rmm)
410  _Jacobian_mult[_qp] = _consistent_tangent_operator[i_rmm] * E_inv * _Jacobian_mult[_qp];
411  }
412 }
413 
414 void
416  unsigned model_number,
417  RankTwoTensor & elastic_strain_increment,
418  RankTwoTensor & combined_inelastic_strain_increment)
419 {
420  for (auto model : _models)
421  model->setQp(_qp);
422 
423  elastic_strain_increment = _strain_increment[_qp];
424 
425  // If the elasticity tensor values have changed and the tensor is isotropic,
426  // use the old strain to calculate the old stress
428  _stress[_qp] = _elasticity_tensor[_qp] * (_elastic_strain_old[_qp] + elastic_strain_increment);
429  else
430  {
431  if (_damage_model)
432  _stress[_qp] = _undamaged_stress_old + _elasticity_tensor[_qp] * elastic_strain_increment;
433  else
434  _stress[_qp] = _stress_old[_qp] + _elasticity_tensor[_qp] * elastic_strain_increment;
435  }
436 
437  computeAdmissibleState(model_number,
438  elastic_strain_increment,
439  combined_inelastic_strain_increment,
441 
442  if (_fe_problem.currentlyComputingJacobian())
443  {
447  {
449  mooseAssert(A.isSymmetric(), "Tangent operator isn't symmetric");
450  _Jacobian_mult[_qp] = A.invSymm() * _elasticity_tensor[_qp];
451  }
452  else
454  }
455 
456  _matl_timestep_limit[_qp] = _models[0]->computeTimeStepLimit();
457 
458  /* propagate internal variables, etc, to this timestep for those inelastic models where
459  * "updateState" is not called */
460  for (unsigned i_rmm = 0; i_rmm < _num_models; ++i_rmm)
461  if (i_rmm != model_number)
462  _models[i_rmm]->propagateQpStatefulProperties();
463 }
464 
465 void
467  RankTwoTensor & elastic_strain_increment,
468  RankTwoTensor & inelastic_strain_increment,
469  RankFourTensor & consistent_tangent_operator)
470 {
471  const bool jac = _fe_problem.currentlyComputingJacobian();
472  if (_damage_model)
473  _models[model_number]->updateState(elastic_strain_increment,
474  inelastic_strain_increment,
475  _rotation_increment[_qp],
476  _stress[_qp],
478  _elasticity_tensor[_qp],
479  _elastic_strain_old[_qp],
480  (jac && _tangent_computation_flag[model_number]),
481  consistent_tangent_operator);
482  else
483  _models[model_number]->updateState(elastic_strain_increment,
484  inelastic_strain_increment,
485  _rotation_increment[_qp],
486  _stress[_qp],
487  _stress_old[_qp],
488  _elasticity_tensor[_qp],
489  _elastic_strain_old[_qp],
490  (jac && _tangent_computation_flag[model_number]),
491  consistent_tangent_operator);
492 
493  if (jac && !_tangent_computation_flag[model_number])
494  {
496  consistent_tangent_operator.zero();
497  else
498  consistent_tangent_operator = _elasticity_tensor[_qp];
499  }
500 }
ComputeMultipleInelasticStress
ComputeMultipleInelasticStress computes the stress, the consistent tangent operator (or an approximat...
Definition: ComputeMultipleInelasticStress.h:38
ComputeFiniteStrainElasticStress::_elasticity_tensor
const MaterialProperty< RankFourTensor > & _elasticity_tensor
Elasticity tensor material property.
Definition: ComputeFiniteStrainElasticStress.h:39
ComputeMultipleInelasticStress::_inelastic_weights
const std::vector< Real > _inelastic_weights
_inelastic_strain = sum_i (_inelastic_weights_i * inelastic_strain_from_model_i)
Definition: ComputeMultipleInelasticStress.h:155
ComputeMultipleInelasticStress::_cycle_models
const bool _cycle_models
whether to cycle through the models, using only one model per timestep
Definition: ComputeMultipleInelasticStress.h:161
ComputeMultipleInelasticStress::_all_models_isotropic
bool _all_models_isotropic
are all inelastic models inherently isotropic? (not the case for e.g. weak plane plasticity models)
Definition: ComputeMultipleInelasticStress.h:183
ComputeFiniteStrainElasticStress
ComputeFiniteStrainElasticStress computes the stress following elasticity theory for finite strains.
Definition: ComputeFiniteStrainElasticStress.h:24
ComputeStressBase::_stress
MaterialProperty< RankTwoTensor > & _stress
Stress material property.
Definition: ComputeStressBase.h:50
ComputeMultipleInelasticStress::validParams
static InputParameters validParams()
Definition: ComputeMultipleInelasticStress.C:21
ComputeFiniteStrainElasticStress::_elasticity_tensor_name
const std::string _elasticity_tensor_name
Name of the elasticity tensor material property.
Definition: ComputeFiniteStrainElasticStress.h:37
ComputeMultipleInelasticStress::initialSetup
virtual void initialSetup() override
Definition: ComputeMultipleInelasticStress.C:122
TangentCalculationMethod::FULL
ComputeMultipleInelasticStress::_num_models
const unsigned _num_models
number of plastic models
Definition: ComputeMultipleInelasticStress.h:146
ComputeMultipleInelasticStress::computeQpStress
virtual void computeQpStress() override
Compute the stress and store it in the _stress material property for the current quadrature point.
Definition: ComputeMultipleInelasticStress.C:187
DamageBase::computeTimeStepLimit
virtual Real computeTimeStepLimit()
Compute the limiting value of the time step for this material.
Definition: DamageBase.C:51
ComputeMultipleInelasticStress::updateQpStateSingleModel
virtual void updateQpStateSingleModel(unsigned model_number, RankTwoTensor &elastic_strain_increment, RankTwoTensor &combined_inelastic_strain_increment)
An optimised version of updateQpState that gets used when the number of plastic models is unity,...
Definition: ComputeMultipleInelasticStress.C:415
ComputeStressBase::_Jacobian_mult
MaterialProperty< RankFourTensor > & _Jacobian_mult
derivative of stress w.r.t. strain (_dstress_dstrain)
Definition: ComputeStressBase.h:61
ComputeMultipleInelasticStress::_inelastic_strain_old
const MaterialProperty< RankTwoTensor > & _inelastic_strain_old
old value of inelastic strain
Definition: ComputeMultipleInelasticStress.h:140
TangentCalculationMethod::ELASTIC
ComputeFiniteStrainElasticStress::_rotation_increment
const MaterialProperty< RankTwoTensor > & _rotation_increment
Rotation increment material property.
Definition: ComputeFiniteStrainElasticStress.h:43
ComputeMultipleInelasticStress::_is_elasticity_tensor_guaranteed_isotropic
bool _is_elasticity_tensor_guaranteed_isotropic
is the elasticity tensor guaranteed to be isotropic?
Definition: ComputeMultipleInelasticStress.h:180
ComputeMultipleInelasticStress::_tangent_computation_flag
std::vector< bool > _tangent_computation_flag
Flags to compute tangent during updateState call.
Definition: ComputeMultipleInelasticStress.h:149
ComputeMultipleInelasticStress::_models
std::vector< StressUpdateBase * > _models
The user supplied list of inelastic models to use in the simulation.
Definition: ComputeMultipleInelasticStress.h:177
counter
static unsigned int counter
Definition: ContactPenetrationAuxAction.C:17
ComputeMultipleInelasticStress::_perform_finite_strain_rotations
const bool _perform_finite_strain_rotations
after updateQpState, rotate the stress, elastic_strain, inelastic_strain and Jacobian_mult using _rot...
Definition: ComputeMultipleInelasticStress.h:129
ComputeMultipleInelasticStress::TangentOperatorEnum::elastic
ComputeMultipleInelasticStress::_elastic_strain_old
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
Strain tensors.
Definition: ComputeMultipleInelasticStress.h:132
DamageBase::updateStressForDamage
virtual void updateStressForDamage(RankTwoTensor &stress_new)=0
Update the current stress tensor for effects of damage.
ComputeMultipleInelasticStress::_undamaged_stress_old
RankTwoTensor _undamaged_stress_old
Definition: ComputeMultipleInelasticStress.h:188
ComputeMultipleInelasticStress::_internal_solve_full_iteration_history
const bool _internal_solve_full_iteration_history
Definition: ComputeMultipleInelasticStress.h:125
ComputeMultipleInelasticStress::_consistent_tangent_operator
std::vector< RankFourTensor > _consistent_tangent_operator
the consistent tangent operators computed by each plastic model
Definition: ComputeMultipleInelasticStress.h:158
ComputeMultipleInelasticStress::_inelastic_strain
MaterialProperty< RankTwoTensor > & _inelastic_strain
The sum of the inelastic strains that come from the plastic models.
Definition: ComputeMultipleInelasticStress.h:137
ComputeMultipleInelasticStress::_identity_symmetric_four
const RankFourTensor _identity_symmetric_four
Rank four symmetric identity tensor.
Definition: ComputeMultipleInelasticStress.h:168
ComputeMultipleInelasticStress::_strain_increment
const MaterialProperty< RankTwoTensor > & _strain_increment
Definition: ComputeMultipleInelasticStress.h:133
DamageBase
DamageBase is a base class for damage models, which modify the stress tensor computed by another mode...
Definition: DamageBase.h:28
ComputeMultipleInelasticStress::_damage_model
DamageBase * _damage_model
Pointer to the damage model.
Definition: ComputeMultipleInelasticStress.h:186
StressUpdateBase::isIsotropic
virtual bool isIsotropic()
Is the implmented model isotropic? The safe default is 'false'.
Definition: StressUpdateBase.h:112
ComputeStressBase::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ComputeStressBase.C:43
ComputeMultipleInelasticStress::_absolute_tolerance
const Real _absolute_tolerance
Definition: ComputeMultipleInelasticStress.h:124
ComputeMultipleInelasticStress::finiteStrainRotation
virtual void finiteStrainRotation(const bool force_elasticity_rotation=false)
Rotate _elastic_strain, _stress, _inelastic_strain, and _Jacobian_mult to the new configuration.
Definition: ComputeMultipleInelasticStress.C:255
ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration
virtual void computeQpStressIntermediateConfiguration()
Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration ...
Definition: ComputeMultipleInelasticStress.C:215
DamageBase.h
ComputeFiniteStrainElasticStress::_stress_old
const MaterialProperty< RankTwoTensor > & _stress_old
Old state of the stress tensor material property.
Definition: ComputeFiniteStrainElasticStress.h:45
defineLegacyParams
defineLegacyParams(ComputeMultipleInelasticStress)
ComputeMultipleInelasticStress::updateQpState
virtual void updateQpState(RankTwoTensor &elastic_strain_increment, RankTwoTensor &combined_inelastic_strain_increment)
Given the _strain_increment[_qp], iterate over all of the user-specified recompute materials in order...
Definition: ComputeMultipleInelasticStress.C:271
registerMooseObject
registerMooseObject("TensorMechanicsApp", ComputeMultipleInelasticStress)
DamageBase::computeUndamagedOldStress
virtual void computeUndamagedOldStress(RankTwoTensor &stress_old)=0
ComputeStressBase::_elastic_strain
MaterialProperty< RankTwoTensor > & _elastic_strain
Elastic strain material property.
Definition: ComputeStressBase.h:52
ComputeMultipleInelasticStress::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ComputeMultipleInelasticStress.C:115
ComputeMultipleInelasticStress::computeAdmissibleState
virtual void computeAdmissibleState(unsigned model_number, RankTwoTensor &elastic_strain_increment, RankTwoTensor &inelastic_strain_increment, RankFourTensor &consistent_tangent_operator)
Given a trial stress (_stress[_qp]) and a strain increment (elastic_strain_increment) let the model_n...
Definition: ComputeMultipleInelasticStress.C:466
DamageBase::updateJacobianMultForDamage
virtual void updateJacobianMultForDamage(RankFourTensor &jacobian_mult)=0
Update the material constitutive matrix.
GuaranteeConsumer::hasGuaranteedMaterialProperty
bool hasGuaranteedMaterialProperty(const MaterialPropertyName &prop, Guarantee guarantee)
Definition: GuaranteeConsumer.C:28
ComputeMultipleInelasticStress::_matl_timestep_limit
MaterialProperty< Real > & _matl_timestep_limit
Definition: ComputeMultipleInelasticStress.h:163
RankFourTensorTempl< Real >
StressUpdateBase
StressUpdateBase is a material that is not called by MOOSE because of the compute=false flag set in t...
Definition: StressUpdateBase.h:52
ComputeMultipleInelasticStress::computeQpJacobianMult
virtual void computeQpJacobianMult()
Using _elasticity_tensor[_qp] and the consistent tangent operators, _consistent_tangent_operator[....
Definition: ComputeMultipleInelasticStress.C:393
ComputeMultipleInelasticStress.h
TangentCalculationMethod::PARTIAL
ComputeFiniteStrainElasticStress::validParams
static InputParameters validParams()
Definition: ComputeFiniteStrainElasticStress.C:17
ComputeMultipleInelasticStress::_tangent_calculation_method
TangentCalculationMethod _tangent_calculation_method
Calculation method for the tangent modulus.
Definition: ComputeMultipleInelasticStress.h:152
TangentCalculationMethod
TangentCalculationMethod
TangentCalculationMethod is an enum that determines the calculation method for the tangent operator.
Definition: StressUpdateBase.h:30
RankTwoTensorTempl< Real >
DamageBase::updateDamage
virtual void updateDamage()
Update the internal variable(s) that evolve the damage.
Definition: DamageBase.C:46
StressUpdateBase.h
ComputeMultipleInelasticStress::_tangent_operator_type
enum ComputeMultipleInelasticStress::TangentOperatorEnum _tangent_operator_type
DamageBase::finiteStrainRotation
virtual void finiteStrainRotation(const RankTwoTensor &rotation_increment)
Perform any necessary rotation of internal variables for finite strain.
Definition: DamageBase.C:57
ComputeMultipleInelasticStress::_max_iterations
const unsigned int _max_iterations
Input parameters associated with the recompute iteration to return the stress state to the yield surf...
Definition: ComputeMultipleInelasticStress.h:122
DamageBase::setQp
void setQp(unsigned int qp)
Sets the value of the member variable _qp for use in inheriting classes.
Definition: DamageBase.C:40
RankTwoScalarTools::L2norm
T L2norm(const RankTwoTensorTempl< T > &r2tensor)
Definition: RankTwoScalarTools.h:98
ComputeMultipleInelasticStress::TangentOperatorEnum
TangentOperatorEnum
what sort of Tangent operator to calculate
Definition: ComputeMultipleInelasticStress.h:143
ComputeMultipleInelasticStress::ComputeMultipleInelasticStress
ComputeMultipleInelasticStress(const InputParameters &parameters)
Definition: ComputeMultipleInelasticStress.C:77
StressUpdateBase::requiresIsotropicTensor
virtual bool requiresIsotropicTensor()=0
Does the model require the elasticity tensor to be isotropic?
ComputeMultipleInelasticStress::_relative_tolerance
const Real _relative_tolerance
Definition: ComputeMultipleInelasticStress.h:123
Guarantee::ISOTROPIC