Walker test code coverage report
Current view: top level - Control/Walker/InputDeck - Grammar.hpp (source / functions) Hit Total Coverage
Commit: test_coverage.info Lines: 139 187 74.3 %
Date: 2022-09-21 18:57:21 Functions: 75 92 81.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 108 256 42.2 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/Control/Walker/InputDeck/Grammar.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     Walker's input deck grammar definition
       9                 :            :   \details   Walker's input deck grammar definition. We use the Parsing
      10                 :            :     Expression Grammar Template Library (PEGTL) to create the grammar and the
      11                 :            :     associated parser. Word of advice: read from the bottom up.
      12                 :            : */
      13                 :            : // *****************************************************************************
      14                 :            : #ifndef WalkerInputDeckGrammar_h
      15                 :            : #define WalkerInputDeckGrammar_h
      16                 :            : 
      17                 :            : #include <limits>
      18                 :            : #include <algorithm>
      19                 :            : 
      20                 :            : #include "Macro.hpp"
      21                 :            : #include "Exception.hpp"
      22                 :            : #include "Walker/Types.hpp"
      23                 :            : #include "Keywords.hpp"
      24                 :            : #include "CommonGrammar.hpp"
      25                 :            : #include "WalkerConfig.hpp"
      26                 :            : #include "Walker/Options/InitPolicy.hpp"
      27                 :            : #include "Walker/Options/CoeffPolicy.hpp"
      28                 :            : #include "Walker/Options/HydroTimeScales.hpp"
      29                 :            : #include "Walker/Options/HydroProductions.hpp"
      30                 :            : 
      31                 :            : #ifdef HAS_MKL
      32                 :            :   #include "MKLGrammar.hpp"
      33                 :            : #endif
      34                 :            : #ifdef HAS_RNGSSE2
      35                 :            :   #include "RNGSSEGrammar.hpp"
      36                 :            : #endif
      37                 :            : #include "Random123Grammar.hpp"
      38                 :            : 
      39                 :            : namespace walker {
      40                 :            : 
      41                 :            : extern ctr::InputDeck g_inputdeck_defaults;
      42                 :            : 
      43                 :            : //! Walker input deck facilitating user input for integrating SDEs
      44                 :            : namespace deck {
      45                 :            : 
      46                 :            :   //! \brief Specialization of tk::grm::use for Walker's input deck parser
      47                 :            :   template< typename keyword >
      48                 :            :   using use = tk::grm::use< keyword, ctr::InputDeck::keywords >;
      49                 :            : 
      50                 :            :   // Walker's InputDeck state
      51                 :            :  
      52                 :            :   //! \brief Number of registered equations
      53                 :            :   //! \details Counts the number of parsed equation blocks during parsing.
      54                 :            :   static tk::TaggedTuple< brigand::list<
      55                 :            :       tag::dirichlet,       std::size_t
      56                 :            :     , tag::mixdirichlet,    std::size_t
      57                 :            :     , tag::gendir,          std::size_t
      58                 :            :     , tag::wrightfisher,    std::size_t
      59                 :            :     , tag::ou,              std::size_t
      60                 :            :     , tag::diagou,          std::size_t
      61                 :            :     , tag::skewnormal,      std::size_t
      62                 :            :     , tag::gamma,           std::size_t
      63                 :            :     , tag::velocity,        std::size_t
      64                 :            :     , tag::position,        std::size_t
      65                 :            :     , tag::dissipation,     std::size_t
      66                 :            :     , tag::beta,            std::size_t
      67                 :            :     , tag::numfracbeta,     std::size_t
      68                 :            :     , tag::massfracbeta,    std::size_t
      69                 :            :     , tag::mixnumfracbeta,  std::size_t
      70                 :            :     , tag::mixmassfracbeta, std::size_t
      71                 :            :   > > neq;
      72                 :            : 
      73                 :            : } // ::deck
      74                 :            : } // ::walker
      75                 :            : 
      76                 :            : namespace tk {
      77                 :            : namespace grm {
      78                 :            : 
      79                 :            :   using namespace tao;
      80                 :            : 
      81                 :            :   // Note that PEGTL action specializations must be in the same namespace as the
      82                 :            :   // template being specialized. See http://stackoverflow.com/a/3052604.
      83                 :            : 
      84                 :            :   // Walker's InputDeck actions
      85                 :            : 
      86                 :            :   //! Rule used to trigger action
      87                 :            :   template< class Option, typename... tags >
      88                 :            :   struct store_walker_option : pegtl::success {};
      89                 :            :   //! \brief Put option in state at position given by tags
      90                 :            :   //! \details This is simply a wrapper around tk::grm::store_option passing the
      91                 :            :   //!    stack defaults for walker.
      92                 :            :   template< class Option, typename... tags >
      93                 :            :   struct action< store_walker_option< Option, tags... > > {
      94                 :            :     template< typename Input, typename Stack >
      95                 :         66 :     static void apply( const Input& in, Stack& stack ) {
      96                 :            :       store_option< Stack, walker::deck::use, Option, walker::ctr::InputDeck,
      97                 :            :                     Input, tags... >
      98                 :         66 :                   ( stack, in, walker::g_inputdeck_defaults );
      99                 :         66 :     }
     100                 :            :   };
     101                 :            : 
     102                 :            :   //! Rule used to trigger action
     103                 :            :   template< class eq > struct register_eq : pegtl::success {};
     104                 :            :   //! \brief Register differential equation after parsing its block
     105                 :            :   //! \details This is used by the error checking functors (check_*) during
     106                 :            :   //!    parsing to identify the recently-parsed block.
     107                 :            :   template< class eq >
     108                 :            :   struct action< register_eq< eq > > {
     109                 :            :     template< typename Input, typename Stack >
     110                 :        105 :     static void apply( const Input&, Stack& ) {
     111                 :            :       using walker::deck::neq;
     112                 :        105 :       ++neq.get< eq >();
     113                 :        105 :     }
     114                 :            :   };
     115                 :            : 
     116                 :            :   //! Rule used to trigger action
     117                 :            :   template< class eq, class vec, MsgKey key >
     118                 :            :   struct check_vector_exists : pegtl::success {};
     119                 :            :   //! \brief Check the existence of a vector (required for a block)
     120                 :            :   //! \details This functor can be used to check the existence of a
     121                 :            :   //!   user-specified vector, e.g., at the end of a diffeq ... end block, that
     122                 :            :   //!   is required for that block. If the vector does not exist, we error out.
     123                 :            :   //! \note This functor only checks existence. If the vector exists, the size
     124                 :            :   //!   of it can be checked by check_vector_size.
     125                 :            :   template< class eq, class vec, MsgKey Key >
     126                 :            :   struct action< check_vector_exists< eq, vec, Key > > {
     127                 :            :     template< typename Input, typename Stack >
     128                 :         10 :     static void apply( const Input& in, Stack& stack ) {
     129                 :         10 :       const auto& vv = stack.template get< tag::param, eq, vec >();
     130                 :            :       using walker::deck::neq;
     131         [ -  + ]:         10 :       if (vv.size() != neq.get< eq >())
     132                 :          0 :         Message< Stack, ERROR, Key >( stack, in );
     133                 :         10 :     }
     134                 :            :   };
     135                 :            : 
     136                 :            :   //! Rule used to trigger action
     137                 :            :   template< class eq, class vec > struct check_vector_size : pegtl::success {};
     138                 :            :   //! \brief Do error checking of a vector (required for a block)
     139                 :            :   //! \details This functor can be used to verify the correct size of an already
     140                 :            :   //!   existing vector, specified by the user in a given block. The vector is
     141                 :            :   //!   required to be non-empty.
     142                 :            :   //! \note This functor does not check existence of a vector. If the vector
     143                 :            :   //!   does not even exist, it will throw an exception in DEBUG mode, while in
     144                 :            :   //!   RELEASE mode it will attempt to access unallocated memory yielding a
     145                 :            :   //!   segfault. The existence of the vector should be checked by
     146                 :            :   //!   check_vector_exists first.
     147                 :            :   template< class eq, class vec  >
     148                 :            :   struct action< check_vector_size< eq, vec > > {
     149                 :            :     template< typename Input, typename Stack >
     150                 :         10 :     static void apply( const Input& in, Stack& stack ) {
     151                 :         10 :       const auto& vv = stack.template get< tag::param, eq, vec >();
     152 [ -  + ][ -  - ]:         10 :       Assert( !vv.empty(), "Vector of vectors checked must not be empty" );
         [ -  - ][ -  - ]
     153                 :         10 :       const auto& v = vv.back();
     154         [ -  + ]:         10 :       if (v.empty())
     155                 :          0 :         Message< Stack, ERROR, MsgKey::WRONGSIZE >( stack, in );
     156                 :         10 :     }
     157                 :            :   };
     158                 :            : 
     159                 :            :   //! Rule used to trigger action
     160                 :            :   template< class eq, class vec >
     161                 :            :   struct check_mean_gradient : pegtl::success {};
     162                 :            :   //! Do error checking for a vector of prescribed mean gradient
     163                 :            :   template< class eq, class vec  >
     164                 :            :   struct action< check_mean_gradient< eq, vec > > {
     165                 :            :     template< typename Input, typename Stack >
     166                 :          0 :     static void apply( const Input& in, Stack& stack ) {
     167                 :          0 :       auto& vv = stack.template get< tag::param, eq, vec >();
     168 [ -  - ][ -  - ]:          0 :       Assert( !vv.empty(), "Vector of vectors checked must not be empty" );
         [ -  - ][ -  - ]
     169         [ -  - ]:          0 :       if (vv.back().size() != 3)
     170                 :          0 :         Message< Stack, ERROR, MsgKey::WRONGSIZE >( stack, in );
     171                 :          0 :     }
     172                 :            :   };
     173                 :            : 
     174                 :            :   //! Rule used to trigger action
     175                 :            :   template< class eq, class vec >
     176                 :            :   struct check_gravity : pegtl::success {};
     177                 :            :   //! Do error checking for a vector of prescribed mean gradient
     178                 :            :   template< class eq, class vec  >
     179                 :            :   struct action< check_gravity< eq, vec > > {
     180                 :            :     template< typename Input, typename Stack >
     181                 :          0 :     static void apply( const Input& in, Stack& stack ) {
     182                 :          0 :       auto& vv = stack.template get< tag::param, eq, vec >();
     183 [ -  - ][ -  - ]:          0 :       Assert( !vv.empty(), "Vector of vectors checked must not be empty" );
         [ -  - ][ -  - ]
     184         [ -  - ]:          0 :       if (vv.back().size() != 3)
     185                 :          0 :         Message< Stack, ERROR, MsgKey::WRONGSIZE >( stack, in );
     186                 :          0 :     }
     187                 :            :   };
     188                 :            : 
     189                 :            :   //! Rule used to trigger action
     190                 :            :   template< class eq > struct check_eq : pegtl::success {};
     191                 :            :   //! \brief Do general error checking on the differential equation block
     192                 :            :   //! \details This is error checking that all equation types must satisfy.
     193                 :            :   template< class eq >
     194                 :            :   struct action< check_eq< eq > > {
     195                 :            :     template< typename Input, typename Stack >
     196                 :        105 :     static void apply( const Input& in, Stack& stack ) {
     197                 :            :       using walker::deck::neq;
     198                 :            :       // Error out if no dependent variable has been selected
     199                 :            :       const auto& depvar =
     200                 :        105 :         stack.template get< tag::param, eq, tag::depvar >();
     201 [ +  - ][ -  + ]:        105 :       if (depvar.empty() || depvar.size() != neq.get< eq >())
                 [ -  + ]
     202                 :          0 :         Message< Stack, ERROR, MsgKey::NODEPVAR >( stack, in );
     203                 :            : 
     204                 :            :       // Error out if no number of components has been selected
     205                 :        105 :       const auto& ncomp = stack.template get< tag::component, eq >();
     206 [ +  - ][ -  + ]:        105 :       if (ncomp.empty() || ncomp.size() != neq.get< eq >())
                 [ -  + ]
     207                 :          0 :         Message< Stack, ERROR, MsgKey::NONCOMP >( stack, in );
     208                 :            : 
     209                 :            :       // Error out if no RNG has been selected
     210                 :        105 :       const auto& rng = stack.template get< tag::param, eq, tag::rng >();
     211 [ +  - ][ -  + ]:        105 :       if (rng.empty() || rng.size() != neq.get< eq >())
                 [ -  + ]
     212                 :          0 :         Message< Stack, ERROR, MsgKey::NORNG >( stack, in );
     213                 :            : 
     214                 :            :       // Error out if no initialization policy has been selected
     215                 :            :       const auto& init =
     216                 :        105 :         stack.template get< tag::param, eq, tag::initpolicy >();
     217 [ +  - ][ -  + ]:        105 :       if (init.empty() || init.size() != neq.get< eq >())
                 [ -  + ]
     218                 :          0 :         Message< Stack, ERROR, MsgKey::NOINIT >( stack, in );
     219                 :            : 
     220                 :            :       // Error out if no coefficients policy has been selected
     221                 :            :       const auto& coeff =
     222                 :        105 :         stack.template get< tag::param, eq, tag::coeffpolicy >();
     223 [ +  - ][ -  + ]:        105 :       if (coeff.empty() || coeff.size() != neq.get< eq >())
                 [ -  + ]
     224                 :          0 :         Message< Stack, ERROR, MsgKey::NOCOEFF >( stack, in );
     225                 :        105 :     }
     226                 :            :   };
     227                 :            : 
     228                 :            :   //! Rule used to trigger action
     229                 :            :   template< class eq > struct check_init : pegtl::success {};
     230                 :            :   //! \brief Do error checking on the selected initialization policy
     231                 :            :   template< class eq >
     232                 :            :   struct action< check_init< eq > > {
     233                 :            :     template< typename Input, typename Stack >
     234                 :        105 :     static void apply( const Input& in, Stack& stack ) {
     235                 :            :       using walker::deck::neq;
     236                 :            :       const auto& initpolicy =
     237                 :        105 :         stack.template get< tag::param, eq, tag::initpolicy >();
     238                 :            :       // Error checks for joint delta initpolicy
     239 [ +  - ][ +  + ]:        210 :       if (initpolicy.size() == neq.get< eq >() &&
     240         [ +  + ]:        105 :           initpolicy.back() == walker::ctr::InitPolicyType::JOINTDELTA) {
     241                 :            :         // Make sure there was an icdelta...end block with at least a single
     242                 :            :         // spike...end block
     243                 :            :         const auto& spike =
     244                 :          4 :           stack.template get< tag::param, eq, tag::init, tag::spike >();
     245 [ +  - ][ -  + ]:          4 :         if (!spike.empty() && spike.back().empty())
                 [ -  + ]
     246                 :          0 :           Message< Stack, ERROR, MsgKey::NODELTA >( stack, in );
     247                 :            :       }
     248                 :            :       // Error checks for joint beta initpolicy
     249 [ +  - ][ +  + ]:        210 :       if (initpolicy.size() == neq.get< eq >() &&
     250         [ +  + ]:        105 :           initpolicy.back() == walker::ctr::InitPolicyType::JOINTBETA) {
     251                 :            :         // Make sure there was an icbeta...end block with at least a single
     252                 :            :         // betapdf...end block
     253                 :            :         const auto& betapdf =
     254                 :          5 :           stack.template get< tag::param, eq, tag::init, tag::betapdf >();
     255 [ +  - ][ -  + ]:          5 :         if (!betapdf.empty() && betapdf.back().empty())
                 [ -  + ]
     256                 :          0 :           Message< Stack, ERROR, MsgKey::NOBETA >( stack, in );
     257                 :            :       }
     258                 :            :       // Error checks for joint gamma initpolicy
     259 [ +  - ][ +  + ]:        210 :       if (initpolicy.size() == neq.get< eq >() &&
     260         [ +  + ]:        105 :           initpolicy.back() == walker::ctr::InitPolicyType::JOINTGAMMA) {
     261                 :            :         // Make sure there was an icgamma...end block with at least a single
     262                 :            :         // gammapdf...end block
     263                 :            :         const auto& gammapdf =
     264                 :          6 :           stack.template get< tag::param, eq, tag::init, tag::gamma >();
     265 [ +  - ][ -  + ]:          6 :         if (!gammapdf.empty() && gammapdf.back().empty())
                 [ -  + ]
     266                 :          0 :           Message< Stack, ERROR, MsgKey::NOGAMMA >( stack, in );
     267                 :            :       }
     268                 :            :       // Error checks for joint correlated Gaussian initpolicy
     269 [ +  - ][ -  + ]:        210 :       if (initpolicy.size() == neq.get< eq >() &&
     270         [ -  + ]:        105 :           initpolicy.back() == walker::ctr::InitPolicyType::JOINTCORRGAUSSIAN) {
     271                 :            :         // Ensure there was a mean vector and covaraiance matrix configured
     272                 :            :         const auto& mean =
     273                 :          0 :           stack.template get< tag::param, eq, tag::init, tag::mean >();
     274 [ -  - ][ -  - ]:          0 :         if (mean.empty() || mean.back().empty())
                 [ -  - ]
     275                 :          0 :           Message< Stack, ERROR, MsgKey::NOMEAN >( stack, in );
     276                 :            :         const auto& cov =
     277                 :          0 :           stack.template get< tag::param, eq, tag::init, tag::cov >();
     278 [ -  - ][ -  - ]:          0 :         if (cov.empty() || cov.back().empty())
                 [ -  - ]
     279                 :          0 :           Message< Stack, ERROR, MsgKey::NOCOV >( stack, in );
     280                 :            :         // Ensure that an MKL RNG is configured if initpolicy is corr-Gaussian
     281                 :          0 :         const auto& rng = stack.template get< tag::param, eq, tag::rng >();
     282 [ -  - ][ -  - ]:          0 :         if (tk::ctr::RNG().lib( rng.back() ) != tk::ctr::RNGLibType::MKL)
     283                 :          0 :           Message< Stack, ERROR, MsgKey::NOMKLRNG >( stack, in );
     284                 :            :       }
     285                 :        105 :     }
     286                 :            :   };
     287                 :            : 
     288                 :            :   //! Setup coupling between two equations
     289                 :            :   //! \tparam eq Tag of equation to be coupled
     290                 :            :   //! \tparam coupledeq Tag of equation coupled to eq
     291                 :            :   //! \tparam id Tag to vector to hold (relative) system ids of DiffEqs
     292                 :            :   //!   coupled to eq among other DiffEqs of type coupledeq
     293                 :            :   //! \tparam depvar_msg Error message key to use on missing coupled depvar
     294                 :            :   //! \param[in] in Parser input
     295                 :            :   //! \param[in,out] stack Grammar stack to work with
     296                 :            :   //! \param[in] missing Error message key to use on missing coupled equation
     297                 :            :   //!   if the coupling is required. Pass MsgKey::OPTIONAL as missing if the
     298                 :            :   //!   coupling is optional.
     299                 :            :   //! \details This function computes and assigns the relative system id of a
     300                 :            :   //!   an equation coupled to another equation. The two equations being coupled
     301                 :            :   //!   are given by the two template arguments 'eq' and 'coupledeq'. The goal
     302                 :            :   //!   is to compute the id of the coupled eq that identifies it among
     303                 :            :   //!   potentially multiple coupled equations. Ths id is simply an integer
     304                 :            :   //!   which is a relative index, starting from zero, and uniquely identifies
     305                 :            :   //!   the equation system coupled to eq. As a result, when eq is instantiated,
     306                 :            :   //!   this id can be used to query any detail of the user configuration for
     307                 :            :   //!   the coupledeq equation coupled to eq.
     308                 :            :   //! \note This function is intended to be called at the very end of parsing,
     309                 :            :   //!   when all equation systems and their configuration have been parsed so
     310                 :            :   //!   the dependent variables, identifying equation systems, and the
     311                 :            :   //!   specifications of their coupling, via referring to dependent variables
     312                 :            :   //!   of equations coupled, have all been specified and thus known.
     313                 :            :   //! \note This function is intended to be called once per coupling an equation
     314                 :            :   //!   type (a system) to another equation (system). Example: if the velocity
     315                 :            :   //!   eqation is coupled to three other equation systems (say, position,
     316                 :            :   //!   dissipation, mixmassfracbeta, this function must be called three times
     317                 :            :   //!   with eq = velocity, and coupledeq = position, dissipation, and
     318                 :            :   //!   mixmassfracbeta so that the proper coupling information is setup for
     319                 :            :   //!   each of the three couplings.
     320                 :            :   template< typename eq, typename coupledeq, typename id, MsgKey depvar_msg,
     321                 :            :             typename Input, typename Stack >
     322                 :         43 :   static void couple( const Input& in, Stack& stack, MsgKey missing )
     323                 :            :   {
     324                 :            :     // get coupled eq configuration
     325                 :         43 :     const auto& ceq = stack.template get< tag::param, eq, coupledeq >();
     326                 :            :     // get dependent variables of coupled equation
     327                 :            :     const auto& coupled_depvar =
     328                 :         43 :       stack.template get< tag::param, coupledeq, tag::depvar >();
     329                 :            :     // get access to coupled eq relative id vector to be filled
     330                 :         43 :     auto& coupled_eq_id = stack.template get< tag::param, eq, id >();
     331                 :            : 
     332                 :            :     // Note that the size of depvar vector must equal the size of the coupledeq
     333                 :            :     // configuration vector, ceq. The depvar stores the dependent variables
     334                 :            :     // (characters) of all the eqs configured, e.g., potentially multiple eqs.
     335                 :            :     // The coupledeq config vector stores the dependent variables each eq is
     336                 :            :     // potentially coupled to. Thus the position/index in these two vectors are
     337                 :            :     // used to identify which system is being coupled to which other system. If
     338                 :            :     // ceq[i] = '-', then eq[i] is NOT coupled to ceq[i]. ceq must be filled
     339                 :            :     // after a particular equation system block is finished parsing by
     340                 :            :     // check_coupling, which does error checking but is supposed to fill in the
     341                 :            :     // coupledeq depvar. If there is no coupling, it must put in '-'.
     342 [ -  + ][ -  - ]:         43 :     Assert( ( ceq.size() ==
         [ -  - ][ -  - ]
     343                 :            :               stack.template get< tag::param, eq, tag::depvar >().size() ),
     344                 :            :             "Size mismatch" );
     345                 :            : 
     346                 :            :     // Find relative system ids for all coupledeqs coupled to eqs. Note that we
     347                 :            :     // loop through all ceqs (whose size equals to depvar, the number of eqs
     348                 :            :     // configured) and try to find all ceq depvars among the coupledeq depvars.
     349         [ +  + ]:         86 :     for (auto ev : ceq) {   // for all depvars coupled to eq
     350                 :         43 :       std::size_t c = 0;
     351         [ +  + ]:         67 :       for (auto cv : coupled_depvar) {  // for all depvars of a coupled eq
     352 [ +  - ][ +  - ]:         24 :         if (ev == cv) coupled_eq_id.push_back( c );
     353                 :         24 :         ++c;
     354                 :            :       }
     355                 :            :       // If eq is not coupled we put in a large number as a placeholder to
     356                 :            :       // keep the vector sizes of ceq and coupled_eq_id equal, this id
     357                 :            :       // will surely trigger a problem if ends up being used.
     358         [ +  + ]:         43 :       if (ev == '-')
     359         [ +  - ]:         19 :         coupled_eq_id.push_back( std::numeric_limits<std::size_t>::max() );
     360                 :            :     }
     361                 :            : 
     362                 :            :     // Ensure all coupled ids are filled.
     363 [ -  + ][ -  - ]:         43 :     Assert( ceq.size() == coupled_eq_id.size(), "Not all coupled eqs found" );
         [ -  - ][ -  - ]
     364                 :            : 
     365                 :            :     // Error out if the coupling is required and at least one of the
     366                 :            :     // potentially multiple eqs is not coupled. Since this function is called
     367                 :            :     // for potentially multiple eqs, ceq is a vector. If the coupling between eq
     368                 :            :     // and coupledeq is required, ceq should not contatain a '-'.
     369 [ +  + ][ -  + ]:         55 :     if ( missing != MsgKey::OPTIONAL &&
     370         [ -  + ]:         12 :          std::any_of( ceq.cbegin(), ceq.cend(),
     371                 :         12 :                       []( char v ){ return v == '-'; } ) )
     372                 :            :     {
     373                 :          0 :       Message< Stack, ERROR, depvar_msg >( stack, in );
     374                 :            :     }
     375                 :         43 :   }
     376                 :            : 
     377                 :            :   //! Query if equation 'eq' has been coupled to equation 'coupledeq'
     378                 :            :   //! \tparam eq Tag of the equation to query
     379                 :            :   //! \tparam coupledeq Tag of the equation that is potentially coupled to
     380                 :            :   //!   equation 'eq'
     381                 :            :   //! \param[in] stack Grammar stack to work with
     382                 :            :   //! \return True if equation 'eq' is coupled to equation 'coupledeq'
     383                 :            :   //! \note Always the eq system that is parsed last is interrogated.
     384                 :            :   template< typename eq, typename coupledeq, typename Stack >
     385                 :          0 :   static bool coupled( const Stack& stack ) {
     386                 :          0 :     return stack.template get< tag::param, eq, coupledeq >().back() != '-';
     387                 :            :   }
     388                 :            : 
     389                 :            :   //! Query number of components of coupled equation
     390                 :            :   //! \tparam eq Tag of the equation that is coupled
     391                 :            :   //! \tparam coupledeq Tag of the equation that is coupled to equation 'eq'
     392                 :            :   //! \tparam id Tag to access the coupled equation 'eq' (relative) ids, see
     393                 :            :   //!   tk::grm::couple.
     394                 :            :   //! \param[in] stack Grammar stack to work with
     395                 :            :   //! \return Number of scalar components of coupled equation
     396                 :            :   //! \note Always the eq system that is parsed last is interrogated.
     397                 :            :   template< typename eq, typename coupledeq, typename id, typename Stack >
     398                 :          0 :   static std::size_t ncomp_coupled( const Stack& stack ) {
     399 [ -  - ][ -  - ]:          0 :     Assert( (coupled< eq, coupledeq >( stack )), "Eq must be coupled" );
         [ -  - ][ -  - ]
     400                 :            :     // Query relative id of coupled eq
     401                 :          0 :     auto cid = stack.template get< tag::param, eq, id >().back();
     402                 :          0 :     return stack.template get< tag::component, coupledeq >().at( cid );
     403                 :            :   }
     404                 :            : 
     405                 :            :   //! Rule used to trigger action
     406                 :            :   struct check_velocity : pegtl::success {};
     407                 :            :   //! \brief Do error checking on the velocity eq block
     408                 :            :   template<>
     409                 :            :   struct action< check_velocity > {
     410                 :            :     template< typename Input, typename Stack >
     411                 :         93 :     static void apply( const Input& in, Stack& stack ) {
     412                 :            :       using walker::deck::neq;
     413                 :            :       // if there was a velocity eq block defined
     414         [ +  + ]:         93 :       if (neq.get< tag::velocity >() > 0) {
     415                 :            :         // Ensure a coupled position model is configured
     416                 :            :         couple< tag::velocity,
     417                 :            :             tag::position, tag::position_id, MsgKey::POSITION_DEPVAR >
     418                 :          7 :           ( in, stack, MsgKey::OPTIONAL );
     419                 :            :         // Compute equation id if a coupled dissipation model is configured
     420                 :            :         couple< tag::velocity,
     421                 :            :             tag::dissipation, tag::dissipation_id, MsgKey::DISSIPATION_DEPVAR >
     422                 :          7 :           ( in, stack, MsgKey::OPTIONAL );
     423                 :            :         // Compute equation id if a coupled mass fraction model is configured
     424                 :            :         couple< tag::velocity, tag::mixmassfracbeta, tag::mixmassfracbeta_id,
     425                 :            :                 MsgKey::MIXMASSFRACBETA_DEPVAR >
     426                 :          7 :           ( in, stack, MsgKey::OPTIONAL );
     427                 :            :         // Error out if no dependent variable to solve for was selected
     428                 :            :         const auto& solve =
     429                 :          7 :           stack.template get< tag::param, tag::velocity, tag::solve >();
     430         [ -  + ]:          7 :         if (solve.size() != neq.get< tag::velocity >())
     431                 :          0 :           Message< Stack, ERROR, MsgKey::NOSOLVE >( stack, in );
     432                 :            : 
     433                 :            :         // Increase number of components by the number of particle densities if
     434                 :            :         // we solve for particle momentum, coupled to mass fractions. This is
     435                 :            :         // to allocate storage for particle velocity as variables derived from
     436                 :            :         // momentum.
     437 [ +  - ][ -  + ]:         14 :         if ( !solve.empty() &&
     438         [ +  - ]:          7 :              ( solve.back() == walker::ctr::DepvarType::PRODUCT ||
     439         [ -  + ]:          7 :                solve.back() == walker::ctr::DepvarType::FLUCTUATING_MOMENTUM ) )
     440                 :            :         {
     441                 :            :           //! Error out if not coupled to mixmassfracbeta
     442         [ -  - ]:          0 :           if (!coupled< tag::velocity, tag::mixmassfracbeta >( stack )) {
     443                 :          0 :             Message< Stack, ERROR, MsgKey::MIXMASSFRACBETA_DEPVAR >(stack,in);
     444                 :            :           } else {
     445                 :            :             // access number of components of velocity eq just parsed
     446                 :          0 :             auto& ncomp = stack.template get< tag::component, tag::velocity >();
     447                 :            :             // query number of components of coupled mixmassfracbeta model
     448                 :            :             auto nc = ncomp_coupled< tag::velocity, tag::mixmassfracbeta,
     449                 :          0 :                                      tag::mixmassfracbeta_id >( stack );
     450                 :            :             // Augment storage of velocity equation, solving for momentum by
     451                 :            :             // the number of scalar components the coupled mixmassfracbeta mix
     452                 :            :             // model solves for. The magic number, 4, below is
     453                 :            :             // MixMassFractionBeta::NUMDERIVED + 1, and the 3 is the number of
     454                 :            :             // velocity components derived from momentum.
     455                 :          0 :             ncomp.back() += (nc/4)*3;
     456                 :            :           }
     457                 :            :         }
     458                 :            : 
     459                 :            :         // Set C0 = 2.1 if not specified
     460                 :          7 :         auto& C0 = stack.template get< tag::param, tag::velocity, tag::c0 >();
     461 [ +  - ][ +  - ]:          7 :         if (C0.size() != neq.get< tag::velocity >()) C0.push_back( 2.1 );
     462                 :            :         // Set SLM if not specified
     463                 :            :         auto& variant =
     464                 :          7 :           stack.template get< tag::param, tag::velocity, tag::variant >();
     465         [ +  + ]:          7 :         if (variant.size() != neq.get< tag::velocity >())
     466         [ +  - ]:          4 :           variant.push_back( walker::ctr::VelocityVariantType::SLM );
     467                 :            : 
     468                 :            :         // Set gravity to {0,0,0} if unspecified
     469                 :            :         auto& gravity =
     470                 :          7 :           stack.template get< tag::param, tag::velocity, tag::gravity >();
     471         [ +  - ]:          7 :         if (gravity.size() != neq.get< tag::velocity >())
     472 [ +  - ][ +  - ]:          7 :           gravity.push_back( { 0.0, 0.0, 0.0 } );
     473                 :            :       }
     474                 :         93 :     }
     475                 :            :   };
     476                 :            : 
     477                 :            :   //! Rule used to trigger action
     478                 :            :   struct check_position : pegtl::success {};
     479                 :            :   //! \brief Do error checking on the position eq block and compute coupling
     480                 :            :   template<>
     481                 :            :   struct action< check_position > {
     482                 :            :     template< typename Input, typename Stack >
     483                 :         93 :     static void apply( const Input& in, Stack& stack ) {
     484                 :            :       using walker::deck::neq;
     485                 :            :       // if there was a position eq block defined
     486         [ +  + ]:         93 :       if (neq.get< tag::position >() > 0) {
     487                 :            :         // Ensure a coupled velocity model is configured
     488                 :            :         couple< tag::position,
     489                 :            :             tag::velocity, tag::velocity_id, MsgKey::VELOCITY_DEPVAR >
     490                 :          6 :           ( in, stack, MsgKey::VELOCITY_MISSING );
     491                 :            :         // Error out if no dependent variable to solve for was selected
     492                 :            :         const auto& solve =
     493                 :          6 :           stack.template get< tag::param, tag::position, tag::solve >();
     494         [ -  + ]:          6 :         if (solve.size() != neq.get< tag::position >())
     495                 :          0 :           Message< Stack, ERROR, MsgKey::NOSOLVE >( stack, in );
     496                 :            :       }
     497                 :         93 :     }
     498                 :            :   };
     499                 :            : 
     500                 :            :   //! Rule used to trigger action
     501                 :            :   struct check_dissipation : pegtl::success {};
     502                 :            :   //! \brief Do error checking on the dissipation eq block and compute coupling
     503                 :            :   template<>
     504                 :            :   struct action< check_dissipation > {
     505                 :            :     template< typename Input, typename Stack >
     506                 :         93 :     static void apply( const Input& in, Stack& stack ) {
     507                 :            :       using walker::deck::neq;
     508                 :            :       using eq = tag::dissipation;
     509                 :            :       using param = tag::param;
     510                 :            :       // if there was a dissipation eq block defined
     511         [ +  + ]:         93 :       if (neq.get< eq >() > 0) {
     512                 :            :         // Ensure a coupled velocity model is configured
     513                 :            :         couple< eq, tag::velocity, tag::velocity_id,
     514                 :            :                 MsgKey::VELOCITY_DEPVAR >
     515                 :          6 :               ( in, stack, MsgKey::VELOCITY_MISSING );
     516                 :            :         // Set C3 if not specified
     517                 :          6 :         auto& C3 = stack.template get< param, eq, tag::c3 >();
     518 [ +  - ][ +  - ]:          6 :         if (C3.size() != neq.get< eq >()) C3.push_back( 1.0 );
     519                 :            :         // Set C4 if not specified
     520                 :          6 :         auto& C4 = stack.template get< param, eq, tag::c4 >();
     521 [ +  - ][ +  - ]:          6 :         if (C4.size() != neq.get< eq >()) C4.push_back( 0.25 );
     522                 :            :         // Set COM1 if not specified
     523                 :          6 :         auto& COM1 = stack.template get< param, eq, tag::com1 >();
     524 [ +  - ][ +  - ]:          6 :         if (COM1.size() != neq.get< eq >()) COM1.push_back( 0.44 );
     525                 :            :         // Set COM2 if not specified
     526                 :          6 :         auto& COM2 = stack.template get< param, eq, tag::com2 >();
     527 [ +  - ][ +  - ]:          6 :         if (COM2.size() != neq.get< eq >()) COM2.push_back( 0.9 );
     528                 :            :       }
     529                 :         93 :     }
     530                 :            :   };
     531                 :            : 
     532                 :            :   //! Rule used to trigger action
     533                 :            :   struct check_mixmassfracbeta : pegtl::success {};
     534                 :            :   //! \brief Do error checking on a mass fraction eq block
     535                 :            :   template<>
     536                 :            :   struct action< check_mixmassfracbeta > {
     537                 :            :     template< typename Input, typename Stack >
     538                 :         93 :     static void apply( const Input& in, Stack& stack ) {
     539                 :            :       using walker::deck::neq;
     540                 :            :       using eq = tag::mixmassfracbeta;
     541                 :            :       // Error out if no dependent variable to solve for was selected
     542                 :         93 :       const auto& solve = stack.template get< tag::param, eq, tag::solve >();
     543         [ -  + ]:         93 :       if (solve.size() != neq.get< eq >())
     544                 :          0 :         Message< Stack, ERROR, MsgKey::NOSOLVE >( stack, in );
     545                 :            :       // if there was a mixmassfracbeta eq block defined
     546         [ +  + ]:         93 :       if (neq.get< eq >() > 0) {
     547                 :            :         // Compute equation id if a coupled velocity model is configured
     548                 :            :         couple< eq, tag::velocity, tag::velocity_id,
     549                 :            :                 MsgKey::VELOCITY_DEPVAR >
     550                 :          5 :               ( in, stack, MsgKey::OPTIONAL );
     551                 :            :         // Compute equation id if a coupled dissipation model is configured
     552                 :            :         couple< eq, tag::dissipation, tag::dissipation_id,
     553                 :            :                 MsgKey::DISSIPATION_DEPVAR >
     554                 :          5 :               ( in, stack, MsgKey::OPTIONAL );
     555                 :            :       }
     556                 :         93 :     }
     557                 :            :   };
     558                 :            : 
     559                 :            :   //! Rule used to trigger action
     560                 :            :   struct check_mixdirichlet : pegtl::success {};
     561                 :            :   //! \brief Error checks for the mixdirichlet sde
     562                 :            :   template<>
     563                 :            :   struct action< check_mixdirichlet > {
     564                 :            :     template< typename Input, typename Stack >
     565                 :          8 :     static void apply( const Input& in, Stack& stack ) {
     566                 :            :       using eq = tag::mixdirichlet;
     567                 :            :       using walker::deck::neq;
     568                 :            : 
     569                 :            :       // Ensure correct size for parameter vector rho
     570                 :          8 :       auto& rho = stack.template get< tag::param, eq, tag::rho >().back();
     571                 :          8 :       auto ncomp = stack.template get< tag::component, eq >().back();
     572         [ -  + ]:          8 :       if (rho.size() != ncomp-2)
     573                 :          0 :         Message< Stack, ERROR, MsgKey::MIXDIR_RHO >( stack, in );
     574                 :            : 
     575                 :            :       // If normalization is not set, set default
     576                 :          8 :       auto& normv = stack.template get< tag::param, eq, tag::normalization >();
     577         [ -  + ]:          8 :       if (normv.size() != neq.get< eq >())
     578         [ -  - ]:          0 :         normv.push_back( walker::ctr::NormalizationType::LIGHT );
     579                 :            : 
     580                 :            :       // Sort parameter vector rho to correct order depending on normalization
     581         [ +  + ]:          8 :       if (normv.back() == walker::ctr::NormalizationType::HEAVY)
     582                 :          3 :         std::sort( rho.begin(), rho.end() );
     583                 :            :       else
     584                 :          5 :         std::sort( rho.begin(), rho.end(), std::greater< tk::real >() );
     585                 :          8 :     }
     586                 :            :   };
     587                 :            : 
     588                 :            :   //! Rule used to trigger action
     589                 :            :   template< typename eq, typename coupledeq >
     590                 :            :   struct check_coupling : pegtl::success {};
     591                 :            :   //! Put in coupled eq depvar as '-' if no coupling is given
     592                 :            :   template< typename eq, typename coupledeq >
     593                 :            :   struct action< check_coupling< eq, coupledeq > > {
     594                 :            :     template< typename Input, typename Stack >
     595                 :         43 :     static void apply( const Input&, Stack& stack ) {
     596                 :         43 :       auto& ceq = stack.template get< tag::param, eq, coupledeq >();
     597                 :         43 :       const auto& depvar = stack.template get< tag::param, eq, tag::depvar >();
     598                 :            :       // A depvar of '-' means no coupling. This keeps the coupled eq vector
     599                 :            :       // size the same as that of the depvar vector, so we keep track of which
     600                 :            :       // eq is coupled to which coupled eq (and also which eq is not coupled to
     601                 :            :       // any other eq).
     602 [ +  + ][ +  - ]:         43 :       if (depvar.size() > ceq.size()) ceq.push_back( '-' );
     603 [ -  + ][ -  - ]:         43 :       Assert( depvar.size() == ceq.size(), "Vector size mismatch" );
         [ -  - ][ -  - ]
     604                 :         43 :     }
     605                 :            :   };
     606                 :            : 
     607                 :            :   //! Rule used to trigger action
     608                 :            :   struct velocity_defaults : pegtl::success {};
     609                 :            :   //! \brief Set defaults for the velocity model
     610                 :            :   template<>
     611                 :            :   struct action< velocity_defaults > {
     612                 :            :     template< typename Input, typename Stack >
     613                 :          7 :     static void apply( const Input&, Stack& stack ) {
     614                 :            :       // Set number of components: always 3 velocity components
     615                 :          7 :       auto& ncomp = stack.template get< tag::component, tag::velocity >();
     616         [ +  - ]:          7 :       ncomp.push_back( 3 );
     617                 :          7 :     }
     618                 :            :   };
     619                 :            : 
     620                 :            :   //! Rule used to trigger action
     621                 :            :   struct position_defaults : pegtl::success {};
     622                 :            :   //! \brief Set defaults for all Lagrangian particle position models
     623                 :            :   template<>
     624                 :            :   struct action< position_defaults > {
     625                 :            :     template< typename Input, typename Stack >
     626                 :          6 :     static void apply( const Input&, Stack& stack ) {
     627                 :            :       // Set number of components: always 3 position components
     628                 :          6 :       auto& ncomp = stack.template get< tag::component, tag::position >();
     629         [ +  - ]:          6 :       ncomp.push_back( 3 );
     630                 :            :       // Set RNG if no RNG has been selected (not all position models use this,
     631                 :            :       // so don't impose on the user to define one). Pick a Random123 generator,
     632                 :            :       // as that is always available.
     633                 :            :       using walker::deck::neq;
     634                 :          6 :       auto& rngs = stack.template get< tag::selected, tag::rng >();
     635                 :          6 :       auto& rng = stack.template get< tag::param, tag::position, tag::rng >();
     636 [ -  + ][ -  - ]:          6 :       if (rng.empty() || rng.size() != neq.get< tag::position >()) {
                 [ +  - ]
     637                 :            :         // add RNG to the list of selected RNGs (as it has been parsed)
     638 [ +  - ][ +  - ]:          6 :         rngs.push_back( tk::ctr::RNG().value( kw::r123_philox::string() ) );
                 [ +  - ]
     639                 :            :         // select RNG for position equation (as it has been parsed)
     640         [ +  - ]:          6 :         rng.push_back( tk::ctr::RNGType::R123_PHILOX );
     641                 :            :       }
     642                 :          6 :     }
     643                 :            :   };
     644                 :            : 
     645                 :            :   //! Rule used to trigger action
     646                 :            :   struct dissipation_defaults : pegtl::success {};
     647                 :            :   //! \brief Set defaults for all Lagrangian particle dissipation models
     648                 :            :   template<>
     649                 :            :   struct action< dissipation_defaults > {
     650                 :            :     template< typename Input, typename Stack >
     651                 :          6 :     static void apply( const Input&, Stack& stack ) {
     652                 :            :       // Set number of components: always 1 dissipation component
     653                 :          6 :       auto& ncomp = stack.template get< tag::component, tag::dissipation >();
     654         [ +  - ]:          6 :       ncomp.push_back( 1 );
     655                 :          6 :     }
     656                 :            :   };
     657                 :            : 
     658                 :            : } // ::grm
     659                 :            : } // ::tk
     660                 :            : 
     661                 :            : namespace walker {
     662                 :            : 
     663                 :            : //! Walker input deck facilitating user input for integrating SDEs
     664                 :            : namespace deck {
     665                 :            : 
     666                 :            :   using namespace tao;
     667                 :            : 
     668                 :            :   // Walker's InputDeck grammar
     669                 :            : 
     670                 :            :   //! scan and store_back sde keyword and option
     671                 :            :   template< typename keyword, class eq >
     672                 :            :   struct scan_sde :
     673                 :            :          tk::grm::scan< typename keyword::pegtl_string,
     674                 :            :                         tk::grm::store_back_option< use,
     675                 :            :                                                     ctr::DiffEq,
     676                 :            :                                                     tag::selected,
     677                 :            :                                                     tag::diffeq >,
     678                 :            :                         // start new vector or vectors of spikes for a potential
     679                 :            :                         // jointdelta initpolicy
     680                 :            :                         tk::grm::start_vector< tag::param,
     681                 :            :                                                eq,
     682                 :            :                                                tag::init,
     683                 :            :                                                tag::spike >,
     684                 :            :                         // start new vector or vectors of beta parameters for a
     685                 :            :                         // potential jointbeta initpolicy
     686                 :            :                         tk::grm::start_vector< tag::param,
     687                 :            :                                                eq,
     688                 :            :                                                tag::init,
     689                 :            :                                                tag::betapdf >,
     690                 :            :                         // start new vector or vectors of gamma parameters for a
     691                 :            :                         // potential jointgamma initpolicy
     692                 :            :                         tk::grm::start_vector< tag::param,
     693                 :            :                                                eq,
     694                 :            :                                                tag::init,
     695                 :            :                                                tag::gamma >,
     696                 :            :                         // start new vector or vectors of gaussian parameters
     697                 :            :                         // for a potential jointgaussian initpolicy
     698                 :            :                         tk::grm::start_vector< tag::param,
     699                 :            :                                                eq,
     700                 :            :                                                tag::init,
     701                 :            :                                                tag::gaussian > > {};
     702                 :            : 
     703                 :            :   //! Discretization parameters
     704                 :            :   struct discretization_parameters :
     705                 :            :          pegtl::sor< tk::grm::discrparam< use, kw::npar, tag::npar >,
     706                 :            :                      tk::grm::discrparam< use, kw::nstep, tag::nstep >,
     707                 :            :                      tk::grm::discrparam< use, kw::term, tag::term >,
     708                 :            :                      tk::grm::discrparam< use, kw::dt, tag::dt >,
     709                 :            :                      tk::grm::interval_iter< use< kw::ttyi >,
     710                 :            :                        tag::output, tag::iter, tag::tty >,
     711                 :            :                      tk::grm::interval_iter< use< kw::pari >,
     712                 :            :                        tag::output, tag::iter, tag::particles >
     713                 :            :                    > {};
     714                 :            : 
     715                 :            :   //! rngs
     716                 :            :   struct rngs :
     717                 :            :          pegtl::sor<
     718                 :            :                      #ifdef HAS_MKL
     719                 :            :                      tk::mkl::rngs< use,
     720                 :            :                                     tag::selected, tag::rng,
     721                 :            :                                     tag::param, tag::rngmkl >,
     722                 :            :                      #endif
     723                 :            :                      #ifdef HAS_RNGSSE2
     724                 :            :                      tk::rngsse::rngs< use,
     725                 :            :                                        tag::selected, tag::rng,
     726                 :            :                                        tag::param, tag::rngsse >,
     727                 :            :                      #endif
     728                 :            :                      tk::random123::rngs< use,
     729                 :            :                                           tag::selected, tag::rng,
     730                 :            :                                           tag::param, tag::rng123 > > {};
     731                 :            : 
     732                 :            :   //! SDE parameter vector
     733                 :            :   template< class keyword,
     734                 :            :             template< class, class, class... > class check_vector,
     735                 :            :             class eq, class param, class... xparams >
     736                 :            :   struct sde_parameter_vector :
     737                 :            :          tk::grm::parameter_vector< use,
     738                 :            :                                     use< keyword >,
     739                 :            :                                     tk::grm::Store_back_back,
     740                 :            :                                     tk::grm::start_vector,
     741                 :            :                                     check_vector,
     742                 :            :                                     eq,
     743                 :            :                                     param,
     744                 :            :                                     xparams... > {};
     745                 :            : 
     746                 :            :   //! scan icdelta ... end block
     747                 :            :   template< class eq >
     748                 :            :   struct icdelta :
     749                 :            :          pegtl::if_must<
     750                 :            :            tk::grm::readkw< use< kw::icdelta >::pegtl_string >,
     751                 :            :            // parse a spike ... end block (there can be multiple)
     752                 :            :            tk::grm::block< use< kw::end >,
     753                 :            :                            tk::grm::parameter_vector<
     754                 :            :                              use,
     755                 :            :                              use< kw::spike >,
     756                 :            :                              tk::grm::Store_back_back_back,
     757                 :            :                              tk::grm::start_vector_back,
     758                 :            :                              tk::grm::check_spikes,
     759                 :            :                              eq,
     760                 :            :                              tag::init,
     761                 :            :                              tag::spike > > > {};
     762                 :            : 
     763                 :            :   //! scan icbeta ... end block
     764                 :            :   template< class eq >
     765                 :            :   struct icbeta :
     766                 :            :          pegtl::if_must<
     767                 :            :            tk::grm::readkw< use< kw::icbeta >::pegtl_string >,
     768                 :            :            // parse a betapdf ... end block (there can be multiple)
     769                 :            :            tk::grm::block< use< kw::end >,
     770                 :            :                            tk::grm::parameter_vector<
     771                 :            :                              use,
     772                 :            :                              use< kw::betapdf >,
     773                 :            :                              tk::grm::Store_back_back_back,
     774                 :            :                              tk::grm::start_vector_back,
     775                 :            :                              tk::grm::check_betapdfs,
     776                 :            :                              eq,
     777                 :            :                              tag::init,
     778                 :            :                              tag::betapdf > > > {};
     779                 :            : 
     780                 :            :   //! scan icgamma ... end block
     781                 :            :   template< class eq >
     782                 :            :   struct icgamma :
     783                 :            :          pegtl::if_must<
     784                 :            :            tk::grm::readkw< use< kw::icgamma >::pegtl_string >,
     785                 :            :            // parse a gammapdf ... end block (there can be multiple)
     786                 :            :            tk::grm::block< use< kw::end >,
     787                 :            :                            tk::grm::parameter_vector<
     788                 :            :                              use,
     789                 :            :                              use< kw::gammapdf >,
     790                 :            :                              tk::grm::Store_back_back_back,
     791                 :            :                              tk::grm::start_vector_back,
     792                 :            :                              tk::grm::check_gammapdfs,
     793                 :            :                              eq,
     794                 :            :                              tag::init,
     795                 :            :                              tag::gamma > > > {};
     796                 :            : 
     797                 :            :   //! scan icdirichlet ... end block
     798                 :            :   template< class eq >
     799                 :            :   struct icdirichlet :
     800                 :            :          pegtl::if_must<
     801                 :            :            tk::grm::readkw< use< kw::icdirichlet >::pegtl_string >,
     802                 :            :            // parse a dirichletpdf ... end block (there can be multiple)
     803                 :            :            tk::grm::block<
     804                 :            :              use< kw::end >,
     805                 :            :              sde_parameter_vector< kw::dirichletpdf,
     806                 :            :                                    tk::grm::check_dirichletpdf,
     807                 :            :                                    eq,
     808                 :            :                                    tag::init,
     809                 :            :                                    tag::dirichlet > > > {};
     810                 :            : 
     811                 :            :   //! scan icgaussian ... end block
     812                 :            :   template< class eq >
     813                 :            :   struct icgaussian :
     814                 :            :          pegtl::if_must<
     815                 :            :            tk::grm::readkw< use< kw::icgaussian >::pegtl_string >,
     816                 :            :            // parse a gaussian ... end block (there can be multiple)
     817                 :            :            tk::grm::block< use< kw::end >,
     818                 :            :                            tk::grm::parameter_vector<
     819                 :            :                              use,
     820                 :            :                              use< kw::gaussian >,
     821                 :            :                              tk::grm::Store_back_back_back,
     822                 :            :                              tk::grm::start_vector_back,
     823                 :            :                              tk::grm::check_gaussians,
     824                 :            :                              eq,
     825                 :            :                              tag::init,
     826                 :            :                              tag::gaussian > > > {};
     827                 :            : 
     828                 :            :   //! scan icjointgaussian ... end block
     829                 :            :   template< class eq >
     830                 :            :   struct icjointgaussian :
     831                 :            :          pegtl::if_must<
     832                 :            :            tk::grm::readkw< use< kw::icjointgaussian >::pegtl_string >,
     833                 :            :            // parse a jointgaussian ... end block
     834                 :            :            tk::grm::block< use< kw::end >,
     835                 :            :                            sde_parameter_vector< kw::sde_mean,
     836                 :            :                                                  tk::grm::check_vector,
     837                 :            :                                                  eq,
     838                 :            :                                                  tag::init,
     839                 :            :                                                  tag::mean >,
     840                 :            :                            sde_parameter_vector< kw::sde_cov,
     841                 :            :                                                  tk::grm::check_vector,
     842                 :            :                                                  eq,
     843                 :            :                                                  tag::init,
     844                 :            :                                                  tag::cov > > > {};
     845                 :            : 
     846                 :            :   //! Error checks after an equation ... end block has been parsed
     847                 :            :   template< class eq, class... extra_checks  >
     848                 :            :   struct check_errors :
     849                 :            :          pegtl::seq<
     850                 :            :            // register differential equation block
     851                 :            :            tk::grm::register_eq< eq >,
     852                 :            :            // performe extra pegtl actions, e.g., performing extra checks
     853                 :            :            extra_checks...,
     854                 :            :            // do error checking on this block
     855                 :            :            tk::grm::check_eq< eq >,
     856                 :            :            // do error checking on the init policy
     857                 :            :            tk::grm::check_init< eq > > {};
     858                 :            : 
     859                 :            :   //! SDE option vector
     860                 :            :   template< class Option, class keyword, class eq, class param,
     861                 :            :             template< class, class > class check >
     862                 :            :   struct sde_option_vector :
     863                 :            :          tk::grm::option_vector< use,
     864                 :            :                                  use< keyword >,
     865                 :            :                                  Option,
     866                 :            :                                  tk::grm::Store_back_back,
     867                 :            :                                  tk::grm::start_vector,
     868                 :            :                                  check,
     869                 :            :                                  eq,
     870                 :            :                                  param > {};
     871                 :            : 
     872                 :            :   //! Diagonal Ornstein-Uhlenbeck SDE
     873                 :            :   struct diag_ou :
     874                 :            :          pegtl::if_must<
     875                 :            :            scan_sde< use< kw::diag_ou >, tag::diagou >,
     876                 :            :            tk::grm::block< use< kw::end >,
     877                 :            :                            tk::grm::depvar< use,
     878                 :            :                                             tag::diagou,
     879                 :            :                                             tag::depvar >,
     880                 :            :                            tk::grm::component< use< kw::ncomp >,
     881                 :            :                                                tag::diagou >,
     882                 :            :                            tk::grm::rng< use,
     883                 :            :                                          use< kw::rng >,
     884                 :            :                                          tk::ctr::RNG,
     885                 :            :                                          tag::diagou,
     886                 :            :                                          tag::rng >,
     887                 :            :                            tk::grm::policy< use,
     888                 :            :                                             use< kw::init >,
     889                 :            :                                             ctr::InitPolicy,
     890                 :            :                                             tag::diagou,
     891                 :            :                                             tag::initpolicy >,
     892                 :            :                            tk::grm::policy< use,
     893                 :            :                                             use< kw::coeff >,
     894                 :            :                                             ctr::CoeffPolicy,
     895                 :            :                                             tag::diagou,
     896                 :            :                                             tag::coeffpolicy >,
     897                 :            :                            icdelta< tag::diagou >,
     898                 :            :                            icbeta< tag::diagou >,
     899                 :            :                            icgamma< tag::diagou >,
     900                 :            :                            icgaussian< tag::diagou >,
     901                 :            :                            icjointgaussian< tag::diagou >,
     902                 :            :                            sde_parameter_vector< kw::sde_sigmasq,
     903                 :            :                                                  tk::grm::check_vector,
     904                 :            :                                                  tag::diagou,
     905                 :            :                                                  tag::sigmasq >,
     906                 :            :                            sde_parameter_vector< kw::sde_theta,
     907                 :            :                                                  tk::grm::check_vector,
     908                 :            :                                                  tag::diagou,
     909                 :            :                                                  tag::theta >,
     910                 :            :                            sde_parameter_vector< kw::sde_mu,
     911                 :            :                                                  tk::grm::check_vector,
     912                 :            :                                                  tag::diagou,
     913                 :            :                                                  tag::mu > >,
     914                 :            :            check_errors< tag::diagou > > {};
     915                 :            : 
     916                 :            :   //! Ornstein-Uhlenbeck SDE
     917                 :            :   struct ornstein_uhlenbeck :
     918                 :            :          pegtl::if_must<
     919                 :            :            scan_sde< use< kw::ornstein_uhlenbeck >, tag::ou >,
     920                 :            :            tk::grm::block< use< kw::end >,
     921                 :            :                            tk::grm::depvar< use,
     922                 :            :                                             tag::ou,
     923                 :            :                                             tag::depvar >,
     924                 :            :                            tk::grm::component< use< kw::ncomp >,
     925                 :            :                                                tag::ou >,
     926                 :            :                            tk::grm::rng< use,
     927                 :            :                                          use< kw::rng >,
     928                 :            :                                          tk::ctr::RNG,
     929                 :            :                                          tag::ou,
     930                 :            :                                          tag::rng >,
     931                 :            :                            tk::grm::policy< use,
     932                 :            :                                             use< kw::init >,
     933                 :            :                                             ctr::InitPolicy,
     934                 :            :                                             tag::ou,
     935                 :            :                                             tag::initpolicy >,
     936                 :            :                            tk::grm::policy< use,
     937                 :            :                                             use< kw::coeff >,
     938                 :            :                                             ctr::CoeffPolicy,
     939                 :            :                                             tag::ou,
     940                 :            :                                             tag::coeffpolicy >,
     941                 :            :                            icdelta< tag::ou >,
     942                 :            :                            icbeta< tag::ou >,
     943                 :            :                            icgamma< tag::ou >,
     944                 :            :                            icgaussian< tag::ou >,
     945                 :            :                            icjointgaussian< tag::ou >,
     946                 :            :                            sde_parameter_vector< kw::sde_sigmasq,
     947                 :            :                                                  tk::grm::check_vector,
     948                 :            :                                                  tag::ou,
     949                 :            :                                                  tag::sigmasq >,
     950                 :            :                            sde_parameter_vector< kw::sde_theta,
     951                 :            :                                                  tk::grm::check_vector,
     952                 :            :                                                  tag::ou,
     953                 :            :                                                  tag::theta >,
     954                 :            :                            sde_parameter_vector< kw::sde_mu,
     955                 :            :                                                  tk::grm::check_vector,
     956                 :            :                                                  tag::ou,
     957                 :            :                                                  tag::mu > >,
     958                 :            :            check_errors< tag::ou > > {};
     959                 :            : 
     960                 :            :   //! Skew-normal SDE
     961                 :            :   struct skewnormal :
     962                 :            :          pegtl::if_must<
     963                 :            :            scan_sde< use< kw::skewnormal >, tag::skewnormal >,
     964                 :            :            tk::grm::block< use< kw::end >,
     965                 :            :                            tk::grm::depvar< use,
     966                 :            :                                             tag::skewnormal,
     967                 :            :                                             tag::depvar >,
     968                 :            :                            tk::grm::component< use< kw::ncomp >,
     969                 :            :                                                tag::skewnormal >,
     970                 :            :                            tk::grm::rng< use,
     971                 :            :                                          use< kw::rng >,
     972                 :            :                                          tk::ctr::RNG,
     973                 :            :                                          tag::skewnormal,
     974                 :            :                                          tag::rng >,
     975                 :            :                            tk::grm::policy< use,
     976                 :            :                                             use< kw::init >,
     977                 :            :                                             ctr::InitPolicy,
     978                 :            :                                             tag::skewnormal,
     979                 :            :                                             tag::initpolicy >,
     980                 :            :                            tk::grm::policy< use,
     981                 :            :                                             use< kw::coeff >,
     982                 :            :                                             ctr::CoeffPolicy,
     983                 :            :                                             tag::skewnormal,
     984                 :            :                                             tag::coeffpolicy >,
     985                 :            :                            icdelta< tag::skewnormal >,
     986                 :            :                            icbeta< tag::skewnormal >,
     987                 :            :                            icgamma< tag::skewnormal >,
     988                 :            :                            icgaussian< tag::skewnormal >,
     989                 :            :                            icjointgaussian< tag::skewnormal >,
     990                 :            :                            sde_parameter_vector< kw::sde_T,
     991                 :            :                                                  tk::grm::check_vector,
     992                 :            :                                                  tag::skewnormal,
     993                 :            :                                                  tag::timescale >,
     994                 :            :                            sde_parameter_vector< kw::sde_sigmasq,
     995                 :            :                                                  tk::grm::check_vector,
     996                 :            :                                                  tag::skewnormal,
     997                 :            :                                                  tag::sigmasq >,
     998                 :            :                            sde_parameter_vector< kw::sde_lambda,
     999                 :            :                                                  tk::grm::check_vector,
    1000                 :            :                                                  tag::skewnormal,
    1001                 :            :                                                  tag::lambda > >,
    1002                 :            :            check_errors< tag::skewnormal > > {};
    1003                 :            : 
    1004                 :            :   //! Beta SDE
    1005                 :            :   struct beta :
    1006                 :            :          pegtl::if_must<
    1007                 :            :            scan_sde< use< kw::beta >, tag::beta >,
    1008                 :            :            tk::grm::block< use< kw::end >,
    1009                 :            :                            tk::grm::depvar< use,
    1010                 :            :                                             tag::beta,
    1011                 :            :                                             tag::depvar >,
    1012                 :            :                            tk::grm::component< use< kw::ncomp >,
    1013                 :            :                                                tag::beta >,
    1014                 :            :                            tk::grm::rng< use,
    1015                 :            :                                          use< kw::rng >,
    1016                 :            :                                          tk::ctr::RNG,
    1017                 :            :                                          tag::beta,
    1018                 :            :                                          tag::rng >,
    1019                 :            :                            tk::grm::policy< use,
    1020                 :            :                                             use< kw::init >,
    1021                 :            :                                             ctr::InitPolicy,
    1022                 :            :                                             tag::beta,
    1023                 :            :                                             tag::initpolicy >,
    1024                 :            :                            tk::grm::policy< use,
    1025                 :            :                                             use< kw::coeff >,
    1026                 :            :                                             ctr::CoeffPolicy,
    1027                 :            :                                             tag::beta,
    1028                 :            :                                             tag::coeffpolicy >,
    1029                 :            :                            icdelta< tag::beta >,
    1030                 :            :                            icbeta< tag::beta >,
    1031                 :            :                            icgamma< tag::beta >,
    1032                 :            :                            icgaussian< tag::beta >,
    1033                 :            :                            icjointgaussian< tag::beta >,
    1034                 :            :                            sde_parameter_vector< kw::sde_b,
    1035                 :            :                                                  tk::grm::check_vector,
    1036                 :            :                                                  tag::beta,
    1037                 :            :                                                  tag::b >,
    1038                 :            :                            sde_parameter_vector< kw::sde_S,
    1039                 :            :                                                  tk::grm::check_vector,
    1040                 :            :                                                  tag::beta,
    1041                 :            :                                                  tag::S >,
    1042                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1043                 :            :                                                  tk::grm::check_vector,
    1044                 :            :                                                  tag::beta,
    1045                 :            :                                                  tag::kappa > >,
    1046                 :            :            check_errors< tag::beta > > {};
    1047                 :            : 
    1048                 :            :   //! Number-fraction beta SDE
    1049                 :            :   struct numfracbeta :
    1050                 :            :          pegtl::if_must<
    1051                 :            :            scan_sde< use< kw::numfracbeta >, tag::numfracbeta >,
    1052                 :            :            tk::grm::block< use< kw::end >,
    1053                 :            :                            tk::grm::depvar< use,
    1054                 :            :                                             tag::numfracbeta,
    1055                 :            :                                             tag::depvar >,
    1056                 :            :                            tk::grm::component< use< kw::ncomp >,
    1057                 :            :                                                tag::numfracbeta >,
    1058                 :            :                            tk::grm::rng< use,
    1059                 :            :                                          use< kw::rng >,
    1060                 :            :                                          tk::ctr::RNG,
    1061                 :            :                                          tag::numfracbeta,
    1062                 :            :                                          tag::rng >,
    1063                 :            :                            tk::grm::policy< use,
    1064                 :            :                                             use< kw::init >,
    1065                 :            :                                             ctr::InitPolicy,
    1066                 :            :                                             tag::numfracbeta,
    1067                 :            :                                             tag::initpolicy >,
    1068                 :            :                            tk::grm::policy< use,
    1069                 :            :                                             use< kw::coeff >,
    1070                 :            :                                             ctr::CoeffPolicy,
    1071                 :            :                                             tag::numfracbeta,
    1072                 :            :                                             tag::coeffpolicy >,
    1073                 :            :                            icdelta< tag::numfracbeta >,
    1074                 :            :                            icbeta< tag::numfracbeta >,
    1075                 :            :                            icgamma< tag::numfracbeta >,
    1076                 :            :                            icgaussian< tag::numfracbeta >,
    1077                 :            :                            icjointgaussian< tag::numfracbeta >,
    1078                 :            :                            sde_parameter_vector< kw::sde_b,
    1079                 :            :                                                  tk::grm::check_vector,
    1080                 :            :                                                  tag::numfracbeta,
    1081                 :            :                                                  tag::b >,
    1082                 :            :                            sde_parameter_vector< kw::sde_S,
    1083                 :            :                                                  tk::grm::check_vector,
    1084                 :            :                                                  tag::numfracbeta,
    1085                 :            :                                                  tag::S >,
    1086                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1087                 :            :                                                  tk::grm::check_vector,
    1088                 :            :                                                  tag::numfracbeta,
    1089                 :            :                                                  tag::kappa >,
    1090                 :            :                            sde_parameter_vector< kw::sde_rho2,
    1091                 :            :                                                  tk::grm::check_vector,
    1092                 :            :                                                  tag::numfracbeta,
    1093                 :            :                                                  tag::rho2 >,
    1094                 :            :                            sde_parameter_vector< kw::sde_rcomma,
    1095                 :            :                                                  tk::grm::check_vector,
    1096                 :            :                                                  tag::numfracbeta,
    1097                 :            :                                                  tag::rcomma > >,
    1098                 :            :            check_errors< tag::numfracbeta > > {};
    1099                 :            : 
    1100                 :            :   //! Mass-fraction beta SDE
    1101                 :            :   struct massfracbeta :
    1102                 :            :          pegtl::if_must<
    1103                 :            :            scan_sde< use< kw::massfracbeta >, tag::massfracbeta >,
    1104                 :            :            tk::grm::block< use< kw::end >,
    1105                 :            :                            tk::grm::depvar< use,
    1106                 :            :                                             tag::massfracbeta,
    1107                 :            :                                             tag::depvar >,
    1108                 :            :                            tk::grm::component< use< kw::ncomp >,
    1109                 :            :                                                tag::massfracbeta >,
    1110                 :            :                            tk::grm::rng< use,
    1111                 :            :                                          use< kw::rng >,
    1112                 :            :                                          tk::ctr::RNG,
    1113                 :            :                                          tag::massfracbeta,
    1114                 :            :                                          tag::rng >,
    1115                 :            :                            tk::grm::policy< use,
    1116                 :            :                                             use< kw::init >,
    1117                 :            :                                             ctr::InitPolicy,
    1118                 :            :                                             tag::massfracbeta,
    1119                 :            :                                             tag::initpolicy >,
    1120                 :            :                            tk::grm::policy< use,
    1121                 :            :                                             use< kw::coeff >,
    1122                 :            :                                             ctr::CoeffPolicy,
    1123                 :            :                                             tag::massfracbeta,
    1124                 :            :                                             tag::coeffpolicy >,
    1125                 :            :                            icdelta< tag::massfracbeta >,
    1126                 :            :                            icbeta< tag::massfracbeta >,
    1127                 :            :                            icgamma< tag::massfracbeta >,
    1128                 :            :                            icgaussian< tag::massfracbeta >,
    1129                 :            :                            icjointgaussian< tag::massfracbeta >,
    1130                 :            :                            sde_parameter_vector< kw::sde_b,
    1131                 :            :                                                  tk::grm::check_vector,
    1132                 :            :                                                  tag::massfracbeta,
    1133                 :            :                                                  tag::b >,
    1134                 :            :                            sde_parameter_vector< kw::sde_S,
    1135                 :            :                                                  tk::grm::check_vector,
    1136                 :            :                                                  tag::massfracbeta,
    1137                 :            :                                                  tag::S >,
    1138                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1139                 :            :                                                  tk::grm::check_vector,
    1140                 :            :                                                  tag::massfracbeta,
    1141                 :            :                                                  tag::kappa >,
    1142                 :            :                            sde_parameter_vector< kw::sde_rho2,
    1143                 :            :                                                  tk::grm::check_vector,
    1144                 :            :                                                  tag::massfracbeta,
    1145                 :            :                                                  tag::rho2 >,
    1146                 :            :                            sde_parameter_vector< kw::sde_r,
    1147                 :            :                                                  tk::grm::check_vector,
    1148                 :            :                                                  tag::massfracbeta,
    1149                 :            :                                                  tag::r > >,
    1150                 :            :            check_errors< tag::massfracbeta > > {};
    1151                 :            : 
    1152                 :            :   //! Mix number-fraction beta SDE
    1153                 :            :   struct mixnumfracbeta :
    1154                 :            :          pegtl::if_must<
    1155                 :            :            scan_sde< use< kw::mixnumfracbeta >, tag::mixnumfracbeta >,
    1156                 :            :            tk::grm::block< use< kw::end >,
    1157                 :            :                            tk::grm::depvar< use,
    1158                 :            :                                             tag::mixnumfracbeta,
    1159                 :            :                                             tag::depvar >,
    1160                 :            :                            tk::grm::component< use< kw::ncomp >,
    1161                 :            :                                                tag::mixnumfracbeta >,
    1162                 :            :                            tk::grm::rng< use,
    1163                 :            :                                          use< kw::rng >,
    1164                 :            :                                          tk::ctr::RNG,
    1165                 :            :                                          tag::mixnumfracbeta,
    1166                 :            :                                          tag::rng >,
    1167                 :            :                            tk::grm::policy< use,
    1168                 :            :                                             use< kw::init >,
    1169                 :            :                                             ctr::InitPolicy,
    1170                 :            :                                             tag::mixnumfracbeta,
    1171                 :            :                                             tag::initpolicy >,
    1172                 :            :                            tk::grm::policy< use,
    1173                 :            :                                             use< kw::coeff >,
    1174                 :            :                                             ctr::CoeffPolicy,
    1175                 :            :                                             tag::mixnumfracbeta,
    1176                 :            :                                             tag::coeffpolicy >,
    1177                 :            :                            icdelta< tag::mixnumfracbeta >,
    1178                 :            :                            icbeta< tag::mixnumfracbeta >,
    1179                 :            :                            icgamma< tag::mixnumfracbeta >,
    1180                 :            :                            icgaussian< tag::mixnumfracbeta >,
    1181                 :            :                            icjointgaussian< tag::mixnumfracbeta >,
    1182                 :            :                            sde_parameter_vector< kw::sde_bprime,
    1183                 :            :                                                  tk::grm::check_vector,
    1184                 :            :                                                  tag::mixnumfracbeta,
    1185                 :            :                                                  tag::bprime >,
    1186                 :            :                            sde_parameter_vector< kw::sde_S,
    1187                 :            :                                                  tk::grm::check_vector,
    1188                 :            :                                                  tag::mixnumfracbeta,
    1189                 :            :                                                  tag::S >,
    1190                 :            :                            sde_parameter_vector< kw::sde_kappaprime,
    1191                 :            :                                                  tk::grm::check_vector,
    1192                 :            :                                                  tag::mixnumfracbeta,
    1193                 :            :                                                  tag::kappaprime >,
    1194                 :            :                            sde_parameter_vector< kw::sde_rho2,
    1195                 :            :                                                  tk::grm::check_vector,
    1196                 :            :                                                  tag::mixnumfracbeta,
    1197                 :            :                                                  tag::rho2 >,
    1198                 :            :                            sde_parameter_vector< kw::sde_rcomma,
    1199                 :            :                                                  tk::grm::check_vector,
    1200                 :            :                                                  tag::mixnumfracbeta,
    1201                 :            :                                                  tag::rcomma > >,
    1202                 :            :            check_errors< tag::mixnumfracbeta > > {};
    1203                 :            : 
    1204                 :            :   //! Mix mass-fraction beta SDE
    1205                 :            :   struct mixmassfracbeta :
    1206                 :            :          pegtl::if_must<
    1207                 :            :            scan_sde< use< kw::mixmassfracbeta >, tag::mixmassfracbeta >,
    1208                 :            :            tk::grm::block< use< kw::end >,
    1209                 :            :                            tk::grm::depvar< use,
    1210                 :            :                                             tag::mixmassfracbeta,
    1211                 :            :                                             tag::depvar >,
    1212                 :            :                            tk::grm::component< use< kw::ncomp >,
    1213                 :            :                                                tag::mixmassfracbeta >,
    1214                 :            :                            tk::grm::rng< use,
    1215                 :            :                                          use< kw::rng >,
    1216                 :            :                                          tk::ctr::RNG,
    1217                 :            :                                          tag::mixmassfracbeta,
    1218                 :            :                                          tag::rng >,
    1219                 :            :                            tk::grm::policy< use,
    1220                 :            :                                             use< kw::init >,
    1221                 :            :                                             ctr::InitPolicy,
    1222                 :            :                                             tag::mixmassfracbeta,
    1223                 :            :                                             tag::initpolicy >,
    1224                 :            :                            tk::grm::policy< use,
    1225                 :            :                                             use< kw::coeff >,
    1226                 :            :                                             ctr::CoeffPolicy,
    1227                 :            :                                             tag::mixmassfracbeta,
    1228                 :            :                                             tag::coeffpolicy >,
    1229                 :            :                            tk::grm::policy< use,
    1230                 :            :                                             use< kw::solve >,
    1231                 :            :                                             ctr::Depvar,
    1232                 :            :                                             tag::mixmassfracbeta,
    1233                 :            :                                             tag::solve >,
    1234                 :            :                            icdelta< tag::mixmassfracbeta >,
    1235                 :            :                            icbeta< tag::mixmassfracbeta >,
    1236                 :            :                            icgamma< tag::mixmassfracbeta >,
    1237                 :            :                            icgaussian< tag::mixmassfracbeta >,
    1238                 :            :                            icjointgaussian< tag::mixmassfracbeta >,
    1239                 :            :                            sde_option_vector< ctr::HydroTimeScales,
    1240                 :            :                                               kw::hydrotimescales,
    1241                 :            :                                               tag::mixmassfracbeta,
    1242                 :            :                                               tag::hydrotimescales,
    1243                 :            :                                               tk::grm::check_vector_size >,
    1244                 :            :                            sde_option_vector< ctr::HydroProductions,
    1245                 :            :                                               kw::hydroproductions,
    1246                 :            :                                               tag::mixmassfracbeta,
    1247                 :            :                                               tag::hydroproductions,
    1248                 :            :                                               tk::grm::check_vector_size >,
    1249                 :            :                            sde_parameter_vector< kw::sde_bprime,
    1250                 :            :                                                  tk::grm::check_vector,
    1251                 :            :                                                  tag::mixmassfracbeta,
    1252                 :            :                                                  tag::bprime >,
    1253                 :            :                            sde_parameter_vector< kw::sde_S,
    1254                 :            :                                                  tk::grm::check_vector,
    1255                 :            :                                                  tag::mixmassfracbeta,
    1256                 :            :                                                  tag::S >,
    1257                 :            :                            sde_parameter_vector< kw::sde_kappaprime,
    1258                 :            :                                                  tk::grm::check_vector,
    1259                 :            :                                                  tag::mixmassfracbeta,
    1260                 :            :                                                  tag::kappaprime >,
    1261                 :            :                            sde_parameter_vector< kw::sde_rho2,
    1262                 :            :                                                  tk::grm::check_vector,
    1263                 :            :                                                  tag::mixmassfracbeta,
    1264                 :            :                                                  tag::rho2 >,
    1265                 :            :                            sde_parameter_vector< kw::sde_r,
    1266                 :            :                                                  tk::grm::check_vector,
    1267                 :            :                                                  tag::mixmassfracbeta,
    1268                 :            :                                                  tag::r >,
    1269                 :            :                            sde_parameter_vector< kw::mean_gradient,
    1270                 :            :                                                  tk::grm::check_mean_gradient,
    1271                 :            :                                                  tag::mixmassfracbeta,
    1272                 :            :                                                  tag::mean_gradient >,
    1273                 :            :                            tk::grm::process<
    1274                 :            :                              use< kw::velocitysde >,
    1275                 :            :                              tk::grm::Store_back< tag::param,
    1276                 :            :                                                   tag::mixmassfracbeta,
    1277                 :            :                                                   tag::velocity >,
    1278                 :            :                              pegtl::alpha >,
    1279                 :            :                            tk::grm::process<
    1280                 :            :                              use< kw::dissipation >,
    1281                 :            :                              tk::grm::Store_back< tag::param,
    1282                 :            :                                                   tag::mixmassfracbeta,
    1283                 :            :                                                   tag::dissipation >,
    1284                 :            :                              pegtl::alpha > >,
    1285                 :            :            check_errors< tag::mixmassfracbeta,
    1286                 :            :                          tk::grm::check_vector_exists<
    1287                 :            :                            tag::mixmassfracbeta,
    1288                 :            :                            tag::hydrotimescales,
    1289                 :            :                            tk::grm::MsgKey::HYDROTIMESCALES >,
    1290                 :            :                          tk::grm::check_vector_exists<
    1291                 :            :                            tag::mixmassfracbeta,
    1292                 :            :                            tag::hydroproductions,
    1293                 :            :                            tk::grm::MsgKey::HYDROPRODUCTIONS >,
    1294                 :            :                          tk::grm::check_coupling< tag::mixmassfracbeta,
    1295                 :            :                                                   tag::dissipation >,
    1296                 :            :                          tk::grm::check_coupling< tag::mixmassfracbeta,
    1297                 :            :                                                   tag::velocity > > > {};
    1298                 :            : 
    1299                 :            :   //! Gamma SDE
    1300                 :            :   struct gamma :
    1301                 :            :          pegtl::if_must<
    1302                 :            :            scan_sde< use< kw::gamma >, tag::gamma >,
    1303                 :            :            tk::grm::block< use< kw::end >,
    1304                 :            :                            tk::grm::depvar< use,
    1305                 :            :                                             tag::gamma,
    1306                 :            :                                             tag::depvar >,
    1307                 :            :                            tk::grm::component< use< kw::ncomp >,
    1308                 :            :                                                tag::gamma >,
    1309                 :            :                            tk::grm::rng< use,
    1310                 :            :                                          use< kw::rng >,
    1311                 :            :                                          tk::ctr::RNG,
    1312                 :            :                                          tag::gamma,
    1313                 :            :                                          tag::rng >,
    1314                 :            :                            tk::grm::policy< use,
    1315                 :            :                                             use< kw::init >,
    1316                 :            :                                             ctr::InitPolicy,
    1317                 :            :                                             tag::gamma,
    1318                 :            :                                             tag::initpolicy >,
    1319                 :            :                            tk::grm::policy< use,
    1320                 :            :                                             use< kw::coeff >,
    1321                 :            :                                             ctr::CoeffPolicy,
    1322                 :            :                                             tag::gamma,
    1323                 :            :                                             tag::coeffpolicy >,
    1324                 :            :                            icdelta< tag::gamma >,
    1325                 :            :                            icbeta< tag::gamma >,
    1326                 :            :                            icgamma< tag::gamma >,
    1327                 :            :                            icgaussian< tag::gamma >,
    1328                 :            :                            icjointgaussian< tag::gamma >,
    1329                 :            :                            sde_parameter_vector< kw::sde_b,
    1330                 :            :                                                  tk::grm::check_vector,
    1331                 :            :                                                  tag::gamma,
    1332                 :            :                                                  tag::b >,
    1333                 :            :                            sde_parameter_vector< kw::sde_S,
    1334                 :            :                                                  tk::grm::check_vector,
    1335                 :            :                                                  tag::gamma,
    1336                 :            :                                                  tag::S >,
    1337                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1338                 :            :                                                  tk::grm::check_vector,
    1339                 :            :                                                  tag::gamma,
    1340                 :            :                                                  tag::kappa > >,
    1341                 :            :            check_errors< tag::gamma > > {};
    1342                 :            : 
    1343                 :            :   //! Dirichlet SDE
    1344                 :            :   struct dirichlet :
    1345                 :            :          pegtl::if_must<
    1346                 :            :            scan_sde< use< kw::dirichlet >, tag::dirichlet >,
    1347                 :            :            tk::grm::block< use< kw::end >,
    1348                 :            :                            tk::grm::depvar< use,
    1349                 :            :                                             tag::dirichlet,
    1350                 :            :                                             tag::depvar >,
    1351                 :            :                            tk::grm::component< use< kw::ncomp >,
    1352                 :            :                                                tag::dirichlet >,
    1353                 :            :                            tk::grm::rng< use,
    1354                 :            :                                          use< kw::rng >,
    1355                 :            :                                          tk::ctr::RNG,
    1356                 :            :                                          tag::dirichlet,
    1357                 :            :                                          tag::rng >,
    1358                 :            :                            tk::grm::policy< use,
    1359                 :            :                                             use< kw::init >,
    1360                 :            :                                             ctr::InitPolicy,
    1361                 :            :                                             tag::dirichlet,
    1362                 :            :                                             tag::initpolicy >,
    1363                 :            :                            tk::grm::policy< use,
    1364                 :            :                                             use< kw::coeff >,
    1365                 :            :                                             ctr::CoeffPolicy,
    1366                 :            :                                             tag::dirichlet,
    1367                 :            :                                             tag::coeffpolicy >,
    1368                 :            :                            icdelta< tag::dirichlet >,
    1369                 :            :                            icbeta< tag::dirichlet >,
    1370                 :            :                            icgamma< tag::dirichlet >,
    1371                 :            :                            icgaussian< tag::dirichlet >,
    1372                 :            :                            icjointgaussian< tag::dirichlet >,
    1373                 :            :                            sde_parameter_vector< kw::sde_b,
    1374                 :            :                                                  tk::grm::check_vector,
    1375                 :            :                                                  tag::dirichlet,
    1376                 :            :                                                  tag::b >,
    1377                 :            :                            sde_parameter_vector< kw::sde_S,
    1378                 :            :                                                  tk::grm::check_vector,
    1379                 :            :                                                  tag::dirichlet,
    1380                 :            :                                                  tag::S >,
    1381                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1382                 :            :                                                  tk::grm::check_vector,
    1383                 :            :                                                  tag::dirichlet,
    1384                 :            :                                                  tag::kappa >
    1385                 :            :                          >,
    1386                 :            :            check_errors< tag::dirichlet > > {};
    1387                 :            : 
    1388                 :            :   //! MixDirichlet SDE
    1389                 :            :   struct mixdirichlet :
    1390                 :            :          pegtl::if_must<
    1391                 :            :            scan_sde< use< kw::mixdirichlet >, tag::mixdirichlet >,
    1392                 :            :            tk::grm::block< use< kw::end >,
    1393                 :            :                            tk::grm::depvar< use,
    1394                 :            :                                             tag::mixdirichlet,
    1395                 :            :                                             tag::depvar >,
    1396                 :            :                            tk::grm::component< use< kw::ncomp >,
    1397                 :            :                                                tag::mixdirichlet >,
    1398                 :            :                            tk::grm::rng< use,
    1399                 :            :                                          use< kw::rng >,
    1400                 :            :                                          tk::ctr::RNG,
    1401                 :            :                                          tag::mixdirichlet,
    1402                 :            :                                          tag::rng >,
    1403                 :            :                            tk::grm::policy< use,
    1404                 :            :                                             use< kw::init >,
    1405                 :            :                                             ctr::InitPolicy,
    1406                 :            :                                             tag::mixdirichlet,
    1407                 :            :                                             tag::initpolicy >,
    1408                 :            :                            tk::grm::policy< use,
    1409                 :            :                                             use< kw::coeff >,
    1410                 :            :                                             ctr::CoeffPolicy,
    1411                 :            :                                             tag::mixdirichlet,
    1412                 :            :                                             tag::coeffpolicy >,
    1413                 :            :                            tk::grm::policy< use,
    1414                 :            :                                             use< kw::normalization >,
    1415                 :            :                                             ctr::Normalization,
    1416                 :            :                                             tag::mixdirichlet,
    1417                 :            :                                             tag::normalization >,
    1418                 :            :                            icdelta< tag::mixdirichlet >,
    1419                 :            :                            icbeta< tag::mixdirichlet >,
    1420                 :            :                            icgamma< tag::mixdirichlet >,
    1421                 :            :                            icdirichlet< tag::mixdirichlet >,
    1422                 :            :                            icgaussian< tag::mixdirichlet >,
    1423                 :            :                            icjointgaussian< tag::mixdirichlet >,
    1424                 :            :                            sde_parameter_vector< kw::sde_b,
    1425                 :            :                                                  tk::grm::check_vector,
    1426                 :            :                                                  tag::mixdirichlet,
    1427                 :            :                                                  tag::b >,
    1428                 :            :                            sde_parameter_vector< kw::sde_S,
    1429                 :            :                                                  tk::grm::check_vector,
    1430                 :            :                                                  tag::mixdirichlet,
    1431                 :            :                                                  tag::S >,
    1432                 :            :                            sde_parameter_vector< kw::sde_kappaprime,
    1433                 :            :                                                  tk::grm::check_vector,
    1434                 :            :                                                  tag::mixdirichlet,
    1435                 :            :                                                  tag::kappaprime >,
    1436                 :            :                            sde_parameter_vector< kw::sde_rho,
    1437                 :            :                                                  tk::grm::check_vector,
    1438                 :            :                                                  tag::mixdirichlet,
    1439                 :            :                                                  tag::rho >
    1440                 :            :                          >,
    1441                 :            :            check_errors< tag::mixdirichlet,
    1442                 :            :                          tk::grm::check_mixdirichlet > > {};
    1443                 :            : 
    1444                 :            :   //! Generalized Dirichlet SDE
    1445                 :            :   struct gendir :
    1446                 :            :          pegtl::if_must<
    1447                 :            :            scan_sde< use< kw::gendir >, tag::gendir >,
    1448                 :            :            tk::grm::block< use< kw::end >,
    1449                 :            :                            tk::grm::depvar< use,
    1450                 :            :                                             tag::gendir,
    1451                 :            :                                             tag::depvar >,
    1452                 :            :                            tk::grm::component< use< kw::ncomp >,
    1453                 :            :                                                tag::gendir >,
    1454                 :            :                            tk::grm::rng< use,
    1455                 :            :                                          use< kw::rng >,
    1456                 :            :                                          tk::ctr::RNG,
    1457                 :            :                                          tag::gendir,
    1458                 :            :                                          tag::rng >,
    1459                 :            :                            tk::grm::policy< use,
    1460                 :            :                                             use< kw::init >,
    1461                 :            :                                             ctr::InitPolicy,
    1462                 :            :                                             tag::gendir,
    1463                 :            :                                             tag::initpolicy >,
    1464                 :            :                            tk::grm::policy< use,
    1465                 :            :                                             use< kw::coeff >,
    1466                 :            :                                             ctr::CoeffPolicy,
    1467                 :            :                                             tag::gendir,
    1468                 :            :                                             tag::coeffpolicy >,
    1469                 :            :                            icdelta< tag::gendir >,
    1470                 :            :                            icbeta< tag::gendir >,
    1471                 :            :                            icgamma< tag::gendir >,
    1472                 :            :                            icgaussian< tag::gendir >,
    1473                 :            :                            icjointgaussian< tag::gendir >,
    1474                 :            :                            sde_parameter_vector< kw::sde_b,
    1475                 :            :                                                  tk::grm::check_vector,
    1476                 :            :                                                  tag::gendir,
    1477                 :            :                                                  tag::b >,
    1478                 :            :                            sde_parameter_vector< kw::sde_S,
    1479                 :            :                                                  tk::grm::check_vector,
    1480                 :            :                                                  tag::gendir,
    1481                 :            :                                                  tag::S >,
    1482                 :            :                            sde_parameter_vector< kw::sde_kappa,
    1483                 :            :                                                  tk::grm::check_vector,
    1484                 :            :                                                  tag::gendir,
    1485                 :            :                                                  tag::kappa >,
    1486                 :            :                            sde_parameter_vector< kw::sde_c,
    1487                 :            :                                                  tk::grm::check_vector,
    1488                 :            :                                                  tag::gendir,
    1489                 :            :                                                  tag::c > >,
    1490                 :            :            check_errors< tag::gendir > > {};
    1491                 :            : 
    1492                 :            :   //! Wright-Fisher SDE
    1493                 :            :   struct wright_fisher :
    1494                 :            :          pegtl::if_must<
    1495                 :            :            scan_sde< use< kw::wrightfisher >, tag::wrightfisher >,
    1496                 :            :            tk::grm::block< use< kw::end >,
    1497                 :            :                            tk::grm::depvar< use,
    1498                 :            :                                             tag::wrightfisher,
    1499                 :            :                                             tag::depvar >,
    1500                 :            :                            tk::grm::component< use< kw::ncomp >,
    1501                 :            :                                                tag::wrightfisher >,
    1502                 :            :                            tk::grm::rng< use,
    1503                 :            :                                          use< kw::rng >,
    1504                 :            :                                          tk::ctr::RNG,
    1505                 :            :                                          tag::wrightfisher,
    1506                 :            :                                          tag::rng >,
    1507                 :            :                            tk::grm::policy< use,
    1508                 :            :                                             use< kw::init >,
    1509                 :            :                                             ctr::InitPolicy,
    1510                 :            :                                             tag::wrightfisher,
    1511                 :            :                                             tag::initpolicy >,
    1512                 :            :                            tk::grm::policy< use,
    1513                 :            :                                             use< kw::coeff >,
    1514                 :            :                                             ctr::CoeffPolicy,
    1515                 :            :                                             tag::wrightfisher,
    1516                 :            :                                             tag::coeffpolicy >,
    1517                 :            :                            icdelta< tag::wrightfisher >,
    1518                 :            :                            icbeta< tag::wrightfisher >,
    1519                 :            :                            icgamma< tag::wrightfisher >,
    1520                 :            :                            icgaussian< tag::wrightfisher >,
    1521                 :            :                            icjointgaussian< tag::wrightfisher >,
    1522                 :            :                            sde_parameter_vector< kw::sde_omega,
    1523                 :            :                                                  tk::grm::check_vector,
    1524                 :            :                                                  tag::wrightfisher,
    1525                 :            :                                                  tag::omega > >,
    1526                 :            :            check_errors< tag::wrightfisher > > {};
    1527                 :            : 
    1528                 :            :   //! Velocity SDE
    1529                 :            :   struct velocity :
    1530                 :            :          pegtl::if_must<
    1531                 :            :            scan_sde< use< kw::velocitysde >, tag::velocity >,
    1532                 :            :            tk::grm::block< use< kw::end >,
    1533                 :            :                            tk::grm::depvar< use,
    1534                 :            :                                             tag::velocity,
    1535                 :            :                                             tag::depvar >,
    1536                 :            :                            tk::grm::rng< use,
    1537                 :            :                                          use< kw::rng >,
    1538                 :            :                                          tk::ctr::RNG,
    1539                 :            :                                          tag::velocity,
    1540                 :            :                                          tag::rng >,
    1541                 :            :                            tk::grm::policy< use,
    1542                 :            :                                             use< kw::init >,
    1543                 :            :                                             ctr::InitPolicy,
    1544                 :            :                                             tag::velocity,
    1545                 :            :                                             tag::initpolicy >,
    1546                 :            :                            tk::grm::policy< use,
    1547                 :            :                                             use< kw::coeff >,
    1548                 :            :                                             ctr::CoeffPolicy,
    1549                 :            :                                             tag::velocity,
    1550                 :            :                                             tag::coeffpolicy >,
    1551                 :            :                            tk::grm::policy< use,
    1552                 :            :                                             use< kw::solve >,
    1553                 :            :                                             ctr::Depvar,
    1554                 :            :                                             tag::velocity,
    1555                 :            :                                             tag::solve >,
    1556                 :            :                            tk::grm::policy< use,
    1557                 :            :                                             use< kw::variant >,
    1558                 :            :                                             ctr::VelocityVariant,
    1559                 :            :                                             tag::velocity,
    1560                 :            :                                             tag::variant >,
    1561                 :            :                            sde_parameter_vector< kw::gravity,
    1562                 :            :                                                  tk::grm::check_gravity,
    1563                 :            :                                                  tag::velocity,
    1564                 :            :                                                  tag::gravity >,
    1565                 :            :                            icdelta< tag::velocity >,
    1566                 :            :                            icbeta< tag::velocity >,
    1567                 :            :                            icgamma< tag::velocity >,
    1568                 :            :                            icgaussian< tag::velocity >,
    1569                 :            :                            icjointgaussian< tag::velocity >,
    1570                 :            :                            sde_option_vector< ctr::HydroTimeScales,
    1571                 :            :                                               kw::hydrotimescales,
    1572                 :            :                                               tag::velocity,
    1573                 :            :                                               tag::hydrotimescales,
    1574                 :            :                                               tk::grm::check_vector_size >,
    1575                 :            :                            sde_option_vector< ctr::HydroProductions,
    1576                 :            :                                               kw::hydroproductions,
    1577                 :            :                                               tag::velocity,
    1578                 :            :                                               tag::hydroproductions,
    1579                 :            :                                               tk::grm::check_vector_size >,
    1580                 :            :                            tk::grm::process<
    1581                 :            :                              use< kw::sde_c0 >,
    1582                 :            :                              tk::grm::Store_back< tag::param,
    1583                 :            :                                                   tag::velocity,
    1584                 :            :                                                   tag::c0 > >,
    1585                 :            :                            tk::grm::process<
    1586                 :            :                              use< kw::position >,
    1587                 :            :                              tk::grm::Store_back< tag::param,
    1588                 :            :                                                   tag::velocity,
    1589                 :            :                                                   tag::position >,
    1590                 :            :                              pegtl::alpha >,
    1591                 :            :                            tk::grm::process<
    1592                 :            :                              use< kw::dissipation >,
    1593                 :            :                              tk::grm::Store_back< tag::param,
    1594                 :            :                                                   tag::velocity,
    1595                 :            :                                                   tag::dissipation >,
    1596                 :            :                              pegtl::alpha >,
    1597                 :            :                            tk::grm::process<
    1598                 :            :                              use< kw::mixmassfracbeta >,
    1599                 :            :                              tk::grm::Store_back< tag::param,
    1600                 :            :                                                   tag::velocity,
    1601                 :            :                                                   tag::mixmassfracbeta >,
    1602                 :            :                              pegtl::alpha > >,
    1603                 :            :            check_errors< tag::velocity,
    1604                 :            :                          tk::grm::velocity_defaults,
    1605                 :            :                          tk::grm::check_coupling< tag::velocity,
    1606                 :            :                                                   tag::position >,
    1607                 :            :                          tk::grm::check_coupling< tag::velocity,
    1608                 :            :                                                   tag::dissipation >,
    1609                 :            :                          tk::grm::check_coupling< tag::velocity,
    1610                 :            :                                                   tag::mixmassfracbeta > > > {};
    1611                 :            : 
    1612                 :            :   //! position equation
    1613                 :            :   struct position :
    1614                 :            :          pegtl::if_must<
    1615                 :            :            scan_sde< use< kw::position >, tag::position >,
    1616                 :            :            tk::grm::block< use< kw::end >,
    1617                 :            :                            tk::grm::depvar< use,
    1618                 :            :                                             tag::position,
    1619                 :            :                                             tag::depvar >,
    1620                 :            :                            tk::grm::rng< use,
    1621                 :            :                                          use< kw::rng >,
    1622                 :            :                                          tk::ctr::RNG,
    1623                 :            :                                          tag::position,
    1624                 :            :                                          tag::rng >,
    1625                 :            :                            tk::grm::policy< use,
    1626                 :            :                                             use< kw::init >,
    1627                 :            :                                             ctr::InitPolicy,
    1628                 :            :                                             tag::position,
    1629                 :            :                                             tag::initpolicy >,
    1630                 :            :                            tk::grm::policy< use,
    1631                 :            :                                             use< kw::coeff >,
    1632                 :            :                                             ctr::CoeffPolicy,
    1633                 :            :                                             tag::position,
    1634                 :            :                                             tag::coeffpolicy >,
    1635                 :            :                            tk::grm::policy< use,
    1636                 :            :                                             use< kw::solve >,
    1637                 :            :                                             ctr::Depvar,
    1638                 :            :                                             tag::position,
    1639                 :            :                                             tag::solve >,
    1640                 :            :                            icdelta< tag::position >,
    1641                 :            :                            icbeta< tag::position >,
    1642                 :            :                            icgamma< tag::position >,
    1643                 :            :                            icgaussian< tag::position >,
    1644                 :            :                            icjointgaussian< tag::position >,
    1645                 :            :                            tk::grm::process<
    1646                 :            :                              use< kw::velocitysde >,
    1647                 :            :                              tk::grm::Store_back< tag::param,
    1648                 :            :                                                   tag::position,
    1649                 :            :                                                   tag::velocity >,
    1650                 :            :                              pegtl::alpha > >,
    1651                 :            :            check_errors< tag::position, 
    1652                 :            :                          tk::grm::position_defaults,
    1653                 :            :                          tk::grm::check_coupling< tag::position,
    1654                 :            :                                                   tag::velocity > > > {};
    1655                 :            : 
    1656                 :            :   //! dissipation equation
    1657                 :            :   struct dissipation :
    1658                 :            :          pegtl::if_must<
    1659                 :            :            scan_sde< use< kw::dissipation >, tag::dissipation >,
    1660                 :            :            tk::grm::block< use< kw::end >,
    1661                 :            :                            tk::grm::depvar< use,
    1662                 :            :                                             tag::dissipation,
    1663                 :            :                                             tag::depvar >,
    1664                 :            :                            tk::grm::rng< use,
    1665                 :            :                                          use< kw::rng >,
    1666                 :            :                                          tk::ctr::RNG,
    1667                 :            :                                          tag::dissipation,
    1668                 :            :                                          tag::rng >,
    1669                 :            :                            tk::grm::policy< use,
    1670                 :            :                                             use< kw::init >,
    1671                 :            :                                             ctr::InitPolicy,
    1672                 :            :                                             tag::dissipation,
    1673                 :            :                                             tag::initpolicy >,
    1674                 :            :                            tk::grm::policy< use,
    1675                 :            :                                             use< kw::coeff >,
    1676                 :            :                                             ctr::CoeffPolicy,
    1677                 :            :                                             tag::dissipation,
    1678                 :            :                                             tag::coeffpolicy >,
    1679                 :            :                            tk::grm::process<
    1680                 :            :                              use< kw::sde_c3 >,
    1681                 :            :                              tk::grm::Store_back< tag::param,
    1682                 :            :                                                   tag::dissipation,
    1683                 :            :                                                   tag::c3 > >,
    1684                 :            :                            tk::grm::process<
    1685                 :            :                              use< kw::sde_c4 >,
    1686                 :            :                              tk::grm::Store_back< tag::param,
    1687                 :            :                                                   tag::dissipation,
    1688                 :            :                                                   tag::c4 > >,
    1689                 :            :                            tk::grm::process<
    1690                 :            :                              use< kw::sde_com1 >,
    1691                 :            :                              tk::grm::Store_back< tag::param,
    1692                 :            :                                                   tag::dissipation,
    1693                 :            :                                                   tag::com1 > >,
    1694                 :            :                            tk::grm::process<
    1695                 :            :                              use< kw::sde_com2 >,
    1696                 :            :                              tk::grm::Store_back< tag::param,
    1697                 :            :                                                   tag::dissipation,
    1698                 :            :                                                   tag::com2 > >,
    1699                 :            :                            icdelta< tag::dissipation >,
    1700                 :            :                            icbeta< tag::dissipation >,
    1701                 :            :                            icgamma< tag::dissipation >,
    1702                 :            :                            icgaussian< tag::dissipation >,
    1703                 :            :                            icjointgaussian< tag::dissipation >,
    1704                 :            :                            tk::grm::process<
    1705                 :            :                              use< kw::velocitysde >,
    1706                 :            :                              tk::grm::Store_back< tag::param,
    1707                 :            :                                                   tag::dissipation,
    1708                 :            :                                                   tag::velocity >,
    1709                 :            :                              pegtl::alpha > >,
    1710                 :            :            check_errors< tag::dissipation,
    1711                 :            :                          tk::grm::dissipation_defaults,
    1712                 :            :                          tk::grm::check_coupling< tag::dissipation,
    1713                 :            :                                                   tag::velocity > > > {};
    1714                 :            : 
    1715                 :            :   //! stochastic differential equations
    1716                 :            :   struct sde :
    1717                 :            :          pegtl::sor< dirichlet,
    1718                 :            :                      mixdirichlet,
    1719                 :            :                      gendir,
    1720                 :            :                      wright_fisher,
    1721                 :            :                      ornstein_uhlenbeck,
    1722                 :            :                      diag_ou,
    1723                 :            :                      skewnormal,
    1724                 :            :                      gamma,
    1725                 :            :                      beta,
    1726                 :            :                      numfracbeta,
    1727                 :            :                      massfracbeta,
    1728                 :            :                      mixnumfracbeta,
    1729                 :            :                      mixmassfracbeta,
    1730                 :            :                      position,
    1731                 :            :                      dissipation,
    1732                 :            :                      velocity > {};
    1733                 :            : 
    1734                 :            : 
    1735                 :            :   //! 'walker' block
    1736                 :            :   struct walker :
    1737                 :            :          pegtl::if_must<
    1738                 :            :            tk::grm::readkw< use< kw::walker >::pegtl_string >,
    1739                 :            :            pegtl::sor<
    1740                 :            :              pegtl::seq<
    1741                 :            :                tk::grm::block<
    1742                 :            :                  use< kw::end >,
    1743                 :            :                  discretization_parameters,
    1744                 :            :                  sde,
    1745                 :            :                  tk::grm::rngblock< use, rngs >,
    1746                 :            :                  tk::grm::statistics< use, tk::grm::store_walker_option >,
    1747                 :            :                  tk::grm::pdfs< use, tk::grm::store_walker_option > >,
    1748                 :            :                tk::grm::check_velocity,
    1749                 :            :                tk::grm::check_position,
    1750                 :            :                tk::grm::check_dissipation,
    1751                 :            :                tk::grm::check_mixmassfracbeta >,
    1752                 :            :            tk::grm::msg< tk::grm::MsgType::ERROR,
    1753                 :            :                          tk::grm::MsgKey::UNFINISHED > > > {};
    1754                 :            : 
    1755                 :            :   //! main keywords
    1756                 :            :   struct keywords :
    1757                 :            :          pegtl::sor< tk::grm::title< use >, walker > {};
    1758                 :            : 
    1759                 :            :   //! entry point: parse keywords and ignores until eof
    1760                 :            :   struct read_file :
    1761                 :            :          tk::grm::read_file< keywords, tk::grm::ignore > {};
    1762                 :            : 
    1763                 :            : } // deck::
    1764                 :            : } // walker::
    1765                 :            : 
    1766                 :            : #endif // WalkerInputDeckGrammar_h

Generated by: LCOV version 1.14