Quinoa regression test code coverage report
Current view: top level - DiffEq/Dirichlet - MixDirichletCoeffPolicy.cpp (source / functions) Hit Total Coverage
Commit: Quinoa_v0.3-957-gb4f0efae0 Lines: 57 104 54.8 %
Date: 2021-11-09 13:40:20 Functions: 5 7 71.4 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 43 310 13.9 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/DiffEq/Dirichlet/MixDirichletCoeffPolicy.cpp
       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     Mixture Dirichlet coefficients policies
       9                 :            :   \details   This file defines coefficients policy classes for the mixture
      10                 :            :              Dirichlet SDE, defined in DiffEq/Dirichlet/MixDirichlet.h.
      11                 :            :              For general requirements on the mixture Dirichlet SDE coefficients
      12                 :            :              policy classes see the header file.
      13                 :            : */
      14                 :            : // *****************************************************************************
      15                 :            : 
      16                 :            : #include <iostream>
      17                 :            : 
      18                 :            : #include "MixDirichletCoeffPolicy.hpp"
      19                 :            : 
      20                 :            : std::vector< kw::sde_r::info::expect::type >
      21                 :         40 : walker::MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho,
      22                 :            :                   ctr::NormalizationType norm )
      23                 :            : // *****************************************************************************
      24                 :            : //  Compute parameter vector r based on r_i = rho_N/rho_i - 1
      25                 :            : //! \param[in] rho Parameter vector rho to MixDirichlet
      26                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
      27                 :            : //! \return Parameter vector r, determined by parameter vector rho
      28                 :            : // *****************************************************************************
      29                 :            : {
      30                 :            :   Assert( rho.size() > 1, "Parameter vector rho must not be empty" );
      31                 :            : 
      32                 :         40 :   std::vector< kw::sde_r::info::expect::type > r( rho.size()-1 );
      33                 :            : 
      34         [ +  + ]:        120 :   for (std::size_t i=0; i<rho.size()-1; ++i) {
      35         [ +  + ]:         80 :     if (norm == ctr::NormalizationType::LIGHT)  // rhoN = rhoL
      36                 :         50 :       r[i] = rho.back()/rho[i] + 1.0;
      37                 :            :     else                                        // rhoN = rhoH
      38                 :         30 :       r[i] = rho.back()/rho[i] - 1.0;
      39                 :            :   }
      40                 :            : 
      41                 :            :   //if (norm == ctr::NormalizationType::LIGHT)
      42                 :            :   //  r.push_back( 2.0 );
      43                 :            : 
      44                 :         40 :   return r;
      45                 :            : }
      46                 :            : 
      47                 :          8 : walker::MixDirichletCoeffConst::MixDirichletCoeffConst(
      48                 :            :   ncomp_t ncomp,
      49                 :            :   ctr::NormalizationType norm,
      50                 :            :   const std::vector< kw::sde_b::info::expect::type >& b_,
      51                 :            :   const std::vector< kw::sde_S::info::expect::type >& S_,
      52                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
      53                 :            :   const std::vector< kw::sde_rho::info::expect::type >& rho_,
      54                 :            :   std::vector< kw::sde_b::info::expect::type  >& b,
      55                 :            :   std::vector< kw::sde_S::info::expect::type >& S,
      56                 :            :   std::vector< kw::sde_kappa::info::expect::type >& kprime,
      57                 :            :   std::vector< kw::sde_rho::info::expect::type >& rho,
      58                 :            :   std::vector< kw::sde_r::info::expect::type >& r,
      59                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k )
      60                 :            : // *****************************************************************************
      61                 :            : // Constructor: initialize coefficients
      62                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
      63                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
      64                 :            : //! \param[in] b_ Vector used to initialize coefficient vector b
      65                 :            : //! \param[in] S_ Vector used to initialize coefficient vector S
      66                 :            : //! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k
      67                 :            : //! \param[in] rho_ Vector used to initialize coefficient vector rho and r
      68                 :            : //! \param[in,out] b Coefficient vector to be initialized
      69                 :            : //! \param[in,out] S Coefficient vector to be initialized
      70                 :            : //! \param[in,out] kprime Coefficient vector to be initialized
      71                 :            : //! \param[in,out] rho Coefficient vector to be initialized
      72                 :            : //! \param[in,out] r Coefficient vector to be initialized
      73                 :            : //! \param[in,out] k Coefficient vector to be initialized
      74                 :            : // *****************************************************************************
      75                 :            : {
      76 [ -  + ][ -  - ]:          8 :   ErrChk( b_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      77                 :            :           "Wrong number of MixDirichlet SDE parameters 'b'");
      78 [ -  + ][ -  - ]:          8 :   ErrChk( S_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      79                 :            :           "Wrong number of MixDirichlet SDE parameters 'S'");
      80 [ -  + ][ -  - ]:          8 :   ErrChk( kprime_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      81                 :            :           "Wrong number of MixDirichlet SDE parameters 'kappaprime'");
      82 [ -  + ][ -  - ]:          8 :   ErrChk( rho_.size() == ncomp+1,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      83                 :            :           "Wrong number of MixDirichlet SDE parameters 'rho'");
      84                 :            : 
      85                 :          8 :   b = b_;
      86                 :          8 :   S = S_;
      87                 :          8 :   kprime = kprime_;
      88                 :          8 :   rho = rho_;
      89                 :          8 :   k.resize( kprime.size(), 0.0 );
      90                 :            : 
      91                 :            :   // Compute parameter vector r based on r_i = rho_N/rho_i - 1
      92                 :            :   Assert( r.empty(), "Parameter vector r must be empty" );
      93                 :          8 :   r = MixDir_r( rho, norm );
      94                 :          8 : }
      95                 :            : 
      96                 :            : void
      97                 :       2392 : walker::MixDirichletCoeffConst::update(
      98                 :            :   char /*depvar*/,
      99                 :            :   ncomp_t ncomp,
     100                 :            :   ctr::NormalizationType /*norm*/,
     101                 :            :   std::size_t /* density_offset */,
     102                 :            :   std::size_t /* volume_offset */,
     103                 :            :   const std::map< tk::ctr::Product, tk::real >& /*moments*/,
     104                 :            :   const std::vector< kw::sde_rho::info::expect::type >& /*rho*/,
     105                 :            :   const std::vector< kw::sde_r::info::expect::type >& /*r*/,
     106                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime,
     107                 :            :   const std::vector< kw::sde_b::info::expect::type >& /*b*/,
     108                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k,
     109                 :            :   std::vector< kw::sde_kappa::info::expect::type >& S ) const
     110                 :            : // *****************************************************************************
     111                 :            : //  Update coefficients
     112                 :            : //! \param[in] depvar Dependent variable
     113                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
     114                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
     115                 :            : //! \param[in] density_offset Offset of particle density in solution array
     116                 :            : //!    relative to YN
     117                 :            : //! \param[in] volume_offset Offset of particle specific volume in solution
     118                 :            : //!    array relative to YN
     119                 :            : //! \param[in] moments Map of statistical moments estimated
     120                 :            : //! \param[in] rho Coefficient vector
     121                 :            : //! \param[in] r Coefficient Vector
     122                 :            : //! \param[in] kprime Coefficient vector
     123                 :            : //! \param[in] b Coefficient vector
     124                 :            : //! \param[in,out] k Coefficient vector to be updated
     125                 :            : //! \param[in,out] S Coefficient vector to be updated
     126                 :            : // *****************************************************************************
     127                 :            : {
     128                 :            :   using tk::ctr::lookup;
     129                 :            :   using tk::ctr::mean;
     130                 :            :   using tk::ctr::variance;
     131                 :            :   using tk::ctr::Term;
     132                 :            :   using tk::ctr::Moment;
     133                 :            :   using tk::ctr::Product;
     134                 :            : 
     135         [ +  + ]:       7176 :   for (ncomp_t c=0; c<ncomp; ++c) {
     136                 :       4784 :     k[c] = kprime[c];
     137                 :            :   }
     138                 :            : 
     139         [ +  + ]:       7176 :   for (ncomp_t c=0; c<ncomp; ++c) {
     140 [ +  - ][ -  + ]:       4784 :     if (S[c] < 0.0 || S[c] > 1.0) {
     141                 :          0 :       std::cout << "S[" << c << "] bounds violated: " << S[c] << '\n';
     142                 :            :     }
     143                 :            :   }
     144                 :       2392 : }
     145                 :            : 
     146                 :         24 : walker::MixDirichletHomogeneous::MixDirichletHomogeneous(
     147                 :            :   ncomp_t ncomp,
     148                 :            :   ctr::NormalizationType norm,
     149                 :            :   const std::vector< kw::sde_b::info::expect::type >& b_,
     150                 :            :   const std::vector< kw::sde_S::info::expect::type >& S_,
     151                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
     152                 :            :   const std::vector< kw::sde_rho::info::expect::type >& rho_,
     153                 :            :   std::vector< kw::sde_b::info::expect::type  >& b,
     154                 :            :   std::vector< kw::sde_S::info::expect::type >& S,
     155                 :            :   std::vector< kw::sde_kappa::info::expect::type >& kprime,
     156                 :            :   std::vector< kw::sde_rho::info::expect::type >& rho,
     157                 :            :   std::vector< kw::sde_r::info::expect::type >& r,
     158                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k )
     159                 :            : // *****************************************************************************
     160                 :            : // Constructor: initialize coefficients
     161                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
     162                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
     163                 :            : //! \param[in] b_ Vector used to initialize coefficient vector b
     164                 :            : //! \param[in] S_ Vector used to initialize coefficient vector S
     165                 :            : //! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k
     166                 :            : //! \param[in] rho_ Vector used to initialize coefficient vector rho and r
     167                 :            : //! \param[in,out] b Coefficient vector to be initialized
     168                 :            : //! \param[in,out] S Coefficient vector to be initialized
     169                 :            : //! \param[in,out] kprime Coefficient vector to be initialized
     170                 :            : //! \param[in,out] rho Coefficient vector to be initialized
     171                 :            : //! \param[in,out] r Coefficient vector to be initialized
     172                 :            : //! \param[in,out] k Coefficient vector to be initialized
     173                 :            : // *****************************************************************************
     174                 :            : {
     175 [ -  + ][ -  - ]:         24 :   ErrChk( b_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     176                 :            :           "Wrong number of MixDirichlet SDE parameters 'b'");
     177 [ -  + ][ -  - ]:         24 :   ErrChk( S_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     178                 :            :           "Wrong number of MixDirichlet SDE parameters 'S'");
     179 [ -  + ][ -  - ]:         24 :   ErrChk( kprime_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     180                 :            :           "Wrong number of MixDirichlet SDE parameters 'kappaprime'");
     181 [ -  + ][ -  - ]:         24 :   ErrChk( rho_.size() == ncomp+1,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     182                 :            :           "Wrong number of MixDirichlet SDE parameters 'rho'");
     183                 :            : 
     184                 :         24 :   b = b_;
     185                 :         24 :   S = S_;
     186                 :         24 :   kprime = kprime_;
     187                 :         24 :   rho = rho_;
     188                 :         24 :   k.resize( kprime.size(), 0.0 );
     189                 :            : 
     190                 :            :   // Compute parameter vector r based on r_i = rho_N/rho_i - 1
     191                 :            :   Assert( r.empty(), "Parameter vector r must be empty" );
     192                 :         24 :   r = MixDir_r( rho, norm );
     193                 :         24 : }
     194                 :            : 
     195                 :            : void
     196                 :       7176 : walker::MixDirichletHomogeneous::update(
     197                 :            :   char depvar,
     198                 :            :   ncomp_t ncomp,
     199                 :            :   ctr::NormalizationType norm,
     200                 :            :   std::size_t density_offset,
     201                 :            :   std::size_t /*volume_offset*/,
     202                 :            :   const std::map< tk::ctr::Product, tk::real >& moments,
     203                 :            :   const std::vector< kw::sde_rho::info::expect::type >& rho,
     204                 :            :   const std::vector< kw::sde_r::info::expect::type >& r,
     205                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime,
     206                 :            :   const std::vector< kw::sde_b::info::expect::type >& b,
     207                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k,
     208                 :            :   std::vector< kw::sde_kappa::info::expect::type >& S ) const
     209                 :            : // *****************************************************************************
     210                 :            : //  Update coefficients
     211                 :            : //! \param[in] depvar Dependent variable
     212                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
     213                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
     214                 :            : //! \param[in] density_offset Offset of particle density in solution array
     215                 :            : //!    relative to YN
     216                 :            : //! \param[in] volume_offset Offset of particle specific volume in solution
     217                 :            : //!    array relative to YN
     218                 :            : //! \param[in] moments Map of statistical moments estimated
     219                 :            : //! \param[in] rho Coefficient vector
     220                 :            : //! \param[in] r Coefficient Vector
     221                 :            : //! \param[in] kprime Coefficient vector
     222                 :            : //! \param[in] b Coefficient vector
     223                 :            : //! \param[in,out] k Coefficient vector to be updated
     224                 :            : //! \param[in,out] S Coefficient vector to be updated
     225                 :            : // *****************************************************************************
     226                 :            : {
     227                 :            :   using tk::ctr::lookup;
     228                 :            :   using tk::ctr::mean;
     229                 :            :   using tk::ctr::Term;
     230                 :            :   using tk::ctr::Moment;
     231                 :            :   using tk::ctr::Product;
     232                 :            : 
     233                 :            :   // Shorthands for dependent variable, Y, used to construct statistics
     234                 :       7176 :   auto Yv = static_cast< char >( std::toupper(depvar) );
     235                 :            : 
     236                 :       7176 :   Term tR( Yv, ncomp+density_offset, Moment::ORDINARY );
     237                 :            :   Term tYN( Yv, ncomp, Moment::ORDINARY );
     238                 :            : 
     239 [ +  - ][ +  - ]:       7176 :   auto R2YN = lookup( Product({tR,tR,tYN}), moments );
     240                 :            : 
     241                 :       7176 :   std::vector< tk::real > R2Y( ncomp, 0.0 );
     242 [ +  - ][ -  - ]:       7176 :   std::vector< tk::real > R3YNY( ncomp, 0.0 );
     243         [ +  + ]:      21528 :   for (ncomp_t c=0; c<ncomp; ++c) {
     244                 :            :     Term tYc( Yv, c, Moment::ORDINARY );
     245 [ +  - ][ +  - ]:      14352 :     R2Y[c] = lookup( Product({tR,tR,tYc}), moments ); // <R^2Yc>
                 [ +  - ]
     246 [ +  - ][ +  - ]:      28704 :     R3YNY[c] = lookup( Product({tR,tR,tR,tYc,tYN}), moments ); // <R^3YNYc>
         [ +  - ][ -  - ]
     247                 :            :   }
     248                 :            : 
     249                 :            :   // Assume heavy-fluid normalization by default: rhoN = rhoH
     250         [ +  + ]:       7176 :   tk::real rhoL = rho[0], rhoH = rho[ncomp];
     251                 :            :   // Overwrite if light-fluid normalization is configured
     252         [ +  + ]:       7176 :   if (norm == ctr::NormalizationType::LIGHT) {   // rhoN = rhoL
     253                 :            :     rhoL = rho[ncomp];
     254                 :            :     rhoH = rho[0];
     255                 :            :   }
     256                 :            : 
     257         [ +  + ]:      21528 :   for (ncomp_t c=0; c<ncomp; ++c) {
     258         [ +  + ]:      14352 :     k[c] = kprime[c];
     259                 :      14352 :     auto rcp = rhoL/rho[c] + 1.0;
     260                 :      14352 :     auto rc = r[c];     // heavy-fluid normalization by default
     261                 :            :     // Overwrite if light-fluid normalization is configured
     262         [ +  + ]:      14352 :     if (norm == ctr::NormalizationType::LIGHT) rc = (rcp - 2.0) * rhoH/rhoL;
     263                 :      14352 :     S[c] = (R2Y[c] + 2.0*k[c]/b[c]*rc/rhoH*R3YNY[c]) / (R2Y[c] + R2YN);
     264                 :            :   }
     265                 :            : 
     266         [ +  + ]:      21528 :   for (ncomp_t c=0; c<ncomp; ++c) {
     267 [ +  - ][ -  + ]:      14352 :     if (S[c] < 0.0 || S[c] > 1.0) {
     268         [ -  - ]:          0 :       std::cout << "S[" << c << "] bounds violated: " << S[c] << '\n';
     269                 :            :     }
     270                 :            :   }
     271                 :       7176 : }
     272                 :            : 
     273                 :          0 : walker::MixDirichletHydroTimeScale::MixDirichletHydroTimeScale(
     274                 :            :   tk::ctr::ncomp_t ncomp,
     275                 :            :   ctr::NormalizationType norm,
     276                 :            :   const std::vector< kw::sde_b::info::expect::type >& b_,
     277                 :            :   const std::vector< kw::sde_S::info::expect::type >& S_,
     278                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
     279                 :            :   const std::vector< kw::sde_rho::info::expect::type >& rho_,
     280                 :            :   std::vector< kw::sde_b::info::expect::type  >& b,
     281                 :            :   std::vector< kw::sde_S::info::expect::type >& S,
     282                 :            :   std::vector< kw::sde_kappa::info::expect::type >& kprime,
     283                 :            :   std::vector< kw::sde_rho::info::expect::type >& rho,
     284                 :            :   std::vector< kw::sde_r::info::expect::type >& r,
     285                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k )
     286                 :            : // *****************************************************************************
     287                 :            : // Constructor: initialize coefficients
     288                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
     289                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
     290                 :            : //! \param[in] b_ Vector used to initialize coefficient vector b
     291                 :            : //! \param[in] S_ Vector used to initialize coefficient vector S
     292                 :            : //! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k
     293                 :            : //! \param[in] rho_ Vector used to initialize coefficient vector rho and r
     294                 :            : //! \param[in,out] b Coefficient vector to be initialized
     295                 :            : //! \param[in,out] S Coefficient vector to be initialized
     296                 :            : //! \param[in,out] kprime Coefficient vector to be initialized
     297                 :            : //! \param[in,out] rho Coefficient vector to be initialized
     298                 :            : //! \param[in,out] r Coefficient vector to be initialized
     299                 :            : //! \param[in,out] k Coefficient vector to be initialized
     300                 :            : // *****************************************************************************
     301                 :            : {
     302 [ -  - ][ -  - ]:          0 :   ErrChk( b_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     303                 :            :           "Wrong number of MixDirichlet SDE parameters 'b'");
     304 [ -  - ][ -  - ]:          0 :   ErrChk( S_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     305                 :            :           "Wrong number of MixDirichlet SDE parameters 'S'");
     306 [ -  - ][ -  - ]:          0 :   ErrChk( kprime_.size() == ncomp,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     307                 :            :           "Wrong number of MixDirichlet SDE parameters 'kappaprime'");
     308 [ -  - ][ -  - ]:          0 :   ErrChk( rho_.size() == ncomp+1,
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     309                 :            :           "Wrong number of MixDirichlet SDE parameters 'rho'");
     310                 :            : 
     311                 :          0 :   b = b_;
     312                 :          0 :   S = S_;
     313                 :          0 :   kprime = kprime_;
     314                 :          0 :   rho = rho_;
     315                 :          0 :   k.resize( kprime.size(), 0.0 );
     316                 :            : 
     317                 :            :   // Compute parameter vector r based on r_i = rho_N/rho_i - 1
     318                 :            :   Assert( r.empty(), "Parameter vector r must be empty" );
     319                 :          0 :   r = MixDir_r( rho, norm );
     320                 :          0 : }
     321                 :            : 
     322                 :            : void
     323                 :          0 : walker::MixDirichletHydroTimeScale::update(
     324                 :            :   char depvar,
     325                 :            :   ncomp_t ncomp,
     326                 :            :   ctr::NormalizationType norm,
     327                 :            :   std::size_t density_offset,
     328                 :            :   std::size_t volume_offset,
     329                 :            :   const std::map< tk::ctr::Product, tk::real >& moments,
     330                 :            :   const std::vector< kw::sde_rho::info::expect::type >& rho,
     331                 :            :   const std::vector< kw::sde_r::info::expect::type >& r,
     332                 :            :   const std::vector< kw::sde_kappa::info::expect::type >& kprime,
     333                 :            :   const std::vector< kw::sde_b::info::expect::type >& b,
     334                 :            :   std::vector< kw::sde_kappa::info::expect::type >& k,
     335                 :            :   std::vector< kw::sde_kappa::info::expect::type >& S ) const
     336                 :            : // *****************************************************************************
     337                 :            : //  Update coefficients
     338                 :            : //! \param[in] depvar Dependent variable
     339                 :            : //! \param[in] ncomp Number of scalar components in this SDE system
     340                 :            : //! \param[in] norm Normalization type (N=heavy or N=light)
     341                 :            : //! \param[in] density_offset Offset of particle density in solution array
     342                 :            : //!    relative to YN
     343                 :            : //! \param[in] volume_offset Offset of particle specific volume in solution
     344                 :            : //!    array relative to YN
     345                 :            : //! \param[in] moments Map of statistical moments estimated
     346                 :            : //! \param[in] rho Coefficient vector
     347                 :            : //! \param[in] r Coefficient Vector
     348                 :            : //! \param[in] kprime Coefficient vector
     349                 :            : //! \param[in] b Coefficient vector
     350                 :            : //! \param[in,out] k Coefficient vector to be updated
     351                 :            : //! \param[in,out] S Coefficient vector to be updated
     352                 :            : // *****************************************************************************
     353                 :            : {
     354                 :            :   using tk::ctr::lookup;
     355                 :            :   using tk::ctr::mean;
     356                 :            :   using tk::ctr::variance;
     357                 :            :   using tk::ctr::Term;
     358                 :            :   using tk::ctr::Moment;
     359                 :            :   using tk::ctr::Product;
     360                 :            : 
     361                 :            :   // Shorthands for dependent variables, Y and y = Y - <Y>, used to construct
     362                 :            :   // statistics
     363                 :          0 :   auto Yv = static_cast< char >( std::toupper(depvar) );
     364                 :          0 :   auto yv = static_cast< char >( std::tolower(depvar) );
     365                 :            : 
     366                 :            :   // <R>
     367         [ -  - ]:          0 :   tk::real R = lookup( mean(depvar,ncomp+density_offset), moments );
     368                 :            :   //if (R < 1.0e-8) R = 1.0;
     369                 :            : 
     370                 :            :   // b = -<rv>, density-specific-volume covariance
     371                 :          0 :   Term rhoprime( yv, ncomp+density_offset, Moment::CENTRAL );
     372                 :            :   Term vprime( yv, ncomp+volume_offset, Moment::CENTRAL );
     373                 :            :   //auto ds = -lookup( Product({rhoprime,vprime}), moments );
     374                 :            : 
     375                 :            :   // b. = -<ry.>/<R>
     376                 :          0 :   std::vector< tk::real > bc( ncomp, 0.0 );
     377         [ -  - ]:          0 :   for (ncomp_t c=0; c<ncomp; ++c) {
     378                 :            :     Term tr( yv, ncomp+density_offset, Moment::CENTRAL );
     379                 :            :     Term ty( yv, c, Moment::CENTRAL );
     380 [ -  - ][ -  - ]:          0 :     bc[c] = -lookup( Product({tr,ty}), moments ) / R; // -<ryc>/<R>
                 [ -  - ]
     381                 :            :   }
     382                 :            : 
     383                 :            :   Term tR( Yv, ncomp+density_offset, Moment::ORDINARY );
     384                 :            :   Term tYN( Yv, ncomp, Moment::ORDINARY );
     385                 :            : 
     386 [ -  - ][ -  - ]:          0 :   auto R2YN = lookup( Product({tR,tR,tYN}), moments );
     387                 :            : 
     388 [ -  - ][ -  - ]:          0 :   std::vector< tk::real > y2( ncomp, 0.0 );
     389 [ -  - ][ -  - ]:          0 :   std::vector< tk::real > RY( ncomp, 0.0 );
     390 [ -  - ][ -  - ]:          0 :   std::vector< tk::real > R2Y( ncomp, 0.0 );
     391 [ -  - ][ -  - ]:          0 :   std::vector< tk::real > R3YNY( ncomp, 0.0 );
     392 [ -  - ][ -  - ]:          0 :   std::vector< tk::real > R3Y2( ncomp*ncomp, 0.0 );
     393         [ -  - ]:          0 :   for (ncomp_t c=0; c<ncomp; ++c) {
     394 [ -  - ][ -  - ]:          0 :     y2[c] = lookup( variance(yv,c), moments );
                 [ -  - ]
     395                 :            :     Term tYc( Yv, c, Moment::ORDINARY );
     396 [ -  - ][ -  - ]:          0 :     RY[c] = lookup( Product({tR,tYc}), moments );    // <RYc>
                 [ -  - ]
     397 [ -  - ][ -  - ]:          0 :     R2Y[c] = lookup( Product({tR,tR,tYc}), moments ); // <R^2Yc>
                 [ -  - ]
     398 [ -  - ][ -  - ]:          0 :     R3YNY[c] = lookup( Product({tR,tR,tR,tYc,tYN}), moments ); // <R^3YNYc>
                 [ -  - ]
     399         [ -  - ]:          0 :     for (ncomp_t d=0; d<ncomp; ++d) {
     400                 :            :       Term tYd( Yv, d, Moment::ORDINARY );
     401                 :            :       // <R^3YcYd>
     402 [ -  - ][ -  - ]:          0 :       R3Y2[c*ncomp+d] = lookup( Product({tR,tR,tR,tYc,tYd}), moments );
         [ -  - ][ -  - ]
     403                 :            :     }
     404                 :            :     //std::cout << "R2Y: " << R2Y[c] << ' ';
     405                 :            :   }
     406                 :            :   //std::cout << std::endl;
     407                 :            : 
     408                 :            :   // Reynolds means
     409                 :            : 
     410                 :            :   // Reynolds means, Yc
     411                 :            :   //std::vector< tk::real > Y( ncomp, 0.0 );
     412                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) {
     413                 :            :   //  Y[c] = lookup( mean(depvar,c), moments );
     414                 :            :   //  //std::cout << "Y: " << Y[c] << ' ';
     415                 :            :   //}
     416                 :            :   //std::cout << std::endl;
     417                 :            : 
     418                 :            :   // sum of Yc
     419                 :            :   //tk::real sumY = 0.0;
     420                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) sumY += Y[c];
     421                 :            : 
     422                 :            :   //// Y|Kc
     423                 :            :   //std::vector< tk::real > YK( ncomp, 0.0 );
     424                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) {
     425                 :            :   //  YK[c] = sumY - lookup( mean(depvar,c), moments );
     426                 :            :   //  //std::cout << "YK: " << YK[c] << ' ';
     427                 :            :   //}
     428                 :            :   //std::cout << std::endl;
     429                 :            : 
     430                 :            :   // Favre means
     431                 :            : 
     432                 :            :   // Ytc
     433                 :            :   //std::vector< tk::real > Yt( ncomp, 0.0 );
     434                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) {
     435                 :            :   //  Yt[c] = RY[c] / R;
     436                 :            :   //  //std::cout << "Yt: " << Yt[c] << ' ';
     437                 :            :   //}
     438                 :            :   //std::cout << std::endl;
     439                 :            : 
     440                 :            :   // sum of Ytc
     441                 :            :   //tk::real sumYt = 0.0;
     442                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) sumYt += Yt[c];
     443                 :            :   //std::cout << "sumYt: " << sumYt << '\n';
     444                 :            : 
     445                 :            :   // Yt|Kc
     446                 :            :   //std::vector< tk::real > YtK( ncomp, 0.0 );
     447                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) {
     448                 :            :   //  YtK[c] = sumYt - Yt[c];
     449                 :            :   //  //std::cout << "YtK: " << YtK[c] << ' ';
     450                 :            :   //}
     451                 :            :   //std::cout << std::endl;
     452                 :            : 
     453                 :            :   // sum of <R^2Yc>
     454                 :            :   //tk::real sumR2Y = 0.0;
     455                 :            :   //std::vector< tk::real > sumR3Y2( ncomp, 0.0 );
     456                 :            :   //for (ncomp_t c=0; c<ncomp; ++c) {
     457                 :            :   //  sumR2Y += R2Y[c];
     458                 :            :   //  for (ncomp_t d=0; d<ncomp; ++d) sumR3Y2[c] += R3Y2[c*ncomp+d];
     459                 :            :   //}
     460                 :            :   //std::cout << "sumR2Y: " << sumR2Y << std::endl;
     461                 :            : 
     462                 :            :   // <r^2>, density variance
     463                 :            :   //auto rhovar = lookup( variance(yv,ncomp), moments );
     464                 :            :   //std::cout << "<r^2>: " << rhovar << std::endl;
     465                 :            : 
     466                 :            :   // <R^2>
     467                 :            :   //auto R2 = lookup( Product({tR,tR}), moments );
     468                 :            : 
     469                 :            :   // Assume heavy-fluid normalization by default: rhoN = rhoH
     470         [ -  - ]:          0 :   tk::real rhoL = rho[0], rhoH = rho[ncomp];
     471                 :            :   // Overwrite if light-fluid normalization is configured
     472         [ -  - ]:          0 :   if (norm == ctr::NormalizationType::LIGHT) {   // rhoN = rhoL
     473                 :            :     rhoL = rho[ncomp];
     474                 :            :     rhoH = rho[0];
     475                 :            :   }
     476                 :            : 
     477         [ -  - ]:          0 :   for (ncomp_t c=0; c<ncomp; ++c) {
     478                 :            : 
     479                 :            :     //k[c] = kprime[c] * bc[c];
     480                 :            :     //k[c] = kprime[c] * ds;
     481         [ -  - ]:          0 :     k[c] = kprime[c];
     482                 :            :     //k[c] = kprime[c] * y2[c];
     483                 :            :     //if (k[c] < 0.0)
     484                 :            :     // std::cout << "Positivity of k[" << c << "] violated: "
     485                 :            :     //           << k[c] << '\n';
     486                 :            : 
     487                 :            :     //S[c] = 1.0/(1.0-YK[c]) - (1.0-Yt[c])/(1.0-YtK[c]);
     488                 :            :     //S[c] = YK[c]/(1.0-YK[c]) - (1.0-Yt[c])*YtK[c]/(1.0-YtK[c]) + Yt[c];
     489                 :            :     //S[c] = Yt[c] / ( 1.0 - sumYt + Yt[c] );
     490                 :            :     //S[c] = ( -2.0*(r[c]/rho[ncomp]*R2Y[c])*(1.0-sumYt) +
     491                 :            :     //         (r[c]/rho[ncomp]*(rhovar-sumR2Y))*Yt[c] ) /
     492                 :            :     //       ( -2.0*(r[c]/rho[ncomp]*R2Y[c])*(1.0-sumYt) -
     493                 :            :     //         (1.0-sumYt-Yt[c])*(r[c]/rho[ncomp]*(rhovar-sumR2Y)) );
     494                 :            : 
     495                 :            :     // correlation of density gradient wrt Y_alpha and Y_alpha (Y_alpha = Yc)
     496                 :            :     //tk::real drYcYc = -r[c]/rho[ncomp]*R2Y[c];
     497                 :            :     //tk::real drYcYN = -r[c]/rho[ncomp]*(R2-sumR2Y);
     498                 :            :     //tk::real drYc2YcYN = 2.0*std::pow(r[c]/rho[ncomp],2.0)*(R3Y[c]-sumR3Y2[c]);
     499                 :            :     //S[c] = (drYcYc - k[c]/b[c]*drYc2YcYN) / (drYcYN + drYcYc);
     500                 :            :     //S[c] = Yt[c] / (1.0 - sumYt + Yt[c]) - k[c]/b[c]*drYc2YcYN / (drYcYN + drYcYc);
     501                 :            : 
     502                 :            :     //S[c] = Yt[c] / (1.0 - sumYt + Yt[c]);     // S_infty
     503                 :            : 
     504                 :          0 :     auto rcp = rhoL/rho[c] + 1.0;
     505                 :          0 :     auto rc = r[c];     // heavy-fluid normalization by default
     506                 :            :     // Overwrite if light-fluid normalization is configured
     507         [ -  - ]:          0 :     if (norm == ctr::NormalizationType::LIGHT) rc = (rcp - 2.0) * rhoH/rhoL;
     508                 :          0 :     S[c] = (R2Y[c] + 2.0*k[c]/b[c]*rc/rhoH*R3YNY[c]) / (R2Y[c] + R2YN);
     509                 :            : 
     510                 :            :     //std::cout << "S[" << c << "] = " << S[c] << ", b/k(1-S) = "
     511                 :            :     //          << b[c]/k[c]*(1.0-S[c]) << '\n';
     512                 :            : 
     513                 :            :   }
     514                 :            :   //std::cout << std::endl;
     515                 :            : 
     516         [ -  - ]:          0 :   for (ncomp_t c=0; c<ncomp; ++c) {
     517 [ -  - ][ -  - ]:          0 :     if (S[c] < 0.0 || S[c] > 1.0) {
     518         [ -  - ]:          0 :       std::cout << "S[" << c << "] bounds violated: " << S[c] << '\n';
     519                 :            :       //S[c] = 0.5;
     520                 :            :     }
     521                 :            :   }
     522                 :            :   //std::cout << std::endl;
     523                 :          0 : }

Generated by: LCOV version 1.14