Skip to content

Commit 680b763

Browse files
slayoojcurtis2tangwhiap
authored
immersion freezing support (temporarily pointing to a non-default imf partmc repo branch) and new example notebook reproducing results from Tang et al. 2025 (#441)
Co-authored-by: Jeff Curtis <[email protected]> Co-authored-by: tangwhiap <[email protected]>
1 parent 1166864 commit 680b763

28 files changed

+71052
-5429
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ set(partmclib_SOURCES condense_solver.c aero_state.F90 integer_varray.F90 intege
197197
gas_state.F90 coagulation.F90 exact_soln.F90 coagulation_dist.F90 coag_kernel.F90 spec_line.F90
198198
rand.F90 aero_particle.F90 aero_particle_array.F90 mpi.F90 netcdf.F90 aero_info.F90
199199
aero_info_array.F90 nucleate.F90 condense.F90 fractal.F90 chamber.F90 camp_interface.F90
200-
photolysis.F90 aero_component.F90 tchem_interface.F90
200+
photolysis.F90 aero_component.F90 tchem_interface.F90 ice_nucleation.F90
201201
)
202202
add_prefix(gitmodules/partmc/src/ partmclib_SOURCES)
203203
list(APPEND partmclib_SOURCES src/spec_file_pypartmc.F90 src/sys.F90)

README.md

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ pip install PyPartMC[examples]
9191
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/cloud_parcel.ipynb)
9292
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/cloud_parcel.ipynb)
9393
[![ARM JupyterHub](https://img.shields.io/static/v1?label=launch%20in&logo=jupyter&color=lightblue&message=ARM+JupyterHub)](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
94+
- Immersion freezing example:
95+
[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PyPartMC/blob/main/examples/immersion_freezing.ipynb)
96+
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/immersion_freezing.ipynb)
97+
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/immersion_freezing.ipynb)
98+
[![ARM JupyterHub](https://img.shields.io/static/v1?label=launch%20in&logo=jupyter&color=lightblue&message=ARM+JupyterHub)](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
9499
- Coagulation model intercomparison for additive (Golovin) kernel with: PyPartMC, [PySDM](https://open-atmos.github.io/PySDM), [Droplets.jl](https://github.com/emmacware/droplets.jl) and [dustpy](https://stammler.github.io/dustpy/):
95100
[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PyPartMC/blob/main/examples/additive_coag_comparison.ipynb)
96101
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/additive_coag_comparison.ipynb)
@@ -133,9 +138,9 @@ import PyPartMC as ppmc
133138
from PyPartMC import si
134139

135140
aero_data = ppmc.AeroData((
136-
# [density, ions in solution, molecular weight, kappa]
137-
{"OC": [1000 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0.001]},
138-
{"BC": [1800 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0]},
141+
# [density, ions in solution, molecular weight, kappa, abifm_m, abifm_c]
142+
{"OC": [1000 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0.001, 0, 0]},
143+
{"BC": [1800 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0, 0 , 0]},
139144
))
140145

141146
aero_dist = ppmc.AeroDist(
@@ -176,9 +181,9 @@ ppmc = pyimport("PyPartMC")
176181
si = ppmc["si"]
177182

178183
aero_data = ppmc.AeroData((
179-
# (density, ions in solution, molecular weight, kappa)
180-
Dict("OC"=>(1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001)),
181-
Dict("BC"=>(1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0))
184+
# (density, ions in solution, molecular weight, kappa, abifm_m, abifm_c)
185+
Dict("OC"=>(1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001, 0, 0)),
186+
Dict("BC"=>(1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0, 0, 0))
182187
))
183188

184189
aero_dist = ppmc.AeroDist(aero_data, (
@@ -219,8 +224,8 @@ ppmc = py.importlib.import_module('PyPartMC');
219224
si = py.importlib.import_module('PyPartMC').si;
220225
221226
aero_data = ppmc.AeroData(py.tuple({ ...
222-
py.dict(pyargs("OC", py.tuple({1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001}))), ...
223-
py.dict(pyargs("BC", py.tuple({1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0}))) ...
227+
py.dict(pyargs("OC", py.tuple({1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001, 0, 0}))), ...
228+
py.dict(pyargs("BC", py.tuple({1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0, 0, 0}))) ...
224229
}));
225230
226231
aero_dist = ppmc.AeroDist(aero_data, py.tuple({ ...

examples/additive_coag_comparison.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@
374374
" assert env_state.additive_kernel_coefficient == settings.ADDITIVE_KERNEL_COEFF\n",
375375
"\n",
376376
" aero_data = ppmc.AeroData((\n",
377-
" {\"H2O\": [1000 * ppmc.si.kg / ppmc.si.m**3, 0, 18.0 * ppmc.si.g / ppmc.si.mol, 0.00]},\n",
377+
" {\"H2O\": [1000 * ppmc.si.kg / ppmc.si.m**3, 0, 18.0 * ppmc.si.g / ppmc.si.mol, 0, 0, 0]},\n",
378378
" ))\n",
379379
" self.gas_state = ppmc.GasState(gas_data)\n",
380380
"\n",

examples/chamber.ipynb

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -210,28 +210,27 @@
210210
"source": [
211211
"aero_data = ppmc.AeroData(\n",
212212
" (\n",
213-
" # density ions in soln (1) molecular weight kappa (1)\n",
214-
" # | | | |\n",
215-
" {\"SO4\": [1760 * si.kg / si.m**3, 1, 96.0 * si.g / si.mol, 0.00]},\n",
216-
" {\"NO3\": [1800 * si.kg / si.m**3, 1, 62.0 * si.g / si.mol, 0.00]},\n",
217-
" {\"Cl\": [2200 * si.kg / si.m**3, 1, 35.5 * si.g / si.mol, 0.00]},\n",
218-
" {\"NH4\": [1760 * si.kg / si.m**3, 1, 18.0 * si.g / si.mol, 0.00]},\n",
219-
" {\"MSA\": [1800 * si.kg / si.m**3, 0, 95.0 * si.g / si.mol, 0.53]},\n",
220-
" {\"ARO1\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10]},\n",
221-
" {\"ARO2\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10]},\n",
222-
" {\"ALK1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10]},\n",
223-
" {\"OLE1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10]},\n",
224-
" {\"API1\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10]},\n",
225-
" {\"API2\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10]},\n",
226-
" {\"LIM1\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10]},\n",
227-
" {\"LIM2\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10]},\n",
228-
" {\"CO3\": [2600 * si.kg / si.m**3, 1, 60.0 * si.g / si.mol, 0.00]},\n",
229-
" {\"Na\": [2200 * si.kg / si.m**3, 1, 23.0 * si.g / si.mol, 0.00]},\n",
230-
" {\"Ca\": [2600 * si.kg / si.m**3, 1, 40.0 * si.g / si.mol, 0.00]},\n",
231-
" {\"OIN\": [2600 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.10]},\n",
232-
" {\"OC\": [1566 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.001]},\n",
233-
" {\"BC\": [1700 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.00]},\n",
234-
" {\"H2O\": [1000 * si.kg / si.m**3, 0, 18.0 * si.g / si.mol, 0.00]},\n",
213+
" # density, ions in soln (1), molecular weight, kappa (1), ABIFM_m, ABIFM_c\n",
214+
" {\"SO4\": [1760 * si.kg / si.m**3, 1, 96.0 * si.g / si.mol, 0,0,0]},\n",
215+
" {\"NO3\": [1800 * si.kg / si.m**3, 1, 62.0 * si.g / si.mol, 0,0,0]},\n",
216+
" {\"Cl\": [2200 * si.kg / si.m**3, 1, 35.5 * si.g / si.mol, 0,0,0]},\n",
217+
" {\"NH4\": [1760 * si.kg / si.m**3, 1, 18.0 * si.g / si.mol, 0,0,0]},\n",
218+
" {\"MSA\": [1800 * si.kg / si.m**3, 0, 95.0 * si.g / si.mol, 0.53,0,0]},\n",
219+
" {\"ARO1\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10,0,0]},\n",
220+
" {\"ARO2\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10,0,0]},\n",
221+
" {\"ALK1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10,0,0]},\n",
222+
" {\"OLE1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10,0,0]},\n",
223+
" {\"API1\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10,0,0]},\n",
224+
" {\"API2\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10,0,0]},\n",
225+
" {\"LIM1\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10,0,0]},\n",
226+
" {\"LIM2\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10,0,0]},\n",
227+
" {\"CO3\": [2600 * si.kg / si.m**3, 1, 60.0 * si.g / si.mol, 0,0,0]},\n",
228+
" {\"Na\": [2200 * si.kg / si.m**3, 1, 23.0 * si.g / si.mol, 0,0,0]},\n",
229+
" {\"Ca\": [2600 * si.kg / si.m**3, 1, 40.0 * si.g / si.mol, 0,0,0]},\n",
230+
" {\"OIN\": [2600 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.10,0,0]},\n",
231+
" {\"OC\": [1566 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.001,0,0]},\n",
232+
" {\"BC\": [1700 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0,0,0]},\n",
233+
" {\"H2O\": [1000 * si.kg / si.m**3, 0, 18.0 * si.g / si.mol, 0,0,0]},\n",
235234
" )\n",
236235
")\n",
237236
"\n",

examples/cloud_parcel.ipynb

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -103,28 +103,27 @@
103103
"outputs": [],
104104
"source": [
105105
"aero_data = ppmc.AeroData((\n",
106-
" # density ions in soln (1) molecular weight kappa (1)\n",
107-
" # \\ \\ / |\n",
108-
" {\"SO4\": [1800 * si.kg / si.m**3, 1, 96.0 * si.g / si.mol, 0.00]},\n",
109-
" {\"NO3\": [1800 * si.kg / si.m**3, 1, 62.0 * si.g / si.mol, 0.00]},\n",
110-
" {\"Cl\": [2200 * si.kg / si.m**3, 1, 35.5 * si.g / si.mol, 0.00]},\n",
111-
" {\"NH4\": [1800 * si.kg / si.m**3, 1, 18.0 * si.g / si.mol, 0.00]},\n",
106+
" # density, ions in soln (1), molecular weight, kappa (1), ABIFM_m, ABIFM_c\n",
107+
" {\"SO4\": [1800 * si.kg / si.m**3, 1, 96.0 * si.g / si.mol, 0,0,0]},\n",
108+
" {\"NO3\": [1800 * si.kg / si.m**3, 1, 62.0 * si.g / si.mol, 0,0,0]},\n",
109+
" {\"Cl\": [2200 * si.kg / si.m**3, 1, 35.5 * si.g / si.mol, 0,0,0]},\n",
110+
" {\"NH4\": [1800 * si.kg / si.m**3, 1, 18.0 * si.g / si.mol, 0,0,0]},\n",
112111
" {\"MSA\": [1800 * si.kg / si.m**3, 0, 95.0 * si.g / si.mol, 0.53]},\n",
113-
" {\"ARO1\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10]},\n",
114-
" {\"ARO2\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.10]},\n",
115-
" {\"ALK1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10]},\n",
116-
" {\"OLE1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.10]},\n",
117-
" {\"API1\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10]},\n",
118-
" {\"API2\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.10]},\n",
119-
" {\"LIM1\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10]},\n",
120-
" {\"LIM2\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.10]},\n",
121-
" {\"CO3\": [2600 * si.kg / si.m**3, 1, 60.0 * si.g / si.mol, 0.00]},\n",
122-
" {\"Na\": [2200 * si.kg / si.m**3, 1, 23.0 * si.g / si.mol, 0.00]},\n",
123-
" {\"Ca\": [2600 * si.kg / si.m**3, 1, 40.0 * si.g / si.mol, 0.00]},\n",
124-
" {\"OIN\": [2600 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.10]},\n",
125-
" {\"OC\": [1400 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.10]},\n",
126-
" {\"BC\": [1800 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.00]},\n",
127-
" {\"H2O\": [1000 * si.kg / si.m**3, 0, 18.0 * si.g / si.mol, 0.00]},\n",
112+
" {\"ARO1\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.1,0,0]},\n",
113+
" {\"ARO2\": [1400 * si.kg / si.m**3, 0, 150.0 * si.g / si.mol, 0.1,0,0]},\n",
114+
" {\"ALK1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.1,0,0]},\n",
115+
" {\"OLE1\": [1400 * si.kg / si.m**3, 0, 140.0 * si.g / si.mol, 0.1,0,0]},\n",
116+
" {\"API1\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.1,0,0]},\n",
117+
" {\"API2\": [1400 * si.kg / si.m**3, 0, 184.0 * si.g / si.mol, 0.1,0,0]},\n",
118+
" {\"LIM1\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.1,0,0]},\n",
119+
" {\"LIM2\": [1400 * si.kg / si.m**3, 0, 200.0 * si.g / si.mol, 0.1,0,0]},\n",
120+
" {\"CO3\": [2600 * si.kg / si.m**3, 1, 60.0 * si.g / si.mol, 0,0,0]},\n",
121+
" {\"Na\": [2200 * si.kg / si.m**3, 1, 23.0 * si.g / si.mol, 0,0,0]},\n",
122+
" {\"Ca\": [2600 * si.kg / si.m**3, 1, 40.0 * si.g / si.mol, 0,0,0]},\n",
123+
" {\"OIN\": [2600 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.1,0,0]},\n",
124+
" {\"OC\": [1400 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0.1,0,0]},\n",
125+
" {\"BC\": [1800 * si.kg / si.m**3, 0, 1.0 * si.g / si.mol, 0,0,0]},\n",
126+
" {\"H2O\": [1000 * si.kg / si.m**3, 0, 18.0 * si.g / si.mol, 0,0,0]},\n",
128127
"))"
129128
]
130129
},

0 commit comments

Comments
 (0)