Skip to content

Solidus

Dry solidus

The dry solidus temperature can be obtained as a function of pressure P through solidus_Hirschmann2000 and solidus_Katz2003.

Code for this figure
julia
f = Figure()
ax1 = Axis(f[1, 1]; xlabel="solidus temp (K)", ylabel="depth (km)", backgroundcolor=(
    :magenta, 0.05))
ax1.yreversed = true

xtfn(x) = @. string(round((x - 5) / 30.2; digits=2))
ax2 = Axis(f[1, 1]; ylabel="Pressure (GPa)", yaxisposition=:right, xaxisposition=:top,
    xtickformat=xtfn, backgroundcolor=(:magenta, 0.05), yticks=WilkinsonTicks(6; k_min=5))
hidespines!(ax2)
hidexdecorations!(ax2)
linkxaxes!(ax1, ax2)

ax2.yreversed = true

z = 40:300
P = @. (z - 5) / 30.2
ps_nt = (; P)

sol_h = solidus_Hirschmann2000(ps_nt).T_solidus
sol_k = solidus_Katz2003(ps_nt).T_solidus

lines!(ax1, sol_h, z; label="Hirschmann2000")
lines!(ax1, sol_k, z; label="Katz2003")

f[1, 2] = Legend(f, ax1)

Effect of volatiles

Addition of volatiles lowers the solidus temperature facilitating more melting.

Water

Lowering of solidus due to water is available through ΔT_h2o_Katz2003 and ΔT_h2o_Blatter2022:

Code for this figure
julia
f = Figure()
ax1 = Axis(f[1, 1]; xlabel="solidus temp (K)", ylabel="depth (km)",
    backgroundcolor=(:magenta, 0.05), title="Katz2003")
ax1.yreversed = true

xtfn(x) = @. string(round((x - 5) / 30.2; digits=2))
ax2 = Axis(f[1, 1]; ylabel="Pressure (GPa)", yaxisposition=:right, xaxisposition=:top,
    xtickformat=xtfn, backgroundcolor=(:magenta, 0.05), yticks=WilkinsonTicks(6; k_min=5))
hidespines!(ax2)
hidexdecorations!(ax2)
linkxaxes!(ax1, ax2)
ax2.yreversed = true

ax3 = Axis(f[1, 2]; xlabel="solidus temp (K)", ylabel="depth (km)",
    backgroundcolor=(:magenta, 0.05), title="Blatter2022")
ax3.yreversed = true

xtfn(x) = @. string(round((x - 5) / 30.2; digits=2))
ax4 = Axis(f[1, 2]; ylabel="Pressure (GPa)", yaxisposition=:right, xaxisposition=:top,
    xtickformat=xtfn, backgroundcolor=(:magenta, 0.05), yticks=WilkinsonTicks(6; k_min=5))
hidespines!(ax4)
hidexdecorations!(ax4)
linkxaxes!(ax3, ax4)
ax4.yreversed = true

z = 40:300
P = @. (z - 5) / 30.2
ps_nt = (; P)

T_solidus = solidus_Hirschmann2000(ps_nt).T_solidus
Ch2o_m = inv(0.005) .* [0.01, 10.0, 100.0, 500.0, 1000.0, 2000.0]'
ps_nt = (; P, T_solidus, Ch2o_m)
T_wet_k = ΔT_h2o_Katz2003((; ps_nt..., T_solidus)).T_solidus

lines!(ax1, T_solidus, z; label="dry", color=:green, linewidth=6)
for i in eachindex(Ch2o_m)
    color_ = RGBf(1 - i / length(Ch2o_m), 0.0, i / length(Ch2o_m))
    w = Ch2o_m[i]
    lines!(ax1, T_wet_k[:, i], z; label="$(w/1f4)", color=color_)
end

T_wet_b = ΔT_h2o_Blatter2022((; ps_nt..., T_solidus)).T_solidus

lines!(ax3, T_solidus, z; label="dry", color=:green, linewidth=6)
for i in eachindex(Ch2o_m)
    color_ = RGBf(1 - i / length(Ch2o_m), 0.0, i / length(Ch2o_m))
    w = Ch2o_m[i]
    lines!(ax3, T_wet_b[:, i], z; label="$(w/1f4)", color=color_)
end

f[2, 1:2] = Legend(f, ax1, "melt water conc. (wt %)"; orientation=:horizontal)

CO₂

Lowering of solidus due to CO₂ is available through ΔT_co2_Dasgupta2007 and ΔT_co2_Dasgupta2013:

Code for this figure
julia
f = Figure()
ax1 = Axis(f[1, 1]; xlabel="solidus temp (K)", ylabel="depth (km)",
    backgroundcolor=(:magenta, 0.05), title="Dasgupta2007")
ax1.yreversed = true

xtfn(x) = @. string(round((x - 5) / 30.2; digits=2))
ax2 = Axis(f[1, 1]; ylabel="Pressure (GPa)", yaxisposition=:right, xaxisposition=:top,
    xtickformat=xtfn, backgroundcolor=(:magenta, 0.05), yticks=WilkinsonTicks(6; k_min=5))
hidespines!(ax2)
hidexdecorations!(ax2)
linkxaxes!(ax1, ax2)
ax2.yreversed = true

ax3 = Axis(f[1, 2]; xlabel="solidus temp (K)", ylabel="depth (km)",
    backgroundcolor=(:magenta, 0.05), title="Dasgupta2013")
ax3.yreversed = true

xtfn(x) = @. string(round((x - 5) / 30.2; digits=2))
ax4 = Axis(f[1, 2]; ylabel="Pressure (GPa)", yaxisposition=:right, xaxisposition=:top,
    xtickformat=xtfn, backgroundcolor=(:magenta, 0.05), yticks=WilkinsonTicks(6; k_min=5))
hidespines!(ax4)
hidexdecorations!(ax4)
linkxaxes!(ax3, ax4)
ax4.yreversed = true

z = 40:300
P = @. (z - 5) / 30.2
ps_nt = (; P)

T_solidus = solidus_Hirschmann2000(ps_nt).T_solidus
Cco2_m = 1e4 .* [0.01, 1.0, 10.0, 30.0, 50.0]'
ps_nt = (; P, T_solidus, Cco2_m)
T_wet_k = ΔT_co2_Dasgupta2007((; ps_nt..., T_solidus)).T_solidus

lines!(ax1, T_solidus, z; label="dry", color=:green, linewidth=6)
for i in eachindex(Cco2_m)
    color_ = RGBf(1 - i / length(Cco2_m), 0.0, i / length(Cco2_m))
    w = Cco2_m[i]
    lines!(ax1, T_wet_k[:, i], z; label="$(w/1f4)", color=color_)
end

T_wet_b = ΔT_co2_Dasgupta2013((; ps_nt..., T_solidus)).T_solidus

lines!(ax3, T_solidus, z; label="dry", color=:green, linewidth=6)
for i in eachindex(Cco2_m)
    color_ = RGBf(1 - i / length(Cco2_m), 0.0, i / length(Cco2_m))
    w = Cco2_m[i]
    lines!(ax3, T_wet_b[:, i], z; label="$(w/1f4)", color=color_)
end

f[2, 1:2] = Legend(f, ax1, "melt CO₂ conc. (wt %)"; orientation=:horizontal)

Stable melt fraction

Addition of volatiles lowers the solidus, generating more melt. The partitioning of volatiles into melt would, however, require knowing about the melt fraction beforehand. We, therefore, follow Blatter, et al., 2022 to estimate the amount of thermodynamically stable melt using get_melt_fraction.

Code for this figure
julia
P = 3.0
T_solidus = solidus_Hirschmann2000((; P)).T_solidus
T = [1460, 1480, 1500, 1520] .+ 273.0
D = 0.0093
Ch2o = reshape(collect(0.0:10:5000.0), 1, :)
Cco2 = reshape(collect(0.0:100:10000.0), 1, 1, :)

ps_nt = (; P, T, T_solidus, Ch2o, Cco2, D)
ϕ = get_melt_fraction(ps_nt).ϕ;
size(ϕ)

fig = Figure(; size=(800, 900))
ax1 = Axis(fig[1, 1]; xlabel="bulk water conc. (ppm)", ylabel="bulk CO₂ conc. (ppm)", title="$(T[1]) K")
ax2 = Axis(fig[1, 2]; xlabel="bulk water conc. (ppm)", ylabel="bulk CO₂ conc. (ppm)", title="$(T[2]) K")
ax3 = Axis(fig[2, 1]; xlabel="bulk water conc. (ppm)", ylabel="bulk CO₂ conc. (ppm)", title="$(T[3]) K")
ax4 = Axis(fig[2, 2]; xlabel="bulk water conc. (ppm)", ylabel="bulk CO₂ conc. (ppm)", title="$(T[4]) K")

crange = extrema(ϕ)
cmap = :thermal
heatmap!(ax1, vec(Ch2o), vec(Cco2), ϕ[1, :, :]; colorrange=crange, colormap=cmap)
contour!(ax1, vec(Ch2o), vec(Cco2), ϕ[1, :, :]; labels=true, color=:white, labelsize=14)
heatmap!(ax2, vec(Ch2o), vec(Cco2), ϕ[2, :, :]; colorrange=crange, colormap=cmap)
contour!(ax2, vec(Ch2o), vec(Cco2), ϕ[2, :, :]; labels=true, color=:white, labelsize=14)
heatmap!(ax3, vec(Ch2o), vec(Cco2), ϕ[3, :, :]; colorrange=crange, colormap=cmap)
contour!(ax3, vec(Ch2o), vec(Cco2), ϕ[3, :, :]; labels=true, color=:black, labelsize=14)
h = heatmap!(ax4, vec(Ch2o), vec(Cco2), ϕ[4, :, :]; colorrange=crange, colormap=cmap)
contour!(ax4, vec(Ch2o), vec(Cco2), ϕ[4, :, :]; labels=true, color=:black, labelsize=14)
Colorbar(fig[3, :], h; vertical=false, label="melt fraction")
Label(fig[0, :], "melt fraction at dry solidus temp :  $(Int(round(T_solidus))) K"; fontsize=20)