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 "GrainRigidBodyMotionBase.h" 11 : 12 : // MOOSE includes 13 : #include "GrainTrackerInterface.h" 14 : #include "MooseVariable.h" 15 : 16 : InputParameters 17 389 : GrainRigidBodyMotionBase::validParams() 18 : { 19 389 : InputParameters params = NonlocalKernel::validParams(); 20 389 : params.addClassDescription("Base class for adding rigid body motion to grains"); 21 778 : params.addRequiredCoupledVar("c", "Concentration"); 22 778 : params.addRequiredCoupledVarWithAutoBuild( 23 : "v", "var_name_base", "op_num", "Array of coupled variable names"); 24 778 : params.addParam<std::string>("base_name", 25 : "Optional parameter that allows the user to define " 26 : "type of force density under consideration"); 27 778 : params.addParam<Real>( 28 778 : "translation_constant", 500, "constant value characterizing grain translation"); 29 778 : params.addParam<Real>("rotation_constant", 1.0, "constant value characterizing grain rotation"); 30 778 : params.addRequiredParam<UserObjectName>( 31 : "grain_force", "UserObject for getting force and torque acting on grains"); 32 778 : params.addRequiredParam<UserObjectName>("grain_tracker_object", 33 : "The FeatureFloodCount UserObject to get values from."); 34 778 : params.addRequiredParam<VectorPostprocessorName>("grain_volumes", 35 : "The feature volume VectorPostprocessorValue."); 36 389 : return params; 37 0 : } 38 : 39 208 : GrainRigidBodyMotionBase::GrainRigidBodyMotionBase(const InputParameters & parameters) 40 : : NonlocalKernel(parameters), 41 208 : _var_dofs(_var.dofIndices()), 42 208 : _c_var(coupled("c")), 43 208 : _c(coupledValue("c")), 44 208 : _grad_c(coupledGradient("c")), 45 208 : _c_dofs(getVar("c", 0)->dofIndices()), 46 208 : _op_num(coupledComponents("v")), 47 208 : _vals(coupledValues("v")), 48 208 : _vals_var(coupledIndices("v")), 49 208 : _grad_vals(coupledGradients("v")), 50 416 : _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""), 51 208 : _grain_force_torque(getUserObject<GrainForceAndTorqueInterface>("grain_force")), 52 208 : _grain_forces(_grain_force_torque.getForceValues()), 53 208 : _grain_torques(_grain_force_torque.getTorqueValues()), 54 208 : _grain_force_c_jacobians(_grain_force_torque.getForceCJacobians()), 55 208 : _grain_force_eta_jacobians(_grain_force_torque.getForceEtaJacobians()), 56 416 : _mt(getParam<Real>("translation_constant")), 57 416 : _mr(getParam<Real>("rotation_constant")), 58 208 : _grain_tracker(getUserObject<GrainTrackerInterface>("grain_tracker_object")), 59 416 : _grain_volumes(getVectorPostprocessorValue("grain_volumes", "feature_volumes")) 60 : { 61 208 : } 62 : 63 : void 64 222 : GrainRigidBodyMotionBase::timestepSetup() 65 : { 66 222 : _total_dofs = _subproblem.es().n_dofs(); 67 222 : } 68 : 69 : bool 70 43369200 : GrainRigidBodyMotionBase::globalDoFEnabled(MooseVariableFEBase & /*var*/, dof_id_type /*dof_index*/) 71 : { 72 43369200 : if (_velocity_advection_jacobian(0) == 0 && _velocity_advection_jacobian(1) == 0 && 73 42452184 : _velocity_advection_jacobian(2) == 0) 74 42452184 : return false; 75 : 76 : return true; 77 : } 78 : 79 : void 80 318072 : GrainRigidBodyMotionBase::precalculateResidual() 81 : { 82 318072 : calculateAdvectionVelocity(); 83 318072 : } 84 : 85 : void 86 285130 : GrainRigidBodyMotionBase::precalculateJacobian() 87 : { 88 285130 : calculateAdvectionVelocity(); 89 285130 : } 90 : 91 : void 92 679160 : GrainRigidBodyMotionBase::precalculateOffDiagJacobian(unsigned int /* jvar */) 93 : { 94 679160 : calculateAdvectionVelocity(); 95 679160 : }