CEM I 52.5 R with slag and limestone at 5, 20 and 40 °C
Before this page
CEM II/B-V and CEM II/B-M (V-LL), with their CEM I, integrated in time, the law of the clinker tested on another clinker at 20 °C.
Snellings et al. (2022) blended a CEM I 52.5 R with 40 % ground granulated blast-furnace slag and 10 % limestone, each ground on its own, and cured the pastes under water at 5, 20 and 40 °C, at w/b 0.4, 0.5 and 0.6. They followed the degrees of reaction of the clinker and of the slag by X-ray diffraction for six months (their Fig. 6), the slag's to within 10 points by their estimate. The laws the package gives these two constituents carry the temperature by an Arrhenius factor, and this page tests them at the three temperatures. Nothing in the law of the clinker is fitted. The slag has no published constants of its own: they are fitted here, and their activation energy is compared with the one the authors fit with another law.
1. The measurements
(Snellings et al., 2022; Fig. 6) is a raster image. Each of its 108 markers was found by its color and its shape, and placed where the lines drawn through it meet its age, to 0.3 point (data/literature/Snellings2022.json, under digitization).
using ChemistryLab, DynamicQuantities, Printf, Plots
include(joinpath(pkgdir(ChemistryLab), "scripts", "snellings2022_kinetics.jl"))
slag, clinker = sn22_degrees("slag"), sn22_degrees("clinker")
temperatures, ratios, days = sort(unique(slag.temperature_C)), sort(unique(slag.w_b)), sort(unique(slag.age))
measured(d, T, w_b, t) = only(d.degree_percent[(d.temperature_C .== T) .& (d.w_b .== w_b) .& (d.age .== t)])
@printf("%d degrees of the slag and %d of the clinker, at %s °C and w/b %s\n",
length(slag.age), length(clinker.age), join(Int.(temperatures), ", "), join(ratios, ", "))54 degrees of the slag and 54 of the clinker, at 5, 20, 40 °C and w/b 0.4, 0.5, 0.62. The clinker under the published law
The four clinker phases of the cement (Table 1, X-ray diffraction) dissolve under the law of Parrott and Killoh (1984) with the constants and the activation energies Lavergne et al. (2018) tabulate, at the Blaine fineness of the cement and at the temperature of the paste; the degree of the clinker is their sum weighted by their masses, as the authors weight it. The water/cement ratios of these pastes, 0.8 to 1.2, are above the range where the law's water factor acts, so the law gives the same clinker at the three w/b:
println(" °C days law measured at w/b ", join(ratios, ", "))
for T in temperatures
law = sn22_clinker_degree(T, first(ratios), days)
for (k, t) in enumerate(days)
@printf("%3d %6d %5.1f %s\n", T, t, law[k], join((@sprintf("%5.1f", measured(clinker, T, w, t)) for w in ratios), " "))
end
end °C days law measured at w/b 0.4, 0.5, 0.6
5 1 26.5 28.7 24.1 24.3
5 2 38.5 52.1 52.2 51.5
5 7 59.2 80.2 79.8 81.3
5 28 75.6 83.7 85.4 86.7
5 90 84.3 88.2 88.2 87.9
5 180 87.9 88.1 89.6 89.8
20 1 42.4 63.0 63.0 63.5
20 2 53.9 77.5 78.4 78.8
20 7 70.4 86.3 87.7 89.9
20 28 82.3 85.3 89.4 91.0
20 90 88.5 89.5 89.3 92.1
20 180 91.1 90.7 91.8 92.4
40 1 59.2 78.2 80.2 80.5
40 2 68.0 81.6 85.1 87.2
40 7 79.6 84.1 88.9 89.5
40 28 87.6 86.4 89.2 89.5
40 90 91.8 89.9 93.4 93.6
40 180 93.6 93.1 95.5 96.7grid_days = 10 .^ range(-0.5, log10(200); length = 120)
wb_marker = Dict(zip(ratios, (:circle, :diamond, :utriangle)))
fig = plot(; xscale = :log10, ylims = (0, 100), xlabel = "age (days)", ylabel = "degree of reaction of the clinker (%)",
legend = :outerright, size = (900, 420), left_margin = 5Plots.mm, bottom_margin = 5Plots.mm,
title = "The clinker under the published law", titlefontsize = 11)
for (k, T) in enumerate(temperatures)
plot!(fig, grid_days, sn22_clinker_degree(T, first(ratios), grid_days); lw = 2, color = k, label = "law, $(Int(T)) °C")
for w in ratios
scatter!(fig, days, [measured(clinker, T, w, t) for t in days]; color = k, marker = wb_marker[w], ms = 4,
label = T == first(temperatures) ? "measured, w/b $w" : "")
end
end
fig
The law has the clinker right only late. At 5 °C it is within three points of the measurement at one day and then falls behind it, by 21 to 22 points at seven days; at 20 and 40 °C it is too slow from the first day, by 19 to 21 points at one day. At 20 °C the measured clinker reacts in one day as far as the law takes it in four. At 90 and 180 days the law is within four points of the measurement at the three temperatures. The clinker of the pastes of De Weerdt et al. (2011) was also too slow under this law at one day, by 7 to 10 points; this one is by 20. Snellings et al. (2022) find the w/b of no effect on the clinker before seven days, as the law has it.
3. The slag under the Waller law
Waller (1999) wrote the degree of reaction of a pozzolan as α = 1/(1 + (τ/t)ⁿ) at the reference temperature; the package's waller writes its rate as a function of α instead, multiplies it by the Arrhenius factor A = exp(−(Ea/R)(1/T − 1/T_ref)), and may stop it at a ceiling α_max. At a constant temperature the law then integrates to
which sn22_waller_degree evaluates and the test suite checks against the rate of waller itself. The only constants the package ships for the law are those of a fly ash, n = 0.7 and Ea = 83.14 kJ/mol (WALLER_PARAMS_FLY_ASH), with no ceiling. The fits below start from them and free the constants named in the first column (sn22_slag_fit), on the eighteen degrees of each w/b or on the 54 at once:
fits = [
("τ, each w/b", [sn22_slag_fit((w,); shared = (:τ,)) for w in ratios]),
("τ, n, Ea, each w/b", [sn22_slag_fit((w,)) for w in ratios]),
("τ, n, Ea, α_max, each w/b", [sn22_slag_fit((w,); shared = (:τ, :n, :Ea, :α_max), τ₀ = 10.0) for w in ratios]),
("τ; one α_max per w/b", [sn22_slag_fit(; shared = (:τ,), per_wb = (:α_max,), τ₀ = 10.0)]),
("τ, n; one α_max per w/b", [sn22_slag_fit(; shared = (:τ, :n), per_wb = (:α_max,), τ₀ = 10.0)]),
("τ, n, Ea; one α_max per w/b", [sn22_slag_fit(; per_wb = (:α_max,), τ₀ = 10.0)]),
]
println(rpad("constants fitted", 30), " misfit, points of degree")
for (label, f) in fits
println(rpad(label, 30), join((@sprintf("%6.1f", x.rms) for x in f), ""))
endconstants fitted misfit, points of degree
τ, each w/b 17.8 15.5 14.9
τ, n, Ea, each w/b 4.0 4.8 4.7
τ, n, Ea, α_max, each w/b 2.0 2.6 2.7
τ; one α_max per w/b 3.5
τ, n; one α_max per w/b 3.1
τ, n, Ea; one α_max per w/b 2.6labels = [first(f) for f in fits]
fig = plot(; ylabel = "misfit (points of degree)", xticks = (eachindex(labels), labels), xrotation = 25,
legend = :topright, size = (900, 430), left_margin = 6Plots.mm, bottom_margin = 22Plots.mm,
title = "The Waller law fitted on the slag")
for (j, w) in enumerate(ratios)
bar!(fig, (1:3) .+ (j - 2) * 0.27, [f[2][j].rms for f in fits[1:3]]; bar_width = 0.27, label = "w/b $w alone")
end
bar!(fig, 4:6, [only(f[2]).rms for f in fits[4:6]]; bar_width = 0.5, color = :grey50, label = "the 54 degrees together")
hline!(fig, [10]; ls = :dash, color = :black, label = "uncertainty of the measurement")
plot!(fig; ylims = (0, 1.1 * ylims(fig)[2]))
The first three rows fit each w/b alone, one column each, the last three the 54 degrees together with one ceiling per w/b. The fly-ash shape, a sigmoid that goes on to complete reaction, misses the measurement by 15 to 18 points of degree, more than the 10 points the measurement is good to: the slag of these pastes slows down where the sigmoid does not, the more so the hotter the paste. Freeing its exponent and its activation energy brings the misfit to 4 or 5 points with an exponent near 0.3, a sigmoid spread over decades. A ceiling does better with fewer constants. With one ceiling per w/b and the fly-ash exponent and activation energy kept, the misfit is 3.5 points on the 54 degrees; freeing the exponent and then the activation energy brings it to 3.1 and 2.6. The four constants fitted on each w/b alone, twelve in all, do barely better, 2.0 to 2.7 points, than these six. The water acts on the slag through its ceiling alone, as Snellings et al. (2022) observe it: the w/b changes the degree of the slag only at the later ages.
The last fit, its constants and how well the 54 degrees determine them, for a measurement good to the 10 points Snellings et al. (2022) give (identifiability):
fit = only(last(fits)[2])
for (name, value, se) in zip(fit.names, fit.values, fit.identifiability.stderr)
@printf("%-16s %8.4g ± %2.0f %%\n", name, value, 100 * se)
end
println("singular values: ", round.(fit.identifiability.S; sigdigits = 3))
println()
println(" °C days computed/measured at w/b ", join(ratios, ", "))
for T in temperatures, t in days
i = [findfirst((fit.temperature_C .== T) .& (fit.w_b .== w) .& (fit.age .== t)) for w in ratios]
@printf("%3d %6d %s\n", T, t, join((@sprintf("%5.1f/%5.1f", fit.model[j], fit.measured[j]) for j in i), " "))
endτ 5.339 ± 33 %
n 0.5906 ± 22 %
Ea 67.4 ± 17 %
α_max (w/b 0.4) 0.5412 ± 10 %
α_max (w/b 0.5) 0.653 ± 9 %
α_max (w/b 0.6) 0.7049 ± 9 %
singular values: [190.0, 174.0, 148.0, 69.5, 47.5, 27.2]
°C days computed/measured at w/b 0.4, 0.5, 0.6
5 1 9.8/ 13.2 10.8/ 12.6 11.2/ 14.9
5 2 13.5/ 15.7 15.0/ 17.3 15.6/ 16.9
5 7 22.3/ 19.4 25.1/ 20.6 26.4/ 25.9
5 28 33.2/ 29.3 38.3/ 34.4 40.6/ 39.0
5 90 41.1/ 39.7 48.2/ 48.4 51.4/ 52.8
5 180 44.7/ 46.4 52.9/ 57.5 56.6/ 62.2
20 1 18.8/ 20.0 21.1/ 20.7 22.1/ 22.0
20 2 24.1/ 22.9 27.3/ 23.3 28.7/ 25.7
20 7 34.0/ 37.1 39.3/ 41.5 41.6/ 41.8
20 28 42.9/ 40.3 50.5/ 51.2 54.0/ 54.0
20 90 47.8/ 45.5 57.0/ 57.2 61.1/ 61.8
20 180 49.8/ 49.8 59.5/ 62.1 64.0/ 68.3
40 1 32.6/ 32.8 37.6/ 35.4 39.8/ 40.7
40 2 37.6/ 42.3 43.8/ 46.2 46.6/ 48.9
40 7 44.8/ 45.7 52.9/ 53.0 56.7/ 54.6
40 28 49.6/ 48.7 59.2/ 54.2 63.6/ 57.8
40 90 51.7/ 52.6 62.1/ 61.3 66.9/ 63.1
40 180 52.5/ 53.0 63.1/ 64.1 68.0/ 68.4panels = map(enumerate(ratios)) do (j, w)
p = plot(; xscale = :log10, ylims = (0, 100), xlabel = "age (days)", ylabel = "degree of the slag (%)",
title = @sprintf("w/b %.1f, ceiling %.2f", w, fit.θ[w].α_max), titlefontsize = 10,
legend = j == 1 ? :topleft : false)
for (k, T) in enumerate(temperatures)
plot!(p, grid_days, sn22_waller_degree(fit.θ[w], T, grid_days); lw = 2, color = k, label = "$(Int(T)) °C")
scatter!(p, days, [measured(slag, T, w, t) for t in days]; color = k, marker = :diamond,
label = j == 1 && k == 1 ? "measured" : "")
end
p
end
plot(panels...; layout = (1, 3), size = (1100, 360), left_margin = 6Plots.mm, bottom_margin = 7Plots.mm)
The six constants are all determined, the least well to 33 % (the time), the activation energy to 17 %. The ceiling rises with the water, from 0.54 at w/b 0.4 to 0.70 at 0.6. The exponent, 0.59, is near the fly ash's 0.7. The activation energy, 67 kJ/mol, is the one Snellings et al. (2022) find, from the same degrees with their own law and with a time of each temperature (their Table 2):
ea = literature_table(SN22, "activation_energies"; constituent = "slag")
println("Snellings et al. (2022), Table 2: ", join((@sprintf("%.0f at w/b %.1f", ustrip(us"kJ/mol", e), ustrip(w)) for (e, w) in zip(ea.Ea, ea.w_b)), ", "), " kJ/mol")
@printf("fitted here: %.1f kJ/mol; fly-ash set of the package: %.2f kJ/mol\n", fit.θ[first(ratios)].Ea, ustrip(us"kJ/mol", WALLER_PARAMS_FLY_ASH.Ea))Snellings et al. (2022), Table 2: 67 at w/b 0.4, 63 at w/b 0.5, 63 at w/b 0.6 kJ/mol
fitted here: 67.4 kJ/mol; fly-ash set of the package: 83.14 kJ/molThe fly-ash value raises the misfit from 2.6 to 3.1 points: the data prefer the lower activation energy, though the 10 points of the measurement do not exclude the higher one.
4. The same law on two other slags
The round robin of Durdziński et al. (2017) measured the degree of reaction of two other slags, at 40 % in another cement at w/b 0.4, by image analysis of electron micrographs in two laboratories (their Table 5). The law of w/b 0.4, fitted above, against them, nothing refitted (sn22_durdzinski). ASSUMED: the pastes cured at 20 °C, which the round robin does not state.
dz = sn22_durdzinski(fit.θ[0.4])
println("slag lab days measured computed")
for i in eachindex(dz.age)
@printf("%-4s %-3s %5.0f %8.0f %8.1f\n", dz.material[i], dz.lab[i], dz.age[i], dz.measured[i], dz.model[i])
end
for m in ("S1", "S2"), lab in ("B", "E")
k = (dz.material .== m) .& (dz.lab .== lab)
@printf("%s by %s: largest difference %.1f points\n", m, lab, maximum(abs, dz.model[k] .- dz.measured[k]))
endslag lab days measured computed
S1 B 1 15 18.8
S1 B 7 36 34.0
S1 B 28 48 42.9
S1 B 90 50 47.8
S2 B 1 16 18.8
S2 B 7 32 34.0
S2 B 28 45 42.9
S2 B 90 54 47.8
S1 E 1 12 18.8
S1 E 7 33 34.0
S1 E 28 38 42.9
S1 E 90 55 47.8
S2 E 1 22 18.8
S2 E 7 45 34.0
S2 E 28 49 42.9
S2 E 90 64 47.8
S1 by B: largest difference 5.1 points
S1 by E: largest difference 7.2 points
S2 by B: largest difference 6.2 points
S2 by E: largest difference 16.2 pointsfig = plot(; xscale = :log10, ylims = (0, 100), xlabel = "age (days)", ylabel = "degree of the slag (%)",
legend = :topleft, size = (760, 400), left_margin = 5Plots.mm, bottom_margin = 5Plots.mm,
title = "The law of w/b 0.4 on two other slags, assumed at 20 °C", titlefontsize = 11)
plot!(fig, grid_days, sn22_waller_degree(fit.θ[0.4], 20.0, grid_days); lw = 2, color = :black, label = "law")
for (k, (mat, lab)) in enumerate(Iterators.product(("S1", "S2"), ("B", "E")))
sel = (dz.material .== mat) .& (dz.lab .== lab)
scatter!(fig, dz.age[sel], dz.measured[sel]; color = mat == "S1" ? 2 : 3, marker = lab == "B" ? :circle : :diamond,
label = "$mat, laboratory $lab")
end
fig
As laboratory B measured them, both slags are within 6.2 points of the law at every age, and the first one as laboratory E measured it within 7.2. The two laboratories differ by up to 13 points on the same paste, and the round robin (Durdziński et al., 2017) puts the precision of any technique at ±5 points at best. Laboratory E finds the second slag faster, by 11 points at seven days and 16 at ninety, beyond the ceiling of 0.54 the law takes from the pastes of Snellings et al. (2022) at that w/b.
5. What the comparison says
The clinker law has the temperature right only late. With its published constants, the law of Parrott and Killoh (1984) brings the clinker of this cement to within four points of the measured degree at three and six months, at the three temperatures, but it is too slow at 20 and 40 °C from the first day, and at 5 °C after it.
The slag needs a ceiling, and then the Waller law holds. The sigmoid of the fly ash cannot follow a slag that slows down by the third month; with a ceiling that rises with the water, one time, one exponent and one activation energy describe the three temperatures and the three w/b to 2.6 points of degree, a quarter of the measurement's uncertainty. The activation energy, 67 kJ/mol, is that of Snellings et al. (2022), found by another route, below the 83 kJ/mol of the fly-ash set. These are fitted constants, of one slag in one cement; on the two slags of the round robin (Durdziński et al., 2017) they hold within 7.2 points in three series of four. They are not shipped as the package's constants.
Where to go next
CEM II/B-V and CEM II/B-M (V-LL), with their CEM I, integrated in time calibrates the alite of another clinker and integrates the pastes with their hydrates, and Kinetics under partial equilibrium writes the formulation those runs integrate.