LCOV - code coverage report
Current view: top level - src/nodalkernels - NodalKernel.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #31706 (f8ed4a) with base bb0a08 Lines: 47 73 64.4 %
Date: 2025-11-03 17:23:24 Functions: 5 7 71.4 %
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 "NodalKernel.h"
      11             : #include "Problem.h"
      12             : #include "SubProblem.h"
      13             : #include "SystemBase.h"
      14             : #include "MooseVariableFE.h"
      15             : #include "Assembly.h"
      16             : 
      17             : InputParameters
      18      149676 : NodalKernel::validParams()
      19             : {
      20      149676 :   auto params = NodalKernelBase::validParams();
      21      598704 :   params.addParam<std::vector<AuxVariableName>>(
      22             :       "save_in",
      23             :       {},
      24             :       "The name of auxiliary variables to save this BC's residual contributions to.  "
      25             :       "Everything about that variable must match everything about this variable (the "
      26             :       "type, what blocks it's on, etc.)");
      27      598704 :   params.addParam<std::vector<AuxVariableName>>(
      28             :       "diag_save_in",
      29             :       {},
      30             :       "The name of auxiliary variables to save this BC's diagonal jacobian "
      31             :       "contributions to.  Everything about that variable must match everything "
      32             :       "about this variable (the type, what blocks it's on, etc.)");
      33      449028 :   params.addParamNamesToGroup("diag_save_in save_in", "Advanced");
      34      149676 :   return params;
      35           0 : }
      36             : 
      37         551 : NodalKernel::NodalKernel(const InputParameters & parameters)
      38             :   : NodalKernelBase(parameters),
      39             :     MooseVariableInterface<Real>(this,
      40             :                                  true,
      41             :                                  "variable",
      42             :                                  Moose::VarKindType::VAR_SOLVER,
      43             :                                  Moose::VarFieldType::VAR_FIELD_STANDARD),
      44        1102 :     _var(*mooseVariable()),
      45         551 :     _u(_var.dofValues()),
      46         551 :     _save_in_strings(parameters.get<std::vector<AuxVariableName>>("save_in")),
      47        2755 :     _diag_save_in_strings(parameters.get<std::vector<AuxVariableName>>("diag_save_in"))
      48             : 
      49             : {
      50         551 :   addMooseVariableDependency(mooseVariable());
      51             : 
      52         551 :   _save_in.resize(_save_in_strings.size());
      53         551 :   _diag_save_in.resize(_diag_save_in_strings.size());
      54             : 
      55         551 :   for (unsigned int i = 0; i < _save_in_strings.size(); i++)
      56             :   {
      57           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _save_in_strings[i]);
      58             : 
      59           0 :     if (var->feType() != _var.feType())
      60           0 :       paramError(
      61             :           "save_in",
      62             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      63           0 :           moose::internal::incompatVarMsg(*var, _var));
      64             : 
      65           0 :     _save_in[i] = var;
      66           0 :     var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
      67           0 :     addMooseVariableDependency(var);
      68             :   }
      69             : 
      70         551 :   _has_save_in = _save_in.size() > 0;
      71             : 
      72         551 :   for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
      73             :   {
      74           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _diag_save_in_strings[i]);
      75             : 
      76           0 :     if (var->feType() != _var.feType())
      77           0 :       paramError(
      78             :           "diag_save_in",
      79             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      80           0 :           moose::internal::incompatVarMsg(*var, _var));
      81             : 
      82           0 :     _diag_save_in[i] = var;
      83           0 :     var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
      84           0 :     addMooseVariableDependency(var);
      85             :   }
      86             : 
      87         551 :   _has_diag_save_in = _diag_save_in.size() > 0;
      88         551 : }
      89             : 
      90             : void
      91     2242153 : NodalKernel::computeResidual()
      92             : {
      93     2242153 :   if (_var.isNodalDefined())
      94             :   {
      95     2242153 :     const dof_id_type & dof_idx = _var.nodalDofIndex();
      96     2242153 :     _qp = 0;
      97     2242153 :     const Real res = computeQpResidual();
      98     4484306 :     addResiduals(_assembly,
      99           0 :                  std::array<Real, 1>{{res}},
     100     2242153 :                  std::array<dof_id_type, 1>{{dof_idx}},
     101     2242153 :                  _var.scalingFactor());
     102             : 
     103     2242153 :     if (_has_save_in)
     104           0 :       for (const auto & var : _save_in)
     105           0 :         var->sys().solution().add(var->nodalDofIndex(), res);
     106             :   }
     107     2242153 : }
     108             : 
     109             : void
     110      598466 : NodalKernel::computeJacobian()
     111             : {
     112      598466 :   if (_var.isNodalDefined())
     113             :   {
     114      598466 :     _qp = 0;
     115      598466 :     const Real cached_val = computeQpJacobian();
     116      598466 :     const dof_id_type cached_row = _var.nodalDofIndex();
     117             : 
     118      598466 :     addJacobianElement(_assembly, cached_val, cached_row, cached_row, _var.scalingFactor());
     119             : 
     120      598466 :     if (_has_diag_save_in)
     121             :     {
     122           0 :       Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
     123           0 :       for (const auto & var : _diag_save_in)
     124           0 :         var->sys().solution().add(var->nodalDofIndex(), cached_val);
     125           0 :     }
     126             :   }
     127      598466 : }
     128             : 
     129             : void
     130      873766 : NodalKernel::computeOffDiagJacobian(const unsigned int jvar_num)
     131             : {
     132      873766 :   if (_var.isNodalDefined())
     133             :   {
     134      873766 :     if (jvar_num == _var.number())
     135      598466 :       computeJacobian();
     136             :     else
     137             :     {
     138      275300 :       _qp = 0;
     139      275300 :       const Real cached_val = computeQpOffDiagJacobian(jvar_num);
     140      275300 :       const dof_id_type cached_row = _var.nodalDofIndex();
     141             : 
     142             :       // Note: this only works for equal order Lagrange variables...
     143      275300 :       const dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar_num, 0);
     144             : 
     145      275300 :       addJacobianElement(_assembly, cached_val, cached_row, cached_col, _var.scalingFactor());
     146             :     }
     147             :   }
     148      873766 : }
     149             : 
     150             : Real
     151           0 : NodalKernel::computeQpJacobian()
     152             : {
     153           0 :   return 0.;
     154             : }
     155             : 
     156             : Real
     157           0 : NodalKernel::computeQpOffDiagJacobian(unsigned int /*jvar*/)
     158             : {
     159           0 :   return 0.;
     160             : }

Generated by: LCOV version 1.14