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 "EigenDecompositionMaterial.h" 11 : #include "RankTwoTensor.h" 12 : 13 : registerMooseObject("SolidMechanicsApp", EigenDecompositionMaterial); 14 : registerMooseObject("SolidMechanicsApp", ADEigenDecompositionMaterial); 15 : 16 : template <bool is_ad> 17 : InputParameters 18 108 : EigenDecompositionMaterialTempl<is_ad>::validParams() 19 : { 20 108 : InputParameters params = Material::validParams(); 21 108 : params.addClassDescription("Emits material properties for the eigenvalues and eigenvectors of a " 22 : "symmetric rank two tensor."); 23 216 : params.addRequiredParam<MaterialPropertyName>( 24 : "rank_two_tensor", 25 : "The name of the symmetric rank two tensor to used in eigen decomposition."); 26 216 : params.addParam<std::string>( 27 : "base_name", 28 : "Optional parameter to allow multiple tensors to be decomposed on the same block."); 29 108 : return params; 30 0 : } 31 : 32 : template <bool is_ad> 33 81 : EigenDecompositionMaterialTempl<is_ad>::EigenDecompositionMaterialTempl( 34 : const InputParameters & parameters) 35 : : Material(parameters), 36 147 : _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""), 37 81 : _tensor(getGenericMaterialProperty<RankTwoTensor, is_ad>("rank_two_tensor")), 38 81 : _max_eigen_vector( 39 81 : declareGenericProperty<RealVectorValue, is_ad>(_base_name + "max_eigen_vector")), 40 81 : _mid_eigen_vector( 41 81 : declareGenericProperty<RealVectorValue, is_ad>(_base_name + "mid_eigen_vector")), 42 81 : _min_eigen_vector( 43 81 : declareGenericProperty<RealVectorValue, is_ad>(_base_name + "min_eigen_vector")), 44 162 : _max_eigen_value(declareGenericProperty<Real, is_ad>(_base_name + "max_eigen_value")), 45 162 : _mid_eigen_value(declareGenericProperty<Real, is_ad>(_base_name + "mid_eigen_value")), 46 243 : _min_eigen_value(declareGenericProperty<Real, is_ad>(_base_name + "min_eigen_value")) 47 : { 48 : if (LIBMESH_DIM != 3) 49 : mooseError("EigenDecompositionMaterial is only defined for LIBMESH_DIM=3"); 50 81 : } 51 : 52 : template <bool is_ad> 53 : void 54 2420 : EigenDecompositionMaterialTempl<is_ad>::computeQpProperties() 55 : { 56 : 57 2420 : if (!_tensor[_qp].isSymmetric()) 58 2 : mooseError("EigenDecompositionMaterial will only operate on symmetric rank two tensors."); 59 : 60 2418 : std::vector<GenericReal<is_ad>> eigval(3, 0.0); 61 2418 : GenericRankTwoTensor<is_ad> eigvec; 62 : 63 2418 : _tensor[_qp].symmetricEigenvaluesEigenvectors(eigval, eigvec); 64 : 65 2418 : _max_eigen_vector[_qp] = eigvec.column(2); 66 2418 : _mid_eigen_vector[_qp] = eigvec.column(1); 67 2418 : _min_eigen_vector[_qp] = eigvec.column(0); 68 : 69 2418 : _max_eigen_value[_qp] = eigval[2]; 70 2418 : _mid_eigen_value[_qp] = eigval[1]; 71 2418 : _min_eigen_value[_qp] = eigval[0]; 72 2418 : }