LCOV - code coverage report
Current view: top level - src/nodalkernels - NodalKernel.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 42 67 62.7 %
Date: 2025-07-17 01:28:37 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      143610 : NodalKernel::validParams()
      19             : {
      20      143610 :   return NodalKernelBase::validParams();
      21             : }
      22             : 
      23         524 : NodalKernel::NodalKernel(const InputParameters & parameters)
      24             :   : NodalKernelBase(parameters),
      25        1048 :     _u(_var.dofValues()),
      26         524 :     _save_in_strings(parameters.get<std::vector<AuxVariableName>>("save_in")),
      27        1048 :     _diag_save_in_strings(parameters.get<std::vector<AuxVariableName>>("diag_save_in"))
      28             : 
      29             : {
      30         524 :   _save_in.resize(_save_in_strings.size());
      31         524 :   _diag_save_in.resize(_diag_save_in_strings.size());
      32             : 
      33         524 :   for (unsigned int i = 0; i < _save_in_strings.size(); i++)
      34             :   {
      35           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _save_in_strings[i]);
      36             : 
      37           0 :     if (var->feType() != _var.feType())
      38           0 :       paramError(
      39             :           "save_in",
      40             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      41           0 :           moose::internal::incompatVarMsg(*var, _var));
      42             : 
      43           0 :     _save_in[i] = var;
      44           0 :     var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
      45           0 :     addMooseVariableDependency(var);
      46             :   }
      47             : 
      48         524 :   _has_save_in = _save_in.size() > 0;
      49             : 
      50         524 :   for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
      51             :   {
      52           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _diag_save_in_strings[i]);
      53             : 
      54           0 :     if (var->feType() != _var.feType())
      55           0 :       paramError(
      56             :           "diag_save_in",
      57             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      58           0 :           moose::internal::incompatVarMsg(*var, _var));
      59             : 
      60           0 :     _diag_save_in[i] = var;
      61           0 :     var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
      62           0 :     addMooseVariableDependency(var);
      63             :   }
      64             : 
      65         524 :   _has_diag_save_in = _diag_save_in.size() > 0;
      66         524 : }
      67             : 
      68             : void
      69     1092933 : NodalKernel::computeResidual()
      70             : {
      71     1092933 :   if (_var.isNodalDefined())
      72             :   {
      73     1092933 :     const dof_id_type & dof_idx = _var.nodalDofIndex();
      74     1092933 :     _qp = 0;
      75     1092933 :     const Real res = computeQpResidual();
      76     2185866 :     addResiduals(_assembly,
      77           0 :                  std::array<Real, 1>{{res}},
      78     1092933 :                  std::array<dof_id_type, 1>{{dof_idx}},
      79     1092933 :                  _var.scalingFactor());
      80             : 
      81     1092933 :     if (_has_save_in)
      82           0 :       for (const auto & var : _save_in)
      83           0 :         var->sys().solution().add(var->nodalDofIndex(), res);
      84             :   }
      85     1092933 : }
      86             : 
      87             : void
      88      527644 : NodalKernel::computeJacobian()
      89             : {
      90      527644 :   if (_var.isNodalDefined())
      91             :   {
      92      527644 :     _qp = 0;
      93      527644 :     const Real cached_val = computeQpJacobian();
      94      527644 :     const dof_id_type cached_row = _var.nodalDofIndex();
      95             : 
      96      527644 :     addJacobianElement(_assembly, cached_val, cached_row, cached_row, _var.scalingFactor());
      97             : 
      98      527644 :     if (_has_diag_save_in)
      99             :     {
     100           0 :       Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
     101           0 :       for (const auto & var : _diag_save_in)
     102           0 :         var->sys().solution().add(var->nodalDofIndex(), cached_val);
     103           0 :     }
     104             :   }
     105      527644 : }
     106             : 
     107             : void
     108      769816 : NodalKernel::computeOffDiagJacobian(const unsigned int jvar_num)
     109             : {
     110      769816 :   const auto & jvar = getVariable(jvar_num);
     111             : 
     112      769816 :   if (_var.isNodalDefined())
     113             :   {
     114      769816 :     if (jvar.number() == _var.number())
     115      527644 :       computeJacobian();
     116             :     else
     117             :     {
     118      242172 :       _qp = 0;
     119      242172 :       const Real cached_val = computeQpOffDiagJacobian(jvar.number());
     120      242172 :       const dof_id_type cached_row = _var.nodalDofIndex();
     121             : 
     122             :       // Note: this only works for equal order Lagrange variables...
     123      242172 :       const dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar.number(), 0);
     124             : 
     125      242172 :       addJacobianElement(_assembly, cached_val, cached_row, cached_col, _var.scalingFactor());
     126             :     }
     127             :   }
     128      769816 : }
     129             : 
     130             : Real
     131           0 : NodalKernel::computeQpJacobian()
     132             : {
     133           0 :   return 0.;
     134             : }
     135             : 
     136             : Real
     137           0 : NodalKernel::computeQpOffDiagJacobian(unsigned int /*jvar*/)
     138             : {
     139           0 :   return 0.;
     140             : }

Generated by: LCOV version 1.14