LCOV - code coverage report
Current view: top level - src/dgkernels - DGKernel.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #32971 (54bef8) with base c6cf66 Lines: 104 112 92.9 %
Date: 2026-05-29 20:35:17 Functions: 6 6 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 "DGKernel.h"
      11             : #include "Assembly.h"
      12             : #include "MooseVariable.h"
      13             : #include "Problem.h"
      14             : #include "SubProblem.h"
      15             : #include "SystemBase.h"
      16             : #include "MaterialData.h"
      17             : #include "ParallelUniqueId.h"
      18             : 
      19             : #include "libmesh/dof_map.h"
      20             : #include "libmesh/dense_vector.h"
      21             : #include "libmesh/numeric_vector.h"
      22             : #include "libmesh/dense_subvector.h"
      23             : #include "libmesh/libmesh_common.h"
      24             : #include "libmesh/quadrature.h"
      25             : 
      26             : InputParameters
      27       26535 : DGKernel::validParams()
      28             : {
      29       26535 :   InputParameters params = DGKernelBase::validParams();
      30       26535 :   return params;
      31             : }
      32             : 
      33        1071 : DGKernel::DGKernel(const InputParameters & parameters)
      34             :   : DGKernelBase(parameters),
      35             :     NeighborMooseVariableInterface(
      36             :         this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
      37        2142 :     _var(*mooseVariable()),
      38        1071 :     _u(_is_implicit ? _var.sln() : _var.slnOld()),
      39        1071 :     _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
      40             : 
      41        1071 :     _phi(_assembly.phiFace(_var)),
      42        1071 :     _grad_phi(_assembly.gradPhiFace(_var)),
      43             : 
      44        1071 :     _test(_var.phiFace()),
      45        1071 :     _grad_test(_var.gradPhiFace()),
      46             : 
      47        1071 :     _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
      48        1071 :     _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
      49             : 
      50        1071 :     _test_neighbor(_var.phiFaceNeighbor()),
      51        1071 :     _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
      52             : 
      53        1071 :     _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
      54        2142 :     _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor())
      55             : {
      56        1071 :   addMooseVariableDependency(mooseVariable());
      57             : 
      58        1071 :   _save_in.resize(_save_in_strings.size());
      59        1071 :   _diag_save_in.resize(_diag_save_in_strings.size());
      60             : 
      61        1110 :   for (unsigned int i = 0; i < _save_in_strings.size(); i++)
      62             :   {
      63          39 :     MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
      64          39 :                                                          _save_in_strings[i],
      65             :                                                          Moose::VarKindType::VAR_AUXILIARY,
      66             :                                                          Moose::VarFieldType::VAR_FIELD_STANDARD);
      67             : 
      68          39 :     if (_sys.hasVariable(_save_in_strings[i]))
      69           0 :       mooseError("Trying to use solution variable " + _save_in_strings[i] +
      70           0 :                  " as a save_in variable in " + name());
      71             : 
      72          39 :     if (var->feType() != _var.feType())
      73           0 :       paramError(
      74             :           "save_in",
      75             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      76           0 :           moose::internal::incompatVarMsg(*var, _var));
      77             : 
      78          39 :     _save_in[i] = var;
      79          39 :     var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
      80          39 :     addMooseVariableDependency(var);
      81             :   }
      82             : 
      83        1071 :   _has_save_in = _save_in.size() > 0;
      84             : 
      85        1097 :   for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
      86             :   {
      87          26 :     MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
      88          26 :                                                          _diag_save_in_strings[i],
      89             :                                                          Moose::VarKindType::VAR_AUXILIARY,
      90             :                                                          Moose::VarFieldType::VAR_FIELD_STANDARD);
      91             : 
      92          26 :     if (_sys.hasVariable(_diag_save_in_strings[i]))
      93           0 :       mooseError("Trying to use solution variable " + _diag_save_in_strings[i] +
      94           0 :                  " as a diag_save_in variable in " + name());
      95             : 
      96          26 :     if (var->feType() != _var.feType())
      97           0 :       paramError(
      98             :           "diag_save_in",
      99             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
     100           0 :           moose::internal::incompatVarMsg(*var, _var));
     101             : 
     102          26 :     _diag_save_in[i] = var;
     103          26 :     var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
     104          26 :     addMooseVariableDependency(var);
     105             :   }
     106             : 
     107        1071 :   _has_diag_save_in = _diag_save_in.size() > 0;
     108        1071 : }
     109             : 
     110             : void
     111     3170034 : DGKernel::computeElemNeighResidual(Moose::DGResidualType type)
     112             : {
     113             :   bool is_elem;
     114     3170034 :   if (type == Moose::Element)
     115     1585017 :     is_elem = true;
     116             :   else
     117     1585017 :     is_elem = false;
     118             : 
     119     3170034 :   const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
     120             : 
     121     3170034 :   if (is_elem)
     122     1585017 :     prepareVectorTag(_assembly, _var.number());
     123             :   else
     124     1585017 :     prepareVectorTagNeighbor(_assembly, _var.number());
     125             : 
     126     3170034 :   precalculateResidual();
     127    13490196 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     128             :   {
     129    10320162 :     precalculateQpResidual(type);
     130   133464148 :     for (_i = 0; _i < test_space.size(); _i++)
     131   123143986 :       _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual(type);
     132             :   }
     133             : 
     134     3170034 :   accumulateTaggedLocalResidual();
     135             : 
     136     3170034 :   if (_has_save_in)
     137       18432 :     for (const auto & var : _save_in)
     138             :     {
     139             :       const std::vector<dof_id_type> & dof_indices =
     140        9216 :           is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
     141        9216 :       var->sys().solution().add_vector(_local_re, dof_indices);
     142             :     }
     143     3170034 : }
     144             : 
     145             : void
     146      403576 : DGKernel::computeElemNeighJacobian(Moose::DGJacobianType type)
     147             : {
     148      403576 :   const VariableTestValue & test_space =
     149      403576 :       (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
     150      706258 :   const VariableTestValue & loc_phi =
     151      302682 :       (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
     152             : 
     153      403576 :   if (type == Moose::ElementElement)
     154      100894 :     prepareMatrixTag(_assembly, _var.number(), _var.number());
     155             :   else
     156      302682 :     prepareMatrixTagNeighbor(_assembly, _var.number(), _var.number(), type);
     157             : 
     158      403576 :   precalculateJacobian();
     159     1617696 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     160             :   {
     161     1214120 :     precalculateQpJacobian(type);
     162    14085752 :     for (_i = 0; _i < test_space.size(); _i++)
     163   198724048 :       for (_j = 0; _j < loc_phi.size(); _j++)
     164   185852416 :         _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
     165             :   }
     166             : 
     167      403576 :   accumulateTaggedLocalMatrix();
     168             : 
     169      403576 :   if (_has_diag_save_in && (type == Moose::ElementElement || type == Moose::NeighborNeighbor))
     170             :   {
     171        1536 :     unsigned int rows = _local_ke.m();
     172        1536 :     DenseVector<Number> diag(rows);
     173        7680 :     for (unsigned int i = 0; i < rows; i++)
     174        6144 :       diag(i) = _local_ke(i, i);
     175             : 
     176        3072 :     for (const auto & var : _diag_save_in)
     177             :     {
     178        1536 :       if (type == Moose::ElementElement)
     179         768 :         var->sys().solution().add_vector(diag, var->dofIndices());
     180             :       else
     181         768 :         var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
     182             :     }
     183        1536 :   }
     184      403576 : }
     185             : 
     186             : void
     187       11832 : DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,
     188             :                                           const MooseVariableFEBase & jvar)
     189             : {
     190       11832 :   const VariableTestValue & test_space =
     191       11832 :       (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
     192       20706 :   const VariableTestValue & loc_phi =
     193        8874 :       (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
     194             : 
     195       11832 :   if (type == Moose::ElementElement)
     196        2958 :     prepareMatrixTag(_assembly, _var.number(), jvar.number());
     197             :   else
     198        8874 :     prepareMatrixTagNeighbor(_assembly, _var.number(), jvar.number(), type);
     199             : 
     200       11832 :   if (_local_ke.n() == 0 || _local_ke.m() == 0)
     201        6448 :     return;
     202             : 
     203        5384 :   precalculateJacobian();
     204       18448 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     205             :   {
     206       13064 :     precalculateQpOffDiagJacobian(type, jvar);
     207       95160 :     for (_i = 0; _i < test_space.size(); _i++)
     208      656592 :       for (_j = 0; _j < loc_phi.size(); _j++)
     209      574496 :         _local_ke(_i, _j) +=
     210      574496 :             _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar.number());
     211             :   }
     212             : 
     213        5384 :   accumulateTaggedLocalMatrix();
     214             : }
     215             : 
     216             : Real
     217       98304 : DGKernel::computeQpOffDiagJacobian(Moose::DGJacobianType /*type*/, unsigned int /*jvar*/)
     218             : {
     219       98304 :   return 0.;
     220             : }

Generated by: LCOV version 1.14