Skip to content

Commit 932bb9c

Browse files
committed
wip: nearly complete basic scaffold mirroring OceanBioME.jl
1 parent fd7e5b1 commit 932bb9c

File tree

9 files changed

+993
-4
lines changed

9 files changed

+993
-4
lines changed

src/Microphysics/Microphysics.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ using Oceananigans.Fields: ZeroField
88
import Oceananigans.Fields: CenterField
99

1010
const CM1 = CloudMicrophysics.Microphysics1M
11-
const CM2 = CloudMicrophysics.Microphysics2M
1211
const CMNe = CloudMicrophysics.MicrophysicsNonEq
1312
const CMP = CloudMicrophysics.Parameters
1413

1514
export AbstractMicrophysics,
1615

17-
include("microphysics_interface.jl")
16+
include("interface.jl")
17+
include("interface_sedimentation_velocities.jl")
1818
include("microphysics_1m_rates.jl")
1919
include("microphysics_1m.jl")
2020

src/Microphysics/Microphysics1M/Microphysics1M.jl

Lines changed: 476 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
struct Microphysics1M{FT, TH, SV} <: AbstractMicrophysics
2+
thermodynamics::TH
3+
dt::FT # Required for numerical stability
4+
sinking_velocities:: SV
5+
end
6+
7+
function Microphysics1M(grid; thermodynamics)
8+
sinking_velocities = setup_velocity_fields(sedimentation_speeds, grid, true)
9+
Microphysics1M(thermodynamics, grid.dt, sinking_velocities)
10+
end
11+
12+
required_microphysics_tracers(::Microphysics1M) = (:ρq_tot, :ρq_liq, :ρq_ice, :ρq_rai, :ρq_sno, :ρe_tot)
13+
required_microphysics_auxiliary_fields(::Microphysics1M) = (:rho, :PAR)
14+
15+
@inline ρq_vapor(ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno) = ρq_tot - ρq_liq - ρq_ice - ρq_rai - ρq_sno
16+
@inline specific(ρ, values...) = (value/ρ for value in values)
17+
18+
@inline function (mp::Microphysics1M)(::Val{:ρq_liq}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
19+
dt = mp.dt
20+
q_tot, q_liq, q_ice, q_rain, q_snow = specific(ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
21+
T = air_temperature(mp.thermodynamics, ρe_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
22+
23+
cond_vapor_liquid = cloud_liquid_condensation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
24+
auto_liquid_rain = autoconversion_liquid_to_rain_rate(mp, q_liq, ρ, dt)
25+
acc_cloud_rain = accretion_cloud_rain_rate(mp, q_liq, q_rain, ρ, dt)
26+
acc_cloud_snow = accretion_cloud_snow_rate(mp, q_liq, q_snow, ρ, T, dt)
27+
28+
return ρ * (cond_vapor_liquid.liq + auto_liquid_rain.liq + acc_cloud_rain.liq + acc_cloud_snow.liq)
29+
end
30+
31+
@inline function (mp::Microphysics1M)(::Val{:ρq_ice}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
32+
dt = mp.dt
33+
q_tot, q_liq, q_ice, q_rain, q_snow = specific(ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
34+
T = air_temperature(mp.thermodynamics, ρe_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
35+
36+
cond_vapor_ice = cloud_ice_condensation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
37+
auto_ice_snow = autoconversion_ice_to_snow_rate(mp, q_ice, dt)
38+
acc_ice_snow = accretion_ice_snow_rate(mp, q_ice, q_snow, ρ, dt)
39+
acc_ice_rain_snow = accretion_ice_rain_to_snow_rate(mp, q_ice, q_rain, ρ, dt)
40+
41+
return ρ * (cond_vapor_ice.ice + auto_ice_snow.ice + acc_ice_snow.ice + acc_ice_rain_snow.ice)
42+
end
43+
44+
@inline function (mp::Microphysics1M)(::Val{:ρq_rai}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
45+
dt = mp.dt
46+
q_tot, q_liq, q_ice, q_rain, q_snow = specific(ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
47+
T = air_temperature(mp.thermodynamics, ρe_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
48+
49+
auto_liquid_rain = autoconversion_liquid_to_rain_rate(mp, q_liq, ρ, dt)
50+
acc_cloud_rain = accretion_cloud_rain_rate(mp, q_liq, q_rain, ρ, dt)
51+
acc_snow_rain = accretion_snow_rain_rate(mp, q_rain, q_snow, ρ, T, dt)
52+
acc_cloud_snow = accretion_cloud_snow_rate(mp, q_liq, q_snow, ρ, T, dt)
53+
sink_ice_rain = rain_sink_from_ice_rate(mp, q_ice, q_rain, ρ, dt)
54+
evaporation_rain = rain_evaporation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
55+
melt_snow_rain = snow_melt_rate(mp, q_snow, ρ, T, dt)
56+
57+
return ρ * (auto_liquid_rain.rain + acc_cloud_rain.rain + acc_cloud_snow.rain + acc_ice_rain_snow.rain + acc_snow_rain.rain + sink_ice_rain.rain + evaporation_rain.rain + melt_snow_rain.rain)
58+
end
59+
60+
@inline function (mp::Microphysics1M)(::Val{:ρq_sno}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
61+
dt = mp.dt
62+
q_tot, q_liq, q_ice, q_rain, q_snow = specific(ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
63+
T = air_temperature(mp.thermodynamics, ρe_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
64+
65+
auto_ice_snow = autoconversion_ice_to_snow_rate(microphysics, q_ice, dt_ft)
66+
acc_ice_snow = accretion_ice_snow_rate(microphysics, q_ice, q_snow, ρi, dt_ft)
67+
acc_cloud = accretion_cloud_snow_rate(microphysics, q_liq, q_snow, ρi, Ti, dt_ft)
68+
acc_ice_rain_snow = accretion_ice_rain_to_snow_rate(microphysics, q_ice, q_rain, ρi, dt_ft)
69+
acc_snow_rain = accretion_snow_rain_rate(microphysics, q_rain, q_snow, ρi, Ti, dt_ft)
70+
melt_snow_rain = snow_melt_rate(microphysics, q_snow, ρi, Ti, dt_ft)
71+
deposition_vapor_snow = snow_deposition_rate(microphysics, q_tot, q_liq, q_ice, q_rain, q_snow, ρi, Ti, dt_ft)
72+
73+
return ρ * (auto_ice_snow.snow + acc_ice_snow.snow + acc_cloud.snow + acc_ice_rain_snow.snow + acc_snow_rain.snow + melt_snow_rain.snow + deposition_vapor_snow.snow)
74+
end
75+
76+
@inline function (mp::Microphysics1M)(::Val{:ρq_tot}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
77+
dρ_liq = mp(:ρq_liq, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
78+
dρ_ice = mp(:ρq_ice, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
79+
dρ_rai = mp(:ρq_rai, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
80+
dρ_sno = mp(:ρq_sno, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
81+
return dq_liq + dq_ice + dq_rai + dq_sno
82+
end
83+
84+
@inline function (mp::Microphysics1M)(::Val{:ρe_tot}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
85+
dt = mp.dt
86+
q_tot, q_liq, q_ice, q_rain, q_snow = specific(ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
87+
T = air_temperature(mp.thermodynamics, ρe_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno)
88+
Lv = latent_heat_vapor(mp.thermodynamics, T)
89+
Ls = latent_heat_sublimation(mp.thermodynamics, T)
90+
Lf = latent_heat_fusion(mp.thermodynamics, T)
91+
92+
cond_vapor_liquid = cloud_liquid_condensation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
93+
cond_vapor_ice = cloud_ice_condensation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
94+
acc_cloud_snow = accretion_cloud_snow_rate(mp, q_liq, q_snow, ρ, T, dt)
95+
rain_sink_ice = rain_sink_from_ice_rate(mp, q_ice, q_rain, ρ, T, dt)
96+
acc_snow_rain = accretion_snow_rain_rate(mp, q_rain, q_snow, ρ, T, dt)
97+
rain_evap = rain_evaporation_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
98+
snow_melt = snow_melt_rate(mp, q_snow, ρ, T, dt)
99+
snow_dep = snow_deposition_rate(mp, q_tot, q_liq, q_ice, q_rain, q_snow, ρ, T, dt)
100+
101+
l_vapor_liquid = Lv * cond_vapor_liquid.liq
102+
l_cond_ice = Ls * cond_vapor_ice.ice
103+
l_acc_cloud_snow = Lf * acc_cloud_snow.snow
104+
l_rain_sink_ice = Lf * rain_sink_ice.snow
105+
l_acc_snow_rain = Lf * acc_snow_rain.snow
106+
l_rain_evap = Lv * rain_evap.rain
107+
l_snow_melt = Lf * snow_melt.snow
108+
l_snow_dep = Ls * snow_dep.snow
109+
110+
return ρ * (l_vapor_liquid + l_cond_ice + l_acc_cloud_snow + l_rain_sink_ice + l_acc_snow_rain + l_rain_evap + l_snow_melt + l_snow_dep)
111+
end
112+
113+
function update_microphysics_state!(mp::Microphysics1M, model)
114+
115+
end
116+
117+
function update_tendencies!(mp::Microphysics1M, model)
118+
119+
end
120+
121+
function update_microphysics_drift_velocity!(microphysics::Microphysics1M, state)
122+
# extract the fields from the state
123+
124+
# interpolate relevant fields to the faces
125+
126+
# compute the sinking velocities
127+
# kernel launch here with all the necessary arguments i, j, k, etc. SUCKS
128+
129+
130+
end
131+
132+
function update_drift_velocity_kernel!()
133+
134+
end
135+
136+
function compute_drift_velocity_kernel!(:Val{:ρq_rai}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
137+
138+
end
139+
140+
function compute_drift_velocity_kernel!(:Val{:ρq_sno}, x, y, z, t, ρ, ρq_tot, ρq_liq, ρq_ice, ρq_rai, ρq_sno, ρe_tot, PAR)
141+
142+
end

0 commit comments

Comments
 (0)