Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/DiffEq/Dirichlet/MixDirichletCoeffPolicy.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 MixDirichlet coefficients policies
9 : : \details This file defines coefficients policy classes for the MixDirichlet
10 : : SDE, defined in DiffEq/MixDirichlet.h.
11 : :
12 : : General requirements on Dirichlet SDE coefficients policy classes:
13 : :
14 : : - Must define a _constructor_, which is used to initialize the SDE
15 : : coefficients, b, S, and kappa. Required signature:
16 : : \code{.cpp}
17 : : CoeffPolicyName(
18 : : tk::ctr::ncomp_t ncomp,
19 : : ctr::NormalizationType norm,
20 : : const std::vector< kw::sde_b::info::expect::type >& b_,
21 : : const std::vector< kw::sde_S::info::expect::type >& S_,
22 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
23 : : const std::vector< kw::sde_r::info::expect::type >& rho_,
24 : : std::vector< kw::sde_b::info::expect::type >& b,
25 : : std::vector< kw::sde_kappa::info::expect::type >& kprime,
26 : : std::vector< kw::sde_S::info::expect::type >& S,
27 : : std::vector< kw::sde_rho::info::expect::type >& rho,
28 : : std::vector< kw::sde_r::info::expect::type >& r,
29 : : std::vector< kw::sde_kappa::info::expect::type >& k );
30 : : \endcode
31 : : where
32 : : - _ncomp_ denotes the number of scalar components of the system of
33 : : MixDirichlet SDEs.
34 : : - _norm_ selects the type of normalization used (heavy or light).
35 : : - Constant references to b_, S_, kprime_, rho_, which denote vectors
36 : : of real values used to initialize the parameter vectors of the
37 : : MixDirichlet SDEs. The length of the vectors must be equal to the number
38 : : of components given by ncomp.
39 : : - References to b, kprime, S, rho, r, k, which denote the parameter
40 : : vectors to be initialized based on b_, S_, kprime_, rho_.
41 : :
42 : : - Must define the static function _type()_, returning the enum value of the
43 : : policy option. Example:
44 : : \code{.cpp}
45 : : static ctr::CoeffPolicyType type() noexcept {
46 : : return ctr::CoeffPolicyType::CONST_COEFF;
47 : : }
48 : : \endcode
49 : : which returns the enum value of the option from the underlying option
50 : : class, collecting all possible options for coefficients policies.
51 : :
52 : : - Must define the function _update()_, called from
53 : : MixDirichlet::advance(), updating the model coefficients.
54 : : Required signature:
55 : : \code{.cpp}
56 : : void update(
57 : : char depvar,
58 : : ncomp_t ncomp,
59 : : ctr::NormalizationType norm,
60 : : std::size_t density_offset,
61 : : std::size_t volume_offset,
62 : : const std::map< tk::ctr::Product, tk::real >& moments,
63 : : const std::vector< kw::sde_rho::info::expect::type >& rho,
64 : : const std::vector< kw::sde_r::info::expect::type >& r,
65 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime,
66 : : const std::vector< kw::sde_b::info::expect::type >& b,
67 : : std::vector< kw::sde_kappa::info::expect::type >& k,
68 : : std::vector< kw::sde_kappa::info::expect::type >& S ) const {}
69 : : \endcode
70 : : where _depvar_ is the dependent variable associated with the mix
71 : : Dirichlet SDE, specified in the control file by the user, _ncomp_
72 : : is the number of components in the system, _norm_ selects the type of
73 : : normalization used (heavy or light). _density_offset_ is the offset
74 : : of the particle density in the solution array relative to the Nth scalar,
75 : : _volume_offset_ is the offset of the particle specific volume in the
76 : : solution array relative to the Nth scalar, _moments_ is the map
77 : : associating moment IDs (tk::ctr::vector< tk::ctr::Term >) to values of
78 : : statistical moments, _rho_, _r_, _kprime_, _b_ are user-defined
79 : : parameters, and _k_ and _S_ are the SDE parameters computed/updated, see
80 : : also DiffEq/DiffEq/MixDirichlet.h.
81 : : */
82 : : // *****************************************************************************
83 : : #ifndef MixDirichletCoeffPolicy_h
84 : : #define MixDirichletCoeffPolicy_h
85 : :
86 : : #include <brigand/sequences/list.hpp>
87 : :
88 : : #include "Types.hpp"
89 : : #include "Walker/Options/CoeffPolicy.hpp"
90 : : #include "Walker/Options/Normalization.hpp"
91 : : #include "SystemComponents.hpp"
92 : :
93 : : namespace walker {
94 : :
95 : : //! \brief MixDirichlet constant coefficients policity: constants in time
96 : : class MixDirichletCoeffConst {
97 : :
98 : : private:
99 : : using ncomp_t = tk::ctr::ncomp_t;
100 : :
101 : : public:
102 : : //! Constructor: initialize coefficients
103 : : MixDirichletCoeffConst(
104 : : ncomp_t ncomp,
105 : : ctr::NormalizationType norm,
106 : : const std::vector< kw::sde_b::info::expect::type >& b_,
107 : : const std::vector< kw::sde_S::info::expect::type >& S_,
108 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
109 : : const std::vector< kw::sde_rho::info::expect::type >& rho_,
110 : : std::vector< kw::sde_b::info::expect::type >& b,
111 : : std::vector< kw::sde_kappa::info::expect::type >& kprime,
112 : : std::vector< kw::sde_S::info::expect::type >& S,
113 : : std::vector< kw::sde_rho::info::expect::type >& rho,
114 : : std::vector< kw::sde_r::info::expect::type >& r,
115 : : std::vector< kw::sde_kappa::info::expect::type >& k );
116 : :
117 : : //! Update coefficients
118 : : void update(
119 : : char depvar,
120 : : ncomp_t ncomp,
121 : : ctr::NormalizationType norm,
122 : : std::size_t density_offset,
123 : : std::size_t volume_offset,
124 : : const std::map< tk::ctr::Product, tk::real >& moments,
125 : : const std::vector< kw::sde_rho::info::expect::type >& rho,
126 : : const std::vector< kw::sde_r::info::expect::type >& r,
127 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime,
128 : : const std::vector< kw::sde_b::info::expect::type >& b,
129 : : std::vector< kw::sde_kappa::info::expect::type >& k,
130 : : std::vector< kw::sde_kappa::info::expect::type >& S ) const;
131 : :
132 : : //! Coefficients policy type accessor
133 : 2584 : static ctr::CoeffPolicyType type() noexcept
134 : 2584 : { return ctr::CoeffPolicyType::CONST_COEFF; }
135 : : };
136 : :
137 : : //! Compute parameter vector r based on r_i = rho_N/rho_i - 1
138 : : std::vector< kw::sde_r::info::expect::type >
139 : : MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho,
140 : : ctr::NormalizationType norm );
141 : :
142 : : //! MixDirichlet coefficients policity: mean(rho) forced const in time
143 : : //! \details User-defined parameter vector S is constrained to make
144 : : //! \f$\mathrm{d}<rho>/\mathrm{d}t = 0\f$.
145 : : class MixDirichletHomogeneous {
146 : :
147 : : private:
148 : : using ncomp_t = tk::ctr::ncomp_t;
149 : :
150 : : public:
151 : : //! Constructor: initialize coefficients
152 : : MixDirichletHomogeneous(
153 : : ncomp_t ncomp,
154 : : ctr::NormalizationType norm,
155 : : const std::vector< kw::sde_b::info::expect::type >& b_,
156 : : const std::vector< kw::sde_S::info::expect::type >& S_,
157 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
158 : : const std::vector< kw::sde_rho::info::expect::type >& rho_,
159 : : std::vector< kw::sde_b::info::expect::type >& b,
160 : : std::vector< kw::sde_kappa::info::expect::type >& kprime,
161 : : std::vector< kw::sde_S::info::expect::type >& S,
162 : : std::vector< kw::sde_rho::info::expect::type >& rho,
163 : : std::vector< kw::sde_r::info::expect::type >& r,
164 : : std::vector< kw::sde_kappa::info::expect::type >& k );
165 : :
166 : 2584 : static ctr::CoeffPolicyType type() noexcept
167 : 2584 : { return ctr::CoeffPolicyType::HOMOGENEOUS; }
168 : :
169 : : //! Update coefficients
170 : : void update(
171 : : char depvar,
172 : : ncomp_t ncomp,
173 : : ctr::NormalizationType norm,
174 : : std::size_t density_offset,
175 : : std::size_t volume_offset,
176 : : const std::map< tk::ctr::Product, tk::real >& moments,
177 : : const std::vector< kw::sde_rho::info::expect::type >& rho,
178 : : const std::vector< kw::sde_r::info::expect::type >& r,
179 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime,
180 : : const std::vector< kw::sde_b::info::expect::type >& b,
181 : : std::vector< kw::sde_kappa::info::expect::type >& k,
182 : : std::vector< kw::sde_kappa::info::expect::type >& S ) const;
183 : : };
184 : :
185 : : //! MixDirichlet coefficients policity: mean(rho) forced const in time
186 : : //! \details User-defined parameters b' and kappa' are functions of an
187 : : //! externally, e.g., DNS-, provided hydrodynamics time scale ensuring decay
188 : : //! in the evolution of \<y_alpha^2\>. Additionally, S_alpha is constrained to
189 : : //! make d\<rho\>/dt = 0. Additionally, we pull in a hydrodynamic timescale
190 : : //! from an external function.
191 : : //! \see kw::hydrotimescale_info
192 : : class MixDirichletHydroTimeScale {
193 : :
194 : : private:
195 : : using ncomp_t = tk::ctr::ncomp_t;
196 : :
197 : : public:
198 : : //! Constructor: initialize coefficients
199 : : MixDirichletHydroTimeScale(
200 : : tk::ctr::ncomp_t ncomp,
201 : : ctr::NormalizationType norm,
202 : : const std::vector< kw::sde_b::info::expect::type >& b_,
203 : : const std::vector< kw::sde_S::info::expect::type >& S_,
204 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime_,
205 : : const std::vector< kw::sde_rho::info::expect::type >& rho_,
206 : : std::vector< kw::sde_b::info::expect::type >& b,
207 : : std::vector< kw::sde_kappa::info::expect::type >& kprime,
208 : : std::vector< kw::sde_S::info::expect::type >& S,
209 : : std::vector< kw::sde_rho::info::expect::type >& rho,
210 : : std::vector< kw::sde_r::info::expect::type >& r,
211 : : std::vector< kw::sde_kappa::info::expect::type >& k );
212 : :
213 : 2584 : static ctr::CoeffPolicyType type() noexcept
214 : 2584 : { return ctr::CoeffPolicyType::HYDROTIMESCALE; }
215 : :
216 : : //! Update coefficients
217 : : void update(
218 : : char depvar,
219 : : ncomp_t ncomp,
220 : : ctr::NormalizationType norm,
221 : : std::size_t density_offset,
222 : : std::size_t volume_offset,
223 : : const std::map< tk::ctr::Product, tk::real >& moments,
224 : : const std::vector< kw::sde_rho::info::expect::type >& rho,
225 : : const std::vector< kw::sde_r::info::expect::type >& r,
226 : : const std::vector< kw::sde_kappa::info::expect::type >& kprime,
227 : : const std::vector< kw::sde_b::info::expect::type >& b,
228 : : std::vector< kw::sde_kappa::info::expect::type >& k,
229 : : std::vector< kw::sde_kappa::info::expect::type >& S ) const;
230 : : };
231 : :
232 : : //! List of all MixDirichlet's coefficients policies
233 : : using MixDirichletCoeffPolicies = brigand::list< MixDirichletCoeffConst
234 : : , MixDirichletHomogeneous
235 : : , MixDirichletHydroTimeScale >;
236 : :
237 : : } // walker::
238 : :
239 : : #endif // MixDirichletCoeffPolicy_h
|