www.mooseframework.org
Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Attributes | List of all members
ComputeSmearedCrackingStress Class Reference

ComputeSmearedCrackingStress computes the stress for a finite strain material with smeared cracking. More...

#include <ComputeSmearedCrackingStress.h>

Inheritance diagram for ComputeSmearedCrackingStress:
[legend]

Public Member Functions

 ComputeSmearedCrackingStress (const InputParameters &parameters)
 
virtual void initialSetup () override
 
virtual void initQpStatefulProperties () override
 
virtual void computeQpStress () override
 Compute the stress and store it in the _stress material property for the current quadrature point. More...
 

Static Public Member Functions

static InputParameters validParams ()
 

Protected Types

enum  CrackingRelease { CrackingRelease::abrupt, CrackingRelease::exponential, CrackingRelease::power }
 Enum defining the crack release model. More...
 
enum  TangentOperatorEnum { TangentOperatorEnum::elastic, TangentOperatorEnum::nonlinear }
 what sort of Tangent operator to calculate More...
 

Protected Member Functions

void updateLocalElasticityTensor ()
 Update the local elasticity tensor (_local_elasticity_tensor) due to the effects of cracking. More...
 
virtual void updateCrackingStateAndStress ()
 Update all cracking-related state variables and the stress tensor due to cracking in all directions. More...
 
virtual void computeCrackingRelease (int i, Real &sigma, Real &stiffness_ratio, const Real strain_in_crack_dir, const Real cracking_stress, const Real cracking_alpha, const Real youngs_modulus)
 Compute the effect of the cracking release model on the stress and stiffness in the direction of a single crack. More...
 
virtual unsigned int getNumKnownCrackDirs () const
 Get the number of known crack directions. More...
 
void computeCrackStrainAndOrientation (RealVectorValue &strain_in_crack_dir)
 Compute the crack strain in the crack coordinate system. More...
 
void updateStressTensorForCracking (RankTwoTensor &tensor, const RealVectorValue &sigma)
 Updates the full stress tensor to account for the effect of cracking using the provided stresses in the crack directions. More...
 
bool previouslyCracked ()
 Check to see whether there was cracking in any diretion in the previous time step. More...
 
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 (const bool force_elasticity_rotation=false)
 Rotate _elastic_strain, _stress, _inelastic_strain, and _Jacobian_mult to the new configuration. More...
 
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 to find an admissible stress (which is placed into _stress[_qp]) and set of inelastic strains, as well as the tangent operator (which is placed into _Jacobian_mult[_qp]). More...
 
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, 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, as well as the tangent operator (which is placed into _Jacobian_mult[_qp]) More...
 
virtual void computeQpJacobianMult ()
 Using _elasticity_tensor[_qp] and the consistent tangent operators, _consistent_tangent_operator[...] computed by the inelastic models, compute _Jacobian_mult[_qp]. More...
 
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_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), as well as computing the consistent_tangent_operator. More...
 
virtual void computeQpProperties () override
 
bool hasGuaranteedMaterialProperty (const MaterialPropertyName &prop, Guarantee guarantee)
 

Protected Attributes

enum ComputeSmearedCrackingStress::CrackingRelease _cracking_release
 
MaterialProperty< RealVectorValue > & _crack_damage
 
const MaterialProperty< RealVectorValue > & _crack_damage_old
 
MaterialProperty< RealVectorValue > & _crack_flags
 Vector of values going from 1 to 0 as crack damage accumulates. More...
 
MaterialProperty< RankTwoTensor > & _crack_rotation
 
const MaterialProperty< RankTwoTensor > & _crack_rotation_old
 
MaterialProperty< RealVectorValue > & _crack_initiation_strain
 
const MaterialProperty< RealVectorValue > & _crack_initiation_strain_old
 
MaterialProperty< RealVectorValue > & _crack_max_strain
 
const MaterialProperty< RealVectorValue > & _crack_max_strain_old
 
RankFourTensor _local_elasticity_tensor
 
std::vector< SmearedCrackSofteningBase * > _softening_models
 The user-supplied list of softening models to be used in the 3 crack directions. More...
 
const bool _perform_finite_strain_rotations
 after updateQpState, rotate the stress, elastic_strain, inelastic_strain and Jacobian_mult using _rotation_increment More...
 
MaterialProperty< RankTwoTensor > & _inelastic_strain
 The sum of the inelastic strains that come from the plastic models. More...
 
const MaterialProperty< RankTwoTensor > & _inelastic_strain_old
 old value of inelastic strain More...
 
enum ComputeMultipleInelasticStress::TangentOperatorEnum _tangent_operator_type
 
const unsigned _num_models
 number of plastic models More...
 
std::vector< bool > _tangent_computation_flag
 Flags to compute tangent during updateState call. More...
 
TangentCalculationMethod _tangent_calculation_method
 Calculation method for the tangent modulus. More...
 
const std::vector< Real > _inelastic_weights
 _inelastic_strain = sum_i (_inelastic_weights_i * inelastic_strain_from_model_i) More...
 
std::vector< RankFourTensor_consistent_tangent_operator
 the consistent tangent operators computed by each plastic model More...
 
const bool _cycle_models
 whether to cycle through the models, using only one model per timestep More...
 
MaterialProperty< Real > & _matl_timestep_limit
 
const RankFourTensor _identity_symmetric_four
 Rank four symmetric identity tensor. More...
 
std::vector< StressUpdateBase * > _models
 The user supplied list of inelastic models to use in the simulation. More...
 
bool _is_elasticity_tensor_guaranteed_isotropic
 is the elasticity tensor guaranteed to be isotropic? More...
 
bool _all_models_isotropic
 are all inelastic models inherently isotropic? (not the case for e.g. weak plane plasticity models) More...
 
DamageBase_damage_model
 Pointer to the damage model. More...
 
RankTwoTensor _undamaged_stress_old
 
const std::string _elasticity_tensor_name
 Name of the elasticity tensor material property. More...
 
const MaterialProperty< RankFourTensor > & _elasticity_tensor
 Elasticity tensor material property. More...
 
const MaterialProperty< RankTwoTensor > & _rotation_increment
 Rotation increment material property. More...
 
const MaterialProperty< RankTwoTensor > & _stress_old
 Old state of the stress tensor material property. More...
 
const std::string _base_name
 Base name prepended to all material property names to allow for multi-material systems. More...
 
const MaterialProperty< RankTwoTensor > & _mechanical_strain
 Mechanical strain material property. More...
 
MaterialProperty< RankTwoTensor > & _stress
 Stress material property. More...
 
MaterialProperty< RankTwoTensor > & _elastic_strain
 Elastic strain material property. More...
 
const MaterialProperty< RankTwoTensor > & _extra_stress
 Extra stress tensor. More...
 
std::vector< const Function * > _initial_stress_fcn
 initial stress components More...
 
MaterialProperty< RankFourTensor > & _Jacobian_mult
 derivative of stress w.r.t. strain (_dstress_dstrain) More...
 
const Real _cracking_residual_stress
 Input parameters for smeared crack models. More...
 
const VariableValue & _cracking_stress
 Threshold at which cracking initiates if tensile stress exceeds it. More...
 
std::vector< unsigned int > _prescribed_crack_directions
 User-prescribed cracking directions. More...
 
const unsigned int _max_cracks
 Maximum number of cracks permitted at a material point. More...
 
const Real _cracking_neg_fraction
 Defines transition to changed stiffness during unloading. More...
 
const Real _cracking_beta
 Controls slope of exponential softening curve. More...
 
const Real _shear_retention_factor
 Controls the amount of shear retained. More...
 
const Real _max_stress_correction
 Controls the maximum amount that the damaged elastic stress is corrected to folow the release model during a time step. More...
 
const unsigned int _max_iterations
 Input parameters associated with the recompute iteration to return the stress state to the yield surface. More...
 
const Real _relative_tolerance
 
const Real _absolute_tolerance
 
const bool _internal_solve_full_iteration_history
 
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
 Strain tensors. More...
 
const MaterialProperty< RankTwoTensor > & _strain_increment
 

Private Attributes

const InputParameters & _gc_params
 Parameters of the object with this interface. More...
 
FEProblemBase *const _gc_feproblem
 Reference to the FEProblemBase class. More...
 
BlockRestrictable *const _gc_block_restrict
 Access block restrictions of the object with this interface. More...
 

Detailed Description

ComputeSmearedCrackingStress computes the stress for a finite strain material with smeared cracking.

Definition at line 26 of file ComputeSmearedCrackingStress.h.

Member Enumeration Documentation

◆ CrackingRelease

Enum defining the crack release model.

Enumerator
abrupt 
exponential 
power 

Definition at line 102 of file ComputeSmearedCrackingStress.h.

102 { abrupt, exponential, power } _cracking_release;

◆ TangentOperatorEnum

what sort of Tangent operator to calculate

Enumerator
elastic 
nonlinear 

Definition at line 143 of file ComputeMultipleInelasticStress.h.

143 { elastic, nonlinear } _tangent_operator_type;

Constructor & Destructor Documentation

◆ ComputeSmearedCrackingStress()

ComputeSmearedCrackingStress::ComputeSmearedCrackingStress ( const InputParameters &  parameters)

Definition at line 84 of file ComputeSmearedCrackingStress.C.

85  : ComputeMultipleInelasticStress(parameters),
86  _cracking_release(getParam<MooseEnum>("cracking_release").getEnum<CrackingRelease>()),
87  _cracking_residual_stress(getParam<Real>("cracking_residual_stress")),
88  _cracking_stress(coupledValue("cracking_stress")),
89  _max_cracks(getParam<unsigned int>("max_cracks")),
90  _cracking_neg_fraction(getParam<Real>("cracking_neg_fraction")),
91  _cracking_beta(getParam<Real>("cracking_beta")),
92  _shear_retention_factor(getParam<Real>("shear_retention_factor")),
93  _max_stress_correction(getParam<Real>("max_stress_correction")),
94  _crack_damage(declareProperty<RealVectorValue>(_base_name + "crack_damage")),
95  _crack_damage_old(getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_damage")),
96  _crack_flags(declareProperty<RealVectorValue>(_base_name + "crack_flags")),
97  _crack_rotation(declareProperty<RankTwoTensor>(_base_name + "crack_rotation")),
98  _crack_rotation_old(getMaterialPropertyOld<RankTwoTensor>(_base_name + "crack_rotation")),
100  declareProperty<RealVectorValue>(_base_name + "crack_initiation_strain")),
102  getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_initiation_strain")),
103  _crack_max_strain(declareProperty<RealVectorValue>(_base_name + "crack_max_strain")),
104  _crack_max_strain_old(getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_max_strain"))
105 {
106  MultiMooseEnum prescribed_crack_directions =
107  getParam<MultiMooseEnum>("prescribed_crack_directions");
108  if (prescribed_crack_directions.size() > 0)
109  {
110  if (prescribed_crack_directions.size() > 3)
111  mooseError("A maximum of three crack directions may be specified");
112  for (unsigned int i = 0; i < prescribed_crack_directions.size(); ++i)
113  {
114  for (unsigned int j = 0; j < i; ++j)
115  if (prescribed_crack_directions[i] == prescribed_crack_directions[j])
116  mooseError("Entries in 'prescribed_crack_directions' cannot be repeated");
118  static_cast<unsigned int>(prescribed_crack_directions.get(i)));
119  }
120 
121  // Fill in the last remaining direction if 2 are specified
122  if (_prescribed_crack_directions.size() == 2)
123  {
124  std::set<unsigned int> available_dirs = {0, 1, 2};
125  for (auto dir : _prescribed_crack_directions)
126  if (available_dirs.erase(dir) != 1)
127  mooseError("Invalid prescribed crack direction:" + Moose::stringify(dir));
128  if (available_dirs.size() != 1)
129  mooseError("Error in finding remaining available crack direction");
130  _prescribed_crack_directions.push_back(*available_dirs.begin());
131  }
132  }
133 
134  if (parameters.isParamSetByUser("softening_models"))
135  {
136  if (parameters.isParamSetByUser("cracking_release"))
137  mooseError("In ComputeSmearedCrackingStress cannot specify both 'cracking_release' and "
138  "'softening_models'");
139  if (parameters.isParamSetByUser("cracking_residual_stress"))
140  mooseError("In ComputeSmearedCrackingStress cannot specify both 'cracking_residual_stress' "
141  "and 'softening_models'");
142  if (parameters.isParamSetByUser("cracking_beta"))
143  mooseError("In ComputeSmearedCrackingStress cannot specify both 'cracking_beta' and "
144  "'softening_models'");
145  }
146 }

Member Function Documentation

◆ computeAdmissibleState()

void ComputeMultipleInelasticStress::computeAdmissibleState ( unsigned  model_number,
RankTwoTensor elastic_strain_increment,
RankTwoTensor inelastic_strain_increment,
RankFourTensor consistent_tangent_operator 
)
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), as well as computing the consistent_tangent_operator.

Parameters
model_numberThe inelastic model to use
elastic_strain_incrementUpon input, this is the strain increment. Upon output, it is the elastic part of the strain increment
inelastic_strain_incrementThe inelastic strain increment corresponding to the supplied strain increment
consistent_tangent_operatorThe consistent tangent operator

Reimplemented in ComputeMultipleInelasticCosseratStress.

Definition at line 466 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by ComputeMultipleInelasticCosseratStress::computeAdmissibleState(), ComputeMultipleInelasticStress::updateQpState(), and ComputeMultipleInelasticStress::updateQpStateSingleModel().

◆ computeCrackingRelease()

void ComputeSmearedCrackingStress::computeCrackingRelease ( int  i,
Real &  sigma,
Real &  stiffness_ratio,
const Real  strain_in_crack_dir,
const Real  cracking_stress,
const Real  cracking_alpha,
const Real  youngs_modulus 
)
protectedvirtual

Compute the effect of the cracking release model on the stress and stiffness in the direction of a single crack.

Parameters
iIndex of current crack direction
sigmaStress in direction of crack
stiffness_ratioRatio of damaged to original stiffness in cracking direction
strain_in_crack_dirStrain in the current crack direction
cracking_stressThreshold tensile stress for crack initiation
cracking_alphaInitial slope of exponential softening model
youngs_modulusYoung's modulus

Definition at line 586 of file ComputeSmearedCrackingStress.C.

593 {
594  switch (_cracking_release)
595  {
597  {
598  if (sigma > cracking_stress)
599  {
600  stiffness_ratio /= 3.0;
601  sigma = stiffness_ratio * youngs_modulus * strain_in_crack_dir;
602  }
603  break;
604  }
606  {
607  const Real crack_max_strain = _crack_max_strain[_qp](i);
608  mooseAssert(crack_max_strain >= _crack_initiation_strain[_qp](i),
609  "crack_max_strain must be >= crack_initiation_strain");
610 
611  // Compute stress that follows exponental curve
612  sigma =
613  cracking_stress * (_cracking_residual_stress +
614  (1.0 - _cracking_residual_stress) *
615  std::exp(cracking_alpha * _cracking_beta / cracking_stress *
616  (crack_max_strain - _crack_initiation_strain[_qp](i))));
617  // Compute ratio of current stiffness to original stiffness
618  stiffness_ratio =
619  sigma * _crack_initiation_strain[_qp](i) / (crack_max_strain * cracking_stress);
620  break;
621  }
623  {
624  if (_cracking_residual_stress == 0)
625  {
626  const Real tiny = 1e-16;
627  stiffness_ratio = tiny;
628  sigma = tiny * _crack_initiation_strain[_qp](i) * youngs_modulus;
629  }
630  else
631  {
632  sigma = _cracking_residual_stress * cracking_stress;
633  stiffness_ratio = sigma / (_crack_max_strain[_qp](i) * youngs_modulus);
634  }
635  break;
636  }
637  }
638 
639  if (stiffness_ratio < 0)
640  {
641  std::stringstream err;
642  err << "Negative stiffness ratio: " << i << " " << stiffness_ratio << ", "
643  << _crack_max_strain[_qp](i) << ", " << _crack_initiation_strain[_qp](i) << ", "
644  << std::endl;
645  mooseError(err.str());
646  }
647 }

Referenced by updateCrackingStateAndStress().

◆ computeCrackStrainAndOrientation()

void ComputeSmearedCrackingStress::computeCrackStrainAndOrientation ( RealVectorValue &  strain_in_crack_dir)
protected

Compute the crack strain in the crack coordinate system.

Also computes the crack orientations, and stores in _crack_rotation.

Parameters
strain_in_crack_dirComputed strains in crack directions

Definition at line 495 of file ComputeSmearedCrackingStress.C.

497 {
498  // The rotation tensor is ordered such that directions for pre-existing cracks appear first
499  // in the list of columns. For example, if there is one existing crack, its direction is in the
500  // first column in the rotation tensor.
501  const unsigned int num_known_dirs = getNumKnownCrackDirs();
502 
503  if (num_known_dirs == 0)
504  {
505  std::vector<Real> eigval(3, 0.0);
506  RankTwoTensor eigvec;
507 
508  _elastic_strain[_qp].symmetricEigenvaluesEigenvectors(eigval, eigvec);
509 
510  // If the elastic strain is beyond the cracking strain, save the eigen vectors as
511  // the rotation tensor. Reverse their order so that the third principal strain
512  // (most tensile) will correspond to the first crack.
513  _crack_rotation[_qp].fillColumn(0, eigvec.column(2));
514  _crack_rotation[_qp].fillColumn(1, eigvec.column(1));
515  _crack_rotation[_qp].fillColumn(2, eigvec.column(0));
516 
517  strain_in_crack_dir(0) = eigval[2];
518  strain_in_crack_dir(1) = eigval[1];
519  strain_in_crack_dir(2) = eigval[0];
520  }
521  else if (num_known_dirs == 1)
522  {
523  // This is easily the most complicated case.
524  // 1. Rotate the elastic strain to the orientation associated with the known
525  // crack.
526  // 2. Extract the lower 2x2 block into a separate tensor.
527  // 3. Run the eigen solver on the result.
528  // 4. Update the rotation tensor to reflect the effect of the 2 eigenvectors.
529 
530  // 1.
531  const RankTwoTensor & R = _crack_rotation[_qp];
532  RankTwoTensor ePrime(_elastic_strain[_qp]);
533  ePrime.rotate(R.transpose()); // elastic strain in crack coordinates
534 
535  // 2.
536  ColumnMajorMatrix e2x2(2, 2);
537  e2x2(0, 0) = ePrime(1, 1);
538  e2x2(1, 0) = ePrime(2, 1);
539  e2x2(0, 1) = ePrime(1, 2);
540  e2x2(1, 1) = ePrime(2, 2);
541 
542  // 3.
543  ColumnMajorMatrix e_val2x1(2, 1);
544  ColumnMajorMatrix e_vec2x2(2, 2);
545  e2x2.eigen(e_val2x1, e_vec2x2);
546 
547  // 4.
548  RankTwoTensor eigvec(
549  1.0, 0.0, 0.0, 0.0, e_vec2x2(0, 1), e_vec2x2(1, 1), 0.0, e_vec2x2(0, 0), e_vec2x2(1, 0));
550 
551  _crack_rotation[_qp] = _crack_rotation_old[_qp] * eigvec; // Roe implementation
552 
553  strain_in_crack_dir(0) = ePrime(0, 0);
554  strain_in_crack_dir(1) = e_val2x1(1, 0);
555  strain_in_crack_dir(2) = e_val2x1(0, 0);
556  }
557  else if (num_known_dirs == 2 || num_known_dirs == 3)
558  {
559  // Rotate to cracked orientation and pick off the strains in the rotated
560  // coordinate directions.
561  const RankTwoTensor & R = _crack_rotation[_qp];
562  RankTwoTensor ePrime(_elastic_strain[_qp]);
563  ePrime.rotate(R.transpose()); // elastic strain in crack coordinates
564 
565  strain_in_crack_dir(0) = ePrime(0, 0);
566  strain_in_crack_dir(1) = ePrime(1, 1);
567  strain_in_crack_dir(2) = ePrime(2, 2);
568  }
569  else
570  mooseError("Invalid number of known crack directions");
571 }

Referenced by updateCrackingStateAndStress().

◆ computeQpJacobianMult()

void ComputeMultipleInelasticStress::computeQpJacobianMult ( )
protectedvirtualinherited

Using _elasticity_tensor[_qp] and the consistent tangent operators, _consistent_tangent_operator[...] computed by the inelastic models, compute _Jacobian_mult[_qp].

Reimplemented in ComputeMultipleInelasticCosseratStress.

Definition at line 393 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by ComputeMultipleInelasticStress::updateQpState().

◆ computeQpProperties()

void ComputeStressBase::computeQpProperties ( )
overrideprotectedvirtualinherited

Definition at line 50 of file ComputeStressBase.C.

51 {
53 
54  // Add in extra stress
55  _stress[_qp] += _extra_stress[_qp];
56 }

◆ computeQpStress()

void ComputeSmearedCrackingStress::computeQpStress ( )
overridevirtual

Compute the stress and store it in the _stress material property for the current quadrature point.

Reimplemented from ComputeMultipleInelasticStress.

Definition at line 246 of file ComputeSmearedCrackingStress.C.

247 {
248  bool force_elasticity_rotation = false;
249 
250  if (!previouslyCracked())
252  else
253  {
255 
256  // Propagate behavior from the (now inactive) inelastic models
258  for (auto model : _models)
259  {
260  model->setQp(_qp);
261  model->propagateQpStatefulProperties();
262  }
263 
264  // Since the other inelastic models are inactive, they will not limit the time step
265  _matl_timestep_limit[_qp] = std::numeric_limits<Real>::max();
266 
267  // update _local_elasticity_tensor based on cracking state in previous time step
269 
270  // Calculate stress in intermediate configuration
272 
274  force_elasticity_rotation = true;
275  }
276 
277  // compute crack status and adjust stress
279 
281  {
282  finiteStrainRotation(force_elasticity_rotation);
284  }
285 }

◆ computeQpStressIntermediateConfiguration()

void ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration ( )
protectedvirtualinherited

Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration to the new configuration.

Definition at line 215 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by computeQpStress(), and ComputeMultipleInelasticStress::computeQpStress().

◆ finiteStrainRotation()

void ComputeMultipleInelasticStress::finiteStrainRotation ( const bool  force_elasticity_rotation = false)
protectedvirtualinherited

Rotate _elastic_strain, _stress, _inelastic_strain, and _Jacobian_mult to the new configuration.

Parameters
force_elasticity_rotationForce the elasticity tensor to be rotated, even if it is not deemed necessary.

Definition at line 255 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by computeQpStress(), and ComputeMultipleInelasticStress::computeQpStress().

◆ getNumKnownCrackDirs()

unsigned int ComputeSmearedCrackingStress::getNumKnownCrackDirs ( ) const
protectedvirtual

Get the number of known crack directions.

This includes cracks in prescribed directions (even if not yet active) and active cracks in other directions.

Returns
number of known crack directions

Definition at line 574 of file ComputeSmearedCrackingStress.C.

575 {
576  unsigned int num_known_dirs = 0;
577  for (unsigned int i = 0; i < 3; ++i)
578  {
579  if (_crack_damage_old[_qp](i) > 0.0 || _prescribed_crack_directions.size() >= i + 1)
580  ++num_known_dirs;
581  }
582  return num_known_dirs;
583 }

Referenced by computeCrackStrainAndOrientation().

◆ hasGuaranteedMaterialProperty()

bool GuaranteeConsumer::hasGuaranteedMaterialProperty ( const MaterialPropertyName &  prop,
Guarantee  guarantee 
)
protectedinherited

Definition at line 28 of file GuaranteeConsumer.C.

30 {
31  if (!_gc_feproblem->startedInitialSetup())
32  mooseError("hasGuaranteedMaterialProperty() needs to be called in initialSetup()");
33 
34  // Reference to MaterialWarehouse for testing and retrieving block ids
35  const auto & warehouse = _gc_feproblem->getMaterialWarehouse();
36 
37  // Complete set of ids that this object is active
38  const auto & ids = (_gc_block_restrict && _gc_block_restrict->blockRestricted())
39  ? _gc_block_restrict->blockIDs()
40  : _gc_feproblem->mesh().meshSubdomains();
41 
42  // Loop over each id for this object
43  for (const auto & id : ids)
44  {
45  // If block materials exist, look if any issue the required guarantee
46  if (warehouse.hasActiveBlockObjects(id))
47  {
48  const std::vector<std::shared_ptr<MaterialBase>> & mats = warehouse.getActiveBlockObjects(id);
49  for (const auto & mat : mats)
50  {
51  const auto & mat_props = mat->getSuppliedItems();
52  if (mat_props.count(prop_name))
53  {
54  auto guarantee_mat = dynamic_cast<GuaranteeProvider *>(mat.get());
55  if (guarantee_mat && !guarantee_mat->hasGuarantee(prop_name, guarantee))
56  {
57  // we found at least one material on the set of block we operate on
58  // that does _not_ provide the requested guarantee
59  return false;
60  }
61  }
62  }
63  }
64  }
65 
66  return true;
67 }

Referenced by ComputeFiniteStrainElasticStress::initialSetup(), initialSetup(), ComputeLinearElasticPFFractureStress::initialSetup(), CriticalTimeStep::initialSetup(), and ComputeMultipleInelasticStress::initialSetup().

◆ initialSetup()

void ComputeSmearedCrackingStress::initialSetup ( )
overridevirtual

Reimplemented from ComputeMultipleInelasticStress.

Definition at line 212 of file ComputeSmearedCrackingStress.C.

213 {
215 
217  mooseError("ComputeSmearedCrackingStress requires that the elasticity tensor be "
218  "guaranteed isotropic");
219 
220  std::vector<MaterialName> soft_matls = getParam<std::vector<MaterialName>>("softening_models");
221  if (soft_matls.size() != 0)
222  {
223  for (auto soft_matl : soft_matls)
224  {
226  dynamic_cast<SmearedCrackSofteningBase *>(&getMaterialByName(soft_matl));
227  if (scsb)
228  _softening_models.push_back(scsb);
229  else
230  mooseError("Model " + soft_matl +
231  " is not a softening model that can be used with ComputeSmearedCrackingStress");
232  }
233  if (_softening_models.size() == 1)
234  {
235  // Reuse the same model in all 3 directions
236  _softening_models.push_back(_softening_models[0]);
237  _softening_models.push_back(_softening_models[0]);
238  }
239  else if (_softening_models.size() != 3)
240  mooseError("If 'softening_models' is specified in ComputeSmearedCrackingStress, either 1 or "
241  "3 models must be provided");
242  }
243 }

◆ initQpStatefulProperties()

void ComputeSmearedCrackingStress::initQpStatefulProperties ( )
overridevirtual

Reimplemented from ComputeMultipleInelasticStress.

Definition at line 149 of file ComputeSmearedCrackingStress.C.

150 {
152 
153  _crack_damage[_qp] = 0.0;
154 
155  _crack_initiation_strain[_qp] = 0.0;
156  _crack_max_strain[_qp](0) = 0.0;
157 
158  switch (_prescribed_crack_directions.size())
159  {
160  case 0:
161  {
162  _crack_rotation[_qp] = RankTwoTensor::Identity();
163  break;
164  }
165  case 1:
166  {
167  _crack_rotation[_qp].zero();
168  switch (_prescribed_crack_directions[0])
169  {
170  case 0:
171  {
172  _crack_rotation[_qp](0, 0) = 1.0;
173  _crack_rotation[_qp](1, 1) = 1.0;
174  _crack_rotation[_qp](2, 2) = 1.0;
175  break;
176  }
177  case 1:
178  {
179  _crack_rotation[_qp](1, 0) = 1.0;
180  _crack_rotation[_qp](0, 1) = 1.0;
181  _crack_rotation[_qp](2, 2) = 1.0;
182  break;
183  }
184  case 2:
185  {
186  _crack_rotation[_qp](2, 0) = 1.0;
187  _crack_rotation[_qp](0, 1) = 1.0;
188  _crack_rotation[_qp](1, 2) = 1.0;
189  break;
190  }
191  }
192  break;
193  }
194  case 2:
195  {
196  mooseError("Number of prescribed crack directions cannot be 2");
197  break;
198  }
199  case 3:
200  {
201  for (unsigned int i = 0; i < _prescribed_crack_directions.size(); ++i)
202  {
203  RealVectorValue crack_dir_vec;
204  crack_dir_vec(_prescribed_crack_directions[i]) = 1.0;
205  _crack_rotation[_qp].fillColumn(i, crack_dir_vec);
206  }
207  }
208  }
209 }

◆ previouslyCracked()

bool ComputeSmearedCrackingStress::previouslyCracked ( )
protected

Check to see whether there was cracking in any diretion in the previous time step.

Returns
true if cracked, false if not cracked

Definition at line 676 of file ComputeSmearedCrackingStress.C.

677 {
678  for (unsigned int i = 0; i < 3; ++i)
679  if (_crack_damage_old[_qp](i) > 0.0)
680  return true;
681  return false;
682 }

Referenced by computeQpStress().

◆ updateCrackingStateAndStress()

void ComputeSmearedCrackingStress::updateCrackingStateAndStress ( )
protectedvirtual

Update all cracking-related state variables and the stress tensor due to cracking in all directions.

Definition at line 375 of file ComputeSmearedCrackingStress.C.

376 {
377  const Real youngs_modulus =
379  const Real cracking_alpha = -youngs_modulus;
380 
381  Real cracking_stress = _cracking_stress[_qp];
382 
383  if (cracking_stress > 0)
384  {
385  // Initializing crack states
387 
388  for (unsigned i = 0; i < 3; ++i)
389  {
390  _crack_max_strain[_qp](i) = _crack_max_strain_old[_qp](i);
392  _crack_damage[_qp](i) = _crack_damage_old[_qp](i);
393  }
394 
395  // Compute crack orientations: updated _crack_rotation[_qp] based on current strain
396  RealVectorValue strain_in_crack_dir;
397  computeCrackStrainAndOrientation(strain_in_crack_dir);
398 
399  for (unsigned i = 0; i < 3; ++i)
400  {
401  if (strain_in_crack_dir(i) > _crack_max_strain[_qp](i))
402  _crack_max_strain[_qp](i) = strain_in_crack_dir(i);
403  }
404 
405  // Check for new cracks.
406  // Rotate stress to cracked orientation.
407  const RankTwoTensor & R = _crack_rotation[_qp];
408  RankTwoTensor sigmaPrime(_stress[_qp]);
409  sigmaPrime.rotate(R.transpose()); // stress in crack coordinates
410 
411  unsigned int num_cracks = 0;
412  for (unsigned int i = 0; i < 3; ++i)
413  {
414  if (_crack_damage_old[_qp](i) > 0.0)
415  ++num_cracks;
416  }
417 
418  bool cracked(false);
419  RealVectorValue sigma;
420  for (unsigned int i = 0; i < 3; ++i)
421  {
422  sigma(i) = sigmaPrime(i, i);
423 
424  Real stiffness_ratio = 1.0 - _crack_damage[_qp](i);
425 
426  const bool pre_existing_crack = (_crack_damage_old[_qp](i) > 0.0);
427  const bool met_stress_criterion = (sigma(i) > cracking_stress);
428  const bool loading_existing_crack = (strain_in_crack_dir(i) >= _crack_max_strain[_qp](i));
429  const bool allowed_to_crack = (pre_existing_crack || num_cracks < _max_cracks);
430  bool new_crack = false;
431 
432  cracked |= pre_existing_crack;
433 
434  // Adjustments for newly created cracks
435  if (met_stress_criterion && !pre_existing_crack && allowed_to_crack)
436  {
437  new_crack = true;
438  ++num_cracks;
439 
440  // Assume Poisson's ratio drops to zero for this direction. Stiffness is then Young's
441  // modulus.
442  _crack_initiation_strain[_qp](i) = cracking_stress / youngs_modulus;
443 
444  if (_crack_max_strain[_qp](i) < _crack_initiation_strain[_qp](i))
446  }
447 
448  // Update stress and stiffness ratio according to specified crack release model
449  if (new_crack || (pre_existing_crack && loading_existing_crack))
450  {
451  cracked = true;
452  if (_softening_models.size() != 0)
454  stiffness_ratio,
455  strain_in_crack_dir(i),
456  _crack_initiation_strain[_qp](i),
457  _crack_max_strain[_qp](i),
458  cracking_stress,
459  youngs_modulus);
460  else
462  sigma(i),
463  stiffness_ratio,
464  strain_in_crack_dir(i),
465  cracking_stress,
466  cracking_alpha,
467  youngs_modulus);
468  _crack_damage[_qp](i) = 1.0 - stiffness_ratio;
469  }
470 
471  else if (cracked && _cracking_neg_fraction > 0 &&
472  _crack_initiation_strain[_qp](i) * _cracking_neg_fraction > strain_in_crack_dir(i) &&
473  -_crack_initiation_strain[_qp](i) * _cracking_neg_fraction < strain_in_crack_dir(i))
474  {
475  const Real etr = _cracking_neg_fraction * _crack_initiation_strain[_qp](i);
476  const Real Eo = cracking_stress / _crack_initiation_strain[_qp](i);
477  const Real Ec = Eo * (1.0 - _crack_damage_old[_qp](i));
478  const Real a = (Ec - Eo) / (4.0 * etr);
479  const Real b = 0.5 * (Ec + Eo);
480  const Real c = 0.25 * (Ec - Eo) * etr;
481  sigma(i) = (a * strain_in_crack_dir(i) + b) * strain_in_crack_dir(i) + c;
482  }
483  }
484 
485  if (cracked)
487  }
488 
489  _crack_flags[_qp](0) = 1.0 - _crack_damage[_qp](2);
490  _crack_flags[_qp](1) = 1.0 - _crack_damage[_qp](1);
491  _crack_flags[_qp](2) = 1.0 - _crack_damage[_qp](0);
492 }

Referenced by computeQpStress().

◆ updateLocalElasticityTensor()

void ComputeSmearedCrackingStress::updateLocalElasticityTensor ( )
protected

Update the local elasticity tensor (_local_elasticity_tensor) due to the effects of cracking.

Definition at line 288 of file ComputeSmearedCrackingStress.C.

289 {
290  const Real youngs_modulus =
292 
293  bool cracking_locally_active = false;
294 
295  const Real cracking_stress = _cracking_stress[_qp];
296 
297  if (cracking_stress > 0)
298  {
299  RealVectorValue stiffness_ratio_local(1.0, 1.0, 1.0);
300  const RankTwoTensor & R = _crack_rotation_old[_qp];
301  RankTwoTensor ePrime(_elastic_strain_old[_qp]);
302  ePrime.rotate(R.transpose());
303 
304  for (unsigned int i = 0; i < 3; ++i)
305  {
306  // Update elasticity tensor based on crack status of the end of last time step
307  if (_crack_damage_old[_qp](i) > 0.0)
308  {
309  if (_cracking_neg_fraction == 0.0 && MooseUtils::absoluteFuzzyLessThan(ePrime(i, i), 0.0))
310  stiffness_ratio_local(i) = 1.0;
311  else if (_cracking_neg_fraction > 0.0 &&
312  ePrime(i, i) < _crack_initiation_strain_old[_qp](i) * _cracking_neg_fraction &&
313  ePrime(i, i) > -_crack_initiation_strain_old[_qp](i) * _cracking_neg_fraction)
314  {
315  const Real etr = _cracking_neg_fraction * _crack_initiation_strain_old[_qp](i);
316  const Real Eo = cracking_stress / _crack_initiation_strain_old[_qp](i);
317  const Real Ec = Eo * (1.0 - _crack_damage_old[_qp](i));
318  const Real a = (Ec - Eo) / (4 * etr);
319  const Real b = (Ec + Eo) / 2;
320  // Compute the ratio of the current transition stiffness to the original stiffness
321  stiffness_ratio_local(i) = (2.0 * a * etr + b) / Eo;
322  cracking_locally_active = true;
323  }
324  else
325  {
326  stiffness_ratio_local(i) = (1.0 - _crack_damage_old[_qp](i));
327  cracking_locally_active = true;
328  }
329  }
330  }
331 
332  if (cracking_locally_active)
333  {
334  // Update the elasticity tensor in the crack coordinate system
335  const bool c0_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(0), 1.0);
336  const bool c1_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(1), 1.0);
337  const bool c2_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(2), 1.0);
338 
339  const Real c01 = (c0_coupled && c1_coupled ? 1.0 : 0.0);
340  const Real c02 = (c0_coupled && c2_coupled ? 1.0 : 0.0);
341  const Real c12 = (c1_coupled && c2_coupled ? 1.0 : 0.0);
342 
343  const Real c01_shear_retention = (c0_coupled && c1_coupled ? 1.0 : _shear_retention_factor);
344  const Real c02_shear_retention = (c0_coupled && c2_coupled ? 1.0 : _shear_retention_factor);
345  const Real c12_shear_retention = (c1_coupled && c2_coupled ? 1.0 : _shear_retention_factor);
346 
347  // Filling with 9 components is sufficient because these are the only nonzero entries
348  // for isotropic or orthotropic materials.
349  std::vector<Real> local_elastic(9);
350 
351  local_elastic[0] = (c0_coupled ? _elasticity_tensor[_qp](0, 0, 0, 0)
352  : stiffness_ratio_local(0) * youngs_modulus);
353  local_elastic[1] = _elasticity_tensor[_qp](0, 0, 1, 1) * c01;
354  local_elastic[2] = _elasticity_tensor[_qp](0, 0, 2, 2) * c02;
355  local_elastic[3] = (c1_coupled ? _elasticity_tensor[_qp](1, 1, 1, 1)
356  : stiffness_ratio_local(1) * youngs_modulus);
357  local_elastic[4] = _elasticity_tensor[_qp](1, 1, 2, 2) * c12;
358  local_elastic[5] = (c2_coupled ? _elasticity_tensor[_qp](2, 2, 2, 2)
359  : stiffness_ratio_local(2) * youngs_modulus);
360  local_elastic[6] = _elasticity_tensor[_qp](1, 2, 1, 2) * c12_shear_retention;
361  local_elastic[7] = _elasticity_tensor[_qp](0, 2, 0, 2) * c02_shear_retention;
362  local_elastic[8] = _elasticity_tensor[_qp](0, 1, 0, 1) * c01_shear_retention;
363 
364  _local_elasticity_tensor.fillFromInputVector(local_elastic, RankFourTensor::symmetric9);
365 
366  // Rotate the modified elasticity tensor back into global coordinates
367  _local_elasticity_tensor.rotate(R);
368  }
369  }
370  if (!cracking_locally_active)
372 }

Referenced by computeQpStress().

◆ updateQpState()

void ComputeMultipleInelasticStress::updateQpState ( RankTwoTensor elastic_strain_increment,
RankTwoTensor 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, as well as the tangent operator (which is placed into _Jacobian_mult[_qp]).

Parameters
elastic_strain_incrementThe elastic part of _strain_increment[_qp] after the iterative process has converged
combined_inelastic_strain_incrementThe 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 271 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration().

◆ updateQpStateSingleModel()

void ComputeMultipleInelasticStress::updateQpStateSingleModel ( unsigned  model_number,
RankTwoTensor elastic_strain_increment,
RankTwoTensor 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, as well as the tangent operator (which is placed into _Jacobian_mult[_qp])

Parameters
model_numberUse this model number
elastic_strain_incrementThe elastic part of _strain_increment[_qp]
combined_inelastic_strain_incrementThe inelastic part of _strain_increment[_qp]

Definition at line 415 of file ComputeMultipleInelasticStress.C.

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 }

Referenced by ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration().

◆ updateStressTensorForCracking()

void ComputeSmearedCrackingStress::updateStressTensorForCracking ( RankTwoTensor tensor,
const RealVectorValue &  sigma 
)
protected

Updates the full stress tensor to account for the effect of cracking using the provided stresses in the crack directions.

The tensor is rotated into the crack coordinates, modified, and rotated back.

Parameters
tensorStress tensor to be updated
sigmaVector of stresses in crack directions

Definition at line 650 of file ComputeSmearedCrackingStress.C.

652 {
653  // Get transformation matrix
654  const RankTwoTensor & R = _crack_rotation[_qp];
655  // Rotate to crack frame
656  tensor.rotate(R.transpose());
657 
658  // Reset stress if cracked
659  for (unsigned int i = 0; i < 3; ++i)
660  if (_crack_damage[_qp](i) > 0.0)
661  {
662  const Real stress_correction_ratio = (tensor(i, i) - sigma(i)) / tensor(i, i);
663  if (stress_correction_ratio > _max_stress_correction)
664  tensor(i, i) *= (1.0 - _max_stress_correction);
665  else if (stress_correction_ratio < -_max_stress_correction)
666  tensor(i, i) *= (1.0 + _max_stress_correction);
667  else
668  tensor(i, i) = sigma(i);
669  }
670 
671  // Rotate back to global frame
672  tensor.rotate(R);
673 }

Referenced by updateCrackingStateAndStress().

◆ validParams()

InputParameters ComputeSmearedCrackingStress::validParams ( )
static

Definition at line 20 of file ComputeSmearedCrackingStress.C.

21 {
22  InputParameters params = ComputeMultipleInelasticStress::validParams();
23  params.addClassDescription("Compute stress using a fixed smeared cracking model");
24  MooseEnum cracking_release("abrupt exponential power", "abrupt");
25  params.addDeprecatedParam<MooseEnum>(
26  "cracking_release",
27  cracking_release,
28  "The cracking release type. 'abrupt' (default) gives an abrupt "
29  "stress release, 'exponential' uses an exponential softening model, "
30  "and 'power' uses a power law",
31  "This is replaced by the use of 'softening_models' together with a separate block defining "
32  "a softening model");
33  params.addParam<std::vector<MaterialName>>(
34  "softening_models",
35  "The material objects used to compute softening behavior for loading a crack."
36  "Either 1 or 3 models must be specified. If a single model is specified, it is"
37  "used for all directions. If 3 models are specified, they will be used for the"
38  "3 crack directions in sequence");
39  params.addDeprecatedParam<Real>(
40  "cracking_residual_stress",
41  0.0,
42  "The fraction of the cracking stress allowed to be maintained following a crack.",
43  "This is replaced by the use of 'softening_models' together with a separate block defining "
44  "a softening model");
45  params.addRequiredCoupledVar(
46  "cracking_stress",
47  "The stress threshold beyond which cracking occurs. Negative values prevent cracking.");
48  MultiMooseEnum direction("x y z");
49  params.addParam<MultiMooseEnum>(
50  "prescribed_crack_directions", direction, "Prescribed directions of first cracks");
51  params.addParam<unsigned int>(
52  "max_cracks", 3, "The maximum number of cracks allowed at a material point.");
53  params.addRangeCheckedParam<Real>("cracking_neg_fraction",
54  0,
55  "cracking_neg_fraction <= 1 & cracking_neg_fraction >= 0",
56  "The fraction of the cracking strain at which "
57  "a transition begins during decreasing "
58  "strain to the original stiffness.");
59  params.addDeprecatedParam<Real>(
60  "cracking_beta",
61  1.0,
62  "Coefficient used to control the softening in the exponential model. "
63  "When set to 1, the initial softening slope is equal to the negative "
64  "of the Young's modulus. Smaller numbers scale down that slope.",
65  "This is replaced by the use of 'softening_models' together with a separate block defining "
66  "a softening model");
67  params.addParam<Real>(
68  "max_stress_correction",
69  1.0,
70  "Maximum permitted correction to the predicted stress as a ratio of the "
71  "stress change to the predicted stress from the previous step's damage level. "
72  "Values less than 1 will improve robustness, but not be as accurate.");
73 
74  params.addRangeCheckedParam<Real>(
75  "shear_retention_factor",
76  0.0,
77  "shear_retention_factor>=0 & shear_retention_factor<=1.0",
78  "Fraction of original shear stiffness to be retained after cracking");
79  params.set<std::vector<MaterialName>>("inelastic_models") = {};
80 
81  return params;
82 }

Member Data Documentation

◆ _absolute_tolerance

const Real ComputeMultipleInelasticStress::_absolute_tolerance
protectedinherited

◆ _all_models_isotropic

bool ComputeMultipleInelasticStress::_all_models_isotropic
protectedinherited

are all inelastic models inherently isotropic? (not the case for e.g. weak plane plasticity models)

Definition at line 183 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::finiteStrainRotation(), and ComputeMultipleInelasticStress::initialSetup().

◆ _base_name

const std::string ComputeStressBase::_base_name
protectedinherited

Base name prepended to all material property names to allow for multi-material systems.

Definition at line 45 of file ComputeStressBase.h.

Referenced by ComputeLinearElasticStress::initialSetup(), and ComputeCosseratLinearElasticStress::initialSetup().

◆ _consistent_tangent_operator

std::vector<RankFourTensor> ComputeMultipleInelasticStress::_consistent_tangent_operator
protectedinherited

◆ _crack_damage

MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_damage
protected

◆ _crack_damage_old

const MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_damage_old
protected

◆ _crack_flags

MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_flags
protected

Vector of values going from 1 to 0 as crack damage accumulates.

Legacy property for backward compatibility – remove in the future.

Definition at line 140 of file ComputeSmearedCrackingStress.h.

Referenced by updateCrackingStateAndStress().

◆ _crack_initiation_strain

MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_initiation_strain
protected

◆ _crack_initiation_strain_old

const MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_initiation_strain_old
protected

◆ _crack_max_strain

MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_max_strain
protected

◆ _crack_max_strain_old

const MaterialProperty<RealVectorValue>& ComputeSmearedCrackingStress::_crack_max_strain_old
protected

Definition at line 154 of file ComputeSmearedCrackingStress.h.

Referenced by updateCrackingStateAndStress().

◆ _crack_rotation

MaterialProperty<RankTwoTensor>& ComputeSmearedCrackingStress::_crack_rotation
protected

◆ _crack_rotation_old

const MaterialProperty<RankTwoTensor>& ComputeSmearedCrackingStress::_crack_rotation_old
protected

◆ _cracking_beta

const Real ComputeSmearedCrackingStress::_cracking_beta
protected

Controls slope of exponential softening curve.

Definition at line 123 of file ComputeSmearedCrackingStress.h.

Referenced by computeCrackingRelease().

◆ _cracking_neg_fraction

const Real ComputeSmearedCrackingStress::_cracking_neg_fraction
protected

Defines transition to changed stiffness during unloading.

Definition at line 120 of file ComputeSmearedCrackingStress.h.

Referenced by updateCrackingStateAndStress(), and updateLocalElasticityTensor().

◆ _cracking_release

enum ComputeSmearedCrackingStress::CrackingRelease ComputeSmearedCrackingStress::_cracking_release
protected

Referenced by computeCrackingRelease().

◆ _cracking_residual_stress

const Real ComputeSmearedCrackingStress::_cracking_residual_stress
protected

Input parameters for smeared crack models.

Ratio of the residual stress after being fully cracked to the tensile cracking threshold stress

Definition at line 108 of file ComputeSmearedCrackingStress.h.

Referenced by computeCrackingRelease().

◆ _cracking_stress

const VariableValue& ComputeSmearedCrackingStress::_cracking_stress
protected

Threshold at which cracking initiates if tensile stress exceeds it.

Definition at line 111 of file ComputeSmearedCrackingStress.h.

Referenced by updateCrackingStateAndStress(), and updateLocalElasticityTensor().

◆ _cycle_models

const bool ComputeMultipleInelasticStress::_cycle_models
protectedinherited

whether to cycle through the models, using only one model per timestep

Definition at line 161 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration().

◆ _damage_model

DamageBase* ComputeMultipleInelasticStress::_damage_model
protectedinherited

◆ _elastic_strain

MaterialProperty<RankTwoTensor>& ComputeStressBase::_elastic_strain
protectedinherited

◆ _elastic_strain_old

const MaterialProperty<RankTwoTensor>& ComputeMultipleInelasticStress::_elastic_strain_old
protectedinherited

◆ _elasticity_tensor

const MaterialProperty<RankFourTensor>& ComputeFiniteStrainElasticStress::_elasticity_tensor
protectedinherited

◆ _elasticity_tensor_name

const std::string ComputeFiniteStrainElasticStress::_elasticity_tensor_name
protectedinherited

Name of the elasticity tensor material property.

Definition at line 37 of file ComputeFiniteStrainElasticStress.h.

Referenced by ComputeFiniteStrainElasticStress::initialSetup(), initialSetup(), and ComputeMultipleInelasticStress::initialSetup().

◆ _extra_stress

const MaterialProperty<RankTwoTensor>& ComputeStressBase::_extra_stress
protectedinherited

Extra stress tensor.

Definition at line 55 of file ComputeStressBase.h.

Referenced by ComputeStressBase::computeQpProperties().

◆ _gc_block_restrict

BlockRestrictable* const GuaranteeConsumer::_gc_block_restrict
privateinherited

Access block restrictions of the object with this interface.

Definition at line 41 of file GuaranteeConsumer.h.

Referenced by GuaranteeConsumer::hasGuaranteedMaterialProperty().

◆ _gc_feproblem

FEProblemBase* const GuaranteeConsumer::_gc_feproblem
privateinherited

Reference to the FEProblemBase class.

Definition at line 38 of file GuaranteeConsumer.h.

Referenced by GuaranteeConsumer::hasGuaranteedMaterialProperty().

◆ _gc_params

const InputParameters& GuaranteeConsumer::_gc_params
privateinherited

Parameters of the object with this interface.

Definition at line 35 of file GuaranteeConsumer.h.

◆ _identity_symmetric_four

const RankFourTensor ComputeMultipleInelasticStress::_identity_symmetric_four
protectedinherited

◆ _inelastic_strain

MaterialProperty<RankTwoTensor>& ComputeMultipleInelasticStress::_inelastic_strain
protectedinherited

◆ _inelastic_strain_old

const MaterialProperty<RankTwoTensor>& ComputeMultipleInelasticStress::_inelastic_strain_old
protectedinherited

◆ _inelastic_weights

const std::vector<Real> ComputeMultipleInelasticStress::_inelastic_weights
protectedinherited

_inelastic_strain = sum_i (_inelastic_weights_i * inelastic_strain_from_model_i)

Definition at line 155 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::ComputeMultipleInelasticStress(), and ComputeMultipleInelasticStress::updateQpState().

◆ _initial_stress_fcn

std::vector<const Function *> ComputeStressBase::_initial_stress_fcn
protectedinherited

initial stress components

Definition at line 58 of file ComputeStressBase.h.

◆ _internal_solve_full_iteration_history

const bool ComputeMultipleInelasticStress::_internal_solve_full_iteration_history
protectedinherited

◆ _is_elasticity_tensor_guaranteed_isotropic

bool ComputeMultipleInelasticStress::_is_elasticity_tensor_guaranteed_isotropic
protectedinherited

◆ _Jacobian_mult

MaterialProperty<RankFourTensor>& ComputeStressBase::_Jacobian_mult
protectedinherited

◆ _local_elasticity_tensor

RankFourTensor ComputeSmearedCrackingStress::_local_elasticity_tensor
protected

Definition at line 158 of file ComputeSmearedCrackingStress.h.

Referenced by computeQpStress(), and updateLocalElasticityTensor().

◆ _matl_timestep_limit

MaterialProperty<Real>& ComputeMultipleInelasticStress::_matl_timestep_limit
protectedinherited

◆ _max_cracks

const unsigned int ComputeSmearedCrackingStress::_max_cracks
protected

Maximum number of cracks permitted at a material point.

Definition at line 117 of file ComputeSmearedCrackingStress.h.

Referenced by updateCrackingStateAndStress().

◆ _max_iterations

const unsigned int ComputeMultipleInelasticStress::_max_iterations
protectedinherited

Input parameters associated with the recompute iteration to return the stress state to the yield surface.

Definition at line 122 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::updateQpState().

◆ _max_stress_correction

const Real ComputeSmearedCrackingStress::_max_stress_correction
protected

Controls the maximum amount that the damaged elastic stress is corrected to folow the release model during a time step.

Definition at line 130 of file ComputeSmearedCrackingStress.h.

Referenced by updateStressTensorForCracking().

◆ _mechanical_strain

const MaterialProperty<RankTwoTensor>& ComputeStressBase::_mechanical_strain
protectedinherited

◆ _models

std::vector<StressUpdateBase *> ComputeMultipleInelasticStress::_models
protectedinherited

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 177 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::computeAdmissibleState(), computeQpStress(), ComputeMultipleInelasticStress::initialSetup(), ComputeMultipleInelasticStress::updateQpState(), and ComputeMultipleInelasticStress::updateQpStateSingleModel().

◆ _num_models

const unsigned ComputeMultipleInelasticStress::_num_models
protectedinherited

◆ _perform_finite_strain_rotations

const bool ComputeMultipleInelasticStress::_perform_finite_strain_rotations
protectedinherited

◆ _prescribed_crack_directions

std::vector<unsigned int> ComputeSmearedCrackingStress::_prescribed_crack_directions
protected

User-prescribed cracking directions.

Definition at line 114 of file ComputeSmearedCrackingStress.h.

Referenced by ComputeSmearedCrackingStress(), getNumKnownCrackDirs(), and initQpStatefulProperties().

◆ _relative_tolerance

const Real ComputeMultipleInelasticStress::_relative_tolerance
protectedinherited

◆ _rotation_increment

const MaterialProperty<RankTwoTensor>& ComputeFiniteStrainElasticStress::_rotation_increment
protectedinherited

◆ _shear_retention_factor

const Real ComputeSmearedCrackingStress::_shear_retention_factor
protected

Controls the amount of shear retained.

Definition at line 126 of file ComputeSmearedCrackingStress.h.

Referenced by updateLocalElasticityTensor().

◆ _softening_models

std::vector<SmearedCrackSofteningBase *> ComputeSmearedCrackingStress::_softening_models
protected

The user-supplied list of softening models to be used in the 3 crack directions.

Definition at line 162 of file ComputeSmearedCrackingStress.h.

Referenced by initialSetup(), and updateCrackingStateAndStress().

◆ _strain_increment

const MaterialProperty<RankTwoTensor>& ComputeMultipleInelasticStress::_strain_increment
protectedinherited

◆ _stress

MaterialProperty<RankTwoTensor>& ComputeStressBase::_stress
protectedinherited

Stress material property.

Definition at line 50 of file ComputeStressBase.h.

Referenced by ComputeMultipleInelasticCosseratStress::computeAdmissibleState(), ComputeMultipleInelasticStress::computeAdmissibleState(), ComputeStressBase::computeQpProperties(), ComputeStrainIncrementBasedStress::computeQpStress(), ComputeLinearElasticStress::computeQpStress(), ComputeDamageStress::computeQpStress(), ComputeFiniteStrainElasticStress::computeQpStress(), ComputeCosseratLinearElasticStress::computeQpStress(), computeQpStress(), ComputeLinearElasticPFFractureStress::computeQpStress(), FiniteStrainPlasticMaterial::computeQpStress(), ComputeMultiPlasticityStress::computeQpStress(), ComputeLinearViscoelasticStress::computeQpStress(), ComputeMultipleInelasticStress::computeQpStress(), ComputeMultipleInelasticStress::computeQpStressIntermediateConfiguration(), ComputeLinearElasticPFFractureStress::computeStrainSpectral(), ComputeLinearElasticPFFractureStress::computeStrainVolDev(), ComputeLinearElasticPFFractureStress::computeStressSpectral(), ComputeMultipleInelasticStress::finiteStrainRotation(), ComputeStressBase::initQpStatefulProperties(), FiniteStrainCrystalPlasticity::initQpStatefulProperties(), FiniteStrainUObasedCP::initQpStatefulProperties(), FiniteStrainHyperElasticViscoPlastic::initQpStatefulProperties(), ComputeMultiPlasticityStress::postReturnMap(), FiniteStrainUObasedCP::postSolveQp(), FiniteStrainHyperElasticViscoPlastic::postSolveQp(), FiniteStrainCrystalPlasticity::postSolveQp(), updateCrackingStateAndStress(), ComputeMultipleInelasticStress::updateQpState(), and ComputeMultipleInelasticStress::updateQpStateSingleModel().

◆ _stress_old

const MaterialProperty<RankTwoTensor>& ComputeFiniteStrainElasticStress::_stress_old
protectedinherited

◆ _tangent_calculation_method

TangentCalculationMethod ComputeMultipleInelasticStress::_tangent_calculation_method
protectedinherited

◆ _tangent_computation_flag

std::vector<bool> ComputeMultipleInelasticStress::_tangent_computation_flag
protectedinherited

Flags to compute tangent during updateState call.

Definition at line 149 of file ComputeMultipleInelasticStress.h.

Referenced by ComputeMultipleInelasticStress::computeAdmissibleState(), and ComputeMultipleInelasticStress::initialSetup().

◆ _tangent_operator_type

enum ComputeMultipleInelasticStress::TangentOperatorEnum ComputeMultipleInelasticStress::_tangent_operator_type
protectedinherited

◆ _undamaged_stress_old

RankTwoTensor ComputeMultipleInelasticStress::_undamaged_stress_old
protectedinherited

The documentation for this class was generated from the following files:
ComputeSmearedCrackingStress::_crack_initiation_strain_old
const MaterialProperty< RealVectorValue > & _crack_initiation_strain_old
Definition: ComputeSmearedCrackingStress.h:149
ComputeFiniteStrainElasticStress::_elasticity_tensor
const MaterialProperty< RankFourTensor > & _elasticity_tensor
Elasticity tensor material property.
Definition: ComputeFiniteStrainElasticStress.h:39
ComputeSmearedCrackingStress::_shear_retention_factor
const Real _shear_retention_factor
Controls the amount of shear retained.
Definition: ComputeSmearedCrackingStress.h:126
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
ComputeSmearedCrackingStress::computeCrackingRelease
virtual void computeCrackingRelease(int i, Real &sigma, Real &stiffness_ratio, const Real strain_in_crack_dir, const Real cracking_stress, const Real cracking_alpha, const Real youngs_modulus)
Compute the effect of the cracking release model on the stress and stiffness in the direction of a si...
Definition: ComputeSmearedCrackingStress.C:586
ComputeMultipleInelasticStress::_cycle_models
const bool _cycle_models
whether to cycle through the models, using only one model per timestep
Definition: ComputeMultipleInelasticStress.h:161
ComputeSmearedCrackingStress::_prescribed_crack_directions
std::vector< unsigned int > _prescribed_crack_directions
User-prescribed cracking directions.
Definition: ComputeSmearedCrackingStress.h:114
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
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
ComputeStressBase::_extra_stress
const MaterialProperty< RankTwoTensor > & _extra_stress
Extra stress tensor.
Definition: ComputeStressBase.h:55
ComputeMultipleInelasticStress::_num_models
const unsigned _num_models
number of plastic models
Definition: ComputeMultipleInelasticStress.h:146
ComputeSmearedCrackingStress::_cracking_release
enum ComputeSmearedCrackingStress::CrackingRelease _cracking_release
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
ComputeSmearedCrackingStress::_max_cracks
const unsigned int _max_cracks
Maximum number of cracks permitted at a material point.
Definition: ComputeSmearedCrackingStress.h:117
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
ComputeSmearedCrackingStress::updateCrackingStateAndStress
virtual void updateCrackingStateAndStress()
Update all cracking-related state variables and the stress tensor due to cracking in all directions.
Definition: ComputeSmearedCrackingStress.C:375
GuaranteeConsumer::_gc_block_restrict
BlockRestrictable *const _gc_block_restrict
Access block restrictions of the object with this interface.
Definition: GuaranteeConsumer.h:41
ComputeSmearedCrackingStress::_crack_damage_old
const MaterialProperty< RealVectorValue > & _crack_damage_old
Definition: ComputeSmearedCrackingStress.h:135
SmearedCrackSofteningBase
SmearedCrackSofteningBase is the base class for a set of models that define the softening behavior of...
Definition: SmearedCrackSofteningBase.h:28
ComputeSmearedCrackingStress::updateStressTensorForCracking
void updateStressTensorForCracking(RankTwoTensor &tensor, const RealVectorValue &sigma)
Updates the full stress tensor to account for the effect of cracking using the provided stresses in t...
Definition: ComputeSmearedCrackingStress.C:650
ComputeSmearedCrackingStress::_crack_flags
MaterialProperty< RealVectorValue > & _crack_flags
Vector of values going from 1 to 0 as crack damage accumulates.
Definition: ComputeSmearedCrackingStress.h:140
ComputeStressBase::computeQpStress
virtual void computeQpStress()=0
Compute the stress and store it in the _stress material property for the current quadrature point.
ComputeMultipleInelasticStress::_elastic_strain_old
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
Strain tensors.
Definition: ComputeMultipleInelasticStress.h:132
ComputeSmearedCrackingStress::CrackingRelease::abrupt
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
GuaranteeConsumer::_gc_feproblem
FEProblemBase *const _gc_feproblem
Reference to the FEProblemBase class.
Definition: GuaranteeConsumer.h:38
ElasticityTensorTools::getIsotropicYoungsModulus
T getIsotropicYoungsModulus(const RankFourTensorTempl< T > &elasticity_tensor)
Get the Young's modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must b...
Definition: ElasticityTensorTools.h:98
ComputeMultipleInelasticStress::_damage_model
DamageBase * _damage_model
Pointer to the damage model.
Definition: ComputeMultipleInelasticStress.h:186
ComputeSmearedCrackingStress::_softening_models
std::vector< SmearedCrackSofteningBase * > _softening_models
The user-supplied list of softening models to be used in the 3 crack directions.
Definition: ComputeSmearedCrackingStress.h:162
ComputeStressBase::_base_name
const std::string _base_name
Base name prepended to all material property names to allow for multi-material systems.
Definition: ComputeStressBase.h:45
ComputeMultipleInelasticStress::_absolute_tolerance
const Real _absolute_tolerance
Definition: ComputeMultipleInelasticStress.h:124
ComputeSmearedCrackingStress::_crack_damage
MaterialProperty< RealVectorValue > & _crack_damage
Definition: ComputeSmearedCrackingStress.h:134
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
ComputeSmearedCrackingStress::previouslyCracked
bool previouslyCracked()
Check to see whether there was cracking in any diretion in the previous time step.
Definition: ComputeSmearedCrackingStress.C:676
ComputeFiniteStrainElasticStress::_stress_old
const MaterialProperty< RankTwoTensor > & _stress_old
Old state of the stress tensor material property.
Definition: ComputeFiniteStrainElasticStress.h:45
ComputeSmearedCrackingStress::updateLocalElasticityTensor
void updateLocalElasticityTensor()
Update the local elasticity tensor (_local_elasticity_tensor) due to the effects of cracking.
Definition: ComputeSmearedCrackingStress.C:288
ComputeSmearedCrackingStress::_cracking_stress
const VariableValue & _cracking_stress
Threshold at which cracking initiates if tensile stress exceeds it.
Definition: ComputeSmearedCrackingStress.h:111
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
ComputeSmearedCrackingStress::computeCrackStrainAndOrientation
void computeCrackStrainAndOrientation(RealVectorValue &strain_in_crack_dir)
Compute the crack strain in the crack coordinate system.
Definition: ComputeSmearedCrackingStress.C:495
ComputeSmearedCrackingStress::_local_elasticity_tensor
RankFourTensor _local_elasticity_tensor
Definition: ComputeSmearedCrackingStress.h:158
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
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
ComputeSmearedCrackingStress::CrackingRelease::exponential
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
ComputeSmearedCrackingStress::_crack_rotation_old
const MaterialProperty< RankTwoTensor > & _crack_rotation_old
Definition: ComputeSmearedCrackingStress.h:144
ComputeMultipleInelasticStress::computeQpJacobianMult
virtual void computeQpJacobianMult()
Using _elasticity_tensor[_qp] and the consistent tangent operators, _consistent_tangent_operator[....
Definition: ComputeMultipleInelasticStress.C:393
ComputeSmearedCrackingStress::_crack_initiation_strain
MaterialProperty< RealVectorValue > & _crack_initiation_strain
Definition: ComputeSmearedCrackingStress.h:148
ComputeSmearedCrackingStress::_crack_max_strain
MaterialProperty< RealVectorValue > & _crack_max_strain
Definition: ComputeSmearedCrackingStress.h:153
ComputeSmearedCrackingStress::_cracking_residual_stress
const Real _cracking_residual_stress
Input parameters for smeared crack models.
Definition: ComputeSmearedCrackingStress.h:108
ComputeSmearedCrackingStress::_crack_max_strain_old
const MaterialProperty< RealVectorValue > & _crack_max_strain_old
Definition: ComputeSmearedCrackingStress.h:154
ComputeSmearedCrackingStress::_crack_rotation
MaterialProperty< RankTwoTensor > & _crack_rotation
Definition: ComputeSmearedCrackingStress.h:143
TangentCalculationMethod::PARTIAL
ComputeMultipleInelasticStress::_tangent_calculation_method
TangentCalculationMethod _tangent_calculation_method
Calculation method for the tangent modulus.
Definition: ComputeMultipleInelasticStress.h:152
RankTwoTensorTempl< Real >
ComputeSmearedCrackingStress::_max_stress_correction
const Real _max_stress_correction
Controls the maximum amount that the damaged elastic stress is corrected to folow the release model d...
Definition: ComputeSmearedCrackingStress.h:130
ComputeSmearedCrackingStress::_cracking_neg_fraction
const Real _cracking_neg_fraction
Defines transition to changed stiffness during unloading.
Definition: ComputeSmearedCrackingStress.h:120
ComputeMultipleInelasticStress::_tangent_operator_type
enum ComputeMultipleInelasticStress::TangentOperatorEnum _tangent_operator_type
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
ComputeSmearedCrackingStress::getNumKnownCrackDirs
virtual unsigned int getNumKnownCrackDirs() const
Get the number of known crack directions.
Definition: ComputeSmearedCrackingStress.C:574
ComputeSmearedCrackingStress::CrackingRelease::power
RankTwoScalarTools::L2norm
T L2norm(const RankTwoTensorTempl< T > &r2tensor)
Definition: RankTwoScalarTools.h:98
ComputeMultipleInelasticStress::ComputeMultipleInelasticStress
ComputeMultipleInelasticStress(const InputParameters &parameters)
Definition: ComputeMultipleInelasticStress.C:77
ComputeMultipleInelasticStress::_relative_tolerance
const Real _relative_tolerance
Definition: ComputeMultipleInelasticStress.h:123
Guarantee::ISOTROPIC
ComputeSmearedCrackingStress::_cracking_beta
const Real _cracking_beta
Controls slope of exponential softening curve.
Definition: ComputeSmearedCrackingStress.h:123