-
Notifications
You must be signed in to change notification settings - Fork 15
/
create_parameters.jl
156 lines (144 loc) · 5.65 KB
/
create_parameters.jl
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import .TurbulenceConvection as TC
import .TurbulenceConvection.Parameters as TCP
import CLIMAParameters as CP
import RRTMGP.Parameters as RP
import SurfaceFluxes as SF
import SurfaceFluxes.UniversalFunctions as UF
import ClimaCore
import ClimaCore as CC
import Insolation.Parameters as IP
import Thermodynamics as TD
import CloudMicrophysics as CM
function override_climaatmos_defaults(
defaults::NamedTuple,
overrides::NamedTuple,
)
intersect_keys = intersect(keys(defaults), keys(overrides))
intersect_vals = getproperty.(Ref(overrides), intersect_keys)
intersect_overrides = (; zip(intersect_keys, intersect_vals)...)
return merge(defaults, intersect_overrides)
end
function create_climaatmos_parameter_set(
toml_dict::CP.AbstractTOMLDict,
parsed_args,
overrides::NamedTuple = NamedTuple(),
)
FT = CP.float_type(toml_dict)
FTD = FT # can change to Dual for testing duals
aliases = string.(fieldnames(TD.Parameters.ThermodynamicsParameters))
pairs = CP.get_parameter_values!(toml_dict, aliases, "Thermodynamics")
pairs = override_climaatmos_defaults((; pairs...), overrides)
thermo_params = TD.Parameters.ThermodynamicsParameters{FTD}(; pairs...)
TP = typeof(thermo_params)
aliases = string.(fieldnames(CM.Parameters.CloudMicrophysicsParameters))
aliases = setdiff(aliases, ["thermo_params"])
pairs = CP.get_parameter_values!(toml_dict, aliases, "CloudMicrophysics")
pairs = override_climaatmos_defaults((; pairs...), overrides)
microphys_params = CM.Parameters.CloudMicrophysicsParameters{FTD, TP}(;
pairs...,
thermo_params,
)
MP = typeof(microphys_params)
aliases = [
"Pr_0_Businger",
"a_m_Businger",
"a_h_Businger",
"ζ_a_Businger",
"γ_Businger",
]
pairs = CP.get_parameter_values!(toml_dict, aliases, "UniversalFunctions")
pairs = (; pairs...) # convert to NamedTuple
pairs = (;
Pr_0 = pairs.Pr_0_Businger,
a_m = pairs.a_m_Businger,
a_h = pairs.a_h_Businger,
ζ_a = pairs.ζ_a_Businger,
γ = pairs.γ_Businger,
)
pairs = override_climaatmos_defaults((; pairs...), overrides)
ufp = UF.BusingerParams{FTD}(; pairs...)
UFP = typeof(ufp)
pairs = CP.get_parameter_values!(
toml_dict,
["von_karman_const"],
"SurfaceFluxesParameters",
)
pairs = override_climaatmos_defaults((; pairs...), overrides)
surf_flux_params = SF.Parameters.SurfaceFluxesParameters{FTD, UFP, TP}(;
pairs...,
ufp,
thermo_params,
)
SFP = typeof(surf_flux_params)
aliases = string.(fieldnames(TCP.TurbulenceConvectionParameters))
pairs = CP.get_parameter_values!(toml_dict, aliases, "EDMF")
pairs = override_climaatmos_defaults((; pairs...), overrides)
tc_params = TCP.TurbulenceConvectionParameters{FTD, MP, SFP}(;
pairs...,
microphys_params,
surf_flux_params,
)
aliases = string.(fieldnames(RP.RRTMGPParameters))
pairs = CP.get_parameter_values!(toml_dict, aliases, "RRTMGP")
params = override_climaatmos_defaults((; pairs...), overrides) # overrides
rrtmgp_params = RP.RRTMGPParameters{FTD}(; params...)
aliases = string.(fieldnames(IP.InsolationParameters))
pairs = CP.get_parameter_values!(toml_dict, aliases, "Insolation")
params = override_climaatmos_defaults((; pairs...), overrides) # overrides
insolation_params = IP.InsolationParameters{FTD}(; params...)
pairs = CP.get_parameter_values!(
toml_dict,
["Omega", "planet_radius", "astro_unit", "ΔT_y_dry", "ΔT_y_wet"],
"ClimaAtmos",
)
pairs = (; pairs...) # convert to NamedTuple
pairs = override_climaatmos_defaults((; pairs...), overrides)
param_set = CAP.ClimaAtmosParameters(;
ug = FTD(1.0), # for Ekman problem
vg = FTD(0.0), # for Ekman problem
f = FTD(5e-5), # for Ekman problem
Cd = FTD(0.01 / (2e2 / 30)), # for Ekman problem
Omega = FTD(pairs.Omega),
planet_radius = FTD(pairs.planet_radius),
astro_unit = FTD(pairs.astro_unit),
f_plane_coriolis_frequency = FTD(0),
thermodynamics_params = thermo_params,
microphysics_params = microphys_params,
insolation_params = insolation_params,
rrtmgp_params = rrtmgp_params,
surfacefluxes_params = surf_flux_params,
turbconv_params = tc_params,
entr_coeff = FTD(parsed_args["entr_coeff"]),
detr_coeff = FTD(parsed_args["detr_coeff"]),
ΔT_y_dry = FTD(pairs.ΔT_y_dry),
ΔT_y_wet = FTD(pairs.ΔT_y_wet),
)
# logfilepath = joinpath(@__DIR__, "logfilepath_$FT.toml")
# CP.log_parameter_information(toml_dict, logfilepath)
return param_set
end
# TODO: unify these parameters and refactor this method.
function create_parameter_set(config::AtmosConfig)
(; toml_dict, parsed_args) = config
FT = eltype(config)
dt = FT(CA.time_to_seconds(parsed_args["dt"]))
return if CA.is_column_edmf(parsed_args)
overrides = (; MSLP = 100000.0, τ_precip = dt)
create_climaatmos_parameter_set(toml_dict, parsed_args, overrides)
elseif CA.is_column_without_edmf(parsed_args)
overrides = (; τ_precip = dt)
create_climaatmos_parameter_set(toml_dict, parsed_args, overrides)
else
overrides = (;
R_d = 287.0,
MSLP = 1.0e5,
grav = 9.80616,
Omega = 7.29212e-5,
planet_radius = 6.371229e6,
ρ_cloud_liq = 1e3,
τ_precip = dt,
qc_0 = 5e-6, # criterion for removal after supersaturation
)
create_climaatmos_parameter_set(toml_dict, parsed_args, overrides)
end
end