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 "ADComputeStrainBase.h" 11 : #include "RankTwoTensor.h" 12 : #include "SymmetricRankTwoTensor.h" 13 : #include "MooseMesh.h" 14 : #include "Assembly.h" 15 : 16 : template <typename R2> 17 : InputParameters 18 6080 : ADComputeStrainBaseTempl<R2>::validParams() 19 : { 20 6080 : InputParameters params = Material::validParams(); 21 12160 : params.addRequiredCoupledVar( 22 : "displacements", 23 : "The displacements appropriate for the simulation geometry and coordinate system"); 24 12160 : params.addParam<std::string>("base_name", 25 : "Optional parameter that allows the user to define " 26 : "multiple mechanics material systems on the same " 27 : "block, i.e. for multiple phases"); 28 12160 : params.addParam<bool>( 29 12160 : "volumetric_locking_correction", false, "Flag to correct volumetric locking"); 30 12160 : params.addParam<std::vector<MaterialPropertyName>>( 31 : "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); 32 12160 : params.addParam<MaterialPropertyName>("global_strain", 33 : "Optional material property holding a global strain " 34 : "tensor applied to the mesh as a whole"); 35 6080 : params.suppressParameter<bool>("use_displaced_mesh"); 36 6080 : return params; 37 0 : } 38 : 39 : template <typename R2> 40 4560 : ADComputeStrainBaseTempl<R2>::ADComputeStrainBaseTempl(const InputParameters & parameters) 41 : : Material(parameters), 42 4560 : _ndisp(coupledComponents("displacements")), 43 4560 : _disp(adCoupledValues("displacements")), 44 4560 : _grad_disp(adCoupledGradients("displacements")), 45 9276 : _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""), 46 4560 : _mechanical_strain(declareADProperty<R2>(_base_name + "mechanical_strain")), 47 4560 : _total_strain(declareADProperty<R2>(_base_name + "total_strain")), 48 9120 : _eigenstrain_names(getParam<std::vector<MaterialPropertyName>>("eigenstrain_names")), 49 4560 : _eigenstrains(_eigenstrain_names.size()), 50 4560 : _global_strain(isParamValid("global_strain") 51 4560 : ? &getADMaterialProperty<R2>(_base_name + "global_strain") 52 : : nullptr), 53 13510 : _volumetric_locking_correction(getParam<bool>("volumetric_locking_correction") && 54 : !this->isBoundaryMaterial()), 55 9120 : _current_elem_volume(_assembly.elemVolume()) 56 : { 57 : // set unused dimensions to zero 58 6852 : for (unsigned i = _ndisp; i < 3; ++i) 59 : { 60 2292 : _disp.push_back(&_ad_zero); 61 2292 : _grad_disp.push_back(&_ad_grad_zero); 62 : } 63 : 64 5082 : for (unsigned int i = 0; i < _eigenstrains.size(); ++i) 65 : { 66 1044 : _eigenstrain_names[i] = _base_name + _eigenstrain_names[i]; 67 522 : _eigenstrains[i] = &getADMaterialProperty<R2>(_eigenstrain_names[i]); 68 : } 69 : 70 4560 : if (_ndisp == 1 && _volumetric_locking_correction) 71 0 : paramError("volumetric_locking_correction", "has to be set to false for 1-D problems."); 72 : 73 9120 : if (getParam<bool>("use_displaced_mesh")) 74 0 : paramError("use_displaced_mesh", "The strain calculator needs to run on the undisplaced mesh."); 75 4560 : } 76 : 77 : template <typename R2> 78 : void 79 1107 : ADComputeStrainBaseTempl<R2>::initialSetup() 80 : { 81 4023 : displacementIntegrityCheck(); 82 1107 : } 83 : 84 : template <typename R2> 85 : void 86 3963 : ADComputeStrainBaseTempl<R2>::displacementIntegrityCheck() 87 : { 88 : // Checking for consistency between mesh size and length of the provided displacements vector 89 3963 : if (_ndisp != _mesh.dimension()) 90 0 : paramError( 91 : "displacements", 92 : "The number of variables supplied in 'displacements' must match the mesh dimension."); 93 3963 : } 94 : 95 : template <typename R2> 96 : void 97 832 : ADComputeStrainBaseTempl<R2>::initQpStatefulProperties() 98 : { 99 832 : _mechanical_strain[_qp].zero(); 100 832 : _total_strain[_qp].zero(); 101 832 : } 102 : 103 : template class ADComputeStrainBaseTempl<RankTwoTensor>; 104 : template class ADComputeStrainBaseTempl<SymmetricRankTwoTensor>;