Worked examples
Each of these is a complete file. The expected values are given where a closed form exists, so a run that disagrees can be traced without arbitration.
Rayleigh distillation, driven by first-order kinetics
A closed reservoir whose Cr(VI) is reduced at a constant rate. Every quantity has a closed form, which is what makes it a reference rather than a demonstration.
TITLE
Rayleigh distillation, driven by first-order kinetics
META
language 0.5
UNITS
time d
STANDARD
standard NIST-SRM-979 0.11339 ratio 53Cr/52Cr
ISOTOPES
ratio 53Cr/52Cr standard NIST-SRM-979
SPECIES
species Cr(VI)
species Cr(III)
PARAMETERS
k_red = 0.005 1/d
RESERVOIR Groundwater
volume 1 L
Cr(VI) 1 umol/kgw
delta53Cr 0 permil
PROCESS Reduction
type reduction
reactant Cr(VI)
product Cr(III)
location Groundwater
FRACTIONATION Reduction
isotope 53Cr/52Cr
epsilon -3.5
KINETICS Reduction
rate first_order
constant k_red
MODEL Decay
progress time
step 1 d
until time >= 600 d
OUTPUT
variable time
variable Groundwater.Cr(VI).remaining
variable Groundwater.Cr(VI).delta53Cr
variable Groundwater.Cr(III).delta53Cr
every 5 d
With f = exp(-kt) and a = 1 + epsilon/1000, the
residual is 1000 ((1 + d0/1000) f^(a-1) - 1) and the cumulative
product follows from mass balance.
| t (d) | f | Cr(VI) delta53Cr | Cr(III) delta53Cr |
|---|---|---|---|
| 0 | 1.000000000 | 0.000000000 | absent |
| 100 | 0.606530660 | 1.751532144 | -2.699976435 |
| 300 | 0.223130160 | 5.263805399 | -1.511853957 |
| 600 | 0.049787068 | 10.555318445 | -0.553053262 |
The bulk composition of the reservoir stays at zero throughout. A closed system does not change its own composition, and a run that drifts has broken mass balance while possibly getting every delta right, which is why the conformance suite states that as an invariant of its own.
Equilibrium is not a distillation
The same extent and the same factor under the two laws differ by a factor that
grows with the extent. Declaring regime equilibrium is what
selects the closed-system equilibrium equation; a model that leaves it unstated
gets Rayleigh.
| Fraction remaining | Rayleigh | Equilibrium | Ratio |
|---|---|---|---|
| 0.90 | -0.036 | -0.034 | 1.05 |
| 0.50 | -0.236 | -0.170 | 1.39 |
| 0.20 | -0.547 | -0.272 | 2.01 |
| 0.10 | -0.783 | -0.306 | 2.56 |
Fitted against measurements with the wrong law, an adsorption experiment returns a fractionation factor two and a half times too large by the time nine tenths has adsorbed, and nothing on screen says so.
A factor taken from a database
No fractionation factor is written in this model. It is resolved from a database, and the results file names the citation the value came from.
DATABASE
file "cr_53cr_52cr.igdb"
CONDITIONS
temperature 15 C
pH 7.0
PROCESS Oxidation
type oxidation
reactant Cr(III)
product Cr(VI)
from Soil
into Groundwater
extent 0.6
Three entries answer that query. Two state a pH range excluding 7.0 and one states a range containing it, so coverage decides. Had all three remained, the run would have stopped: a database that answers two ways has not decided, and choosing for the reader would hide that.
Chemistry from PHREEQC
PHREEQC owns the speciation and IGL owns the isotopes. The referenced input runs on its own in PHREEQC's own tooling; nothing in IGL writes into it.
PHREEQC Speciation
input file "groundwater.pqi"
database "minteq.v4.dat"
mode series
export "pH" to water_ph
FRACTIONATION Reduction
isotope 53Cr/52Cr
law
epsilon = -3.5 + 0.25 * water_ph
Under mode series every state the backend recorded is kept and the
exported parameter is read at the model's current instant: the last recorded
state at or before it, held until the next. The engine does not interpolate. A
straight line between two states asserts a trajectory the backend did not
report, and the reason for running a chemistry engine is that its trajectory is
not something to guess.