Dumping minerals and then adding chemicals
Chapter 13.3 of Bethke (2007) describes a "dump" process, whereby a mineral is added to the initial solution, equilibrium sought, then any undissolved mineral is removed. In the code, this is achieved by:
subtracting from ;
then setting ;
setting the mole numbers of any surface components to zero, , as well as the molalities of unoccupied surface sites, and adsorbed species, ;
finally, swapping an appropriate aqueous species into the basis in place of .
After this process, other chemicals can be added to this system, and/or the temperature varied, and/or the pH varied, etc.
Section 15.2 of Bethke (2007) provides an example of this "dump" process. Assume:
the mineral calcite is used in the basis instead of HCO, and that the free mole number of the calcite is 0.2708 (corresponding to a free volume of calcite is cm);
the pH is initially 8;
the concentration of Na is 100mmolal;
the concentration of Ca is 10mmolal;
charge balance is enforced on Cl.
MOOSE input file
The GeochemicalModelDefinition defines the basis species, the equilibrium mineral and gas of interest in this problem, as well as using the piecewise_linear_interpolation
flag for accurate comparisons with the Geochemists Workbench software:
[UserObjects]
[definition]
type = GeochemicalModelDefinition
database_file = "../../../database/moose_geochemdb.json"
basis_species = "H2O H+ Na+ Cl- Ca++ HCO3-"
equilibrium_minerals = "Calcite"
equilibrium_gases = "CO2(g)"
piecewise_linear_interpolation = true # for comparison with GWB
[]
[]
(modules/geochemistry/test/tests/time_dependent_reactions/calcite_dumping.i)The TimeDependentReactionSolver defines:
the swaps;
the initial bulk mole number of the aqueous species in the current basis, the free mole number of Calcite and the pH (via the H
activity
);that the system is closed at (the default), so that after this time no more Calcite can be added to the system to maintain its free mole number;
that at the activity constraint is removed on H so that the pH can vary;
that HCl is added at a rate of 0.001mol/s;
using
mode = 1
, that Calcite is dumped from the system after each time-step (calcite never precipitates in this example, so the dumping actually only happens at the first time-step).
[TimeDependentReactionSolver]
model_definition = definition
geochemistry_reactor_name = reactor
swap_out_of_basis = "HCO3-"
swap_into_basis = "Calcite"
charge_balance_species = "Cl-"
constraint_species = "H2O Calcite Ca++ Na+ Cl- H+"
constraint_value = " 1.0 10 0.01 0.1 0.11 -8"
constraint_meaning = "kg_solvent_water free_mineral bulk_composition bulk_composition bulk_composition log10activity"
constraint_unit = " kg cm3 moles moles moles dimensionless"
ramp_max_ionic_strength_initial = 10
remove_fixed_activity_name = 'H+'
remove_fixed_activity_time = 0
source_species_names = 'HCl'
source_species_rates = 1E-3
mode = 1 # in this case, Calcite never re-precipitates, so never need to turn the dump option off
stoichiometric_ionic_str_using_Cl_only = true # for comparison with GWB
execute_console_output_on = '' # only CSV output for this test
[]
(modules/geochemistry/test/tests/time_dependent_reactions/calcite_dumping.i)The Executioner
provides meaning to time, in particular that 100s is used, so a total of 0.1mol of HCl is added:
[Executioner]
type = Transient
dt = 10
end_time = 100
[]
(modules/geochemistry/test/tests/time_dependent_reactions/calcite_dumping.i)The results presented below were run with a time-step of 1 to improve the appearance of the graphs.
A set of Postprocessors
record the desired information using AuxVariables
automatically added by the TimeDependentReactionSolver:
[Postprocessors]
[cm3_Calcite]
type = PointValue
point = '0 0 0'
variable = 'free_cm3_Calcite'
[]
[pH]
type = PointValue
point = '0 0 0'
variable = 'pH'
[]
[molal_CO2aq]
type = PointValue
point = '0 0 0'
variable = 'molal_CO2(aq)'
[]
[molal_CaCl+]
type = PointValue
point = '0 0 0'
variable = 'molal_CaCl+'
[]
[molal_HCO3-]
type = PointValue
point = '0 0 0'
variable = 'molal_HCO3-'
[]
[molal_Ca++]
type = PointValue
point = '0 0 0'
variable = 'molal_Ca++'
[]
[fugacity_CO2]
type = PointValue
point = '0 0 0'
variable = 'activity_CO2(g)'
[]
[]
(modules/geochemistry/test/tests/time_dependent_reactions/calcite_dumping.i)GWB input file
The equivalent Geochemists Workbench file is
# React script that is equivalent to calcite_dumping.i
data = thermo.tdat verify
conductivity = conductivity-USGS.dat
temperature = 25 C
H2O = 1 free kg
H+ = 8 pH
Na+ = 0.1 mol
Ca++ = 0.01024844 mol
Cl- = 0.12 mol
balance on Cl-
swap Calcite for HCO3-
Calcite = 0.2708 free mol
suppress all
unsuppress Calcite
printout species = long
epsilon = 1e-13
dump
react 0.1 mol of HCl
go
(modules/geochemistry/test/tests/time_dependent_reactions/calcite_dumping.rea)Note the slightly increased Ca bulk composition: this is explained here.
Results
Two cases are run:
The system is brought to equilibrium and then the calcite is "dumped" using
mode = 1
in the input file. After this, 100mmol of HCl is added to the system.The system is brought to equilibrium and but the calcite is not "dumped" using
mode = 0
in the input file. After this, 100mmol of HCl is added to the system.
Bethke (2007) presents the results in Figures 15.6 and 15.7. Both GWB and the geochemistry
module produce the same results, as shown below.
References
- Craig M. Bethke.
Geochemical and Biogeochemical Reaction Modeling.
Cambridge University Press, 2 edition, 2007.
doi:10.1017/CBO9780511619670.[BibTeX]