Skip to content

Commit

Permalink
beautiful
Browse files Browse the repository at this point in the history
  • Loading branch information
amylu00 committed Feb 13, 2024
1 parent 02264e8 commit 05facfd
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 53 deletions.
34 changes: 30 additions & 4 deletions docs/src/IceNucleationParcel0D.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,28 @@ where:

## Deposition Nucleation on dust particles
There are multiple ways of running deposition nucleation in the parcel.
`"MohlerAF_Deposition"` will trigger an activated fraction approach from [Mohler2006](@cite).
`"MohlerRate_Deposition"` will trigger a nucleation rate approach from [Mohler2006](@cite).
`"MohlerAF_Deposition"` will trigger an activated fraction approach
from [Mohler2006](@cite). `"MohlerRate_Deposition"` will trigger a
nucleation rate approach from [Mohler2006](@cite). For both approaches,
there is no nucleation if saturation over ice exceeds 1.35 as conditions
above this value will result in nucleation in a different mode.
`"ActivityBasedDeposition"` will trigger a water activity based approach
from [Alpert2022](@cite). In this approach, ice production rate ``P_{ice, depo}``
is calculated from
```math
\begin{equation}
P_{ice} = \left[ \frac{dN_i}{dt} \right]_{dep0} = J_{depo}A_{aero}N_{aero}
\label{eq:ActivityBasedDeposition_P_ice}
\end{equation}
```
where ``N_{areo}`` is total number of unactiviated ice nucleating particles and
``A_{aero}`` is surface area of those INP.
The deposition nucleation methods are parameterized as described in
[Ice Nucleation](https://clima.github.io/CloudMicrophysics.jl/dev/IceNucleation/).

## Immersion Freezing
Following the water activity based immersion freezing model (ABIFM), the ABIFM derived
nucleation rate coefficient, ``J_{immer}``, can be determined. The ice production rate,``P_{ice}``,
nucleation rate coefficient, ``J_{immer}``, can be determined. The ice production rate,``P_{ice, immer}``,
per second via immersion freezing can then be calculating using
```math
\begin{equation}
Expand Down Expand Up @@ -245,7 +259,7 @@ Between each run the water vapor specific humidity is changed,
of the previous run.
The prescribed vertical velocity is equal to 3.5 cm/s.
Supersaturation is plotted for both liquid (solid lines) and ice (dashed lines).
The pale blue line uses the `"MohlerRate_Deposition"`approach.
The pale blue line uses the `"MohlerRate_Deposition"` approach.
We only run it for the first GCM timestep because the rate approach requires
the change in ice saturation over time. With the discontinuous jump in saturation,
the parameterization is unable to determine a proper nucleation rate. When we force
Expand All @@ -258,6 +272,18 @@ include("../../parcel/Tully_et_al_2023.jl")
```
![](cirrus_box.svg)

The water activity based parameterization for deposition nucleation shows
similar outcomes when compared to the `"MohlerRate_Deposition"` approach.
Here, we run the parcel for 100 secs for all available aerosol types. The
solid lines correspond to the `"MohlerRate_Deposition"` approach while the
dashed lines correspond to `"ActivityBasedDeposition"`. Note that there
is no common aerosol type between the two parameterizations.

```@example
include("../../parcel/Deposition_Nucleation.jl")
```
![](deposition_nucleation.svg)

In the plots below, the parcel model is ran with only condensation (no ice or freezing)
assuming either a monodisperse or a gamma distribution of droplets.
It is compared to [Rogers1975](@cite).
Expand Down
124 changes: 76 additions & 48 deletions parcel/Deposition_Nucleation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,18 @@ e = qᵥ * p₀ * R_v / Rₐ
Sₗ = FT(e / eₛ)
IC = [Sₗ, p₀, T₀, qᵥ, qₗ, qᵢ, Nₐ, Nₗ, Nᵢ, x_sulph]

ξ(T) = TD.saturation_vapor_pressure(tps, T, TD.Liquid()) /
TD.saturation_vapor_pressure(tps, T, TD.Ice())
S_i(T, S_liq) = ξ(T) * S_liq

# Simulation parameters passed into ODE solver
r_nuc = FT(1.25e-6) # assumed size of nucleated particles
w = FT(3.5 * 1e-2) # updraft speed
α_m = FT(0.5) # accomodation coefficient
const_dt = FT(0.1) # model timestep
t_max = FT(100)
aerosol_1 = CMP.DesertDust(FT) # aersol type for DustDeposition
aerosol_2 = CMP.Feldspar(FT) # aersol type for DepositionNucleation
aerosol_1 = [CMP.DesertDust(FT), CMP.ArizonaTestDust(FT)] # aersol type for DustDeposition
aerosol_2 = [CMP.Feldspar(FT), CMP.Ferrihydrite(FT), CMP.Kaolinite(FT)] # aersol type for DepositionNucleation
ice_nucleation_modes_list = [["MohlerRate_Deposition"], ["ActivityBasedDeposition"]]
growth_modes = ["Deposition"]
droplet_size_distribution_list = [["Monodisperse"]]
Expand All @@ -62,60 +66,84 @@ ax4 = MK.Axis(fig[2, 2], ylabel = "N_ice [m^-3]", xlabel = "time")
for ice_nucleation_modes in ice_nucleation_modes_list
nuc_mode = ice_nucleation_modes[1]
droplet_size_distribution = droplet_size_distribution_list[1]

if nuc_mode == "MohlerRate_Deposition"
p = (;
wps,
aps,
tps,
ip,
const_dt,
r_nuc,
w,
α_m,
aerosol = aerosol_1,
ice_nucleation_modes,
growth_modes,
droplet_size_distribution,
)
else
p = (;
wps,
aps,
tps,
ip,
const_dt,
r_nuc,
w,
α_m,
aerosol = aerosol_2,
ice_nucleation_modes,
growth_modes,
droplet_size_distribution,
)
for aerosol in aerosol_1
p = (;
wps,
aps,
tps,
ip,
const_dt,
r_nuc,
w,
α_m,
aerosol,
ice_nucleation_modes,
growth_modes,
droplet_size_distribution,
)

# solve ODE
sol = run_parcel(IC, FT(0), t_max, p)

# Plot results
if aerosol == CMP.DesertDust(FT)
aero_label = "DesertDust"
elseif aerosol == CMP.ArizonaTestDust(FT)
aero_label = "ArizonaTestDust"
end
MK.lines!(ax1, sol.t, S_i.(sol[3, :], sol[1, :]), label = aero_label) # saturation
MK.lines!(ax2, sol.t, sol[3, :]) # temperature
MK.lines!(ax3, sol.t, sol[6, :] * 1e3) # q_ice
MK.lines!(ax4, sol.t, sol[9, :]) # N_ice
end

elseif nuc_mode == "ActivityBasedDeposition"
for aerosol in aerosol_2
p = (;
wps,
aps,
tps,
ip,
const_dt,
r_nuc,
w,
α_m,
aerosol,
ice_nucleation_modes,
growth_modes,
droplet_size_distribution,
)

# solve ODE
sol = run_parcel(IC, FT(0), t_max, p)

# Plot results
if aerosol == CMP.Feldspar(FT)
aero_label = "Feldspar"
elseif aerosol == CMP.Ferrihydrite(FT)
aero_label = "Ferrihydrite"
elseif aerosol == CMP.Kaolinite(FT)
aero_label = "Kaolinite"
end
MK.lines!( # saturation
ax1, sol.t, S_i.(sol[3, :], sol[1, :]),
label = aero_label, linestyle = :dash)
MK.lines!(ax2, sol.t, sol[3, :], linestyle = :dash) # temperature
MK.lines!(ax3, sol.t, sol[6, :] * 1e3, linestyle = :dash) # q_ice
MK.lines!(ax4, sol.t, sol[9, :], linestyle = :dash) # N_ice
end
end
# solve ODE
sol = run_parcel(IC, FT(0), t_max, p)

# Plot results
ξ(T) =
TD.saturation_vapor_pressure(tps, T, TD.Liquid()) /
TD.saturation_vapor_pressure(tps, T, TD.Ice())
S_i(T, S_liq) = ξ(T) * S_liq

MK.lines!(ax1, sol.t, S_i.(sol[3, :], sol[1, :]), label = nuc_mode) # saturation
MK.lines!(ax2, sol.t, sol[3, :]) # temperature
MK.lines!(ax3, sol.t, sol[6, :] * 1e3) # q_ice
MK.lines!(ax4, sol.t, sol[9, :]) # N_ice
end

MK.axislegend(
ax1,
framevisible = false,
labelsize = 12,
orientation = :horizontal,
nbanks = 2,
position = :rb,
nbanks = 3,
position = :lt,
)

#MK.save("deposition_nucleation.svg", fig)
fig
MK.save("deposition_nucleation.svg", fig)
2 changes: 1 addition & 1 deletion parcel/parcel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ function run_parcel(IC, t_0, t_end, p)
timestepper = ODE.Euler()
end
if "ActivityBasedDeposition" in ice_nucleation_modes
print("Water activity based deposition nucleaiton ")
print("Water activity based deposition nucleation ")
end
if "ImmersionFreezing" in ice_nucleation_modes
print("Immersion freezing ")
Expand Down

0 comments on commit 05facfd

Please sign in to comment.