Skip to content

Validation against published data ​

Before this page

Validation against Reaktoro, whose comparison this page completes, and Standard states, since the checks below compare standard properties with the solubility products derived from them.

Validation against Reaktoro compares this package against another code reading the same database. That comparison cannot see an error in the database itself: both codes would make it together, agree perfectly, and be wrong.

This page is the other half. It checks the vendored data and the package against the papers the data came from — first the Cemdata18 article (Lothenbach et al., 2019), which publishes its solubility products and the standard properties they were derived from, so the two can be required to agree; then a set of measured solution compositions (Atkins et al., 1992), which can disagree with the database and does.

Thermodynamic quantities behind these comparisons

The two laws, and what the Gibbs energy measures distinguishes heat transfer, enthalpy differences and kinetic heat rates. Absolute entropy and entropy of formation explains why tabulated species entropy is not formation entropy, while Apparent and formation Gibbs energies fixes the reference convention used when rebuilding the database potentials. Agreement in a solubility product at one temperature does not validate a heat-capacity model or a heat-of-hydration trajectory.

Every number below is pinned by an assertion in test/cemdata18_reference.jl, test/lothenbach2010_reference.jl, test/lothenbach2008_reference.jl, test/atkins1992_reference.jl, test/limestone_blending_reference.jl, test/chloride_binding_reference.jl, test/hong_glasser1999_reference.jl or test/duan2016_reference.jl, so it is checked on every CI run — pinned, not merely bounded.

The distinction is what makes a page like this worth reading. A threshold that says a disagreement is under 0.05 leaves the 0.041 printed beside it free to drift to 0.047 while the suite stays green and the page goes quietly stale. Every displayed value is therefore asserted at the precision it is printed to, which is half of its last digit.

The one class of number that is not pinned

The timings. The seconds quoted for a cold and a warm solve measure one machine. Asserting them would make the suite fail on a faster one without anything being wrong, which is the opposite of what a test is for. Every rung of every sweep in the tables below is computed and pinned, including those that only illustrate a trend.

What has been checked ​

Twelve sources, more than thirteen hundred assertions, and the coverage is uneven on purpose: the database is checked exhaustively because it is cheap to check exhaustively, while the equilibrium cases are checked one composition at a time because each one costs seconds to minutes.

whatagainsthow closelywhere it stops
every solubility product in CEMDATA18 as read — 54 phasesLothenbach et al. (2019) Tables 2-352 close to 0.040, 50 to 0.005two M-S-H end members, defined in the file by reactions whose log K coefficients give at 25 °C 0.17 and 0.11 more than the tabulated log Ks0
standard properties and HKF coefficients, 19 aqueous species and 7 gasesLothenbach et al. (2019) Tables D.1-D.2exact, all seven coefficients eachnitrite-AFm needs the NO2- of another file, and Fe-Friedel's salt is in ChemistryLab's chloride extension only; both close there
each record's ΔfG°, ΔfH° and S° against one anotherthe file's own element entropies78 of 143 crystalline records to 1 J/mol, 126 to 100 J/molthe two M-S-H end members miss by kilojoules at either temperature
HKF away from 298.15 K, 1 barDuan et al. (2016) Table 4, HKF column0.03 % at the reference point; 0.3 % across a factor 2.9 in pressurethe K₄ of one row matches the HKF value at 1 bar and the K₃ of the same row at 1000 bar
calcite log Ksp at 25 °Cthe accepted value, (Plummer and Busenberg, 1982)−8.480 against −8.48differs by 1.3 log units at 478 K from the non-HKF method of Duan et al. (2016)
a measured solution over a two-phase assemblageAtkins et al. (1992) Table 2Al and pH agree, robustlySi is ×5 and Ca has a floor the model cannot leave; the other 9 of the 10 mixtures fall outside what this comparison can test
the carboaluminate sequence under limestoneKulik et al. (2021) Fig. 7A, (Lothenbach et al., 2019) Figs. 13-14order and thresholds reproduce; iron partition exactonly appears when Al exceeds Fe — see below
chloride binding and the AFm → Friedel transitionGuo et al. (2018) Fig. 1(b)plateau to 1 %, both conservation laws closepH not compared, the paper giving no alkali concentrations; above 2 % NaCl the activity model is out of range
the previous generation, Cemdata07's 29 solubility productsLothenbach (2010) Table 111 unchanged to the printed digit, from the package's own energies9 revised, by up to 1.6 log units; 9 have no CEMDATA18 solid of the same composition
the molar volumes of 28 solidsLothenbach et al. (2008) Table 4, cemdata200724 within half the printed digitthe other 4 by up to 1.7 cm³/mol, three of them iron phases
the formation energies of the same solidsLothenbach et al. (2008) Table 421 solids and water the same to 0.01 kJ/mol7 revised by up to 10 kJ/mol; another hydration state costs the water's energy, within 3 %
an aged pore solution against portlandite and ettringiteLothenbach (2010) Table 2within a quarter of a log unit of saturationwhich side depends on the activity model at I ≈ 0.5 mol/kg
alkali uptake by C-S-H, 4 Ca/Si × 6 concentrations × Na and KHong and Glasser (1999) Tables 1-2pH to 0.072 from 15 to 100 mM below Ca/Si 1.8alkali over-bound at 46 of 48 points; the end members were fitted to these data
a measured paste through its first year, a CEM I 42.5 NLothenbach and Winnefeld (2006) Tables 1-4, and GEMS3K on the same budgetsGEMS3K to 0.001 in pH and 1.6 % on every element; the potassium and sulfate of the first daysodium a tenth of the measurement at a year, the C-S-H holding 96 % of it: the page
four blended pastes, CEM I to CEM II/B-M (V-LL)De Weerdt et al. (2011) Tables 1-4, 7-8 and Fig. 7, and GEMS3K on the same budgetsGEMS3K to 0.001 and 1.6 %; portlandite without fly ash within 1.5 wt.% from 7 dayswith fly ash, portlandite 4.5 against 12.5 wt.% at 90 days, CSHQ taking no aluminum: the page
four carbonated mortars, a CEM I 52.5 N with limestone and metakaolinShi et al. (2016) Tables 1-3 and 5, and GEMS3K on the same carbonated budgetsportlandite within 5 % of the TGA without metakaolin; CO₂ binding capacity within 2 % of the authors' calculation in three pastes; GEMS3K to 0.011 in pH and 7 %the metakaolin paste M: a gel richer in calcium (Ca/Si 1.46 against 1.29) and a capacity 7 % low: the page

Two things this chapter deliberately does not do. It does not check the kinetics — Validation against Reaktoro covers the coupling, and the two pastes followed in time take their degrees of reaction from their papers (the measured ones, or the paper's own rate law), so that what they check is the chemistry. And it does not check anything above about 1 mol/kg ionic strength, because HKFActivityModel's B-dot term (Helgeson, 1969) was not fitted there.

Traps ​

Seven things that cost time to find, collected because each is reusable well beyond the case that established it.

A solid entered as oxides loses its water. Feeding a C-S-H as lime and silica gives the solver its calcium and its silicon and none of the 2.1 H₂O per formula unit it carries. On the inventory of Guo et al. (2018) that is 44.5 g per liter of concrete: the solver takes it back out of the pore solution, the pore volume falls from 146 mL to 84, and every concentration is wrong by nearly a factor of two. See Chloride binding.

A cold start is cheap. The certified search starts from the linear program over the pure phases, whatever state it is given, so a cold solve of the limestone system of the next section costs half a second. A warm start, from a neighboring answer, is no faster, and the direction of a sweep matters little: measured on 2026-09-28, the limestone sweep takes 26 s walked up and 40 s walked down. Before the linear program, the cascade of starts made the warm start the only fast one, and the same sweep cost 125 s at one step walked up. See Blending a CEM I with limestone.

Suppress gibbsite below 60 °C. (Lothenbach et al., 2019; §2.1) says so, and it is not a harmless over-specification: left in the phase list it takes over from microcrystalline AlOHmic in the sulfate-poor mixtures and moves the aluminum. See Measured solutions of synthetic hydrates: a measurement, not a calculation for those of Atkins et al. (1992).

The iron decides whether carboaluminates form at all. C3AFS0.84H4.32 takes one aluminum per iron, so the siliceous hydrogarnet is capped by the iron available. On a clinker with Fe₂O₃ = 4.49 % there is enough iron to pair with every aluminum, no monocarbonate forms at any limestone content, and the published sequence simply does not appear. Below about 3.5 % it does. See The sequence, and the iron content it depends on.

Temperature belongs to the state, not to the solve. The solves take T and P from the ChemicalState, and equilibrate, equilibrate_certified and EquilibriumSolver refuse a T or a P passed to them, with an error that names set_temperature!. They refuse it because the mistake is otherwise silent and not small: a keyword the solve does not know goes to the optimizer's options and is dropped there, and at a fixed hydroxide the pH of a pore solution moves by the change in pKw between the two temperatures, 0.17 from 20 to 25 °C — larger than most of the agreements this chapter reports. A measurement made at 20 °C is compared at ChemicalState(cs; T = 293.15u"K"). See The HKF model away from 25 °C and 1 bar.

A surface species' standard energy is on the aqueous gauge, not its own. The site occupancies are driven by ΔₐG⁰ like everything else, so a complex formed from an aqueous ion has to carry that ion's formation energy:

≡SOH + M^z ⇌ ≡SOM^(z−1) + H⁺     ⟹     G(≡SOM) = G(M^z) − RT ln K

with G(≡SOH) = G(H⁺) = 0 fixing the gauge. Setting G(≡SOM) = −RT ln K and dropping G(M^z) is off by 553 kJ/mol for calcium — and it does not produce a wrong answer, it produces 0.00000 mol of every cation complex while the solve still certifies. Deprotonation keeps working throughout, because ≡SO⁻ is the one complex whose reaction involves no aqueous species but H⁺, so the omission is invisible on the row most likely to be checked first. test/surface_complexation.jl carries the same warning at its zinc case.

G(H⁺) = 0 is the database's own convention. G(≡SOH) = 0 is a gauge only while the site budget is fixed: both sides of every surface reaction carry a site, so the choice cancels, and test/surface_complexation.jl checks that the answer does not move over a 20 kJ/mol shift of the whole family. Under SITES_FOLLOW_HOST it stops canceling: the free sites are counted as part of the host, whose formula already contains their atoms, so the free site has to sit at zero for the host to keep its database energy, and host_coupling_bias reports how far a declaration is from it. See The surface half of the chloride model, after Guo et al. (2018).

A record has its own reference temperature. ΔₐG⁰(T) is anchored to the tabulated ΔfG° at the temperature Tst the record states, which is 293.15 K for eight CEMDATA18 records, the alkali C-S-H and M-S-H end members; a record the file defines by a reaction follows its reaction instead. A 25 °C comparison with one of them goes through ΔₐG⁰(T = 298.15), never through the tabulated number, which is a 20 °C number. See Eight records at 20 °C.

Cemdata18 Tables 2 and 3: the solubility products ​

Lothenbach et al. (2019), Table 2 gives log Ks0 for each phase and writes out the dissolution reaction it refers to; its Table 1 gives the ΔfG° those constants were computed from. Recomputing one from the other through Cemdata18's own aqueous Gibbs energies closes a loop that can only close if the transcription is exact and the two halves of the paper share a reference state.

Transcribing a reaction without transcribing it twice ​

Table 2 writes its reactions over Al(OH)₄⁻, Fe(OH)₄⁻ and SiO(OH)₃⁻. Cemdata18's GEMS primaries (Kulik et al., 2013) are AlO2-, FeO2- and HSiO3-, which differ from those by 2, 2 and 1 H₂O. Transcribing both the substitution and the paper's water coefficients would be two chances to get it wrong, and the second would silently absorb the first.

So only the non-water products are transcribed, and the water is recovered from the hydrogen balance. Oxygen and charge then become free checks — they can only close if the transcribed products are right. They close to 10⁻⁹ on all 54 rows.

Result ​

Each energy enters at 25 °C, the temperature of Table 2, as ΔₐG⁰(T = 298.15). 52 of the 54 rows close. The largest disagreement among them is 0.040 on M8A-OH-LDH, whose published value is quoted to one decimal; 50 are inside 0.005.

Two do not:

phasefrom the file at 25 °Cpublished log Ks0Δin energy
M075SH (M₁.₅S₂H₂.₅)−28.634−28.80+0.1660.95 kJ/mol
M15SH (M₁.₅SH₂.₅)−23.460−23.57+0.1100.63 kJ/mol

Both are M-S-H end members, and the file defines both by their dissolution reactions: their energies follow from the log K(T) of those reactions, as ThermoFun computes them, and the coefficients of that function do not give, at 25 °C, the value the records themselves state. GEMS, run on the same data, does not close them either, by 0.17 and 0.09. With every other phase in the table closing to better than 0.04, the difference lies in the published data for these two phases, not in the transcription.

Eight records at 20 °C ​

Each record of the file states the temperature Tst at which its ΔfG°, ΔfH° and S° are given, and ΔₐG⁰(T) is anchored there: at T = Tst it returns the tabulated ΔfG°, except for the 17 records the file defines by a reaction, which follow it, to rounding for the condensed phases and gases and to 0.3 J/mol for the aqueous species, whose HKF equations of state are evaluated at that point. For 230 of the 238 records, Tst is 298.15 K. For eight it is 293.15 K: the six alkali C-S-H end members (KSiOH, NaSiOH, ECSH1-KSH, ECSH2-KSH, ECSH1-NaSH, ECSH2-NaSH) and the two M-S-H end members. Their energies at 25 °C differ from the tabulated numbers by the 5 K step, close to −S° × 5 K: −208.6 J/mol for KSiOH. GEMS anchors these records in the same way. The two M-S-H end members follow their reactions.

The three formation properties of a record are related by

where is the number of atoms of element in the formula and the element entropy the file itself carries. The package does not use this relation, since it forms ΔₐG⁰ from ΔfG°; what it measures is therefore the data, not the code. Over the 143 crystalline records it holds to 1 J/mol for 78 and to 100 J/mol for 126. The six alkali C-S-H end members satisfy it exactly at 293.15 K and miss it by about 0.8 kJ/mol at 298.15 K, which identifies their numbers as 20 °C numbers. The two M-S-H end members satisfy it at neither temperature:

phaseresidual at 293.15 Kat 298.15 KTable 2 offset at 25 °C
M075SH−6.61 kJ/mol−1.79 kJ/mol+0.244
M15SH−5.70 kJ/mol−1.73 kJ/mol+0.205

Lothenbach et al. (2019), Table 1, footnote r estimated their entropy and heat capacity from those of talc, chrysotile and water, after (Nied et al., 2016). For M075SH, the tabulated ΔfG°, the value implied by its ΔfH° and S°, and the value implied by its published log Ks0 span 1.4 kJ/mol at 25 °C; a calculation that used the tabulated ΔfG° would give a log Ks0 0.24 above the tabulated one, and its reaction gives one 0.17 above. After these two, the largest residuals belong to five anhydrous aluminate phases of clinker and of calcium aluminate cement, C4AF, C3A, CA2, C12A7 and CA, from 1.6 to 2.5 kJ/mol.

Appendix D: what the solubility products cannot test ​

Table 2 exercises the ΔfG° of the aqueous primaries hard — a drift in any one of them breaks dozens of reactions at once — but says nothing about S°, Cp°, V° or the HKF equation-of-state coefficients, which are what carry the database away from 25 °C and 1 bar. Those are checked directly against (Lothenbach et al., 2019; Tables D.1 and D.2), on 19 aqueous species and all seven gases.

Two conventions of the printed tables have to be undone first.

The HKF columns are scaled. Table D.1 prints a₁·10, a₂·10⁻², a₄·10⁻⁴, c₂·10⁻⁴ and ω⁰·10⁻⁵, in the calorimetric units the HKF papers use (Helgeson et al., 1981; Shock et al., 1992). For Ca²⁺:

a₁a₂a₃a₄c₁c₂ω⁰
printed−0.1947−7.25205.2966−2.47929.0000−2.52201.2366
in the file−0.01947−725.205.2966−247929.0−25220123660

All seven match on all 19 species, which is what makes the reading of the scaling more than a guess.

Table D.1 gives the volumes in cm³/mol. Its column header reads V⁰ (J/bar); Ca²⁺ is listed at −18.44, that is −18.44 cm³/mol, which the file stores as −1.8439 J/bar.

Table D.2's gas column, under the same header, really is J/bar — 2479 J/bar is 24.79 L/mol, the ideal-gas molar volume at 298.15 K and 1 bar, which is what the package's RT/P gives a gas there. The two tables share a header and not a unit.

What the file does not carry ​

Two rows of (Lothenbach et al., 2019; Table 2) cannot be checked on the shipped file alone. The test asserts what is missing, so that a database update which adds it turns this note red rather than leaving it stale, and checks each row where it can be.

rowwhat the shipped file lackswhere it is checkedrecomputed − printed
nitrite-AFm, log Ks0 = −26.24NO2-: the solid mononitrite is presentwith the NO2- of slop98-inorganic-thermofun.json, whose Ca+2, NO3- and water are the same records as Cemdata18's (its OH- is 27 J/mol off, and Cemdata18's is used)0.000
Fe-Friedel's salt, log Ks0 = −28.62the phasein cemdata18-chloride.json, where ChemistryLab writes it from Table 1 (the chloride extension)0.011

The record of Fe-Friedel's salt is the row of Table 1, its heat capacity the printed polynomial with its T^{-1/2} term, and its enthalpy the one that note l of the table says was recalculated from its Gibbs energy and entropy: with the entropies of the elements that the Cemdata18 file carries, ΔfH° − T ΔfS° − ΔfG° closes to −0.02 kJ/mol. Its partner in the ideal solid solution of note k, Friedel's salt, is the phase Friedel_AlFe of data/solid_solutions.toml.

Measured solutions of synthetic hydrates: a measurement, not a calculation ​

Atkins et al. (1992), Table 2 report analyzed solution compositions for slurries of synthetic hydrates in CO₂-free water at 25 °C, two to four solids at a time. Ten mixtures are tabulated. One of them can be compared quantitatively; the table at the end of this section gives what the other nine would require.

The one that can: ettringite + C-S-H ​

Nominal C-S-H at Ca/Si = 0.9, measured at six months (mmol/L):

measuredcalculated
Al0.1360.149agreement
pH11.011.33agreement
SO₄1.081.18close, but see below
Si0.0760.396×5.2
Ca1.952.72+40 %

Aluminum is the strong result. Across the sweep of the C-S-H Ca/Si below, from 0.75 to 1.0, it stays between 0.142 and 0.157 mmol/L. That is the database answering, not a fit. The model of Atkins et al. (1992) gave 0.398 mmol/L on the same mixture.

Silicon is over-predicted for a reason the paper gives. The model of Atkins et al. (1992) gave 0.448 mmol/L on the same mixture, and they explain it: electron microscopy showed the ettringite had taken up silicon, "substituting on average for 40 % of the available SO₄ sites", which "would tend to lower aqueous Si concentrations, and increase SO₄ levels as observed". Cemdata18 carries no Si-bearing AFt end member either, so the same silicon has nowhere to go and stays in solution.

Calcium is a disagreement the model cannot absorb, and the obvious escape does not work. Atkins et al. (1992) report that their C-S-H dissolved incongruently over the test, which would have lowered its Ca/Si below the nominal 0.9 — and a lower Ca/Si ought to mean less calcium in solution. It does not:

C-S-H Ca/SiCaAlSiSO₄pH
0.753.460.1570.5042.5111.00
0.803.060.1540.4651.9211.13
0.852.830.1520.4291.5011.24
0.902.720.1490.3961.1811.33
1.002.720.1420.3390.7611.47
measured1.950.1360.0761.0811.0

The sweep holds the lime and varies the silica, and every row is pinned to the digits above. Calculated calcium is flat between Ca/Si 0.9 and 1.0 and rises below it, the direction incongruent dissolution would take it; it never approaches 1.95. The floor is a property of the CSHQ model, not of the mixture: The model of Atkins et al. (1992), on the same nominal C-S-H, gave 2.04.

Sulfate lands close, but it is the one number here that moves freely with the Ca/Si — 0.76 at 1.0, 2.51 at 0.75 — so the agreement is not evidence of much. The model of Atkins et al. (1992) gave 0.597; Cemdata18 gives 1.18, against 1.08 measured.

Gibbsite has to be suppressed, and it changes the answer

Lothenbach et al. (2019), §2.1 says its precipitation "should be suppressed for calculations at ambient temperatures, where microcrystalline Al(OH)₃ will form instead". Leaving Gbs in the phase list is not a harmless over-specification: it takes over from AH₃ in the sulfate-poor mixtures and moves the aluminum.

What the other nine mixtures would require ​

reasonevidence
the solid-to-water ratio is not reported, and these assemblages are not invariantwherever a C-S-H buffers the calcium, a fourfold change in loading moves the answer by a factor of two: mixture 1 (AFt + CSH 1.7) gives Ca = 8.0 mmol/L at one loading and 16.0 at four times it, against 2.67 measured
four mixtures grew a phase Atkins et al. (1992) identify as metastable, so the measured solution is not an equilibrium oneAFm in mixture 3, C₄AH₁₃ in 8 and 21, siliceous hydrogarnet in 30 — the paper says so itself and uses them to argue the point
two are in 0.4 M NaOHpast the range the B-dot term in HKFActivityModel was fitted for (I ≲ 1 mol/kg, and less for the water activity); a Pitzer model would be the honest instrument

Atkins et al. (1992), Table 3 — pore fluids of five-year-old OPC, 30 % BFS and 30 % FA pastes — is a better target for a future test: alkali and pH are reported and the binder compositions are given. It needs the alkali uptake of the CSHQ Na/K end members and belongs with the CEM I/II examples.

Blending a CEM I with limestone ​

Kulik et al. (2021) Fig. 7A and Lothenbach et al. (2019) Figs. 13-14 report the same thing: what happens to the aluminate phases as limestone replaces clinker. CemGEMS is the closest oracle this package has — same CEMDATA18, same Gibbs-energy minimization, and Kulik et al. (2021) state that it and GEM-Selektor agree exactly. What it does not give is the cement it ran on, so what is checked is the part that does not depend on it: the order the phases appear in, where added limestone stops reacting, and where the iron goes.

The iron ​

(Lothenbach et al., 2019; Fig. 14D) is the sharpest quantitative claim in either paper: with Cemdata18 "close to 100 % of the iron is bound by the siliceous hydrogarnet solid solution", against about 80 % sitting in hemi-/monocarbonate under Cemdata07.

Measured here: 100.0 %, at every limestone content and every iron content tried, from 0.5 to 4.49 % Fe₂O₃, to within 10⁻³. That one reproduces without qualification.

The sequence, and the iron content it depends on ​

Kulik et al. (2021) and Lothenbach et al. (2019) both report

monosulfate  →  hemicarbonate  →  monocarbonate + ettringite  →  free calcite

It does not appear on every CEM I. On the oxide analysis this repository uses elsewhere — Fe₂O₃ = 4.49 % — no carbonate AFm forms at any limestone content, the added calcite stays inert, and every aluminum ends in the mixed Al-Fe siliceous hydrogarnet. That is precisely the behavior (Lothenbach et al., 2019) §3.1 attributes to Cemdata07 and says Cemdata18 cures.

It is not a defect, and the mechanism is stoichiometric. C3AFS0.84H4.32 takes one aluminum per iron, so the phase is capped by the iron available. Sweeping Fe₂O₃ at 4 g of limestone, the balance going to CaO:

Fe₂O₃ %4.493.502.501.501.000.50
siliceous hydrogarnet0.04870.03960.02830.01700.01130.0057
monocarbonate00.00310.00830.01350.01610.0187

The test walks the six iron contents at 4 g of limestone, downhill from the ferriferous clinker, and every column is pinned — the hydrogarnet amount, which this section turns on, as well as the monocarbonate.

The hydrogarnet tracks the iron one for one. Where there is enough iron to pair with every aluminum, nothing is left to make a carboaluminate; below about 3.5 % there is, and the published sequence returns.

At Fe₂O₃ = 2.5 % the figure comes back step by step (mol per 100 g of binder):

g limestonemonosulfatehemicarbonatemonocarbonateettringitefree calcite
0.00.0090000.00670
0.500.00280.00360.00970
1.0000.00850.00960.0015
4.0000.00830.00930.0317

Half a gram destroys the monosulfate outright and stabilizes the ettringite by more than 40 % — the mechanism the whole figure is about. By one gram the hemicarbonate is spent and calcite begins to survive undissolved; past that the limestone is a filler.

A cold solve is as good as a warm one

The certified search begins with the linear program over the pure phases, whatever start it is given. A cold solve of this system costs half a second, and one started from a neighboring answer is no faster (4 s from 1.0 g to 0.8 g of limestone). Measured on 2026-09-28, the sweep takes 26 s walked up from 0 g and 40 s walked down from 4 g, every point certified.

Before the linear program, a cold solve cost about 26 s and the warm start was the only fast one, until a phase appeared or vanished: walked up, the monosulfate-to-carboaluminate switch at 0.5 g then cost 125 s on its own.

Chloride binding ​

Guo et al. (2018) Fig. 1(b) is unusually easy to reproduce, because the paper states its inventory outright instead of leaving it to be reconstructed: per liter of concrete, C-S-H 225 g, CH 90 g, AFm 9 g, AFt 22.5 g, porosity 14.6 %.

Their constants are not CEMDATA18's. Guo et al. (2018), §2 says so — "Cemdata2007 gives Kp and Δ_r G_T^0 for nearly all phases in cement hydrate" — and the note under their dissolution table points at Lothenbach et al. (2008), which is Cemdata07. The Cemdata07 table of Lothenbach (2010) confirms it: its ettringite, monosulfate and jennite-type C-S-H are the −44.9, −29.26 and −13.17 that Guo et al. (2018) print as −44.9085, −29.2628 and −13.1659 (see Cemdata07, and an aged pore solution). So this is a comparison across database versions, and the interesting question is where the two still agree.

The phases do map one to one, and the molar masses of (Guo et al., 2018; Table 3) settle it: AFm 622.5, AFt 1255.1, Friedel's salt 561.3, CH 74.1 and C-S-H 191.4 all reproduce, to better than 0.03 g/mol, the molar masses the package computes from the CEMDATA18 formulas and from their own C-S-H formula.

The C-S-H carries 44.5 g of water, and it is easy to drop

Guo et al. (2018) write the C-S-H dissolution for (CaO)₅(SiO₂)₃(H₂O)₆.₃, M = 574.1, while their Table 3's 191.4 is one third of that. So 225 g is 1.1755 mol of (CaO)₁.₆₆₇(SiO₂)(H₂O)₂.₁ and carries 2.469 mol — 44.5 g — of water inside the solid.

Entering the C-S-H as lime and silica alone leaves the system 44.5 g short, and the solver then takes that water back out of the pore solution to hydrate the C-S-H: the pore volume comes out at 84 mL against the 146 mL the stated porosity implies, every concentration is wrong by nearly a factor of two, and Friedel's salt appears at 0.1 % NaCl where the paper says it cannot. Counting the water moves the pore volume to 129 mL and the onset back above 0.1 %.

On the phase list that drew the figure ​

The dissolution table of Guo et al. (2018) carries five solids: C-S-H, CH, AFm, AFt and Friedel's salt. Restricted to those, the figure comes back (mol per liter of concrete):

calculatedFig. 1(b)
AFm at 0 % NaCl0.0144559 g / 622.5 = 0.014458
AFt at 0 %0.01792822.5 g / 1255.1 = 0.017927
AFm at 1 %0consumed by ≈ 1 %
AFt plateau0.022740.023
Friedel's salt plateau0.009650.010

What makes the agreement more than two curves happening to sit on top of each other is that both conservation statements behind it close as well. Writing Δ for what the AFm loses:

  • sulfate — the AFm gives up one, ettringite takes three, so ΔAFt = ΔAFm / 3: 0.00482 against 0.014455/3 = 0.004818;

  • aluminum — what the AFm held is split between Friedel's salt and the ettringite that grew, both carrying two aluminums per formula, so FS + ΔAFt = ΔAFm: 0.00965 + 0.00482 = 0.01447, against 0.014455.

What a fuller phase list adds ​

Two things the five solids of Guo et al. (2018) cannot express, and one place where it stops mattering.

The hydration state. CEMDATA18 carries monosulfate at 9, 10.5, 12, 14 and 16 waters, and at these conditions the stable one is the 14-hydrate, not the 12-hydrate of Guo et al. (2018). The difference is one of database versions: their log K = −29.2628 is Cemdata07's value for the 12-hydrate, and Cemdata18 recalculated it to −29.23 — (Lothenbach et al., 2019; Table 2) marks that entry ***, "recalculated in this paper from ΔfG° values" — while carrying −29.26 for the 14-hydrate. Their number therefore lands within 0.003 of CEMDATA18's 14-hydrate by arithmetic coincidence. The amount is the same either way.

Kuzel's salt, half a chloride and half a sulfate per AFm layer, is the phase the transition actually passes through. It holds the entire low-chloride range and peaks at 0.5 % NaCl — where Guo et al. (2018) has Friedel's salt barely starting:

% NaCl0.10.250.50.751.01.5
monosulfate (14-hydrate)0.01310.00850.0010000
Kuzel's salt0.00110.00470.01070.01160.00580
Friedel's salt00000.00480.0096

The sweep solves 0, 0.1, 0.25, 0.5, 0.75, 1, 1.5 and 2 %, and the six columns above are pinned. The largest value is at 0.75 %, but between the rungs the true maximum is not located more finely than that.

And where it stops mattering. Once the chloride is high enough to take the last sulfate out of the AFm layer, Kuzel's salt is gone and the two phase lists agree to three digits. The plateau of Guo et al. (2018) is reproduced, through a different sequence of AFm phases.

Not checked, and why ​

  • The pore volume, which comes out at 129 mL against the 146 mL their 14.6 % porosity states. The 17 mL is the difference between the C-S-H of Guo et al. (2018), carrying 2.1 H₂O per (CaO)₁.₆₆₇(SiO₂), and CEMDATA18's CSHQ end members, which carry more and take the rest out of the pore. Nothing closes that gap without replacing the C-S-H model.

  • pH. Guo et al. (2018) report 13.213 falling to 13.128; this system sits at 12.5, which is portlandite in alkali-free water. The difference is their pore solution's alkalis, whose concentrations they take from an earlier reference without listing them.

  • The 5 % end of their abscissa. At that loading the ionic strength reaches 1.4 mol/L, past the range the B-dot term of HKFActivityModel was fitted for; the solve stops certifying and returns pH 15.3. The sweep here stops at 2 %, where I ≈ 0.4. Pitzer (Pitzer, 1975) is the instrument for the rest.

  • The surface complexation half of the paper — the five ≡SiOH reactions, the diffuse layer, the Ca²⁺ > Cl⁻ > Na⁺ > K⁺ ordering. Four of the five rows can be entered as printed; the surface is not built in this chapter. See The surface half of the chloride model.

The surface half of the chloride model ​

Guo et al. (2018) closes their chloride model with a ≡SiOH surface on the C-S-H — 500 m²/g, 4·10⁻³ mol of sites per gram, a diffuse layer, and five reactions in their Table 1. Four of the five rows can be entered as printed; one cannot.

rowreaction as printedlog Kstatus
1≡SiOH + OH⁻ → ≡SiO⁻ + H₂O−12.7constant belongs to a different reaction
2≡SiOH + Ca²⁺ → ≡SiOCa⁺ + H⁺−9.4usable
3≡SiOH + Cl⁻ → ≡SiOHCl⁻−0.35usable
4≡SiOH + Na⁺ → ≡SiONa + H⁺−13.6usable
5≡SiOH + K⁺ → ≡SiOK + H⁺−13.6usable

The table is that of Elakneswaran et al. (2010): its Eq. (11) is row 1 with the same −12.7, its Eq. (13) row 3 with the same −0.35, and its Eqs. (15) and (16) rows 4 and 5. Row 1 is therefore as Elakneswaran et al. (2010), Eq. 11 write it.

Written against OH⁻, a constant of 10⁻¹²·⁷ gives ≡SiO⁻/≡SiOH = 10⁻¹³·⁷ at pH 13, an uncharged surface, whereas Elakneswaran et al. (2010) report a negative ζ potential at that pH and relate it to this dissociation. In the proton form, ≡SiOH ⇌ ≡SiO⁻ + H⁺, the same constant gives a ratio of 2 at pH 13, two thirds of the sites deprotonated before electrostatics, consistent with that surface; against OH⁻ it would correspond to log K ≈ +1.3. Choosing between the two readings is a modeling decision, and this chapter does not make it.

Row 3, the chloride row, is balanced: the product carries the charge of the chloride it took up, ≡SiOHCl⁻, as both Guo et al. (2018) and Elakneswaran et al. (2010) print it. It is the row the surface exists to provide.

Two things of Elakneswaran et al. (2010) are not in the table of Guo et al. (2018). Its Eq. (14), ≡SiOH + Ca²⁺ + Cl⁻ ⇌ ≡SiOCaCl + H⁺, holds chloride on a site that has already taken up calcium. And its double layer is written in the Donnan approximation, the ions of the layer related to those of the free solution by a Boltzmann factor and the layer kept electrically neutral (its Eqs. (9)-(10)). The surface is not built here: it belongs with a model of chloride binding by C-S-H, and this chapter checks the dissolution half only.

The machinery is not what is missing ​

Worth separating, because the two failures look alike from the outside. The site-family route reproduces the chemistry it is given. On a 1 kg pore solution holding 20 mmol Ca, 100 mmol NaCl and 10 mmol KCl, with rows 1, 2, 4 and 5 and DiffuseLayer, every point certifies and the occupancies behave:

sites, site model≡SiOH≡SiO⁻≡SiOCa⁺≡SiONa≡SiOK
0.90 mol, as in Guo et al. (2018), DiffuseLayer0.9390.0380.0220.00070.0001
1/100 of that, ideal mixing0.1750.1200.7040.00110.0001
1/100 of that, DiffuseLayer0.2170.3760.4060.00130.0001

Three checks on those numbers, none of which needs Guo et al. (2018).

The inventory bounds the calcium. At the loading of Guo et al. (2018) there are 0.9 mol of sites and 0.02 mol of calcium in the entire system, so the calcium fraction cannot exceed 0.02/0.9 = 0.0222 — and it sits at 0.0219. The surface has taken essentially all of it, and the ceiling is the inventory, not the affinity.

The alkali competition is exact. Rows 4 and 5 share a log K, and both cations are monovalent, so the competitive closed form collapses to

≡SiONa / ≡SiOK = a(Na⁺) / a(K⁺)

with the site capacity, the shared denominator and the proton activity all canceling. At one hundredth of the loading the surface removes 9.5·10⁻⁶ mol of sodium out of 0.1, so the free concentrations still stand at 10.000 — and the occupancy ratio comes out 9.864. The residual 1.4 % is γ(Na⁺)/γ(K⁺), the one term the cancellation leaves behind. That is a check on the site mixing itself, not on any constant.

The diffuse layer pushes the right way. At 70 % ≡SiOCa⁺ against 12 % ≡SiO⁻ the surface carries +0.58 charge per site, so the electrostatic term must repel Ca²⁺ and favor deprotonation — which is the 0.704 → 0.406 shift in the last two rows. The sign is worth checking explicitly, because the intuition that a silanol surface is negative is wrong here: calcium has reversed it.

What a budget that follows the C-S-H would cost ​

The numbers above hold a fixed site budget, which is the wrong idealization for this system: the C-S-H is a reaction product, so its amount moves and the sites should move with it. SITES_FOLLOW_HOST expresses that, and at the density of Guo et al. (2018), 4·10⁻³ mol/g on a (CaO)₁.₆₆₇(SiO₂)(H₂O)₂.₁ of 191.4 g/mol, the coupling ratio is ν = 0.766 mol of sites per mol of host, nearly four times the ν = 0.2 of Dzombak and Morel (1990) for hydrous ferric oxide. What prevents it here is not the size of ν but the calcium: the sites of Guo et al. (2018) bind calcium, and a C-S-H whose composition already includes the calcium of its surface cannot also carry it on the sites. The construction of the system refuses a family that binds calcium on the CSHQ solid solution for that reason, and the fixed budget used above is the published model as Guo et al. (2018) write it.

For a surface case that is checked against an external oracle, see test/surface_complexation.jl, which runs against PHREEQC (Parkhurst and Appelo, 2013) at matched proton activity, and test/diffuse_layer.jl.

The HKF model away from 25 °C and 1 bar ​

The Cemdata18 section above pins every HKF equation-of-state coefficient in the shipped file. Nothing there pins what the model does with them once the temperature and pressure leave the reference point — and that is the half that carries a burial, an autoclave or a steam-cured calculation.

Duan et al. (2016), Table 4 give, for two reactions, constants computed by HKF itself, taken from Yu, Dong and Ruan (2008), at two temperatures. That column is the HKF reference of this chapter, and the only one.

ChemistryLab(Duan et al., 2016; Table 4)difference
K₃ (HCO₃⁻ ⇌ H⁺ + CO₃²⁻), 298.15 K, 1 bar4.6885×10⁻¹¹4.69×10⁻¹¹−0.03 %
K₄ (H₂O ⇌ H⁺ + OH⁻), 298.15 K, 1 bar9.9971×10⁻¹⁵1.00×10⁻¹⁴−0.03 %

The pressure column, read in bar ​

Duan et al. (2016), Table 4 is headed P(Pa) and lists 1.0 and 1000.0; read in bar, the second row agrees with this package. At 373.15 K the published K₃ is 2.42×10⁻¹⁰, against

pressureK₃difference
1 bar8.240×10⁻¹¹−66 %
1000 bar2.412×10⁻¹⁰−0.3 %

Reproducing a factor of 2.9 in pressure to three parts in a thousand is a real check of the volume terms, and it is the strongest single piece of evidence in this chapter that the HKF implementation is right away from the reference point.

K₄ of that row corresponds to 1 bar

K₄ does not agree at 1000 bar. It matches at 1 bar — 5.504×10⁻¹³ against the 5.38×10⁻¹³ of Duan et al. (2016), 2.3 % — and differs by 14.7 % at 1000 bar. Water autoprotolysis at 100 °C and 1 bar is pKw = 12.26, so the K₄ of that row agrees with the 1 bar value.

Calcite, and a method that is not HKF ​

Duan et al. (2016), Table 6 give calcite over 298–478 K and 0.1–70 MPa, computed with their own Gibbs-energy integration and SRK volumes rather than with HKF, so the two columns below compare two methods. At 25 °C and 1 bar this package gives −8.480 and Duan et al. (2016) give −8.53; the value of Plummer and Busenberg (1982) is −8.48.

T (K)P (MPa)ChemistryLabDuan et al. (2016)Δ
298.150.1−8.480−8.53+0.05
301.1515−8.344−8.53+0.19
301.1550−7.999−8.03+0.03
301.1570−7.814−7.82+0.01
343.1515−8.772−8.69−0.08
418.1540−9.643−9.06−0.58
478.1515−10.995−9.69−1.30

Both agree on the two signs a burial calculation turns on — heating dissolves less, compressing dissolves more — and on how much compressing dissolves: at 301 K the two methods are within 0.03 at 50 and 70 MPa. That agreement needs the volume of the crystal, 36.9 cm³/mol, in its standard energy: left out, compression acts through the ions alone, and 70 MPa comes out 0.44 short. The 15 MPa row of Duan et al. (2016), Table 6 is the exception: it gives the 0.1 MPa value, −8.53, whereas the 50 and 70 MPa rows differ by 0.21 over 20 MPa.

With temperature the two diverge steadily, this package giving the lower solubility. Duan et al. (2016), Table 4 report their method within 3 % of HKF on K₃ and K₄, which is 0.01 log units; on calcite at 478 K the two methods differ by 1.3 log units, and the origin of that difference is not identified here.

Cemdata07, and an aged pore solution ​

Lothenbach (2010) reviews what equilibrium calculations do for cements, and its Table 1 lists the solubility products it computed with: those of Cemdata07, the generation before the one this package reads, for 29 solids. It prints no Gibbs energy and no molar volume, only the constant and its reaction. Read through the package's own energies, the same reactions separate what Cemdata18 kept from what it revised.

phases
the same to the printed digit (11)ettringite, tricarboaluminate, Fe-ettringite, monocarbonate, hemicarbonate, strätlingite, hydrotalcite (M₄AH₁₀), tobermorite-type C-S-H, amorphous silica, syngenite, amorphous Al(OH)₃
revised (9), ours minus Cemdata07Fe-monosulfate +1.63, C₃AH₆ +0.34, C₄AH₁₃ +0.15, monosulfate +0.026, jennite-type C-S-H +0.007, thaumasite −0.10, CAH₁₀ −0.10, C₃FH₆ −1.14, C₄FH₁₃ −1.35
no CEMDATA18 solid of the same composition (9)siliceous hydrogarnet C₃AS₀.₈H₄.₄, C₂AH₈, C₂FH₈, Fe-monocarbonate, Fe-hemicarbonate, Fe-strätlingite, M₄AC̄H₉, M₄FH₁₀, Fe(OH)₃

Seven of the eight values Lothenbach (2010) marks as tentative are among the revised or the absent; hydrotalcite is the one that survived. The phases are paired on their composition, never on their constant, which takes two precautions: amorphous silica shares its formula with quartz, and amorphous Al(OH)₃ with gibbsite, so those two are paired by name; and CEMDATA18 carries several solids also at half their formula unit, for its solid solutions, so the whole unit is preferred and the constant scaled when only a half exists.

Cemdata07's energies and molar volumes ​

The same generation is printed in full by Lothenbach et al. (2008), Table 4: the Gibbs energy, enthalpy, entropy and molar volume of 37 solids and water, with the solubility products of Lothenbach (2010) phase for phase. Its energies can be set against the package's without any reaction in between, and its volumes, most of them calculated from unit cells or densities, have no reason to move with a revision of the solubility products.

energiesmolar volumes
the same to the printed digit21 solids and water, to 0.01 kJ/mol24 of 28 solids, to 0.5 cm³/mol
different7 revised: Fe-monosulfate +9.30, C₃AH₆ +1.94, C₄AH₁₃ +0.87, monosulfate +0.14, Fe-monocarbonate +5.19, C₃FH₆ −6.53, C₄FH₁₃ −7.71 kJ/molFe-monocarbonate +1.67, monosulfate +1.10, Fe-monosulfate −0.86, Fe-ettringite +0.56 cm³/mol
no CEMDATA18 solid of the same composition99

The revisions concern the iron phases and the hydrogarnets, which Cemdata18 revisited, and the monosulfate, recalculated from its Gibbs energy.

Three of the nine unpaired rows do have a CEMDATA18 counterpart at another hydration state, and the difference in Gibbs energy between the two is the energy of the water that separates them:

Cemdata07CEMDATA18waterkJ/mol per H₂O
C₂AH₈C₂AH₇.₅0.5−234.4
C₄FC̄₀.₅H₁₂Fe-hemicarbonate2−243.7
Fe(OH)₃ (mic.)FeOOH (mic.)1−231.5

Each is within 3 % of liquid water's −237.18 kJ/mol, which identifies the three as compositional differences rather than revisions. The water is counted on the hydrogen: the CEMDATA18 formula of Fe-hemicarbonate ends in (H₂O)9.5, and it carries ten waters, not 9.5.

An aged pore solution ​

Lothenbach (2010), Table 2 gives the pore solution of an ordinary Portland cement paste (w/c 0.4) after 69 days, expelled at five pressures, and the same page reports that the pore solutions of old pastes are often found a little above saturation for portlandite and for ettringite. At an ionic strength near 0.5 mol/kg, that statement depends on the activity model. With the analyzed totals at 25 °C (the table gives no temperature), the hydroxide from the charge balance, and lithium and strontium left out, the effective saturation indices — the index divided by the number of ions, 3 and 15, as the paper defines them — are:

activity modelportlanditeettringite
Davies (Davies, 1962)+0.14 to +0.16+0.18 to +0.23
B-dot, as identified from GEM-Selektor (å = 0)−0.11 to −0.10−0.18 to −0.15

Both put the solution within a quarter of a log unit of equilibrium, and neither can say on which side of it. With the second model the free hydroxide Lothenbach (2010) reports comes back within 6 % from the charge balance of the totals.

Alkali uptake by C-S-H ​

Hong and Glasser (1999) equilibrated synthetic C-S-H of Ca/Si 0.85, 1.2, 1.5 and 1.8 with NaOH and KOH solutions of 1 to 300 mM, 0.6 g of gel in 9 mL at 20 °C, and analyzed 48 solutions for alkali, calcium, hydroxide and pH. Nothing else enters: no clinker, no kinetics, no unpublished input.

The alkali was fitted to these data

The Cemdata18 authors fine-tuned the Gibbs energies of their Na and K C-S-H end members on these isotherms (Lothenbach et al., 2019; §2.7 and Fig. 10). Agreement on the alkali checks that the model is applied as it was fitted. The calcium and the pH were not fitted, and they are where it can disagree.

The gel enters as lime, silica and its own water: 14 % of the soft-dried mass at Ca/Si 0.85 and 1.2, as measured, and 18 % above, the value Hong and Glasser (1999) adopt from Taylor. The 9 mL of solution are taken as 9 g of water. The temperature is set on the state, at 20 °C, and the activity model is the B-dot form identified from a GEM-Selektor run of CEMDATA18, as for the measured solutions of Atkins et al. (1992). Each Ca/Si ratio is walked down from 300 mM, and every point certifies.

At the 100 mM rung, measured / computed:

Ca/Sialkalialkali, mmol/LCa, mmol/LpHRd, mL/g
0.85Na79.0 / 69.80.10 / 0.1512.85 / 12.8053.82 / 6.40
1.2Na87.0 / 83.20.63 / 0.4412.96 / 12.9402.08 / 2.98
1.5Na95.3 / 91.65.20 / 3.8213.01 / 12.9990.60 / 1.30
1.8Na96.9 / 93.84.88 / 8.3413.00 / 13.0330.34 / 0.93
0.85K78.2 / 76.20.10 / 0.1512.87 / 12.8354.33 / 4.93
1.2K89.5 / 87.71.02 / 0.4112.98 / 12.9641.89 / 2.36
1.5K94.0 / 94.74.80 / 3.6313.00 / 13.0151.09 / 1.03
1.8K98.2 / 96.53.90 / 8.0713.04 / 13.0460.40 / 0.74

Over the 48 points:

  • The pH, which nothing was fitted to, is within 0.072 of the electrode from 15 to 100 mM on the three gels below Ca/Si 1.8. At 300 mM it is low at every Ca/Si, by 0.08 to 0.21.

  • The alkali is over-bound. Less stays in solution than was measured at 46 of the 48 points, and the computed Rd at 100 mM is 0.95 to 2.7 times the measured one. The measured Rd hardly depends on the concentration, which is the main finding of Hong and Glasser (1999); the computed one falls as it rises.

  • The calcium is low at Ca/Si 1.2 and 1.5 and high at 1.8. At 1.8 the CSHQ model cannot hold all the calcium of the gel, and portlandite precipitates, 3.7 to 6.8 % of the solid, where the preparation carried 0.2 %.

  • Aluminum is outside the model: Hong and Glasser (2002) replaced 6 to 7 % of the silicon by aluminum and found a markedly higher Rd, and the CSHQ solid solution carries no aluminum.

  • On data the end members were not fitted on, the C-A-S-H batches of L'Hôpital et al. (2016), CSHQ binds too little alkali below a Ca/Si of 1.1, the opposite of what it does here (Alkali uptake by C-A-S-H).

What the measurements themselves can carry is read from the columns of Hong and Glasser (1999). It prints the cation sum Na⁺ + 2Ca²⁺ beside the measured hydroxide, and the gap between them is the silicate that was not measured. The authors call ±5 % satisfactory at high ionic strength; two of the sixteen solutions at 100 and 300 mM exceed it, the Ca/Si 0.85 gel in NaOH at 100 mM (9.1 %) and in KOH at 300 mM (5.7 %). In the sixteen dilute solutions, at 1 and 5 mM, the gap reaches 55 % and is 16 % on average, so the comparison there carries a large uncertainty. In one row (KOH, 15 mM, Ca/Si 1.8) the tabulated sum is 45.0 and 14.6 + 2 × 15.5 = 45.6.

Reproducing ​

sh
julia --project=. -e 'using Pkg; Pkg.test()'

The Cemdata18 checks are pure arithmetic over the downloaded file and need no solver. The case of Atkins et al. (1992) runs one equilibrate_certified and takes about a second once compiled.

Where to go next ​

The data are then put to work on measured pastes rather than on single reactions: Validation against a measured paste: a CEM I 42.5 N through its first year compares the calculation with the pore solution and the phase assemblage of one cement over its first year.