Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://www.mooseframework.org 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 "ADComputeIncrementalSmallStrain.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("TensorMechanicsApp", ADComputeIncrementalSmallStrain); 19 : registerMooseObject("TensorMechanicsApp", ADSymmetricIncrementalSmallStrain); 20 : 21 : template <typename R2> 22 : InputParameters 23 468 : ADComputeIncrementalSmallStrainTempl<R2>::validParams() 24 : { 25 : InputParameters params = ADComputeIncrementalStrainBase::validParams(); 26 468 : params.addClassDescription( 27 : "Compute a strain increment and rotation increment for small strains."); 28 468 : return params; 29 0 : } 30 : 31 : template <typename R2> 32 351 : ADComputeIncrementalSmallStrainTempl<R2>::ADComputeIncrementalSmallStrainTempl( 33 : const InputParameters & parameters) 34 351 : : ADComputeIncrementalStrainBaseTempl<R2>(parameters) 35 : { 36 351 : } 37 : 38 : template <typename R2> 39 : void 40 242844 : ADComputeIncrementalSmallStrainTempl<R2>::computeProperties() 41 : { 42 242844 : ADReal volumetric_strain = 0.0; 43 2297242 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 44 : { 45 2054398 : ADR2 total_strain_increment; 46 2054398 : computeTotalStrainIncrement(total_strain_increment); 47 : 48 2054398 : _strain_increment[_qp] = total_strain_increment; 49 : 50 2054398 : if (_volumetric_locking_correction) 51 0 : volumetric_strain += total_strain_increment.trace() * _JxW[_qp] * _coord[_qp]; 52 : } 53 : 54 242844 : if (_volumetric_locking_correction) 55 0 : volumetric_strain /= _current_elem_volume; 56 : 57 2297242 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 58 : { 59 2054398 : if (_volumetric_locking_correction) 60 : { 61 0 : const auto correction = (volumetric_strain - _strain_increment[_qp].trace()) / 3.0; 62 0 : _strain_increment[_qp].addIa(correction); 63 : } 64 : 65 2054398 : _total_strain[_qp] = _strain_increment[_qp] + _total_strain_old[_qp]; 66 : 67 : // Remove the Eigen strain increment 68 2054398 : this->subtractEigenstrainIncrementFromStrain(_strain_increment[_qp]); 69 : 70 : // strain rate 71 2054398 : if (_dt > 0) 72 2051886 : _strain_rate[_qp] = _strain_increment[_qp] / _dt; 73 : else 74 2512 : _strain_rate[_qp].zero(); 75 : 76 : // Update strain in intermediate configuration: rotations are not needed 77 2054398 : _mechanical_strain[_qp] = _strain_increment[_qp] + _mechanical_strain_old[_qp]; 78 : 79 : // incremental small strain does not include rotation 80 2054398 : _rotation_increment[_qp].setToIdentity(); 81 : } 82 242844 : } 83 : 84 : template <typename R2> 85 : void 86 1994860 : ADComputeIncrementalSmallStrainTempl<R2>::computeTotalStrainIncrement(ADR2 & total_strain_increment) 87 : { 88 : // Deformation gradient (symmetrized) 89 1994860 : const auto A = ADR2::initializeSymmetric( 90 1994860 : (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); 91 : // Old Deformation gradient (symmetrized) 92 1994860 : const auto Fbar = ADR2::initializeSymmetric( 93 1994860 : (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); 94 : 95 1994860 : total_strain_increment = A - Fbar; 96 1994860 : } 97 : 98 : template class ADComputeIncrementalSmallStrainTempl<RankTwoTensor>; 99 : template class ADComputeIncrementalSmallStrainTempl<SymmetricRankTwoTensor>;