IGL

Isotope Geochemistry Language, a text format for isotopic process models



Describes IGL 0.5. Page revision 1.0, 2026-07-31.

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)fCr(VI) delta53CrCr(III) delta53Cr
01.0000000000.000000000absent
1000.6065306601.751532144-2.699976435
3000.2231301605.263805399-1.511853957
6000.04978706810.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 remainingRayleighEquilibriumRatio
0.90-0.036-0.0341.05
0.50-0.236-0.1701.39
0.20-0.547-0.2722.01
0.10-0.783-0.3062.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.