LCOV - code coverage report
Current view: top level - src/kernels - SingleGrainRigidBodyMotion.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 59 60 98.3 %
Date: 2025-09-04 07:55:36 Functions: 9 9 100.0 %
Legend: Lines: hit not hit

          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 "SingleGrainRigidBodyMotion.h"
      11             : #include "GrainTrackerInterface.h"
      12             : 
      13             : registerMooseObject("PhaseFieldApp", SingleGrainRigidBodyMotion);
      14             : 
      15             : InputParameters
      16         315 : SingleGrainRigidBodyMotion::validParams()
      17             : {
      18         315 :   InputParameters params = GrainRigidBodyMotionBase::validParams();
      19         315 :   params.addClassDescription("Adds rigid mody motion to a single grain");
      20         630 :   params.addParam<unsigned int>("op_index", 0, "Grain number for the kernel to be applied");
      21         315 :   return params;
      22           0 : }
      23             : 
      24         165 : SingleGrainRigidBodyMotion::SingleGrainRigidBodyMotion(const InputParameters & parameters)
      25         330 :   : GrainRigidBodyMotionBase(parameters), _op_index(getParam<unsigned int>("op_index"))
      26             : {
      27         165 : }
      28             : 
      29             : Real
      30     4932944 : SingleGrainRigidBodyMotion::computeQpResidual()
      31             : {
      32     4932944 :   return _velocity_advection * _grad_u[_qp] * _test[_i][_qp];
      33             : }
      34             : 
      35             : Real
      36    24081536 : SingleGrainRigidBodyMotion::computeQpJacobian()
      37             : {
      38    24081536 :   return _velocity_advection * _grad_phi[_j][_qp] * _test[_i][_qp] +
      39    24081536 :          _velocity_advection_jacobian * _grad_u[_qp] * _test[_i][_qp];
      40             : }
      41             : 
      42             : Real
      43    51209472 : SingleGrainRigidBodyMotion::computeQpOffDiagJacobian(unsigned int /*jvar*/)
      44             : {
      45    51209472 :   return _velocity_advection_jacobian * _grad_u[_qp] * _test[_i][_qp];
      46             : }
      47             : 
      48     1548288 : Real SingleGrainRigidBodyMotion::computeQpNonlocalJacobian(dof_id_type /*dof_index*/)
      49             : {
      50     1548288 :   return _velocity_advection_jacobian * _grad_u[_qp] * _test[_i][_qp];
      51             : }
      52             : 
      53             : Real
      54     3096576 : SingleGrainRigidBodyMotion::computeQpNonlocalOffDiagJacobian(unsigned int /*jvar*/,
      55             :                                                              dof_id_type /*dof_index*/)
      56             : {
      57     3096576 :   return _velocity_advection_jacobian * _grad_u[_qp] * _test[_i][_qp];
      58             : }
      59             : 
      60             : void
      61    34750472 : SingleGrainRigidBodyMotion::getUserObjectJacobian(unsigned int jvar, dof_id_type dof_index)
      62             : {
      63             :   _velocity_advection_jacobian = 0.0;
      64             : 
      65    34750472 :   auto grain_id = _grain_ids[_op_index];
      66    34750472 :   if (grain_id != FeatureFloodCount::invalid_id)
      67             :   {
      68             :     mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds");
      69    10275114 :     const auto volume = _grain_volumes[grain_id];
      70    10275114 :     const auto centroid = _grain_tracker.getGrainCentroid(grain_id);
      71             :     RealGradient force_jacobian;
      72             :     RealGradient torque_jacobian;
      73             : 
      74    10275114 :     if (jvar == _c_var)
      75             :     {
      76     3406390 :       force_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 0) * _total_dofs + dof_index];
      77     3406390 :       force_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 1) * _total_dofs + dof_index];
      78     3406390 :       force_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 2) * _total_dofs + dof_index];
      79     3406390 :       torque_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 3) * _total_dofs + dof_index];
      80     3406390 :       torque_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 4) * _total_dofs + dof_index];
      81     3406390 :       torque_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 5) * _total_dofs + dof_index];
      82             :     }
      83             : 
      84    30298470 :     for (unsigned int jvar_index = 0; jvar_index < _op_num; ++jvar_index)
      85    20023356 :       if (jvar == _vals_var[jvar_index])
      86             :       {
      87     6637156 :         force_jacobian(0) =
      88     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 0) * _total_dofs + dof_index];
      89     6637156 :         force_jacobian(1) =
      90     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 1) * _total_dofs + dof_index];
      91     6637156 :         force_jacobian(2) =
      92     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 2) * _total_dofs + dof_index];
      93     6637156 :         torque_jacobian(0) =
      94     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 3) * _total_dofs + dof_index];
      95     6637156 :         torque_jacobian(1) =
      96     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 4) * _total_dofs + dof_index];
      97     6637156 :         torque_jacobian(2) =
      98     6637156 :             _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 5) * _total_dofs + dof_index];
      99             :       }
     100             : 
     101    10275114 :     const auto force_jac = _mt / volume * force_jacobian;
     102             :     const auto torque_jac =
     103    10275114 :         _mr / volume * torque_jacobian.cross(_current_elem->vertex_average() - centroid);
     104             : 
     105    10275114 :     _velocity_advection_jacobian = (force_jac + torque_jac);
     106             :   }
     107    34750472 : }
     108             : 
     109             : void
     110      810505 : SingleGrainRigidBodyMotion::calculateAdvectionVelocity()
     111             : {
     112             :   _velocity_advection = 0.0;
     113      810505 :   _grain_ids = _grain_tracker.getVarToFeatureVector(_current_elem->id());
     114             : 
     115      810505 :   auto grain_id = _grain_ids[_op_index];
     116      810505 :   if (grain_id != FeatureFloodCount::invalid_id)
     117             :   {
     118             :     mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds");
     119      261452 :     const auto volume = _grain_volumes[grain_id];
     120      261452 :     const auto centroid = _grain_tracker.getGrainCentroid(grain_id);
     121      261452 :     const auto force = _mt / volume * _grain_forces[grain_id];
     122             :     const auto torque =
     123      261452 :         _mr / volume * (_grain_torques[grain_id].cross(_current_elem->vertex_average() - centroid));
     124             : 
     125      261452 :     _velocity_advection = (force + torque);
     126             :   }
     127      810505 : }

Generated by: LCOV version 1.14