LCOV - code coverage report
Current view: top level - src/dgkernels - ArrayDGDiffusion.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 419b9d Lines: 70 75 93.3 %
Date: 2025-08-08 20:01:16 Functions: 5 5 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 "ArrayDGDiffusion.h"
      11             : 
      12             : // MOOSE includes
      13             : #include "MooseVariableFE.h"
      14             : 
      15             : #include "libmesh/utility.h"
      16             : 
      17             : registerMooseObject("MooseApp", ArrayDGDiffusion);
      18             : 
      19             : InputParameters
      20       14361 : ArrayDGDiffusion::validParams()
      21             : {
      22       14361 :   InputParameters params = ArrayDGKernel::validParams();
      23       14361 :   params.addRequiredParam<MaterialPropertyName>(
      24             :       "diff", "The diffusion (or thermal conductivity or viscosity) coefficient.");
      25       14361 :   params.addParam<Real>("sigma", 4, "sigma");
      26       14361 :   params.addParam<Real>("epsilon", 1, "epsilon");
      27       14361 :   params.addClassDescription("Implements interior penalty method for array diffusion equations.");
      28       14361 :   return params;
      29           0 : }
      30             : 
      31          50 : ArrayDGDiffusion::ArrayDGDiffusion(const InputParameters & parameters)
      32             :   : ArrayDGKernel(parameters),
      33          50 :     _epsilon(getParam<Real>("epsilon")),
      34          50 :     _sigma(getParam<Real>("sigma")),
      35          50 :     _diff(getMaterialProperty<RealEigenVector>("diff")),
      36          50 :     _diff_neighbor(getNeighborMaterialProperty<RealEigenVector>("diff")),
      37          50 :     _res1(_count),
      38         100 :     _res2(_count)
      39             : {
      40          50 : }
      41             : 
      42             : void
      43       16512 : ArrayDGDiffusion::initQpResidual(Moose::DGResidualType type)
      44             : {
      45             :   mooseAssert(_diff[_qp].size() == _count && _diff_neighbor[_qp].size() == _count,
      46             :               "'diff' size is inconsistent with the number of components of array "
      47             :               "variable");
      48             : 
      49       16512 :   const int elem_b_order = std::max(libMesh::Order(1), _var.order());
      50             :   const Real h_elem =
      51       16512 :       _current_elem_volume / _current_side_volume * 1.0 / Utility::pow<2>(elem_b_order);
      52             : 
      53             :   // WARNING: use noalias() syntax with caution. See ArrayDiffusion.C for more details.
      54       16512 :   _res1.noalias() = _diff[_qp].asDiagonal() * _grad_u[_qp] * _array_normals[_qp];
      55       16512 :   _res1.noalias() += _diff_neighbor[_qp].asDiagonal() * _grad_u_neighbor[_qp] * _array_normals[_qp];
      56       16512 :   _res1 *= 0.5;
      57       16512 :   _res1 -= (_u[_qp] - _u_neighbor[_qp]) * _sigma / h_elem;
      58             : 
      59       16512 :   switch (type)
      60             :   {
      61        8256 :     case Moose::Element:
      62        8256 :       _res2.noalias() = _diff[_qp].asDiagonal() * (_u[_qp] - _u_neighbor[_qp]) * _epsilon * 0.5;
      63        8256 :       break;
      64             : 
      65        8256 :     case Moose::Neighbor:
      66        8256 :       _res2.noalias() =
      67       16512 :           _diff_neighbor[_qp].asDiagonal() * (_u[_qp] - _u_neighbor[_qp]) * _epsilon * 0.5;
      68        8256 :       break;
      69             :   }
      70       16512 : }
      71             : 
      72             : void
      73       66048 : ArrayDGDiffusion::computeQpResidual(Moose::DGResidualType type, RealEigenVector & residual)
      74             : {
      75       66048 :   switch (type)
      76             :   {
      77       33024 :     case Moose::Element:
      78       33024 :       residual = -_res1 * _test[_i][_qp] + _res2 * (_grad_test[_i][_qp] * _normals[_qp]);
      79       33024 :       break;
      80             : 
      81       33024 :     case Moose::Neighbor:
      82             :       residual =
      83       33024 :           _res1 * _test_neighbor[_i][_qp] + _res2 * (_grad_test_neighbor[_i][_qp] * _normals[_qp]);
      84       33024 :       break;
      85             :   }
      86       66048 : }
      87             : 
      88             : RealEigenVector
      89      208896 : ArrayDGDiffusion::computeQpJacobian(Moose::DGJacobianType type)
      90             : {
      91      208896 :   RealEigenVector r = RealEigenVector::Zero(_count);
      92             : 
      93      208896 :   const int elem_b_order = std::max(libMesh::Order(1), _var.order());
      94             :   const Real h_elem =
      95      208896 :       _current_elem_volume / _current_side_volume * 1.0 / Utility::pow<2>(elem_b_order);
      96             : 
      97      208896 :   switch (type)
      98             :   {
      99       52224 :     case Moose::ElementElement:
     100       52224 :       r -= _grad_phi[_j][_qp] * _normals[_qp] * _test[_i][_qp] * 0.5 * _diff[_qp];
     101       52224 :       r += _grad_test[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi[_j][_qp] * _diff[_qp];
     102       52224 :       r += RealEigenVector::Constant(_count, _sigma / h_elem * _phi[_j][_qp] * _test[_i][_qp]);
     103       52224 :       break;
     104             : 
     105       52224 :     case Moose::ElementNeighbor:
     106       52224 :       r -= _grad_phi_neighbor[_j][_qp] * _normals[_qp] * _test[_i][_qp] * 0.5 * _diff_neighbor[_qp];
     107       52224 :       r -= _grad_test[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi_neighbor[_j][_qp] *
     108      104448 :            _diff[_qp];
     109           0 :       r -= RealEigenVector::Constant(_count,
     110       52224 :                                      _sigma / h_elem * _phi_neighbor[_j][_qp] * _test[_i][_qp]);
     111       52224 :       break;
     112             : 
     113       52224 :     case Moose::NeighborElement:
     114       52224 :       r += _grad_phi[_j][_qp] * _normals[_qp] * _test_neighbor[_i][_qp] * 0.5 * _diff[_qp];
     115       52224 :       r += _grad_test_neighbor[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi[_j][_qp] *
     116      104448 :            _diff_neighbor[_qp];
     117           0 :       r -= RealEigenVector::Constant(_count,
     118       52224 :                                      _sigma / h_elem * _phi[_j][_qp] * _test_neighbor[_i][_qp]);
     119       52224 :       break;
     120             : 
     121       52224 :     case Moose::NeighborNeighbor:
     122       52224 :       r += _grad_phi_neighbor[_j][_qp] * _normals[_qp] * _test_neighbor[_i][_qp] * 0.5 *
     123      104448 :            _diff_neighbor[_qp];
     124       52224 :       r -= _grad_test_neighbor[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi_neighbor[_j][_qp] *
     125      104448 :            _diff_neighbor[_qp];
     126           0 :       r += RealEigenVector::Constant(
     127       52224 :           _count, _sigma / h_elem * _phi_neighbor[_j][_qp] * _test_neighbor[_i][_qp]);
     128       52224 :       break;
     129             :   }
     130             : 
     131      417792 :   return r;
     132           0 : }

Generated by: LCOV version 1.14