LCOV - code coverage report
Current view: top level - src/userobjects - ADNumericalFlux3EqnHLLC.C (source / functions) Hit Total Coverage
Test: idaholab/moose thermal_hydraulics: #32971 (54bef8) with base c6cf66 Lines: 132 135 97.8 %
Date: 2026-05-29 20:41:18 Functions: 4 4 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 "ADNumericalFlux3EqnHLLC.h"
      11             : #include "THMIndicesVACE.h"
      12             : #include "Numerics.h"
      13             : 
      14             : registerMooseObject("ThermalHydraulicsApp", ADNumericalFlux3EqnHLLC);
      15             : 
      16             : InputParameters
      17        4364 : ADNumericalFlux3EqnHLLC::validParams()
      18             : {
      19        4364 :   InputParameters params = ADNumericalFlux3EqnBase::validParams();
      20        4364 :   params += NaNInterface::validParams();
      21             : 
      22        8728 :   MooseEnum wave_speed_formulation("einfeldt davis", "einfeldt");
      23        8728 :   params.addParam<MooseEnum>(
      24             :       "wave_speed_formulation", wave_speed_formulation, "Method for computing wave speeds");
      25             : 
      26        8728 :   params.addRequiredParam<UserObjectName>("fluid_properties",
      27             :                                           "Name for fluid properties user object");
      28             : 
      29        4364 :   params.addClassDescription("Computes internal side flux for the 1-D, 1-phase, variable-area "
      30             :                              "Euler equations using the HLLC approximate Riemann solver.");
      31             : 
      32        4364 :   return params;
      33        4364 : }
      34             : 
      35        2325 : ADNumericalFlux3EqnHLLC::ADNumericalFlux3EqnHLLC(const InputParameters & parameters)
      36             :   : ADNumericalFlux3EqnBase(parameters),
      37             :     NaNInterface(this),
      38        2325 :     _fp(getUserObject<SinglePhaseFluidProperties>("fluid_properties")),
      39        2325 :     _wave_speed_formulation(
      40        4650 :         getParam<MooseEnum>("wave_speed_formulation").getEnum<WaveSpeedFormulation>())
      41             : {
      42        2325 : }
      43             : 
      44             : void
      45     2556747 : ADNumericalFlux3EqnHLLC::calcFlux(const std::vector<ADReal> & UL,
      46             :                                   const std::vector<ADReal> & UR,
      47             :                                   const RealVectorValue & nLR,
      48             :                                   const RealVectorValue & t1,
      49             :                                   const RealVectorValue & t2,
      50             :                                   std::vector<ADReal> & FL,
      51             :                                   std::vector<ADReal> & FR) const
      52             : {
      53             :   // extract the conserved variables and area
      54             :   using std::sqrt, std::min, std::max;
      55             : 
      56     2556747 :   const ADReal rhoAL = UL[THMVACE3D::RHOA];
      57     2556747 :   const ADReal rhouAL = UL[THMVACE3D::RHOUA];
      58     2556747 :   const ADReal rhovAL = UL[THMVACE3D::RHOVA];
      59     2556747 :   const ADReal rhowAL = UL[THMVACE3D::RHOWA];
      60     2556747 :   const ADReal rhoEAL = UL[THMVACE3D::RHOEA];
      61     2556747 :   const ADReal AL = UL[THMVACE3D::AREA];
      62             : 
      63     2556747 :   const ADReal rhoAR = UR[THMVACE3D::RHOA];
      64     2556747 :   const ADReal rhouAR = UR[THMVACE3D::RHOUA];
      65     2556747 :   const ADReal rhovAR = UR[THMVACE3D::RHOVA];
      66     2556747 :   const ADReal rhowAR = UR[THMVACE3D::RHOWA];
      67     2556747 :   const ADReal rhoEAR = UR[THMVACE3D::RHOEA];
      68     2556747 :   const ADReal AR = UR[THMVACE3D::AREA];
      69             : 
      70     2556747 :   const auto n_passives = UL.size() - THMVACE3D::N_FLUX_INPUTS;
      71     2556747 :   std::vector<ADReal> passivesL(n_passives, 0.0), passivesR(n_passives, 0.0);
      72     2576341 :   for (const auto i : make_range(n_passives))
      73             :   {
      74       39188 :     passivesL[i] = UL[THMVACE3D::N_FLUX_INPUTS + i] / AL;
      75       19594 :     passivesR[i] = UR[THMVACE3D::N_FLUX_INPUTS + i] / AR;
      76             :   }
      77             : 
      78             :   // compute the primitive variables
      79             : 
      80             :   const ADReal rhoL = rhoAL / AL;
      81           0 :   const ADRealVectorValue uvecL(rhouAL / rhoAL, rhovAL / rhoAL, rhowAL / rhoAL);
      82     2556747 :   const ADReal unL = uvecL * nLR;
      83     2556747 :   const ADReal ut1L = uvecL * t1;
      84     2556747 :   const ADReal ut2L = uvecL * t2;
      85             :   const ADReal rhoEL = rhoEAL / AL;
      86     5113494 :   const ADReal vL = 1.0 / rhoL;
      87             :   const ADReal EL = rhoEAL / rhoAL;
      88     2556747 :   const ADReal eL = EL - 0.5 * uvecL * uvecL;
      89     2556747 :   const ADReal pL = _fp.p_from_v_e(vL, eL);
      90     2556747 :   const ADReal cL = _fp.c_from_v_e(vL, eL);
      91             : 
      92             :   const ADReal rhoR = rhoAR / AR;
      93     2556747 :   const ADRealVectorValue uvecR(rhouAR / rhoAR, rhovAR / rhoAR, rhowAR / rhoAR);
      94     2556747 :   const ADReal unR = uvecR * nLR;
      95     2556747 :   const ADReal ut1R = uvecR * t1;
      96     2556747 :   const ADReal ut2R = uvecR * t2;
      97             :   const ADReal rhoER = rhoEAR / AR;
      98     5113494 :   const ADReal vR = 1.0 / rhoR;
      99             :   const ADReal ER = rhoEAR / rhoAR;
     100     2556747 :   const ADReal eR = ER - 0.5 * uvecR * uvecR;
     101     2556747 :   const ADReal pR = _fp.p_from_v_e(vR, eR);
     102     2556747 :   const ADReal cR = _fp.c_from_v_e(vR, eR);
     103             : 
     104             :   // compute left and right wave speeds
     105             :   ADReal sL, sR;
     106     2556747 :   if (_wave_speed_formulation == WaveSpeedFormulation::EINFELDT)
     107             :   {
     108             :     // compute Roe-averaged variables
     109     2554767 :     const ADReal sqrt_rhoL = sqrt(rhoL);
     110     2554767 :     const ADReal sqrt_rhoR = sqrt(rhoR);
     111     2554767 :     const ADReal un_roe = (sqrt_rhoL * unL + sqrt_rhoR * unR) / (sqrt_rhoL + sqrt_rhoR);
     112     2554767 :     const ADReal ut1_roe = (sqrt_rhoL * ut1L + sqrt_rhoR * ut1R) / (sqrt_rhoL + sqrt_rhoR);
     113     2554767 :     const ADReal ut2_roe = (sqrt_rhoL * ut2L + sqrt_rhoR * ut2R) / (sqrt_rhoL + sqrt_rhoR);
     114     2554767 :     const ADReal HL = EL + pL / rhoL;
     115     2554767 :     const ADReal HR = ER + pR / rhoR;
     116     2554767 :     const ADReal H_roe = (sqrt_rhoL * HL + sqrt_rhoR * HR) / (sqrt_rhoL + sqrt_rhoR);
     117             :     const ADRealVectorValue uvec_roe(un_roe, ut1_roe, ut2_roe);
     118     5109534 :     const ADReal h_roe = H_roe - 0.5 * uvec_roe * uvec_roe;
     119     2554767 :     const ADReal rho_roe = sqrt(rhoL * rhoR);
     120     2554767 :     const ADReal v_roe = 1.0 / rho_roe;
     121     2554767 :     const ADReal e_roe = _fp.e_from_v_h(v_roe, h_roe);
     122     2554767 :     const ADReal c_roe = _fp.c_from_v_e(v_roe, e_roe);
     123             : 
     124     2554767 :     sL = min(unL - cL, un_roe - c_roe);
     125     2554767 :     sR = max(unR + cR, un_roe + c_roe);
     126             :   }
     127        1980 :   else if (_wave_speed_formulation == WaveSpeedFormulation::DAVIS)
     128             :   {
     129        1980 :     sL = min(unL - cL, unR - cR);
     130        1980 :     sR = max(unL + cL, unR + cR);
     131             :   }
     132             :   else
     133             :   {
     134             :     mooseAssert(false, "Invalid 'wave_speed_formulation'.");
     135             :   }
     136             : 
     137             :   // compute middle wave speed
     138     2556747 :   const ADReal sm = (rhoR * unR * (sR - unR) - rhoL * unL * (sL - unL) + pL - pR) /
     139     2556747 :                     (rhoR * (sR - unR) - rhoL * (sL - unL));
     140             : 
     141             :   // compute Omega_L, Omega_R
     142     5113494 :   const ADReal omegL = 1.0 / (sL - sm);
     143     5113494 :   const ADReal omegR = 1.0 / (sR - sm);
     144             : 
     145             :   // compute p^*
     146     2556747 :   const ADReal ps = rhoL * (sL - unL) * (sm - unL) + pL;
     147             : 
     148             :   // compute U_L^*, U_R^*
     149             : 
     150     2556747 :   const ADReal rhoLs = omegL * (sL - unL) * rhoL;
     151     2556747 :   const ADReal rhounLs = omegL * ((sL - unL) * rhoL * unL + ps - pL);
     152     2556747 :   const ADReal rhoELs = omegL * ((sL - unL) * rhoEL - pL * unL + ps * sm);
     153             : 
     154     2556747 :   const ADReal rhoRs = omegR * (sR - unR) * rhoR;
     155     2556747 :   const ADReal rhounRs = omegR * ((sR - unR) * rhoR * unR + ps - pR);
     156     2556747 :   const ADReal rhoERs = omegR * ((sR - unR) * rhoER - pR * unR + ps * sm);
     157             : 
     158     2556747 :   std::vector<ADReal> UL_1d(THMVACE1D::N_FLUX_INPUTS);
     159     2556747 :   UL_1d[THMVACE1D::RHOA] = UL[THMVACE3D::RHOA];
     160     2556747 :   UL_1d[THMVACE1D::RHOUA] = UL[THMVACE3D::RHOUA];
     161     2556747 :   UL_1d[THMVACE1D::RHOEA] = UL[THMVACE3D::RHOEA];
     162     2556747 :   UL_1d[THMVACE1D::AREA] = UL[THMVACE3D::AREA];
     163             : 
     164     2556747 :   std::vector<ADReal> UR_1d(THMVACE1D::N_FLUX_INPUTS);
     165     2556747 :   UR_1d[THMVACE1D::RHOA] = UR[THMVACE3D::RHOA];
     166     2556747 :   UR_1d[THMVACE1D::RHOUA] = UR[THMVACE3D::RHOUA];
     167     2556747 :   UR_1d[THMVACE1D::RHOEA] = UR[THMVACE3D::RHOEA];
     168     2556747 :   UR_1d[THMVACE1D::AREA] = UR[THMVACE3D::AREA];
     169             : 
     170     2556747 :   const ADReal A_flow = computeFlowArea(UL_1d, UR_1d);
     171             : 
     172             :   // compute the fluxes
     173     2556747 :   FL.resize(THMVACE3D::N_FLUX_OUTPUTS + n_passives);
     174     2556747 :   if (sL > 0.0)
     175             :   {
     176        1961 :     FL[THMVACE3D::MASS] = unL * rhoL * A_flow;
     177        1961 :     FL[THMVACE3D::MOM_NORM] = (unL * rhoL * unL + pL) * A_flow;
     178        1961 :     FL[THMVACE3D::MOM_TAN1] = rhoL * unL * ut1L * A_flow;
     179        1961 :     FL[THMVACE3D::MOM_TAN2] = rhoL * unL * ut2L * A_flow;
     180        1961 :     FL[THMVACE3D::ENERGY] = unL * (rhoEL + pL) * A_flow;
     181        1961 :     for (const auto i : make_range(n_passives))
     182           0 :       FL[THMVACE3D::N_FLUX_OUTPUTS + i] = passivesL[i] * unL * A_flow;
     183             : 
     184        1961 :     _last_region_index = 0;
     185             :   }
     186     2554786 :   else if (sL <= 0.0 && sm > 0.0)
     187             :   {
     188     2022683 :     FL[THMVACE3D::MASS] = sm * rhoLs * A_flow;
     189     2022683 :     FL[THMVACE3D::MOM_NORM] = (sm * rhounLs + ps) * A_flow;
     190     2022683 :     FL[THMVACE3D::MOM_TAN1] = rhounLs * ut1L * A_flow;
     191     2022683 :     FL[THMVACE3D::MOM_TAN2] = rhounLs * ut2L * A_flow;
     192     2022683 :     FL[THMVACE3D::ENERGY] = sm * (rhoELs + ps) * A_flow;
     193     2042083 :     for (const auto i : make_range(n_passives))
     194             :     {
     195       19400 :       const auto passiveLs = omegL * (sL - unL) * passivesL[i];
     196       19400 :       FL[THMVACE3D::N_FLUX_OUTPUTS + i] = passiveLs * sm * A_flow;
     197             :     }
     198             : 
     199     2022683 :     _last_region_index = 1;
     200             :   }
     201      532103 :   else if (sm <= 0.0 && sR >= 0.0)
     202             :   {
     203      530114 :     FL[THMVACE3D::MASS] = sm * rhoRs * A_flow;
     204      530114 :     FL[THMVACE3D::MOM_NORM] = (sm * rhounRs + ps) * A_flow;
     205      530114 :     FL[THMVACE3D::MOM_TAN1] = rhounRs * ut1R * A_flow;
     206      530114 :     FL[THMVACE3D::MOM_TAN2] = rhounRs * ut2R * A_flow;
     207      530114 :     FL[THMVACE3D::ENERGY] = sm * (rhoERs + ps) * A_flow;
     208      530308 :     for (const auto i : make_range(n_passives))
     209             :     {
     210         194 :       const auto passiveRs = omegR * (sR - unR) * passivesR[i];
     211         194 :       FL[THMVACE3D::N_FLUX_OUTPUTS + i] = passiveRs * sm * A_flow;
     212             :     }
     213             : 
     214      530114 :     _last_region_index = 2;
     215             :   }
     216        1989 :   else if (sR < 0.0)
     217             :   {
     218        1965 :     FL[THMVACE3D::MASS] = unR * rhoR * A_flow;
     219        1965 :     FL[THMVACE3D::MOM_NORM] = (unR * rhoR * unR + pR) * A_flow;
     220        1965 :     FL[THMVACE3D::MOM_TAN1] = rhoR * unR * ut1R * A_flow;
     221        1965 :     FL[THMVACE3D::MOM_TAN2] = rhoR * unR * ut2R * A_flow;
     222        1965 :     FL[THMVACE3D::ENERGY] = unR * (rhoER + pR) * A_flow;
     223        1965 :     for (const auto i : make_range(n_passives))
     224           0 :       FL[THMVACE3D::N_FLUX_OUTPUTS + i] = passivesR[i] * unR * A_flow;
     225             : 
     226        1965 :     _last_region_index = 3;
     227             :   }
     228             :   else
     229          24 :     std::fill(FL.begin(), FL.end(), getNaN());
     230             : 
     231     2556747 :   FR = FL;
     232             : 
     233             :   const ADReal A_wall_L = AL - A_flow;
     234     2556747 :   FL[THMVACE3D::MOM_NORM] += pL * A_wall_L;
     235             : 
     236             :   const ADReal A_wall_R = AR - A_flow;
     237     2556747 :   FR[THMVACE3D::MOM_NORM] += pR * A_wall_R;
     238     2556747 : }
     239             : 
     240             : ADReal
     241     2556747 : ADNumericalFlux3EqnHLLC::computeFlowArea(const std::vector<ADReal> & UL,
     242             :                                          const std::vector<ADReal> & UR) const
     243             : {
     244     2556747 :   return std::min(UL[THMVACE1D::AREA], UR[THMVACE1D::AREA]);
     245             : }

Generated by: LCOV version 1.14