Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 62 additions & 72 deletions src/reactions/geochemistry/Carbonate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,92 +24,80 @@ namespace geochemistry
namespace carbonate
{

constexpr CArrayWrapper<double, 11, 18> stoichMatrix =
{ // OH- CO2 CO3-2 H2CO3 CaHCO3+ CaSO4 CaCl+ CaCl2 MgSO4 NaSO4- CaCO3 H+ HCO3- Ca+2 SO4-2 Cl- Mg+2 Na+
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, // OH- + H+ = H2O
{ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CO2 + H2O = H+ + HCO3-
{ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0 }, // CO3-2 + H+ = HCO3-
{ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // H2CO3 = H+ + HCO3-
{ 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // CaHCO3+ = Ca+2 + HCO3-
{ 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // CaSO4 = Ca+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, // CaCl+ = Ca+2 + Cl-
{ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0 }, // CaCl2 = Ca+2 + 2Cl-
{ 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // MgSO4 = Mg+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1 }, // NaSO4- = Na+ + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0 } // CaCO3(s) + H+ = Ca+2 + HCO3- (kinetic)
// { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 1, 0, 0, 0, 0 } // Ca(OH)2​(s) + 2H+ = Ca2+ + 2H2​O (kinetic)
constexpr CArrayWrapper<double, 10, 17> stoichMatrix =
{ // OH- CO2 CO3-2 CaHCO3+ CaSO4 CaCl+ CaCl2 MgSO4 NaSO4- CaCO3 H+ HCO3- Ca+2 SO4-2 Cl- Mg+2 Na+
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, // OH- + H+ = H2O
{ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CO2 + H2O = H+ + HCO3-
{ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0 }, // CO3-2 + H+ = HCO3-
{ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // CaHCO3+ = Ca+2 + HCO3-
{ 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // CaSO4 = Ca+2 + SO4-2
{ 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, // CaCl+ = Ca+2 + Cl-
{ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0 }, // CaCl2 = Ca+2 + 2Cl-
{ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // MgSO4 = Mg+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1 }, // NaSO4- = Na+ + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0 } // CaCO3(s) + H+ = Ca+2 + HCO3- (kinetic)
};

constexpr CArrayWrapper<double, 11, 17> stoichMatrixNosolid =
{ // OH- CO2 CO3-2 H2CO3 CaHCO3+ CaSO4 CaCl+ CaCl2 MgSO4 NaSO4- H+ HCO3- Ca+2 SO4-2 Cl- Mg+2 Na+
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, // OH- + H+ = H2O
{ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CO2 + H2O = H+ + HCO3-
{ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0 }, // CO3-2 + H+ = HCO3-
{ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // H2CO3 = H+ + HCO3-
{ 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // CaHCO3+ = Ca+2 + HCO3-
{ 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // CaSO4 = Ca+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, // CaCl+ = Ca+2 + Cl-
{ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 2, 0, 0 }, // CaCl2 = Ca+2 + 2Cl-
{ 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0 }, // MgSO4 = Mg+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1 }, // NaSO4- = Na+ + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0 } // CaCO3(s) + H+ = Ca+2 + HCO3- (kinetic)
// { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 1, 0, 0, 0, 0 } // Ca(OH)2​(s) + 2H+ = Ca2+ + 2H2​O (kinetic)
constexpr CArrayWrapper<double, 10, 16> stoichMatrixNosolid =
{ // OH- CO2 CO3-2 CaHCO3+ CaSO4 CaCl+ CaCl2 MgSO4 NaSO4- H+ HCO3- Ca+2 SO4-2 Cl- Mg+2 Na+
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 }, // OH- + H+ = H2O
{ 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CO2 + H2O = H+ + HCO3-
{ 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0 }, // CO3-2 + H+ = HCO3-
{ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // CaHCO3+ = Ca+2 + HCO3-
{ 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // CaSO4 = Ca+2 + SO4-2
{ 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 }, // CaCl+ = Ca+2 + Cl-
{ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 2, 0, 0 }, // CaCl2 = Ca+2 + 2Cl-
{ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0 }, // MgSO4 = Mg+2 + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1 }, // NaSO4- = Na+ + SO4-2
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0 } // CaCO3(s) + H+ = Ca+2 + HCO3- (kinetic)
};

// C^{n+1} - C^n - r( C^{n+1} ) * dt = 0
constexpr CArrayWrapper<double, 11> equilibriumConstants =
// thermodynamic constants derived from 'llnl.tdat' used by Geochemists' Workbench (originally from EQ36)
constexpr CArrayWrapper<double, 10> equilibriumConstants =
{
9.77E+13, // OH- + H+ = H2O
4.37E-07, // CO2 + H2O = H+ + HCO3-
2.14E+10, // CO3-2 + H+ = HCO3-
1.70E-04, // H2CO3 = H+ + HCO3-
8.13E-02, // CaHCO3+ = Ca+2 + HCO3-
6.92E-03, // CaSO4 = Ca+2 + SO4-2
4.68E+00, // CaCl+ = Ca+2 + Cl-
3.98E+00, // CaCl2 = Ca+2 + 2Cl-
3.72E-03, // MgSO4 = Mg+2 + SO4-2
1.51E-01, // NaSO4- = Na+ + SO4-2
1.17E+07 // CaCO3 + H+ = Ca+2 + HCO3- (kinetic)
// 1
}; // Ca(OH)2​(s) + 2H+ = Ca2+ + 2H2​O (kinetic)
9.89E+13, // OH- + H+ = H2O
4.42E-07, // CO2 + H2O = H+ + HCO3-
2.21E+10, // CO3-2 + H+ = HCO3-
6.00E-02, // CaHCO3+ = Ca+2 + HCO3-
4.79E-03, // CaSO4 = Ca+2 + SO4-2
2.00E-01, // CaCl+ = Ca+2 + Cl-
3.98E+00, // CaCl2 = Ca+2 + 2Cl-
5.92E-03, // MgSO4 = Mg+2 + SO4-2
2.02E-01, // NaSO4- = Na+ + SO4-2
5.16E+01 // CaCO3 + H+ = Ca+2 + HCO3- (kinetic)
};

constexpr CArrayWrapper<double, 11> forwardRates =
constexpr CArrayWrapper<double, 10> forwardRates =
{
1.4e11, // OH- + H+ = H2O
0.039, // CO2 + H2O = H+ + HCO3-
1.0e10, // CO3-2 + H+ = HCO3-
0.57, // H2CO3 = H+ + HCO3-
1.0e10, // CO3-2 + H+ = HCO3-
1.5e6, // CaHCO3+ = Ca+2 + HCO3-
1.0e5, // CaSO4 = Ca+2 + SO4-2
1.0e8, // CaCl+ = Ca+2 + Cl-
1.0e7, // CaCl2 = Ca+2 + 2Cl-
1.0e5, // MgSO4 = Mg+2 + SO4-2
1.0e7, // NaSO4- = Na+ + SO4-2
1.0e5 // CaCO3 + H+ = Ca+2 + HCO3- (kinetic)

// 1
}; // Ca(OH)2​(s) + 2H+ = Ca2+ + 2H2​O (kinetic)
1.55E-06 // CaCO3 + H+ = Ca+2 + HCO3- (kinetic)
};

constexpr CArrayWrapper<double, 11> reverseRates =
{ 1.43E-03, // OH- + H+ = H2O
8.92E+04, // CO2 + H2O = H+ + HCO3-
4.67E-01, // CO3-2 + H+ = HCO3-
3.35E+03, // H2CO3 = H+ + HCO3-
1.85E+07, // CaHCO3+ = Ca+2 + HCO3-
1.45E+07, // CaSO4 = Ca+2 + SO4-2
2.14E+07, // CaCl+ = Ca+2 + Cl-
2.51E+06, // CaCl2 = Ca+2 + 2Cl-
2.69E+07, // MgSO4 = Mg+2 + SO4-2
6.62E+07, // NaSO4- = Na+ + SO4-2
8.55E-03 // CaCO3 + H+ = Ca+2 + HCO3-
// 1 // Ca(OH)2​(s) + 2H+ = Ca2+ + 2H2​O (kinetic)
constexpr CArrayWrapper<double, 10> reverseRates =
{ 1.43E-03, // OH- + H+ = H2O
8.92E+04, // CO2 + H2O = H+ + HCO3-
4.67E-01, // CO3-2 + H+ = HCO3-
1.85E+07, // CaHCO3+ = Ca+2 + HCO3-
1.45E+07, // CaSO4 = Ca+2 + SO4-2
2.14E+07, // CaCl+ = Ca+2 + Cl-
2.51E+06, // CaCl2 = Ca+2 + 2Cl-
2.69E+07, // MgSO4 = Mg+2 + SO4-2
6.62E+07, // NaSO4- = Na+ + SO4-2
3.00E-08 // CaCO3 + H+ = Ca+2 + HCO3-
};

constexpr CArrayWrapper<int, 11> mobileSpeciesFlag =
constexpr CArrayWrapper<int, 10> mobileSpeciesFlag =
{ 1, // OH- + H+ = H2O
1, // CO2 + H2O = H+ + HCO3-
1, // CO3-2 + H+ = HCO3-
1, // H2CO3 = H+ + HCO3-
1, // CaHCO3+ = Ca+2 + HCO3-
1, // CaSO4 = Ca+2 + SO4-2
1, // CaCl+ = Ca+2 + Cl-
Expand All @@ -118,14 +106,16 @@ constexpr CArrayWrapper<int, 11> mobileSpeciesFlag =
1, // NaSO4- = Na+ + SO4-2
1 // CaCO3 + H+ = Ca+2 + HCO3-
};
}
using carbonateSystemAllKineticType = reactionsSystems::MixedReactionsParameters< double, int, int, 18, 11, 0 >;
using carbonateSystemAllEquilibriumType = reactionsSystems::MixedReactionsParameters< double, int, int, 18, 11, 11 >;
using carbonateSystemType = reactionsSystems::MixedReactionsParameters< double, int, int, 17, 11, 10 >;

constexpr carbonateSystemAllKineticType carbonateSystemAllKinetic( carbonate::stoichMatrix, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );
constexpr carbonateSystemAllEquilibriumType carbonateSystemAllEquilibrium( carbonate::stoichMatrix, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );
constexpr carbonateSystemType carbonateSystem( carbonate::stoichMatrixNosolid, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );
}

using carbonateSystemAllKineticType = reactionsSystems::MixedReactionsParameters< double, int, int, 17, 10, 0 >;
using carbonateSystemAllEquilibriumType = reactionsSystems::MixedReactionsParameters< double, int, int, 17, 10, 10 >;
using carbonateSystemType = reactionsSystems::MixedReactionsParameters< double, int, int, 16, 10, 9 >;

constexpr carbonateSystemAllKineticType carbonateSystemAllKinetic( carbonate::stoichMatrix, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );
constexpr carbonateSystemAllEquilibriumType carbonateSystemAllEquilibrium( carbonate::stoichMatrix, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );
constexpr carbonateSystemType carbonateSystem( carbonate::stoichMatrixNosolid, carbonate::equilibriumConstants, carbonate::forwardRates, carbonate::reverseRates, carbonate::mobileSpeciesFlag );

// *****UNCRUSTIFY-ON******
} // namespace geochemistry
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ TEST( testEquilibriumReactions, testcarbonateSystemAllEquilibrium )
{
using namespace hpcReact::geochemistry;

double const initialSpeciesConcentration[18] =
double const initialSpeciesConcentration[17] =
{
1.0e-16, // OH-
1.0e-16, // CO2
1.0e-16, // CO3-2
1.0e-16, // H2CO3
//1.0e-16, // H2CO3
1.0e-16, // CaHCO3+
1.0e-16, // CaSO4
1.0e-16, // CaCl+
Expand All @@ -60,25 +60,24 @@ TEST( testEquilibriumReactions, testcarbonateSystemAllEquilibrium )
1.09 // Na+1
};

double const expectedSpeciesConcentrations[18] =
{ 2.327841695586879e-11, // OH-
3.745973700632716e-01, // CO2
3.956656978189456e-11, // CO3-2
9.629355924567627e-04, // H2CO3
6.739226982791492e-05, // CaHCO3+
5.298329882666738e-03, // CaSO4
5.844517547638333e-03, // CaCl+
1.277319392670652e-02, // CaCl2
6.618125707964991e-03, // MgSO4
1.769217213462983e-02, // NaSO4-
1.065032288527957e-09, // CaCO3
4.396954721488358e-04, // H+
3.723009698453808e-04, // HCO3-
1.471656530812871e-02, // Ca+2
2.491372274738741e-03, // SO4-2
1.858609094598949e+00, // Cl-
9.881874292035110e-03, // Mg+2
1.072307827865370e+00 // Na+1
double const expectedSpeciesConcentrations[17] =
{ 2.1579694253441686e-11, // OH-
0.3755789961165058, // CO2
3.4214835005538611e-11, // CO3-2
1.9160014879413049e-05, // CaHCO3+
0.0025013721967110923, // CaSO4
0.030083903919781853, // CaCl+
0.0028032598559295028, // CaCl2
0.0063383337566393907, // MgSO4
0.019567697287351467, // NaSO4-
4.754873524374959e-05, // CaCO3
0.00046855267453226469, // H+
0.00035429509915661095, // HCO3-
0.0032447552774548935, // Ca+2
0.0036925967592983458, // SO4-2
1.8543095763683592, // Cl-
0.01016166624336071, // Mg+2
1.0704323027126488 // Na+1
};

std::cout<<" RESIDUAL_FORM 0:"<<std::endl;
Expand Down Expand Up @@ -140,13 +139,13 @@ TEST( testEquilibriumReactions, testcarbonateSystemAllEquilibrium2 )

double const expectedPrimarySpeciesConcentrations[numPrimarySpecies] =
{
4.396954721488358e-04, // H+
3.723009698453808e-04, // HCO3-
1.471656530812871e-02, // Ca+2
2.491372274738741e-03, // SO4-2
1.858609094598949e+00, // Cl-
9.881874292035110e-03, // Mg+2
1.072307827865370e+00 // Na+1
0.00046855267453254149, // H+
0.00035429509915645743, // HCO3-
0.0032447552774548518, // Ca+2
0.0036925967592983211, // SO4-2
1.8543095763683592, // Cl-
0.010161666243360675, // Mg+2
1.0704323027126488 // Na+1
};

for( int r=0; r<numPrimarySpecies; ++r )
Expand Down
Loading