www.mooseframework.org
CombinedCreepPlasticity.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 "ReturnMappingModel.h"
14 
15 registerMooseObject("SolidMechanicsApp", CombinedCreepPlasticity);
16 
17 template <>
18 InputParameters
20 {
21  InputParameters params = validParams<ConstitutiveModel>();
22 
23  params.addRequiredParam<std::vector<std::string>>("submodels",
24  "List of submodel ConstitutiveModels");
25 
26  params.addParam<unsigned int>("max_its", 30, "Maximum number of submodel iterations");
27  params.addParam<bool>("internal_solve_full_iteration_history",
28  false,
29  "Set true to output submodel iteration information");
30  params.addParam<Real>(
31  "relative_tolerance", 1e-5, "Relative convergence tolerance for combined submodel iteration");
32  params.addParam<Real>(
33  "absolute_tolerance", 1e-5, "Absolute convergence tolerance for combined submodel iteration");
34  params.addClassDescription("Models creep and instantaneous plasticity deformation");
35 
36  return params;
37 }
38 
39 CombinedCreepPlasticity::CombinedCreepPlasticity(const InputParameters & parameters)
40  : ConstitutiveModel(parameters),
41  _submodels(),
42  _max_its(parameters.get<unsigned int>("max_its")),
43  _internal_solve_full_iteration_history(getParam<bool>("internal_solve_full_iteration_history")),
44  _relative_tolerance(parameters.get<Real>("relative_tolerance")),
45  _absolute_tolerance(parameters.get<Real>("absolute_tolerance")),
46  _matl_timestep_limit(declareProperty<Real>("matl_timestep_limit"))
47 {
48 }
49 
50 void
52 {
53  std::vector<SubdomainID> block_id =
54  std::vector<SubdomainID>(blockIDs().begin(), blockIDs().end());
55  const std::vector<std::string> & submodels = getParam<std::vector<std::string>>("submodels");
56  for (unsigned i(0); i < block_id.size(); ++i)
57  {
58  std::string suffix;
59  std::vector<MooseSharedPointer<MaterialBase>> const * mats_p;
60  if (_bnd)
61  {
62  mats_p = &_fe_problem.getMaterialWarehouse()[Moose::FACE_MATERIAL_DATA].getActiveBlockObjects(
63  block_id[i], _tid);
64  suffix = "_face";
65  }
66  else
67  mats_p = &_fe_problem.getMaterialWarehouse().getActiveBlockObjects(block_id[i], _tid);
68 
69  const std::vector<MooseSharedPointer<MaterialBase>> & mats = *mats_p;
70  for (unsigned int i_name(0); i_name < submodels.size(); ++i_name)
71  {
72  bool found = false;
73  for (unsigned int j = 0; j < mats.size(); ++j)
74  {
75  MooseSharedPointer<ReturnMappingModel> rmm =
76  MooseSharedNamespace::dynamic_pointer_cast<ReturnMappingModel>(mats[j]);
77  if (rmm && rmm->name() == submodels[i_name] + suffix)
78  {
79  _submodels[block_id[i]].push_back(rmm);
80  found = true;
81  break;
82  }
83  }
84  if (!found)
85  {
86  mooseError("Unable to find submodel " + submodels[i_name]);
87  }
88  }
89  }
90 
91  ConstitutiveModel::initialSetup();
92 }
93 
94 void
95 CombinedCreepPlasticity::computeStress(const Elem & current_elem,
96  const SymmElasticityTensor & elasticityTensor,
97  const SymmTensor & stress_old,
98  SymmTensor & strain_increment,
99  SymmTensor & stress_new)
100 {
101  // Given the stretching, compute the stress increment and add it to the old stress. Also update
102  // the creep strain
103  // stress = stressOld + stressIncrement
104  // creep_strain = creep_strainOld + creep_strainIncrement
105 
106  if (_t_step == 0 && !_app.isRestarting())
107  {
108  _matl_timestep_limit[_qp] = std::numeric_limits<Real>::max();
109  return;
110  }
111 
113  {
114  _console << std::endl
115  << "iteration output for CombinedCreepPlasticity solve:"
116  << " time=" << _t << " temperature=" << _temperature[_qp] << " int_pt=" << _qp
117  << std::endl;
118  }
119 
120  // compute trial stress
121  stress_new = elasticityTensor * strain_increment;
122  stress_new += stress_old;
123 
124  const SubdomainID current_block = current_elem.subdomain_id();
125  const std::vector<MooseSharedPointer<ReturnMappingModel>> & rmm(_submodels[current_block]);
126  const unsigned num_submodels = rmm.size();
127 
128  SymmTensor inelastic_strain_increment;
129 
130  SymmTensor elastic_strain_increment;
131  SymmTensor stress_new_last(stress_new);
132  Real delS(_absolute_tolerance + 1);
133  Real first_delS(delS);
134  unsigned int counter(0);
135 
136  for (unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
137  rmm[i_rmm]->setQp(_qp);
138 
139  while (counter < _max_its && delS > _absolute_tolerance &&
140  (delS / first_delS) > _relative_tolerance && (num_submodels != 1 || counter < 1))
141  {
142  elastic_strain_increment = strain_increment;
143  stress_new = elasticityTensor * (elastic_strain_increment - inelastic_strain_increment);
144  stress_new += stress_old;
145 
146  for (unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
147  {
148  rmm[i_rmm]->computeStress(current_elem,
149  elasticityTensor,
150  stress_old,
151  elastic_strain_increment,
152  stress_new,
153  inelastic_strain_increment);
154  }
155 
156  // now check convergence
157  SymmTensor deltaS(stress_new_last - stress_new);
158  delS = std::sqrt(deltaS.doubleContraction(deltaS));
159  if (counter == 0)
160  {
161  first_delS = delS;
162  }
163  stress_new_last = stress_new;
164 
166  {
167  _console << "stress_it=" << counter
168  << " rel_delS=" << (0 == first_delS ? 0 : delS / first_delS)
169  << " rel_tol=" << _relative_tolerance << " abs_delS=" << delS
170  << " abs_tol=" << _absolute_tolerance << std::endl;
171  }
172 
173  ++counter;
174  }
175 
176  if (counter == _max_its && delS > _absolute_tolerance &&
177  (delS / first_delS) > _relative_tolerance)
178  {
179  mooseError("Max stress iteration hit during CombinedCreepPlasticity solve!");
180  }
181 
182  strain_increment = elastic_strain_increment;
183 
184  _matl_timestep_limit[_qp] = 0.0;
185  for (unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
186  _matl_timestep_limit[_qp] += 1.0 / rmm[i_rmm]->computeTimeStepLimit();
187 
188  if (MooseUtils::absoluteFuzzyEqual(_matl_timestep_limit[_qp], 0.0))
189  {
190  _matl_timestep_limit[_qp] = std::numeric_limits<Real>::max();
191  }
192  else
193  {
194  _matl_timestep_limit[_qp] = 1.0 / _matl_timestep_limit[_qp];
195  }
196 }
197 
198 bool
200  SymmTensor & strain_increment,
201  SymmTensor & d_strain_dT)
202 {
203  bool modified = false;
204  const SubdomainID current_block = current_elem.subdomain_id();
205  const std::vector<MooseSharedPointer<ReturnMappingModel>> & rmm(_submodels[current_block]);
206  const unsigned num_submodels = rmm.size();
207 
208  for (unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
209  {
210  rmm[i_rmm]->setQp(_qp);
211  modified |= rmm[i_rmm]->modifyStrainIncrement(current_elem, strain_increment, d_strain_dT);
212  }
213  return modified;
214 }
CombinedCreepPlasticity::_relative_tolerance
Real _relative_tolerance
Definition: CombinedCreepPlasticity.h:49
ConstitutiveModel
Definition: ConstitutiveModel.h:22
CombinedCreepPlasticity::computeStress
virtual void computeStress(const Elem &current_elem, const SymmElasticityTensor &elasticityTensor, const SymmTensor &stress_old, SymmTensor &strain_increment, SymmTensor &stress_new)
Compute the stress (sigma += deltaSigma)
Definition: CombinedCreepPlasticity.C:95
SymmIsotropicElasticityTensor.h
counter
static unsigned int counter
Definition: ContactPenetrationAuxAction.C:17
CombinedCreepPlasticity::_internal_solve_full_iteration_history
bool _internal_solve_full_iteration_history
Definition: CombinedCreepPlasticity.h:48
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
validParams< CombinedCreepPlasticity >
InputParameters validParams< CombinedCreepPlasticity >()
Definition: CombinedCreepPlasticity.C:19
CombinedCreepPlasticity::CombinedCreepPlasticity
CombinedCreepPlasticity(const InputParameters &parameters)
Definition: CombinedCreepPlasticity.C:39
SymmTensor
Definition: SymmTensor.h:21
CombinedCreepPlasticity
One or more constitutive models coupled together.
Definition: CombinedCreepPlasticity.h:25
CombinedCreepPlasticity::_max_its
unsigned int _max_its
Definition: CombinedCreepPlasticity.h:47
CombinedCreepPlasticity::_matl_timestep_limit
MaterialProperty< Real > & _matl_timestep_limit
Definition: CombinedCreepPlasticity.h:51
CombinedCreepPlasticity::_submodels
std::map< SubdomainID, std::vector< MooseSharedPointer< ReturnMappingModel > > > _submodels
Definition: CombinedCreepPlasticity.h:45
ConstitutiveModel::_temperature
const VariableValue & _temperature
Definition: ConstitutiveModel.h:50
CombinedCreepPlasticity::_absolute_tolerance
Real _absolute_tolerance
Definition: CombinedCreepPlasticity.h:50
CombinedCreepPlasticity.h
registerMooseObject
registerMooseObject("SolidMechanicsApp", CombinedCreepPlasticity)
ReturnMappingModel.h
ConstitutiveModel::setQp
void setQp(unsigned int qp)
Sets the value of the variable _qp for inheriting classes.
Definition: ConstitutiveModel.C:89
CombinedCreepPlasticity::modifyStrainIncrement
virtual bool modifyStrainIncrement(const Elem &current_elem, SymmTensor &strain_increment, SymmTensor &d_strain_dT)
Definition: CombinedCreepPlasticity.C:199
CombinedCreepPlasticity::initialSetup
virtual void initialSetup()
Definition: CombinedCreepPlasticity.C:51
validParams< ConstitutiveModel >
InputParameters validParams< ConstitutiveModel >()
Definition: ConstitutiveModel.C:16