Quinoa all test code coverage report
Current view: top level - PDE/Riemann - Rusanov.hpp (source / functions) Hit Total Coverage
Commit: Quinoa_v0.3-957-gb4f0efae0 Lines: 26 26 100.0 %
Date: 2021-11-11 18:25:50 Functions: 1 1 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 2 4 50.0 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/PDE/Riemann/Rusanov.hpp
       4                 :            :   \copyright 2012-2015 J. Bakosi,
       5                 :            :              2016-2018 Los Alamos National Security, LLC.,
       6                 :            :              2019-2021 Triad National Security, LLC.
       7                 :            :              All rights reserved. See the LICENSE file for details.
       8                 :            :   \brief     Rusanov Riemann flux function
       9                 :            :   \details   This file implements the Rusanov Riemann solver, specific to ALECG.
      10                 :            : */
      11                 :            : // *****************************************************************************
      12                 :            : #ifndef Rusanov_h
      13                 :            : #define Rusanov_h
      14                 :            : 
      15                 :            : #include <vector>
      16                 :            : 
      17                 :            : #include "Types.hpp"
      18                 :            : #include "Fields.hpp"
      19                 :            : #include "Tags.hpp"
      20                 :            : #include "FunctionPrototypes.hpp"
      21                 :            : #include "Inciter/Options/Flux.hpp"
      22                 :            : #include "EoS/EoS.hpp"
      23                 :            : 
      24                 :            : namespace inciter {
      25                 :            : 
      26                 :            : //! Rusanov approximate Riemann solver
      27                 :            : //! \details This class can be used polymorphically with inciter::RiemannSolver
      28                 :            : struct Rusanov {
      29                 :            : 
      30                 :            :   using real = tk::real;
      31                 :            : 
      32                 :            :   //! Rusanov approximate Riemann solver flux function
      33                 :            :   //! \param[in] system Equation system index
      34                 :            :   //! \param[in] nx X component of the surface normal
      35                 :            :   //! \param[in] ny Y component of the surface normal
      36                 :            :   //! \param[in] nz Z component of the surface normal
      37                 :            :   //! \param[in] mx X component of the weighted surface normal on chare
      38                 :            :   //!   boundary, weighted by the number of contributions to the edge
      39                 :            :   //! \param[in] my Y component of the weighted surface normal on chare
      40                 :            :   //!   boundary, weighted by the number of contributions to the edge
      41                 :            :   //! \param[in] mz Z component of the weighted surface normal on chare
      42                 :            :   //!   boundary, weighted by the number of contributions to the edge
      43                 :            :   //! \param[in] rL Left density
      44                 :            :   //! \param[in] ruL Left X momentum
      45                 :            :   //! \param[in] rvL Left Y momentum
      46                 :            :   //! \param[in] rwL Left Z momentum
      47                 :            :   //! \param[in] reL Left total specific energy
      48                 :            :   //! \param[in] rR Right density
      49                 :            :   //! \param[in] ruR Right X momentum
      50                 :            :   //! \param[in] rvR Right Y momentum
      51                 :            :   //! \param[in] rwR Right Z momentum
      52                 :            :   //! \param[in] reR Right total specific energy
      53                 :            :   //! \param[in] w1L Left X mesh velocity
      54                 :            :   //! \param[in] w2L Left Y mesh velocity
      55                 :            :   //! \param[in] w3L Left Z mesh velocity
      56                 :            :   //! \param[in] w1R Right X mesh velocity
      57                 :            :   //! \param[in] w2R Right Y mesh velocity
      58                 :            :   //! \param[in] w3R Right Z mesh velocity
      59                 :            :   //! \param[in] pL Left pressure
      60                 :            :   //! \param[in] pR Right pressure
      61                 :            :   //! \param[in,out] fr Riemann solution for density according to Rusanov
      62                 :            :   //! \param[in,out] fru Riemann solution for X momenutm according to Rusanov
      63                 :            :   //! \param[in,out] frv Riemann solution for Y momenutm according to Rusanov
      64                 :            :   //! \param[in,out] frw Riemann solution for Z momenutm according to Rusanov
      65                 :            :   //! \param[in,out] fre Riemann solution for specific total energy according
      66                 :            :   //!   to Rusanov
      67                 :            :   #pragma omp declare simd
      68                 :            :   static void
      69                 :   19371723 :   flux( std::size_t system,
      70                 :            :         real nx, real ny, real nz,
      71                 :            :         real mx, real my, real mz,
      72                 :            :         real rL, real ruL, real rvL, real rwL, real reL,
      73                 :            :         real rR, real ruR, real rvR, real rwR, real reR,
      74                 :            :         real w1L, real w2L, real w3L, real w1R, real w2R, real w3R,
      75                 :            :         real pL, real pR,
      76                 :            :         real& fr, real& fru, real& frv, real& frw, real& fre )
      77                 :            :   {
      78                 :   19371723 :     auto ul = ruL/rL - w1L;
      79                 :   19371723 :     auto vl = rvL/rL - w2L;
      80                 :   19371723 :     auto wl = rwL/rL - w3L;
      81                 :            : 
      82                 :   19371723 :     auto ur = ruR/rR - w1R;
      83                 :   19371723 :     auto vr = rvR/rR - w2R;
      84                 :   19371723 :     auto wr = rwR/rR - w3R;
      85                 :            : 
      86         [ +  - ]:   19371723 :     auto al = eos_soundspeed< tag::compflow >( system, rL, pL );
      87         [ +  - ]:   19371723 :     auto ar = eos_soundspeed< tag::compflow >( system, rR, pR );
      88                 :            : 
      89                 :            :     // dissipation
      90                 :   19371723 :     real len = tk::length( {mx,my,mz} );
      91                 :   19371723 :     real vml = ul*mx + vl*my + wl*mz;
      92                 :   19371723 :     real vmr = ur*mx + vr*my + wr*mz;
      93                 :   19371723 :     auto sl = std::abs(vml) + al*len;
      94                 :   19371723 :     auto sr = std::abs(vmr) + ar*len;
      95                 :   19371723 :     auto smax = std::max( sl, sr );
      96                 :            : 
      97                 :            :     // face-normal velocities
      98                 :   19371723 :     real vnl = ul*nx + vl*ny + wl*nz;
      99                 :   19371723 :     real vnr = ur*nx + vr*ny + wr*nz;
     100                 :            : 
     101                 :            :     // numerical fluxes
     102                 :   19371723 :     fr  = 0.5*(rL*vnl + rR*vnr - smax*(rR - rL));
     103                 :   19371723 :     fru = 0.5*(ruL*vnl + pL*nx + ruR*vnr + pR*nx - smax*(ruR - ruL));
     104                 :   19371723 :     frv = 0.5*(rvL*vnl + pL*ny + rvR*vnr + pR*ny - smax*(rvR - rvL));
     105                 :   19371723 :     frw = 0.5*(rwL*vnl + pL*nz + rwR*vnr + pR*nz - smax*(rwR - rwL));
     106                 :   19371723 :     fre = 0.5*(reL*vnl + reR*vnr
     107                 :   19371723 :                + pL*(ruL*nx + rvL*ny + rwL*nz)/rL
     108                 :   19371723 :                + pR*(ruR*nx + rvR*ny + rwR*nz)/rR
     109                 :   19371723 :                - smax*(reR - reL));
     110                 :   19371723 :   }
     111                 :            : 
     112                 :            :   //! Flux type accessor
     113                 :            :   //! \return Flux type
     114                 :            :   static ctr::FluxType type() noexcept { return ctr::FluxType::Rusanov; }
     115                 :            : };
     116                 :            : 
     117                 :            : } // inciter::
     118                 :            : 
     119                 :            : #endif // Rusanov_h

Generated by: LCOV version 1.14