Line data Source code
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 : 10 : #include "ADComputeIncrementalStrain.h" 11 : #include "RankTwoTensor.h" 12 : #include "RankFourTensor.h" 13 : #include "SymmetricRankTwoTensor.h" 14 : #include "SymmetricRankFourTensor.h" 15 : 16 : #include "libmesh/quadrature.h" 17 : 18 : registerMooseObject("SolidMechanicsApp", ADComputeIncrementalStrain); 19 : registerMooseObjectRenamed("SolidMechanicsApp", 20 : ADComputeIncrementalSmallStrain, 21 : "06/30/2025 24:00", 22 : ADComputeIncrementalStrain); 23 : 24 : template <typename R2> 25 : InputParameters 26 936 : ADComputeIncrementalStrainTempl<R2>::validParams() 27 : { 28 : InputParameters params = ADComputeIncrementalStrainBase::validParams(); 29 936 : params.addClassDescription( 30 : "Compute a strain increment and rotation increment for small strains."); 31 936 : return params; 32 0 : } 33 : 34 : template <typename R2> 35 702 : ADComputeIncrementalStrainTempl<R2>::ADComputeIncrementalStrainTempl( 36 : const InputParameters & parameters) 37 702 : : ADComputeIncrementalStrainBaseTempl<R2>(parameters) 38 : { 39 702 : } 40 : 41 : template <typename R2> 42 : void 43 479186 : ADComputeIncrementalStrainTempl<R2>::computeProperties() 44 : { 45 479186 : ADReal volumetric_strain = 0.0; 46 4535510 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 47 : { 48 4056324 : ADR2 total_strain_increment; 49 4056324 : computeTotalStrainIncrement(total_strain_increment); 50 : 51 4056324 : _strain_increment[_qp] = total_strain_increment; 52 : 53 4056324 : if (_volumetric_locking_correction) 54 0 : volumetric_strain += total_strain_increment.trace() * _JxW[_qp] * _coord[_qp]; 55 : } 56 : 57 479186 : if (_volumetric_locking_correction) 58 0 : volumetric_strain /= _current_elem_volume; 59 : 60 4535510 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 61 : { 62 4056324 : if (_volumetric_locking_correction) 63 : { 64 0 : const auto correction = (volumetric_strain - _strain_increment[_qp].trace()) / 3.0; 65 0 : _strain_increment[_qp].addIa(correction); 66 : } 67 : 68 4056324 : _total_strain[_qp] = _strain_increment[_qp] + _total_strain_old[_qp]; 69 : 70 : // Remove the Eigen strain increment 71 4056324 : this->subtractEigenstrainIncrementFromStrain(_strain_increment[_qp]); 72 : 73 : // strain rate 74 4056324 : if (_dt > 0) 75 4051300 : _strain_rate[_qp] = _strain_increment[_qp] / _dt; 76 : else 77 5024 : _strain_rate[_qp].zero(); 78 : 79 : // Update strain in intermediate configuration: rotations are not needed 80 4056324 : _mechanical_strain[_qp] = _strain_increment[_qp] + _mechanical_strain_old[_qp]; 81 : 82 : // incremental small strain does not include rotation 83 4056324 : _rotation_increment[_qp].setToIdentity(); 84 : } 85 479186 : } 86 : 87 : template <typename R2> 88 : void 89 3942504 : ADComputeIncrementalStrainTempl<R2>::computeTotalStrainIncrement(ADR2 & total_strain_increment) 90 : { 91 : // Deformation gradient (symmetrized) 92 3942504 : const auto A = ADR2::initializeSymmetric( 93 3942504 : (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); 94 : // Old Deformation gradient (symmetrized) 95 3942504 : const auto Fbar = ADR2::initializeSymmetric( 96 3942504 : (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); 97 : 98 3942504 : total_strain_increment = A - Fbar; 99 3942504 : } 100 : 101 : template class ADComputeIncrementalStrainTempl<RankTwoTensor>; 102 : template class ADComputeIncrementalStrainTempl<SymmetricRankTwoTensor>;