Glasses of slag, fly ash and silica fume dissolving at pH 13
Before this page
Rate laws, and every parameter in them, for the transition-state rate laws and their inhibitors (RateModelInhibitor).
What reacts in a slag or a fly ash is a glass, an amorphous calcium aluminosilicate: the slag of the ternary pastes at three temperatures holds 35 % SiO₂, 42 % CaO and 11 % Al₂O₃ and is 95 % amorphous. Snellings (2013) synthesized six such glasses, from the composition of a slag (G1, G2) through those of fly ashes (G3, G4) and of a natural pozzolan (G5) to silica (G6), dissolved them in NaOH solutions at pH 13 and 20 °C, so dilute that nothing precipitated, and measured the initial rate of each per square meter of its BET surface. Measured in the same way on every glass, these rates compare the glasses with one another and show what the solution does to them.
The rate grows with the calcium of the glass, which breaks up its silicate network. Snellings (2013), Fig. 8 relates the logarithm of the rate to the molar ratio of the calcium to the network formers, a straight line, which snellings2013_glass returns as a rate constant:
using ChemistryLab, DynamicQuantities, Printf
include(joinpath(pkgdir(ChemistryLab), "scripts", "snellings2013_glass.jl"))
g = literature_table(SN13, "glasses")
t = literature_table(SN13, "initial_rates")
println("glass CaO Al2O3 SiO2 x log10 k (law) measured")
for i in eachindex(g.glass)
ox = Dict("CaO" => ustrip(g.CaO_percent[i]) / 100, "Al2O3" => ustrip(g.Al2O3_percent[i]) / 100,
"SiO2" => ustrip(g.SiO2_percent[i]) / 100)
x = ChemistryLab._snellings2013_abscissa(ox, ("CaO",))
logk = log10(snellings2013_glass(ox; Ea = 0.0).k(; T = 293.15)) # at 20 °C, Ea plays no part
j = findfirst(k -> t.glass[k] == g.glass[i] && iszero(ustrip(t.Al_initial[k])) &&
iszero(ustrip(t.Ca_initial[k])) && iszero(ustrip(t.Si_initial[k])), eachindex(t.glass))
@printf("%-5s %5.1f %6.1f %5.1f %6.3f %10.2f %13.2f\n", g.glass[i], ustrip(g.CaO_percent[i]),
ustrip(g.Al2O3_percent[i]), ustrip(g.SiO2_percent[i]), x, logk, ustrip(t.log_rate[j]))
endglass CaO Al2O3 SiO2 x log10 k (law) measured
G1 43.0 19.0 38.0 0.557 -6.95 -6.87
G2 36.0 16.0 48.0 0.450 -7.24 -7.33
G3 20.0 37.0 43.0 0.165 -8.02 -7.97
G4 15.0 27.0 58.0 0.132 -8.11 -8.11
G5 6.5 11.5 82.0 0.064 -8.30 -8.31
G6 0.0 0.0 100.0 0.000 -8.47 -8.45The rates are in mol of the glass's cations per m² and per second; the law meets every measurement within 0.1, inside the 0.15 Snellings (2013) gives as the error. The abscissas of the six points of the figure are
Calcium and aluminum in solution
Added to the solution, calcium slows every glass, and aluminum the glasses in which calcium only balances aluminum (G3 to G6, the tectosilicate glasses); silicon up to 11 mM moves the rates by 0.27 at most, which Snellings (2013) finds not significant. The paper gives the rates, not a law. A factor
rows = sn13_rows()
fit = sn13_fit(rows)
@printf("solutions certified: %d of %d; NaOH for pH 13: %.3f to %.3f mol/kg\n",
count(r -> r.certified, rows), length(rows), extrema(r.NaOH for r in rows)...)
@printf("calcium, all glasses: K = %7.0f kg/mol, rms %.2f, worst %.2f (%d rates)\n",
fit.ca.K, fit.ca.rms, fit.ca.worst, fit.ca.n)
@printf("aluminum, tectosilicate glasses: K = %7.0f kg/mol, rms %.2f, worst %.2f (%d rates)\n",
fit.al.K, fit.al.rms, fit.al.worst, fit.al.n)
@printf("aluminum, G1 and G2 apart: K = %7.0f kg/mol, rms %.2f, worst %.2f (%d rates)\n",
fit.al_percalcic.K, fit.al_percalcic.rms, fit.al_percalcic.worst, fit.al_percalcic.n)
@printf("silicon, no factor: rms %.2f, worst %.2f\n", fit.si_rms, fit.si_worst)solutions certified: 51 of 51; NaOH for pH 13: 0.085 to 0.111 mol/kg
calcium, all glasses: K = 8618 kg/mol, rms 0.14, worst 0.23 (12 rates)
aluminum, tectosilicate glasses: K = 1311 kg/mol, rms 0.25, worst 0.37 (12 rates)
aluminum, G1 and G2 apart: K = 462 kg/mol, rms 0.17, worst 0.28 (6 rates)
silicon, no factor: rms 0.17, worst 0.27Calcium is described within the error of the measurements: a Ca²⁺ activity of
using Plots
default(framestyle = :box, grid = false)
law(r) = r.log_base - log10(1 + fit.ca.K * r.a_Ca) -
(r.glass in SN13_TECTOSILICATE ? log10(1 + fit.al.K * r.a_Al) : 0.0)
series = (("NaOH alone", r -> r.al == r.ca == r.si == 0, :circle), ("Al added", r -> r.al > 0, :utriangle),
("Ca added", r -> r.ca > 0, :square), ("Si added", r -> r.si > 0, :diamond))
fig = plot([-9.8, -6.4], [-9.8, -6.4]; color = :black, label = "", xlabel = "log₁₀ r measured (mol m⁻² s⁻¹)",
ylabel = "log₁₀ r computed", size = (560, 480), legend = :topleft)
plot!(fig, [-9.8, -6.4], [-9.8, -6.4] .+ 0.15; color = :gray, ls = :dash, label = "± 0.15, the error of the paper")
plot!(fig, [-9.8, -6.4], [-9.8, -6.4] .- 0.15; color = :gray, ls = :dash, label = "")
for (lab, keep, m) in series
s = filter(keep, rows)
scatter!(fig, [r.log_rate for r in s], law.(s); marker = m, label = lab)
endThese are initial rates far from equilibrium, at pH 13, 20 °C and calcium and aluminum below 2.5 and 5 mM. A glass in a paste meets a pore solution at a pH of 13 to 13.8, with calcium and aluminum set by the hydrates around it, for months: whether this law, fitted on dilute solutions, follows the slag of a paste is a question for the measurements of a paste, not one it answers.
The measurements of Newlands et al. (2017), on two glasses of slag-like and fly-ash-like composition, are not used to test this law, and not for want of quality: they answer another question. The glasses dissolve at 25 °C in a closed, stirred reactor for three hours; the pH is read once, at the end, when the reactor is opened; and the paper reports the amount released per unit area divided by the time elapsed, an average since the start, while calcium returns onto the surface of the glass. An initial rate at 20 °C would have to be drawn from their figures, through a choice of the early window and an activation energy this law does not give, and the comparison would test those choices as much as the law.
The slag of a paste under this law
The ternary paste of the pages on curing temperature, 50 % CEM I 52.5 R, 40 % slag and 10 % limestone at w/b 0.5 and 20 °C, is integrated here with its slag dissolved by this law instead of the law fitted there on its degree of reaction: the rate of the composition of its glass, slowed by the calcium of the pore solution with the factor above, over the surface of the slag shrinking as spheres. Nothing is fitted on the paste. The glass lies beyond the most calcic glass measured (
include(joinpath(pkgdir(ChemistryLab), "scripts", "snellings2022_glass_law.jl"))
setup = sn22g_setup()
days = [1, 2, 7, 28, 90, 180]
runs = Dict{Symbol, Any}(a => sn22g_run(setup, fit, 20.0; area = a) for a in (:bet, :blaine))
measured = literature_table(SN22, "degree_of_reaction"; constituent = "slag", temperature_C = 20, w_b = 0.5)
println("degree of reaction of the slag (%) ", join((lpad("$d d", 7) for d in days)))
for (a, label) in ((:bet, "this law, BET area"), (:blaine, "this law, Blaine area"))
println(rpad(label, 40), join((@sprintf("%7.1f", x) for x in sn22g_slag_degree(runs[a], days))))
end
println(rpad("measured, Snellings et al. (2022)", 40), join((@sprintf("%7.1f", ustrip(x)) for x in measured.degree_percent)))degree of reaction of the slag (%) 1 d 2 d 7 d 28 d 90 d 180 d
this law, BET area 77.2 100.0 100.0 100.0 100.0 100.0
this law, Blaine area 16.0 34.2 87.6 100.0 100.0 100.0
measured, Snellings et al. (2022) 20.7 23.3 41.5 51.2 57.2 62.1Over the BET surface the slag is gone in two days. Over the smaller surface the first day falls within the measurement, and then the dissolution does not slow down: the paste holds its slag at 41 to 62 % from the first week to the sixth month, where this law has dissolved it within the month. Snellings (2013), Section IV(3) sets out the use of these rates for cements under an assumption, "that dissolution rates control the consumption of SCMs in cement"; for this slag, the paste measures it holding for a day and no longer. What slows a slag in a paste after its first days is not in a law measured on its glass in a dilute solution.