Skip to content

CEM I 52.5 R with slag and limestone, integrated in time at 5, 20 and 40 °C ​

Before this page

CEM I 52.5 R with slag and limestone at 5, 20 and 40 °C, where the law of the slag used here is fitted on its degree of reaction.

The pastes of Snellings et al. (2022), a CEM I 52.5 R with 40 % slag and 10 % limestone, were followed at 5, 20 and 40 °C for six months: the degrees of reaction of their clinker and slag, which the previous page compares with the rate laws, and what the hydration formed, the bound water and the portlandite by thermogravimetry (their Fig. 8), the portlandite, the ettringite, the hydrotalcite and the carboaluminates by X-ray diffraction (their Fig. 10). Here the pastes at w/b 0.5 are integrated from the mixing at each temperature, the clinker and the slag under their laws and everything else at equilibrium, and what they form is compared with those measurements, which nothing was fitted on.

1. The pastes and their laws ​

The three materials are built from (Snellings et al., 2022; Table 1) (the templates PC (Snellings 2022), slag (Snellings 2022) and limestone (Snellings 2022) of data/recipe_templates.toml): the cement by its Rietveld phases, the slag by its calcite, its quartz and its glass, found by difference from its analysis, the limestone by its calcite, quartz and dolomite. The quartz is inert. The four clinker phases dissolve under the law of Parrott and Killoh (1984) with the published constants and activation energies, the glass of the slag under the Waller law (Waller, 1999) with the constants fitted on the previous page for w/b 0.5, at the temperature of the paste. Everything else is at equilibrium from the mixing (scripts/snellings2022_pastes.jl).

ASSUMED: the minor oxides of the cement, those of its analysis that its Rietveld phases do not hold, magnesia among them, enter the equilibrium at the mixing; the slag's sulfur, which its analysis does not report, is left out.

julia
using ChemistryLab, DynamicQuantities, OptimaSolver, Printf, Plots
include(joinpath(pkgdir(ChemistryLab), "scripts", "snellings2022_pastes.jl"))

setup = sn22p_setup()
θ = sn22_slag_fit(; per_wb = (:α_max,), τ₀ = 10.0).θ[0.5]
@printf("slag: τ = %.2f d at 20 °C, n = %.3f, Ea = %.1f kJ/mol, ceiling %.3f\n", θ.τ, θ.n, θ.Ea, θ.α_max)
slag: τ = 5.34 d at 20 °C, n = 0.591, Ea = 67.4 kJ/mol, ceiling 0.653

2. The three runs ​

julia
temperatures = (5.0, 20.0, 40.0)
days = [1, 2, 7, 28, 90, 180]
runs = Dict{Float64, Any}(T => sn22p_run(setup, T, θ) for T in temperatures)
obs = Dict{Float64, Any}(T => sn22p_observables(runs[T], days) for T in temperatures)
for T in temperatures
    @printf("%2.0f °C: %s, %d steps\n", T, runs[T].sol.retcode, length(runs[T].sol.t))
end
 5 °C: Success, 205 steps
20 °C: Success, 213 steps
40 °C: Success, 228 steps

Neither law reads the equilibrium partition, so the trajectories do not depend on it; every number below is computed on the certified replay of each run (speciated_states), in g per 100 g of binder, the thermogravimetry over the mass at 550 °C as Snellings et al. (2022) report it.

3. Bound water and portlandite ​

julia
row(key, name, technique, T) = join((@sprintf("%5.1f/%5.1f", getproperty(o, key), m) for (o, m) in zip(obs[T], sn22p_measured(name, technique, T))), " ")
println("computed/measured        ", join((lpad("$d d", 11) for d in days)))
for (key, name, technique) in ((:bound_water, "bound water", "TGA"), (:portlandite_tga, "portlandite", "TGA"), (:portlandite, "portlandite", "XRD"))
    for T in temperatures
        @printf("%-12s %-4s %2.0f °C  %s\n", name, technique, T, row(key, name, technique, T))
    end
end
computed/measured                1 d        2 d        7 d       28 d       90 d      180 d
bound water  TGA   5 °C    9.9/  5.4  12.4/  9.7  17.7/ 16.1  22.8/ 21.9  26.0/ 25.3  27.4/ 25.4
bound water  TGA  20 °C   14.0/ 12.3  17.0/ 15.6  21.9/ 21.9  25.8/ 25.3  27.9/ 27.1  28.8/ 26.8
bound water  TGA  40 °C   19.7/ 16.6  22.2/ 20.2  25.6/ 22.4  28.0/ 26.0  29.2/ 27.3  29.6/ 27.8
portlandite  TGA   5 °C    2.7/  1.4   4.5/  4.9   6.2/  7.3   6.7/  7.3   6.6/  6.9   6.4/  6.9
portlandite  TGA  20 °C    4.5/  5.8   5.4/  6.6   6.2/  6.8   6.5/  6.5   6.5/  6.2   6.5/  6.1
portlandite  TGA  40 °C    5.1/  6.1   5.6/  6.1   6.2/  5.7   6.5/  5.5   6.7/  5.5   6.8/  5.4
portlandite  XRD   5 °C    2.7/  2.3   4.5/  4.2   6.1/  7.7   6.6/  8.3   6.5/  7.8   6.4/  8.2
portlandite  XRD  20 °C    4.4/  4.7   5.3/  6.1   6.2/  5.8   6.4/  7.3   6.4/  7.3   6.4/  7.6
portlandite  XRD  40 °C    5.1/  6.1   5.6/  6.7   6.1/  5.5   6.4/  6.4   6.6/  6.4   6.7/  6.1
julia
function versus_age(key, name, technique; legend = false)
    ylabel = technique == "TGA" ? "% of the mass at 550 °C" : "g per 100 g of binder"
    p = plot(; xscale = :log10, xlabel = "age (days)", ylabel, title = "$name ($technique)", titlefontsize = 10, legend)
    for (k, T) in enumerate(temperatures)
        plot!(p, days, [getproperty(o, key) for o in obs[T]]; lw = 2, color = k, marker = :circle, ms = 3, label = "$(Int(T)) °C")
        scatter!(p, days, sn22p_measured(name, technique, T); color = k, marker = :diamond,
                 label = legend !== false && k == 1 ? "measured" : "")
    end
    return p
end
plot(versus_age(:bound_water, "bound water", "TGA"; legend = :bottomright),
     versus_age(:portlandite_tga, "portlandite", "TGA"), versus_age(:portlandite, "portlandite", "XRD");
     layout = (1, 3), size = (1100, 360), left_margin = 6Plots.mm, bottom_margin = 7Plots.mm)

The bound water and the portlandite follow the measurement. The bound water is within two points of it from 28 days on at the three temperatures, and at seven days at 5 and 20 °C. Before, it is high, at 5 °C by four and a half points at one day, where the calculation holds all its ettringite from the first day and the paste half of it (Section 4). The portlandite is within 1.4 points of the thermogravimetry and 1.8 of the diffraction at every age and temperature. Its trend with the temperature is not the measured one: the thermogravimetry finds less portlandite at six months the hotter the paste, 6.9, 6.1 and 5.4 %, where the calculation finds a little more, 6.4, 6.5 and 6.8 %.

4. Ettringite, hydrotalcite and the carboaluminates ​

julia
for (key, name) in ((:ettringite, "ettringite"), (:hydrotalcite, "hydrotalcite"), (:hemicarbonate, "hemicarbonate"), (:monocarbonate, "monocarbonate"))
    for T in temperatures
        @printf("%-13s %2.0f °C  %s\n", name, T, row(key, name, "XRD", T))
    end
end
for T in temperatures
    measured = sn22p_measured("hemicarbonate", "XRD", T) .+ sn22p_measured("monocarbonate", "XRD", T)
    computed = [o.hemicarbonate + o.monocarbonate for o in obs[T]]
    @printf("both          %2.0f °C  %s\n", T, join((@sprintf("%5.1f/%5.1f", c, m) for (c, m) in zip(computed, measured)), " "))
end
ettringite     5 °C    9.8/  5.3   9.9/  9.0   9.9/ 14.7   9.9/ 14.1   9.9/ 14.2   9.9/ 13.5
ettringite    20 °C    9.9/ 12.0   9.9/ 12.2   9.9/ 12.0   9.9/ 11.9   9.9/ 11.9   9.9/ 11.3
ettringite    40 °C    9.8/  9.7   9.8/  9.3   9.8/  9.2   9.8/  9.5   9.8/  8.2   9.8/  8.7
hydrotalcite   5 °C    2.0/  0.0   3.2/  0.0   3.8/  0.0   4.7/  4.6   5.4/  4.7   5.7/  6.0
hydrotalcite  20 °C    3.6/  0.0   4.0/  0.0   4.8/  3.9   5.5/  5.0   5.9/  6.2   6.1/  7.0
hydrotalcite  40 °C    4.7/  1.0   5.1/  6.0   5.7/  5.8   6.1/  6.7   6.3/  7.6   6.3/  8.6
hemicarbonate  5 °C    0.0/  0.0   0.0/  0.0   0.0/  4.8   0.0/  7.5   0.0/  7.1   0.0/  6.8
hemicarbonate 20 °C    0.0/  1.3   0.0/  4.9   0.0/  7.0   0.0/  6.8   0.0/  7.5   0.0/  6.0
hemicarbonate 40 °C    0.0/  5.2   0.0/  4.4   0.0/  4.8   0.0/  5.5   0.0/  3.5   0.0/  3.7
monocarbonate  5 °C    0.0/  0.0   0.4/  0.0   5.0/  0.8   9.5/  0.1  12.3/  1.3  13.6/  2.2
monocarbonate 20 °C    1.7/  0.0   4.2/  0.0   8.2/  1.5  11.4/  1.4  13.1/  1.1  13.7/  1.9
monocarbonate 40 °C    6.6/  0.0   8.5/  0.0  11.1/  0.1  12.7/  0.4  13.5/  0.8  13.8/  1.0
both           5 °C    0.0/  0.0   0.4/  0.0   5.0/  5.6   9.5/  7.6  12.3/  8.3  13.6/  9.0
both          20 °C    1.7/  1.3   4.2/  4.9   8.2/  8.6  11.4/  8.2  13.1/  8.7  13.7/  8.0
both          40 °C    6.6/  5.2   8.5/  4.4  11.1/  4.9  12.7/  5.9  13.5/  4.3  13.8/  4.7
julia
both(T) = [o.hemicarbonate + o.monocarbonate for o in obs[T]]
carbo = plot(; xscale = :log10, xlabel = "age (days)", ylabel = "g per 100 g of binder",
             title = "hemi- + monocarbonate (XRD)", titlefontsize = 10, legend = false)
for (k, T) in enumerate(temperatures)
    plot!(carbo, days, both(T); lw = 2, color = k, marker = :circle, ms = 3)
    scatter!(carbo, days, sn22p_measured("hemicarbonate", "XRD", T) .+ sn22p_measured("monocarbonate", "XRD", T);
             color = k, marker = :diamond)
end
plot(versus_age(:ettringite, "ettringite", "XRD"; legend = :bottomright), versus_age(:hydrotalcite, "hydrotalcite", "XRD"),
     carbo; layout = (1, 3), size = (1100, 360), left_margin = 6Plots.mm, bottom_margin = 7Plots.mm)

The sulfate of the paste bounds its ettringite. All of it held in ettringite makes, per 100 g of binder:

julia
st = runs[20.0].kp.initial_state
n_S = sum(ustrip(us"mol", st.n[i]) * get(atoms(s), :S, 0) for (i, s) in enumerate(st.system.species))
ett = st.system.dict_species["ettringite"]
@printf("%.1f g of ettringite at most\n", n_S / get(atoms(ett), :S, 0) * ustrip(us"g/mol", ett[:M]))
9.9 g of ettringite at most

The ettringite is that bound, at every temperature. From the first day all the sulfate of the cement is in ettringite, and it stays there: below the temperature where monosulfate takes over (see the hydrates of two cements from 0 to 60 °C), the calcite turns the aluminum the sulfate leaves into carboaluminates. The diffraction finds as much at 40 °C, but more at 20 °C, 12 %, and more still at 5 °C, 14 %: more than the sulfate of the cement can make. Either the slag gives sulfur, which its analysis does not report and this calculation leaves out, or the diffraction counts more ettringite than there is; the measurement alone does not tell which.

The carboaluminate is monocarbonate here, hemicarbonate in the paste. With calcite in excess, monocarbonate is the stable carboaluminate of Cemdata18 (Lothenbach et al., 2019), and the calculation forms it alone; the diffraction finds mostly hemicarbonate, which forms first and turns into monocarbonate slowly, as Snellings et al. (2022) observe. From 28 days on the calculation forms more carboaluminate than the two measured together, the last three lines of the table: at six months half as much again at 5 °C and three times as much at 40 °C, where the measured ettringite holds aluminum the calculation puts in the AFm.

The hydrotalcite is there from the first day. The magnesia of the cement's minor oxides and of the dolomite, at equilibrium from the mixing, forms it at once, where the diffraction finds none before seven days at 20 °C and before 28 days at 5 °C; Snellings et al. (2022) tie its formation to the reaction of the slag. At three and six months the calculation is within 2.3 points of the measurement.

5. What the comparison says ​

The rate laws of the previous page carry the temperature into the bound water and the portlandite of the pastes within two points, from four weeks on; the hydrates that hold the aluminum and the sulfate do not follow as well. The ettringite of the calculation is fixed by the sulfate of the cement where the measurement finds up to half as much again, the carboaluminate is the stable monocarbonate where the paste holds hemicarbonate, and the hydrotalcite forms from magnesia the calculation releases at the mixing. Each points to an input that Snellings et al. (2022) do not give, the sulfur of the slag and where the magnesia of the cement sits, or to a hydrate the paste has not yet reached.

Where to go next ​

CEM I 52.5 N HTS and CEM II/A-L 42.5 R from 0 to 60 °C follows the same hydrates at equilibrium up to the temperature where monosulfate replaces ettringite and monocarbonate.