Skip to content

Validation: src/calliope/oxygen_fugacity.py

This page tracks the @pytest.mark.reference_pinned tests that anchor the behaviour of calliope.oxygen_fugacity against published sources.

Test id Reference Source page Scope
tests/test_oxygen_fugacity.py::test_oxygen_fugacity_fischer_value_at_2000K_matches_published_fit Fischer et al. (2011)1, EPSL 304, 496, Eq. 2; cross-checked against O'Neill & Eggins (2002)2 doi:10.1016/j.epsl.2011.02.025 Pins the Fischer-vs-O'Neill cross-calibration offset (0.258 dex at T = 2000 K) as the independent anchor, with a secondary regression check on the coded Fischer fit 6.94059 - 28.1808e3 / T and a wrong-buffer discrimination guard against O'Neill & Eggins (2002) at the same T.

Re-derivation note

OxygenFugacity('fischer') implements Fischer et al. (2011) Eq. 2 for the iron-wΓΌstite (IW) buffer:

log10(fO2)_IW(T) = 6.94059 - 28.1808e3 / T

At T = 2000 K this evaluates to:

log10(fO2) = 6.94059 - 14.0904 = -7.14981

Cross-check: O'Neill & Eggins (2002) IW at the same T:

log10(fO2) = 2 * (-244118 + 115.559*T - 8.474*T*ln(T)) / (ln(10) * 8.31441 * T)
           β‰ˆ -7.4078 at T = 2000 K

The 0.26 dex offset between the two buffers at 2000 K is the discrimination guard's anchor: a regression that silently dispatches to the wrong buffer would land 0.26 dex away from the expected value.

Default buffer

The CALLIOPE default IW buffer is Fischer (2011). Tests that pin an IW value MUST carry a discrimination guard so a change of default (or an accidental config-side override) does not silently move the test's reference point.

Anchor type

Cross-implementation cross-check plus published benchmark. The independent anchor is the cross-calibration offset between the Fischer (2011) and O'Neill & Eggins (2002) IW fits, which are coded from separate published formulae; the offset is independent of either single fit, so a coefficient error in either moves it and fails the test. The coded Fischer value is pinned as a secondary regression check, and the O'Neill value also serves as the wrong-buffer discrimination guard.

Cross-references

  • src/calliope/oxygen_fugacity.py lines 26-34: implementations of both buffers, with a comment at line 32 pinning the 8.31441 constant to the literal O'Neill & Eggins (2002) value (do not replace with constants.R_gas).
  • docs/Explanations/oxygen_fugacity.md: user-facing concept page with the empirical anchor (Earth ~ IW+3.5, Mars ~ IW, Mercury IW-3 to IW-5) for both buffers.
  • docs/Explanations/cross_backend_comparison.md: empirical comparison of CALLIOPE Fischer vs atmodeller Hirschmann combined, showing the 0.16 dex residual at Earth fiducial after the buffer-default flip.

References


  1. R. A. Fischer, A. J. Campbell, G. A. Shofner, O. T. Lord, P. Dera, V. B. Prakapenka, Equation of state and phase diagram of FeO, Earth and Planetary Science Letters, 304, 496-502, 2011. SciX

  2. H. St. C. O'Neill, S. M. Eggins, The effect of melt composition on trace element partitioning: an experimental investigation of the activity coefficients of FeO, NiO, CoO, MoO\(_2\) and MoO\(_3\) in silicate melts, Chemical Geology, 186, 151-181, 2002. SciX