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 "LagrangianStressDivergenceBase.h" 11 : 12 : InputParameters 13 6352 : LagrangianStressDivergenceBase::validParams() 14 : { 15 6352 : InputParameters params = KernelScalarBase::validParams(); 16 : 17 12704 : params.addRequiredParam<unsigned int>("component", "Which direction this kernel acts in"); 18 12704 : params.addRequiredCoupledVar("displacements", "The displacement components"); 19 : 20 12704 : params.addParam<bool>("large_kinematics", false, "Use large displacement kinematics"); 21 12704 : params.addParam<bool>("stabilize_strain", false, "Average the volumetric strains"); 22 : 23 12704 : params.addParam<std::string>("base_name", "Material property base name"); 24 : 25 12704 : params.addCoupledVar("temperature", 26 : "The name of the temperature variable used in the " 27 : "ComputeThermalExpansionEigenstrain. (Not required for " 28 : "simulations without temperature coupling.)"); 29 : 30 12704 : params.addParam<std::vector<MaterialPropertyName>>( 31 : "eigenstrain_names", 32 : {}, 33 : "List of eigenstrains used in the strain calculation. Used for computing their derivatives " 34 : "for off-diagonal Jacobian terms."); 35 : 36 12704 : params.addCoupledVar("out_of_plane_strain", 37 : "The out-of-plane strain variable for weak plane stress formulation."); 38 : 39 6352 : return params; 40 0 : } 41 : 42 3176 : LagrangianStressDivergenceBase::LagrangianStressDivergenceBase(const InputParameters & parameters) 43 : : JvarMapKernelInterface<DerivativeMaterialInterface<KernelScalarBase>>(parameters), 44 3176 : _large_kinematics(getParam<bool>("large_kinematics")), 45 6352 : _stabilize_strain(getParam<bool>("stabilize_strain")), 46 6436 : _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""), 47 6352 : _alpha(getParam<unsigned int>("component")), 48 3176 : _ndisp(coupledComponents("displacements")), 49 3176 : _disp_nums(_ndisp), 50 3176 : _avg_grad_trial(_ndisp), 51 3176 : _F_ust( 52 3176 : getMaterialPropertyByName<RankTwoTensor>(_base_name + "unstabilized_deformation_gradient")), 53 6352 : _F_avg(getMaterialPropertyByName<RankTwoTensor>(_base_name + "average_deformation_gradient")), 54 6352 : _f_inv(getMaterialPropertyByName<RankTwoTensor>(_base_name + 55 : "inverse_incremental_deformation_gradient")), 56 6352 : _F_inv(getMaterialPropertyByName<RankTwoTensor>(_base_name + "inverse_deformation_gradient")), 57 6352 : _F(getMaterialPropertyByName<RankTwoTensor>(_base_name + "deformation_gradient")), 58 3380 : _temperature(isCoupled("temperature") ? getVar("temperature", 0) : nullptr), 59 3238 : _out_of_plane_strain(isCoupled("out_of_plane_strain") ? getVar("out_of_plane_strain", 0) 60 3176 : : nullptr) 61 : { 62 : // Do the vector coupling of the displacements 63 11411 : for (unsigned int i = 0; i < _ndisp; i++) 64 8235 : _disp_nums[i] = coupled("displacements", i); 65 : 66 : // We need to use identical discretizations for all displacement components 67 3176 : auto order_x = getVar("displacements", 0)->order(); 68 8235 : for (unsigned int i = 1; i < _ndisp; i++) 69 : { 70 10118 : if (getVar("displacements", i)->order() != order_x) 71 0 : mooseError("The Lagrangian StressDivergence kernels require equal " 72 : "order interpolation for all displacements."); 73 : } 74 : 75 : // fetch eigenstrain derivatives 76 : const auto nvar = _coupled_moose_vars.size(); 77 3176 : _deigenstrain_dargs.resize(nvar); 78 11677 : for (std::size_t i = 0; i < nvar; ++i) 79 17974 : for (auto eigenstrain_name : getParam<std::vector<MaterialPropertyName>>("eigenstrain_names")) 80 1944 : _deigenstrain_dargs[i].push_back(&getMaterialPropertyDerivative<RankTwoTensor>( 81 972 : eigenstrain_name, _coupled_moose_vars[i]->name())); 82 3176 : } 83 : 84 : void 85 757667 : LagrangianStressDivergenceBase::precalculateJacobian() 86 : { 87 : // Skip if we are not doing stabilization 88 757667 : if (!_stabilize_strain) 89 : return; 90 : 91 : // We need the gradients of shape functions in the reference frame 92 51753 : _fe_problem.prepareShapes(_var.number(), _tid); 93 51753 : _avg_grad_trial[_alpha].resize(_phi.size()); 94 51753 : precalculateJacobianDisplacement(_alpha); 95 : } 96 : 97 : void 98 1344530 : LagrangianStressDivergenceBase::precalculateOffDiagJacobian(unsigned int jvar) 99 : { 100 : // Skip if we are not doing stabilization 101 1344530 : if (!_stabilize_strain) 102 : return; 103 : 104 344068 : for (auto beta : make_range(_ndisp)) 105 253374 : if (jvar == _disp_nums[beta]) 106 : { 107 : // We need the gradients of shape functions in the reference frame 108 86896 : _fe_problem.prepareShapes(jvar, _tid); 109 86896 : _avg_grad_trial[beta].resize(_phi.size()); 110 86896 : precalculateJacobianDisplacement(beta); 111 : } 112 : } 113 : 114 : Real 115 327942980 : LagrangianStressDivergenceBase::computeQpJacobian() 116 : { 117 327942980 : return computeQpJacobianDisplacement(_alpha, _alpha); 118 : } 119 : 120 : Real 121 638721604 : LagrangianStressDivergenceBase::computeQpOffDiagJacobian(unsigned int jvar) 122 : { 123 : // Bail if jvar not coupled 124 638721604 : if (getJvarMap()[jvar] < 0) 125 : return 0.0; 126 : 127 : // Off diagonal terms for other displacements 128 1276939942 : for (auto beta : make_range(_ndisp)) 129 1275400998 : if (jvar == _disp_nums[beta]) 130 637182660 : return computeQpJacobianDisplacement(_alpha, beta); 131 : 132 : // Off diagonal temperature term due to eigenstrain 133 1538944 : if (_temperature && jvar == _temperature->number()) 134 1368576 : return computeQpJacobianTemperature(mapJvarToCvar(jvar)); 135 : 136 : // Off diagonal term due to weak plane stress 137 170368 : if (_out_of_plane_strain && jvar == _out_of_plane_strain->number()) 138 170368 : return computeQpJacobianOutOfPlaneStrain(); 139 : 140 : return 0; 141 : }