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.pylines 26-34: implementations of both buffers, with a comment at line 32 pinning the8.31441constant to the literal O'Neill & Eggins (2002) value (do not replace withconstants.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
-
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. ↩
-
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. ↩