LCOV - code coverage report
Current view: top level - src/Solver/Local/Riemann - Roe.H (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 75.0 % 160 120
Test Date: 2026-03-09 13:26:47 Functions: 100.0 % 3 3

            Line data    Source code
       1              : //
       2              : // This implements the Riemann Roe solver.
       3              : //
       4              : // Notation and algorithm follow the presentation in Section 5.3.3
       5              : // of *Computational Gasdynamics* by Culbert B. Laney (page 88)
       6              : //
       7              : // This solver uses an optional entropy fix
       8              : //   Option 1: chimeracfd method https://chimeracfd.com/programming/gryphon/fluxroe.html
       9              : //   Option 2: Eq. 4.3.67 in *Computational Fluid Dynamics for Engineers and Scientists* by Sreenivas Jayanti
      10              : //
      11              : 
      12              : #ifndef SOLVER_LOCAL_RIEMANN_ROE_H
      13              : #define SOLVER_LOCAL_RIEMANN_ROE_H
      14              : 
      15              : #include "IO/ParmParse.H"
      16              : #include "Solver/Local/Riemann/Riemann.H"
      17              : 
      18              : /// A bunch of solvers
      19              : namespace Solver
      20              : {
      21              : /// Local solvers
      22              : namespace Local
      23              : {
      24              : 
      25              : namespace Riemann
      26              : {
      27              : 
      28              : /// Roe Riemann Solver based on Gas Dynamics - Culbert B. Laney
      29              : class Roe : public Riemann
      30              : {
      31              : public:
      32              : 
      33              : 
      34              :     static constexpr const char* name = "roe";
      35            5 :     Roe (IO::ParmParse &pp, std::string name) 
      36            5 :     {pp_queryclass(name,*this);}
      37              :     Roe (IO::ParmParse &pp) 
      38              :     {pp_queryclass(*this);}
      39              :     Roe () 
      40              :     {
      41              :         IO::ParmParse pp;
      42              :         pp_queryclass(*this);
      43              :     }
      44              : 
      45              :     int verbose = 0;
      46              :     int entropy_fix = 0;
      47              :     int lowmach = 0;
      48              :     Set::Scalar phi = NAN;
      49              : 
      50            5 :     static void Parse(Roe & value, IO::ParmParse & pp)
      51              :     {
      52              :         // enable to dump diagnostic data if the roe solver fails
      53           10 :         pp.query_default("verbose", value.verbose, 1);
      54              :         // apply entropy fix if tru
      55           10 :         pp.query_default("entropy_fix", value.entropy_fix, false);
      56              : 
      57              :         // Apply the lowmach fix descripte in Rieper 2010
      58              :         // "A low-Mach number fix for Roe’s approximate Riemann solver"
      59           10 :         pp.query_default("lowmach",value.lowmach,false);
      60              : 
      61              : 
      62            5 :         if (value.entropy_fix == 1)
      63            4 :             Util::Warning(INFO,"The entropy fix is experimental and should be used with caution");
      64            4 :         else if (value.entropy_fix == 2)
      65            4 :             Util::Warning(INFO,"The entropy fix is experimental and should be used with caution. Has previously caused errors with FlowDrivenCavity regression test");
      66            5 :     }
      67              : 
      68     36044800 :     virtual Flux Solve(State lo, State hi, Model::Gas::Gas& gas, Set::Patch<const Set::Scalar>& X, int i, int j, int k, int side, Set::Scalar small) override
      69              :     {
      70     36044800 :         Set::Scalar rho_L = lo.rho       ,  rho_R = hi.rho;
      71     36044800 :         Set::Scalar Mn_L  = lo.M_normal  ,  Mn_R  = hi.M_normal  ;
      72     36044800 :         Set::Scalar Mt_L  = lo.M_tangent ,  Mt_R  = hi.M_tangent ;
      73     36044800 :         Set::Scalar E_L   = lo.E         ,  E_R   = hi.E         ;
      74              : 
      75              :         // Ensure no negative densities
      76     36044800 :         rho_L = std::max(small,rho_L);
      77     36044800 :         rho_R = std::max(small,rho_R);
      78              : 
      79              :         // STEP 1: Compute fluid primitives
      80              : 
      81              :         // This is a modification to Laney allowing for an arbitrary equation of state
      82              :         //////////////////////////////////////////////////////////////////////////////////////////////////
      83     36044800 :         Set::Scalar T_L=0, T_R=0, p_L=0, p_R=0, gamma_L=0, gamma_R=0;
      84     36044800 :         switch (side) {
      85      9011200 :             case 0: // xlo
      86      9011200 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i-1, j ,k);
      87      9011200 :                 p_L = gas.ComputeP(rho_L, T_L, X, i-1, j, k);
      88      9011200 :                 gamma_L = gas.gamma(T_L, X, i-1, j, k);
      89      9011200 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
      90      9011200 :                 p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
      91      9011200 :                 gamma_R = gas.gamma(T_R, X, i, j, k);
      92      9011200 :                 break;
      93      9011200 :             case 1: // xhi
      94      9011200 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
      95      9011200 :                 p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
      96      9011200 :                 gamma_L = gas.gamma(T_L, X, i, j, k);
      97      9011200 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i+1, j ,k);
      98      9011200 :                 p_R = gas.ComputeP(rho_R, T_R, X, i+1, j, k);
      99      9011200 :                 gamma_R = gas.gamma(T_R, X, i+1, j, k);
     100      9011200 :                 break;
     101      9011200 :             case 2: // ylo
     102      9011200 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j-1 ,k);
     103      9011200 :                 p_L = gas.ComputeP(rho_L, T_L, X, i, j-1, k);
     104      9011200 :                 gamma_L = gas.gamma(T_L, X, i, j-1, k);
     105      9011200 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
     106      9011200 :                 p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
     107      9011200 :                 gamma_R = gas.gamma(T_R, X, i, j, k);
     108      9011200 :                 break;
     109      9011200 :             case 3: // yhi
     110      9011200 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
     111      9011200 :                 p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
     112      9011200 :                 gamma_L = gas.gamma(T_L, X, i, j, k);
     113      9011200 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j+1 ,k);
     114      9011200 :                 p_R = gas.ComputeP(rho_R, T_R, X, i, j+1, k);
     115      9011200 :                 gamma_R = gas.gamma(T_R, X, i, j+1, k);
     116      9011200 :                 break;
     117            0 :             case 4: // zlo
     118            0 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k-1);
     119            0 :                 p_L = gas.ComputeP(rho_L, T_L, X, i, j, k-1);
     120            0 :                 gamma_L = gas.gamma(T_L, X, i, j, k-1);
     121            0 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k);
     122            0 :                 p_R = gas.ComputeP(rho_R, T_R, X, i, j, k);
     123            0 :                 gamma_R = gas.gamma(T_R, X, i, j, k);
     124            0 :                 break;
     125            0 :             case 5: // zhi
     126            0 :                 T_L = gas.ComputeT(rho_L, lo.M_normal, lo.M_tangent, E_L, 500.0, X, i, j ,k);
     127            0 :                 p_L = gas.ComputeP(rho_L, T_L, X, i, j, k);
     128            0 :                 gamma_L = gas.gamma(T_L, X, i, j, k);
     129            0 :                 T_R = gas.ComputeT(rho_R, hi.M_normal, hi.M_tangent, E_R, 500.0, X, i, j ,k+1);
     130            0 :                 p_R = gas.ComputeP(rho_R, T_R, X, i, j, k+1);
     131            0 :                 gamma_R = gas.gamma(T_R, X, i, j, k+1);
     132            0 :                 break;
     133            0 :             default:
     134            0 :                 Util::Abort(INFO, "Unknown side in Riemann solver, ",side);
     135              :         }
     136              :         //////////////////////////////////////////////////////////////////////////////////////////////////
     137              : 
     138     36044800 :         Set::Scalar ke_L = 0.5 * (Mn_L * Mn_L /*+ Mt_L * Mt_L*/) / (rho_L+small); // KE per unit volume
     139     36044800 :         Set::Scalar ue_L = E_L - ke_L;                                            // IE per unit volume
     140     36044800 :         Set::Scalar h_TL = (ke_L + ue_L + p_L) / (rho_L+small);                   // specific stagnation enthalpy (per unit mass)
     141              : 
     142     36044800 :         Set::Scalar ke_R = 0.5 * (Mn_R * Mn_R /*+ Mt_R * Mt_R*/) / (rho_R+small);
     143     36044800 :         Set::Scalar ue_R = E_R - ke_R;
     144     36044800 :         Set::Scalar h_TR = (ke_R + ue_R + p_R) / (rho_R+small);
     145              : 
     146     36044800 :         Set::Scalar u_L   = Mn_L/(rho_L+small),  u_R   = Mn_R/(rho_R+small);
     147     36044800 :         Set::Scalar v_L   = Mt_L/(rho_L+small),  v_R   = Mt_R/(rho_R+small);
     148              :         
     149              :         //
     150              :         // STEP 2: Compute Roe-averaged quantities
     151              :         // 
     152     36044800 :         Set::Scalar rho_RL  = std::sqrt(rho_L * rho_R);
     153     36044800 :         Set::Scalar u_RL    = (std::sqrt(rho_L) * u_L  + std::sqrt(rho_R) * u_R ) / (std::sqrt(rho_L) + std::sqrt(rho_R) + small);
     154     36044800 :         Set::Scalar h_RL    = (std::sqrt(rho_L) * h_TL + std::sqrt(rho_R) * h_TR) / (std::sqrt(rho_L) + std::sqrt(rho_R) + small);
     155              :         // This is not thermodynamically consistent to compute gamma_RL - need to compute a Roe-Average composition, temperature, and then gamma for consistency
     156              :         // But is should be a semi-close appproximation for now.
     157     36044800 :         Set::Scalar gamma_RL    = (std::sqrt(rho_L) * gamma_L + std::sqrt(rho_R) * gamma_R) / (std::sqrt(rho_L) + std::sqrt(rho_R) + small); 
     158     36044800 :         Set::Scalar a_RL_sq = std::max(0.0,(gamma_RL - 1.0) * (h_RL - 0.5 * u_RL * u_RL));
     159              : 
     160              : #ifdef AMREX_DEBUG
     161              :         if (verbose && ((a_RL_sq<0) || (a_RL_sq!=a_RL_sq)))
     162              :         {   
     163              :             Util::Message(INFO, "sound speed ", a_RL_sq);
     164              : 
     165              :             Util::Message(INFO, "mixed rho ", lo.rho, " ", hi.rho);
     166              :             Util::Message(INFO, "mixed Mn ", lo.M_normal, " ", hi.M_normal);
     167              :             Util::Message(INFO, "mixed Mt ", lo.M_tangent, " ", hi.M_tangent);
     168              :             Util::Message(INFO, "mixed E ", lo.E, " ", hi.E);
     169              : 
     170              :             Util::Message(INFO, "fluid rho ", rho_L, " ", rho_R);
     171              :             Util::Message(INFO, "fluid Mn ", Mn_L, " ", Mn_R);
     172              :             Util::Message(INFO, "fluid Mt ", Mt_L, " ", Mt_R);
     173              :             Util::Message(INFO, "fluid E ", E_L, " ", E_R);
     174              : 
     175              :             Util::Message(INFO, "fluid rho ", rho_L, " ", rho_R);
     176              :             Util::Message(INFO, "fluid u ", u_L, " ", u_R);
     177              :             Util::Message(INFO, "fluid v ", v_L, " ", v_R);
     178              :             Util::Message(INFO, "fluid p ", p_L, " ", p_R);
     179              :         }
     180              :         Util::AssertException(INFO,TEST(a_RL_sq==a_RL_sq)," a_RL_sq is nan/inf; (a_RL_sq=", a_RL_sq,")");
     181              :         Util::AssertException(INFO,TEST(a_RL_sq>=0),      " a_RL_sq is negative; (a_RL_sq=(",a_RL_sq,")");
     182              : #endif
     183              : 
     184     36044800 :         Set::Scalar a_RL = std::sqrt(a_RL_sq) + small;
     185              : 
     186              :         //
     187              :         // STEP 3: Compute Roe-averaged wave speeds
     188              :         //
     189     36044800 :         Set::Scalar lambda1 = u_RL;          // 5.53a
     190     36044800 :         Set::Scalar lambda2 = u_RL + a_RL;   // 5.53b
     191     36044800 :         Set::Scalar lambda3 = u_RL - a_RL;   // 5.53c
     192              : 
     193              :         //
     194              :         // STEP 4: Compute wave strengths
     195              :         //
     196     36044800 :         Set::Scalar deltarho= rho_R - rho_L;
     197     36044800 :         Set::Scalar deltap  = p_R - p_L;
     198     36044800 :         Set::Scalar deltau  = u_R - u_L;
     199              : 
     200     36044800 :         if (lowmach)
     201              :         {
     202            0 :             Set::Scalar v_RL    = (std::sqrt(rho_L) * v_L  + std::sqrt(rho_R) * v_R ) / 
     203            0 :                 (std::sqrt(rho_L) + std::sqrt(rho_R) + small);
     204            0 :             Set::Scalar Ma = (std::abs(u_RL) + std::abs(v_RL)) / (a_RL + small);
     205            0 :             Ma = std::min(Ma, 1.0);
     206            0 :             deltau *= Ma;
     207              :         }
     208              : 
     209     36044800 :         Set::Scalar deltav1 = deltarho - deltap / (a_RL_sq + small);       // 5.54a
     210     36044800 :         Set::Scalar deltav2 = deltau   + deltap / (rho_RL * a_RL + small); // 5.54b
     211     36044800 :         Set::Scalar deltav3 = deltau   - deltap / (rho_RL * a_RL + small); // 5.54c
     212              : 
     213              :         //
     214              :         // STEP 5: Compute the right eigenvectors
     215              :         //
     216     36044800 :         Set::Scalar r11 = 1.0;
     217     36044800 :         Set::Scalar r12 = u_RL;
     218     36044800 :         Set::Scalar r13 = 0.5*u_RL*u_RL;
     219     36044800 :         Set::Scalar r21 = 0.5*rho_RL/a_RL;
     220     36044800 :         Set::Scalar r22 = 0.5*rho_RL/a_RL * ( u_RL + a_RL );
     221     36044800 :         Set::Scalar r23 = 0.5*rho_RL/a_RL * ( h_RL + a_RL*u_RL );
     222     36044800 :         Set::Scalar r31 = -0.5*rho_RL/a_RL;
     223     36044800 :         Set::Scalar r32 = -0.5*rho_RL/a_RL * ( u_RL - a_RL );
     224     36044800 :         Set::Scalar r33 = -0.5*rho_RL/a_RL * ( h_RL - a_RL*u_RL );
     225              : 
     226              :         //
     227              :         // STEP 6: Compute solution - not needed since fluxes will be computed in STEP 7
     228              :         //
     229              : 
     230              :         //
     231              :         // ROE ENTROPY FIX (Source cited in header comments)
     232              :         //
     233     36044800 :         if (entropy_fix == 1) { // chimeracfd
     234      8192000 :             lambda1 = fabs(lambda1);
     235      8192000 :             lambda2 = fabs(lambda2);
     236      8192000 :             lambda3 = fabs(lambda3);
     237      8192000 :             if ( lambda1 < deltau ) lambda1 = 0.5*(lambda1*lambda1 + deltau*deltau)/deltau;
     238      8192000 :             if ( lambda2 < deltau ) lambda2 = 0.5*(lambda2*lambda2 + deltau*deltau)/deltau;
     239      8192000 :             if ( lambda3 < deltau ) lambda3 = 0.5*(lambda3*lambda3 + deltau*deltau)/deltau;
     240              :         }
     241     27852800 :         else if (entropy_fix == 2) { // Jayanti
     242      8192000 :             Set::Scalar a_L = std::sqrt(gamma_L * p_L / (rho_L + small)); // sound speed
     243      8192000 :             Set::Scalar a_R = std::sqrt(gamma_R * p_R / (rho_R + small));
     244      8192000 :             Set::Scalar lambda1_L = u_L;         Set::Scalar lambda1_R = u_R; // eigenvalues
     245      8192000 :             Set::Scalar lambda2_L = u_L + a_L;   Set::Scalar lambda2_R = u_R + a_R;
     246      8192000 :             Set::Scalar lambda3_L = u_L - a_L;   Set::Scalar lambda3_R = u_R - a_R;
     247      8192000 :             Set::Scalar fix1 = std::max(0.0, std::max(lambda1 - lambda1_L, lambda1_R - lambda1));
     248      8192000 :             Set::Scalar fix2 = std::max(0.0, std::max(lambda2 - lambda2_L, lambda2_R - lambda2));
     249      8192000 :             Set::Scalar fix3 = std::max(0.0, std::max(lambda3 - lambda3_L, lambda3_R - lambda3));
     250      8192000 :             if ( lambda1 < fix1 ) lambda1 = fix1;
     251      8192000 :             if ( lambda2 < fix2 ) lambda2 = fix2;
     252      8192000 :             if ( lambda3 < fix3 ) lambda3 = fix3;
     253              :         }
     254              : 
     255              :         //
     256              :         // STEP 7: Compute fluxes
     257              :         //
     258     36044800 :         Flux fl;
     259              :         
     260     36044800 :         fl.mass = (0.5*(rho_L*u_L + rho_R*u_R) - 0.5*(
     261     36044800 :                         r11*fabs(lambda1)*deltav1 +
     262     36044800 :                         r21*fabs(lambda2)*deltav2 +
     263     36044800 :                         r31*fabs(lambda3)*deltav3)
     264              :             );
     265              :         
     266     36044800 :         if (fl.mass != fl.mass)
     267              :         {
     268            0 :             if (verbose)
     269              :             {
     270            0 :                 Util::ParallelMessage(INFO,"hi ", hi);
     271            0 :                 Util::ParallelMessage(INFO,"lo ", lo);
     272            0 :                 Util::ParallelMessage(INFO,"rho_R ", rho_R);
     273            0 :                 Util::ParallelMessage(INFO,"rho_L ", rho_L);
     274            0 :                 Util::ParallelMessage(INFO,"rho_RL ", rho_RL); 
     275            0 :                 Util::ParallelMessage(INFO,"u_R ", u_R);
     276            0 :                 Util::ParallelMessage(INFO,"u_L ", u_L);
     277            0 :                 Util::ParallelMessage(INFO,"u_RL ", u_RL); 
     278            0 :                 Util::ParallelMessage(INFO,"a_RL ", a_RL);
     279            0 :                 Util::ParallelMessage(INFO,"lambda1 ", lambda1); 
     280            0 :                 Util::ParallelMessage(INFO,"lambda2 ", lambda2); 
     281            0 :                 Util::ParallelMessage(INFO,"lambda3 ", lambda3); 
     282            0 :                 Util::ParallelMessage(INFO,"deltav1 ", deltav1); 
     283            0 :                 Util::ParallelMessage(INFO,"deltav2 ", deltav2);
     284            0 :                 Util::ParallelMessage(INFO,"deltav3 ", deltav3);
     285              :             }
     286            0 :             Util::Exception(INFO);
     287              :         }
     288              : 
     289              : 
     290     36044800 :         fl.momentum_normal = ( 0.5*(rho_L*u_L*u_L + p_L + rho_R*u_R*u_R + p_R) - 0.5*(
     291     36044800 :                                     r12*fabs(lambda1)*deltav1 +
     292     36044800 :                                     r22*fabs(lambda2)*deltav2 +
     293     36044800 :                                     r32*fabs(lambda3)*deltav3)
     294              :             );
     295              : 
     296              : 
     297     36044800 :         fl.energy = (   0.5*(u_L*(ke_L + p_L + ue_L) + u_R*(ke_R + p_R + ue_R)) - 0.5*
     298              :                         (
     299     36044800 :                             r13*fabs(lambda1)*deltav1 +
     300     36044800 :                             r23*fabs(lambda2)*deltav2 +
     301     36044800 :                             r33*fabs(lambda3)*deltav3)
     302              :             );
     303              : 
     304              :         //
     305              :         // (Update the tangential momentum flux)
     306              :         //
     307     36044800 :         fl.momentum_tangent = 0.5 * (rho_L * u_L * v_L + rho_R * u_R * v_R);
     308              : 
     309     72089600 :         return fl;
     310              :     }
     311              : 
     312              : 
     313              :     //static int Test()
     314              :     //{
     315              :     //    Roe solver;
     316              :     //    
     317              : 
     318              :     //    int failed = 0;
     319              : 
     320              :     //    Set::Scalar gamma = 1.4;
     321              :     //    Set::Scalar pref = 10.0;
     322              :     //    Set::Scalar small = 1E-10;
     323              : 
     324              :     //    // Test 1: Tangential Velocity Difference - No Normal Flux
     325              :     //    try {
     326              :     //        State left  (1.0, 1.0, 0.0, 1.0);
     327              :     //        State center(1.0, 1.0, 1.0, 1.0);
     328              :     //        State right (1.0, 1.0, 2.0, 1.0);
     329              :     //        Flux fluxlo = solver.Solve(center, right, gamma, pref, small);
     330              :     //        Flux fluxhi = solver.Solve(left, center,  gamma, pref, small);
     331              : 
     332              :     //        if (fabs(fluxhi.mass - fluxlo.mass) > 1E-10
     333              :     //            || fabs(fluxhi.momentum_normal - fluxlo.momentum_normal) > 1E-10
     334              :     //            || fabs(fluxhi.energy - fluxlo.energy) > 1E-10) {
     335              :     //            Util::Warning(INFO,   "left:    ",left);
     336              :     //            Util::Warning(INFO,   "center:  ",center);
     337              :     //            Util::Warning(INFO,   "right:   ",right);
     338              :     //            Util::Warning(INFO,   "Fluxlo:  ",fluxlo);
     339              :     //            Util::Warning(INFO,   "Fluxhi:  ",fluxhi);
     340              :     //            Util::Exception(INFO, "Tangential velocity difference incorrectly affecting normal flux.");
     341              :     //        }
     342              :     //        Util::Test::SubMessage("Test 1: Tangential velocity should induce no normal flux",0);
     343              :     //    } catch (const std::runtime_error& e)
     344              :     //    {
     345              :     //        failed++;
     346              :     //        Util::Test::SubMessage("Test 1: Tangential velocity should induce no normal flux",1);
     347              :     //    }
     348              : 
     349              :     //    // Test 2: Pure Transverse Velocity Difference
     350              :     //    try {
     351              :     //        State left  (1.0, 0.0, 0.0, 1.0);
     352              :     //        State center(1.0, 0.0, 1.0, 1.0);
     353              :     //        State right (1.0, 0.0, 2.0, 1.0);
     354              :     //        Flux fluxlo = solver.Solve(left, center,  gamma, pref, small);
     355              :     //        Flux fluxhi = solver.Solve(center, right, gamma, pref, small);
     356              :     //        if (fabs(fluxhi.mass - fluxlo.mass) > 1E-10
     357              :     //            || fabs(fluxhi.momentum_normal - fluxlo.momentum_normal) > 1E-10
     358              :     //            || fabs(fluxhi.energy - fluxlo.energy) > 1E-10) {
     359              :     //            Util::Warning(INFO,   "left:  ",left);
     360              :     //            Util::Warning(INFO,   "center: ",center);
     361              :     //            Util::Warning(INFO,   "right: ",right);
     362              :     //            Util::Warning(INFO,   "Fluxhi:  ",fluxhi);
     363              :     //            Util::Warning(INFO,   "Fluxlo:  ",fluxlo);
     364              :     //            Util::Exception(INFO, "Pure transverse velocity difference affecting normal flux.");
     365              :     //        }
     366              :     //        Util::Test::SubMessage("Test 2: Pure transverse velocity difference",0);
     367              :     //    } catch (const std::runtime_error& e)
     368              :     //    {
     369              :     //        failed++;
     370              :     //        Util::Test::SubMessage("Test 2: Pure transverse velocity difference",1);
     371              :     //    }
     372              : 
     373              :     //    // Test 3: Symmetry Test (no flux across identical states)
     374              :     //    try {
     375              :     //        State left(1.0, 0.0, 0.0, 1.0);
     376              :     //        State center(1.0, 0.0, 0.0, 1.0);
     377              :     //        State right(1.0, 0.0, 0.0, 1.0);
     378              :     //        Flux fluxhi = solver.Solve(center, right, gamma, pref, small);
     379              :     //        Flux fluxlo = solver.Solve(left, center, gamma, pref, small);
     380              :     //        if (fabs(fluxhi.mass - fluxlo.mass) > 1E-10 // no change in mass flux
     381              :     //            || fabs(fluxhi.momentum_normal - fluxlo.momentum_normal) > 1E-10 // no change in momentum flux
     382              :     //            || fabs(fluxhi.momentum_tangent) > 1E-10 // zero tangent flux
     383              :     //            || fabs(fluxlo.momentum_tangent) > 1E-10 // zero tangent flux
     384              :     //            || fabs(fluxhi.energy-fluxlo.energy) > 1E-10 // no change in energy flux
     385              :     //            ) {
     386              :     //            Util::Warning(INFO,   "left:  ",left);
     387              :     //            Util::Warning(INFO,   "right: ",right);
     388              :     //            Util::Warning(INFO,   "Fluxhi:  ",fluxhi);
     389              :     //            Util::Warning(INFO,   "Fluxlo:  ",fluxlo);
     390              :     //            Util::Exception(INFO, "Symmetric states should result in zero flux.");
     391              :     //        }
     392              :     //        Util::Test::SubMessage("Test 3: Constant states induces no flux difference",0);
     393              :     //    } catch (const std::runtime_error& e)
     394              :     //    {
     395              :     //        failed++;
     396              :     //        Util::Test::SubMessage("Test 3: Constant states induces no flux difference",1);
     397              :     //    }
     398              : 
     399              :     //    // Test 4: Uniform Flow Test (no flux across uniform flow)
     400              :     //    try {
     401              :     //        State left (1.0, 1.0, 0.5, 1.0);
     402              :     //        State center(1.0, 1.0, 0.5, 1.0);
     403              :     //        State right (1.0, 1.0, 0.5, 1.0);
     404              :     //        Flux fluxhi = solver.Solve(center, right, gamma, pref, small);
     405              :     //        Flux fluxlo = solver.Solve(left, center, gamma, pref, small);
     406              :     //        if (fabs(fluxhi.mass - fluxlo.mass) > 1E-10 ||
     407              :     //            fabs(fluxhi.momentum_normal - fluxlo.momentum_normal) > 1E-10 ||
     408              :     //            fabs(fluxhi.energy - fluxlo.energy) > 1E-10) {
     409              :     //            Util::Warning(INFO,   "left:   ",left);
     410              :     //            Util::Warning(INFO,   "center: ",center);
     411              :     //            Util::Warning(INFO,   "right:  ",right);
     412              :     //            Util::Warning(INFO,   "Fluxlo: ",fluxlo);
     413              :     //            Util::Warning(INFO,   "Fluxhi: ",fluxhi);
     414              :     //            Util::Exception(INFO, "Uniform flow should result in no flux.");
     415              :     //        }
     416              :     //        Util::Test::SubMessage("Test 4: Uniform flow should maintain constant flux",0);
     417              :     //    } catch (const std::runtime_error& e)
     418              :     //    {
     419              :     //        failed++;
     420              :     //        Util::Test::SubMessage("Test 4: Uniform flow should maintain constant flux",1);
     421              :     //    }
     422              : 
     423              :     //    return failed;
     424              :     //}
     425              : };
     426              : }
     427              : }
     428              : }
     429              : 
     430              : #endif
        

Generated by: LCOV version 2.0-1