@@ -13,34 +13,152 @@ namespace bulkGeneric
1313
1414
1515
16+
1617template < typename REAL_TYPE,
1718 typename INT_TYPE,
1819 typename INDEX_TYPE,
1920 int NUM_SPECIES,
2021 int NUM_REACTIONS >
21- struct ParametersBase
22+ struct EquilibriumReactionsParameters
2223{
2324 using RealType = REAL_TYPE;
2425 using IntType = INT_TYPE;
26+ using IndexType = INDEX_TYPE;
27+
28+ static constexpr IndexType numSpecies = NUM_SPECIES;
29+ static constexpr IndexType numReactions = NUM_REACTIONS;
30+
31+ constexpr
32+ EquilibriumReactionsParameters ( RealType const (&stoichiometricMatrix)[numReactions][numSpecies],
33+ RealType const (&equilibriumConstant)[numReactions] ):
34+ EquilibriumReactionsParameters( stoichiometricMatrix,
35+ equilibriumConstant,
36+ std::make_index_sequence<NUM_REACTIONS>(),
37+ std::make_index_sequence<NUM_REACTIONS*NUM_SPECIES>() )
38+ {}
39+
40+
41+ RealType stoichiometricMatrix ( IndexType const r, int const i ) const { return m_stoichiometricMatrix[r][i]; }
42+ RealType equilibriumConstant ( IndexType const r ) const { return m_equilibriumConstant[r]; }
2543
26- static constexpr IntType numSpecies = NUM_SPECIES;
27- static constexpr IntType numReactions = NUM_REACTIONS;
2844 RealType m_stoichiometricMatrix[numReactions][numSpecies];
45+ RealType m_equilibriumConstant[numReactions];
46+
47+ private:
48+ #if defined(__GNUC__) || defined(__clang__)
49+ #pragma GCC diagnostic push
50+ #pragma GCC diagnostic ignored "-Wmissing-braces"
51+ #elif defined(_MSC_VER)
52+ #pragma warning(push)
53+ #pragma warning(disable : 4351) // MSVC equivalent of missing-braces warning
54+ #endif
55+
56+ template < std::size_t ... R, std::size_t ... RxS >
57+ constexpr
58+ EquilibriumReactionsParameters ( RealType const (&stoichiometricMatrix)[numReactions][numSpecies],
59+ RealType const (&equilibriumConstant)[numReactions],
60+ std::index_sequence<R...>,
61+ std::index_sequence<RxS...> ):
62+ m_stoichiometricMatrix{ stoichiometricMatrix[RxS/numSpecies][RxS%numSpecies]... },
63+ m_equilibriumConstant{ equilibriumConstant[R]... }
64+ {}
65+
66+ #if defined(__GNUC__) || defined(__clang__)
67+ #pragma GCC diagnostic pop
68+ #elif defined(_MSC_VER)
69+ #pragma warning(pop)
70+ #endif
2971};
3072
3173
3274template < typename REAL_TYPE,
3375 typename INT_TYPE,
3476 typename INDEX_TYPE,
77+ int NUM_SPECIES,
3578 int NUM_REACTIONS >
36- struct EquilibriumKineticsModelConstants
79+ struct KineticReactionsParameters
3780{
3881 using RealType = REAL_TYPE;
3982 using IntType = INT_TYPE;
83+ using IndexType = INDEX_TYPE;
84+
85+ static constexpr IndexType numSpecies = NUM_SPECIES;
86+ static constexpr IndexType numReactions = NUM_REACTIONS;
87+
88+ KineticReactionsParameters ( RealType const (&stoichiometricMatrix)[numReactions][numSpecies],
89+ RealType const (&rateConstantForward)[numReactions],
90+ RealType const (&rateConstantReverse)[numReactions] ):
91+ KineticReactionsParameters( stoichiometricMatrix,
92+ rateConstantForward,
93+ rateConstantReverse,
94+ std::make_index_sequence<NUM_REACTIONS>(),
95+ std::make_index_sequence<NUM_REACTIONS*NUM_SPECIES>() )
96+ {}
97+
4098
41- static constexpr IntType numReactions = NUM_REACTIONS;
99+ RealType stoichiometricMatrix ( IndexType const r, int const i ) const { return m_stoichiometricMatrix[r][i]; }
100+ RealType rateConstantForward ( IndexType const r ) const { return m_rateConstantForward[r]; }
101+ RealType rateConstantReverse ( IndexType const r ) const { return m_rateConstantReverse[r]; }
42102
43- void verifyParameters ()
103+
104+ RealType m_stoichiometricMatrix[numReactions][numSpecies];
105+ RealType m_rateConstantForward[numReactions];
106+ RealType m_rateConstantReverse[numReactions];
107+
108+ private:
109+ #if defined(__GNUC__) || defined(__clang__)
110+ #pragma GCC diagnostic push
111+ #pragma GCC diagnostic ignored "-Wmissing-braces"
112+ #elif defined(_MSC_VER)
113+ #pragma warning(push)
114+ #pragma warning(disable : 4351) // MSVC equivalent of missing-braces warning
115+ #endif
116+ template < std::size_t ... R, std::size_t ... RxS >
117+ KineticReactionsParameters ( RealType const (&stoichiometricMatrix)[numReactions][numSpecies],
118+ RealType const (&rateConstantForward)[numReactions],
119+ RealType const (&rateConstantReverse)[numReactions],
120+ std::index_sequence<R...>,
121+ std::index_sequence<RxS...> ):
122+ m_stoichiometricMatrix{ stoichiometricMatrix[RxS/numSpecies][RxS%numSpecies]... },
123+ m_rateConstantForward{ rateConstantForward[R]... },
124+ m_rateConstantReverse{ rateConstantReverse[R]... }
125+ {}
126+ #if defined(__GNUC__) || defined(__clang__)
127+ #pragma GCC diagnostic pop
128+ #elif defined(_MSC_VER)
129+ #pragma warning(pop)
130+ #endif
131+ };
132+
133+
134+ template < typename REAL_TYPE,
135+ typename INT_TYPE,
136+ typename INDEX_TYPE,
137+ int NUM_SPECIES,
138+ int NUM_REACTIONS >
139+ struct MixedReactionsParameters
140+ {
141+ using RealType = REAL_TYPE;
142+ using IntType = INT_TYPE;
143+ using IndexType = INDEX_TYPE;
144+ static constexpr IndexType numSpecies = NUM_SPECIES;
145+ static constexpr IndexType numReactions = NUM_REACTIONS;
146+
147+ constexpr
148+ EquilibriumReactionsParameters< RealType, IntType, IndexType, numSpecies, numReactions >
149+ equilibriumReactionsParameters () const
150+ {
151+ return {m_stoichiometricMatrix, m_equilibriumConstant};
152+ }
153+
154+ constexpr
155+ KineticReactionsParameters< RealType, IntType, IndexType, numSpecies, numReactions >
156+ kineticReactionsParameters () const
157+ {
158+ return {m_stoichiometricMatrix, m_rateConstantForward, m_rateConstantReverse};
159+ }
160+
161+ void verifyParameterConsistency ()
44162 {
45163 static constexpr int num_digits = 12 ;
46164 for ( int i = 0 ; i < numReactions; ++i )
@@ -67,96 +185,26 @@ struct EquilibriumKineticsModelConstants
67185 RealType const absDiff = fabs ( K - ( kf / kr ) );
68186 RealType const effectiveMagnitude = max ( fabs ( K ), fabs ( kf/kr ));
69187 RealType const tolerance = effectiveMagnitude * pow ( 10 , -num_digits );
70- if ( absDiff > tolerance ) // Tolerance for floating point precision
188+ if ( absDiff > tolerance ) // Tolerance for floating point precision
71189 {
72190 throw std::runtime_error ( " Error: Inconsistent equilibrium relation for reaction " + std::to_string ( i ));
73191 }
74192 }
75193 }
76194 }
77195
78- RealType equilibriumConstant ( int const i ) const { return m_equilibriumConstant[i]; }
79- RealType rateConstantForward ( int const i ) const { return m_rateConstantForward[i]; }
80- RealType rateConstantReverse ( int const i ) const { return m_rateConstantReverse[i]; }
81-
82-
83- RealType m_equilibriumConstant[numReactions] = {0.0 };
84- RealType m_rateConstantForward[numReactions] = {0.0 };
85- RealType m_rateConstantReverse[numReactions] = {0.0 };
196+ RealType stoichiometricMatrix ( IndexType const r, int const i ) const { return m_stoichiometricMatrix[r][i]; }
197+ RealType equilibriumConstant ( IndexType const r ) const { return m_equilibriumConstant[r]; }
198+ RealType rateConstantForward ( IndexType const r ) const { return m_rateConstantForward[r]; }
199+ RealType rateConstantReverse ( IndexType const r ) const { return m_rateConstantReverse[r]; }
86200
201+ RealType m_stoichiometricMatrix[numReactions][numSpecies];
202+ RealType m_equilibriumConstant[numReactions];
203+ RealType m_rateConstantForward[numReactions];
204+ RealType m_rateConstantReverse[numReactions];
87205};
88206
89- template < typename REAL_TYPE,
90- typename INT_TYPE,
91- typename INDEX_TYPE,
92- template < typename , typename , typename , int > typename RATE_CONSTANTS_TYPE,
93- int NUM_SPECIES,
94- int NUM_REACTIONS >
95- struct ReactionsParameters
96- {
97- using RealType = REAL_TYPE;
98- using IntType = INT_TYPE;
99- using RateConstantType = RATE_CONSTANTS_TYPE< REAL_TYPE, INT_TYPE, INDEX_TYPE, NUM_REACTIONS >;
100- static constexpr IntType numSpecies = NUM_SPECIES;
101- static constexpr IntType numReactions = NUM_REACTIONS;
102-
103-
104- static_assert ( std::is_same_v< REAL_TYPE, typename RateConstantType::RealType >, " RealType of RATE_CONSTANTS_TYPE is inconsistent" );
105- static_assert ( std::is_same_v< INT_TYPE, typename RateConstantType::IntType >, " IntType of RATE_CONSTANTS_TYPE is inconsistent" );
106- static_assert ( numReactions == RateConstantType::numReactions, " numReactions of RATE_CONSTANTS_TYPE is inconsistent" );
107-
108- RealType stoichiometricMatrix ( int const r, int const i ) const { return m_base.m_stoichiometricMatrix [r][i]; }
109- RealType equilibriumConstant ( int const r ) const { return m_rateConstants.equilibriumConstant ( r ); }
110- RealType rateConstantForward ( int const r ) const { return m_rateConstants.rateConstantForward ( r ); }
111- RealType rateConstantReverse ( int const r ) const { return m_rateConstants.rateConstantReverse ( r ); }
112-
113- ParametersBase< REAL_TYPE, INT_TYPE, INT_TYPE, NUM_SPECIES, NUM_REACTIONS > m_base;
114- RateConstantType m_rateConstants;
115-
116- // RealType (&m_stoichiometricMatrix)[numReactions][numSpecies] = m_base.m_stoichiometricMatrix;
117-
118- };
119-
120-
121-
122- template < typename REAL_TYPE,
123- typename INT_TYPE,
124- typename INDEX_TYPE,
125- int NUM_PRIMARY_SPECIES,
126- int NUM_KINETIC_REACTIONS >
127- struct KineticParameters
128- {
129- using RealType = REAL_TYPE;
130- using IntType = INT_TYPE;
131-
132- static constexpr IntType numPrimarySpecies = NUM_PRIMARY_SPECIES;
133- static constexpr IntType numKineticReactions = NUM_KINETIC_REACTIONS;
134-
135- RealType m_activationEnergy[numKineticReactions];
136- RealType m_equilibriumConstant[numKineticReactions];
137- RealType m_stoichiometricMatrix[numKineticReactions][numPrimarySpecies];
138-
139- RealType m_rateConstant[numKineticReactions];
140- };
141-
142- template < typename REAL_TYPE,
143- typename INT_TYPE,
144- typename INDEX_TYPE,
145- int NUM_PRIMARY_SPECIES,
146- int NUM_SECONDARY_SPECIES,
147- int NUM_KINETIC_REACTIONS,
148- int NUM_EQUILIBRIUM_REACTIONS >
149- struct BulkParameters
150- {
151- using RealType = REAL_TYPE;
152- using IntType = INT_TYPE;
153207
154- static constexpr IntType numPrimarySpecies = NUM_PRIMARY_SPECIES;
155- static constexpr IntType numSecondarySpecies = NUM_SECONDARY_SPECIES;
156- static constexpr IntType numKineticReactions = NUM_KINETIC_REACTIONS;
157- static constexpr IntType numEquilibriumReactions = NUM_EQUILIBRIUM_REACTIONS;
158-
159- };
160208
161209
162210
0 commit comments