22#include " common/constants.hpp"
33#include " common/CArrayWrapper.hpp"
44#include " common/macros.hpp"
5+ #include " common/DirectSystemSolve.hpp"
56
67#include < cmath>
78#include < string>
@@ -26,7 +27,7 @@ KineticReactions< REAL_TYPE,
2627 INDEX_TYPE
2728 >::computeReactionRates_impl( RealType const & ,// temperature,
2829 PARAMS_DATA const & params,
29- ARRAY_1D_TO_CONST const & primarySpeciesConcentration ,
30+ ARRAY_1D_TO_CONST const & speciesConcentration ,
3031 ARRAY_1D & reactionRates,
3132 ARRAY_2D & reactionRatesDerivatives )
3233{
@@ -58,7 +59,7 @@ KineticReactions< REAL_TYPE,
5859 {
5960
6061 RealType const s_ri = params.stoichiometricMatrix ( r, i );
61- RealType const productTerm_i = primarySpeciesConcentration [i] > 1e-100 ? pow ( primarySpeciesConcentration [i], abs (s_ri) ) : 0.0 ;
62+ RealType const productTerm_i = speciesConcentration [i] > 1e-100 ? pow ( speciesConcentration [i], abs (s_ri) ) : 0.0 ;
6263
6364 if ( s_ri < 0.0 )
6465 {
@@ -78,7 +79,7 @@ KineticReactions< REAL_TYPE,
7879 {
7980 if ( i==j )
8081 {
81- dProductConcForward_dC[j] *= -s_ri * pow ( primarySpeciesConcentration [i], -s_ri-1 );
82+ dProductConcForward_dC[j] *= -s_ri * pow ( speciesConcentration [i], -s_ri-1 );
8283 dProductConcReverse_dC[j] = 0.0 ;
8384 }
8485 else
@@ -93,7 +94,7 @@ KineticReactions< REAL_TYPE,
9394 {
9495 if ( i==j )
9596 {
96- dProductConcReverse_dC[j] *= s_ri * pow ( primarySpeciesConcentration [i], s_ri-1 );
97+ dProductConcReverse_dC[j] *= s_ri * pow ( speciesConcentration [i], s_ri-1 );
9798 dProductConcForward_dC[j] = 0.0 ;
9899 }
99100 else
@@ -150,45 +151,114 @@ KineticReactions< REAL_TYPE,
150151 INDEX_TYPE
151152 >::computeSpeciesRates_impl( RealType const & temperature,
152153 PARAMS_DATA const & params,
153- ARRAY_1D_TO_CONST const & primarySpeciesConcentration ,
154- ARRAY_1D & primarySpeciesRates ,
155- ARRAY_2D & primarySpeciesRatesDerivatives )
154+ ARRAY_1D_TO_CONST const & speciesConcentration ,
155+ ARRAY_1D & speciesRates ,
156+ ARRAY_2D & speciesRatesDerivatives )
156157{
157158 RealType reactionRates[PARAMS_DATA::numReactions] = { 0.0 };
158159 CArrayWrapper< double , PARAMS_DATA::numReactions, PARAMS_DATA::numSpecies > reactionRatesDerivatives;
159160
160161 if constexpr ( !CALCULATE_DERIVATIVES )
161162 {
162- HPCREACT_UNUSED_VAR (primarySpeciesRatesDerivatives );
163+ HPCREACT_UNUSED_VAR (speciesRatesDerivatives );
163164 }
164165
165- computeReactionRates< PARAMS_DATA >( temperature, params, primarySpeciesConcentration , reactionRates, reactionRatesDerivatives );
166+ computeReactionRates< PARAMS_DATA >( temperature, params, speciesConcentration , reactionRates, reactionRatesDerivatives );
166167
167168 for ( IntType i = 0 ; i < PARAMS_DATA::numSpecies; ++i )
168169 {
169- primarySpeciesRates [i] = 0.0 ;
170+ speciesRates [i] = 0.0 ;
170171 if constexpr ( CALCULATE_DERIVATIVES )
171172 {
172173 for ( IntType j = 0 ; j < PARAMS_DATA::numSpecies; ++j )
173174 {
174- primarySpeciesRatesDerivatives ( i, j ) = 0.0 ;
175+ speciesRatesDerivatives ( i, j ) = 0.0 ;
175176 }
176177 }
177178 for ( IntType r=0 ; r<PARAMS_DATA::numReactions; ++r )
178179 {
179180 RealType const s_ir = params.stoichiometricMatrix ( r, i );
180- primarySpeciesRates [i] += s_ir * reactionRates[r];
181+ speciesRates [i] += s_ir * reactionRates[r];
181182 if constexpr ( CALCULATE_DERIVATIVES )
182183 {
183184 for ( IntType j = 0 ; j < PARAMS_DATA::numSpecies; ++j )
184185 {
185- primarySpeciesRatesDerivatives ( i, j ) += s_ir * reactionRatesDerivatives ( r, j );
186+ speciesRatesDerivatives ( i, j ) += s_ir * reactionRatesDerivatives ( r, j );
186187 }
187188 }
188189 }
189190 }
190191}
191192
193+ template < typename REAL_TYPE,
194+ typename INT_TYPE,
195+ typename INDEX_TYPE >
196+ template < typename PARAMS_DATA,
197+ typename ARRAY_1D,
198+ typename ARRAY_1D_TO_CONST,
199+ typename ARRAY_2D >
200+ HPCREACT_HOST_DEVICE inline void
201+ KineticReactions< REAL_TYPE,
202+ INT_TYPE,
203+ INDEX_TYPE
204+ >::timeStep(
205+ RealType const dt,
206+ RealType const & temperature,
207+ PARAMS_DATA const & params,
208+ ARRAY_1D_TO_CONST const & speciesConcentration_n,
209+ ARRAY_1D & speciesConcentration,
210+ ARRAY_1D & speciesRates,
211+ ARRAY_2D & speciesRatesDerivatives )
212+ {
213+ // constexpr int numReactions = PARAMS_DATA::numReactions;
214+ constexpr int numSpecies = PARAMS_DATA::numSpecies;
215+
216+
217+
218+
219+ REAL_TYPE residualNorm = 0.0 ;
220+ for ( int k=0 ; k<10 ; ++k )
221+ {
222+ // printf( "iteration %2d: \n", k );
223+
224+ computeSpeciesRates ( temperature,
225+ params,
226+ speciesConcentration,
227+ speciesRates,
228+ speciesRatesDerivatives );
229+
230+ double residual[numSpecies] = { 0.0 };
231+ double deltaPrimarySpeciesConcentration[numSpecies] = { 0.0 };
232+ for ( int i = 0 ; i < numSpecies; ++i )
233+ {
234+ residual[i] = -(speciesConcentration[i] - speciesConcentration_n[i] - dt * speciesRates[i]);
235+ for ( int j = 0 ; j < numSpecies; ++j )
236+ {
237+ speciesRatesDerivatives ( i, j ) = - dt * speciesRatesDerivatives ( i, j );
238+ }
239+ speciesRatesDerivatives ( i, i ) += 1.0 ;
240+ }
241+
242+ residualNorm = 0.0 ;
243+ for ( int j = 0 ; j < numSpecies; ++j )
244+ {
245+ residualNorm += residual[j] * residual[j];
246+ }
247+ residualNorm = sqrt ( residualNorm );
248+ if ( residualNorm < 1.0e-8 )
249+ {
250+ break ;
251+ }
252+
253+ solveNxN_pivoted<double ,numSpecies>( speciesRatesDerivatives.data , residual, deltaPrimarySpeciesConcentration );
254+
255+ for ( int i = 0 ; i < numSpecies; ++i )
256+ {
257+ speciesConcentration[i] += deltaPrimarySpeciesConcentration[i];
258+ }
259+
260+ }
261+ }
192262} // namespace bulkGeneric
193263} // namespace hpcReact
194264
0 commit comments