LCOV - code coverage report
Current view: top level - src/dgkernels - DGKernel.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 104 112 92.9 %
Date: 2025-07-17 01:28:37 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      116275 : DGKernel::validParams()
      28             : {
      29      116275 :   InputParameters params = DGKernelBase::validParams();
      30      116275 :   return params;
      31             : }
      32             : 
      33        1120 : DGKernel::DGKernel(const InputParameters & parameters)
      34             :   : DGKernelBase(parameters),
      35             :     NeighborMooseVariableInterface(
      36             :         this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
      37        2240 :     _var(*mooseVariable()),
      38        1120 :     _u(_is_implicit ? _var.sln() : _var.slnOld()),
      39        1120 :     _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
      40             : 
      41        1120 :     _phi(_assembly.phiFace(_var)),
      42        1120 :     _grad_phi(_assembly.gradPhiFace(_var)),
      43             : 
      44        1120 :     _test(_var.phiFace()),
      45        1120 :     _grad_test(_var.gradPhiFace()),
      46             : 
      47        1120 :     _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
      48        1120 :     _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
      49             : 
      50        1120 :     _test_neighbor(_var.phiFaceNeighbor()),
      51        1120 :     _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
      52             : 
      53        1120 :     _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
      54        2240 :     _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor())
      55             : {
      56        1120 :   addMooseVariableDependency(mooseVariable());
      57             : 
      58        1120 :   _save_in.resize(_save_in_strings.size());
      59        1120 :   _diag_save_in.resize(_diag_save_in_strings.size());
      60             : 
      61        1159 :   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        1120 :   _has_save_in = _save_in.size() > 0;
      84             : 
      85        1146 :   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        1120 :   _has_diag_save_in = _diag_save_in.size() > 0;
     108        1120 : }
     109             : 
     110             : void
     111     3709712 : DGKernel::computeElemNeighResidual(Moose::DGResidualType type)
     112             : {
     113             :   bool is_elem;
     114     3709712 :   if (type == Moose::Element)
     115     1854856 :     is_elem = true;
     116             :   else
     117     1854856 :     is_elem = false;
     118             : 
     119     3709712 :   const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
     120             : 
     121     3709712 :   if (is_elem)
     122     1854856 :     prepareVectorTag(_assembly, _var.number());
     123             :   else
     124     1854856 :     prepareVectorTagNeighbor(_assembly, _var.number());
     125             : 
     126    16180656 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     127             :   {
     128    12470944 :     precalculateQpResidual(type);
     129   169659576 :     for (_i = 0; _i < test_space.size(); _i++)
     130   157188632 :       _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual(type);
     131             :   }
     132             : 
     133     3709712 :   accumulateTaggedLocalResidual();
     134             : 
     135     3709712 :   if (_has_save_in)
     136             :   {
     137        9216 :     Threads::spin_mutex::scoped_lock lock(_resid_vars_mutex);
     138       18432 :     for (const auto & var : _save_in)
     139             :     {
     140             :       const std::vector<dof_id_type> & dof_indices =
     141        9216 :           is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
     142        9216 :       var->sys().solution().add_vector(_local_re, dof_indices);
     143             :     }
     144        9216 :   }
     145     3709712 : }
     146             : 
     147             : void
     148      457584 : DGKernel::computeElemNeighJacobian(Moose::DGJacobianType type)
     149             : {
     150      457584 :   const VariableTestValue & test_space =
     151      457584 :       (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
     152      800772 :   const VariableTestValue & loc_phi =
     153      343188 :       (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
     154             : 
     155      457584 :   if (type == Moose::ElementElement)
     156      114396 :     prepareMatrixTag(_assembly, _var.number(), _var.number());
     157             :   else
     158      343188 :     prepareMatrixTagNeighbor(_assembly, _var.number(), _var.number(), type);
     159             : 
     160     1886448 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     161             :   {
     162     1428864 :     precalculateQpJacobian(type);
     163    17717824 :     for (_i = 0; _i < test_space.size(); _i++)
     164   256766416 :       for (_j = 0; _j < loc_phi.size(); _j++)
     165   240477456 :         _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
     166             :   }
     167             : 
     168      457584 :   accumulateTaggedLocalMatrix();
     169             : 
     170      457584 :   if (_has_diag_save_in && (type == Moose::ElementElement || type == Moose::NeighborNeighbor))
     171             :   {
     172        1536 :     unsigned int rows = _local_ke.m();
     173        1536 :     DenseVector<Number> diag(rows);
     174        7680 :     for (unsigned int i = 0; i < rows; i++)
     175        6144 :       diag(i) = _local_ke(i, i);
     176             : 
     177        1536 :     Threads::spin_mutex::scoped_lock lock(_jacoby_vars_mutex);
     178        3072 :     for (const auto & var : _diag_save_in)
     179             :     {
     180        1536 :       if (type == Moose::ElementElement)
     181         768 :         var->sys().solution().add_vector(diag, var->dofIndices());
     182             :       else
     183         768 :         var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
     184             :     }
     185        1536 :   }
     186      457584 : }
     187             : 
     188             : void
     189       12008 : DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,
     190             :                                           const MooseVariableFEBase & jvar)
     191             : {
     192       12008 :   const VariableTestValue & test_space =
     193       12008 :       (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
     194       21014 :   const VariableTestValue & loc_phi =
     195        9006 :       (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
     196             : 
     197       12008 :   if (type == Moose::ElementElement)
     198        3002 :     prepareMatrixTag(_assembly, _var.number(), jvar.number());
     199             :   else
     200        9006 :     prepareMatrixTagNeighbor(_assembly, _var.number(), jvar.number(), type);
     201             : 
     202       12008 :   if (_local_ke.n() == 0 || _local_ke.m() == 0)
     203        6512 :     return;
     204             : 
     205       19056 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     206             :   {
     207       13560 :     precalculateQpOffDiagJacobian(type, jvar);
     208      101208 :     for (_i = 0; _i < test_space.size(); _i++)
     209      719808 :       for (_j = 0; _j < loc_phi.size(); _j++)
     210      632160 :         _local_ke(_i, _j) +=
     211      632160 :             _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar.number());
     212             :   }
     213             : 
     214        5496 :   accumulateTaggedLocalMatrix();
     215             : }
     216             : 
     217             : Real
     218       98304 : DGKernel::computeQpOffDiagJacobian(Moose::DGJacobianType /*type*/, unsigned int /*jvar*/)
     219             : {
     220       98304 :   return 0.;
     221             : }

Generated by: LCOV version 1.14