Skip to content

Commit 2c7a4f5

Browse files
committed
Add AtmosModel kwarg constructor
1 parent e9422c3 commit 2c7a4f5

File tree

8 files changed

+591
-96
lines changed

8 files changed

+591
-96
lines changed

src/diagnostics/Diagnostics.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ module Diagnostics
22

33
import Dates: Month, Day, Hour, DateTime, Period
44

5-
import ClimaComms
6-
75
import LinearAlgebra: dot
86

7+
import ClimaComms
98
import ClimaCore:
109
Fields, Geometry, InputOutput, Meshes, Spaces, Operators, Domains, Grids
1110
import ClimaCore.Utilities: half
@@ -15,6 +14,9 @@ import Thermodynamics as TD
1514
import ..lazy
1615

1716
import ..AtmosModel
17+
import ..AtmosHydrology
18+
import ..AtmosRadiation
19+
import ..AtmosTurbconv
1820
import ..AtmosCallback
1921
import ..EveryNSteps
2022

src/diagnostics/default_diagnostics.jl

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,38 @@ function default_diagnostics(
214214
return [average_func(moist_diagnostics...; output_writer, start_date)...]
215215
end
216216

217+
function default_diagnostics(
218+
atmos_hydrology::AtmosHydrology,
219+
duration,
220+
start_date;
221+
output_writer,
222+
)
223+
diagnostics = []
224+
225+
# Add moisture and precipitation model diagnostics
226+
for model in (atmos_hydrology.moisture_model, atmos_hydrology.precip_model)
227+
!isnothing(model) && append!(
228+
diagnostics,
229+
default_diagnostics(model, duration, start_date; output_writer),
230+
)
231+
end
232+
233+
return diagnostics
234+
end
235+
217236
#######################
218237
# Precipitation model #
219238
#######################
239+
function default_diagnostics(
240+
::Microphysics0Moment,
241+
duration,
242+
start_date;
243+
output_writer,
244+
)
245+
# 0-moment microphysics doesn't have additional diagnostics beyond basic moisture
246+
return []
247+
end
248+
220249
function default_diagnostics(
221250
::Microphysics1Moment,
222251
duration,
@@ -401,3 +430,51 @@ function default_diagnostics(::EDOnlyEDMFX, duration, start_date; output_writer)
401430
average_func(edonly_edmfx_diagnostics...; output_writer, start_date)...,
402431
]
403432
end
433+
434+
function default_diagnostics(
435+
atmos_radiation::AtmosRadiation,
436+
duration,
437+
start_date;
438+
output_writer,
439+
)
440+
diagnostics = []
441+
442+
# Add radiation mode diagnostics
443+
if atmos_radiation.radiation_mode !== nothing
444+
append!(
445+
diagnostics,
446+
default_diagnostics(
447+
atmos_radiation.radiation_mode,
448+
duration,
449+
start_date;
450+
output_writer,
451+
),
452+
)
453+
end
454+
455+
return diagnostics
456+
end
457+
458+
function default_diagnostics(
459+
atmos_turbconv::AtmosTurbconv,
460+
duration,
461+
start_date;
462+
output_writer,
463+
)
464+
diagnostics = []
465+
466+
# Add turbulence convection model diagnostics
467+
if atmos_turbconv.turbconv_model !== nothing
468+
append!(
469+
diagnostics,
470+
default_diagnostics(
471+
atmos_turbconv.turbconv_model,
472+
duration,
473+
start_date;
474+
output_writer,
475+
),
476+
)
477+
end
478+
479+
return diagnostics
480+
end

src/prognostic_equations/implicit/implicit_tendency.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ NVTX.@annotate function implicit_tendency!(Yₜ, Y, p, t)
3030
)
3131
end
3232

33-
if p.atmos.diff_mode == Implicit()
33+
if p.atmos.numerics.diff_mode == Implicit()
3434
vertical_diffusion_boundary_layer_tendency!(
3535
Yₜ,
3636
Y,

src/prognostic_equations/remaining_tendency.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
201201
)
202202
end
203203

204-
if p.atmos.diff_mode == Explicit()
204+
if p.atmos.numerics.diff_mode == Explicit()
205205
vertical_diffusion_boundary_layer_tendency!(
206206
Yₜ,
207207
Y,

src/solver/type_getters.jl

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -85,35 +85,29 @@ function get_atmos(config::AtmosConfig, params)
8585
FT,
8686
)
8787

88-
# Create grouped structs
89-
moisture = AtmosMoistureModel(;
88+
atmos = AtmosModel(;
89+
# Moisture & Clouds
9090
moisture_model,
9191
precip_model,
9292
cloud_model,
9393
noneq_cloud_formation_mode = implicit_noneq_cloud_formation ?
9494
Implicit() : Explicit(),
9595
call_cloud_diagnostics_per_stage,
96-
)
9796

98-
forcing = AtmosForcing(;
97+
# Forcing & Advection
9998
forcing_type,
10099
subsidence = get_subsidence_model(parsed_args, radiation_mode, FT),
101100
external_forcing = get_external_forcing_model(parsed_args, FT),
102-
)
101+
ls_adv = get_large_scale_advection_model(parsed_args, FT),
102+
advection_test,
103103

104-
radiation = AtmosRadiation(;
104+
# Radiation
105105
radiation_mode,
106106
ozone,
107107
co2,
108108
insolation = get_insolation_form(parsed_args),
109-
)
110109

111-
advection = AtmosAdvection(;
112-
ls_adv = get_large_scale_advection_model(parsed_args, FT),
113-
advection_test,
114-
)
115-
116-
turbconv = AtmosTurbconv(;
110+
# Turbulence & Convection
117111
scm_coriolis = get_scm_coriolis(parsed_args, FT),
118112
edmfx_model,
119113
turbconv_model = get_turbconv_model(FT, parsed_args, turbconv_params),
@@ -123,9 +117,8 @@ function get_atmos(config::AtmosConfig, params)
123117
Explicit(),
124118
sgs_mf_mode = implicit_sgs_mass_flux ? Implicit() : Explicit(),
125119
smagorinsky_lilly = get_smagorinsky_lilly_model(parsed_args),
126-
)
127120

128-
gravity_wave = AtmosGravityWave(;
121+
# Gravity Waves
129122
non_orographic_gravity_wave = get_non_orographic_gravity_wave_model(
130123
parsed_args,
131124
FT,
@@ -134,35 +127,19 @@ function get_atmos(config::AtmosConfig, params)
134127
parsed_args,
135128
FT,
136129
),
137-
)
138130

139-
vert_diff_grouped = AtmosVertDiff(;
131+
# Diffusion & Sponges
140132
vert_diff,
141-
diff_mode = implicit_diffusion ? Implicit() : Explicit(),
142-
)
143-
144-
sponge = AtmosSponge(;
145133
viscous_sponge = get_viscous_sponge_model(parsed_args, params, FT),
146134
rayleigh_sponge = get_rayleigh_sponge_model(parsed_args, params, FT),
147-
)
148135

149-
surface = AtmosSurface(;
136+
# Surface
150137
sfc_temperature = get_sfc_temperature_form(parsed_args),
151138
surface_model = get_surface_model(parsed_args),
152139
surface_albedo = get_surface_albedo_model(parsed_args, params, FT),
153-
)
154140

155-
atmos = AtmosModel(;
156-
moisture,
157-
forcing,
158-
radiation,
159-
advection,
160-
turbconv,
161-
gravity_wave,
141+
# Numerics and Top-level Options
162142
hyperdiff = get_hyperdiffusion_model(parsed_args, FT),
163-
vert_diff = vert_diff_grouped,
164-
sponge,
165-
surface,
166143
numerics = get_numerics(parsed_args),
167144
disable_surface_flux_tendency = parsed_args["disable_surface_flux_tendency"],
168145
)
@@ -210,13 +187,15 @@ function get_numerics(parsed_args)
210187
limiter = parsed_args["apply_limiter"] ? CA.QuasiMonotoneLimiter() : nothing
211188

212189
# wrap each upwinding mode in a Val for dispatch
190+
diff_mode = parsed_args["implicit_diffusion"] ? Implicit() : Explicit()
213191
numerics = AtmosNumerics(;
214192
energy_upwinding,
215193
tracer_upwinding,
216194
edmfx_upwinding,
217195
edmfx_sgsflux_upwinding,
218196
limiter,
219197
test_dycore_consistency = test_dycore,
198+
diff_mode,
220199
)
221200
@info "numerics $(summary(numerics))"
222201

@@ -469,7 +448,7 @@ get_jacobian(ode_algo, Y, atmos, parsed_args) =
469448
parsed_args["use_dense_jacobian"] ? AutoDenseJacobian() :
470449
ManualSparseJacobian(
471450
DerivativeFlag(has_topography(axes(Y.c))),
472-
DerivativeFlag(atmos.diff_mode),
451+
DerivativeFlag(atmos.numerics.diff_mode),
473452
DerivativeFlag(atmos.sgs_adv_mode),
474453
DerivativeFlag(atmos.sgs_entr_detr_mode),
475454
DerivativeFlag(atmos.sgs_mf_mode),

0 commit comments

Comments
 (0)