LCOV - code coverage report
Current view: top level - src/dgkernels - ArrayDGDiffusion.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 70 75 93.3 %
Date: 2025-07-17 01:28:37 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       14355 : ArrayDGDiffusion::validParams()
      21             : {
      22       14355 :   InputParameters params = ArrayDGKernel::validParams();
      23       14355 :   params.addRequiredParam<MaterialPropertyName>(
      24             :       "diff", "The diffusion (or thermal conductivity or viscosity) coefficient.");
      25       14355 :   params.addParam<Real>("sigma", 4, "sigma");
      26       14355 :   params.addParam<Real>("epsilon", 1, "epsilon");
      27       14355 :   params.addClassDescription("Implements interior penalty method for array diffusion equations.");
      28       14355 :   return params;
      29           0 : }
      30             : 
      31          47 : ArrayDGDiffusion::ArrayDGDiffusion(const InputParameters & parameters)
      32             :   : ArrayDGKernel(parameters),
      33          47 :     _epsilon(getParam<Real>("epsilon")),
      34          47 :     _sigma(getParam<Real>("sigma")),
      35          47 :     _diff(getMaterialProperty<RealEigenVector>("diff")),
      36          47 :     _diff_neighbor(getNeighborMaterialProperty<RealEigenVector>("diff")),
      37          47 :     _res1(_count),
      38          94 :     _res2(_count)
      39             : {
      40          47 : }
      41             : 
      42             : void
      43       15648 : 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       15648 :   const int elem_b_order = std::max(libMesh::Order(1), _var.order());
      50             :   const Real h_elem =
      51       15648 :       _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       15648 :   _res1.noalias() = _diff[_qp].asDiagonal() * _grad_u[_qp] * _array_normals[_qp];
      55       15648 :   _res1.noalias() += _diff_neighbor[_qp].asDiagonal() * _grad_u_neighbor[_qp] * _array_normals[_qp];
      56       15648 :   _res1 *= 0.5;
      57       15648 :   _res1 -= (_u[_qp] - _u_neighbor[_qp]) * _sigma / h_elem;
      58             : 
      59       15648 :   switch (type)
      60             :   {
      61        7824 :     case Moose::Element:
      62        7824 :       _res2.noalias() = _diff[_qp].asDiagonal() * (_u[_qp] - _u_neighbor[_qp]) * _epsilon * 0.5;
      63        7824 :       break;
      64             : 
      65        7824 :     case Moose::Neighbor:
      66        7824 :       _res2.noalias() =
      67       15648 :           _diff_neighbor[_qp].asDiagonal() * (_u[_qp] - _u_neighbor[_qp]) * _epsilon * 0.5;
      68        7824 :       break;
      69             :   }
      70       15648 : }
      71             : 
      72             : void
      73       62592 : ArrayDGDiffusion::computeQpResidual(Moose::DGResidualType type, RealEigenVector & residual)
      74             : {
      75       62592 :   switch (type)
      76             :   {
      77       31296 :     case Moose::Element:
      78       31296 :       residual = -_res1 * _test[_i][_qp] + _res2 * (_grad_test[_i][_qp] * _normals[_qp]);
      79       31296 :       break;
      80             : 
      81       31296 :     case Moose::Neighbor:
      82             :       residual =
      83       31296 :           _res1 * _test_neighbor[_i][_qp] + _res2 * (_grad_test_neighbor[_i][_qp] * _normals[_qp]);
      84       31296 :       break;
      85             :   }
      86       62592 : }
      87             : 
      88             : RealEigenVector
      89      190464 : ArrayDGDiffusion::computeQpJacobian(Moose::DGJacobianType type)
      90             : {
      91      190464 :   RealEigenVector r = RealEigenVector::Zero(_count);
      92             : 
      93      190464 :   const int elem_b_order = std::max(libMesh::Order(1), _var.order());
      94             :   const Real h_elem =
      95      190464 :       _current_elem_volume / _current_side_volume * 1.0 / Utility::pow<2>(elem_b_order);
      96             : 
      97      190464 :   switch (type)
      98             :   {
      99       47616 :     case Moose::ElementElement:
     100       47616 :       r -= _grad_phi[_j][_qp] * _normals[_qp] * _test[_i][_qp] * 0.5 * _diff[_qp];
     101       47616 :       r += _grad_test[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi[_j][_qp] * _diff[_qp];
     102       47616 :       r += RealEigenVector::Constant(_count, _sigma / h_elem * _phi[_j][_qp] * _test[_i][_qp]);
     103       47616 :       break;
     104             : 
     105       47616 :     case Moose::ElementNeighbor:
     106       47616 :       r -= _grad_phi_neighbor[_j][_qp] * _normals[_qp] * _test[_i][_qp] * 0.5 * _diff_neighbor[_qp];
     107       47616 :       r -= _grad_test[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi_neighbor[_j][_qp] *
     108       95232 :            _diff[_qp];
     109           0 :       r -= RealEigenVector::Constant(_count,
     110       47616 :                                      _sigma / h_elem * _phi_neighbor[_j][_qp] * _test[_i][_qp]);
     111       47616 :       break;
     112             : 
     113       47616 :     case Moose::NeighborElement:
     114       47616 :       r += _grad_phi[_j][_qp] * _normals[_qp] * _test_neighbor[_i][_qp] * 0.5 * _diff[_qp];
     115       47616 :       r += _grad_test_neighbor[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi[_j][_qp] *
     116       95232 :            _diff_neighbor[_qp];
     117           0 :       r -= RealEigenVector::Constant(_count,
     118       47616 :                                      _sigma / h_elem * _phi[_j][_qp] * _test_neighbor[_i][_qp]);
     119       47616 :       break;
     120             : 
     121       47616 :     case Moose::NeighborNeighbor:
     122       47616 :       r += _grad_phi_neighbor[_j][_qp] * _normals[_qp] * _test_neighbor[_i][_qp] * 0.5 *
     123       95232 :            _diff_neighbor[_qp];
     124       47616 :       r -= _grad_test_neighbor[_i][_qp] * _normals[_qp] * _epsilon * 0.5 * _phi_neighbor[_j][_qp] *
     125       95232 :            _diff_neighbor[_qp];
     126           0 :       r += RealEigenVector::Constant(
     127       47616 :           _count, _sigma / h_elem * _phi_neighbor[_j][_qp] * _test_neighbor[_i][_qp]);
     128       47616 :       break;
     129             :   }
     130             : 
     131      380928 :   return r;
     132           0 : }

Generated by: LCOV version 1.14