The heat of CEM I 52.5 R with slag and limestone, from its degrees of reaction
Before this page
The enthalpy of a glass, which builds the enthalpy of the slag glass this page needs, and CEM I 52.5 R with slag and limestone, integrated in time at 5, 20 and 40 °C, which computes the same pastes.
Snellings et al. (2022) measured three things on a cement of 50 % CEM I 52.5 R, 40 % slag and 10 % limestone: how far each of its clinker phases and its slag had reacted, by X-ray diffraction; the water its hydrates bound and the portlandite they held, by thermogravimetry; and the heat it released, by isothermal calorimetry over 28 days. The heat of a paste is the fall of its enthalpy, so the measurements can be set against each other once every part of the paste has an enthalpy, the unreacted slag glass included. This page computes the heat from the mixing to each age at the degrees of reaction the paper measured, with nothing fitted, and compares it with the calorimetry. At four weeks the two agree. In the first days they do not, and the page sets the three measurements side by side to see what the difference belongs to.
using ChemistryLab, DynamicQuantities, Printf, Plots
default(framestyle = :box, grid = false)
include(joinpath(pkgdir(ChemistryLab), "scripts", "snellings2022_heat.jl"))
cs = sn22h_system()
model = cemdata18_activity_model(:KOH)1. What is computed, and what is assumed
The paste is 100 g of the binder, its materials those of the previous pages: the cement by its Rietveld phases, the slag by its calcite, its quartz and its glass, the limestone by its calcite, quartz and dolomite. At each age each of the four clinker phases has reacted to its own degree, one minus its content over its content at the mixing, the contents read off (Snellings et al., 2022; Fig. 5), which is how the authors form the degree of the clinker; the glass of the slag has reacted to the degree given for the slag (Fig. 6b); everything else is at equilibrium from the mixing, the sulfates and the limestone included, so that their heat falls before the first state and is not counted; the quartz is inert. The heat is that of heat_release from the state at mixing, with nothing reacted, to the state at each age, per gram of Portland cement, as the paper reports its calorimetry. The measured heat is read off Fig. 3 of the paper (data/literature/Snellings2022.json). At w/b 0.5 the degrees are:
ages = (1, 2, 7, 28)
println(" T age alite belite C3A C4AF slag")
for T in (5, 20, 40), a in ages
α = sn22h_phase_degrees(T, 0.5, a)
@printf("%2d °C %3d d %7.2f %7.2f %6.2f %6.2f %7.2f\n", T, a,
α["Alite"], α["Belite"], α["C3A"], α["C4AF"], sn22h_degree("slag", T, 0.5, a))
end T age alite belite C3A C4AF slag
5 °C 1 d 0.29 0.05 0.18 0.08 0.13
5 °C 2 d 0.66 0.09 0.27 0.25 0.17
5 °C 7 d 0.95 0.09 0.84 0.41 0.21
5 °C 28 d 0.98 0.11 0.98 0.65 0.34
20 °C 1 d 0.75 0.13 0.65 0.25 0.21
20 °C 2 d 0.91 0.14 0.88 0.42 0.23
20 °C 7 d 0.99 0.17 1.00 0.77 0.41
20 °C 28 d 1.00 0.20 1.00 0.86 0.51
40 °C 1 d 0.91 0.05 0.97 0.74 0.35
40 °C 2 d 0.95 0.19 0.98 0.80 0.46
40 °C 7 d 0.98 0.28 0.99 0.90 0.53
40 °C 28 d 0.98 0.34 0.98 0.86 0.54The hydrates and the solution have their Cemdata18 (Lothenbach et al., 2019) enthalpies, the clinker phases those of their database records, and the glass the enthalpy of glass_enthalpy, the oxides on the scale of Cemdata18 where it holds them. Its titanium and manganese, which the system has no element for, are set aside as the glass reacts, at the enthalpy of their crystals, which is what the glass enthalpy counts them at; its phosphorus, left out of the glass, is left out of the residue too.
for T in (5, 20, 40)
g = sn22h_glass(T)
@printf("glass at %2d °C: %9.1f J/g, of which vitrification %5.1f ± %3.1f J/g\n", T,
ustrip(us"J/g", g.enthalpy), ustrip(us"J/g", g.vitrification), ustrip(us"J/g", g.uncertainty))
endglass at 5 °C: -13622.2 J/g, of which vitrification 159.5 ± 5.8 J/g
glass at 20 °C: -13611.3 J/g, of which vitrification 159.5 ± 5.8 J/g
glass at 40 °C: -13596.3 J/g, of which vitrification 159.5 ± 5.8 J/g2. The heat at the degrees of the diffraction
At w/b 0.5, at the three temperatures, the heat computed at each age against the heat measured:
runs = Dict{Int, Any}()
for T in (5, 20, 40)
o = sn22h_origin(cs, T, 0.5; model)
states = [o.state(sn22h_phase_degrees(T, 0.5, a), sn22h_degree("slag", T, 0.5, a)) for a in ages]
runs[T] = (; o, states, q = [o.heat(rs) for rs in states],
meas = [sn22h_measured(T, 0.5, a) for a in ages])
end
println(" T age computed measured (age read) difference")
for T in (5, 20, 40), (k, a) in enumerate(ages)
r = runs[T]
@printf("%2d °C %3d d %8.0f %10.0f (%4.1f d) %12.0f %%\n", T, a, r.q[k], r.meas[k].heat,
r.meas[k].age, 100 * (r.q[k] / r.meas[k].heat - 1))
end T age computed measured (age read) difference
5 °C 1 d 186 79 ( 1.0 d) 136 %
5 °C 2 d 335 206 ( 2.0 d) 63 %
5 °C 7 d 513 432 ( 7.0 d) 19 %
5 °C 28 d 606 586 (27.1 d) 3 %
20 °C 1 d 430 288 ( 1.0 d) 49 %
20 °C 2 d 525 409 ( 2.0 d) 28 %
20 °C 7 d 649 562 ( 7.0 d) 16 %
20 °C 28 d 696 650 (28.0 d) 7 %
40 °C 1 d 599 475 ( 1.0 d) 26 %
40 °C 2 d 665 560 ( 2.0 d) 19 %
40 °C 7 d 709 642 ( 7.0 d) 10 %
40 °C 28 d 714 705 (28.0 d) 1 %At four weeks the computed heat is 1 to 7 % above the measured one. At one day it is above it by a quarter at 40 °C, by half at 20 °C and by more than the measurement itself at 5 °C, and the difference closes with age.
3. The bound water at the same degrees
The thermogravimetry of Snellings et al. (2022) was run on the powders the diffraction was measured on, the calorimetry on a paste of its own, sealed in its ampoule from the mixing. The states of section 2 give the bound water and the portlandite the thermogravimetry reports (Fig. 8, at w/b 0.5), over the mass at 550 °C, every hydrate assumed to have lost all its water by then and nothing else (sn22h_tga in scripts/snellings2022_heat.jl). The ratio of each measurement to its computed value is:
println(" T age heat: measured/computed bound water: measured/computed")
for T in (5, 20, 40), (k, a) in enumerate(ages)
r = runs[T]
bw = sn22h_tga(r.states[k]).bound_water
@printf("%2d °C %3d d %18.2f %30.2f\n", T, a, r.meas[k].heat / r.q[k],
sn22h_measured_tga("bound water", T, a) / bw)
end T age heat: measured/computed bound water: measured/computed
5 °C 1 d 0.42 0.56
5 °C 2 d 0.61 0.67
5 °C 7 d 0.84 0.79
5 °C 28 d 0.97 0.92
20 °C 1 d 0.67 0.71
20 °C 2 d 0.78 0.76
20 °C 7 d 0.87 0.87
20 °C 28 d 0.93 0.94
40 °C 1 d 0.79 0.73
40 °C 2 d 0.84 0.80
40 °C 7 d 0.91 0.83
40 °C 28 d 0.99 0.95The two measurements, on two specimens and by two techniques, find the same fraction of the reaction the degrees of the diffraction imply, a fraction of 0.4 to 0.8 at one day and above 0.9 at four weeks. The calculation converts the degrees into a heat and a bound water by the same hydrates; what the two ratios share is therefore the degrees, and in the first days the heat and the water correspond to less reaction than the diffraction reports.
4. One factor on the progress, fitted on the bound water
Here the diffraction is kept for how the reaction is shared among the five constituents, and the thermogravimetry for how far it has gone. At each age and temperature, the amounts reacted of the four clinker phases and of the slag are those of the diffraction multiplied by one factor sn22h_progress in the script). The heat at that progress is then compared with the calorimetry, which nothing was fitted on, and the portlandite with the thermogravimetry. The last column is the heat with the glass at the enthalpy of the crystals of its composition, at the same progress.
glass = only(c for c in material_template("slag (Snellings 2022)", SN22_DB).constituents if c.name == "glass")
m_glass = sn22_value("slag_percent") * glass.mass_fraction
pc_g = sn22_value("pc_percent")
fits = Dict(T => [sn22h_progress(cs, T, a; model, origin = runs[T].o) for a in ages] for T in (5, 20, 40))
println(" T age λ heat measured difference portlandite measured as crystals")
for T in (5, 20, 40), (k, a) in enumerate(ages)
f, r = fits[T][k], runs[T]
q = r.o.heat(f.state)
vit = f.λ * sn22h_degree("slag", T, 0.5, a) * m_glass * ustrip(us"J/g", sn22h_glass(T).vitrification) / pc_g
@printf("%2d °C %3d d %6.3f %6.0f %8.0f %9.1f %% %11.2f %10.2f %11.0f\n", T, a, f.λ, q, r.meas[k].heat,
100 * (q / r.meas[k].heat - 1), f.tga.portlandite, sn22h_measured_tga("portlandite", T, a), q - vit)
end T age λ heat measured difference portlandite measured as crystals
5 °C 1 d 0.384 76 79 -4.4 % 0.19 1.41 70
5 °C 2 d 0.542 191 206 -7.4 % 2.99 4.90 179
5 °C 7 d 0.752 390 432 -9.8 % 8.08 7.30 371
5 °C 28 d 0.905 549 586 -6.2 % 8.43 7.30 511
20 °C 1 d 0.640 280 288 -2.7 % 5.39 5.80 264
20 °C 2 d 0.717 380 409 -7.2 % 7.38 6.60 360
20 °C 7 d 0.852 555 562 -1.2 % 7.67 6.80 512
20 °C 28 d 0.926 646 650 -0.7 % 7.30 6.50 588
40 °C 1 d 0.688 416 475 -12.4 % 6.22 6.10 386
40 °C 2 d 0.768 514 560 -8.2 % 6.37 6.10 471
40 °C 7 d 0.805 573 642 -10.8 % 6.35 5.70 521
40 °C 28 d 0.945 675 705 -4.2 % 7.25 5.50 613colors = Dict(5 => :blue, 20 => :green, 40 => :red)
fig = plot(; xlabel = "age (days)", ylabel = "heat (J per g of Portland cement)", legend = :bottomright,
size = (720, 430), xscale = :log10, xticks = ([1, 2, 7, 28], ["1", "2", "7", "28"]))
for T in (5, 20, 40)
r = runs[T]
plot!(fig, collect(ages), r.q; color = colors[T], ls = :dash, lw = 1, label = "$T °C, degrees of the diffraction")
plot!(fig, collect(ages), [r.o.heat(f.state) for f in fits[T]]; color = colors[T], marker = :circle,
lw = 2, label = "$T °C, progress of the bound water")
scatter!(fig, [m.age for m in r.meas], [m.heat for m in r.meas]; color = colors[T], marker = :square,
markersize = 5, label = "$T °C, measured")
end5. At 28 days, every paste
The thermogravimetry is reported at w/b 0.5 only. At four weeks, where the degrees of the diffraction and the heat come closest, the nine pastes are computed at those degrees:
println(" T w/b computed measured difference")
for T in (5, 20, 40), wb in (0.4, 0.5, 0.6)
q = only(sn22h_heat(cs, T, wb; ages = (28,), model))
m = sn22h_measured(T, wb, 28)
@printf("%2d °C %.1f %9.0f %10.0f %+9.1f %%\n", T, wb, q, m.heat, 100 * (q / m.heat - 1))
end T w/b computed measured difference
5 °C 0.4 573 543 +5.5 %
5 °C 0.5 606 586 +3.4 %
5 °C 0.6 630 588 +7.1 %
20 °C 0.4 630 594 +6.1 %
20 °C 0.5 696 650 +7.0 %
20 °C 0.6 712 684 +4.2 %
40 °C 0.4 675 646 +4.5 %
40 °C 0.5 714 705 +1.3 %
40 °C 0.6 734 735 -0.2 %The nine pastes are from 0.2 % below the calorimetry to 7.1 % above it, all but one above, as the paste at w/b 0.5 is at each temperature, where the bound water implies 5 to 10 % less reaction than the diffraction at four weeks (section 4).
6. What the comparison says
At the progress the bound water gives, the computed heat follows the calorimetry from the first day to the fourth week at the three temperatures, 1 to 12 % below it, where at the degrees of the diffraction it was 26 to 136 % above it at one day; no parameter is fitted on the heat. The enthalpy of vitrification of the glass is part of that agreement: with the glass as the crystals of its composition, the heat at the same progress is lower by 6 to 62 J per gram of Portland cement, the share of the slag that has reacted, and at four weeks at 20 °C it would be 10 % below the measurement instead of 1 %.
What the factor fitted on the bound water measures is the difference between the progress the diffraction reports and the one the heat and the water correspond to: more than half of the reaction at 5 °C and a third at 20 and 40 °C at one day, a tenth at most at four weeks. It does not say which constituent the difference belongs to: one factor is applied to all five, and the bound water alone cannot share it among them. The authors themselves put the precision of the degree of the slag at 10 points, and note that the degrees of the phases present in small amounts, the aluminate, the ferrite and the belite, scatter most, the uncertainty of their contents being magnified when it is converted into a degree (Snellings et al., 2022). The comparison here does not decide where the difference comes from; it measures it, and shows that the heat and the bound water agree on it.
Two limits of the comparison remain. The heat at the fitted progress is below the measurement at every age, the most at 40 °C, so that the bound water corresponds to a little less reaction than the heat does: either the hydrates of the calculation hold more water per mole than those of the paste, or the drying that stops the hydration removes some of it. And the portlandite at the fitted progress is that of the thermogravimetry at one day at 20 and 40 °C, below it at 5 °C in the first two days, and above it from a week on by 0.6 to 1.8 points, as on the previous page, where it is set against the same measurement over six months.