@@ -25,7 +25,7 @@ namespace bulkGeneric
2525template < typename REAL_TYPE,
2626 typename INT_TYPE,
2727 typename INDEX_TYPE,
28- bool LOGE_CONCENTRATION >
28+ bool LOGE_CONCENTRATION = true >
2929class MixedEquilibriumKineticReactions
3030{
3131public:
@@ -51,13 +51,15 @@ class MixedEquilibriumKineticReactions
5151 ARRAY_1D_TO_CONST const & logPrimarySpeciesConcentrations,
5252 ARRAY_1D & logSecondarySpeciesConcentrations,
5353 ARRAY_1D & aggregatePrimarySpeciesConcentrations,
54- ARRAY_2D & dAggregatePrimarySpeciesConcentrationsDerivatives_dLogPrimarySpeciesConcentrations ,
54+ ARRAY_2D & dAggregatePrimarySpeciesConcentrations_dLogPrimarySpeciesConcentrations ,
5555 ARRAY_1D & reactionRates,
56- ARRAY_2D & reactionRatesDerivatives )
56+ ARRAY_2D & dReactionRates_dLogPrimarySpeciesConcentrations,
57+ ARRAY_1D & aggregateSpeciesRates,
58+ ARRAY_2D & dAggregateSpeciesRates_dLogPrimarySpeciesConcentrations )
5759 {
58- constexpr int numSpecies = PARAMS_DATA::numSpecies;
59- constexpr int numSecondarySpecies = PARAMS_DATA::numReactions;
60- constexpr int numPrimarySpecies = numSpecies - numSecondarySpecies;
60+ constexpr IntType numSpecies = PARAMS_DATA::numSpecies;
61+ constexpr IntType numSecondarySpecies = PARAMS_DATA::numReactions;
62+ constexpr IntType numPrimarySpecies = numSpecies - numSecondarySpecies;
6163
6264 // 1. Compute new aggregate species from primary species
6365 calculateAggregatePrimaryConcentrationsWrtLogC< REAL_TYPE,
@@ -69,15 +71,120 @@ class MixedEquilibriumKineticReactions
6971 dAggregatePrimarySpeciesConcentrationsDerivatives_dLogPrimarySpeciesConcentrations )
7072
7173 // 2. Compute the reaction rates for all kinetic reactions
74+ computeReactionRates ( temperature,
75+ params,
76+ logPrimarySpeciesConcentrations,
77+ logSecondarySpeciesConcentrations,
78+ aggregatePrimarySpeciesConcentrations,
79+ dAggregatePrimarySpeciesConcentrations_dLogPrimarySpeciesConcentrations,
80+ reactionRates,
81+ dReactionRates_dLogPrimarySpeciesConcentrations );
82+
83+
84+ // 3. Compute aggregate species rates
85+ computeAggregateSpeciesRates ( params,
86+ logPrimarySpeciesConcentrations
87+ reactionRates,
88+ dReactionRates_dLogPrimarySpeciesConcentrations,
89+ aggregateSpeciesRates,
90+ dAggregateSpeciesRates_dLogPrimarySpeciesConcentrations );
91+
92+
93+ }
94+
95+ template < typename PARAMS_DATA,
96+ typename ARRAY_1D_TO_CONST,
97+ typename ARRAY_1D,
98+ typename ARRAY_2D >
99+ static HPCREACT_HOST_DEVICE inline void
100+ computeReactionRates ( RealType const & temperature,
101+ PARAMS_DATA const & params,
102+ ARRAY_1D_TO_CONST const & logPrimarySpeciesConcentrations,
103+ ARRAY_1D_TO_CONST const & logSecondarySpeciesConcentrations,
104+ ARRAY_2D_TO_CONST const & dLogSecondarySpeciesConcentrations_dLogPrimarySpeciesConcentrations,
105+ ARRAY_1D & reactionRates,
106+ ARRAY_2D & dReactionRates_dPrimarySpeciesConcentrations )
107+
108+ {
109+ constexpr IntType numSpecies = PARAMS_DATA::numSpecies;
110+ constexpr IntType numSecondarySpecies = PARAMS_DATA::numReactions;
111+ constexpr IntType numPrimarySpecies = numSpecies - numSecondarySpecies;
112+
113+ RealType logSpeciesConcentration[numSpecies] {};
114+ for ( IntType i = 0 ; i < numPrimarySpecies; ++i )
115+ {
116+ speciesConcentration[i] = logPrimarySpeciesConcentrations[i];
117+ }
118+ for ( IntType i = 0 ; i < numSecondarySpecies; ++i )
119+ {
120+ logSpeciesConcentration[i+numPrimarySpecies] = logSecondarySpeciesConcentrations[i];
121+ }
122+
123+ CArrayWrapper< RealType, PARAMS_DATA::numReactions, numSpecies > reactionRatesDerivatives;
72124 kineticReactions::computeReactionRates ( temperature,
73125 params,
74- speciesConcentration ,
126+ logSpeciesConcentration ,
75127 reactionRates,
76128 reactionRatesDerivatives );
77129
78- // 3. Compute aggregate species rates
79-
80-
130+ // Compute the reaction rates derivatives w.r.t. log primary species concentrations
131+ for ( IntType i = 0 ; i < numKineticReactions; ++i )
132+ {
133+ for ( IntType j = 0 ; j < numPrimarySpecies; ++j )
134+ {
135+ dReactionRates_dLogPrimarySpeciesConcentrations ( i, j ) = reactionRatesDerivatives ( i, j );
136+ for ( IntType k = 0 ; k < numSecondarySpecies; ++k )
137+ {
138+ RealType const dLogSecondarySpeciesConcentrations_dLogPrimarySpeciesConcentration = params.stoichiometricMatrix ( k, j+numSecondarySpecies );
139+
140+ dReactionRates_dLogPrimarySpeciesConcentrations ( i, j ) +=
141+ reactionRatesDerivatives ( i, numPrimarySpecies + k ) * dLogSecondarySpeciesConcentrations_dLogPrimarySpeciesConcentrations ( k, j );
142+ }
143+ }
144+ }
145+ }
146+
147+ template < typename PARAMS_DATA,
148+ typename ARRAY_1D_TO_CONST,
149+ typename ARRAY_2D_TO_CONST
150+ typename ARRAY_1D,
151+ typename ARRAY_2D >
152+ static HPCREACT_HOST_DEVICE inline void
153+ computeAggregateSpeciesRates ( PARAMS_DATA const & params,
154+ ARRAY_1D_TO_CONST const & speciesConcentration,
155+ ARRAY_1D_TO_CONST const & reactionRates,
156+ ARRAY_2D_TO_CONST const & reactionRatesDerivatives
157+ ARRAY_1D & aggregatesRates,
158+ ARRAY_2D & aggregatesRatesDerivatives )
159+ {
160+ constexpr IntType numSpecies = PARAMS_DATA::numSpecies;
161+ constexpr IntType numSecondarySpecies = PARAMS_DATA::numReactions;
162+ constexpr IntType numPrimarySpecies = numSpecies - numSecondarySpecies;
163+
164+ for ( IntType i = 0 ; i < numPrimarySpecies; ++i )
165+ {
166+ speciesRates[i] = 0.0 ;
167+ if constexpr ( CALCULATE_DERIVATIVES )
168+ {
169+ for ( IntType j = 0 ; j < numPrimarySpecies; ++j )
170+ {
171+ speciesRatesDerivatives ( i, j ) = 0.0 ;
172+ }
173+ }
174+ for ( IntType r=0 ; r<PARAMS_DATA::numReactions; ++r )
175+ {
176+ RealType const s_ir = params.stoichiometricMatrix ( r, i );
177+ speciesRates[i] += s_ir * reactionRates[r];
178+ if constexpr ( CALCULATE_DERIVATIVES )
179+ {
180+ for ( IntType j = 0 ; j < numPrimarySpecies; ++j )
181+ {
182+ speciesRatesDerivatives ( i, j ) += s_ir * reactionRatesDerivatives ( r, j );
183+ }
184+ }
185+ }
186+ }
187+
81188 }
82189
83190private:
0 commit comments