Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process.
More...
#include <ADComputeMultiplePorousInelasticStress.h>
|
virtual void | initQpStatefulProperties () override |
|
virtual void | computeQpProperties () override |
|
virtual void | computeQpStress () override |
|
virtual void | computeQpStressIntermediateConfiguration () |
| Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration to the new configuration. More...
|
|
virtual void | finiteStrainRotation () |
| Rotate _elastic_strain, _stress, and _inelastic_strain to the new configuration. More...
|
|
virtual void | updateQpState (ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &combined_inelastic_strain_increment) |
| Given the _strain_increment[_qp], iterate over all of the user-specified recompute materials in order to find an admissible stress (which is placed into _stress[_qp]) and set of inelastic strains. More...
|
|
virtual void | updateQpStateSingleModel (unsigned model_number, ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &combined_inelastic_strain_increment) |
| An optimised version of updateQpState that gets used when the number of plastic models is unity, or when we're cycling through models Given the _strain_increment[_qp], find an admissible stress (which is put into _stress[_qp]) and inelastic strain. More...
|
|
virtual void | computeAdmissibleState (unsigned model_number, ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &inelastic_strain_increment) |
| Given a trial stress (_stress[_qp]) and a strain increment (elastic_strain_increment) let the model_number model produce an admissible stress (gets placed back in _stress[_qp]), and decompose the strain increment into an elastic part (gets placed back into elastic_strain_increment) and an inelastic part (inelastic_strain_increment). More...
|
|
| ADMaterialProperty (RankTwoTensor) &_inelastic_strain |
| The sum of the inelastic strains that come from the plastic models. More...
|
|
const | ADMaterialProperty (RankFourTensor) &_elasticity_tensor |
| Elasticity tensor material property. More...
|
|
bool | hasGuaranteedMaterialProperty (const MaterialPropertyName &prop, Guarantee guarantee) |
|
template<ComputeStage compute_stage>
class ADComputeMultiplePorousInelasticStress< compute_stage >
Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process.
A porosity material property is defined and is calcuated from the trace of inelastic strain increment.
Definition at line 15 of file ADComputeMultiplePorousInelasticStress.h.
◆ ADComputeMultiplePorousInelasticStress()
template<ComputeStage compute_stage>
◆ ADMaterialProperty() [1/3]
template<ComputeStage compute_stage>
Elasticity tensor material property.
◆ ADMaterialProperty() [2/3]
template<ComputeStage compute_stage>
The sum of the inelastic strains that come from the plastic models.
◆ ADMaterialProperty() [3/3]
template<ComputeStage compute_stage>
Material property for porosity.
◆ computeAdmissibleState()
template<ComputeStage compute_stage>
void ADComputeMultipleInelasticStress< compute_stage >::computeAdmissibleState |
( |
unsigned |
model_number, |
|
|
ADRankTwoTensor & |
elastic_strain_increment, |
|
|
ADRankTwoTensor & |
inelastic_strain_increment |
|
) |
| |
|
protectedvirtualinherited |
Given a trial stress (_stress[_qp]) and a strain increment (elastic_strain_increment) let the model_number model produce an admissible stress (gets placed back in _stress[_qp]), and decompose the strain increment into an elastic part (gets placed back into elastic_strain_increment) and an inelastic part (inelastic_strain_increment).
- Parameters
-
model_number | The inelastic model to use |
elastic_strain_increment | Upon input, this is the strain increment. Upon output, it is the elastic part of the strain increment |
inelastic_strain_increment | The inelastic strain increment corresponding to the supplied strain increment |
Definition at line 328 of file ADComputeMultipleInelasticStress.C.
333 _models[model_number]->updateState(elastic_strain_increment,
334 inelastic_strain_increment,
335 _rotation_increment[_qp],
338 _elasticity_tensor[_qp],
◆ computeQpProperties()
template<ComputeStage compute_stage>
◆ computeQpStress()
template<ComputeStage compute_stage>
|
overrideprotectedvirtualinherited |
◆ computeQpStressIntermediateConfiguration()
template<ComputeStage compute_stage>
|
protectedvirtualinherited |
Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration to the new configuration.
Definition at line 140 of file ADComputeMultipleInelasticStress.C.
142 ADRankTwoTensor elastic_strain_increment;
143 ADRankTwoTensor combined_inelastic_strain_increment;
152 _stress[_qp] = _elasticity_tensor[_qp] * (
_elastic_strain_old[_qp] + _strain_increment[_qp]);
154 _stress[_qp] =
_stress_old[_qp] + _elasticity_tensor[_qp] * _strain_increment[_qp];
160 elastic_strain_increment,
161 combined_inelastic_strain_increment);
163 updateQpState(elastic_strain_increment, combined_inelastic_strain_increment);
◆ finiteStrainRotation()
template<ComputeStage compute_stage>
|
protectedvirtualinherited |
Rotate _elastic_strain, _stress, and _inelastic_strain to the new configuration.
Definition at line 172 of file ADComputeMultipleInelasticStress.C.
174 _elastic_strain[_qp] =
175 _rotation_increment[_qp] * _elastic_strain[_qp] * _rotation_increment[_qp].transpose();
176 _stress[_qp] = _rotation_increment[_qp] * _stress[_qp] * _rotation_increment[_qp].transpose();
177 _inelastic_strain[_qp] =
178 _rotation_increment[_qp] * _inelastic_strain[_qp] * _rotation_increment[_qp].transpose();
◆ hasGuaranteedMaterialProperty()
bool GuaranteeConsumer::hasGuaranteedMaterialProperty |
( |
const MaterialPropertyName & |
prop, |
|
|
Guarantee |
guarantee |
|
) |
| |
|
protectedinherited |
◆ initialSetup()
template<ComputeStage compute_stage>
Definition at line 104 of file ADComputeMultipleInelasticStress.C.
109 std::vector<MaterialName> models = getParam<std::vector<MaterialName>>(
"inelastic_models");
114 &this->
template getMaterialByName<compute_stage>(models[i]));
120 mooseError(
"Model " + models[i] +
121 " requires an isotropic elasticity tensor, but the one supplied is not "
122 "guaranteed isotropic");
125 mooseError(
"Model " + models[i] +
" is not compatible with ADComputeMultipleInelasticStress");
◆ initQpStatefulProperties()
template<ComputeStage compute_stage>
◆ updateQpState()
template<ComputeStage compute_stage>
void ADComputeMultipleInelasticStress< compute_stage >::updateQpState |
( |
ADRankTwoTensor & |
elastic_strain_increment, |
|
|
ADRankTwoTensor & |
combined_inelastic_strain_increment |
|
) |
| |
|
protectedvirtualinherited |
Given the _strain_increment[_qp], iterate over all of the user-specified recompute materials in order to find an admissible stress (which is placed into _stress[_qp]) and set of inelastic strains.
- Parameters
-
elastic_strain_increment | The elastic part of _strain_increment[_qp] after the iterative process has converged |
combined_inelastic_strain_increment | The inelastic part of _strain_increment[_qp] after the iterative process has converged. This is a weighted sum of all the inelastic strains computed by all the plastic models during the Picard iterative scheme. The weights are dictated by the user using _inelastic_weights |
Definition at line 183 of file ADComputeMultipleInelasticStress.C.
189 _console << std::endl
190 <<
"iteration output for ADComputeMultipleInelasticStress solve:"
191 <<
" time=" << _t <<
" int_pt=" << _qp << std::endl;
193 Real l2norm_delta_stress;
194 Real first_l2norm_delta_stress = 1.0;
197 std::vector<ADRankTwoTensor> inelastic_strain_increment;
200 for (
unsigned i_rmm = 0; i_rmm <
_models.size(); ++i_rmm)
201 inelastic_strain_increment[i_rmm].zero();
203 ADRankTwoTensor stress_max, stress_min;
207 for (
unsigned i_rmm = 0; i_rmm <
_num_models; ++i_rmm)
212 elastic_strain_increment = _strain_increment[_qp];
215 for (
unsigned j_rmm = 0; j_rmm <
_num_models; ++j_rmm)
217 elastic_strain_increment -= inelastic_strain_increment[j_rmm];
224 _stress[_qp] =
_stress_old[_qp] + _elasticity_tensor[_qp] * elastic_strain_increment;
234 stress_max = _stress[_qp];
235 stress_min = _stress[_qp];
239 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
241 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
243 if (_stress[_qp](i, j) > stress_max(i, j))
244 stress_max(i, j) = _stress[_qp](i, j);
245 else if (stress_min(i, j) > _stress[_qp](i, j))
246 stress_min(i, j) = _stress[_qp](i, j);
255 l2norm_delta_stress = MetaPhysicL::raw_value((stress_max - stress_min).
L2norm());
256 if (
counter == 0 && l2norm_delta_stress > 0.0)
257 first_l2norm_delta_stress = l2norm_delta_stress;
261 _console <<
"stress iteration number = " <<
counter <<
"\n"
262 <<
" relative l2 norm delta stress = "
263 << (0 == first_l2norm_delta_stress ? 0
264 : l2norm_delta_stress / first_l2norm_delta_stress)
267 <<
" absolute l2 norm delta stress = " << l2norm_delta_stress <<
"\n"
278 "In ", _name,
": Max stress iteration hit during ADComputeMultipleInelasticStress solve!");
280 combined_inelastic_strain_increment.zero();
281 for (
unsigned i_rmm = 0; i_rmm <
_num_models; ++i_rmm)
282 combined_inelastic_strain_increment +=
286 for (
unsigned i_rmm = 0; i_rmm <
_num_models; ++i_rmm)
◆ updateQpStateSingleModel()
template<ComputeStage compute_stage>
void ADComputeMultipleInelasticStress< compute_stage >::updateQpStateSingleModel |
( |
unsigned |
model_number, |
|
|
ADRankTwoTensor & |
elastic_strain_increment, |
|
|
ADRankTwoTensor & |
combined_inelastic_strain_increment |
|
) |
| |
|
protectedvirtualinherited |
An optimised version of updateQpState that gets used when the number of plastic models is unity, or when we're cycling through models Given the _strain_increment[_qp], find an admissible stress (which is put into _stress[_qp]) and inelastic strain.
- Parameters
-
model_number | Use this model number |
elastic_strain_increment | The elastic part of _strain_increment[_qp] |
combined_inelastic_strain_increment | The inelastic part of _strain_increment[_qp] |
Definition at line 297 of file ADComputeMultipleInelasticStress.C.
305 elastic_strain_increment = _strain_increment[_qp];
310 _stress[_qp] = _elasticity_tensor[_qp] * (
_elastic_strain_old[_qp] + elastic_strain_increment);
312 _stress[_qp] =
_stress_old[_qp] + _elasticity_tensor[_qp] * elastic_strain_increment;
315 model_number, elastic_strain_increment, combined_inelastic_strain_increment);
321 for (
unsigned i_rmm = 0; i_rmm <
_num_models; ++i_rmm)
322 if (i_rmm != model_number)
323 _models[i_rmm]->propagateQpStatefulProperties();
◆ validParams()
template<ComputeStage compute_stage>
Definition at line 20 of file ADComputeMultiplePorousInelasticStress.C.
23 params.addClassDescription(
24 "Compute state (stress and internal parameters such as plastic "
25 "strains and internal parameters) using an iterative process. A porosity material property "
26 "is defined and is calculated from the trace of inelastic strain increment.");
28 params.addParam<MaterialPropertyName>(
29 "porosity_name",
"porosity",
"Name of porosity material property");
30 params.addRequiredRangeCheckedParam<Real>(
31 "initial_porosity",
"initial_porosity>0.0 & initial_porosity<1.0",
"Initial porosity");
◆ _absolute_tolerance
template<ComputeStage compute_stage>
◆ _base_name
template<ComputeStage compute_stage>
◆ _cycle_models
template<ComputeStage compute_stage>
◆ _elastic_strain_old
template<ComputeStage compute_stage>
◆ _elasticity_tensor_name
template<ComputeStage compute_stage>
◆ _extra_stresses
template<ComputeStage compute_stage>
◆ _gc_block_restrict
BlockRestrictable* const GuaranteeConsumer::_gc_block_restrict |
|
privateinherited |
◆ _gc_feproblem
FEProblemBase* const GuaranteeConsumer::_gc_feproblem |
|
privateinherited |
◆ _gc_params
const InputParameters& GuaranteeConsumer::_gc_params |
|
privateinherited |
◆ _inelastic_strain_old
template<ComputeStage compute_stage>
◆ _inelastic_weights
template<ComputeStage compute_stage>
◆ _initial_porosity
template<ComputeStage compute_stage>
◆ _initial_stress_fcn
template<ComputeStage compute_stage>
◆ _internal_solve_full_iteration_history
template<ComputeStage compute_stage>
◆ _is_elasticity_tensor_guaranteed_isotropic
template<ComputeStage compute_stage>
◆ _matl_timestep_limit
template<ComputeStage compute_stage>
◆ _max_iterations
template<ComputeStage compute_stage>
◆ _models
template<ComputeStage compute_stage>
The user supplied list of inelastic models to use in the simulation.
Users should take care to list creep models first and plasticity models last to allow for the case when a creep model relaxes the stress state inside of the yield surface in an iteration.
Definition at line 159 of file ADComputeMultipleInelasticStress.h.
◆ _num_models
template<ComputeStage compute_stage>
◆ _perform_finite_strain_rotations
template<ComputeStage compute_stage>
◆ _porosity_old
template<ComputeStage compute_stage>
◆ _relative_tolerance
template<ComputeStage compute_stage>
◆ _stress_old
template<ComputeStage compute_stage>
◆ usingComputeFiniteStrainElasticStressMembers
template<ComputeStage compute_stage>
◆ usingComputeMultipleInelasticStressMembers
template<ComputeStage compute_stage>
◆ usingComputeStressBaseMembers
template<ComputeStage compute_stage>
◆ usingMaterialMembers
template<ComputeStage compute_stage>
The documentation for this class was generated from the following files:
const Real _absolute_tolerance
const Real _relative_tolerance
std::vector< ADStressUpdateBase< compute_stage > * > _models
The user supplied list of inelastic models to use in the simulation.
virtual void computeAdmissibleState(unsigned model_number, ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &inelastic_strain_increment)
Given a trial stress (_stress[_qp]) and a strain increment (elastic_strain_increment) let the model_n...
const MaterialProperty< RankTwoTensor > & _stress_old
virtual void finiteStrainRotation()
Rotate _elastic_strain, _stress, and _inelastic_strain to the new configuration.
virtual void initQpStatefulProperties() override
static InputParameters validParams()
BlockRestrictable *const _gc_block_restrict
Access block restrictions of the object with this interface.
virtual void computeQpProperties() override
const unsigned _num_models
number of plastic models
FEProblemBase *const _gc_feproblem
Reference to the FEProblemBase class.
virtual void updateQpState(ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &combined_inelastic_strain_increment)
Given the _strain_increment[_qp], iterate over all of the user-specified recompute materials in order...
const std::string _elasticity_tensor_name
Name of the elasticity tensor material property.
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
The old elastic strain is used to calculate the old stress in the case of variable elasticity tensors...
ADStressUpdateBase is a material that is not called by MOOSE because of the compute=false flag set in...
const MaterialProperty< RankTwoTensor > & _inelastic_strain_old
old value of inelastic strain
ADComputeMultipleInelasticStress computes the stress and a decomposition of the strain into elastic a...
const bool _perform_finite_strain_rotations
after updateQpState, rotate the stress, elastic_strain, and inelastic_strain using _rotation_incremen...
const bool _internal_solve_full_iteration_history
bool hasGuaranteedMaterialProperty(const MaterialPropertyName &prop, Guarantee guarantee)
virtual bool requiresIsotropicTensor()=0
Does the model require the elasticity tensor to be isotropic?
bool _is_elasticity_tensor_guaranteed_isotropic
is the elasticity tensor guaranteed to be isotropic?
MaterialProperty< Real > & _matl_timestep_limit
const std::vector< Real > _inelastic_weights
_inelastic_strain = sum_i (_inelastic_weights_i * inelastic_strain_from_model_i)
const Real _initial_porosity
Initial porosity value. Must be greater than zero.
virtual void updateQpStateSingleModel(unsigned model_number, ADRankTwoTensor &elastic_strain_increment, ADRankTwoTensor &combined_inelastic_strain_increment)
An optimised version of updateQpState that gets used when the number of plastic models is unity,...
virtual void computeQpStressIntermediateConfiguration()
Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration ...
const bool _cycle_models
whether to cycle through the models, using only one model per timestep
const MaterialProperty< Real > & _porosity_old
const unsigned int _max_iterations
Input parameters associated with the recompute iteration to return the stress state to the yield surf...