LCOV - code coverage report
Current view: top level - src/kernels - MultiGrainRigidBodyMotion.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 59 65 90.8 %
Date: 2025-09-04 07:55:36 Functions: 8 9 88.9 %
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 "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 : }

Generated by: LCOV version 1.14