A CEM I paste replaced by fly ash, carbonated, salted and leached
Before this page
Recipes: materials, extents and what has not reacted, and the materials of Validation against measured blended pastes.
A process is a sequence of equilibria in which one quantity changes from each equilibrium to the next: the share of the binder replaced by a fly ash, the carbon dioxide taken up, the salt added, the water that has flowed through. Each equilibrium starts from the answer before it, which is faster than starting cold and keeps the sequence on one branch. This page runs the four processes of the recipe layer on one paste.
The paste is the CEM I of De Weerdt et al. (2011), a clinker interground with 3.7 % gypsum and hydrated at a water/binder ratio of 0.5 and 20 °C, at 90 days. Its clinker phases have reacted as the paper measured them by XRD.
using ChemistryLab
using DynamicQuantities
using Printf
using Plots
default(framestyle = :box, grid = false)
# The materials and recipes of De Weerdt et al. (2011), shared with the
# validation page.
include(joinpath(pkgdir(ChemistryLab), "scripts", "de_weerdt_2011.jl"))
model = cemdata18_activity_model(:KOH)1. The paste and its phases
The phases a paste may form are a choice, and data/phase_lists.toml holds that choice for published pastes, each list written after the paper it names. This list is written for a Portland cement paste:
list = "Portland paste (Lothenbach and Winnefeld 2006)"
pl = phase_list(list)
println("reactants: ", join(pl.reactants, ", "))
println("products: ", join(pl.products, ", "))
println("solid solutions: ", join(pl.solid_solutions, ", "))reactants: C3S, C2S, C3A, C4AF, Gp, Anh, hemihydrate, Cal, K2SO4, Na2SO4
products: Portlandite, syngenite, ettringite, monocarbonate, hemicarbonate, C3AH6, C3FH6, hydrotalcite, Brc, FeOOHmic, AlOHmic, straetlingite, Amor-Sl
solid solutions: CSHQ, AFm_SO4_OHThe list has no chloride phase. Section 4 adds salt, so this page departs from the list, and says so: add declares Friedel's salt (C4AClH10) and Kuzel's salt (C4AsClH12), the AFm phases that bind chloride. Chlorine then enters the system, and so do its aqueous species.
cs = phase_list_system(list, DW11_SUBSTANCES; add = ["C4AClH10", "C4AsClH12"])
recipe = dw11_recipe("OPC")
paste, cert = equilibrate_certified(recipe, cs; t = 90, model)
cert.optimaltrueTwo helpers read what the sections below compare: the mass of a few solids, in grams per 100 g of binder, and the C-S-H, its mass and its calcium-to-silicon ratio.
solids(rs, names) = [get(phase_masses(rs), n, 0.0) for n in names]
function csh(rs)
gel = solid_solution_totals(rs.state, "CSHQ")
si = get(gel.elements, :Si, 0.0)
return (g = 1000 * ustrip(gel.mass), ca_si = si > 0 ? gel.elements[:Ca] / si : NaN)
end
ratio(x) = isnan(x) ? " –" : @sprintf("%5.2f", x)
@printf("portlandite %.1f g, C-S-H %.1f g at Ca/Si %.2f, pH %.2f\n",
solids(paste, ["Portlandite"])[1], csh(paste).g, csh(paste).ca_si, pH(paste.state, model))portlandite 27.8 g, C-S-H 57.1 g at Ca/Si 1.58, pH 13.642. Replacing part of the cement by fly ash
blend replaces the fraction f of the binder by another material and keeps the binder mass and the water/binder ratio. Here the material is the siliceous fly ash of De Weerdt et al. (2011). Its glass reacts at the rate the paper fitted, 30 % of the fly ash at 90 days, and its crystals stay inert. The clinker keeps the degrees of reaction measured in the CEM I, although in the blended pastes of the paper the clinker reacted somewhat faster.
fractions = 0.0:0.1:0.5
bl = blend(recipe, dw11_fly_ash(), fractions, cs; t = 90, model)
println(" f portlandite C-S-H Ca/Si pH")
for (f, rs) in zip(fractions, bl)
@printf("%4.1f %9.1f g %6.1f g %5.2f %5.2f\n", f, solids(rs, ["Portlandite"])[1], csh(rs).g, csh(rs).ca_si,
pH(rs.state, model))
end f portlandite C-S-H Ca/Si pH
0.0 27.8 g 57.1 g 1.58 13.64
0.1 21.5 g 56.3 g 1.58 13.62
0.2 15.1 g 55.5 g 1.58 13.60
0.3 8.5 g 54.8 g 1.58 13.58
0.4 2.3 g 54.0 g 1.59 13.55
0.5 0.0 g 49.4 g 1.52 13.51Portlandite falls faster than the cement is removed. With 40 % of fly ash, the 60 % of cement left would make 16.7 g of it, and 2.3 g remain: the silica of the glass has taken the rest to form C-S-H, which is the pozzolanic reaction. The C-S-H therefore falls much less than the cement, from 57.1 g to 54.0 g where the cement alone would make 34 g. Its Ca/Si stays at 1.58, the value in equilibrium with portlandite, for as long as portlandite remains; at 50 % portlandite is gone and the gel starts to lose calcium. The validation page measured how far this goes against the real pastes: at 35 % the model consumed portlandite faster than the pastes did, so this sweep overstates it too.
3. Carbonation
carbonate adds carbon dioxide to the budget of the paste, here up to 1 mol per 100 g of binder. The unreacted clinker stays aside.
co2 = 0.0:0.1:1.0
co = carbonate(paste, co2)
println("CO2 (mol) portlandite calcite C-S-H Ca/Si pH")
for (x, rs) in zip(co2, co)
p, c = solids(rs, ["Portlandite", "Cal"])
@printf("%6.1f %10.1f g %6.1f g %6.1f g %s %5.2f\n", x, p, c, csh(rs).g, ratio(csh(rs).ca_si),
pH(rs.state, model))
endCO2 (mol) portlandite calcite C-S-H Ca/Si pH
0.0 27.8 g 0.0 g 57.1 g 1.58 13.64
0.1 20.6 g 8.2 g 57.1 g 1.58 13.64
0.2 13.2 g 18.2 g 57.1 g 1.58 13.63
0.3 5.7 g 28.2 g 57.1 g 1.58 13.62
0.4 0.0 g 38.2 g 55.2 g 1.50 13.56
0.5 0.0 g 49.3 g 47.4 g 1.23 13.34
0.6 0.0 g 60.0 g 39.5 g 0.93 12.66
0.7 0.0 g 70.1 g 36.3 g 0.70 11.03
0.8 0.0 g 80.1 g 23.3 g 0.67 9.90
0.9 0.0 g 90.1 g 4.7 g 0.67 9.90
1.0 0.0 g 94.4 g 0.0 g – 7.99The carbon dioxide first turns portlandite into calcite, which is gone by 0.4 mol. The pH hardly moves meanwhile, from 13.64 to 13.62: it is set by the sodium and potassium of the pore solution, not by portlandite. Calcite then takes its calcium from the C-S-H. The Ca/Si of the gel falls from 1.58 to 0.67 by 0.8 mol, and the pH with it, to 9.90. At a Ca/Si of 0.67 the gel is its most calcium-poor end member, and the pH holds at that value while it is carbonated in turn. At 1.0 mol no C-S-H is left, and the pH is 7.99. The carbonation page compares this sequence with the calculation and the measurements of Shi et al. (2016) on four mortars.
names = ["Portlandite", "Cal", "ettringite", "monocarbonate", "Gp", "Amor-Sl"]
p1 = plot(; xlabel = "CO₂ added (mol per 100 g of binder)", ylabel = "g per 100 g of binder", legend = :topleft)
for n in names
plot!(p1, co2, [solids(rs, [n])[1] for rs in co]; label = n, linewidth = 2)
end
plot!(p1, co2, [csh(rs).g for rs in co]; label = "C-S-H", linewidth = 2, color = :black)
p2 = plot(co2, [pH(rs.state, model) for rs in co]; xlabel = "CO₂ added (mol per 100 g of binder)",
ylabel = "pH", legend = false, linewidth = 2, color = :black)
fig = plot(p1, p2; layout = (1, 2), size = (900, 380), left_margin = 6Plots.mm, bottom_margin = 6Plots.mm)4. Salt
add_salt adds a salt by its formula. Sodium chloride is not a phase of this system, and its ions enter together, so the budget stays neutral. Section 1 declared Friedel's and Kuzel's salts, so the paste can bind chloride. Every equilibrium's certificate also reports its ionic strength against the range the Cemdata18 activity model (Lothenbach et al., 2019) is stated for, about 1 mol/kg.
nacl = 0.0:0.01:0.06
sa = add_salt(paste, "NaCl", nacl)
water_kg(rs) = ustrip(us"kg", mass(rs.state, cs.species[only(cs.idx_solvent)]))
afm(rs) = sum(m for (k, m) in phase_masses(rs) if startswith(k, "monosulphate12") || startswith(k, "C4AH13"); init = 0.0)
println("NaCl (mol) free Cl (mol/kg) bound Cl Friedel Kuzel monosulfate I (mol/kg) in range")
for (x, rs) in zip(nacl, sa)
free = get(pore_solution(rs).elements, :Cl, 0.0)
bound = x - free * water_kg(rs)
f, k = solids(rs, ["C4AClH10", "C4AsClH12"])
m = afm(rs)
@printf("%7.2f %12.3f %11.1f %% %6.1f g %5.1f g %8.1f g %9.2f %s\n", x, free,
x > 0 ? 100 * bound / x : 0.0, f, k, m, rs.certificate.ionic_strength, rs.certificate.within_activity_range)
endNaCl (mol) free Cl (mol/kg) bound Cl Friedel Kuzel monosulfate I (mol/kg) in range
0.00 0.000 0.0 % 0.0 g 0.0 g 16.1 g 0.40 true
0.01 0.103 81.5 % 0.0 g 5.0 g 10.1 g 0.53 true
0.02 0.124 89.2 % 0.0 g 10.9 g 3.1 g 0.64 true
0.03 0.443 74.8 % 0.3 g 13.1 g 0.0 g 0.88 true
0.04 0.507 78.8 % 6.6 g 4.8 g 0.0 g 1.01 false
0.05 0.800 73.6 % 10.3 g 0.0 g 0.0 g 1.26 false
0.06 1.403 61.4 % 10.3 g 0.0 g 0.0 g 1.72 falseThis paste holds no calcite, so its AFm is the monosulfate, and the first chloride goes into Kuzel's salt, which is formed from it: 81 to 89 % of the chloride added is bound. Friedel's salt appears from 0.03 mol, and the Kuzel's salt then gives way to it. From 0.05 mol the Kuzel's salt is gone and Friedel's salt stops growing, at 10.3 g, so what is added stays in solution: 61 % of the chloride is bound at 0.06 mol. From 0.04 mol the ionic strength is past the range of the model, and the certificate says so. The answer is certified, but for an activity model applied outside its stated range.
5. Leaching
leach removes the whole pore solution and replaces it with fresh water, step after step, as water flowing through a paste would. Each step here uses 5 kg of water, a hundred times the water of the paste, so that a few steps show the whole sequence.
le = leach(paste, 12; renewal = 5000u"g")
println("step portlandite C-S-H Ca/Si pH")
for (k, rs) in enumerate(le)
@printf("%4d %9.1f g %6.1f g %5.2f %5.2f\n", k, solids(rs, ["Portlandite"])[1], csh(rs).g, csh(rs).ca_si,
pH(rs.state, model))
endstep portlandite C-S-H Ca/Si pH
1 19.5 g 56.9 g 1.63 12.68
2 11.8 g 56.9 g 1.63 12.66
3 4.0 g 56.8 g 1.63 12.66
4 0.0 g 54.7 g 1.54 12.57
5 0.0 g 49.7 g 1.47 12.48
6 0.0 g 46.5 g 1.32 12.27
7 0.0 g 44.4 g 1.22 12.12
8 0.0 g 42.7 g 1.15 12.00
9 0.0 g 41.3 g 1.09 11.91
10 0.0 g 40.1 g 1.04 11.83
11 0.0 g 39.1 g 1.01 11.77
12 0.0 g 38.1 g 0.97 11.71The first renewal takes the sodium and potassium away, and the pH falls from 13.64 to 12.68, the value set by portlandite. The Ca/Si of the gel rises at the same time, from 1.58 to 1.63, because its alkali end members, which hold silicon and no calcium, leave with the alkalis. Portlandite then dissolves step by step at an almost constant pH, and is gone at the fourth renewal. The C-S-H then loses its calcium in turn: its Ca/Si falls to 0.97 by the twelfth renewal, and the pH to 11.71. A paste in contact with flowing soft water degrades in this order.
Where to go next
The materials, and how the model compares with the measured pastes, are on Validation against measured blended pastes. The layer itself is described on Recipes.