Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added RCEMIPII plane sst #3157

Merged
merged 1 commit into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,14 @@ steps:
--job_id box_density_current_test
artifact_paths: "box_density_current_test/output_active/*"

- label: ":computer: Box (ρe_tot) rcemipii with diagnostic edmf"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/rcemipii_box_diagnostic_edmfx.yml
--job_id rcemipii_box_diagnostic_edmfx
artifact_paths: "rcemipii_box_diagnostic_edmfx/output_active/*"
soft_fail: true

- group: "Plane Examples"
steps:
- label: ":computer: Agnesi linear hydrostatic mountain experiment (uniform)"
Expand Down
2 changes: 1 addition & 1 deletion config/default_configs/default_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ surface_setup:
help: "Surface flux scheme [`DefaultExchangeCoefficients` (default), `DefaultMoninObukhov`]"
value: "DefaultExchangeCoefficients"
surface_temperature:
help: "Prescribed surface temperature functional form ['ZonallySymmetric' (default), 'ZonallyAsymmetric']"
help: "Prescribed surface temperature functional form ['ZonallySymmetric' (default), 'ZonallyAsymmetric', 'RCEMIPII']"
value: "ZonallySymmetric"
initial_condition:
help: "Initial condition [`DryBaroclinicWave`, `MoistBaroclinicWave`, `DecayingProfile`, `IsothermalProfile`, `Bomex`, `DryDensityCurrentProfile`, `AgnesiHProfile`, `ScharProfile`, `RisingThermalBubbleProfile`]"
Expand Down
30 changes: 30 additions & 0 deletions config/model_configs/rcemipii_box_diagnostic_edmfx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
surface_setup: DefaultMoninObukhov
surface_temperature: RCEMIPII
insolation: rcemipii
config: box
rad: allskywithclear
turbconv: diagnostic_edmfx
implicit_diffusion: true
approximate_linear_solve_iters: 2
prognostic_tke: true
edmfx_upwinding: first_order
edmfx_entr_model: "Generalized"
edmfx_detr_model: "Generalized"
edmfx_nh_pressure: true
edmfx_sgs_mass_flux: true
edmfx_sgs_diffusive_flux: true
moist: equil
precip_model: 0M
override_τ_precip: false
dt: 30secs
t_end: 3600secs
dt_save_state_to_disk: 12hours
toml: [toml/diagnostic_edmfx_0M.toml]
netcdf_interpolation_num_points: [8, 8, 60]
netcdf_output_at_levels: true
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl, pr]
period: 5mins
- short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, tke, lmix]
period: 5mins
ode_algo: ARS343
2 changes: 1 addition & 1 deletion config/model_configs/rcemipii_sphere_diagnostic_edmfx.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
surface_setup: DefaultMoninObukhov
surface_temperature: RCEMIPIISphere
surface_temperature: RCEMIPII
rad: allskywithclear
turbconv: diagnostic_edmfx
implicit_diffusion: true
Expand Down
5 changes: 4 additions & 1 deletion post_processing/ci_plots.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,7 @@ EDMFBoxPlots = Union{
Val{:prognostic_edmfx_simpleplume_column},
Val{:prognostic_edmfx_gcmdriven_column},
Val{:prognostic_edmfx_bomex_box},
Val{:rcemipii_box_diagnostic_edmfx},
}

EDMFBoxPlotsWithPrecip = Union{
Expand Down Expand Up @@ -1204,7 +1205,9 @@ function make_plots(
short_name = short_names[1],
reduction,
)
if "10m" in available_periods
if "5m" in available_periods
period = "5m"
elseif "10m" in available_periods
period = "10m"
elseif "30m" in available_periods
period = "30m"
Expand Down
6 changes: 3 additions & 3 deletions src/solver/model_getters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ end
function get_sfc_temperature_form(parsed_args)
surface_temperature = parsed_args["surface_temperature"]
@assert surface_temperature in
("ZonallyAsymmetric", "ZonallySymmetric", "RCEMIPIISphere")
("ZonallyAsymmetric", "ZonallySymmetric", "RCEMIPII")
return if surface_temperature == "ZonallyAsymmetric"
ZonallyAsymmetricSST()
elseif surface_temperature == "ZonallySymmetric"
ZonallySymmetricSST()
elseif surface_temperature == "RCEMIPIISphere"
RCEMIPIISphereSST()
elseif surface_temperature == "RCEMIPII"
RCEMIPIISST()
end
end

Expand Down
2 changes: 1 addition & 1 deletion src/solver/types.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct PlaneModel <: AbstractModelConfig end
abstract type AbstractSST end
struct ZonallySymmetricSST <: AbstractSST end
struct ZonallyAsymmetricSST <: AbstractSST end
struct RCEMIPIISphereSST <: AbstractSST end
struct RCEMIPIISST <: AbstractSST end

abstract type AbstractInsolation end
struct IdealizedInsolation <: AbstractInsolation end
Expand Down
2 changes: 1 addition & 1 deletion src/surface_conditions/SurfaceConditions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ..Parameters as CAP
import ..DryModel
import ..ZonallyAsymmetricSST
import ..ZonallySymmetricSST
import ..RCEMIPIISphereSST
import ..RCEMIPIISST
import ..PrognosticSurfaceTemperature
import ..PrescribedSurfaceTemperature
import ..gcm_driven_timeseries
Expand Down
44 changes: 34 additions & 10 deletions src/surface_conditions/surface_conditions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,8 @@ function surface_state_to_conditions(
error("surface q_vap cannot be specified when using a DryModel")

T = if isnothing(sfc_prognostic_temp)
if isnothing(surf_state.T) && (
coordinates isa Geometry.LatLongZPoint ||
coordinates isa Geometry.LatLongPoint
)
if isnothing(surf_state.T)
surface_temperature(atmos.sfc_temperature, coordinates)
elseif isnothing(surf_state.T)
# Assume that the latitude is 0.
FT(300)
else
surf_state.T
end
Expand Down Expand Up @@ -335,21 +329,51 @@ function surface_state_to_conditions(
end

#Sphere SST distribution from Wing et al. (2023) https://gmd.copernicus.org/preprints/gmd-2023-235/
function surface_temperature(::RCEMIPIISphereSST, coordinates)
function surface_temperature(
::RCEMIPIISST,
coordinates::Union{Geometry.LatLongZPoint, Geometry.LatLongPoint},
)
(; lat) = coordinates
FT = eltype(lat)
T = FT(300) + FT(1.25) / 2 * cosd(360 * lat / 54)
return T
end

function surface_temperature(::ZonallySymmetricSST, coordinates)
#Plane SST distribution from Wing et al. (2023) https://gmd.copernicus.org/preprints/gmd-2023-235/
function surface_temperature(
::RCEMIPIISST,
coordinates::Union{Geometry.XZPoint, Geometry.XYZPoint},
)
(; x) = coordinates
FT = eltype(x)
T = FT(300) + FT(1.25) / 2 * cos(2 * FT(pi) * x / 6000)
return T
end

#For non-RCEMIPII box models with prescribed surface temp, assume that the latitude is 0.
function surface_temperature(
::Union{ZonallySymmetricSST, ZonallyAsymmetricSST},
coordinates::Union{Geometry.XZPoint, Geometry.XYZPoint},
)
(; x) = coordinates
FT = eltype(x)
return FT(300)
end

function surface_temperature(
::ZonallySymmetricSST,
coordinates::Geometry.LatLongZPoint,
)
(; lat, z) = coordinates
FT = eltype(lat)
T = FT(271) + FT(29) * exp(-coordinates.lat^2 / (2 * 26^2)) - FT(6.5e-3) * z
return T
end

function surface_temperature(::ZonallyAsymmetricSST, coordinates)
function surface_temperature(
::ZonallyAsymmetricSST,
coordinates::Geometry.LatLongZPoint,
)
(; lat, long, z) = coordinates
FT = eltype(lat)
#Assume a surface temperature that varies with both longitude and latitude, Neale and Hoskins, 2021
Expand Down
Loading