Quinoa all test code coverage report
Current view: top level - PDE/Riemann - HLLCMultiMat.hpp (source / functions) Hit Total Coverage
Commit: -128-NOTFOUND Lines: 242 296 81.8 %
Date: 2025-08-06 10:15:14 Functions: 1 1 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 130 230 56.5 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/PDE/Riemann/HLLCMultiMat.hpp
       4                 :            :   \copyright 2012-2015 J. Bakosi,
       5                 :            :              2016-2018 Los Alamos National Security, LLC.,
       6                 :            :              2019-2023 Triad National Security, LLC.
       7                 :            :              All rights reserved. See the LICENSE file for details.
       8                 :            :   \brief     HLLC Riemann flux function for solids
       9                 :            :   \details   This file implements the HLLC Riemann solver for solids.
      10                 :            :              Ref. Ndanou, S., Favrie, N., & Gavrilyuk, S. (2015). Multi-solid
      11                 :            :              and multi-fluid diffuse interface model: Applications to dynamic
      12                 :            :              fracture and fragmentation. Journal of Computational Physics, 295,
      13                 :            :              523-555.
      14                 :            : */
      15                 :            : // *****************************************************************************
      16                 :            : #ifndef HLLCMultiMat_h
      17                 :            : #define HLLCMultiMat_h
      18                 :            : 
      19                 :            : #include <vector>
      20                 :            : 
      21                 :            : #include "Fields.hpp"
      22                 :            : #include "FunctionPrototypes.hpp"
      23                 :            : #include "Inciter/Options/Flux.hpp"
      24                 :            : #include "EoS/EOS.hpp"
      25                 :            : #include "MultiMat/MultiMatIndexing.hpp"
      26                 :            : #include "MultiMat/MiscMultiMatFns.hpp"
      27                 :            : 
      28                 :            : namespace inciter {
      29                 :            : 
      30                 :            : //! HLLC approximate Riemann solver for solids
      31                 :            : struct HLLCMultiMat {
      32                 :            : 
      33                 :            : //! HLLC approximate Riemann solver flux function
      34                 :            :   //! \param[in] fn Face/Surface normal
      35                 :            :   //! \param[in] u Left and right unknown/state vector
      36                 :            :   //! \return Riemann solution according to Harten-Lax-van Leer-Contact
      37                 :            :   //! \note The function signature must follow tk::RiemannFluxFn
      38                 :            :   static tk::RiemannFluxFn::result_type
      39                 :     868500 :   flux( const std::vector< EOS >& mat_blk,
      40                 :            :         const std::array< tk::real, 3 >& fn,
      41                 :            :         const std::array< std::vector< tk::real >, 2 >& u,
      42                 :            :         const std::vector< std::array< tk::real, 3 > >& = {} )
      43                 :            :   {
      44                 :     868500 :     auto nmat = g_inputdeck.get< tag::multimat, tag::nmat >();
      45                 :     868500 :     const auto& solidx = g_inputdeck.get< tag::matidxmap, tag::solidx >();
      46                 :            : 
      47         [ +  - ]:     868500 :     auto nsld = numSolids(nmat, solidx);
      48                 :     868500 :     auto ncomp = u[0].size()-(3+nmat+nsld*6);
      49         [ +  - ]:     868500 :     std::vector< tk::real > flx(ncomp, 0);
      50                 :            : 
      51                 :            :     // Primitive variables
      52                 :            :     // -------------------------------------------------------------------------
      53                 :     868500 :     tk::real rhol(0.0), rhor(0.0);
      54         [ +  + ]:    2605500 :     for (size_t k=0; k<nmat; ++k) {
      55                 :    1737000 :       rhol += u[0][densityIdx(nmat, k)];
      56                 :    1737000 :       rhor += u[1][densityIdx(nmat, k)];
      57                 :            :     }
      58                 :            : 
      59                 :     868500 :     auto ul = u[0][ncomp+velocityIdx(nmat, 0)];
      60                 :     868500 :     auto vl = u[0][ncomp+velocityIdx(nmat, 1)];
      61                 :     868500 :     auto wl = u[0][ncomp+velocityIdx(nmat, 2)];
      62                 :     868500 :     auto ur = u[1][ncomp+velocityIdx(nmat, 0)];
      63                 :     868500 :     auto vr = u[1][ncomp+velocityIdx(nmat, 1)];
      64                 :     868500 :     auto wr = u[1][ncomp+velocityIdx(nmat, 2)];
      65                 :            : 
      66                 :            :     // Outer states
      67                 :            :     // -------------------------------------------------------------------------
      68                 :     868500 :     tk::real pl(0.0), pr(0.0);
      69                 :     868500 :     tk::real acl(0.0), acr(0.0);
      70 [ +  - ][ +  - ]:    1737000 :     std::vector< tk::real > apl(nmat, 0.0), apr(nmat, 0.0);
      71                 :     868500 :     std::array< tk::real, 3 > Tnl{{0, 0, 0}}, Tnr{{0, 0, 0}};
      72                 :    1737000 :     std::vector< std::array< tk::real, 3 > > aTnl, aTnr;
      73                 :            :     std::array< std::array< tk::real, 3 >, 3 > asigl, asigr;
      74                 :            :     std::array< std::array< tk::real, 3 >, 3 >
      75                 :     868500 :       signnl{{{0,0,0},{0,0,0},{0,0,0}}};
      76                 :            :     std::array< std::array< tk::real, 3 >, 3 >
      77                 :     868500 :       signnr{{{0,0,0},{0,0,0},{0,0,0}}};
      78                 :    1737000 :     std::vector< std::array< std::array< tk::real, 3 >, 3 > > gl, gr;
      79                 :    1737000 :     std::vector< std::array< std::array< tk::real, 3 >, 3 > > gnl, gnr;
      80                 :    1737000 :     std::vector< std::array< std::array< tk::real, 3 >, 3 > > asignnl, asignnr;
      81                 :            : 
      82         [ +  + ]:    2605500 :     for (std::size_t k=0; k<nmat; ++k) {
      83                 :            :       // Left state
      84                 :    1737000 :       apl[k] = u[0][ncomp+pressureIdx(nmat, k)];
      85                 :    1737000 :       pl += apl[k];
      86                 :            : 
      87                 :            :       // inv deformation gradient and Cauchy stress tensors
      88 [ +  - ][ +  - ]:    1737000 :       gl.push_back(getDeformGrad(nmat, k, u[0]));
      89         [ +  - ]:    1737000 :       asigl = getCauchyStress(nmat, k, ncomp, u[0]);
      90         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i) asigl[i][i] -= apl[k];
      91                 :            : 
      92                 :            :       // normal stress (traction) vector
      93         [ +  - ]:    1737000 :       aTnl.push_back(tk::matvec(asigl, fn));
      94         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
      95                 :    5211000 :         Tnl[i] += aTnl[k][i];
      96                 :            : 
      97                 :            :       // rotate stress vector
      98 [ +  - ][ +  - ]:    1737000 :       asignnl.push_back(tk::rotateTensor(asigl, fn));
      99         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     100         [ +  + ]:   20844000 :         for (std::size_t j=0; j<3; ++j)
     101                 :   15633000 :           signnl[i][j] += asignnl[k][i][j];
     102                 :            : 
     103                 :            :       // rotate deformation gradient tensor for speed of sound in normal dir
     104 [ +  - ][ +  - ]:    1737000 :       gnl.push_back(tk::rotateTensor(gl[k], fn));
     105         [ +  - ]:    3474000 :       auto amatl = mat_blk[k].compute< EOS::soundspeed >(
     106                 :    1737000 :         u[0][densityIdx(nmat, k)], apl[k],
     107                 :    1737000 :         u[0][volfracIdx(nmat, k)], k, gnl[k] );
     108                 :            : 
     109                 :            :       // Right state
     110                 :    1737000 :       apr[k] = u[1][ncomp+pressureIdx(nmat, k)];
     111                 :    1737000 :       pr += apr[k];
     112                 :            : 
     113                 :            :       // inv deformation gradient and Cauchy stress tensors
     114 [ +  - ][ +  - ]:    1737000 :       gr.push_back(getDeformGrad(nmat, k, u[1]));
     115         [ +  - ]:    1737000 :       asigr = getCauchyStress(nmat, k, ncomp, u[1]);
     116         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i) asigr[i][i] -= apr[k];
     117                 :            : 
     118                 :            :       // normal stress (traction) vector
     119         [ +  - ]:    1737000 :       aTnr.push_back(tk::matvec(asigr, fn));
     120         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     121                 :    5211000 :         Tnr[i] += aTnr[k][i];
     122                 :            : 
     123                 :            :       // rotate stress vector
     124 [ +  - ][ +  - ]:    1737000 :       asignnr.push_back(tk::rotateTensor(asigr, fn));
     125         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     126         [ +  + ]:   20844000 :         for (std::size_t j=0; j<3; ++j)
     127                 :   15633000 :           signnr[i][j] += asignnr[k][i][j];
     128                 :            : 
     129                 :            :       // rotate deformation gradient tensor for speed of sound in normal dir
     130 [ +  - ][ +  - ]:    1737000 :       gnr.push_back(tk::rotateTensor(gr[k], fn));
     131         [ +  - ]:    3474000 :       auto amatr = mat_blk[k].compute< EOS::soundspeed >(
     132                 :    1737000 :         u[1][densityIdx(nmat, k)], apr[k],
     133                 :    1737000 :         u[1][volfracIdx(nmat, k)], k, gnr[k] );
     134                 :            : 
     135                 :            :       // Mixture speed of sound
     136                 :    1737000 :       acl += u[0][densityIdx(nmat, k)] * amatl * amatl;
     137                 :    1737000 :       acr += u[1][densityIdx(nmat, k)] * amatr * amatr;
     138                 :            :     }
     139                 :     868500 :     acl = std::sqrt(acl/rhol);
     140                 :     868500 :     acr = std::sqrt(acr/rhor);
     141                 :            : 
     142                 :            :     // Rotated velocities from advective velocities
     143                 :     868500 :     auto vnl = tk::rotateVector({ul, vl, wl}, fn);
     144                 :     868500 :     auto vnr = tk::rotateVector({ur, vr, wr}, fn);
     145                 :            : 
     146                 :            :     // Signal velocities
     147                 :     868500 :     auto Sl = std::min((vnl[0]-acl), (vnr[0]-acr));
     148                 :     868500 :     auto Sr = std::max((vnl[0]+acl), (vnr[0]+acr));
     149                 :     868500 :     auto Sm = ( rhor*vnr[0]*(Sr-vnr[0]) - rhol*vnl[0]*(Sl-vnl[0])
     150                 :     868500 :                 - signnl[0][0] + signnr[0][0] )
     151                 :     868500 :               /( rhor*(Sr-vnr[0]) - rhol*(Sl-vnl[0]) );
     152                 :            : 
     153                 :            :     // Middle-zone (star) variables
     154                 :            :     // -------------------------------------------------------------------------
     155                 :            :     // the stress in the star zone is theoretically equivalent when derived
     156                 :            :     // from the left or right state. However, there might be differences
     157                 :            :     // numerically due to truncation etc. Hence two separate evaluations
     158                 :            :     // are used.
     159                 :            :     std::vector< std::array< std::array< tk::real, 3 >, 3 > >
     160                 :    1737000 :       asignnlStar, asignnrStar;
     161                 :            :     std::array< std::array< tk::real, 3 >, 3 >
     162                 :     868500 :       signnlStar{{{0,0,0},{0,0,0},{0,0,0}}},
     163                 :     868500 :       signnrStar{{{0,0,0},{0,0,0},{0,0,0}}};
     164                 :            :     std::array< std::array< tk::real, 3 >, 3 >
     165                 :     868500 :       siglStar{{{0,0,0},{0,0,0},{0,0,0}}}, sigrStar{{{0,0,0},{0,0,0},{0,0,0}}};
     166         [ +  - ]:     868500 :     asignnlStar.resize(nmat);
     167         [ +  - ]:     868500 :     asignnrStar.resize(nmat);
     168                 :     868500 :     std::array< tk::real, 3 > TnlStar{{0, 0, 0}}, TnrStar{{0, 0, 0}};
     169                 :    1737000 :     std::vector< std::array< tk::real, 3 > > aTnlStar, aTnrStar;
     170         [ +  + ]:    2605500 :     for (std::size_t k=0; k<nmat; ++k) {
     171         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     172         [ +  + ]:   20844000 :         for (std::size_t j=0; j<3; ++j)
     173                 :            :         {
     174                 :   15633000 :           asignnlStar[k][i][j] = asignnl[k][i][j];
     175                 :   15633000 :           asignnrStar[k][i][j] = asignnr[k][i][j];
     176                 :            :         }
     177                 :            : 
     178         [ +  + ]:    3474000 :       for (std::size_t i=0; i<1; ++i)
     179                 :            :       {
     180                 :    1737000 :         asignnlStar[k][i][i] -=
     181                 :    1737000 :           u[0][densityIdx(nmat,k)]*(Sl-vnl[0])*(Sm-vnl[0]);
     182                 :    1737000 :         asignnrStar[k][i][i] -=
     183                 :    1737000 :           u[1][densityIdx(nmat,k)]*(Sr-vnr[0])*(Sm-vnr[0]);
     184                 :            :       }
     185                 :            : 
     186         [ +  + ]:    5211000 :       for (std::size_t i=1; i<3; ++i)
     187                 :            :       {
     188                 :    3474000 :         asignnlStar[k][i][0] =
     189                 :    3474000 :           ( (Sm-Sl)*u[0][densityIdx(nmat,k)]*asignnr[k][i][0]
     190                 :    3474000 :           - (Sm-Sr)*u[1][densityIdx(nmat,k)]*asignnl[k][i][0]
     191                 :    3474000 :           + (Sm-Sl)*u[0][densityIdx(nmat,k)]
     192                 :    3474000 :           * (Sm-Sr)*u[1][densityIdx(nmat,k)]
     193                 :    3474000 :           * (vnl[i]-vnr[i]) ) /
     194                 :    3474000 :           ( (Sm-Sl)*u[0][densityIdx(nmat,k)]
     195                 :    3474000 :           - (Sm-Sr)*u[1][densityIdx(nmat,k)]);
     196                 :    3474000 :         asignnrStar[k][i][0] =
     197                 :    3474000 :           ( (Sm-Sl)*u[0][densityIdx(nmat,k)]*asignnr[k][i][0]
     198                 :    3474000 :           - (Sm-Sr)*u[1][densityIdx(nmat,k)]*asignnl[k][i][0]
     199                 :    3474000 :           + (Sm-Sl)*u[0][densityIdx(nmat,k)]
     200                 :    3474000 :           * (Sm-Sr)*u[1][densityIdx(nmat,k)]
     201                 :    3474000 :           * (vnl[i]-vnr[i]) ) /
     202                 :    3474000 :           ( (Sm-Sl)*u[0][densityIdx(nmat,k)]
     203                 :    3474000 :           - (Sm-Sr)*u[1][densityIdx(nmat,k)]);
     204                 :            :       }
     205                 :            :       // Symmetry
     206                 :    1737000 :       asignnlStar[k][0][1] = asignnlStar[k][1][0];
     207                 :    1737000 :       asignnlStar[k][0][2] = asignnlStar[k][2][0];
     208                 :    1737000 :       asignnrStar[k][0][1] = asignnrStar[k][1][0];
     209                 :    1737000 :       asignnrStar[k][0][2] = asignnrStar[k][2][0];
     210                 :            : 
     211         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     212         [ +  + ]:   20844000 :         for (std::size_t j=0; j<3; ++j)
     213                 :            :         {
     214                 :   15633000 :           signnlStar[i][j] += asignnlStar[k][i][j];
     215                 :   15633000 :           signnrStar[i][j] += asignnrStar[k][i][j];
     216                 :            :         }
     217                 :            : 
     218         [ +  - ]:    1737000 :       auto asiglStar = tk::unrotateTensor(asignnlStar[k], fn);
     219         [ +  - ]:    1737000 :       auto asigrStar = tk::unrotateTensor(asignnrStar[k], fn);
     220         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     221         [ +  + ]:   20844000 :         for (std::size_t j=0; j<3; ++j)
     222                 :            :         {
     223                 :   15633000 :           siglStar[i][j] += asiglStar[i][j];
     224                 :   15633000 :           sigrStar[i][j] += asigrStar[i][j];
     225                 :            :         }
     226         [ +  - ]:    1737000 :       aTnlStar.push_back(tk::matvec(asiglStar, fn));
     227         [ +  - ]:    1737000 :       aTnrStar.push_back(tk::matvec(asigrStar, fn));
     228         [ +  + ]:    6948000 :       for (std::size_t i=0; i<3; ++i)
     229                 :            :       {
     230                 :    5211000 :         TnlStar[i] += aTnlStar[k][i];
     231                 :    5211000 :         TnrStar[i] += aTnrStar[k][i];
     232                 :            :       }
     233                 :            :     }
     234                 :            : 
     235                 :     868500 :     auto w_l = (vnl[0]-Sl)/(Sm-Sl);
     236                 :     868500 :     auto w_r = (vnr[0]-Sr)/(Sm-Sr);
     237                 :            : 
     238                 :            :     std::array< tk::real, 3 > vnlStar, vnrStar;
     239                 :            :     // u*_L
     240                 :     868500 :     vnlStar[0] = Sm;
     241                 :     868500 :     vnlStar[1] = vnl[1]
     242                 :     868500 :       + (signnlStar[1][0] - signnl[1][0]) / (w_l*rhol*(vnl[0]-Sl));
     243                 :     868500 :     vnlStar[2] = vnl[2]
     244                 :     868500 :       + (signnlStar[2][0] - signnl[2][0]) / (w_l*rhol*(vnl[0]-Sl));
     245                 :            :     // u*_R
     246                 :     868500 :     vnrStar[0] = Sm;
     247                 :     868500 :     vnrStar[1] = vnr[1]
     248                 :     868500 :       + (signnrStar[1][0] - signnr[1][0]) / (w_r*rhor*(vnr[0]-Sr));
     249                 :     868500 :     vnrStar[2] = vnr[2]
     250                 :     868500 :       + (signnrStar[2][0] - signnr[2][0]) / (w_r*rhor*(vnr[0]-Sr));
     251                 :            : 
     252                 :     868500 :     auto vlStar = tk::unrotateVector(vnlStar, fn);
     253                 :     868500 :     auto vrStar = tk::unrotateVector(vnrStar, fn);
     254                 :            : 
     255         [ +  - ]:    1737000 :     auto uStar = u;
     256                 :            : 
     257                 :     868500 :     tk::real rholStar(0.0), rhorStar(0.0);
     258                 :    1737000 :     std::vector< std::array< std::array< tk::real, 3 >, 3 > > gnlStar, gnrStar;
     259                 :    1737000 :     std::vector< std::array< std::array< tk::real, 3 >, 3 > > glStar, grStar;
     260         [ +  + ]:    2605500 :     for (std::size_t k=0; k<nmat; ++k) {
     261                 :            :       // Left
     262         [ -  + ]:    1737000 :       if (solidx[k] > 0)
     263                 :            :       {
     264         [ -  - ]:          0 :         gnlStar.push_back(gnl[k]);
     265                 :          0 :         gnlStar[k][0][0] = w_l * gnl[k][0][0]
     266                 :          0 :           + gnl[k][0][1]*(vnl[1]-vnlStar[1])/(Sm-Sl)
     267                 :          0 :           + gnl[k][0][2]*(vnl[2]-vnlStar[2])/(Sm-Sl);
     268                 :          0 :         gnlStar[k][1][0] = w_l * gnl[k][1][0]
     269                 :          0 :           + gnl[k][1][1]*(vnl[1]-vnlStar[1])/(Sm-Sl)
     270                 :          0 :           + gnl[k][1][2]*(vnl[2]-vnlStar[2])/(Sm-Sl);
     271                 :          0 :         gnlStar[k][2][0] = w_l * gnl[k][2][0]
     272                 :          0 :           + gnl[k][2][1]*(vnl[1]-vnlStar[1])/(Sm-Sl)
     273                 :          0 :           + gnl[k][2][2]*(vnl[2]-vnlStar[2])/(Sm-Sl);
     274                 :            :         // rotate g back to original frame of reference
     275 [ -  - ][ -  - ]:          0 :         glStar.push_back(tk::unrotateTensor(gnlStar[k], fn));
     276                 :            :       }
     277                 :    1737000 :       uStar[0][volfracIdx(nmat, k)] = u[0][volfracIdx(nmat, k)];
     278                 :    1737000 :       uStar[0][densityIdx(nmat, k)] = w_l * u[0][densityIdx(nmat, k)];
     279                 :    3474000 :       uStar[0][energyIdx(nmat, k)] = w_l * u[0][energyIdx(nmat, k)]
     280                 :    1737000 :         + ( - asignnl[k][0][0]*vnl[0]
     281                 :    1737000 :             - asignnl[k][1][0]*vnl[1]
     282                 :    1737000 :             - asignnl[k][2][0]*vnl[2]
     283                 :    1737000 :             + asignnlStar[k][0][0]*vnlStar[0]
     284                 :    1737000 :             + asignnlStar[k][1][0]*vnlStar[1]
     285                 :    1737000 :             + asignnlStar[k][2][0]*vnlStar[2]
     286                 :    1737000 :           ) / (Sm-Sl);
     287                 :    1737000 :       rholStar += uStar[0][densityIdx(nmat, k)];
     288                 :            : 
     289                 :            :       // Right
     290         [ -  + ]:    1737000 :       if (solidx[k] > 0)
     291                 :            :       {
     292         [ -  - ]:          0 :         gnrStar.push_back(gnr[k]);
     293                 :          0 :         gnrStar[k][0][0] = w_r * gnr[k][0][0]
     294                 :          0 :           + gnr[k][0][1]*(vnr[1]-vnrStar[1])/(Sm-Sr)
     295                 :          0 :           + gnr[k][0][2]*(vnr[2]-vnrStar[2])/(Sm-Sr);
     296                 :          0 :         gnrStar[k][1][0] = w_r * gnr[k][1][0]
     297                 :          0 :           + gnr[k][1][1]*(vnr[1]-vnrStar[1])/(Sm-Sr)
     298                 :          0 :           + gnr[k][1][2]*(vnr[2]-vnrStar[2])/(Sm-Sr);
     299                 :          0 :         gnrStar[k][2][0] = w_r * gnr[k][2][0]
     300                 :          0 :           + gnr[k][2][1]*(vnr[1]-vnrStar[1])/(Sm-Sr)
     301                 :          0 :           + gnr[k][2][2]*(vnr[2]-vnrStar[2])/(Sm-Sr);
     302                 :            :         // rotate g back to original frame of reference
     303 [ -  - ][ -  - ]:          0 :         grStar.push_back(tk::unrotateTensor(gnrStar[k], fn));
     304                 :            :       }
     305                 :    1737000 :       uStar[1][volfracIdx(nmat, k)] = u[1][volfracIdx(nmat, k)];
     306                 :    1737000 :       uStar[1][densityIdx(nmat, k)] = w_r * u[1][densityIdx(nmat, k)];
     307                 :    3474000 :       uStar[1][energyIdx(nmat, k)] = w_r * u[1][energyIdx(nmat, k)]
     308                 :    1737000 :         + ( - asignnr[k][0][0]*vnr[0]
     309                 :    1737000 :             - asignnr[k][1][0]*vnr[1]
     310                 :    1737000 :             - asignnr[k][2][0]*vnr[2]
     311                 :    1737000 :             + asignnrStar[k][0][0]*vnrStar[0]
     312                 :    1737000 :             + asignnrStar[k][1][0]*vnrStar[1]
     313                 :    1737000 :             + asignnrStar[k][2][0]*vnrStar[2]
     314                 :    1737000 :           ) / (Sm-Sr);
     315                 :    1737000 :       rhorStar += uStar[1][densityIdx(nmat, k)];
     316                 :            :     }
     317                 :            : 
     318                 :            :     // Numerical fluxes
     319                 :            :     // -------------------------------------------------------------------------
     320         [ +  + ]:     868500 :     if (0.0 <= Sl) {
     321                 :            : 
     322         [ +  + ]:     375248 :       for (std::size_t idir=0; idir<3; ++idir)
     323                 :     281436 :         flx[momentumIdx(nmat, idir)] =
     324                 :     281436 :           u[0][momentumIdx(nmat, idir)] * vnl[0] - Tnl[idir];
     325                 :            : 
     326         [ +  + ]:     281436 :       for (std::size_t k=0; k<nmat; ++k) {
     327                 :     187624 :         flx[volfracIdx(nmat, k)] = u[0][volfracIdx(nmat, k)] * vnl[0];
     328                 :     187624 :         flx[densityIdx(nmat, k)] = u[0][densityIdx(nmat, k)] * vnl[0];
     329                 :     375248 :         flx[energyIdx(nmat, k)] = u[0][energyIdx(nmat, k)] * vnl[0]
     330                 :     187624 :           - ul * aTnl[k][0] - vl * aTnl[k][1] - wl * aTnl[k][2];
     331         [ -  + ]:     187624 :         if (solidx[k] > 0) {
     332         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     333         [ -  - ]:          0 :             for (std::size_t j=0; j<3; ++j)
     334                 :          0 :               flx[deformIdx(nmat,solidx[k],i,j)] = (
     335                 :          0 :                 gl[k][i][0] * ul +
     336                 :          0 :                 gl[k][i][1] * vl +
     337                 :          0 :                 gl[k][i][2] * wl ) * fn[j];
     338                 :            :         }
     339                 :            :       }
     340                 :            : 
     341                 :            :       // Quantities for non-conservative terms
     342                 :            :       // Store Riemann-advected partial pressures
     343         [ +  + ]:     281436 :       for (std::size_t k=0; k<nmat; ++k)
     344                 :     375248 :         flx.push_back(std::sqrt((aTnl[k][0]*aTnl[k][0]
     345                 :     187624 :                                 +aTnl[k][1]*aTnl[k][1]
     346         [ +  - ]:     187624 :                                 +aTnl[k][2]*aTnl[k][2])));
     347                 :            :       // Store Riemann velocity
     348         [ +  - ]:      93812 :       flx.push_back(vnl[0]);
     349         [ +  + ]:     281436 :       for (std::size_t k=0; k<nmat; ++k) {
     350         [ -  + ]:     187624 :         if (solidx[k] > 0) {
     351         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     352         [ -  - ]:          0 :             flx.push_back(aTnl[k][i]);
     353                 :            :         }
     354                 :            :       }
     355                 :            : 
     356                 :            :     }
     357                 :            : 
     358 [ +  - ][ +  + ]:     774688 :     else if (Sl < 0.0 && 0.0 <= Sm) {
     359                 :            : 
     360         [ +  + ]:    1684036 :       for (std::size_t idir=0; idir<3; ++idir)
     361                 :    1263027 :        flx[momentumIdx(nmat, idir)] =
     362                 :    1263027 :          vlStar[idir] * rholStar * Sm - TnlStar[idir];
     363                 :            : 
     364         [ +  + ]:    1263027 :       for (std::size_t k=0; k<nmat; ++k) {
     365                 :     842018 :         flx[volfracIdx(nmat, k)] = uStar[0][volfracIdx(nmat, k)] * Sm;
     366                 :     842018 :         flx[densityIdx(nmat, k)] = uStar[0][densityIdx(nmat, k)] * Sm;
     367                 :    1684036 :         flx[energyIdx(nmat, k)] = uStar[0][energyIdx(nmat, k)] * Sm
     368                 :     842018 :           - vlStar[0] * aTnlStar[k][0]
     369                 :     842018 :           - vlStar[1] * aTnlStar[k][1]
     370                 :     842018 :           - vlStar[2] * aTnlStar[k][2];
     371         [ -  + ]:     842018 :         if (solidx[k] > 0) {
     372         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     373         [ -  - ]:          0 :               for (std::size_t j=0; j<3; ++j)
     374                 :          0 :                 flx[deformIdx(nmat,solidx[k],i,j)] = (
     375                 :          0 :                   glStar[k][i][0] * vlStar[0] +
     376                 :          0 :                   glStar[k][i][1] * vlStar[1] +
     377                 :          0 :                   glStar[k][i][2] * vlStar[2] ) * fn[j];
     378                 :            :           }
     379                 :            :       }
     380                 :            : 
     381                 :            :       // Quantities for non-conservative terms
     382                 :            :       // Store Riemann-advected partial pressures
     383         [ +  + ]:    1263027 :       for (std::size_t k=0; k<nmat; ++k)
     384                 :    1684036 :         flx.push_back(std::sqrt(aTnlStar[k][0]*aTnlStar[k][0]
     385                 :     842018 :                                +aTnlStar[k][1]*aTnlStar[k][1]
     386         [ +  - ]:     842018 :                                +aTnlStar[k][2]*aTnlStar[k][2]));
     387                 :            :       // Store Riemann velocity
     388         [ +  - ]:     421009 :       flx.push_back(Sm);
     389         [ +  + ]:    1263027 :       for (std::size_t k=0; k<nmat; ++k) {
     390         [ -  + ]:     842018 :         if (solidx[k] > 0) {
     391         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     392         [ -  - ]:          0 :             flx.push_back(aTnlStar[k][i]);
     393                 :            :         }
     394                 :     421009 :       }
     395                 :            : 
     396                 :            :     }
     397                 :            : 
     398 [ +  - ][ +  + ]:     353679 :     else if (Sm < 0.0 && 0.0 <= Sr) {
     399                 :            : 
     400         [ +  + ]:     884788 :       for (std::size_t idir=0; idir<3; ++idir)
     401                 :     663591 :         flx[momentumIdx(nmat, idir)] =
     402                 :     663591 :           vrStar[idir] * rhorStar * Sm - TnrStar[idir];
     403                 :            : 
     404         [ +  + ]:     663591 :       for (std::size_t k=0; k<nmat; ++k) {
     405                 :     442394 :         flx[volfracIdx(nmat, k)] = uStar[1][volfracIdx(nmat, k)] * Sm;
     406                 :     442394 :         flx[densityIdx(nmat, k)] = uStar[1][densityIdx(nmat, k)] * Sm;
     407                 :     884788 :         flx[energyIdx(nmat, k)] = uStar[1][energyIdx(nmat, k)] * Sm
     408                 :     442394 :           - vrStar[0] * aTnrStar[k][0]
     409                 :     442394 :           - vrStar[1] * aTnrStar[k][1]
     410                 :     442394 :           - vrStar[2] * aTnrStar[k][2];
     411         [ -  + ]:     442394 :         if (solidx[k] > 0) {
     412         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     413         [ -  - ]:          0 :               for (std::size_t j=0; j<3; ++j)
     414                 :          0 :                 flx[deformIdx(nmat,solidx[k],i,j)] = (
     415                 :          0 :                   grStar[k][i][0] * vrStar[0] +
     416                 :          0 :                   grStar[k][i][1] * vrStar[1] +
     417                 :          0 :                   grStar[k][i][2] * vrStar[2] ) * fn[j];
     418                 :            :           }
     419                 :            :       }
     420                 :            : 
     421                 :            :       // Quantities for non-conservative terms
     422                 :            :       // Store Riemann-advected partial pressures
     423         [ +  + ]:     663591 :       for (std::size_t k=0; k<nmat; ++k)
     424                 :     884788 :         flx.push_back(std::sqrt(aTnrStar[k][0]*aTnrStar[k][0]
     425                 :     442394 :                                +aTnrStar[k][1]*aTnrStar[k][1]
     426         [ +  - ]:     442394 :                                +aTnrStar[k][2]*aTnrStar[k][2]));
     427                 :            :       // Store Riemann velocity
     428         [ +  - ]:     221197 :       flx.push_back(Sm);
     429         [ +  + ]:     663591 :       for (std::size_t k=0; k<nmat; ++k) {
     430         [ -  + ]:     442394 :         if (solidx[k] > 0) {
     431         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     432         [ -  - ]:          0 :             flx.push_back(aTnrStar[k][i]);
     433                 :            :         }
     434                 :     221197 :       }
     435                 :            : 
     436                 :            :     }
     437                 :            : 
     438                 :            :     else {
     439                 :            : 
     440         [ +  + ]:     529928 :       for (std::size_t idir=0; idir<3; ++idir)
     441                 :     397446 :         flx[momentumIdx(nmat, idir)] =
     442                 :     397446 :           u[1][momentumIdx(nmat, idir)] * vnr[0] - Tnr[idir];
     443                 :            : 
     444         [ +  + ]:     397446 :       for (std::size_t k=0; k<nmat; ++k) {
     445                 :     264964 :         flx[volfracIdx(nmat, k)] = u[1][volfracIdx(nmat, k)] * vnr[0];
     446                 :     264964 :         flx[densityIdx(nmat, k)] = u[1][densityIdx(nmat, k)] * vnr[0];
     447                 :     529928 :         flx[energyIdx(nmat, k)] = u[1][energyIdx(nmat, k)] * vnr[0]
     448                 :     264964 :           - ur * aTnr[k][0] - vr * aTnr[k][1] - wr * aTnr[k][2];
     449         [ -  + ]:     264964 :         if (solidx[k] > 0) {
     450         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     451         [ -  - ]:          0 :               for (std::size_t j=0; j<3; ++j)
     452                 :          0 :                 flx[deformIdx(nmat,solidx[k],i,j)] = (
     453                 :          0 :                   gr[k][i][0] * ur +
     454                 :          0 :                   gr[k][i][1] * vr +
     455                 :          0 :                   gr[k][i][2] * wr ) * fn[j];
     456                 :            :           }
     457                 :            :       }
     458                 :            : 
     459                 :            :       // Quantities for non-conservative terms
     460                 :            :       // Store Riemann-advected partial pressures
     461         [ +  + ]:     397446 :       for (std::size_t k=0; k<nmat; ++k)
     462                 :     529928 :         flx.push_back(std::sqrt(aTnr[k][0]*aTnr[k][0]
     463                 :     264964 :                                +aTnr[k][1]*aTnr[k][1]
     464         [ +  - ]:     264964 :                                +aTnr[k][2]*aTnr[k][2]));
     465                 :            :       // Store Riemann velocity
     466         [ +  - ]:     132482 :       flx.push_back(vnr[0]);
     467         [ +  + ]:     397446 :       for (std::size_t k=0; k<nmat; ++k) {
     468         [ -  + ]:     264964 :         if (solidx[k] > 0) {
     469         [ -  - ]:          0 :           for (std::size_t i=0; i<3; ++i)
     470         [ -  - ]:          0 :             flx.push_back(aTnr[k][i]);
     471                 :            :         }
     472                 :            :       }
     473                 :            : 
     474                 :            :     }
     475                 :            : 
     476 [ -  + ][ -  - ]:     868500 :     Assert( flx.size() == (ncomp+nmat+1+3*nsld), "Size of "
         [ -  - ][ -  - ]
     477                 :            :             "multi-material flux vector incorrect" );
     478                 :            : 
     479                 :    1737000 :     return flx;
     480                 :            :   }
     481                 :            : 
     482                 :            :   ////! Flux type accessor
     483                 :            :   ////! \return Flux type
     484                 :            :   //static ctr::FluxType type() noexcept {
     485                 :            :   //  return ctr::FluxType::HLLCMultiMat; }
     486                 :            : };
     487                 :            : 
     488                 :            : } // inciter::
     489                 :            : 
     490                 :            : #endif // HLLCMultiMat_h

Generated by: LCOV version 1.14