LCOV - code coverage report
Current view: top level - src/kernels - ADKernelScalarBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 64 65 98.5 %
Date: 2025-07-17 01:28:37 Functions: 8 8 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 "ADKernelScalarBase.h"
      11             : 
      12             : #include "Assembly.h"
      13             : #include "SubProblem.h"
      14             : #include "SystemBase.h"
      15             : #include "MooseVariableFE.h"
      16             : #include "MooseVariableScalar.h"
      17             : #include "ADUtils.h"
      18             : 
      19             : #include "libmesh/quadrature.h"
      20             : 
      21             : InputParameters
      22       28791 : ADKernelScalarBase::validParams()
      23             : {
      24       28791 :   InputParameters params = ADKernel::validParams();
      25             :   // This parameter can get renamed in derived class to a more relevant variable name
      26       28791 :   params.addCoupledVar("scalar_variable", "Primary coupled scalar variable");
      27       28791 :   params.addParam<bool>("compute_scalar_residuals", true, "Whether to compute scalar residuals");
      28       86373 :   params.addParam<bool>(
      29       57582 :       "compute_field_residuals", true, "Whether to compute residuals for the field variable.");
      30       28791 :   return params;
      31           0 : }
      32             : 
      33         137 : ADKernelScalarBase::ADKernelScalarBase(const InputParameters & parameters)
      34             :   : ADKernel(parameters),
      35         137 :     _use_scalar(isParamValid("scalar_variable") ? true : false),
      36         137 :     _compute_scalar_residuals(!_use_scalar ? false : getParam<bool>("compute_scalar_residuals")),
      37         137 :     _compute_field_residuals(getParam<bool>("compute_field_residuals")),
      38         137 :     _kappa_var_ptr(_use_scalar ? getScalarVar("scalar_variable", 0) : nullptr),
      39         137 :     _kappa_var(_use_scalar ? _kappa_var_ptr->number() : 0),
      40         137 :     _k_order(_use_scalar ? _kappa_var_ptr->order() : 0),
      41         274 :     _kappa(_use_scalar ? _kappa_var_ptr->adSln() : _ad_zero)
      42             : {
      43         137 : }
      44             : 
      45             : void
      46        1811 : ADKernelScalarBase::computeResidual()
      47             : {
      48        1811 :   if (_compute_field_residuals)
      49        1811 :     ADKernel::computeResidual(); // compute and assemble regular variable contributions
      50             : 
      51        1811 :   if (_compute_scalar_residuals)
      52             :   {
      53        1811 :     std::vector<Real> scalar_residuals(_k_order);
      54       18083 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
      55             :     {
      56       16275 :       initScalarQpResidual();
      57       32547 :       for (_h = 0; _h < _k_order; _h++)
      58       16275 :         scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * raw_value(computeScalarQpResidual());
      59             :     }
      60        1808 :     addResiduals(
      61        1808 :         _assembly, scalar_residuals, _kappa_var_ptr->dofIndices(), _kappa_var_ptr->scalingFactor());
      62        1808 :   }
      63        1808 : }
      64             : 
      65             : void
      66         120 : ADKernelScalarBase::computeJacobian()
      67             : {
      68         120 :   if (_compute_field_residuals)
      69         120 :     ADKernel::computeJacobian();
      70             : 
      71         120 :   if (_compute_scalar_residuals)
      72             :   {
      73         120 :     computeScalarResidualsForJacobian();
      74         360 :     addResidualsAndJacobian(_assembly,
      75         120 :                             _scalar_residuals,
      76         120 :                             _kappa_var_ptr->dofIndices(),
      77         120 :                             _kappa_var_ptr->scalingFactor());
      78             :   }
      79         120 : }
      80             : 
      81             : void
      82         120 : ADKernelScalarBase::computeOffDiagJacobian(const unsigned int jvar_num)
      83             : {
      84             :   // Only need to do this once because AD does all the derivatives at once
      85         120 :   if (jvar_num == _var.number())
      86         120 :     computeJacobian();
      87         120 : }
      88             : 
      89             : void
      90         120 : ADKernelScalarBase::computeOffDiagJacobianScalar(const unsigned int /*jvar_num*/)
      91             : {
      92         120 : }
      93             : 
      94             : void
      95        1984 : ADKernelScalarBase::computeResidualAndJacobian()
      96             : {
      97        1984 :   if (_compute_field_residuals)
      98        1984 :     ADKernel::computeResidualAndJacobian();
      99             : 
     100        1984 :   if (_compute_scalar_residuals)
     101             :   {
     102        1920 :     computeScalarResidualsForJacobian();
     103        5760 :     addResidualsAndJacobian(_assembly,
     104        1920 :                             _scalar_residuals,
     105        1920 :                             _kappa_var_ptr->dofIndices(),
     106        1920 :                             _kappa_var_ptr->scalingFactor());
     107             :   }
     108        1984 : }
     109             : 
     110             : void
     111        2040 : ADKernelScalarBase::computeScalarResidualsForJacobian()
     112             : {
     113        2040 :   if (_scalar_residuals.size() != _k_order)
     114         114 :     _scalar_residuals.resize(_k_order, 0);
     115        4080 :   for (auto & sr : _scalar_residuals)
     116        2040 :     sr = 0;
     117             : 
     118             :   // precalculateResidual was already run for the field variable
     119       20400 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     120       36720 :     for (_h = 0; _h < _k_order; _h++)
     121       18360 :       _scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * computeScalarQpResidual();
     122        2040 : }

Generated by: LCOV version 1.14