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 "ComputeIncrementalSmallStrain.h" 11 : #include "Assembly.h" 12 : #include "libmesh/quadrature.h" 13 : 14 : registerMooseObject("TensorMechanicsApp", ComputeIncrementalSmallStrain); 15 : 16 : InputParameters 17 2952 : ComputeIncrementalSmallStrain::validParams() 18 : { 19 2952 : InputParameters params = ComputeIncrementalStrainBase::validParams(); 20 2952 : params.addClassDescription( 21 : "Compute a strain increment and rotation increment for small strains."); 22 2952 : return params; 23 0 : } 24 : 25 2214 : ComputeIncrementalSmallStrain::ComputeIncrementalSmallStrain(const InputParameters & parameters) 26 2214 : : ComputeIncrementalStrainBase(parameters) 27 : { 28 2214 : } 29 : 30 : void 31 560694 : ComputeIncrementalSmallStrain::computeProperties() 32 : { 33 : Real volumetric_strain = 0.0; 34 3598584 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 35 : { 36 3037890 : RankTwoTensor total_strain_increment; 37 3037890 : computeTotalStrainIncrement(total_strain_increment); 38 : 39 3037890 : _strain_increment[_qp] = total_strain_increment; 40 : 41 3037890 : if (_volumetric_locking_correction) 42 216968 : volumetric_strain += total_strain_increment.trace() * _JxW[_qp] * _coord[_qp]; 43 : } 44 560694 : if (_volumetric_locking_correction) 45 54092 : volumetric_strain /= _current_elem_volume; 46 : 47 3598584 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 48 : { 49 3037890 : Real trace = _strain_increment[_qp].trace(); 50 3037890 : if (_volumetric_locking_correction) 51 : { 52 216968 : _strain_increment[_qp](0, 0) += (volumetric_strain - trace) / 3.0; 53 216968 : _strain_increment[_qp](1, 1) += (volumetric_strain - trace) / 3.0; 54 216968 : _strain_increment[_qp](2, 2) += (volumetric_strain - trace) / 3.0; 55 : } 56 : 57 3037890 : _total_strain[_qp] = _total_strain_old[_qp] + _strain_increment[_qp]; 58 : 59 : // Remove the Eigen strain increment 60 3037890 : subtractEigenstrainIncrementFromStrain(_strain_increment[_qp]); 61 : 62 : // strain rate 63 3037890 : if (_dt > 0) 64 3028270 : _strain_rate[_qp] = _strain_increment[_qp] / _dt; 65 : else 66 9620 : _strain_rate[_qp].zero(); 67 : 68 : // Update strain in intermediate configuration: rotations are not needed 69 3037890 : _mechanical_strain[_qp] = _mechanical_strain_old[_qp] + _strain_increment[_qp]; 70 : 71 : // incremental small strain does not include rotation 72 3037890 : _rotation_increment[_qp].setToIdentity(); 73 : } 74 560694 : } 75 : 76 : void 77 2918786 : ComputeIncrementalSmallStrain::computeTotalStrainIncrement(RankTwoTensor & total_strain_increment) 78 : { 79 : // Deformation gradient 80 : auto A = RankTwoTensor::initializeFromRows( 81 2918786 : (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); 82 : 83 : // Old Deformation gradient 84 : auto Fbar = RankTwoTensor ::initializeFromRows( 85 2918786 : (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); 86 : 87 2918786 : _deformation_gradient[_qp] = A; 88 2918786 : _deformation_gradient[_qp].addIa(1.0); 89 : 90 2918786 : A -= Fbar; // A = grad_disp - grad_disp_old 91 : 92 2918786 : total_strain_increment = 0.5 * (A + A.transpose()); 93 2918786 : }