23 params.addRequiredParam<std::vector<std::string>>(
"submodels",
24 "List of submodel ConstitutiveModels");
26 params.addParam<
unsigned int>(
"max_its", 30,
"Maximum number of submodel iterations");
27 params.addParam<
bool>(
"internal_solve_full_iteration_history",
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");
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"))
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)
59 std::vector<MooseSharedPointer<MaterialBase>>
const * mats_p;
62 mats_p = &_fe_problem.getMaterialWarehouse()[Moose::FACE_MATERIAL_DATA].getActiveBlockObjects(
67 mats_p = &_fe_problem.getMaterialWarehouse().getActiveBlockObjects(block_id[i], _tid);
69 const std::vector<MooseSharedPointer<MaterialBase>> & mats = *mats_p;
70 for (
unsigned int i_name(0); i_name < submodels.size(); ++i_name)
73 for (
unsigned int j = 0; j < mats.size(); ++j)
75 MooseSharedPointer<ReturnMappingModel> rmm =
76 MooseSharedNamespace::dynamic_pointer_cast<ReturnMappingModel>(mats[j]);
77 if (rmm && rmm->name() == submodels[i_name] + suffix)
86 mooseError(
"Unable to find submodel " + submodels[i_name]);
91 ConstitutiveModel::initialSetup();
106 if (_t_step == 0 && !_app.isRestarting())
114 _console << std::endl
115 <<
"iteration output for CombinedCreepPlasticity solve:"
116 <<
" time=" << _t <<
" temperature=" <<
_temperature[_qp] <<
" int_pt=" << _qp
121 stress_new = elasticityTensor * strain_increment;
122 stress_new += stress_old;
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();
133 Real first_delS(delS);
136 for (
unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
137 rmm[i_rmm]->
setQp(_qp);
142 elastic_strain_increment = strain_increment;
143 stress_new = elasticityTensor * (elastic_strain_increment - inelastic_strain_increment);
144 stress_new += stress_old;
146 for (
unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
148 rmm[i_rmm]->computeStress(current_elem,
151 elastic_strain_increment,
153 inelastic_strain_increment);
157 SymmTensor deltaS(stress_new_last - stress_new);
163 stress_new_last = stress_new;
167 _console <<
"stress_it=" <<
counter
168 <<
" rel_delS=" << (0 == first_delS ? 0 : delS / first_delS)
179 mooseError(
"Max stress iteration hit during CombinedCreepPlasticity solve!");
182 strain_increment = elastic_strain_increment;
185 for (
unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
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();
208 for (
unsigned i_rmm(0); i_rmm < num_submodels; ++i_rmm)
210 rmm[i_rmm]->setQp(_qp);
211 modified |= rmm[i_rmm]->modifyStrainIncrement(current_elem, strain_increment, d_strain_dT);