mirror of
https://git.gfz-potsdam.de/naaice/iphreeqc.git
synced 2025-12-16 00:28:23 +01:00
153 lines
6.9 KiB
Plaintext
153 lines
6.9 KiB
Plaintext
# Subroutines for calculating mineral dissolution rates from compilations by Palandri and Kharaka (2004), Sverdrup et al. (2019), and Hermanska et al., 2022, 2023.
|
|
# Numbers can be copied from the tables in the publications; when unavailable enter -30 for log_k, 0 for exponents and 1 for other parameters.
|
|
# The data are entered in a KINETICS block with -parms. For example for the Albite rate of Palandri and Kharaka, Table 13:
|
|
|
|
# KINETICS 1
|
|
# Albite_PK
|
|
# -formula NaAlSi3O8
|
|
|
|
# # parms affinity_factor m^2/mol roughness, lgkH e_H nH, lgkH2O e_H2O, lgkOH e_OH nOH
|
|
# # parm number 1 2 3, 4 5 6, 7 8, 9 10 11
|
|
|
|
# -parms 0 1 1, -10.16 65.0 0.457, -12.56 69.8, -15.60 71.0 -0.572 # parms 4-11 from TABLE 13
|
|
|
|
# In the RATES block, they are stored in memory, and retrieved by the subroutine calc_value("Palandri_rate").
|
|
|
|
# RATES
|
|
# Albite_PK # Palandri and Kharaka, 2004
|
|
# 10 if parm(1) = 1 then affinity = 1 else affinity = 1 - SR("Albite") : if affinity < parm(1) then SAVE 0 : END
|
|
# 20 put(affinity, -99, 1) # store value in memory
|
|
# 30 for i = 2 to 11 : put(parm(i), -99, i) : next i
|
|
# 40 SAVE calc_value("Palandri_rate")
|
|
# -end
|
|
|
|
# For an example file using the rates, see: kinetic_rates.phr in https://www.hydrochemistry.eu/exmpls/kin_silicates.html
|
|
|
|
# References
|
|
# Palandri, J.L. and Kharaka, J.K. (2004). A compilation of rate parameters of water-mineral interaction kinetics for application to geochemical modeling. USGS Open-File Report 2004-1068.
|
|
# Sverdrup, H.U., Oelkers, E., Erlandsson Lampa, M., Belyazid, S., Kurz, D. and Akselsson, C. (2019). Reviews and Syntheses: weathering of silicate minerals in soils and watersheds: parameterization of the weathering kinetics module in the PROFILE and ForSAFE models. Biogeosciences Discuss. 1-58.
|
|
# Hermanská, M., Voigt, M.J., Marieni, C., Declercq, J. and Oelkers, E.H., 2022. A comprehensive and internally consistent mineral dissolution rate database: Part I: Primary silicate minerals and glasses. Chemical Geology, 597, p.120807
|
|
# Hermanská, M., Voigt, M.J., Marieni, C., Declercq, J. and Oelkers, E.H., 2023. A comprehensive and consistent mineral dissolution rate database: Part II: Secondary silicate minerals. Chemical Geology, p.121632.
|
|
|
|
CALCULATE_VALUES
|
|
Palandri_rate
|
|
# in KINETICS, define 11 parms:
|
|
# affinity_factor m^2/mol roughness, lgkH e_H nH, lgkH2O e_H2O, lgkOH e_OH nOH
|
|
# parm number 1 2 3, 4 5 6, 7 8, 9 10 11
|
|
10 affinity = get(-99, 1) # retrieve number from memory
|
|
20
|
|
30 REM # specific area m2/mol, surface roughness
|
|
40 sp_area = get(-99, 2) : roughness = get(-99, 3)
|
|
50
|
|
60 REM # temperature factor, gas constant
|
|
70 dif_temp = 1 / TK - 1 / 298 : R = 2.303 * 8.314e-3 : dT_R = dif_temp / R
|
|
80
|
|
90 REM # rate by H+
|
|
100 lgk_H = get(-99, 4) : e_H = get(-99, 5) : nH = get(-99, 6)
|
|
110 rate_H = 10^(lgk_H - e_H * dT_R) * ACT("H+")^nH
|
|
120
|
|
130 REM # rate by hydrolysis
|
|
140 lgk_H2O = get(-99, 7) : e_H2O = get(-99, 8)
|
|
150 rate_H2O = 10^(lgk_H2O - e_H2O * dT_R)
|
|
160
|
|
170 REM # rate by OH-
|
|
180 lgk_OH = get(-99, 9) : e_OH = get(-99, 10) : nOH = get(-99, 11)
|
|
190 rate_OH = 10^(lgk_OH - e_OH * dT_R) * ACT("H+")^nOH
|
|
200
|
|
210 rate = rate_H + rate_H2O + rate_OH
|
|
220 area = sp_area * M0 * (M / M0)^0.67
|
|
230
|
|
240 rate = area * roughness * rate * affinity
|
|
250 SAVE rate * TIME
|
|
-end
|
|
|
|
Sverdrup_rate
|
|
# in KINETICS, define 34 parms:
|
|
# affinity m^2/mol roughness, temperature_factors (TABLE 4): e_H e_H2O e_CO2 e_OA e_OH,\
|
|
# (TABLE 3): pkH nH yAl CAl xBC CBC, pKH2O yAl CAl xBC CBC zSi CSi, pKCO2 nCO2 pkOrg nOrg COrg, pkOH wOH yAl CAl xBC CBC zSi CSi
|
|
10 affinity = get(-99, 1)
|
|
20
|
|
30 REM # specific area m2/mol, surface roughness
|
|
40 sp_area = get(-99, 2) : roughness = get(-99, 3)
|
|
50
|
|
60 REM # temperature factors
|
|
70 dif_temp = 1 / TK - 1 / 281
|
|
80 e_H = get(-99, 4) : e_H2O = get(-99, 5) : e_CO2 = get(-99, 6) : e_OA = get(-99, 7) : e_OH = get(-99, 8)
|
|
90
|
|
100 BC = ACT("Na+") + ACT("K+") + ACT("Mg+2") + ACT("Ca+2")
|
|
110 aAl = act("Al+3")
|
|
120 aSi = act("H4SiO4")
|
|
130 R = tot("OrganicMatter")
|
|
140
|
|
150 REM # rate by H+
|
|
160 pkH = get(-99, 9) : nH = get(-99, 10) : yAl = get(-99, 11) : CAl = get(-99, 12) : xBC = get(-99, 13) : CBC = get(-99, 14)
|
|
170 pk_H = pkH - 3 + e_H * dif_temp
|
|
180 CAl = CAl * 1e-6
|
|
190 CBC = CBC * 1e-6
|
|
200 rate_H = 10^-pk_H * ACT("H+")^nH / ((1 + aAl / CAl)^yAl * (1 + BC / CBC)^xBC)
|
|
210
|
|
220 REM # rate by hydrolysis
|
|
230 pkH2O = get(-99, 15) : yAl = get(-99, 16) : CAl = get(-99, 17) : xBC = get(-99, 18) : CBC = get(-99, 19) : zSi = get(-99, 20) : CSi = get(-99, 21)
|
|
240 CAl = CAl * 1e-6
|
|
250 CBC = CBC * 1e-6
|
|
260 CSi = CSi * 1e-6
|
|
270 pk_H2O = pkH2O - 3 + e_H2O * dif_temp
|
|
280 rate_H2O = 10^-pk_H2O / ((1 + aAl / CAl)^yAl * (1 + BC / CBC)^xBC * (1 + aSi / CSi)^zSi)
|
|
290
|
|
300 REM # rate by CO2
|
|
310 pKCO2 = get(-99, 22) : nCO2 = get(-99, 23)
|
|
320 pk_CO2 = pkCO2 - 3 + e_CO2 * dif_temp
|
|
330 rate_CO2 = 10^-pk_CO2 * SR("CO2(g)")^nCO2
|
|
340
|
|
350 REM # rate by Organic Acids
|
|
360 pkOrg = get(-99, 24) : nOrg = get(-99, 25) : COrg = get(-99, 26)
|
|
370 COrg = COrg * 1e-6
|
|
380 pk_Org = pkOrg - 3 + e_OA * dif_temp
|
|
390 rate_Org = 10^-pk_Org * (R / (1 + R / COrg))^nOrg
|
|
400
|
|
410 REM # rate by OH-
|
|
420 pkOH = get(-99, 27) : wOH = get(-99, 28) : yAl = get(-99, 29) : CAl = get(-99, 30) : xBC = get(-99, 31) : CBC = get(-99, 32) : zSi = get(-99, 33) : CSi = get(-99, 34)
|
|
430 CAl = CAl * 1e-6
|
|
440 CBC = CBC * 1e-6
|
|
450 CSi = CSi * 1e-6
|
|
460 pk_OH = pkOH - 3 + e_OH * dif_temp
|
|
470 rate_OH = 10^-pk_OH * ACT("OH-")^wOH / ((1 + aAl / CAl)^yAl * (1 + BC / CBC)^xBC * (1 + aSi / CSi)^zSi)# : print rate_OH
|
|
480
|
|
490 rate = rate_H + rate_H2O + rate_CO2 + rate_Org + rate_OH
|
|
500 area = sp_area * M0 * (M / M0)^0.67
|
|
510
|
|
520 rate = roughness * area * rate * affinity
|
|
530 SAVE rate * TIME
|
|
-end
|
|
|
|
Hermanska_rate
|
|
# in KINETICS, define 14 parms:
|
|
# parms affinity m^2/mol roughness, (TABLE 2): (acid)logk25 Aa Ea na (neutral)logk25 Ab Eb (basic)logk25 Ac Ec nc
|
|
# (Note that logk25 values are not used, they were transformed to A's.)
|
|
10 affinity = get(-99, 1) # retrieve number from memory
|
|
20
|
|
30 REM # specific area m2/mol, surface roughness
|
|
40 sp_area = get(-99, 2) : roughness = get(-99, 3)
|
|
50
|
|
60 REM # gas constant * Tk, act("H+")
|
|
70 RT = 8.314e-3 * TK : aH = act("H+")
|
|
80
|
|
90 REM # rate by H+
|
|
100 lgk_H = get(-99, 4) : Aa = get(-99, 5) : e_H = get(-99, 6) : nH = get(-99, 7)
|
|
110 rate_H = Aa * exp(- e_H / RT) * aH^nH
|
|
120
|
|
130 REM # rate by hydrolysis
|
|
140 lgk_H2O = get(-99, 8) : Ab = get(-99, 9) : e_H2O = get(-99, 10)
|
|
150 rate_H2O = Ab * exp(- e_H2O / RT)
|
|
160
|
|
170 REM # rate by OH-
|
|
180 lgk_OH = get(-99, 11) : Ac = get(-99, 12) : e_OH = get(-99, 13) : nOH = get(-99, 14)
|
|
190 rate_OH = Ac * exp(- e_OH / RT) * aH^nOH
|
|
200
|
|
210 rate = rate_H + rate_H2O + rate_OH
|
|
220 area = sp_area * M0 * (M / M0)^0.67
|
|
230
|
|
240 rate = area * roughness * rate * affinity
|
|
250 SAVE rate * TIME
|
|
-end
|