03 - Saturation Indices with PHREEQC¶
Are these waters saturated in calcite, dolomite and gypsum? The first two akva examples answer their questions from the analysis alone. This one cannot: saturation depends on speciation, and speciation needs a chemical model. So the samples’ table becomes PHREEQC’s input, and the campaign is speciated one sample at a time.
This is the pattern worth taking from the example. A table of measurements and a chemical model are joined by making the model’s input parameterised and then feeding it a row at a time – which is how a whole sampling campaign gets run through PHREEQC without writing an input file for each sample.
28 balanced samples from three of the wells of 01 - Ion Balance and Water Types are used. Their pH and temperature are synthetic, as is the rest of the data set.
An input with holes in it¶
The PHREEQC input defines one solution, and everything that varies between samples is a parameter rather than a number:
# One water sample, its values from the samples' table (the Discrete
# Parameters study sets each parameter from one row per simulation).
SOLUTION 1
temp @{$T$}@
pH @{$pH$}@
units mg/l
Ca @{$Ca$}@
Mg @{$Mg$}@
Na @{$Na$}@
K @{$K$}@
Cl @{$Cl$}@
S(6) @{$SO4$}@ as SO4
Alkalinity @{$HCO3$}@ as HCO3
END
@{$...$}@ substitutes the value of an expression before PHREEQC sees the
input, so what reaches PHREEQC is always an ordinary, valid input file.
The two as clauses matter as much as the numbers. Sulphate is reported by
the laboratory as SO4 and alkalinity as HCO3, and PHREEQC is told so rather
than being left to assume: the element totals it works with are S and C, and
the conversion depends on which species the figure was reported as. Getting
this wrong is a quiet error – the run succeeds and the indices are wrong.
The selected output asks for pH, temperature and the saturation indices of calcite, dolomite and gypsum: three minerals, nine or so numbers per sample, rather than the whole speciation of each.
Every parameter has a value of its own as well – a plausible water, 15 °C,
pH 7.2, Ca 100 mg/l and so on. The One sample PHREEQC study runs that
single water, and it exists so the model can be checked before anything is
swept over it.
One simulation per row¶
The Every sample study is a Discrete Data Study. Where a parametric
study sweeps a range of values, this one takes its values from a table: it is
pointed at the imported samples, and each parameter is mapped to a column of
them –
T <- #T#
pH <- #pH#
Ca <- #Ca#
...
sample <- #name#
– and it runs the study it targets once per row. 28 rows, 28 PHREEQC
simulations, each with that sample’s own composition. The sample
parameter carries the name along so the results can be labelled.
The result¶
The saturation index of each mineral for every sample, with the samples as categories along the x axis. Above zero the water is supersaturated and the mineral would precipitate; below zero it is undersaturated and would dissolve. Within roughly ±0.3 the water is at equilibrium as far as the uncertainty of an analysis can tell – which is why the band matters more than the sign of a small number.¶
Calcite runs from 0.05 to 1.23, with 25 of the 28 samples above +0.3. Dolomite runs from 0.43 to 2.22. Gypsum is below zero everywhere, between -1.67 and -0.77.
So these waters would precipitate carbonates – in the well, in the pipework, or wherever they lose CO2 – and would dissolve gypsum where they meet it. That is a practical conclusion about scaling, reached from a table of major-ion analyses and a ten-line input file.
The carbonate indices are driven mainly by pH, which is synthetic here. With measured pH and temperature, this same project speciates a whole campaign unchanged.
Source¶
Parkhurst, D. L. and Appelo, C. A. J. (2013). Description of input and examples for PHREEQC version 3: a computer program for speciation, batch-reaction, one-dimensional transport, and inverse geochemical calculations. U.S. Geological Survey Techniques and Methods, book 6, chapter A43. The
phreeqc.datdatabase and the speciation calculation are PHREEQC’s.
The data set is synthetic.