From 46d4515ef2c9ce418c34740503968adb0c429f26 Mon Sep 17 00:00:00 2001 From: amylu00 Date: Thu, 25 Jan 2024 14:04:02 -0800 Subject: [PATCH] water based deposition nucleation --- docs/bibliography.bib | 34 +++++++++++++++++---- docs/src/API.md | 3 ++ docs/src/IceNucleation.md | 22 +++++++++++++- src/IceNucleation.jl | 26 ++++++++++++++-- src/parameters/AerosolDesertDust.jl | 4 +-- src/parameters/AerosolFeldspar.jl | 28 +++++++++++++++++ src/parameters/AerosolFerrihydrite.jl | 28 +++++++++++++++++ src/parameters/AerosolIllite.jl | 4 +-- src/parameters/AerosolKaolinite.jl | 13 ++++++-- src/parameters/Parameters.jl | 2 ++ test/gpu_tests.jl | 32 ++++++++++++++++++++ test/heterogeneous_ice_nucleation_tests.jl | 35 ++++++++++++++++++++++ test/performance_tests.jl | 2 ++ 13 files changed, 217 insertions(+), 16 deletions(-) create mode 100644 src/parameters/AerosolFeldspar.jl create mode 100644 src/parameters/AerosolFerrihydrite.jl diff --git a/docs/bibliography.bib b/docs/bibliography.bib index 1a08af037..bf5a6b65d 100644 --- a/docs/bibliography.bib +++ b/docs/bibliography.bib @@ -34,6 +34,18 @@ @article{Alpert2016 year = {2016} } +@Article{Alpert2022, +author = "Alpert, Peter A. and Boucly, Anthony and Yang, Shuo and Yang, Huanyu and Kilchhofer, Kevin and Luo, Zhaochu and Padeste, Celestino and Finizio, Simone and Ammann, Markus and Watts, Benjamin", +title = "Ice nucleation imaged with X-ray spectro-microscopy", +journal = " Environ. Sci.: Atmos.", +year = "2022", +volume = "2", +issue = "3", +pages = "335-351", +publisher = "RSC", +doi = "10.1039/D1EA00077B", +} + @Article{Baumgartner2022, author = {Baumgartner, M. and Rolf, C. and Groo{\ss}, J.-U. and Schneider, J. and Schorr, T. and M\"ohler, O. and Spichtinger, P. and Kr\"amer, M.}, title = {New investigations on homogeneous ice nucleation: the effects of water activity and water saturation formulations}, @@ -74,10 +86,22 @@ @article{Chen2022 journal={Atmospheric Research}, volume={293}, number={106171}, - doi = {https://doi.org/10.1016/j.atmosres.2022.106171}, + doi = {10.1016/j.atmosres.2022.106171}, year = {2022} } +@article{China2017, + author = {China, Swarup and Alpert, Peter A. and Zhang, Bo and Schum, Simeon and Dzepina, Katja and Wright, Kendra and Owen, R. Chris and Fialho, Paulo and Mazzoleni, Lynn R. and Mazzoleni, Claudio and Knopf, Daniel A.}, + title = {Ice cloud formation potential by free tropospheric particles from long-range transport over the Northern Atlantic Ocean}, + journal = {Journal of Geophysical Research: Atmospheres}, + volume = {122}, + number = {5}, + pages = {3065-3079}, + keywords = {ice cloud, free troposphere, long-range transport, ice nucleation, atmospheric aging}, + doi = {10.1002/2016JD025817}, + year = {2017} +} + @article{Desai2019, title = {Aerosol-Mediated Glaciation of Mixed-Phase Clouds: Steady-State Laboratory Measurements}, author = {Desai, Neel and Chandrakar, KK and Kinney, G and Cantrell, W and Shaw, RA}, @@ -110,7 +134,7 @@ @article{Glassmeier2016 address = {Boston MA, USA}, volume = {73}, number = {12}, - doi = {https://doi.org/10.1175/JAS-D-16-0008.1}, + doi = {10.1175/JAS-D-16-0008.1}, pages = {5003 - 5023} } @@ -164,7 +188,7 @@ @article{Karcher2006 journal = {Journal of Geophysical Research: Atmospheres}, volume = {111}, number = {D1}, - doi = {https://doi.org/10.1029/2005JD006219}, + doi = {10.1029/2005JD006219}, year = {2006} } @@ -335,9 +359,7 @@ @article{Luo1995 volume = {22}, number = {3}, pages = {247-250}, -doi = {https://doi.org/10.1029/94GL02988}, -url = {https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94GL02988}, -eprint = {https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/94GL02988}, +doi = {10.1029/94GL02988}, year = {1995} } diff --git a/docs/src/API.md b/docs/src/API.md index 26f2cefe6..80d5155af 100644 --- a/docs/src/API.md +++ b/docs/src/API.md @@ -86,6 +86,7 @@ AerosolActivation.total_M_activated ```@docs HetIceNucleation HetIceNucleation.dust_activated_number_fraction +HetIceNucleation.deposition_J HetIceNucleation.ABIFM_J ``` @@ -127,6 +128,8 @@ Parameters.ArizonaTestDust Parameters.DesertDust Parameters.Illite Parameters.Kaolinite +Parameters.Feldspar +Parameters.Ferrihydrite Parameters.Seasalt Parameters.Sulfate Parameters.AerosolActivationParameters diff --git a/docs/src/IceNucleation.md b/docs/src/IceNucleation.md index 331e7c9be..f1987dacd 100644 --- a/docs/src/IceNucleation.md +++ b/docs/src/IceNucleation.md @@ -47,6 +47,25 @@ Both parameters are dependent on aerosol properties and temperature. freezing occurs in a different ice nucleation mode (either a second deposition or other condensation type mode). +## Water Activity Based Deposition Nucleation +The water activity based deposition nucleation model is analagous to ABIFM + for immersion freezing (see [ABIFM for Sulphuric Acid Containing Droplets](https://clima.github.io/CloudMicrophysics.jl/dev/IceNucleation/#ABIFM-for-Sulphuric-Acid-Containing-Droplets) + section below). It calculates a nucleation rate coefficient, ``J``, which + describes the number of ice nuclei formed per unit area of INP per unit time + dependent on the water activity criterion, ``\Delta a_w``, and aerosol type. + The form of this empirical parameterization is taken from [KnopfAlpert2013](@cite). + Currently, we have parameters for kaolinite, feldspar, and ferrihydrite derived + from [China2017](@cite) and [Alpert2022](@cite). + +```math +\begin{equation} + log_{10}J_{deposition} = m \Delta a_w + c +\end{equation} +``` +where ``J`` is in units of ``cm^{-2}s^{-1}``. Note that our source code returns + ``J`` in SI units. ``m`` and ``c`` are aerosol dependent coefficients. They will + have different values than those for ABIFM. + ## ABIFM for Sulphuric Acid Containing Droplets Water Activity-Based Immersion Freezing Model (ABFIM) is a method of parameterizing immersion freezing inspired by the time-dependent @@ -66,7 +85,8 @@ Using empirical coefficients, ``m`` and ``c``, from [KnopfAlpert2013](@cite), \end{equation} ``` A parameterization for ``\Delta a_w`` can be found in `Common.jl`. More information on - it can be found in the `Water Activity` section. + it can be found in the `Water Activity` section. ``m`` and ``c`` here are different + from the ``m`` and ``c`` parameters for deposition nucleation. !!! note diff --git a/src/IceNucleation.jl b/src/IceNucleation.jl index 2c80312a4..f8ea26268 100644 --- a/src/IceNucleation.jl +++ b/src/IceNucleation.jl @@ -7,6 +7,7 @@ import ..Parameters as CMP import Thermodynamics as TD export dust_activated_number_fraction +export deposition_J export ABIFM_J """ @@ -41,7 +42,28 @@ function dust_activated_number_fraction( end """ - ABIFM_J(dust, ip, Δa_w) + deposition_J(dust, Δa_w) + + - `dust` - a struct with dust parameters + - `Δa_w` - change in water activity [unitless]. + +Returns the deposition nucleation rate coefficient, `J`, in m^-2 s^-1 +for different minerals in liquid droplets. +The free parameters `m` and `c` are derived from China et al (2017) +see DOI: 10.1002/2016JD025817 +""" +function deposition_J( + dust::Union{CMP.Ferrihydrite, CMP.Feldspar, CMP.Kaolinite}, + Δa_w::FT, +) where {FT} + + logJ::FT = dust.deposition_m * Δa_w + dust.deposition_c + + return max(FT(0), FT(10)^logJ * FT(1e4)) # converts cm^-2 s^-1 to m^-2 s^-1 +end + +""" + ABIFM_J(dust, Δa_w) - `dust` - a struct with dust parameters - `Δa_w` - change in water activity [unitless]. @@ -56,7 +78,7 @@ function ABIFM_J( Δa_w::FT, ) where {FT} - logJ::FT = dust.m * Δa_w + dust.c + logJ::FT = dust.ABIFM_m * Δa_w + dust.ABIFM_c return max(FT(0), FT(10)^logJ * FT(1e4)) # converts cm^-2 s^-1 to m^-2 s^-1 end diff --git a/src/parameters/AerosolDesertDust.jl b/src/parameters/AerosolDesertDust.jl index ef8dc5c0d..5fae891e7 100644 --- a/src/parameters/AerosolDesertDust.jl +++ b/src/parameters/AerosolDesertDust.jl @@ -20,9 +20,9 @@ struct DesertDust{FT} <: AerosolType{FT} "a for T < T_thr [-]" a_cold::FT "m coefficient for immersion freezing J [-]" - m::FT + ABIFM_m::FT "c coefficient for immersion freezing J [-]" - c::FT + ABIFM_c::FT end function DesertDust( diff --git a/src/parameters/AerosolFeldspar.jl b/src/parameters/AerosolFeldspar.jl new file mode 100644 index 000000000..59125de44 --- /dev/null +++ b/src/parameters/AerosolFeldspar.jl @@ -0,0 +1,28 @@ +export Feldspar + +""" + Feldspar{FT} + +Parameters for Feldspar from Alpert et al 2022 +DOI: 10.1039/D1EA00077B + +# Fields +$(DocStringExtensions.FIELDS) +""" +struct Feldspar{FT} <: AerosolType{FT} + "m coefficient for deposition nucleation J [-]" + deposition_m::FT + "c coefficient for deposition nucleation J [-]" + deposition_c::FT +end + +function Feldspar( + ::Type{FT}, + toml_dict::CP.AbstractTOMLDict = CP.create_toml_dict(FT), +) where {FT} + (; data) = toml_dict + return Feldspar( + FT(data["Alpert2022_J_deposition_m_Feldspar"]["value"]), + FT(data["Alpert2022_J_deposition_c_Feldspar"]["value"]), + ) +end diff --git a/src/parameters/AerosolFerrihydrite.jl b/src/parameters/AerosolFerrihydrite.jl new file mode 100644 index 000000000..f1762383b --- /dev/null +++ b/src/parameters/AerosolFerrihydrite.jl @@ -0,0 +1,28 @@ +export Ferrihydrite + +""" + Ferrihydrite{FT} + +Parameters for Ferrihydrite from Alpert et al 2022 +DOI: 10.1039/D1EA00077B + +# Fields +$(DocStringExtensions.FIELDS) +""" +struct Ferrihydrite{FT} <: AerosolType{FT} + "m coefficient for deposition nucleation J [-]" + deposition_m::FT + "c coefficient for deposition nucleation J [-]" + deposition_c::FT +end + +function Ferrihydrite( + ::Type{FT}, + toml_dict::CP.AbstractTOMLDict = CP.create_toml_dict(FT), +) where {FT} + (; data) = toml_dict + return Ferrihydrite( + FT(data["Alpert2022_J_deposition_m_Ferrihydrite"]["value"]), + FT(data["Alpert2022_J_deposition_c_Ferrihydrite"]["value"]), + ) +end diff --git a/src/parameters/AerosolIllite.jl b/src/parameters/AerosolIllite.jl index f20c6e47a..bd7b79ff4 100644 --- a/src/parameters/AerosolIllite.jl +++ b/src/parameters/AerosolIllite.jl @@ -11,9 +11,9 @@ $(DocStringExtensions.FIELDS) """ struct Illite{FT} <: AerosolType{FT} "m coefficient for immersion freezing J [-]" - m::FT + ABIFM_m::FT "c coefficient for immersion freezing J [-]" - c::FT + ABIFM_c::FT end function Illite( diff --git a/src/parameters/AerosolKaolinite.jl b/src/parameters/AerosolKaolinite.jl index 657bc85c1..3bc6af646 100644 --- a/src/parameters/AerosolKaolinite.jl +++ b/src/parameters/AerosolKaolinite.jl @@ -4,16 +4,21 @@ export Kaolinite Kaolinite{FT} Parameters for kaolinite from Knopf and Alpert 2013 -DOI: 10.1039/C3FD00035D +DOI: 10.1039/C3FD00035D and China et al 2017 +DOI: 10.1002/2016JD025817 # Fields $(DocStringExtensions.FIELDS) """ struct Kaolinite{FT} <: AerosolType{FT} + "m coefficient for deposition nucleation J [-]" + deposition_m::FT + "c coefficient for deposition nucleation J [-]" + deposition_c::FT "m coefficient for immersion freezing J [-]" - m::FT + ABIFM_m::FT "c coefficient for immersion freezing J [-]" - c::FT + ABIFM_c::FT end function Kaolinite( @@ -22,6 +27,8 @@ function Kaolinite( ) where {FT} (; data) = toml_dict return Kaolinite( + FT(data["China2017_J_deposition_m_Kaolinite"]["value"]), + FT(data["China2017_J_deposition_c_Kaolinite"]["value"]), FT(data["KnopfAlpert2013_J_ABIFM_m_Kaolinite"]["value"]), FT(data["KnopfAlpert2013_J_ABIFM_c_Kaolinite"]["value"]), ) diff --git a/src/parameters/Parameters.jl b/src/parameters/Parameters.jl index a4455ae40..343afba84 100644 --- a/src/parameters/Parameters.jl +++ b/src/parameters/Parameters.jl @@ -24,6 +24,8 @@ include("AerosolSulfate.jl") include("AerosolIllite.jl") include("AerosolKaolinite.jl") include("AerosolDesertDust.jl") +include("AerosolFeldspar.jl") +include("AerosolFerrihydrite.jl") # Parameters for aerosol specific parameterizations include("AerosolActivation.jl") diff --git a/test/gpu_tests.jl b/test/gpu_tests.jl index 25d51180c..3dc7f7165 100644 --- a/test/gpu_tests.jl +++ b/test/gpu_tests.jl @@ -480,6 +480,23 @@ end end end +@kernel function IceNucleation_deposition_J_kernel!( + output::AbstractArray{FT}, + kaolinite, + feldspar, + ferrihydrite, + Delta_a_w, +) where {FT} + + i = @index(Group, Linear) + + @inbounds begin + output[1] = CMI_het.deposition_J(kaolinite, Delta_a_w[1]) + output[2] = CMI_het.deposition_J(feldspar, Delta_a_w[2]) + output[3] = CMI_het.deposition_J(ferrihydrite, Delta_a_w[3]) + end +end + @kernel function IceNucleation_ABIFM_J_kernel!( output::AbstractArray{FT}, kaolinite, @@ -576,6 +593,8 @@ function test_gpu(FT) H2SO4_prs = CMP.H2SO4SolutionParameters(FT) illite = CMP.Illite(FT) kaolinite = CMP.Kaolinite(FT) + feldspar = CMP.Feldspar(FT) + ferrihydrite = CMP.Ferrihydrite(FT) ip = CMP.IceNucleationParameters(FT) @testset "Aerosol activation kernels" begin @@ -821,6 +840,19 @@ function test_gpu(FT) end @testset "Ice Nucleation kernels" begin + dims = (1, 3) + (; output, ndrange) = setup_output(dims, FT) + + Delta_a_w = ArrayType([FT(0.16), FT(0.15), FT(0.15)]) + + kernel! = IceNucleation_deposition_J_kernel!(backend, work_groups) + kernel!(output, kaolinite, feldspar, ferrihydrite, Delta_a_w; ndrange) + + # test if deposition_J is callable and returns reasonable values + @test Array(output)[1] ≈ FT(1.5390757663075784e6) + @test Array(output)[2] ≈ FT(5.693312205851678e6) + @test Array(output)[3] ≈ FT(802555.3607426438) + dims = (1, 2) (; output, ndrange) = setup_output(dims, FT) diff --git a/test/heterogeneous_ice_nucleation_tests.jl b/test/heterogeneous_ice_nucleation_tests.jl index 7f0648a91..f6f63c74e 100644 --- a/test/heterogeneous_ice_nucleation_tests.jl +++ b/test/heterogeneous_ice_nucleation_tests.jl @@ -21,6 +21,8 @@ function test_heterogeneous_ice_nucleation(FT) desert_dust = CMP.DesertDust(FT) illite = CMP.Illite(FT) kaolinite = CMP.Kaolinite(FT) + feldspar = CMP.Feldspar(FT) + ferrihydrite = CMP.Ferrihydrite(FT) TT.@testset "dust_activation" begin @@ -81,6 +83,39 @@ function test_heterogeneous_ice_nucleation(FT) end end + TT.@testset "Deposition Nucleation J" begin + + T_warm_1 = FT(229.2) + T_cold_1 = FT(228.8) + x_sulph = FT(0.1) + + T_warm_2 = FT(285) + T_cold_2 = FT(251) + e_warm = FT(1088) + e_cold = FT(544) + + # higher nucleation rate at colder temperatures + for dust in [feldspar, ferrihydrite, kaolinite] + TT.@test CMI_het.deposition_J( + dust, + CO.a_w_xT(H2SO4_prs, tps, x_sulph, T_cold_1) - + CO.a_w_ice(tps, T_cold_1), + ) > CMI_het.deposition_J( + dust, + CO.a_w_xT(H2SO4_prs, tps, x_sulph, T_warm_1) - + CO.a_w_ice(tps, T_warm_1), + ) + + TT.@test CMI_het.deposition_J( + dust, + CO.a_w_eT(tps, e_cold, T_cold_2) - CO.a_w_ice(tps, T_cold_2), + ) > CMI_het.deposition_J( + dust, + CO.a_w_eT(tps, e_warm, T_warm_2) - CO.a_w_ice(tps, T_warm_2), + ) + end + end + TT.@testset "ABIFM J" begin T_warm_1 = FT(229.2) diff --git a/test/performance_tests.jl b/test/performance_tests.jl index 8f67a1f68..dfa04750d 100644 --- a/test/performance_tests.jl +++ b/test/performance_tests.jl @@ -59,6 +59,7 @@ function benchmark_test(FT) ap = CMP.AerosolActivationParameters(FT) # ice nucleation desert_dust = CMP.DesertDust(FT) + kaolinite = CMP.Kaolinite(FT) ip = CMP.IceNucleationParameters(FT) H2SO4_prs = CMP.H2SO4SolutionParameters(FT) # aerosol nucleation parameters @@ -136,6 +137,7 @@ function benchmark_test(FT) (desert_dust, ip.deposition, S_ice, T_air_2), 50, ) + bench_press(CMI_het.deposition_J, (kaolinite, Delta_a_w), 230) bench_press(CMI_het.ABIFM_J, (desert_dust, Delta_a_w), 230) bench_press(CMI_hom.homogeneous_J, (ip.homogeneous, Delta_a_w), 230)