-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmy_parcel_settings.py
87 lines (77 loc) · 2.54 KB
/
my_parcel_settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""
Adapted from PySDM_examples.Pyrcel
"""
from typing import Iterable
import numpy as np
from pystrict import strict
from PySDM import Formulae
from PySDM.initialisation.spectra import Lognormal
@strict
class MyParcelSettings:
def __init__(
self,
mode_Ns: Iterable[float],
mode_means: Iterable[float],
mode_stdevs: Iterable[float],
mode_kappas: Iterable[float],
velocity: float,
initial_temperature: float,
initial_pressure: float,
dt: float,
t_max: float,
n_sd_per_mode: float | Iterable[float],
initial_relative_humidity: float = 1,
formulae: Formulae = Formulae(),
):
self.formulae = formulae
self.n_sd_per_mode = (
n_sd_per_mode
if isinstance(n_sd_per_mode, Iterable)
else (n_sd_per_mode,) * len(mode_Ns)
)
self.aerosol_modes_by_kappa = [
(
mode_kappa,
Lognormal(norm_factor=mode_N, m_mode=mode_mean, s_geom=mode_stdev),
)
for (mode_N, mode_mean, mode_stdev, mode_kappa) in zip(
mode_Ns, mode_means, mode_stdevs, mode_kappas
)
]
const = self.formulae.constants
self.vertical_velocity = velocity
self.initial_pressure = initial_pressure
self.initial_temperature = initial_temperature
pv0 = (
initial_relative_humidity
* formulae.saturation_vapour_pressure.pvs_Celsius(
initial_temperature - const.T0
)
)
self.initial_vapour_mixing_ratio = const.eps * pv0 / (initial_pressure - pv0)
self.t_max = t_max
self.timestep = dt
self.output_interval = self.timestep
@property
def initial_air_density(self):
const = self.formulae.constants
dry_air_density = (
self.formulae.trivia.p_d(
self.initial_pressure, self.initial_vapour_mixing_ratio
)
/ self.initial_temperature
/ const.Rd
)
return dry_air_density * (1 + self.initial_vapour_mixing_ratio)
@property
def nt(self) -> int:
nt = self.t_max / self.timestep
nt_int = round(nt)
# np.testing.assert_almost_equal(nt, nt_int)
return nt_int
@property
def steps_per_output_interval(self) -> int:
return int(self.output_interval / self.timestep)
@property
def output_steps(self) -> np.ndarray:
return np.arange(0, self.nt + 1, self.steps_per_output_interval)