https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ComputeSmearedCrackingStress.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
12#include "StressUpdateBase.h"
13#include "Conversion.h"
14
16
19{
21 params.addClassDescription("Compute stress using a fixed smeared cracking model");
22 params.addRequiredParam<std::vector<MaterialName>>(
23 "softening_models",
24 "The material objects used to compute softening behavior for loading a crack."
25 "Either 1 or 3 models must be specified. If a single model is specified, it is"
26 "used for all directions. If 3 models are specified, they will be used for the"
27 "3 crack directions in sequence");
29 "cracking_stress",
30 "The stress threshold beyond which cracking occurs. Negative values prevent cracking.");
31 MultiMooseEnum direction("x y z");
33 "prescribed_crack_directions", direction, "Prescribed directions of first cracks");
34 params.addParam<unsigned int>(
35 "max_cracks", 3, "The maximum number of cracks allowed at a material point.");
36 params.addRangeCheckedParam<Real>("cracking_neg_fraction",
37 0,
38 "cracking_neg_fraction <= 1 & cracking_neg_fraction >= 0",
39 "The fraction of the cracking strain at which "
40 "a transition begins during decreasing "
41 "strain to the original stiffness.");
42 params.addParam<Real>(
43 "max_stress_correction",
44 1.0,
45 "Maximum permitted correction to the predicted stress as a ratio of the "
46 "stress change to the predicted stress from the previous step's damage level. "
47 "Values less than 1 will improve robustness, but not be as accurate.");
48
49 params.addRangeCheckedParam<Real>(
50 "shear_retention_factor",
51 0.0,
52 "shear_retention_factor>=0 & shear_retention_factor<=1.0",
53 "Fraction of original shear stiffness to be retained after cracking");
54 params.set<std::vector<MaterialName>>("inelastic_models") = {};
55
56 MooseEnum crackedElasticityType("DIAGONAL FULL", "DIAGONAL");
57 crackedElasticityType.addDocumentation(
58 "DIAGONAL", "Zero out terms coupling with directions orthogonal to a crack (legacy)");
59 crackedElasticityType.addDocumentation(
60 "FULL", "Consistently scale all entries based on damage (recommended)");
61 params.addParam<MooseEnum>(
62 "cracked_elasticity_type",
63 crackedElasticityType,
64 "Method to modify the local elasticity tensor to account for cracking");
65
66 return params;
67}
68
71 _cracking_stress(coupledValue("cracking_stress")),
72 _max_cracks(getParam<unsigned int>("max_cracks")),
73 _cracking_neg_fraction(getParam<Real>("cracking_neg_fraction")),
74 _shear_retention_factor(getParam<Real>("shear_retention_factor")),
75 _max_stress_correction(getParam<Real>("max_stress_correction")),
76 _cracked_elasticity_type(
77 getParam<MooseEnum>("cracked_elasticity_type").getEnum<CrackedElasticityType>()),
78 _crack_damage(declareProperty<RealVectorValue>(_base_name + "crack_damage")),
79 _crack_damage_old(getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_damage")),
80 _crack_flags(declareProperty<RealVectorValue>(_base_name + "crack_flags")),
81 _crack_rotation(declareProperty<RankTwoTensor>(_base_name + "crack_rotation")),
82 _crack_rotation_old(getMaterialPropertyOld<RankTwoTensor>(_base_name + "crack_rotation")),
83 _crack_initiation_strain(
84 declareProperty<RealVectorValue>(_base_name + "crack_initiation_strain")),
85 _crack_initiation_strain_old(
86 getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_initiation_strain")),
87 _crack_max_strain(declareProperty<RealVectorValue>(_base_name + "crack_max_strain")),
88 _crack_max_strain_old(getMaterialPropertyOld<RealVectorValue>(_base_name + "crack_max_strain"))
89{
90 MultiMooseEnum prescribed_crack_directions =
91 getParam<MultiMooseEnum>("prescribed_crack_directions");
92 if (prescribed_crack_directions.size() > 0)
93 {
94 if (prescribed_crack_directions.size() > 3)
95 mooseError("A maximum of three crack directions may be specified");
96 for (unsigned int i = 0; i < prescribed_crack_directions.size(); ++i)
97 {
98 for (unsigned int j = 0; j < i; ++j)
99 if (prescribed_crack_directions[i] == prescribed_crack_directions[j])
100 mooseError("Entries in 'prescribed_crack_directions' cannot be repeated");
102 static_cast<unsigned int>(prescribed_crack_directions.get(i)));
103 }
104
105 // Fill in the last remaining direction if 2 are specified
106 if (_prescribed_crack_directions.size() == 2)
107 {
108 std::set<unsigned int> available_dirs = {0, 1, 2};
109 for (auto dir : _prescribed_crack_directions)
110 if (available_dirs.erase(dir) != 1)
111 mooseError("Invalid prescribed crack direction:" + Moose::stringify(dir));
112 if (available_dirs.size() != 1)
113 mooseError("Error in finding remaining available crack direction");
114 _prescribed_crack_directions.push_back(*available_dirs.begin());
115 }
116 }
117 if (!isParamSetByUser("cracked_elasticity_type"))
118 paramWarning(
119 "cracked_elasticity_type",
120 "Defaulting to the legacy option of 'DIAGONAL', but the 'FULL' option is preferred");
121
122 _local_elastic_vector.resize(9);
123}
124
125void
127{
129
130 _crack_damage[_qp] = 0.0;
131
132 _crack_initiation_strain[_qp] = 0.0;
133 _crack_max_strain[_qp](0) = 0.0;
134
135 switch (_prescribed_crack_directions.size())
136 {
137 case 0:
138 {
140 break;
141 }
142 case 1:
143 {
144 _crack_rotation[_qp].zero();
146 {
147 case 0:
148 {
149 _crack_rotation[_qp](0, 0) = 1.0;
150 _crack_rotation[_qp](1, 1) = 1.0;
151 _crack_rotation[_qp](2, 2) = 1.0;
152 break;
153 }
154 case 1:
155 {
156 _crack_rotation[_qp](1, 0) = 1.0;
157 _crack_rotation[_qp](0, 1) = 1.0;
158 _crack_rotation[_qp](2, 2) = 1.0;
159 break;
160 }
161 case 2:
162 {
163 _crack_rotation[_qp](2, 0) = 1.0;
164 _crack_rotation[_qp](0, 1) = 1.0;
165 _crack_rotation[_qp](1, 2) = 1.0;
166 break;
167 }
168 }
169 break;
170 }
171 case 2:
172 {
173 mooseError("Number of prescribed crack directions cannot be 2");
174 break;
175 }
176 case 3:
177 {
178 for (unsigned int i = 0; i < _prescribed_crack_directions.size(); ++i)
179 {
180 RealVectorValue crack_dir_vec;
181 crack_dir_vec(_prescribed_crack_directions[i]) = 1.0;
182 _crack_rotation[_qp].fillColumn(i, crack_dir_vec);
183 }
184 }
185 }
186}
187
188void
190{
192
194 mooseError("ComputeSmearedCrackingStress requires that the elasticity tensor be "
195 "guaranteed isotropic");
196
197 std::vector<MaterialName> soft_matls = getParam<std::vector<MaterialName>>("softening_models");
198 for (auto soft_matl : soft_matls)
199 {
201 dynamic_cast<SmearedCrackSofteningBase *>(&getMaterialByName(soft_matl));
202 if (scsb)
203 _softening_models.push_back(scsb);
204 else
205 paramError("softening_models", "Model " + soft_matl + " is not a softening model");
206 }
207 if (_softening_models.size() == 1)
208 {
209 // Reuse the same model in all 3 directions
212 }
213 else if (_softening_models.size() != 3)
214 paramError("softening_models", "Either 1 or 3 softening models must be specified");
215}
216
217void
219{
220 bool force_elasticity_rotation = false;
221
222 if (!previouslyCracked())
224 else
225 {
227
228 // Propagate behavior from the (now inactive) inelastic models
230 for (auto model : _models)
231 {
232 model->setQp(_qp);
233 model->propagateQpStatefulProperties();
234 }
235
236 // Since the other inelastic models are inactive, they will not limit the time step
237 _material_timestep_limit[_qp] = std::numeric_limits<Real>::max();
238
239 // update _local_elasticity_tensor based on cracking state in previous time step
241
242 // Calculate stress in intermediate configuration
244
246 force_elasticity_rotation = true;
247 }
248
249 // compute crack status and adjust stress
251
253 {
254 finiteStrainRotation(force_elasticity_rotation);
256 }
257}
258
259void
261{
262 const Real youngs_modulus =
264
265 bool cracking_locally_active = false;
266
267 const Real cracking_stress = _cracking_stress[_qp];
268
269 if (cracking_stress > 0)
270 {
271 RealVectorValue stiffness_ratio_local(1.0, 1.0, 1.0);
272 const RankTwoTensor & R = _crack_rotation_old[_qp];
274 ePrime.rotate(R.transpose());
275
276 for (unsigned int i = 0; i < 3; ++i)
277 {
278 // Update elasticity tensor based on crack status of the end of last time step
279 if (_crack_damage_old[_qp](i) > 0.0)
280 {
281 if (_cracking_neg_fraction == 0.0 && MooseUtils::absoluteFuzzyLessThan(ePrime(i, i), 0.0))
282 stiffness_ratio_local(i) = 1.0;
283 else if (_cracking_neg_fraction > 0.0 &&
284 ePrime(i, i) < _crack_initiation_strain_old[_qp](i) * _cracking_neg_fraction &&
286 {
287 const Real etr = _cracking_neg_fraction * _crack_initiation_strain_old[_qp](i);
288 const Real Eo = cracking_stress / _crack_initiation_strain_old[_qp](i);
289 const Real Ec = Eo * (1.0 - _crack_damage_old[_qp](i));
290 const Real a = (Ec - Eo) / (4 * etr);
291 const Real b = (Ec + Eo) / 2;
292 // Compute the ratio of the current transition stiffness to the original stiffness
293 stiffness_ratio_local(i) = (2.0 * a * etr + b) / Eo;
294 cracking_locally_active = true;
295 }
296 else
297 {
298 stiffness_ratio_local(i) = (1.0 - _crack_damage_old[_qp](i));
299 cracking_locally_active = true;
300 }
301 }
302 }
303
304 if (cracking_locally_active)
305 {
306 // Update the elasticity tensor in the crack coordinate system
308 {
309 const bool c0_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(0), 1.0);
310 const bool c1_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(1), 1.0);
311 const bool c2_coupled = MooseUtils::absoluteFuzzyEqual(stiffness_ratio_local(2), 1.0);
312
313 const Real c01 = (c0_coupled && c1_coupled ? 1.0 : 0.0);
314 const Real c02 = (c0_coupled && c2_coupled ? 1.0 : 0.0);
315 const Real c12 = (c1_coupled && c2_coupled ? 1.0 : 0.0);
316
317 const Real c01_shear_retention = (c0_coupled && c1_coupled ? 1.0 : _shear_retention_factor);
318 const Real c02_shear_retention = (c0_coupled && c2_coupled ? 1.0 : _shear_retention_factor);
319 const Real c12_shear_retention = (c1_coupled && c2_coupled ? 1.0 : _shear_retention_factor);
320
321 _local_elastic_vector[0] = (c0_coupled ? _elasticity_tensor[_qp](0, 0, 0, 0)
322 : stiffness_ratio_local(0) * youngs_modulus);
323 _local_elastic_vector[1] = _elasticity_tensor[_qp](0, 0, 1, 1) * c01;
324 _local_elastic_vector[2] = _elasticity_tensor[_qp](0, 0, 2, 2) * c02;
325 _local_elastic_vector[3] = (c1_coupled ? _elasticity_tensor[_qp](1, 1, 1, 1)
326 : stiffness_ratio_local(1) * youngs_modulus);
327 _local_elastic_vector[4] = _elasticity_tensor[_qp](1, 1, 2, 2) * c12;
328 _local_elastic_vector[5] = (c2_coupled ? _elasticity_tensor[_qp](2, 2, 2, 2)
329 : stiffness_ratio_local(2) * youngs_modulus);
330 _local_elastic_vector[6] = _elasticity_tensor[_qp](1, 2, 1, 2) * c12_shear_retention;
331 _local_elastic_vector[7] = _elasticity_tensor[_qp](0, 2, 0, 2) * c02_shear_retention;
332 _local_elastic_vector[8] = _elasticity_tensor[_qp](0, 1, 0, 1) * c01_shear_retention;
333 }
334 else // _cracked_elasticity_type == CrackedElasticityType::FULL
335 {
336 const Real & c0 = stiffness_ratio_local(0);
337 const Real & c1 = stiffness_ratio_local(1);
338 const Real & c2 = stiffness_ratio_local(2);
339
340 const Real c01 = c0 * c1;
341 const Real c02 = c0 * c2;
342 const Real c12 = c1 * c2;
343
344 const Real c01_shear_retention = std::max(c01, _shear_retention_factor);
345 const Real c02_shear_retention = std::max(c02, _shear_retention_factor);
346 const Real c12_shear_retention = std::max(c12, _shear_retention_factor);
347
348 _local_elastic_vector[0] = _elasticity_tensor[_qp](0, 0, 0, 0) * c0;
349 _local_elastic_vector[1] = _elasticity_tensor[_qp](0, 0, 1, 1) * c01;
350 _local_elastic_vector[2] = _elasticity_tensor[_qp](0, 0, 2, 2) * c02;
351 _local_elastic_vector[3] = _elasticity_tensor[_qp](1, 1, 1, 1) * c1;
352 _local_elastic_vector[4] = _elasticity_tensor[_qp](1, 1, 2, 2) * c12;
353 _local_elastic_vector[5] = _elasticity_tensor[_qp](2, 2, 2, 2) * c2;
354 _local_elastic_vector[6] = _elasticity_tensor[_qp](1, 2, 1, 2) * c12_shear_retention;
355 _local_elastic_vector[7] = _elasticity_tensor[_qp](0, 2, 0, 2) * c02_shear_retention;
356 _local_elastic_vector[8] = _elasticity_tensor[_qp](0, 1, 0, 1) * c01_shear_retention;
357 }
358
359 // Filling with 9 components is sufficient because these are the only nonzero entries
360 // for isotropic or orthotropic materials.
363
364 // Rotate the modified elasticity tensor back into global coordinates
366 }
367 }
368 if (!cracking_locally_active)
370}
371
372void
374{
375 const Real youngs_modulus =
377
378 const Real poissons_ratio =
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 {
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 mooseAssert(_softening_models.size() == 3, "Must have 3 softening models");
421 for (unsigned int i = 0; i < 3; ++i)
422 {
423 sigma(i) = sigmaPrime(i, i);
424
425 Real stiffness_ratio = 1.0 - _crack_damage[_qp](i);
426
427 const bool pre_existing_crack = (_crack_damage_old[_qp](i) > 0.0);
428 const bool met_stress_criterion = (sigma(i) > cracking_stress);
429 const bool loading_existing_crack = (strain_in_crack_dir(i) >= _crack_max_strain[_qp](i));
430 const bool allowed_to_crack = (pre_existing_crack || num_cracks < _max_cracks);
431 bool new_crack = false;
432
433 cracked |= pre_existing_crack;
434
435 // Adjustments for newly created cracks
436 if (met_stress_criterion && !pre_existing_crack && allowed_to_crack)
437 {
438 new_crack = true;
439 ++num_cracks;
440
441 // Assume Poisson's ratio drops to zero for this direction. Stiffness is then Young's
442 // modulus.
443 _crack_initiation_strain[_qp](i) = cracking_stress / youngs_modulus;
444
445 if (_crack_max_strain[_qp](i) < _crack_initiation_strain[_qp](i))
447 }
448
449 // Update stress and stiffness ratio according to specified crack release model
450 if (new_crack || (pre_existing_crack && loading_existing_crack))
451 {
452 cracked = true;
453 _softening_models[i]->computeCrackingRelease(sigma(i),
454 stiffness_ratio,
455 strain_in_crack_dir(i),
457 _crack_max_strain[_qp](i),
458 cracking_stress,
459 youngs_modulus,
460 poissons_ratio);
461 _crack_damage[_qp](i) = 1.0 - stiffness_ratio;
462 }
463
464 else if (cracked && _cracking_neg_fraction > 0 &&
465 _crack_initiation_strain[_qp](i) * _cracking_neg_fraction > strain_in_crack_dir(i) &&
466 -_crack_initiation_strain[_qp](i) * _cracking_neg_fraction < strain_in_crack_dir(i))
467 {
468 const Real etr = _cracking_neg_fraction * _crack_initiation_strain[_qp](i);
469 const Real Eo = cracking_stress / _crack_initiation_strain[_qp](i);
470 const Real Ec = Eo * (1.0 - _crack_damage_old[_qp](i));
471 const Real a = (Ec - Eo) / (4.0 * etr);
472 const Real b = 0.5 * (Ec + Eo);
473 const Real c = 0.25 * (Ec - Eo) * etr;
474 sigma(i) = (a * strain_in_crack_dir(i) + b) * strain_in_crack_dir(i) + c;
475 }
476 }
477
478 if (cracked)
480 }
481
482 _crack_flags[_qp](0) = 1.0 - _crack_damage[_qp](2);
483 _crack_flags[_qp](1) = 1.0 - _crack_damage[_qp](1);
484 _crack_flags[_qp](2) = 1.0 - _crack_damage[_qp](0);
485}
486
487void
489 RealVectorValue & strain_in_crack_dir)
490{
491 // The rotation tensor is ordered such that directions for pre-existing cracks appear first
492 // in the list of columns. For example, if there is one existing crack, its direction is in the
493 // first column in the rotation tensor.
494 const unsigned int num_known_dirs = getNumKnownCrackDirs();
495
496 if (num_known_dirs == 0)
497 {
498 std::vector<Real> eigval(3, 0.0);
499 RankTwoTensor eigvec;
500
502
503 // If the elastic strain is beyond the cracking strain, save the eigen vectors as
504 // the rotation tensor. Reverse their order so that the third principal strain
505 // (most tensile) will correspond to the first crack.
506 _crack_rotation[_qp].fillColumn(0, eigvec.column(2));
507 _crack_rotation[_qp].fillColumn(1, eigvec.column(1));
508 _crack_rotation[_qp].fillColumn(2, eigvec.column(0));
509
510 strain_in_crack_dir(0) = eigval[2];
511 strain_in_crack_dir(1) = eigval[1];
512 strain_in_crack_dir(2) = eigval[0];
513 }
514 else if (num_known_dirs == 1)
515 {
516 // This is easily the most complicated case.
517 // 1. Rotate the elastic strain to the orientation associated with the known
518 // crack.
519 // 2. Extract the lower 2x2 block into a separate tensor.
520 // 3. Run the eigen solver on the result.
521 // 4. Update the rotation tensor to reflect the effect of the 2 eigenvectors.
522
523 // 1.
524 const RankTwoTensor & R = _crack_rotation[_qp];
525 RankTwoTensor ePrime(_elastic_strain[_qp]);
526 ePrime.rotate(R.transpose()); // elastic strain in crack coordinates
527
528 // 2.
529 ColumnMajorMatrix e2x2(2, 2);
530 e2x2(0, 0) = ePrime(1, 1);
531 e2x2(1, 0) = ePrime(2, 1);
532 e2x2(0, 1) = ePrime(1, 2);
533 e2x2(1, 1) = ePrime(2, 2);
534
535 // 3.
536 ColumnMajorMatrix e_val2x1(2, 1);
537 ColumnMajorMatrix e_vec2x2(2, 2);
538 e2x2.eigen(e_val2x1, e_vec2x2);
539
540 // 4.
541 RankTwoTensor eigvec(
542 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));
543
544 _crack_rotation[_qp] = _crack_rotation_old[_qp] * eigvec; // Roe implementation
545
546 strain_in_crack_dir(0) = ePrime(0, 0);
547 strain_in_crack_dir(1) = e_val2x1(1, 0);
548 strain_in_crack_dir(2) = e_val2x1(0, 0);
549 }
550 else if (num_known_dirs == 2 || num_known_dirs == 3)
551 {
552 // Rotate to cracked orientation and pick off the strains in the rotated
553 // coordinate directions.
554 const RankTwoTensor & R = _crack_rotation[_qp];
555 RankTwoTensor ePrime(_elastic_strain[_qp]);
556 ePrime.rotate(R.transpose()); // elastic strain in crack coordinates
557
558 strain_in_crack_dir(0) = ePrime(0, 0);
559 strain_in_crack_dir(1) = ePrime(1, 1);
560 strain_in_crack_dir(2) = ePrime(2, 2);
561 }
562 else
563 mooseError("Invalid number of known crack directions");
564}
565
566unsigned int
568{
569 unsigned int num_known_dirs = 0;
570 for (unsigned int i = 0; i < 3; ++i)
571 {
572 if (_crack_damage_old[_qp](i) > 0.0 || _prescribed_crack_directions.size() >= i + 1)
573 ++num_known_dirs;
574 }
575 return num_known_dirs;
576}
577
578void
580 const RealVectorValue & sigma)
581{
582 // Get transformation matrix
583 const RankTwoTensor & R = _crack_rotation[_qp];
584 // Rotate to crack frame
585 tensor.rotate(R.transpose());
586
587 // Reset stress if cracked
588 for (unsigned int i = 0; i < 3; ++i)
589 if (_crack_damage[_qp](i) > 0.0)
590 {
591 const Real stress_correction_ratio = (tensor(i, i) - sigma(i)) / tensor(i, i);
592 if (stress_correction_ratio > _max_stress_correction)
593 tensor(i, i) *= (1.0 - _max_stress_correction);
594 else if (stress_correction_ratio < -_max_stress_correction)
595 tensor(i, i) *= (1.0 + _max_stress_correction);
596 else
597 tensor(i, i) = sigma(i);
598 }
599
600 // Rotate back to global frame
601 tensor.rotate(R);
602}
603
604bool
606{
607 for (unsigned int i = 0; i < 3; ++i)
608 if (_crack_damage_old[_qp](i) > 0.0)
609 return true;
610 return false;
611}
registerMooseObject("SolidMechanicsApp", ComputeSmearedCrackingStress)
const double R
const PertinentGeochemicalSystem model(database, {"H2O", "H+", "HCO3-", "O2(aq)", "Ca++", ">(s)FeOH", "radius_neg1", "radius_neg1.5"}, {"Calcite"}, {}, {"Calcite_asdf"}, {"CH4(aq)"}, {">(s)FeOCa+"}, "O2(aq)", "e-")
void mooseError(Args &&... args)
void ErrorVector unsigned int
void eigen(ColumnMajorMatrixTempl< T > &eval, ColumnMajorMatrixTempl< T > &evec) const
const std::string _elasticity_tensor_name
Name of the elasticity tensor material property.
const MaterialProperty< RankTwoTensor > & _rotation_increment
Rotation increment material property.
const MaterialProperty< RankFourTensor > & _elasticity_tensor
Elasticity tensor material property.
MaterialProperty< RankFourTensor > & _Jacobian_mult
derivative of stress w.r.t. strain (_dstress_dstrain)
MaterialProperty< RankTwoTensor > & _elastic_strain
Elastic strain material property.
MaterialProperty< RankTwoTensor > & _stress
Stress material property.
virtual void finiteStrainRotation(const bool force_elasticity_rotation=false)
Rotate _elastic_strain, _stress, _inelastic_strain, and _Jacobian_mult to the new configuration.
const MaterialProperty< RankTwoTensor > & _strain_increment
const bool _perform_finite_strain_rotations
after updateQpState, rotate the stress, elastic_strain, inelastic_strain and Jacobian_mult using _rot...
std::vector< StressUpdateBase * > _models
The user supplied list of inelastic models to use in the simulation.
MaterialProperty< RankTwoTensor > & _inelastic_strain
The sum of the inelastic strains that come from the plastic models.
virtual void computeQpStressIntermediateConfiguration()
Compute the stress for the current QP, but do not rotate tensors from the intermediate configuration ...
const MaterialProperty< RankTwoTensor > & _inelastic_strain_old
old value of inelastic strain
const MaterialProperty< RankTwoTensor > & _elastic_strain_old
Strain tensors.
ComputeMultipleInelasticStress computes the stress, the consistent tangent operator (or an approximat...
ComputeSmearedCrackingStress computes the stress for a finite strain material with smeared cracking.
const Real _cracking_neg_fraction
Defines transition to changed stiffness during unloading.
const VariableValue & _cracking_stress
Input parameters for smeared crack models.
virtual void updateCrackingStateAndStress()
Update all cracking-related state variables and the stress tensor due to cracking in all directions.
void updateLocalElasticityTensor()
Update the local elasticity tensor (_local_elasticity_tensor) due to the effects of cracking.
ComputeSmearedCrackingStress(const InputParameters &parameters)
virtual void computeQpStress() override
Compute the stress and store it in the _stress material property for the current quadrature point.
MaterialProperty< RealVectorValue > & _crack_max_strain
std::vector< unsigned int > _prescribed_crack_directions
User-prescribed cracking directions.
const MaterialProperty< RealVectorValue > & _crack_initiation_strain_old
MaterialProperty< RealVectorValue > & _crack_damage
std::vector< SmearedCrackSofteningBase * > _softening_models
The user-supplied list of softening models to be used in the 3 crack directions.
std::vector< Real > _local_elastic_vector
Vector helper to update local elasticity tensor.
virtual void initQpStatefulProperties() override
const MaterialProperty< RealVectorValue > & _crack_damage_old
MaterialProperty< RankTwoTensor > & _crack_rotation
const unsigned int _max_cracks
Maximum number of cracks permitted at a material point.
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...
bool previouslyCracked()
Check to see whether there was cracking in any diretion in the previous time step.
MaterialProperty< RealVectorValue > & _crack_initiation_strain
const MaterialProperty< RankTwoTensor > & _crack_rotation_old
MaterialProperty< RealVectorValue > & _crack_flags
Vector of values going from 1 to 0 as crack damage accumulates.
void computeCrackStrainAndOrientation(RealVectorValue &strain_in_crack_dir)
Compute the crack strain in the crack coordinate system.
virtual unsigned int getNumKnownCrackDirs() const
Get the number of known crack directions.
CrackedElasticityType
Enum defining the method used to adjust the elasticity tensor for cracking.
const Real _shear_retention_factor
Controls the amount of shear retained.
const MaterialProperty< RealVectorValue > & _crack_max_strain_old
enum ComputeSmearedCrackingStress::CrackedElasticityType _cracked_elasticity_type
const Real _max_stress_correction
Controls the maximum amount that the damaged elastic stress is corrected to folow the release model d...
bool hasGuaranteedMaterialProperty(const MaterialPropertyName &prop, Guarantee guarantee)
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
virtual unsigned int size() const override final
void addDocumentation(const std::string &name, const std::string &doc)
unsigned int get(unsigned int i) const
unsigned int size() const
void fillFromInputVector(const std::vector< T > &input, FillMethod fill_method)
void rotate(const TypeTensor< T > &R)
void rotate(const RankTwoTensorTempl< T > &R)
libMesh::VectorValue< T > column(const unsigned int i) const
void symmetricEigenvaluesEigenvectors(std::vector< T > &eigvals, RankTwoTensorTempl< T > &eigvecs) const
static RankTwoTensorTempl Identity()
SmearedCrackSofteningBase is the base class for a set of models that define the softening behavior of...
T getIsotropicYoungsModulus(const RankFourTensorTempl< T > &elasticity_tensor)
Get the Young's modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must b...
T getIsotropicPoissonsRatio(const RankFourTensorTempl< T > &elasticity_tensor)
Get the Poisson's modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must...
std::string stringify(const T &t)