Skip to content

Commit 5b12f16

Browse files
committed
add system from Tiras
1 parent 33e1c6d commit 5b12f16

File tree

4 files changed

+188
-22
lines changed

4 files changed

+188
-22
lines changed

src/reactions/bulkGeneric/KineticReactions_impl.hpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
#include "common/macros.hpp"
44

55
#include <cmath>
6+
#include <string>
7+
#include <iostream>
8+
9+
#define OUTPUT_RATE_EQUATIONS 0
610

711
namespace hpcReact
812
{
@@ -27,45 +31,88 @@ KineticReactions< REAL_TYPE,
2731
RealConstDataArrayView1d const & primarySpeciesConcentration,
2832
RealDataArrayView1d & reactionRates )
2933
{
34+
#if OUTPUT_RATE_EQUATIONS==1
35+
std::string const c[] = { "A", "B", "C", "D", "E" };
36+
#endif
37+
3038
for( IntType i = 0; i < PARAMS_DATA::numPrimarySpecies; ++i )
3139
{
40+
#if OUTPUT_RATE_EQUATIONS==1
41+
std::string rateString;
42+
#endif
3243
reactionRates[i] = 0.0;
3344
for( IntType r=0; r<PARAMS_DATA::numKineticReactions; ++r )
3445
{
3546
RealType const forwardRateConstant = params.m_rateConstant[r] * exp( -params.m_activationEnergy[r] / ( constants::R * temperature ) );
36-
RealType const reverseRateConstant = params.m_equilibriumConstant[r] / forwardRateConstant;
47+
RealType const reverseRateConstant = forwardRateConstant / params.m_equilibriumConstant[r] ;
48+
49+
// printf( "forwardRateConstant = %8.4e, reverseRateConstant = %8.4e\n", forwardRateConstant, reverseRateConstant );
3750
RealType const s_ir = params.m_stoichiometricMatrix[r][i];
3851

3952
RealType productConcPlus = 1.0;
4053
RealType productConcMinus = 1.0;
4154
bool productConcPlusFlag = false;
4255
bool productConcMinusFlag = false;
56+
#if OUTPUT_RATE_EQUATIONS==1
57+
std::string productConcPlusString;
58+
std::string productConcMinusString;
59+
#endif
4360
for( IntType j = 0; j < PARAMS_DATA::numPrimarySpecies; ++j )
4461
{
4562
RealType const s_jr = params.m_stoichiometricMatrix[r][j];
4663
if( s_jr < 0.0 )
4764
{
4865
productConcPlus *= pow( primarySpeciesConcentration[j], -s_jr );
66+
#if OUTPUT_RATE_EQUATIONS==1
67+
productConcPlusString += " c(" +c[j]+")" ;//+ "^" + std::to_string(-s_jr) + " ";
68+
#endif
4969
productConcPlusFlag = true;
5070
}
5171
else if( s_jr > 0.0 )
5272
{
5373
productConcMinus *= pow( primarySpeciesConcentration[j], s_jr );
74+
#if OUTPUT_RATE_EQUATIONS==1
75+
productConcMinusString += " c("+c[j]+")" ;//+ "^" + std::to_string(s_jr) + " ";
76+
#endif
5477
productConcMinusFlag = true;
5578
}
5679
}
5780

5881
RealType reactionRate_n = 0.0;
82+
#if OUTPUT_RATE_EQUATIONS==1
83+
std::string reactionRateString = "{ ";
84+
#endif
5985
if( productConcPlusFlag )
6086
{
6187
reactionRate_n += forwardRateConstant * productConcPlus;
88+
#if OUTPUT_RATE_EQUATIONS==1
89+
reactionRateString += " k_" + std::to_string(r+1) + "f" + productConcPlusString;
90+
#endif
6291
}
6392
if( productConcMinusFlag )
6493
{
6594
reactionRate_n -= reverseRateConstant * productConcMinus;
95+
#if OUTPUT_RATE_EQUATIONS==1
96+
reactionRateString += " - k_" + std::to_string(r+1) + "r" + productConcMinusString;
97+
#endif
6698
}
99+
100+
#if OUTPUT_RATE_EQUATIONS==1
101+
reactionRateString += " }";
102+
if( s_ir > 0.1 || s_ir < -0.1 )
103+
{
104+
std::string s_irString;
105+
s_irString.resize(10);
106+
snprintf(s_irString.data(), 5, "%+.1f", s_ir);
107+
rateString += s_irString + " " + reactionRateString;
108+
}
109+
#endif
67110
reactionRates[i] += s_ir * reactionRate_n;
111+
68112
}
113+
#if OUTPUT_RATE_EQUATIONS==1
114+
std::cout<<rateString<<std::endl;
115+
#endif
69116
}
70117
}
71118

src/reactions/bulkGeneric/Parameters.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace bulkGeneric
1414

1515
template< typename REAL_TYPE,
1616
typename INT_TYPE,
17+
typename INDEX_TYPE,
1718
int NUM_PRIMARY_SPECIES,
1819
int NUM_KINETIC_REACTIONS >
1920
struct KineticParameters
@@ -26,11 +27,29 @@ struct KineticParameters
2627

2728
RealType m_activationEnergy[numKineticReactions];
2829
RealType m_equilibriumConstant[numKineticReactions];
29-
CArrayWrapper< RealType, numKineticReactions, numPrimarySpecies> m_stoichiometricMatrix;
30+
RealType m_stoichiometricMatrix[numKineticReactions][numPrimarySpecies];
3031

3132
RealType m_rateConstant[numKineticReactions];
3233
};
3334

35+
template< typename REAL_TYPE,
36+
typename INT_TYPE,
37+
typename INDEX_TYPE,
38+
int NUM_PRIMARY_SPECIES,
39+
int NUM_SECONDARY_SPECIES,
40+
int NUM_KINETIC_REACTIONS,
41+
int NUM_EQUILIBRIUM_REACTIONS >
42+
struct BulkParameters
43+
{
44+
using RealType = REAL_TYPE;
45+
using IntType = INT_TYPE;
46+
47+
static constexpr IntType numPrimarySpecies = NUM_PRIMARY_SPECIES;
48+
static constexpr IntType numSecondarySpecies = NUM_SECONDARY_SPECIES;
49+
static constexpr IntType numKineticReactions = NUM_KINETIC_REACTIONS;
50+
static constexpr IntType numEquilibriumReactions = NUM_EQUILIBRIUM_REACTIONS;
51+
52+
};
3453

3554

3655

src/reactions/bulkGeneric/ParametersPredefined.hpp

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace bulkGeneric
88
{
99

1010
constexpr
11-
KineticParameters< double, int, 5, 5 > bicarbonateBuffer =
11+
KineticParameters< double, int, int, 6, 5 > bicarbonateBuffer =
1212
{
1313
// taken from
1414
// Simplified Models of the Bicarbonate Buffer for Scaled Simulations of CO2 Electrolyzers
@@ -22,15 +22,59 @@ KineticParameters< double, int, 5, 5 > bicarbonateBuffer =
2222
// m_equilibriumConstant
2323
{ 4.27E+07, 4.27E-07, 2.09E-04, 2.09E+10, 1.00E+14 },
2424
// m_stoichiometricMatrix
25-
{ { { 1, 1, -1, 0, 0 },
26-
{ 1, 0, -1, 0, -1 },
27-
{ 0, -1, -1, 1, 0 },
28-
{ 0, 0, -1, 1, 1 },
29-
{ 0, 1, 0, 0, 1 } }
25+
{ { -1, -1, 1, 0, 0, 0 },
26+
{ -1, 0, 1, 0, 1, -1 },
27+
{ 0, 1, 1, -1, 0, 0 },
28+
{ 0, 0, 1, -1, -1, 0 },
29+
{ 0, -1, 0, 0, -1, 1 }
3030
},
3131
// m_rateConstant
3232
{ 8.42E+03, 3.71E-02, 1.25E+06, 1.24E+12, 2.30E+10 }
3333
};
3434

35+
36+
constexpr
37+
KineticParameters< double, int, int, 6, 5 > bicarbonateBufferTest =
38+
{
39+
// taken from
40+
// Simplified Models of the Bicarbonate Buffer for Scaled Simulations of CO2 Electrolyzers
41+
// Thomas Moore, Tiras Y. Lin, Thomas Roy, Sarah E. Baker, Eric B. Duoss, Christopher Hahn, and Victor A. Beck
42+
// Industrial & Engineering Chemistry Research 2023 62 (40), 16291-16301
43+
// DOI: 10.1021/acs.iecr.3c02504
44+
45+
// m_activationEnergy
46+
{ 0.0, 0.0, 0.0, 0.0, 0.0 },
47+
// m_equilibriumConstant
48+
{ 4.27E+07, 4.27E-07, 2.09E-04, 2.09E+10, 1.00E+14 },
49+
// m_stoichiometricMatrix
50+
// C02, OH-, HCO3-, CO3^2-, H+, H20
51+
{ { -1, -1, 1, 0, 0, 0 },
52+
{ -1, 0, 1, 0, 1, -1 },
53+
{ 0, 1, 1, -1, 0, 0 },
54+
{ 0, 0, 1, -1, -1, 0 },
55+
{ 0, -1, 0, 0, -1, 1 }
56+
},
57+
// m_rateConstant
58+
{ 8.42E+03, 3.71E-02, 1.25E+03, 1.24E+3, 2.30E+3 }
59+
};
60+
61+
constexpr
62+
KineticParameters< double, int, int, 5, 2 > simpleTest =
63+
{
64+
// m_activationEnergy
65+
{ 0.0, 0.0 },
66+
// m_equilibriumConstant
67+
{ 1.0, 1.0 },
68+
// m_stoichiometricMatrix
69+
// C02, OH-, HCO3-, CO3^2-, H+, H20
70+
{ { -2, 1, 1, 0, 0 },
71+
{ 0, 0, -1, -1, 2 }
72+
},
73+
// m_rateConstant
74+
{ 1.0, 0.5 }
75+
};
76+
77+
78+
3579
} // namespace bulkGeneric
3680
} // namespace hpcReact

src/reactions/bulkGeneric/unitTests/testKineticReactions.cpp

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,39 @@
88
using namespace hpcReact;
99
using namespace hpcReact::bulkGeneric;
1010

11-
TEST( bulkGeneric, test_computeReactionRates )
11+
// TEST( bulkGeneric, test_computeReactionRates )
12+
// {
13+
// using KineticReactionsType = KineticReactions< double,
14+
// double * const,
15+
// double const * const,
16+
// int,
17+
// int >;
18+
19+
// double const temperature = 298.15;
20+
// double primarySpeciesConcentration[6] = { 0.01, 0.01, 0.01, 0.01, 0.01, 1.0 };
21+
// double reactionRates[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
22+
23+
// KineticReactionsType::computeReactionRates( temperature,
24+
// bicarbonateBuffer,
25+
// primarySpeciesConcentration,
26+
// reactionRates );
27+
28+
// printf( "reactionRates = {%8.4e, %8.4e, %8.4e, %8.4e, %8.4e, %8.4e }\n",
29+
// reactionRates[0],
30+
// reactionRates[1],
31+
// reactionRates[2],
32+
// reactionRates[3],
33+
// reactionRates[4],
34+
// reactionRates[5] );
35+
// // EXPECT_NEAR( reactionRates[0], 0.0, 1.0e-8 );
36+
// // EXPECT_NEAR( reactionRates[1], 0.0, 1.0e-8 );
37+
// // EXPECT_NEAR( reactionRates[2], 0.0, 1.0e-8 );
38+
// // EXPECT_NEAR( reactionRates[3], 0.0, 1.0e-8 );
39+
// // EXPECT_NEAR( reactionRates[4], 0.0, 1.0e-8 );
40+
41+
// }
42+
43+
TEST( bulkGeneric, test_computeReactionRatesIntegral )
1244
{
1345
using KineticReactionsType = KineticReactions< double,
1446
double * const,
@@ -17,20 +49,44 @@ TEST( bulkGeneric, test_computeReactionRates )
1749
int >;
1850

1951
double const temperature = 298.15;
20-
double const primarySpeciesConcentration[] = { 1.0, 1.0, 1.0, 1.0, 1.0 };
52+
double primarySpeciesConcentration[] = { 1.0, 0.0, 0.5, 1.0, 0.0 };
2153
double reactionRates[] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
22-
23-
KineticReactionsType::computeReactionRates( temperature,
24-
bicarbonateBuffer,
25-
primarySpeciesConcentration,
26-
reactionRates );
27-
28-
EXPECT_NEAR( reactionRates[0], 0.0, 1.0e-8 );
29-
EXPECT_NEAR( reactionRates[1], 0.0, 1.0e-8 );
30-
EXPECT_NEAR( reactionRates[2], 0.0, 1.0e-8 );
31-
EXPECT_NEAR( reactionRates[3], 0.0, 1.0e-8 );
32-
EXPECT_NEAR( reactionRates[4], 0.0, 1.0e-8 );
33-
54+
55+
constexpr double dt = 1.0e-1;
56+
constexpr int numPrimarySpecies = decltype(simpleTest)::numPrimarySpecies;
57+
// constexpr int numKineticReactions = decltype(simpleTest)::numKineticReactions;
58+
59+
//double time = 0.0;
60+
for( int i = 0; i < 1000; ++i )
61+
{
62+
KineticReactionsType::computeReactionRates( temperature,
63+
simpleTest,
64+
primarySpeciesConcentration,
65+
reactionRates );
66+
67+
for( int j = 0; j < numPrimarySpecies; ++j )
68+
{
69+
primarySpeciesConcentration[j] += dt * reactionRates[j];
70+
}
71+
//time += dt;
72+
// if( i % 10 == 0 )
73+
// {
74+
// printf( " {% 12.8e} { % 12.8e, % 12.8e, % 12.8e, % 12.8e, % 12.8e }\n",
75+
// time,
76+
// primarySpeciesConcentration[0],
77+
// primarySpeciesConcentration[1],
78+
// primarySpeciesConcentration[2],
79+
// primarySpeciesConcentration[3],
80+
// primarySpeciesConcentration[4] );
81+
// }
82+
}
83+
84+
EXPECT_NEAR( primarySpeciesConcentration[0], 3.92138294e-01, 1.0e-8 );
85+
EXPECT_NEAR( primarySpeciesConcentration[1], 3.03930853e-01, 1.0e-8 );
86+
EXPECT_NEAR( primarySpeciesConcentration[2], 5.05945481e-01, 1.0e-8 );
87+
EXPECT_NEAR( primarySpeciesConcentration[3], 7.02014628e-01, 1.0e-8 );
88+
EXPECT_NEAR( primarySpeciesConcentration[4], 5.95970745e-01, 1.0e-8 );
89+
3490
}
3591

3692
int main( int argc, char * * argv )

0 commit comments

Comments
 (0)