LCOV - code coverage report
Current view: top level - src/postprocessors - InterfaceDiffusiveFluxIntegral.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 46 48 95.8 %
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 "InterfaceDiffusiveFluxIntegral.h"
      11             : #include "MathFVUtils.h"
      12             : #include "FaceInfo.h"
      13             : 
      14             : #include "libmesh/remote_elem.h"
      15             : #include "metaphysicl/raw_type.h"
      16             : 
      17             : registerMooseObject("MooseApp", InterfaceDiffusiveFluxIntegral);
      18             : registerMooseObject("MooseApp", ADInterfaceDiffusiveFluxIntegral);
      19             : 
      20             : template <bool is_ad>
      21             : InputParameters
      22       57210 : InterfaceDiffusiveFluxIntegralTempl<is_ad>::validParams()
      23             : {
      24       57210 :   InputParameters params = InterfaceIntegralPostprocessor::validParams();
      25             : 
      26       57210 :   params.addRequiredCoupledVar("variable",
      27             :                                "The name of the variable on the primary side of the interface");
      28       57210 :   params.addCoupledVar("neighbor_variable",
      29             :                        "The name of the variable on the secondary side of the interface.");
      30       57210 :   params.addRequiredParam<MaterialPropertyName>(
      31             :       "diffusivity", "The name of the diffusivity property on the primary side of the interface");
      32       57210 :   params.addParam<MaterialPropertyName>("neighbor_diffusivity",
      33             :                                         "The name of the diffusivity property on the secondary "
      34             :                                         "side of the interface. By default, the "
      35             :                                         "primary side material property name is used for the "
      36             :                                         "secondary side. Only needed for finite volume");
      37       57210 :   MooseEnum interp_method("average harmonic", "harmonic");
      38       57210 :   params.addParam<MooseEnum>(
      39             :       "coeff_interp_method",
      40             :       interp_method,
      41             :       "Switch that can select face interpolation method for diffusion coefficients.");
      42       57210 :   params.addClassDescription("Computes the diffusive flux on the interface.");
      43             : 
      44      114420 :   return params;
      45       57210 : }
      46             : 
      47             : template <bool is_ad>
      48          78 : InterfaceDiffusiveFluxIntegralTempl<is_ad>::InterfaceDiffusiveFluxIntegralTempl(
      49             :     const InputParameters & parameters)
      50             :   : InterfaceIntegralPostprocessor(parameters),
      51          78 :     _grad_u(coupledGradient("variable")),
      52          78 :     _u(coupledValue("variable")),
      53         156 :     _u_neighbor(parameters.isParamSetByUser("neighbor_variable")
      54         156 :                     ? coupledNeighborValue("neighbor_variable")
      55          78 :                     : coupledNeighborValue("variable")),
      56          78 :     _diffusion_coef(
      57          78 :         getGenericMaterialProperty<Real, is_ad>(getParam<MaterialPropertyName>("diffusivity"))),
      58         156 :     _diffusion_coef_neighbor(parameters.isParamSetByUser("neighbor_diffusivity")
      59          78 :                                  ? getGenericNeighborMaterialProperty<Real, is_ad>(
      60          78 :                                        getParam<MaterialPropertyName>("neighbor_diffusivity"))
      61          78 :                                  : getGenericNeighborMaterialProperty<Real, is_ad>(
      62         234 :                                        getParam<MaterialPropertyName>("diffusivity")))
      63             : {
      64             : 
      65             :   // Primary and secondary variable should both be of a similar variable type
      66          78 :   if (parameters.isParamSetByUser("neighbor_variable"))
      67         195 :     if ((_has_fv_vars && !getFieldVar("neighbor_variable", 0)->isFV()) ||
      68         130 :         (!_has_fv_vars && getFieldVar("neighbor_variable", 0)->isFV()))
      69           0 :       mooseError("For the InterfaceDiffusiveFluxIntegral, variable and "
      70             :                  "neighbor_variable should be of a similar variable type.");
      71             : 
      72          78 :   if (!_has_fv_vars && parameters.isParamSetByUser("coeff_interp_method"))
      73           0 :     paramError(
      74             :         "coeff_interp_method",
      75             :         "This parameter should not be defined for the postprocessing of finite element variables!");
      76             : 
      77          78 :   const auto & interp_method = getParam<MooseEnum>("coeff_interp_method");
      78          78 :   if (interp_method == "average")
      79          13 :     _coeff_interp_method = Moose::FV::InterpMethod::Average;
      80          65 :   else if (interp_method == "harmonic")
      81          65 :     _coeff_interp_method = Moose::FV::InterpMethod::HarmonicAverage;
      82          78 : }
      83             : 
      84             : template <bool is_ad>
      85             : Real
      86         400 : InterfaceDiffusiveFluxIntegralTempl<is_ad>::computeQpIntegral()
      87             : {
      88         400 :   if (_has_fv_vars)
      89             :   {
      90             :     mooseAssert(_fi, "This should never be null. If it is then something went wrong in execute()");
      91             : 
      92         176 :     const auto normal = _fi->normal();
      93             : 
      94             :     // Form a finite difference gradient across the interface
      95         176 :     Point one_over_gradient_support = _fi->elemCentroid() - _fi->neighborCentroid();
      96         176 :     one_over_gradient_support /= (one_over_gradient_support * one_over_gradient_support);
      97         176 :     const auto gradient = (_u[_qp] - _u_neighbor[_qp]) * one_over_gradient_support;
      98             : 
      99             :     Real diffusivity;
     100         176 :     interpolate(_coeff_interp_method,
     101             :                 diffusivity,
     102         176 :                 MetaPhysicL::raw_value(_diffusion_coef[_qp]),
     103         176 :                 MetaPhysicL::raw_value(_diffusion_coef_neighbor[_qp]),
     104         176 :                 *_fi,
     105             :                 true);
     106             : 
     107         176 :     return -diffusivity * MetaPhysicL::raw_value(gradient * normal);
     108             :   }
     109             :   else
     110         224 :     return -MetaPhysicL::raw_value(_diffusion_coef[_qp]) * _grad_u[_qp] * _normals[_qp];
     111             : }
     112             : 
     113             : template class InterfaceDiffusiveFluxIntegralTempl<false>;
     114             : template class InterfaceDiffusiveFluxIntegralTempl<true>;

Generated by: LCOV version 1.14