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 "MultiGrainRigidBodyMotion.h" 11 : 12 : // MOOSE includes 13 : #include "GrainTrackerInterface.h" 14 : #include "MooseVariable.h" 15 : 16 : registerMooseObject("PhaseFieldApp", MultiGrainRigidBodyMotion); 17 : 18 : InputParameters 19 258 : MultiGrainRigidBodyMotion::validParams() 20 : { 21 258 : InputParameters params = GrainRigidBodyMotionBase::validParams(); 22 258 : params.addClassDescription("Adds rigid body motion to grains"); 23 258 : return params; 24 0 : } 25 : 26 135 : MultiGrainRigidBodyMotion::MultiGrainRigidBodyMotion(const InputParameters & parameters) 27 135 : : GrainRigidBodyMotionBase(parameters) 28 : { 29 135 : } 30 : 31 : Real 32 5120544 : MultiGrainRigidBodyMotion::computeQpResidual() 33 : { 34 5120544 : return _velocity_advection * _grad_c[_qp] * _test[_i][_qp]; 35 : } 36 : 37 : Real 38 24014336 : MultiGrainRigidBodyMotion::computeQpJacobian() 39 : { 40 24014336 : if (_var.number() == _c_var) // Requires c jacobian 41 0 : return _velocity_advection * _grad_phi[_j][_qp] * _test[_i][_qp] + 42 0 : _velocity_advection_jacobian * _grad_c[_qp] * _test[_i][_qp]; 43 : 44 : return 0.0; 45 : } 46 : 47 : Real 48 48095872 : MultiGrainRigidBodyMotion::computeQpOffDiagJacobian(unsigned int jvar) 49 : { 50 48095872 : if (jvar == _c_var) // Requires c jacobian 51 24014336 : return _velocity_advection * _grad_phi[_j][_qp] * _test[_i][_qp] + 52 24014336 : _velocity_advection_jacobian * _grad_c[_qp] * _test[_i][_qp]; 53 : else 54 24081536 : return _velocity_advection_jacobian * _grad_c[_qp] * _test[_i][_qp]; 55 : } 56 : 57 0 : Real MultiGrainRigidBodyMotion::computeQpNonlocalJacobian(dof_id_type /*dof_index*/) 58 : { 59 0 : if (_var.number() == _c_var) // Requires c jacobian 60 0 : return _velocity_advection_jacobian * _grad_c[_qp] * _test[_i][_qp]; 61 : 62 : return 0.0; 63 : } 64 : 65 : Real 66 12472768 : MultiGrainRigidBodyMotion::computeQpNonlocalOffDiagJacobian(unsigned int /* jvar */, 67 : dof_id_type /* dof_index */) 68 : { 69 12472768 : return _velocity_advection_jacobian * _grad_c[_qp] * _test[_i][_qp]; 70 : } 71 : 72 : void 73 20317872 : MultiGrainRigidBodyMotion::getUserObjectJacobian(unsigned int jvar, dof_id_type dof_index) 74 : { 75 : _velocity_advection_jacobian = 0.0; 76 : 77 59380344 : for (MooseIndex(_grain_ids) i = 0; i < _grain_ids.size(); ++i) 78 : { 79 39062472 : auto grain_id = _grain_ids[i]; 80 39062472 : if (grain_id != FeatureFloodCount::invalid_id) 81 : { 82 : mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds"); 83 11717450 : const auto volume = _grain_volumes[grain_id]; 84 11717450 : const auto centroid = _grain_tracker.getGrainCentroid(grain_id); 85 : RealGradient force_jacobian; 86 : RealGradient torque_jacobian; 87 : 88 11717450 : if (jvar == _c_var) 89 : { 90 4806614 : force_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 0) * _total_dofs + dof_index]; 91 4806614 : force_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 1) * _total_dofs + dof_index]; 92 4806614 : force_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 2) * _total_dofs + dof_index]; 93 4806614 : torque_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 3) * _total_dofs + dof_index]; 94 4806614 : torque_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 4) * _total_dofs + dof_index]; 95 4806614 : torque_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 5) * _total_dofs + dof_index]; 96 : } 97 : 98 34625478 : for (unsigned int jvar_index = 0; jvar_index < _op_num; ++jvar_index) 99 22908028 : if (jvar == _vals_var[jvar_index]) 100 : { 101 6637156 : force_jacobian(0) = 102 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 0) * _total_dofs + dof_index]; 103 6637156 : force_jacobian(1) = 104 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 1) * _total_dofs + dof_index]; 105 6637156 : force_jacobian(2) = 106 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 2) * _total_dofs + dof_index]; 107 6637156 : torque_jacobian(0) = 108 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 3) * _total_dofs + dof_index]; 109 6637156 : torque_jacobian(1) = 110 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 4) * _total_dofs + dof_index]; 111 6637156 : torque_jacobian(2) = 112 6637156 : _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 5) * _total_dofs + dof_index]; 113 : } 114 : 115 11717450 : const auto force_jac = _mt / volume * force_jacobian; 116 : const auto torque_jac = 117 11717450 : _mr / volume * torque_jacobian.cross(_current_elem->vertex_average() - centroid); 118 : 119 : _velocity_advection_jacobian += (force_jac + torque_jac); 120 : } 121 : } 122 20317872 : } 123 : 124 : void 125 708130 : MultiGrainRigidBodyMotion::calculateAdvectionVelocity() 126 : { 127 : _velocity_advection = 0.0; 128 708130 : _grain_ids = _grain_tracker.getVarToFeatureVector(_current_elem->id()); 129 : 130 1705885 : for (MooseIndex(_grain_ids) i = 0; i < _grain_ids.size(); ++i) 131 : { 132 997755 : auto grain_id = _grain_ids[i]; 133 997755 : if (grain_id != FeatureFloodCount::invalid_id) 134 : { 135 : mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds"); 136 309640 : const auto volume = _grain_volumes[grain_id]; 137 309640 : const auto centroid = _grain_tracker.getGrainCentroid(grain_id); 138 309640 : const auto force = _mt / volume * _grain_forces[grain_id]; 139 : const auto torque = 140 309640 : _mr / volume * 141 309640 : (_grain_torques[grain_id].cross(_current_elem->vertex_average() - centroid)); 142 : 143 : _velocity_advection += (force + torque); 144 : } 145 : } 146 708130 : }