LCOV - code coverage report
Current view: top level - src/kernels - ADKernelScalarBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #33416 (b10b36) with base 9fbd27 Lines: 70 77 90.9 %
Date: 2026-07-23 16:15:30 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 "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        6427 : ADKernelScalarBase::validParams()
      23             : {
      24        6427 :   InputParameters params = ADKernel::validParams();
      25             :   // This parameter can get renamed in derived class to a more relevant variable name
      26       25708 :   params.addCoupledVar("scalar_variable", "Primary coupled scalar variable");
      27       25708 :   params.addParam<bool>("compute_scalar_residuals", true, "Whether to compute scalar residuals");
      28       12854 :   params.addParam<bool>(
      29       12854 :       "compute_field_residuals", true, "Whether to compute residuals for the field variable.");
      30        6427 :   return params;
      31           0 : }
      32             : 
      33         133 : ADKernelScalarBase::ADKernelScalarBase(const InputParameters & parameters)
      34             :   : ADKernel(parameters),
      35         133 :     _use_scalar(isParamValid("scalar_variable") ? true : false),
      36         253 :     _compute_scalar_residuals(!_use_scalar ? false : getParam<bool>("compute_scalar_residuals")),
      37         266 :     _compute_field_residuals(getParam<bool>("compute_field_residuals")),
      38         253 :     _kappa_var_ptr(_use_scalar ? getScalarVar("scalar_variable", 0) : nullptr),
      39         133 :     _kappa_var(_use_scalar ? _kappa_var_ptr->number() : 0),
      40         133 :     _k_order(_use_scalar ? _kappa_var_ptr->order() : 0),
      41         266 :     _kappa(_use_scalar ? _kappa_var_ptr->adSln() : _ad_zero)
      42             : {
      43         133 : }
      44             : 
      45             : std::set<std::string>
      46          90 : ADKernelScalarBase::additionalROVariables()
      47             : {
      48          90 :   auto variables = ADKernel::additionalROVariables();
      49          90 :   if (_compute_scalar_residuals)
      50          90 :     variables.insert(_kappa_var_ptr->name());
      51             : 
      52          90 :   return variables;
      53           0 : }
      54             : 
      55             : void
      56        1571 : ADKernelScalarBase::computeResidual()
      57             : {
      58        1571 :   if (_compute_field_residuals)
      59        1571 :     ADKernel::computeResidual(); // compute and assemble regular variable contributions
      60             : 
      61        1571 :   if (_compute_scalar_residuals)
      62             :   {
      63        1571 :     std::vector<Real> scalar_residuals(_k_order);
      64       15683 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
      65             :     {
      66       14115 :       initScalarQpResidual();
      67       28227 :       for (_h = 0; _h < _k_order; _h++)
      68       14115 :         scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * raw_value(computeScalarQpResidual());
      69             :     }
      70        1568 :     addResiduals(
      71        1568 :         _assembly, scalar_residuals, _kappa_var_ptr->dofIndices(), _kappa_var_ptr->scalingFactor());
      72        1568 :   }
      73        1568 : }
      74             : 
      75             : void
      76         112 : ADKernelScalarBase::computeJacobian()
      77             : {
      78         112 :   if (_compute_field_residuals)
      79         112 :     ADKernel::computeJacobian();
      80             : 
      81         112 :   if (_compute_scalar_residuals)
      82             :   {
      83         112 :     computeScalarResidualsForJacobian();
      84         336 :     addResidualsAndJacobian(_assembly,
      85         112 :                             _scalar_residuals,
      86         112 :                             _kappa_var_ptr->dofIndices(),
      87         112 :                             _kappa_var_ptr->scalingFactor());
      88             :   }
      89         112 : }
      90             : 
      91             : void
      92         112 : ADKernelScalarBase::computeOffDiagJacobian(const unsigned int jvar_num)
      93             : {
      94             :   // Only need to do this once because AD does all the derivatives at once
      95         112 :   if (jvar_num == _var.number())
      96         112 :     computeJacobian();
      97         112 : }
      98             : 
      99             : void
     100         112 : ADKernelScalarBase::computeOffDiagJacobianScalar(const unsigned int /*jvar_num*/)
     101             : {
     102         112 : }
     103             : 
     104             : void
     105        1728 : ADKernelScalarBase::computeResidualAndJacobian()
     106             : {
     107        1728 :   if (_compute_field_residuals)
     108        1728 :     ADKernel::computeResidualAndJacobian();
     109             : 
     110        1728 :   if (_compute_scalar_residuals)
     111             :   {
     112        1664 :     computeScalarResidualsForJacobian();
     113        4992 :     addResidualsAndJacobian(_assembly,
     114        1664 :                             _scalar_residuals,
     115        1664 :                             _kappa_var_ptr->dofIndices(),
     116        1664 :                             _kappa_var_ptr->scalingFactor());
     117             :   }
     118        1728 : }
     119             : 
     120             : void
     121        1776 : ADKernelScalarBase::computeScalarResidualsForJacobian()
     122             : {
     123        1776 :   if (_scalar_residuals.size() != _k_order)
     124          98 :     _scalar_residuals.resize(_k_order, 0);
     125        3552 :   for (auto & sr : _scalar_residuals)
     126        1776 :     sr = 0;
     127             : 
     128             :   // precalculateResidual was already run for the field variable
     129        1776 :   if (_use_displaced_mesh)
     130           0 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     131             :     {
     132           0 :       _r = _ad_JxW[_qp];
     133           0 :       _r *= _ad_coord[_qp];
     134           0 :       for (_h = 0; _h < _k_order; _h++)
     135           0 :         _scalar_residuals[_h] += _r * computeScalarQpResidual();
     136             :     }
     137             :   else
     138       17760 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     139       31968 :       for (_h = 0; _h < _k_order; _h++)
     140       15984 :         _scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * computeScalarQpResidual();
     141        1776 : }

Generated by: LCOV version 1.14