LCOV - code coverage report
Current view: top level - src/userobjects - ADNumericalFlux3EqnHLLC.C (source / functions) Hit Total Coverage
Test: idaholab/moose thermal_hydraulics: #31706 (f8ed4a) with base bb0a08 Lines: 120 120 100.0 %
Date: 2025-11-03 17:29:56 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        8881 : ADNumericalFlux3EqnHLLC::validParams()
      18             : {
      19        8881 :   InputParameters params = ADNumericalFlux3EqnBase::validParams();
      20        8881 :   params += NaNInterface::validParams();
      21             : 
      22       17762 :   MooseEnum wave_speed_formulation("einfeldt davis", "einfeldt");
      23       17762 :   params.addParam<MooseEnum>(
      24             :       "wave_speed_formulation", wave_speed_formulation, "Method for computing wave speeds");
      25             : 
      26       17762 :   params.addRequiredParam<UserObjectName>("fluid_properties",
      27             :                                           "Name for fluid properties user object");
      28             : 
      29        8881 :   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        8881 :   return params;
      33        8881 : }
      34             : 
      35        4850 : ADNumericalFlux3EqnHLLC::ADNumericalFlux3EqnHLLC(const InputParameters & parameters)
      36             :   : ADNumericalFlux3EqnBase(parameters),
      37             :     NaNInterface(this),
      38        4850 :     _fp(getUserObject<SinglePhaseFluidProperties>("fluid_properties")),
      39        4850 :     _wave_speed_formulation(
      40        9700 :         getParam<MooseEnum>("wave_speed_formulation").getEnum<WaveSpeedFormulation>())
      41             : {
      42        4850 : }
      43             : 
      44             : void
      45     4486474 : 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     4486474 :   const ADReal rhoAL = UL[THMVACE3D::RHOA];
      57     4486474 :   const ADReal rhouAL = UL[THMVACE3D::RHOUA];
      58     4486474 :   const ADReal rhovAL = UL[THMVACE3D::RHOVA];
      59     4486474 :   const ADReal rhowAL = UL[THMVACE3D::RHOWA];
      60     4486474 :   const ADReal rhoEAL = UL[THMVACE3D::RHOEA];
      61     4486474 :   const ADReal AL = UL[THMVACE3D::AREA];
      62             : 
      63     4486474 :   const ADReal rhoAR = UR[THMVACE3D::RHOA];
      64     4486474 :   const ADReal rhouAR = UR[THMVACE3D::RHOUA];
      65     4486474 :   const ADReal rhovAR = UR[THMVACE3D::RHOVA];
      66     4486474 :   const ADReal rhowAR = UR[THMVACE3D::RHOWA];
      67     4486474 :   const ADReal rhoEAR = UR[THMVACE3D::RHOEA];
      68     4486474 :   const ADReal AR = UR[THMVACE3D::AREA];
      69             : 
      70             :   // compute the primitive variables
      71             : 
      72             :   const ADReal rhoL = rhoAL / AL;
      73     4486474 :   const ADRealVectorValue uvecL(rhouAL / rhoAL, rhovAL / rhoAL, rhowAL / rhoAL);
      74     4486474 :   const ADReal unL = uvecL * nLR;
      75     4486474 :   const ADReal ut1L = uvecL * t1;
      76     4486474 :   const ADReal ut2L = uvecL * t2;
      77             :   const ADReal rhoEL = rhoEAL / AL;
      78     8972948 :   const ADReal vL = 1.0 / rhoL;
      79             :   const ADReal EL = rhoEAL / rhoAL;
      80     4486474 :   const ADReal eL = EL - 0.5 * uvecL * uvecL;
      81     4486474 :   const ADReal pL = _fp.p_from_v_e(vL, eL);
      82     4486474 :   const ADReal cL = _fp.c_from_v_e(vL, eL);
      83             : 
      84             :   const ADReal rhoR = rhoAR / AR;
      85     4486474 :   const ADRealVectorValue uvecR(rhouAR / rhoAR, rhovAR / rhoAR, rhowAR / rhoAR);
      86     4486474 :   const ADReal unR = uvecR * nLR;
      87     4486474 :   const ADReal ut1R = uvecR * t1;
      88     4486474 :   const ADReal ut2R = uvecR * t2;
      89             :   const ADReal rhoER = rhoEAR / AR;
      90     8972948 :   const ADReal vR = 1.0 / rhoR;
      91             :   const ADReal ER = rhoEAR / rhoAR;
      92     4486474 :   const ADReal eR = ER - 0.5 * uvecR * uvecR;
      93     4486474 :   const ADReal pR = _fp.p_from_v_e(vR, eR);
      94     4486474 :   const ADReal cR = _fp.c_from_v_e(vR, eR);
      95             : 
      96             :   // compute left and right wave speeds
      97             :   ADReal sL, sR;
      98     4486474 :   if (_wave_speed_formulation == WaveSpeedFormulation::EINFELDT)
      99             :   {
     100             :     // compute Roe-averaged variables
     101     4482514 :     const ADReal sqrt_rhoL = sqrt(rhoL);
     102     4482514 :     const ADReal sqrt_rhoR = sqrt(rhoR);
     103     4482514 :     const ADReal un_roe = (sqrt_rhoL * unL + sqrt_rhoR * unR) / (sqrt_rhoL + sqrt_rhoR);
     104     4482514 :     const ADReal ut1_roe = (sqrt_rhoL * ut1L + sqrt_rhoR * ut1R) / (sqrt_rhoL + sqrt_rhoR);
     105     4482514 :     const ADReal ut2_roe = (sqrt_rhoL * ut2L + sqrt_rhoR * ut2R) / (sqrt_rhoL + sqrt_rhoR);
     106     4482514 :     const ADReal HL = EL + pL / rhoL;
     107     4482514 :     const ADReal HR = ER + pR / rhoR;
     108     4482514 :     const ADReal H_roe = (sqrt_rhoL * HL + sqrt_rhoR * HR) / (sqrt_rhoL + sqrt_rhoR);
     109             :     const ADRealVectorValue uvec_roe(un_roe, ut1_roe, ut2_roe);
     110     8965028 :     const ADReal h_roe = H_roe - 0.5 * uvec_roe * uvec_roe;
     111     4482514 :     const ADReal rho_roe = sqrt(rhoL * rhoR);
     112     4482514 :     const ADReal v_roe = 1.0 / rho_roe;
     113     4482514 :     const ADReal e_roe = _fp.e_from_v_h(v_roe, h_roe);
     114     4482514 :     const ADReal c_roe = _fp.c_from_v_e(v_roe, e_roe);
     115             : 
     116     4482514 :     sL = min(unL - cL, un_roe - c_roe);
     117     4482514 :     sR = max(unR + cR, un_roe + c_roe);
     118             :   }
     119        3960 :   else if (_wave_speed_formulation == WaveSpeedFormulation::DAVIS)
     120             :   {
     121        3960 :     sL = min(unL - cL, unR - cR);
     122        3960 :     sR = max(unL + cL, unR + cR);
     123             :   }
     124             :   else
     125             :   {
     126             :     mooseAssert(false, "Invalid 'wave_speed_formulation'.");
     127             :   }
     128             : 
     129             :   // compute middle wave speed
     130     4486474 :   const ADReal sm = (rhoR * unR * (sR - unR) - rhoL * unL * (sL - unL) + pL - pR) /
     131     4486474 :                     (rhoR * (sR - unR) - rhoL * (sL - unL));
     132             : 
     133             :   // compute Omega_L, Omega_R
     134     8972948 :   const ADReal omegL = 1.0 / (sL - sm);
     135     8972948 :   const ADReal omegR = 1.0 / (sR - sm);
     136             : 
     137             :   // compute p^*
     138     4486474 :   const ADReal ps = rhoL * (sL - unL) * (sm - unL) + pL;
     139             : 
     140             :   // compute U_L^*, U_R^*
     141             : 
     142     4486474 :   const ADReal rhoLs = omegL * (sL - unL) * rhoL;
     143     4486474 :   const ADReal rhounLs = omegL * ((sL - unL) * rhoL * unL + ps - pL);
     144     4486474 :   const ADReal rhoELs = omegL * ((sL - unL) * rhoEL - pL * unL + ps * sm);
     145             : 
     146     4486474 :   const ADReal rhoRs = omegR * (sR - unR) * rhoR;
     147     4486474 :   const ADReal rhounRs = omegR * ((sR - unR) * rhoR * unR + ps - pR);
     148     4486474 :   const ADReal rhoERs = omegR * ((sR - unR) * rhoER - pR * unR + ps * sm);
     149             : 
     150     4486474 :   std::vector<ADReal> UL_1d(THMVACE1D::N_FLUX_INPUTS);
     151     4486474 :   UL_1d[THMVACE1D::RHOA] = UL[THMVACE3D::RHOA];
     152     4486474 :   UL_1d[THMVACE1D::RHOUA] = UL[THMVACE3D::RHOUA];
     153     4486474 :   UL_1d[THMVACE1D::RHOEA] = UL[THMVACE3D::RHOEA];
     154     4486474 :   UL_1d[THMVACE1D::AREA] = UL[THMVACE3D::AREA];
     155             : 
     156     4486474 :   std::vector<ADReal> UR_1d(THMVACE1D::N_FLUX_INPUTS);
     157     4486474 :   UR_1d[THMVACE1D::RHOA] = UR[THMVACE3D::RHOA];
     158     4486474 :   UR_1d[THMVACE1D::RHOUA] = UR[THMVACE3D::RHOUA];
     159     4486474 :   UR_1d[THMVACE1D::RHOEA] = UR[THMVACE3D::RHOEA];
     160     4486474 :   UR_1d[THMVACE1D::AREA] = UR[THMVACE3D::AREA];
     161             : 
     162     4486474 :   const ADReal A_flow = computeFlowArea(UL_1d, UR_1d);
     163             : 
     164             :   // compute the fluxes
     165     4486474 :   FL.resize(THMVACE3D::N_FLUX_OUTPUTS);
     166     4486474 :   if (sL > 0.0)
     167             :   {
     168        3921 :     FL[THMVACE3D::MASS] = unL * rhoL * A_flow;
     169        3921 :     FL[THMVACE3D::MOM_NORM] = (unL * rhoL * unL + pL) * A_flow;
     170        3921 :     FL[THMVACE3D::MOM_TAN1] = rhoL * unL * ut1L * A_flow;
     171        3921 :     FL[THMVACE3D::MOM_TAN2] = rhoL * unL * ut2L * A_flow;
     172        3921 :     FL[THMVACE3D::ENERGY] = unL * (rhoEL + pL) * A_flow;
     173             : 
     174        3921 :     _last_region_index = 0;
     175             :   }
     176     4482553 :   else if (sL <= 0.0 && sm > 0.0)
     177             :   {
     178     3610911 :     FL[THMVACE3D::MASS] = sm * rhoLs * A_flow;
     179     3610911 :     FL[THMVACE3D::MOM_NORM] = (sm * rhounLs + ps) * A_flow;
     180     3610911 :     FL[THMVACE3D::MOM_TAN1] = rhounLs * ut1L * A_flow;
     181     3610911 :     FL[THMVACE3D::MOM_TAN2] = rhounLs * ut2L * A_flow;
     182     3610911 :     FL[THMVACE3D::ENERGY] = sm * (rhoELs + ps) * A_flow;
     183             : 
     184     3610911 :     _last_region_index = 1;
     185             :   }
     186      871642 :   else if (sm <= 0.0 && sR >= 0.0)
     187             :   {
     188      867663 :     FL[THMVACE3D::MASS] = sm * rhoRs * A_flow;
     189      867663 :     FL[THMVACE3D::MOM_NORM] = (sm * rhounRs + ps) * A_flow;
     190      867663 :     FL[THMVACE3D::MOM_TAN1] = rhounRs * ut1R * A_flow;
     191      867663 :     FL[THMVACE3D::MOM_TAN2] = rhounRs * ut2R * A_flow;
     192      867663 :     FL[THMVACE3D::ENERGY] = sm * (rhoERs + ps) * A_flow;
     193             : 
     194      867663 :     _last_region_index = 2;
     195             :   }
     196        3979 :   else if (sR < 0.0)
     197             :   {
     198        3929 :     FL[THMVACE3D::MASS] = unR * rhoR * A_flow;
     199        3929 :     FL[THMVACE3D::MOM_NORM] = (unR * rhoR * unR + pR) * A_flow;
     200        3929 :     FL[THMVACE3D::MOM_TAN1] = rhoR * unR * ut1R * A_flow;
     201        3929 :     FL[THMVACE3D::MOM_TAN2] = rhoR * unR * ut2R * A_flow;
     202        3929 :     FL[THMVACE3D::ENERGY] = unR * (rhoER + pR) * A_flow;
     203             : 
     204        3929 :     _last_region_index = 3;
     205             :   }
     206             :   else
     207          50 :     std::fill(FL.begin(), FL.end(), getNaN());
     208             : 
     209     4486474 :   FR = FL;
     210             : 
     211             :   const ADReal A_wall_L = AL - A_flow;
     212     4486474 :   FL[THMVACE3D::MOM_NORM] += pL * A_wall_L;
     213             : 
     214             :   const ADReal A_wall_R = AR - A_flow;
     215     4486474 :   FR[THMVACE3D::MOM_NORM] += pR * A_wall_R;
     216     4486474 : }
     217             : 
     218             : ADReal
     219     4486474 : ADNumericalFlux3EqnHLLC::computeFlowArea(const std::vector<ADReal> & UL,
     220             :                                          const std::vector<ADReal> & UR) const
     221             : {
     222     4486474 :   return std::min(UL[THMVACE1D::AREA], UR[THMVACE1D::AREA]);
     223             : }

Generated by: LCOV version 1.14