Single-column boundary layers with a prognostic-TKE closure
A single column resolves no turbulence, so every turbulent flux in it is carried by the closure — here TKEBasedTurbulenceClosure, a vertical eddy-diffusivity closure with a prognostic equation for turbulent kinetic energy, described in Turbulence closures. This example puts it through three acts of increasing realism:
- Three canonical dry boundary layers — stable, neutral and convective — each configured as a published intercomparison case, run with both of the closure's coefficient sets: the Mellor–Yamada constants of Nakanishi and Niino and the Richardson-number-dependent rational stability functions.
- Two cloud-topped boundary layers from the library of GCM-forced large-eddy simulations of Shen et al. (2022), a stratocumulus deck off California and a trade-cumulus column over the open Pacific, driven in single-column mode by the forcing the LES saw and compared with the LES in detail.
- The whole CNRM-CM6-1 slice of that library — 21 sites along the Pacific transect, four months — as an ensemble of single columns, summarized by the error of each member against its LES.
The example demonstrates
- How to set up a single-column
AtmosphereModelon a(Flat, Flat, Bounded)grid. - How to drive a boundary layer with a geostrophic wind, a bulk surface layer, and a surface heat flux or a cooling rate; and how to drive one with the large-scale forcing, radiative heating and surface fluxes of a large-eddy simulation.
- How to diagnose the closure's mixing length, diffusivities, fluxes and TKE budget from the model state, and how to choose between its coefficient sets and static stabilities.
using Breezeusing Oceananigans.Unitsusing CairoMakieusing StatisticsTwo coefficient sets
The closure's diffusivities are $K = S ℓ \sqrt{e}$ with one primary mixing length $ℓ$ and a stability function $S$ for each of momentum, scalars and TKE, plus one for the dissipation. The mixing length combines a surface length $ℂˢ z$ with a gradient-limited envelope of the buoyancy penetration depths $ℓᵇ = \sqrt{e} / N$. Its interior slope $ℂⁱ$ bounds mixing lengths in elevated mixed layers by the stratified air above and below them. We compare the Nakanishi–Niino constant stability functions with the calibrated rational defaults. The constant configuration uses its original wall coefficient.
constant_closure(; kw...) = TKEBasedTurbulenceClosure(; mixing_length = GradientLimitedMixingLength(ℂˢ = 1.316), stability_functions = ConstantStabilityFunctions(), kw...)closures = (NN09 = constant_closure(), Rational = TKEBasedTurbulenceClosure())(NN09 = TKEBasedTurbulenceClosure{VerticallyImplicitTimeDiscretization}
├── mixing_length: GradientLimitedMixingLength{Float64} (ℂˢ = 1.316, ℂⁱ = 1.316)
├── stability_functions: ConstantStabilityFunctions{Float64}
│ ├── ℂᵘ: 0.149
│ ├── ℂᶜ: 0.201
│ ├── ℂᵉ: 0.298
│ └── ℂᴰ: 0.388
├── static_stability: MoistStaticStability
├── maximum_viscosity: Inf
├── maximum_tracer_diffusivity: Inf
├── maximum_tke_diffusivity: Inf
├── minimum_tke: 1.0e-6
├── minimum_shear_squared: 1.0e-10
└── negative_tke_damping_time_scale: 60.0, Rational = TKEBasedTurbulenceClosure{VerticallyImplicitTimeDiscretization}
├── mixing_length: GradientLimitedMixingLength{Float64} (ℂˢ = 0.787732, ℂⁱ = 1.77787)
├── stability_functions: RationalStabilityFunction{Float64}
│ ├── Ri → -∞ (ℂᵘ⁻, ℂᶜ⁻, ℂᵉ⁻, ℂᴰ⁻): 1.19605, 2.07534, 312.08, 2.59497
│ ├── Ri = 0 (ℂᵘ⁰, ℂᶜ⁰, ℂᵉ⁰, ℂᴰ⁰): 0.154393, 0.192992, 0.0734684, 0.055355
│ ├── Ri → ∞ (ℂᵘ⁺, ℂᶜ⁺, ℂᵉ⁺, ℂᴰ⁺): 1.00967, 0.27651, 16.4456, 0.0506899
│ └── transition scales: Ri⁻ = 6.56298, Ri⁺ = 15.128
├── static_stability: MoistStaticStability
├── maximum_viscosity: Inf
├── maximum_tracer_diffusivity: Inf
├── maximum_tke_diffusivity: Inf
├── minimum_tke: 1.0e-6
├── minimum_shear_squared: 1.0e-10
└── negative_tke_damping_time_scale: 60.0)Three published cases
Each column follows the specification of an intercomparison or reference study, so that its profiles can be judged against published large-eddy simulations.
The stable case is GABLS1 (Beare et al. 2006): a 400 m column at $f = 1.39 × 10⁻⁴$ s⁻¹ under an 8 m s⁻¹ geostrophic wind, with $θ = 265$ K below 100 m and a 0.01 K m⁻¹ gradient above, over a dry surface with a 0.1 m roughness length that cools from 265 K at 0.25 K h⁻¹ for 9 hours. The turbulent kinetic energy starts from the profile the case prescribes, $0.4 (1 - z / 250)³$ m² s⁻² below 250 m. The large-eddy simulations of the intercomparison produce a 150–200 m deep layer beneath a 9–9.5 m s⁻¹ low-level jet.
The neutral case is the conventionally neutral boundary layer of Shin, Yang and Howland (2025), after Liu, Gadde and Stevens (2021): a 2 km column at $f = 1.37 × 10⁻⁴$ s⁻¹ under a 12 m s⁻¹ geostrophic wind, stratified at 3 K km⁻¹ from the ground, with zero surface heat flux and neutral log-law drag over a 0.1 m roughness length. The specification spins up for 20 hours and then averages over one inertial period $2π / f$; we run to the end of that period and plot the instantaneous state.
The convective case is the dry convective boundary layer of Han and Bretherton (2019): $θ = 288$ K + 3 K km⁻¹ $z$ with no mean wind, heated for 8 hours by a surface buoyancy flux of $8 × 10⁻³$ m² s⁻³, which is the kinematic heat flux $B₀ θ₀ / g = 0.235$ K m s⁻¹, at 50 m resolution.
cases = ( stable = (; Lz = 400, Δz₁ = 6.25, θ₀ = 265, Γ = 0.01, zᵢ = 100, f = 1.39e-4, uᵍ = 8, surface_temperature = 265, cooling_rate = 0.25 / hour, initial_tke = z -> 0.4 * max(0, 1 - z / 250)^3, stop_time = 9hours), neutral = (; Lz = 2000, Δz₁ = 25, stretching = 4, θ₀ = 300, Γ = 0.003, f = 1.37e-4, uᵍ = 12, stop_time = 20hours + 2π / 1.37e-4), convective = (; Lz = 4000, Δz₁ = 50, θ₀ = 288, Γ = 0.003, surface_heat_flux = 8e-3 * 288 / 9.81, stop_time = 8hours),)(stable = (Lz = 400, Δz₁ = 6.25, θ₀ = 265, Γ = 0.01, zᵢ = 100, f = 0.000139, uᵍ = 8, surface_temperature = 265, cooling_rate = 6.944444444444444e-5, initial_tke = Main.var"##142".var"#3#4"(), stop_time = 32400.0), neutral = (Lz = 2000, Δz₁ = 25, stretching = 4, θ₀ = 300, Γ = 0.003, f = 0.000137, uᵍ = 12, stop_time = 117862.6664757634), convective = (Lz = 4000, Δz₁ = 50, θ₀ = 288, Γ = 0.003, surface_heat_flux = 0.23486238532110093, stop_time = 28800.0))Surface layer
The surface exchanges momentum and heat with the first cell through bulk formulae whose transfer coefficients are built from a roughness length $ℓʳ$ and the von Kármán constant $κ$. The closure itself carries no von Kármán constant: its neutral logarithmic layer has the value $ℂˢ (ℂᵘ³ / ℂᴰ)^{1/4}$ implied by its mixing length and stability functions, 0.40 by default.
The neutral case prescribes the neutral log-law drag coefficient referenced to the first cell center, $Cᵈ = [κ / \ln(z₁ / ℓʳ)]²$, which the column builder below computes from its grid. The stable case prescribes Monin–Obukhov similarity instead, which Breeze supplies through a PolynomialCoefficient: its polynomial $a₀ + a₁ U + a₂ / U$ is the neutral 10 m transfer coefficient, so $a₀ = Cᵈ = [κ / \ln(10 / ℓʳ)]²$ with the other two zero is the neutral log law, and a FittedStabilityFunction corrects it away from neutral. A moisture_availability of zero declares a dry surface, whose humidity is that of the air above it rather than the saturation humidity at the surface temperature. Over a saturated surface at 265 K that humidity would add 0.3 K of spurious virtual warming, comparable to the whole surface-layer temperature deficit.
κ = 0.4 # von Kármán constantℓʳ = 0.1 # m, roughness lengthCᵈ = (κ / log(10 / ℓʳ))^2 # the neutral log-law drag coefficient, referenced to 10 mmonin_obukhov_coefficient = PolynomialCoefficient(polynomial = Cᵈ .* (1, 0, 0), roughness_length = ℓʳ, stability_function = FittedStabilityFunction(ℓʳ), moisture_availability = 0)PolynomialCoefficient{Float64}
├── polynomial: (0.007544467880464557, 0.0, 0.0)
├── roughness_length: 0.1 m
├── minimum_wind_speed: 0.1 m/s
├── surface: Breeze.Thermodynamics.PlanarLiquidSurface
├── moisture_availability: 0.0
└── stability_function: FittedStabilityFunction (Li et al. 2010)Building a column
Everything that differs between the cases is a keyword argument of one function. The vertical grid ramps linearly from a spacing Δz₁ at the surface to stretching * Δz₁ at the top. The initial potential temperature is θ₀ up to the inversion height zᵢ and increases at the lapse rate Γ above it. A surface_temperature selects the Monin–Obukhov surface layer; otherwise the drag is the neutral log law and the heat flux is the prescribed kinematic surface_heat_flux. The stable case cools its surface at a fixed rate, which a callback applies to the surface temperature field every iteration.
The closure adds the tracer ρe, the density-weighted turbulent kinetic energy, to the model, so a specific initial profile is weighted by the reference density after it is set. Vertical diffusion and the sinks of turbulent kinetic energy are treated implicitly, so every column takes one-minute time steps.
function boundary_layer_simulation(; closure, Lz, Δz₁, θ₀, Γ, stop_time, stretching = 1, zᵢ = 0, f = 0, uᵍ = 0, surface_temperature = nothing, cooling_rate = 0, surface_heat_flux = 0, initial_tke = 0) z = PiecewiseStretchedDiscretization(z = [0, Lz], Δz = [Δz₁, stretching * Δz₁]) grid = RectilinearGrid(size = length(z) - 1; z, topology = (Flat, Flat, Bounded)) reference_state = ReferenceState(grid, base_pressure = 1e5, potential_temperature = θ₀) dynamics = AnelasticDynamics(reference_state) if isnothing(surface_temperature) T₀ = nothing z₁ = first(znodes(grid, Center())) coefficient = (κ / log(z₁ / ℓʳ))^2 ρθ_bc = FluxBoundaryCondition(surface_density(reference_state) * surface_heat_flux) else T₀ = Field{Center, Center, Nothing}(grid) set!(T₀, surface_temperature) coefficient = monin_obukhov_coefficient ρθ_bc = BulkSensibleHeatFlux(; coefficient, surface_temperature = T₀) end ρu_bc = BulkDrag(; coefficient, surface_temperature = T₀) boundary_conditions = (ρu = FieldBoundaryConditions(bottom = ρu_bc), ρv = FieldBoundaryConditions(bottom = ρu_bc), ρθ = FieldBoundaryConditions(bottom = ρθ_bc)) model = AtmosphereModel(grid; dynamics, boundary_conditions, closure, coriolis = FPlane(; f), forcing = geostrophic_forcings(uᵍ, 0)) θᵢ(z) = θ₀ + Γ * max(0, z - zᵢ) set!(model, θ = θᵢ, u = uᵍ, ρe = initial_tke) set!(model.tracers.ρe, reference_state.density * model.tracers.ρe) simulation = Simulation(model, Δt = 1minute; stop_time) cool!(sim) = set!(T₀, surface_temperature - cooling_rate * time(sim)) iszero(cooling_rate) || add_callback!(simulation, cool!) return simulationendsimulations = map(closures) do closure map(case -> boundary_layer_simulation(; closure, case...), cases)endfor closure_simulations in simulations, simulation in closure_simulations run!(simulation)end[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (764.398 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (12.314 seconds).
[ Info: Simulation is stopping after running for 13.816 seconds.
[ Info: Simulation time 9 hours equals or exceeds stop time 9 hours.
[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (508.546 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (10.927 seconds).
[ Info: Simulation is stopping after running for 12.479 seconds.
[ Info: Simulation time 1.364 days equals or exceeds stop time 1.364 days.
[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (472.108 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (8.839 seconds).
[ Info: Simulation is stopping after running for 9.575 seconds.
[ Info: Simulation time 8 hours equals or exceeds stop time 8 hours.
[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (506.427 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (9.308 seconds).
[ Info: Simulation is stopping after running for 10.301 seconds.
[ Info: Simulation time 9 hours equals or exceeds stop time 9 hours.
[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (484.858 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (9.185 seconds).
[ Info: Simulation is stopping after running for 10.597 seconds.
[ Info: Simulation time 1.364 days equals or exceeds stop time 1.364 days.
[ Info: Initializing simulation...
[ Info: ... simulation initialization complete (334.690 ms)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (8.636 seconds).
[ Info: Simulation is stopping after running for 9.299 seconds.
[ Info: Simulation time 8 hours equals or exceeds stop time 8 hours.
Boundary-layer depth
The three layers span very different depths, a few hundred meters to a few kilometers, so the profiles are compared against $z / hᵇˡ$, with the depth $hᵇˡ$ diagnosed the way each case's literature defines it. GABLS1 and the neutral intercomparison take the height at which the stress falls to 5% of its maximum, divided by 0.95. The stress is a vector, $|τ| = Kᵘ |∂_z 𝐮|$, so it does not vanish at the low-level jet, where the wind speed peaks but the wind is still turning with height. The convective case has no wind, so its depth is the height of the inversion, where $∂_z θ$ is largest.
function stress_depth(model) u, v, w = model.velocities τ = Field(model.closure_fields.Kᵘ * sqrt(∂z(u)^2 + ∂z(v)^2)) τₖ = interior(τ, 1, 1, :) kᵖ = argmax(τₖ) k = findnext(τ -> τ < 0.05 * τₖ[kᵖ], τₖ, kᵖ) return znodes(τ)[k] / 0.95endfunction inversion_depth(model) ∂zθ = Field(∂z(model.formulation.potential_temperature)) return znodes(∂zθ)[argmax(interior(∂zθ, 1, 1, :))]enddepths = (stable = stress_depth, neutral = stress_depth, convective = inversion_depth)(stable = Main.var"##142".stress_depth, neutral = Main.var"##142".stress_depth, convective = Main.var"##142".inversion_depth)The dry cases
The figure shows what the model carries forward in time: potential temperature, wind speed, and turbulent kinetic energy. Solid lines are the Nakanishi–Niino constants, dashed lines the rational functions, both against $z / hᵇˡ$ with the depth of the constant closure's layer. The legend records each case's depth and the maximum of its diffusivity.
set_theme!(fontsize = 14, linewidth = 2.5)colors = (stable = :dodgerblue, neutral = :black, convective = :orangered)linestyles = (NN09 = :solid, Rational = :dash)function specific_tke(model) return Field(model.tracers.ρe / model.dynamics.reference_state.density)endfig = Figure(size = (1100, 400))ax_θ = Axis(fig[1, 1]; xlabel = "θ - θ(z=0) (K)", ylabel = "z / hᵇˡ")ax_U = Axis(fig[1, 2]; xlabel = "Wind speed (m s⁻¹)")ax_e = Axis(fig[1, 3]; xlabel = "TKE (m² s⁻²)")for ax in (ax_θ, ax_U, ax_e) ylims!(ax, 0, 1.5)endfor ax in (ax_U, ax_e) hideydecorations!(ax, grid = false)endfor name in keys(cases) reference_model = simulations.NN09[name].model hᵇˡ = depths[name](reference_model) Kᶜ_max = maximum(reference_model.closure_fields.Kᶜ) color = colors[name] for (set, closure_simulations) in pairs(simulations) model = closure_simulations[name].model u, v, w = model.velocities θ = model.formulation.potential_temperature linestyle = linestyles[set] U = Field(sqrt(u^2 + v^2)) e = specific_tke(model) label = "$name: hᵇˡ = $(round(Int, hᵇˡ)) m, max Kᶜ = $(round(Int, Kᶜ_max)) m² s⁻¹" lines!(ax_θ, Field(θ - θ[1, 1, 1]), znodes(θ) ./ hᵇˡ; color, linestyle) lines!(ax_U, U, znodes(U) ./ hᵇˡ; color, linestyle) if set == :NN09 lines!(ax_e, e, znodes(e) ./ hᵇˡ; color, linestyle, label) else lines!(ax_e, e, znodes(e) ./ hᵇˡ; color, linestyle) end endendaxislegend(ax_e, position = :rt, framevisible = false)axislegend(ax_θ, [LineElement(linestyle = :solid), LineElement(linestyle = :dash)], ["Nakanishi–Niino constants", "Rational functions"], position = :rb, framevisible = false)figA library of cloud-topped boundary layers
Dry boundary layers exercise the closure's mechanics; clouds are where the choices in it bite. Shen et al. (2022) ran large-eddy simulations of the boundary layer at 22 points along the GPCI transect across the Pacific — off Peru, through the deep tropics, and from the California stratocumulus deck out into the trade cumulus — each forced by a global climate model's large-scale state for four months of the year and two climates, and published the library (CC0, doi:10.22002/D1.20052). The CNRM-CM6-1 slice of it, reduced to what a single column needs (see validation/cloud_les_library), is the shen_et_al_2022_les_profiles artifact: for each member the large-scale forcing the LES saw, its radiative heating, its surface fluxes, its initial and time-mean profiles, and the fluxes and TKE budget it produced.
using NCDatasetsusing Pkg.Artifacts: ensure_artifact_installed, artifact_hash, artifact_pathartifacts_toml = joinpath(pkgdir(Breeze), "Artifacts.toml")ensure_artifact_installed("shen_et_al_2022_les_profiles", artifacts_toml)library = artifact_path(artifact_hash("shen_et_al_2022_les_profiles", artifacts_toml))member(site, month) = joinpath(library, "cfsite$(lpad(site, 2, '0'))_CNRM-CM6-1_amip_$(month).nc")member (generic function with 1 method)Driving a column the way the LES was driven
The LES protocol is reproduced term by term, with the LES's own output standing in for everything the LES computed for itself, so that the closure is the only unknown in the column:
- large-scale subsidence, horizontal advection and the GCM's vertical eddy advection ("fluctuation") tendencies of temperature and moisture, which are time-invariant, as forcings;
- the LES's radiative heating, with its diurnal cycle, as an hourly time series;
- the LES's surface sensible and latent heat fluxes and momentum fluxes, prescribed;
- relaxation of the winds toward the GCM winds on 6 hours everywhere, and of temperature and moisture on 24 hours above the boundary layer, ramping in between 3.0 and 3.5 km, as in the LES.
Temperature tendencies are supplied as energy forcings (E, a static-energy tendency), which the model converts to its potential temperature. Microphysics is warm-phase saturation adjustment; the LES also had drizzle, which is one reason its stratocumulus is thinner than a non-precipitating column's.
function interpolated(zs, vs) return function (z) z ≤ zs[1] && return vs[1] z ≥ zs[end] && return vs[end] k = searchsortedlast(zs, z) w = (z - zs[k]) / (zs[k+1] - zs[k]) return (1 - w) * vs[k] + w * vs[k+1] endendinterpolated (generic function with 1 method)The diagnostics of the column are averaged over the LES's own analysis window, the final two days, by a callback that accumulates them every ten minutes.
mutable struct TimeAverages{D, S} diagnostics :: D sums :: S count :: Int start :: Float64endTimeAverages(diagnostics, start) = TimeAverages(diagnostics, map(f -> zeros(length(interior(f, 1, 1, :))), diagnostics), 0, start)function (averages::TimeAverages)(simulation) time(simulation) < averages.start && return nothing for (sum, field) in zip(averages.sums, averages.diagnostics) compute!(field) sum .+= interior(field, 1, 1, :) end averages.count += 1 return nothingendtime_means(averages) = map(sum -> sum ./ averages.count, averages.sums)using Breeze.TurbulenceClosures: shear_productionᶜᶜᶠ, buoyancy_productionᶜᶜᶠ, dissipationᶜᶜᶜfunction les_driven_column(path; closure, Δt = 1minute) ds = NCDataset(path) z = ds["z"][:] t = ds["time"][:] Nz = length(z) Lz = z[end] + (z[2] - z[1]) / 2 grid = RectilinearGrid(size = Nz, z = (0, Lz), topology = (Flat, Flat, Bounded)) constants = ThermodynamicConstants() g = constants.gravitational_acceleration cᵖᵈ = constants.dry_air.heat_capacity # The LES reference pressure extrapolated to the surface, and the initial mixed-layer θ p₀ = ds["p0"][1] + ds["rho0"][1] * g * z[1] θ₀ = ds["thetali_mean_initial"][1] reference_state = ReferenceState(grid; base_pressure = p₀, potential_temperature = θ₀) dynamics = AnelasticDynamics(reference_state) ρ₀ = surface_density(reference_state) microphysics = SaturationAdjustment(equilibrium = WarmPhaseEquilibrium()) profile(name) = interpolated(z, ds[name][:]) # Large-scale forcing wˢ = Field{Nothing, Nothing, Face}(grid) set!(wˢ, profile("ls_subsidence")) subsidence = SubsidenceForcing(wˢ) dTdt = Field{Nothing, Nothing, Center}(grid) set!(dTdt, interpolated(z, cᵖᵈ .* (ds["dtdt_hadv"][:] .+ ds["dtdt_fluc"][:]))) dqdt = Field{Nothing, Nothing, Center}(grid) set!(dqdt, interpolated(z, ds["dqtdt_hadv"][:] .+ ds["dqtdt_fluc"][:])) # The LES's radiative heating, hourly, padded to the end of the run t_end = ds.attrib["target_window_end"] times = vcat(t, t_end) dTdt_rad = FieldTimeSeries{Center, Center, Center}(grid, times) heating = ds["dtdt_rad_hourly"][:, :] for n in eachindex(times) set!(dTdt_rad[n], reshape(cᵖᵈ .* heating[:, min(n, length(t))], 1, 1, Nz)) end # Relaxation, as in the LES, toward the GCM profiles the LES was initialized from: winds on 6 h everywhere, # thermodynamics on 24 h above 3 km. (The file's `*_mean_nudge` profiles are the LES's own run means, not the targets.) uₙ, vₙ, θₙ, qₙ = profile("u_mean_initial"), profile("v_mean_initial"), profile("thetali_mean_initial"), profile("qt_mean_initial") ramp(z) = z < 3000 ? 0.0 : z > 3500 ? 1.0 : (1 - cos(π * (z - 3000) / 500)) / 2 relax_u = Relaxation(rate = 1 / 6hours, target = (z, t) -> uₙ(z)) relax_v = Relaxation(rate = 1 / 6hours, target = (z, t) -> vₙ(z)) relax_θ = Relaxation(rate = 1 / 24hours, mask = ramp, target = (z, t) -> θₙ(z)) relax_q = Relaxation(rate = 1 / 24hours, mask = ramp, target = (z, t) -> qₙ(z)) forcing = (u = (subsidence, relax_u), v = (subsidence, relax_v), θ = (subsidence, relax_θ), qᵉ = (subsidence, Forcing(dqdt), relax_q), E = (Forcing(dTdt), Forcing(dTdt_rad))) # Surface fluxes prescribed from the LES time series series(name) = interpolated(t, ds[name][:]) shf, lhf, uw, vw = series("shf_surface_mean"), series("lhf_surface_mean"), series("uw_surface_mean"), series("vw_surface_mean") ℒᵛ = Breeze.Thermodynamics.liquid_latent_heat(ds["surface_temperature"][1], constants) prescribed(flux) = FluxBoundaryCondition((i, j, grid, clock, fields) -> flux(clock.time), discrete_form = true) boundary_conditions = (ρE = FieldBoundaryConditions(bottom = prescribed(shf)), ρqᵉ = FieldBoundaryConditions(bottom = prescribed(t -> lhf(t) / ℒᵛ)), ρu = FieldBoundaryConditions(bottom = prescribed(t -> ρ₀ * uw(t))), ρv = FieldBoundaryConditions(bottom = prescribed(t -> ρ₀ * vw(t)))) model = AtmosphereModel(grid; dynamics, microphysics, closure, forcing, boundary_conditions, advection = nothing) set!(model; θ = profile("thetali_mean_initial"), qᵗ = profile("qt_mean_initial"), u = profile("u_mean_initial"), v = profile("v_mean_initial"), ρe = 1e-3) set!(model.tracers.ρe, reference_state.density * model.tracers.ρe) simulation = Simulation(model; Δt, stop_time = t_end, verbose = false) # Diagnostics: the state, the closure's fluxes, and the terms of its TKE budget Kᵘ, Kᶜ, N² = model.closure_fields.Kᵘ, model.closure_fields.Kᶜ, model.closure_fields.N² u, v, w = model.velocities qᵗ = model.microphysical_fields.qᵉ e = Field(model.tracers.ρe / reference_state.density) diagnostics = (θˡ = model.formulation.potential_temperature, qᵗ = qᵗ, qˡ = model.microphysical_fields.qˡ, u = u, e = e, Kᶜ = Kᶜ, w′qᵗ′ = Field(- Kᶜ * ∂z(qᵗ)), P = Field(KernelFunctionOperation{Center, Center, Face}(shear_productionᶜᶜᶠ, grid, Kᵘ, u, v)), B = Field(KernelFunctionOperation{Center, Center, Face}(buoyancy_productionᶜᶜᶠ, grid, Kᶜ, N²)), ε = Field(KernelFunctionOperation{Center, Center, Center}(dissipationᶜᶜᶜ, grid, closure, e, model.velocities, model.closure_fields))) averages = TimeAverages(diagnostics, ds.attrib["target_window_start"]) add_callback!(simulation, averages, IterationInterval(10)) close(ds) return simulation, averagesendles_driven_column (generic function with 1 method)The LES targets are the time means over the same window; the error of a column is the root mean square of its difference from the LES below 3 km, above which both are relaxed to the same state.
function specific_les_tke(ds) haskey(ds, "tke_nd_mean") && return ds["tke_nd_mean"][:] # Older reduced artifacts kept energy density but omitted specific TKE. The exact # conversion uses rho0_full; rho0 is a nearby, staggered reference density, so the # specific TKE is approximate for those artifacts. Regenerated profiles retain exact tke_nd_mean. density_name = haskey(ds, "rho0_full") ? "rho0_full" : "rho0" return ds["tke_mean"][:] ./ ds[density_name][:]endfunction les_means(path) ds = NCDataset(path) means = (z = ds["z"][:], θˡ = ds["thetali_mean"][:], qᵗ = ds["qt_mean"][:], qˡ = ds["ql_mean"][:], u = ds["u_mean"][:], e = specific_les_tke(ds), # PyCLES archives centered mass fluxes. Normalize by the reference density # before comparing them to the SCM's kinematic -Kᶜ ∂z(qᵗ). w′qᵗ′ = (ds["qt_flux_z_mean"][:] .+ ds["qt_sgs_flux_z_mean"][:]) ./ ds["rho0"][:], P = ds["tke_prod_S_mean"][:], B = ds["tke_prod_B_mean"][:], cloud_fraction = mean(ds["cloud_fraction"][ds["time"][:] .≥ ds.attrib["target_window_start"]]), surface_temperature = mean(ds["surface_temperature"][:])) close(ds) return meansendfunction rmse(column, les, z; below = 3000) k = z .≤ below return sqrt(mean((column[k] .- les[k]).^2))endrmse (generic function with 1 method)Four configurations
Two coefficient sets, and two static stabilities: the dry buoyancy gradient (DryStaticStability), which treats a saturated parcel like a dry one, and the saturated buoyancy frequency (MoistStaticStability, the default), in which a rising parcel condenses and its latent heating offsets part of the stratification.
configurations = ( NN09 = constant_closure(static_stability = DryStaticStability()), Rational = TKEBasedTurbulenceClosure(static_stability = DryStaticStability()), NN09_moist = constant_closure(), Rational_moist = TKEBasedTurbulenceClosure(),)configuration_colors = (NN09 = :dodgerblue, Rational = :orangered, NN09_moist = :dodgerblue, Rational_moist = :orangered)configuration_linestyles = (NN09 = :solid, Rational = :solid, NN09_moist = :dash, Rational_moist = :dash)configuration_labels = (NN09 = "Nakanishi–Niino, dry N²", Rational = "Rational, dry N²", NN09_moist = "Nakanishi–Niino, moist N²", Rational_moist = "Rational, moist N²")(NN09 = "Nakanishi–Niino, dry N²", Rational = "Rational, dry N²", NN09_moist = "Nakanishi–Niino, moist N²", Rational_moist = "Rational, moist N²")Two members in detail
Site 17 in July is the stratocumulus deck off California: cloud fraction 0.96, a 460–1190 m cloud, 4 W m⁻² of sensible and 63 W m⁻² of latent heat flux over 291 K water. Site 22 in July, six hundred kilometers further out over 297.5 K water, is trade cumulus: cloud fraction 0.2, bases near 500 m and tops at 2.3 km. Between them lies the transition the library was built to span.
details = (stratocumulus = member(17, "07"), cumulus = member(22, "07"))detail_columns = map(details) do path map(configurations) do closure simulation, averages = les_driven_column(path; closure) run!(simulation) (; simulation, means = time_means(averages)) endenddetail_les = map(les_means, details)(stratocumulus = (z = Float32[10.0, 30.0, 50.0, 70.0, 90.0, 110.0, 130.0, 150.0, 170.0, 190.0, 210.0, 230.0, 250.0, 270.0, 290.0, 310.0, 330.0, 350.0, 370.0, 390.0, 410.0, 430.0, 450.0, 470.0, 490.0, 510.0, 530.0, 550.0, 570.0, 590.0, 610.0, 630.0, 650.0, 670.0, 690.0, 710.0, 730.0, 750.0, 770.0, 790.0, 810.0, 830.0, 850.0, 870.0, 890.0, 910.0, 930.0, 950.0, 970.0, 990.0, 1010.0, 1030.0, 1050.0, 1070.0, 1090.0, 1110.0, 1130.0, 1150.0, 1170.0, 1190.0, 1210.0, 1230.0, 1250.0, 1270.0, 1290.0, 1310.0, 1330.0, 1350.0, 1370.0, 1390.0, 1410.0, 1430.0, 1450.0, 1470.0, 1490.0, 1510.0, 1530.0, 1550.0, 1570.0, 1590.0, 1610.0, 1630.0, 1650.0, 1670.0, 1690.0, 1710.0, 1730.0, 1750.0, 1770.0, 1790.0, 1810.0, 1830.0, 1850.0, 1870.0, 1890.0, 1910.0, 1930.0, 1950.0, 1970.0, 1990.0, 2010.0, 2030.0, 2050.0, 2070.0, 2090.0, 2110.0, 2130.0, 2150.0, 2170.0, 2190.0, 2210.0, 2230.0, 2250.0, 2270.0, 2290.0, 2310.0, 2330.0, 2350.0, 2370.0, 2390.0, 2410.0, 2430.0, 2450.0, 2470.0, 2490.0, 2510.0, 2530.0, 2550.0, 2570.0, 2590.0, 2610.0, 2630.0, 2650.0, 2670.0, 2690.0, 2710.0, 2730.0, 2750.0, 2770.0, 2790.0, 2810.0, 2830.0, 2850.0, 2870.0, 2890.0, 2910.0, 2930.0, 2950.0, 2970.0, 2990.0, 3010.0, 3030.0, 3050.0, 3070.0, 3090.0, 3110.0, 3130.0, 3150.0, 3170.0, 3190.0, 3210.0, 3230.0, 3250.0, 3270.0, 3290.0, 3310.0, 3330.0, 3350.0, 3370.0, 3390.0, 3410.0, 3430.0, 3450.0, 3470.0, 3490.0, 3510.0, 3530.0, 3550.0, 3570.0, 3590.0, 3610.0, 3630.0, 3650.0, 3670.0, 3690.0, 3710.0, 3730.0, 3750.0, 3770.0, 3790.0, 3810.0, 3830.0, 3850.0, 3870.0, 3890.0, 3910.0, 3930.0, 3950.0, 3970.0, 3990.0], θˡ = Float32[288.79913, 288.76416, 288.74808, 288.74176, 288.74063, 288.74167, 288.7435, 288.7459, 288.74878, 288.75217, 288.7562, 288.7612, 288.7675, 288.77512, 288.7842, 288.79495, 288.80756, 288.8224, 288.84, 288.86087, 288.88535, 288.91364, 288.94562, 288.98083, 289.0186, 289.05798, 289.09784, 289.1371, 289.17477, 289.21, 289.24237, 289.2717, 289.2981, 289.32193, 289.3436, 289.36362, 289.38245, 289.40067, 289.4187, 289.437, 289.4559, 289.47568, 289.49652, 289.51865, 289.54218, 289.56705, 289.5927, 289.61786, 289.63986, 289.65475, 289.65826, 289.6497, 289.6444, 289.71973, 290.03094, 290.77765, 292.13687, 293.9057, 295.52893, 296.68985, 297.45056, 297.94037, 298.28067, 298.54587, 298.77347, 298.98068, 299.17496, 299.35986, 299.53772, 299.71002, 299.87784, 300.04175, 300.20236, 300.36002, 300.5149, 300.66708, 300.81683, 300.9644, 301.10995, 301.25357, 301.3952, 301.5349, 301.6728, 301.80875, 301.9427, 302.07465, 302.20468, 302.33295, 302.4595, 302.58435, 302.70758, 302.82935, 302.9498, 303.0691, 303.1874, 303.30478, 303.42133, 303.53705, 303.65204, 303.76636, 303.87994, 303.99283, 304.105, 304.21652, 304.32736, 304.4374, 304.5467, 304.65518, 304.76288, 304.86975, 304.9758, 305.081, 305.1854, 305.28897, 305.39175, 305.49377, 305.59503, 305.69556, 305.79535, 305.8944, 305.9927, 306.09024, 306.18704, 306.28317, 306.37863, 306.4735, 306.56775, 306.6614, 306.75443, 306.8469, 306.93878, 307.03012, 307.121, 307.21146, 307.3015, 307.39114, 307.48038, 307.56918, 307.65765, 307.7457, 307.83344, 307.92084, 308.00793, 308.0947, 308.18112, 308.26718, 308.35287, 308.43817, 308.52307, 308.60764, 308.69186, 308.77573, 308.85925, 308.94254, 309.02554, 309.10834, 309.19095, 309.27344, 309.35587, 309.4382, 309.52048, 309.60266, 309.68475, 309.76675, 309.84863, 309.93045, 310.01218, 310.09378, 310.17526, 310.2566, 310.33768, 310.41785, 310.49716, 310.57697, 310.65738, 310.73752, 310.81708, 310.89606, 310.97455, 311.05255, 311.13022, 311.20758, 311.2846, 311.36127, 311.43762, 311.51358, 311.58917, 311.66434, 311.73923, 311.81375, 311.8879, 311.96167, 312.03503, 312.10803, 312.18063, 312.253, 312.32523, 312.39752, 312.47052, 312.5508], qᵗ = Float32[0.00963867, 0.009429231, 0.009317498, 0.009252948, 0.009220498, 0.009200785, 0.009186418, 0.00917401, 0.009161892, 0.009148952, 0.009134368, 0.009117256, 0.009096833, 0.009072414, 0.009043253, 0.009008606, 0.008967771, 0.008919738, 0.008863747, 0.008799381, 0.008726509, 0.008645615, 0.008558036, 0.008465998, 0.008372497, 0.0082807345, 0.008194139, 0.0081154, 0.008046423, 0.007988009, 0.007939732, 0.007900554, 0.007869198, 0.0078442935, 0.007824581, 0.0078088874, 0.007796243, 0.0077858553, 0.0077770567, 0.007769385, 0.007762567, 0.0077564325, 0.0077508753, 0.007745888, 0.007741568, 0.007738141, 0.007736038, 0.007735952, 0.0077387406, 0.00774536, 0.007756532, 0.0077711777, 0.0077823764, 0.0077635557, 0.007654825, 0.007384993, 0.006895756, 0.00623913, 0.0056270324, 0.0052226163, 0.0049951132, 0.004871855, 0.0047961604, 0.004739125, 0.0046887025, 0.0046405448, 0.0045934026, 0.004546957, 0.004501023, 0.004455455, 0.004410189, 0.0043652267, 0.0043205786, 0.004276275, 0.0042323708, 0.004188921, 0.0041459454, 0.0041034413, 0.004061434, 0.004019984, 0.003979144, 0.003938931, 0.0038993554, 0.003860459, 0.00382229, 0.003784855, 0.0037481212, 0.0037120592, 0.0036766762, 0.0036419933, 0.0036080196, 0.0035747453, 0.003542146, 0.0035101855, 0.0034788193, 0.0034480067, 0.0034177084, 0.0033878796, 0.0033584677, 0.0033294293, 0.0033007425, 0.0032723967, 0.003244381, 0.0032166985, 0.0031893738, 0.0031624404, 0.0031359273, 0.0031098586, 0.003084261, 0.0030591604, 0.0030345723, 0.0030105035, 0.0029869566, 0.0029639322, 0.0029414215, 0.002919401, 0.0028978367, 0.002876687, 0.0028559125, 0.0028354838, 0.0028153837, 0.0027955957, 0.002776102, 0.0027568864, 0.0027379324, 0.0027192202, 0.0027007307, 0.00268245, 0.0026643672, 0.0026464704, 0.002628748, 0.0026111894, 0.002593785, 0.0025765281, 0.0025594141, 0.0025424408, 0.0025256048, 0.0025089013, 0.002492326, 0.002475876, 0.0024595489, 0.0024433453, 0.0024272676, 0.0024113196, 0.002395504, 0.0023798216, 0.0023642713, 0.0023488502, 0.0023335537, 0.0023183771, 0.002303314, 0.0022883553, 0.0022734897, 0.0022587057, 0.0022439905, 0.0022293318, 0.0022147156, 0.0022001287, 0.0021855633, 0.0021710158, 0.0021564842, 0.0021419665, 0.0021274614, 0.002112968, 0.0020984863, 0.0020840163, 0.002069558, 0.0020551104, 0.0020406717, 0.0020262375, 0.0020118218, 0.0019975353, 0.001983357, 0.0019690497, 0.00195459, 0.00194015, 0.0019258038, 0.0019115483, 0.0018973738, 0.0018832766, 0.0018692561, 0.0018553125, 0.0018414465, 0.0018276589, 0.0018139492, 0.0018003163, 0.0017867575, 0.0017732688, 0.0017598448, 0.0017464786, 0.0017331617, 0.0017198846, 0.0017066406, 0.0016934269, 0.0016802407, 0.0016670792, 0.0016539397, 0.0016408194, 0.0016277151, 0.0016146286], qˡ = Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0850207f-13, 2.0717796f-10, 6.1329892f-9, 8.233027f-8, 3.9181384f-7, 1.0295608f-6, 1.8017528f-6, 2.4777726f-6, 2.9392781f-6, 3.2218957f-6, 3.3773335f-6, 3.4595928f-6, 3.4931402f-6, 3.5046344f-6, 3.5188639f-6, 3.5431985f-6, 3.5814858f-6, 3.6218119f-6, 3.6684917f-6, 3.7350867f-6, 3.845864f-6, 4.002705f-6, 4.2167985f-6, 4.5478278f-6, 5.262539f-6, 7.1064496f-6, 1.16477595f-5, 2.1579783f-5, 3.9489638f-5, 6.605941f-5, 0.000100833764, 0.00014272696, 0.00018641463, 0.00021595349, 0.0002163429, 0.00016694012, 8.156384f-5, 2.0286256f-5, 4.846544f-6, 2.1061717f-6, 8.5530644f-7, 2.9966796f-7, 7.9672894f-8, 8.365746f-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], u = Float32[1.8611642, 2.0644207, 2.1451025, 2.1833384, 2.2015092, 2.2106078, 2.2146404, 2.2156212, 2.2145848, 2.2122755, 2.2091875, 2.2056668, 2.2020278, 2.198702, 2.1961896, 2.1948338, 2.1948967, 2.196509, 2.1997926, 2.2048216, 2.2114503, 2.2192893, 2.22782, 2.236513, 2.2449028, 2.2526267, 2.2594383, 2.2652767, 2.270218, 2.274471, 2.2781236, 2.2813134, 2.284169, 2.286827, 2.2894695, 2.2920783, 2.294517, 2.2967212, 2.2986803, 2.3003569, 2.3015864, 2.3022692, 2.3023803, 2.3017843, 2.300376, 2.2980285, 2.2946758, 2.290326, 2.2851927, 2.2799125, 2.276114, 2.2762542, 2.2831137, 2.297474, 2.319141, 2.3422976, 2.3522105, 2.3453023, 2.3332336, 2.3326561, 2.345474, 2.3668113, 2.3910184, 2.4148226, 2.436984, 2.4576137, 2.4773386, 2.4965532, 2.515589, 2.5346599, 2.5537484, 2.5726643, 2.5912557, 2.6096473, 2.628146, 2.646883, 2.6659722, 2.6854963, 2.7053757, 2.725557, 2.7462227, 2.7674875, 2.7892256, 2.8112364, 2.833337, 2.8554358, 2.8775923, 2.8998492, 2.9222178, 2.944748, 2.9675095, 2.9905586, 3.0139325, 3.037624, 3.0616052, 3.0858636, 3.1104147, 3.1352968, 3.1605127, 3.1861014, 3.2120886, 3.2384274, 3.265064, 3.2919621, 3.3190548, 3.3462322, 3.373434, 3.400625, 3.427793, 3.454893, 3.4818285, 3.5085194, 3.5349786, 3.5613015, 3.5876064, 3.6139638, 3.6403873, 3.666867, 3.6934178, 3.720046, 3.746694, 3.7732847, 3.799844, 3.8264685, 3.853203, 3.88004, 3.9069772, 3.9340107, 3.9610903, 3.9881432, 4.01512, 4.0419765, 4.06871, 4.0954037, 4.122108, 4.1487675, 4.17531, 4.201744, 4.2281137, 4.254443, 4.280746, 4.307054, 4.3334084, 4.359827, 4.3862963, 4.412788, 4.4392734, 4.4657097, 4.4920535, 4.5182796, 4.544395, 4.57041, 4.5963283, 4.6221642, 4.6479244, 4.673611, 4.6992197, 4.7247314, 4.7501335, 4.7754397, 4.800672, 4.825829, 4.8508673, 4.875735, 4.900458, 4.925285, 4.9507117, 4.9770403, 5.003301, 5.026264, 5.0415688, 5.049007, 5.055545, 5.0753207, 5.1109405, 5.151173, 5.1871166, 5.2172437, 5.24404, 5.2696223, 5.294742, 5.3195667, 5.3441844, 5.3686543, 5.3929963, 5.417211, 5.441294, 5.4652357, 5.4890265, 5.5126524, 5.536106, 5.5594296, 5.5826635, 5.6058083, 5.6288605, 5.6518183, 5.674678, 5.697439, 5.7201695, 5.742598], e = Float32[0.23785053, 0.24849065, 0.22179824, 0.19344014, 0.17132188, 0.15571155, 0.14519179, 0.1384408, 0.1344095, 0.13232961, 0.13170563, 0.13215372, 0.13325699, 0.13466005, 0.1360604, 0.13717438, 0.13778019, 0.13770506, 0.13683286, 0.13515213, 0.1326836, 0.12940834, 0.12545688, 0.12122132, 0.117242716, 0.11409736, 0.11228503, 0.11204086, 0.11310164, 0.115031786, 0.11744105, 0.120021984, 0.12253398, 0.12469586, 0.126354, 0.12759809, 0.12854733, 0.12928803, 0.13000529, 0.13082568, 0.13183665, 0.1331851, 0.13495654, 0.137232, 0.14006682, 0.14348212, 0.14769422, 0.15302089, 0.16047895, 0.17274827, 0.19574805, 0.23916756, 0.31466708, 0.4219294, 0.52254647, 0.5694407, 0.4905802, 0.292763, 0.13489947, 0.08175739, 0.05953556, 0.04701491, 0.039309114, 0.034064464, 0.030178623, 0.027181339, 0.024910446, 0.023177873, 0.021786334, 0.020611111, 0.01956873, 0.018611802, 0.017691376, 0.01682394, 0.016070934, 0.015453199, 0.014966675, 0.014635754, 0.014459339, 0.01439711, 0.014382828, 0.014338236, 0.014213911, 0.013998366, 0.01370108, 0.013334423, 0.01292044, 0.01249361, 0.012075404, 0.011683584, 0.011340913, 0.011068471, 0.010876558, 0.010757725, 0.010685861, 0.010637496, 0.010595925, 0.010543716, 0.010461446, 0.010346314, 0.0102001475, 0.010015826, 0.009784181, 0.009508149, 0.009202413, 0.008879764, 0.008548748, 0.008219333, 0.007905359, 0.0076134545, 0.007347021, 0.0071117477, 0.006916167, 0.0067637456, 0.0066519445, 0.006569278, 0.0065052807, 0.006453456, 0.006410288, 0.0063800956, 0.006361296, 0.00634562, 0.006329829, 0.0063113193, 0.0062840283, 0.006242154, 0.0061846296, 0.0061127166, 0.0060232924, 0.005912829, 0.005781157, 0.0056302175, 0.0054622227, 0.0052840146, 0.005103213, 0.0049215993, 0.0047374167, 0.0045533623, 0.0043775486, 0.0042170924, 0.0040745917, 0.003948974, 0.0038376106, 0.0037390091, 0.0036528548, 0.0035800955, 0.0035217127, 0.0034782526, 0.003449124, 0.0034312312, 0.0034208563, 0.003416491, 0.003419202, 0.0034310617, 0.0034532556, 0.0034840233, 0.0035191523, 0.0035539991, 0.0035858324, 0.0036153162, 0.0036448673, 0.0036764091, 0.0037110264, 0.0037489624, 0.0037895872, 0.0038327489, 0.0038821585, 0.0039471677, 0.004039218, 0.0041697603, 0.004338471, 0.0043145246, 0.0035980952, 0.0023695822, 0.0013519509, 0.00074944546, 0.00042633322, 0.00025383505, 0.00015878728, 0.00010408333, 7.1140654f-5, 5.044084f-5, 3.692788f-5, 2.780487f-5, 2.1461847f-5, 1.6937245f-5, 1.3637021f-5, 1.1183058f-5, 9.32802f-6, 7.906147f-6, 6.803948f-6, 5.9422514f-6, 5.2648907f-6, 4.7315193f-6, 4.3128525f-6, 3.9875213f-6, 3.739934f-6, 3.5588562f-6, 3.4363964f-6, 3.367412f-6], w′qᵗ′ = Float32[1.0365443f-5, 2.065801f-5, 2.0506759f-5, 2.0405681f-5, 2.0335328f-5, 2.0280868f-5, 2.0241083f-5, 2.021584f-5, 2.020279f-5, 2.0205476f-5, 2.0234673f-5, 2.0301966f-5, 2.0401854f-5, 2.0504953f-5, 2.0579038f-5, 2.0613019f-5, 2.0616722f-5, 2.0593021f-5, 2.0531459f-5, 2.0421301f-5, 2.025747f-5, 2.0052737f-5, 1.9815934f-5, 1.9554342f-5, 1.927619f-5, 1.8988192f-5, 1.8725703f-5, 1.8485152f-5, 1.8246996f-5, 1.8024011f-5, 1.7826862f-5, 1.7660832f-5, 1.7537775f-5, 1.74663f-5, 1.7440596f-5, 1.7434819f-5, 1.7426511f-5, 1.7404827f-5, 1.7366205f-5, 1.7325416f-5, 1.7304534f-5, 1.7301276f-5, 1.7297476f-5, 1.7289685f-5, 1.7284574f-5, 1.728591f-5, 1.7319575f-5, 1.742712f-5, 1.7621802f-5, 1.7894288f-5, 1.8233164f-5, 1.861385f-5, 1.8914898f-5, 1.8814808f-5, 1.7781442f-5, 1.5264526f-5, 1.1344954f-5, 7.0841243f-6, 3.812768f-6, 1.8631384f-6, 8.223096f-7, 3.39253f-7, 1.3535939f-7, 7.250994f-8, 5.7139413f-8, 4.6816705f-8, 3.8373297f-8, 3.0648046f-8, 2.3720482f-8, 1.8989041f-8, 1.6620788f-8, 1.5671446f-8, 1.691906f-8, 2.118078f-8, 2.6321137f-8, 2.8881868f-8, 2.7659452f-8, 2.4447177f-8, 2.0997597f-8, 1.6943472f-8, 1.1891772f-8, 7.876018f-9, 7.057592f-9, 8.193538f-9, 8.169618f-9, 5.973034f-9, 3.4647485f-9, 2.7852478f-9, 4.286784f-9, 6.929697f-9, 9.455806f-9, 1.0916058f-8, 1.08442f-8, 9.592365f-9, 8.0856495f-9, 6.7593464f-9, 5.349358f-9, 3.892791f-9, 2.7865148f-9, 1.5083791f-9, -1.1275095f-9, -4.8060347f-9, -7.523658f-9, -8.074745f-9, -7.3004607f-9, -6.472551f-9, -5.63817f-9, -4.2794612f-9, -2.6602753f-9, -1.5283584f-9, -9.3518f-10, -2.1361676f-10, 9.28931f-10, 1.955594f-9, 2.2685451f-9, 1.9888164f-9, 1.8107428f-9, 2.3561328f-9, 3.6020043f-9, 4.776766f-9, 5.1067115f-9, 4.5978936f-9, 3.8148005f-9, 3.2196095f-9, 3.0437401f-9, 3.4049437f-9, 4.0906483f-9, 4.501367f-9, 4.2034443f-9, 3.3552188f-9, 2.4414228f-9, 1.8437245f-9, 1.7105947f-9, 1.9454987f-9, 2.1907887f-9, 2.025411f-9, 1.341243f-9, 4.699935f-10, -9.7707696f-11, -7.17182f-11, 5.0665616f-10, 1.3802265f-9, 2.3064062f-9, 3.1710488f-9, 3.901982f-9, 4.4264485f-9, 4.7659823f-9, 5.017673f-9, 5.173049f-9, 5.0825313f-9, 4.665074f-9, 4.065198f-9, 3.5517695f-9, 3.3108694f-9, 3.349814f-9, 3.5344494f-9, 3.682488f-9, 3.6485344f-9, 3.4026448f-9, 3.038545f-9, 2.6685985f-9, 2.3294255f-9, 1.976298f-9, 1.5474699f-9, 1.0397809f-9, 5.417395f-10, 1.9985891f-10, 1.2428691f-10, 2.8561245f-10, 6.049659f-10, 1.6209799f-9, 3.6551215f-9, 5.104935f-9, 4.5786734f-9, 3.0111365f-9, 1.71103f-9, 9.484354f-10, 5.380922f-10, 3.1520703f-10, 1.9121527f-10, 1.2008912f-10, 7.7828244f-11, 5.1813977f-11, 3.5278846f-11, 2.4480971f-11, 1.7252345f-11, 1.2304631f-11, 8.852564f-12, 6.402969f-12, 4.6098576f-12, 3.323622f-12, 2.422729f-12, 1.7204887f-12, 1.1794117f-12, 7.883364f-13, 5.00508f-13, 2.8210602f-13, -2.3511366f-12, 1.6620288f-11, 1.910815f-11], P = Float32[7.767487f-5, 0.00039871907, 0.00021263276, 0.00010713766, 5.8049827f-5, 3.684153f-5, 2.6885973f-5, 2.212425f-5, 2.0007197f-5, 1.9472056f-5, 2.004157f-5, 2.1460715f-5, 2.3513518f-5, 2.5996314f-5, 2.8611537f-5, 3.1033524f-5, 3.3141045f-5, 3.4856355f-5, 3.593387f-5, 3.6141504f-5, 3.5509744f-5, 3.4136938f-5, 3.1788535f-5, 2.832118f-5, 2.3937691f-5, 1.8953493f-5, 1.3707288f-5, 8.612178f-6, 4.0214522f-6, 8.623524f-8, -3.0615024f-6, -5.2816617f-6, -6.558244f-6, -7.0328915f-6, -6.9155876f-6, -6.3801826f-6, -5.5898367f-6, -4.666445f-6, -3.6914703f-6, -2.692328f-6, -1.7182421f-6, -8.647794f-7, -2.1148327f-7, 2.7102152f-7, 6.70793f-7, 1.0188226f-6, 1.196173f-6, 1.157189f-6, 1.0111281f-6, 7.007072f-7, 2.764255f-7, -6.013681f-8, -3.16673f-7, -6.376638f-7, -1.0662449f-6, -9.698931f-7, 1.2970836f-6, 8.484225f-7, -2.2253467f-8, 9.303336f-8, -3.334505f-7, -1.4214244f-6, -2.1062096f-6, -2.054188f-6, -1.7229211f-6, -1.3868231f-6, -1.0877325f-6, -8.938132f-7, -8.109962f-7, -7.8596025f-7, -7.5170414f-7, -7.134997f-7, -6.930641f-7, -6.0511184f-7, -4.1192365f-7, -1.9268742f-7, -2.3904306f-8, 9.565133f-8, 1.7388366f-7, 2.2402365f-7, 2.4547967f-7, 2.492025f-7, 2.5278942f-7, 2.7796992f-7, 3.3302592f-7, 3.9146428f-7, 4.132761f-7, 3.9479772f-7, 3.7650508f-7, 3.8738094f-7, 4.2208427f-7, 4.6431015f-7, 5.0062516f-7, 5.1800095f-7, 5.180676f-7, 5.2095555f-7, 5.3299385f-7, 5.4287705f-7, 5.4815854f-7, 5.641144f-7, 5.85788f-7, 5.851601f-7, 5.5686354f-7, 5.2864607f-7, 5.2493806f-7, 5.360613f-7, 5.4235613f-7, 5.453944f-7, 5.58734f-7, 5.822191f-7, 6.008667f-7, 6.0559245f-7, 6.0893f-7, 6.239215f-7, 6.4172247f-7, 6.488417f-7, 6.4755676f-7, 6.4902883f-7, 6.6267f-7, 6.91351f-7, 7.228782f-7, 7.436319f-7, 7.538135f-7, 7.58616f-7, 7.5892063f-7, 7.5632676f-7, 7.576004f-7, 7.6568836f-7, 7.739518f-7, 7.7359977f-7, 7.6602396f-7, 7.5671556f-7, 7.5016953f-7, 7.52188f-7, 7.632371f-7, 7.7551215f-7, 7.801124f-7, 7.7493354f-7, 7.6397487f-7, 7.528312f-7, 7.460975f-7, 7.457165f-7, 7.504455f-7, 7.5752837f-7, 7.6442615f-7, 7.701453f-7, 7.739531f-7, 7.755862f-7, 7.7634587f-7, 7.76448f-7, 7.74143f-7, 7.68223f-7, 7.59812f-7, 7.5221675f-7, 7.48068f-7, 7.475845f-7, 7.488473f-7, 7.496813f-7, 7.4908985f-7, 7.4725483f-7, 7.4469625f-7, 7.415574f-7, 7.374383f-7, 7.3251266f-7, 7.3036006f-7, 7.386546f-7, 7.5986907f-7, 7.722319f-7, 7.149284f-7, 5.1403845f-7, 2.5755955f-7, 1.4155601f-7, 2.50782f-7, 3.7783843f-7, 3.07927f-7, 1.5655557f-7, 6.44599f-8, 2.7022724f-8, 1.2939308f-8, 6.912675f-9, 3.921821f-9, 2.3167679f-9, 1.4155402f-9, 8.88677f-10, 5.6969524f-10, 3.7105666f-10, 2.4447894f-10, 1.6226581f-10, 1.0802895f-10, 7.181709f-11, 4.74726f-11, 3.1040413f-11, 1.991161f-11, 1.2395092f-11, 7.379681f-12, 4.1082793f-12, 2.0567755f-12, 8.602858f-13, 2.5438394f-13, 7.0853836f-15], B = Float32[3.6534482f-5, 0.00013373316, 0.00019349609, 0.00021294029, 0.00021020995, 0.00020033028, 0.00018829665, 0.00017522732, 0.0001616431, 0.00014741089, 0.00013214326, 0.00011569344, 9.886884f-5, 8.2612205f-5, 6.737512f-5, 5.3162657f-5, 3.9633505f-5, 2.6047317f-5, 1.1729435f-5, -3.302432f-6, -1.8600651f-5, -3.3409866f-5, -4.7008845f-5, -5.6773482f-5, -5.706522f-5, -4.472516f-5, -2.5175163f-5, -4.0525942f-6, 1.6759575f-5, 3.6333346f-5, 5.474471f-5, 7.2698596f-5, 9.0302536f-5, 0.00010740851, 0.00012409354, 0.0001406686, 0.00015756181, 0.00017500471, 0.00019341777, 0.0002133481, 0.00023511, 0.00025845144, 0.00028325274, 0.0003094522, 0.00033728164, 0.00036596748, 0.00039505505, 0.00042634664, 0.00046069833, 0.0004956263, 0.0005243489, 0.0005321887, 0.0004973946, 0.0003941593, 0.00022735284, 3.0114203f-5, -0.00010048156, -0.00010790129, -6.791542f-5, -3.6937203f-5, -1.8994044f-5, -1.2253549f-5, -8.1959415f-6, -5.8250025f-6, -4.9414366f-6, -3.7125928f-6, -2.7180427f-6, -1.754426f-6, -8.593672f-7, -2.602824f-7, 3.921857f-9, 1.534761f-7, 2.4498602f-8, -5.4171994f-7, -1.2391853f-6, -1.5688979f-6, -1.4129411f-6, -1.0473103f-6, -7.130944f-7, -3.584246f-7, 1.13684884f-7, 4.860854f-7, 4.813516f-7, 2.5513256f-7, 1.9506771f-7, 4.094501f-7, 6.5506896f-7, 6.709527f-7, 4.2953138f-7, 7.2801456f-8, -2.5115315f-7, -4.449455f-7, -4.6074257f-7, -3.3208516f-7, -1.7782989f-7, -5.6580397f-8, 7.875341f-8, 2.3415672f-7, 3.4132225f-7, 4.609087f-7, 7.754668f-7, 1.2508676f-6, 1.5969284f-6, 1.6470053f-6, 1.5336526f-6, 1.4377249f-6, 1.3405328f-6, 1.1468622f-6, 9.087613f-7, 7.57318f-7, 6.933618f-7, 5.9511717f-7, 4.1200994f-7, 2.3839267f-7, 1.7936433f-7, 2.1410459f-7, 2.264689f-7, 1.2112608f-7, -9.940609f-8, -3.0933725f-7, -3.7592855f-7, -3.0114407f-7, -1.8854816f-7, -1.1169429f-7, -1.01931896f-7, -1.8387885f-7, -3.2442685f-7, -4.1159964f-7, -3.6870048f-7, -2.3223421f-7, -8.724508f-8, 4.7432913f-10, 6.6761094f-9, -4.8539583f-8, -1.04407974f-7, -8.710909f-8, 2.2285052f-8, 1.6391832f-7, 2.56078f-7, 2.485689f-7, 1.4423698f-7, -1.3700057f-8, -1.8131162f-7, -3.4192314f-7, -4.8306197f-7, -5.880285f-7, -6.577084f-7, -7.1203317f-7, -7.555861f-7, -7.565539f-7, -6.890317f-7, -5.83325f-7, -4.9516353f-7, -4.610927f-7, -4.8076976f-7, -5.2635363f-7, -5.6586197f-7, -5.721002f-7, -5.365574f-7, -4.779369f-7, -4.1763562f-7, -3.6322677f-7, -3.0518498f-7, -2.310564f-7, -1.430264f-7, -5.7698696f-8, -6.1116007f-10, 6.6469936f-9, -3.227106f-8, -9.460099f-8, -2.0776486f-7, -6.4974927f-7, -9.547252f-7, -7.974354f-7, -5.066544f-7, -2.87536f-7, -1.5969277f-7, -9.04946f-8, -5.3044825f-8, -3.2281193f-8, -2.036402f-8, -1.32461615f-8, -8.846291f-9, -6.04117f-9, -4.2020614f-9, -2.9658596f-9, -2.1165993f-9, -1.5240231f-9, -1.1031074f-9, -7.9873363f-10, -5.76375f-10, -4.1245682f-10, -2.9090005f-10, -2.0039506f-10, -1.3334682f-10, -8.411654f-11, -4.8637296f-11, -2.3839016f-11, -9.2178045f-12, -9.534937f-13], cloud_fraction = 0.9635449f0, surface_temperature = 290.85318f0), cumulus = (z = Float32[10.0, 30.0, 50.0, 70.0, 90.0, 110.0, 130.0, 150.0, 170.0, 190.0, 210.0, 230.0, 250.0, 270.0, 290.0, 310.0, 330.0, 350.0, 370.0, 390.0, 410.0, 430.0, 450.0, 470.0, 490.0, 510.0, 530.0, 550.0, 570.0, 590.0, 610.0, 630.0, 650.0, 670.0, 690.0, 710.0, 730.0, 750.0, 770.0, 790.0, 810.0, 830.0, 850.0, 870.0, 890.0, 910.0, 930.0, 950.0, 970.0, 990.0, 1010.0, 1030.0, 1050.0, 1070.0, 1090.0, 1110.0, 1130.0, 1150.0, 1170.0, 1190.0, 1210.0, 1230.0, 1250.0, 1270.0, 1290.0, 1310.0, 1330.0, 1350.0, 1370.0, 1390.0, 1410.0, 1430.0, 1450.0, 1470.0, 1490.0, 1510.0, 1530.0, 1550.0, 1570.0, 1590.0, 1610.0, 1630.0, 1650.0, 1670.0, 1690.0, 1710.0, 1730.0, 1750.0, 1770.0, 1790.0, 1810.0, 1830.0, 1850.0, 1870.0, 1890.0, 1910.0, 1930.0, 1950.0, 1970.0, 1990.0, 2010.0, 2030.0, 2050.0, 2070.0, 2090.0, 2110.0, 2130.0, 2150.0, 2170.0, 2190.0, 2210.0, 2230.0, 2250.0, 2270.0, 2290.0, 2310.0, 2330.0, 2350.0, 2370.0, 2390.0, 2410.0, 2430.0, 2450.0, 2470.0, 2490.0, 2510.0, 2530.0, 2550.0, 2570.0, 2590.0, 2610.0, 2630.0, 2650.0, 2670.0, 2690.0, 2710.0, 2730.0, 2750.0, 2770.0, 2790.0, 2810.0, 2830.0, 2850.0, 2870.0, 2890.0, 2910.0, 2930.0, 2950.0, 2970.0, 2990.0, 3010.0, 3030.0, 3050.0, 3070.0, 3090.0, 3110.0, 3130.0, 3150.0, 3170.0, 3190.0, 3210.0, 3230.0, 3250.0, 3270.0, 3290.0, 3310.0, 3330.0, 3350.0, 3370.0, 3390.0, 3410.0, 3430.0, 3450.0, 3470.0, 3490.0, 3510.0, 3530.0, 3550.0, 3570.0, 3590.0, 3610.0, 3630.0, 3650.0, 3670.0, 3690.0, 3710.0, 3730.0, 3750.0, 3770.0, 3790.0, 3810.0, 3830.0, 3850.0, 3870.0, 3890.0, 3910.0, 3930.0, 3950.0, 3970.0, 3990.0], θˡ = Float32[294.7621, 294.68277, 294.64972, 294.63773, 294.636, 294.63815, 294.64154, 294.64554, 294.64984, 294.6544, 294.65915, 294.66415, 294.6695, 294.67523, 294.68146, 294.68832, 294.69592, 294.70456, 294.71457, 294.72626, 294.74002, 294.75626, 294.7754, 294.79794, 294.82428, 294.8548, 294.8896, 294.92862, 294.97168, 295.01843, 295.0684, 295.12128, 295.17667, 295.23425, 295.2938, 295.35507, 295.41785, 295.48193, 295.54712, 295.61322, 295.68015, 295.74777, 295.81616, 295.8854, 295.9558, 296.02783, 296.1016, 296.17722, 296.25467, 296.33386, 296.4146, 296.49658, 296.5794, 296.66306, 296.7474, 296.83243, 296.91824, 297.005, 297.0925, 297.18057, 297.269, 297.35748, 297.44547, 297.53256, 297.6186, 297.70352, 297.7874, 297.87067, 297.95374, 298.0371, 298.1211, 298.20572, 298.29132, 298.37823, 298.46652, 298.55643, 298.6481, 298.7415, 298.83627, 298.93155, 299.02634, 299.1195, 299.20978, 299.29608, 299.37796, 299.4554, 299.5284, 299.59702, 299.6613, 299.72147, 299.77765, 299.82993, 299.87842, 299.9235, 299.9656, 300.00534, 300.04337, 300.0805, 300.1174, 300.1549, 300.19467, 300.2396, 300.2944, 300.36685, 300.46826, 300.61295, 300.81638, 301.09406, 301.45688, 301.90546, 302.42682, 302.99466, 303.57523, 304.13724, 304.65775, 305.12378, 305.53125, 305.88232, 306.1843, 306.44714, 306.68076, 306.8922, 307.08536, 307.26218, 307.42422, 307.57297, 307.7103, 307.8382, 307.95856, 308.0728, 308.18207, 308.28717, 308.3887, 308.48724, 308.58322, 308.67706, 308.7691, 308.85962, 308.94876, 309.03674, 309.12375, 309.20993, 309.29538, 309.38007, 309.46396, 309.54697, 309.62912, 309.71063, 309.79156, 309.87195, 309.9518, 310.03107, 310.10968, 310.1877, 310.26544, 310.34308, 310.42078, 310.49854, 310.57648, 310.6546, 310.73306, 310.81186, 310.8911, 310.971, 311.0516, 311.13293, 311.21494, 311.2976, 311.3809, 311.46402, 311.54517, 311.6202, 311.69058, 311.7665, 311.8535, 311.94614, 312.0383, 312.12793, 312.2156, 312.30252, 312.38913, 312.47556, 312.5619, 312.64816, 312.73438, 312.82047, 312.90634, 312.99222, 313.0782, 313.16415, 313.25006, 313.33585, 313.42136, 313.50644, 313.59088, 313.67468, 313.75815, 313.84152, 313.9263, 314.037], qᵗ = Float32[0.01382628, 0.013452609, 0.013253197, 0.013136476, 0.013077583, 0.013043724, 0.013021382, 0.013004671, 0.012990916, 0.01297861, 0.012966841, 0.012954968, 0.012942406, 0.012928695, 0.012913406, 0.012896033, 0.012875915, 0.012852301, 0.0128242625, 0.012790826, 0.012751072, 0.012704042, 0.01264885, 0.012584802, 0.012511493, 0.012429207, 0.012339044, 0.012242684, 0.012142374, 0.012040959, 0.011941293, 0.01184548, 0.01175472, 0.011669227, 0.011588547, 0.011512028, 0.011439177, 0.0113695515, 0.011302768, 0.011238553, 0.011176679, 0.011116587, 0.01105779, 0.0109999655, 0.010942474, 0.010884526, 0.0108257625, 0.010765907, 0.010704671, 0.010642075, 0.010578432, 0.010514062, 0.010449038, 0.010383274, 0.01031701, 0.010250417, 0.0101834955, 0.0101163415, 0.010049263, 0.009982788, 0.009917429, 0.009853481, 0.009791513, 0.009732211, 0.009676299, 0.009624269, 0.0095761595, 0.009531244, 0.009488363, 0.009446171, 0.009403533, 0.009359633, 0.009313672, 0.009264908, 0.009212734, 0.00915684, 0.009097397, 0.009035026, 0.008970767, 0.008906204, 0.008843, 0.008782669, 0.008726843, 0.008676729, 0.008632564, 0.008594076, 0.008561201, 0.008533863, 0.008511787, 0.008494331, 0.008480641, 0.00846972, 0.008460548, 0.008452076, 0.0084433295, 0.00843356, 0.00842211, 0.008408324, 0.008391638, 0.008371349, 0.0083460165, 0.0083133625, 0.008269685, 0.008208914, 0.00812173, 0.0079957675, 0.007817245, 0.007572816, 0.0072550364, 0.006867558, 0.0064267563, 0.005958857, 0.005495253, 0.005066332, 0.0046952707, 0.0043942924, 0.0041647987, 0.0040001194, 0.0038882878, 0.0038156114, 0.0037695125, 0.0037402508, 0.0037213278, 0.0037087582, 0.003700218, 0.003694216, 0.0036896917, 0.003685899, 0.003682321, 0.0036785905, 0.0036744499, 0.0036697173, 0.0036642859, 0.0036580805, 0.0036510502, 0.0036431497, 0.0036343418, 0.0036246132, 0.0036139784, 0.0036024677, 0.0035901165, 0.0035769676, 0.0035630683, 0.0035484738, 0.0035332441, 0.0035174317, 0.0035010665, 0.0034841658, 0.003466747, 0.0034488286, 0.0034304287, 0.0034115629, 0.0033922277, 0.003372383, 0.0033519724, 0.0033309592, 0.0033093484, 0.003287172, 0.0032644565, 0.0032412042, 0.003217411, 0.003193088, 0.003168253, 0.0031429257, 0.0031171432, 0.0030909618, 0.0030644361, 0.0030376285, 0.0030106613, 0.0029839019, 0.002958051, 0.0029343823, 0.002912003, 0.0028869638, 0.0028573468, 0.0028257866, 0.0027951933, 0.0027663417, 0.002738585, 0.0027113238, 0.0026843525, 0.002657605, 0.0026310282, 0.002604577, 0.0025782206, 0.002551935, 0.0025256989, 0.0024994912, 0.0024732905, 0.002447075, 0.0024208222, 0.0023945079, 0.0023681074, 0.0023416015, 0.0023150204, 0.0022884056, 0.002261795, 0.0022352245, 0.0022087223, 0.0021823796], qˡ = Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.3747955f-11, 2.685894f-10, 1.8286106f-9, 1.4066057f-8, 9.060854f-8, 4.2221183f-7, 1.2703174f-6, 2.714989f-6, 4.4587155f-6, 6.0799093f-6, 7.3238593f-6, 8.204142f-6, 8.812409f-6, 9.221825f-6, 9.50892f-6, 9.7188795f-6, 9.885721f-6, 1.0026913f-5, 1.0155987f-5, 1.02661925f-5, 1.0384623f-5, 1.0499385f-5, 1.0615169f-5, 1.0731273f-5, 1.0844711f-5, 1.0938681f-5, 1.1011219f-5, 1.1092686f-5, 1.1157542f-5, 1.1180596f-5, 1.1167819f-5, 1.1160994f-5, 1.1161262f-5, 1.1169122f-5, 1.1158408f-5, 1.1134325f-5, 1.1120559f-5, 1.1111717f-5, 1.1078316f-5, 1.1027046f-5, 1.0959665f-5, 1.0890889f-5, 1.0828526f-5, 1.078106f-5, 1.0730401f-5, 1.0642476f-5, 1.0528838f-5, 1.0423629f-5, 1.0305577f-5, 1.01753985f-5, 1.0040444f-5, 9.891402f-6, 9.720275f-6, 9.53519f-6, 9.3519375f-6, 9.168066f-6, 8.96452f-6, 8.739035f-6, 8.496835f-6, 8.25252f-6, 8.009351f-6, 7.770079f-6, 7.5225803f-6, 7.252235f-6, 6.9788925f-6, 6.7014194f-6, 6.426958f-6, 6.195791f-6, 6.006924f-6, 5.8460405f-6, 5.714679f-6, 5.608737f-6, 5.5384717f-6, 5.540467f-6, 5.6542985f-6, 5.884848f-6, 6.2176005f-6, 6.6879275f-6, 7.3663673f-6, 8.280325f-6, 9.37831f-6, 1.0608614f-5, 1.18881635f-5, 1.29912205f-5, 1.3655466f-5, 1.3782066f-5, 1.3250737f-5, 1.2025923f-5, 1.0200084f-5, 8.119508f-6, 6.14448f-6, 4.591999f-6, 3.492817f-6, 2.7405529f-6, 2.1367582f-6, 1.6566436f-6, 1.2406299f-6, 9.1080364f-7, 6.708012f-7, 4.9266686f-7, 3.5836052f-7, 2.543501f-7, 1.7125298f-7, 1.1968604f-7, 8.420403f-8, 6.013078f-8, 3.813317f-8, 1.9583004f-8, 7.321394f-9, 1.6494862f-9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], u = Float32[-6.8738647, -7.609103, -7.912455, -8.057842, -8.130227, -8.17173, -8.198446, -8.217706, -8.232945, -8.246003, -8.258052, -8.269812, -8.281729, -8.294232, -8.307619, -8.322153, -8.3381405, -8.355894, -8.375576, -8.397265, -8.42108, -8.447146, -8.475502, -8.506056, -8.538681, -8.573209, -8.609285, -8.646402, -8.683987, -8.7214365, -8.757935, -8.792561, -8.824607, -8.853792, -8.880062, -8.903411, -8.923893, -8.941725, -8.957144, -8.970406, -8.981664, -8.99084, -8.997812, -9.002552, -9.005214, -9.005988, -9.005084, -9.0024395, -8.997877, -8.991232, -8.982441, -8.971639, -8.958964, -8.944402, -8.928004, -8.909726, -8.889536, -8.867489, -8.84367, -8.818098, -8.790919, -8.76225, -8.732162, -8.700553, -8.667171, -8.631873, -8.594584, -8.555512, -8.515108, -8.473529, -8.430663, -8.386474, -8.340997, -8.294404, -8.247071, -8.19938, -8.151678, -8.104387, -8.058145, -8.013164, -7.969278, -7.9263, -7.883637, -7.8405275, -7.796957, -7.7532845, -7.7095685, -7.6656423, -7.6212683, -7.5764923, -7.5316267, -7.4870005, -7.4426427, -7.398932, -7.3561893, -7.3139534, -7.271704, -7.2292423, -7.1863065, -7.1426773, -7.098444, -7.05378, -7.0085397, -6.9625063, -6.9159527, -6.8701944, -6.8267894, -6.786769, -6.749608, -6.713614, -6.6768727, -6.6371512, -6.59244, -6.5414376, -6.4842496, -6.4219456, -6.355843, -6.287698, -6.2194734, -6.152916, -6.089278, -6.028922, -5.971578, -5.9168806, -5.8645797, -5.814504, -5.7666306, -5.721047, -5.677538, -5.6356387, -5.5948877, -5.5549374, -5.515576, -5.4767904, -5.438567, -5.400818, -5.363445, -5.3263907, -5.289684, -5.2533774, -5.2175465, -5.1821933, -5.147255, -5.1125746, -5.0780673, -5.0437603, -5.009733, -4.976046, -4.942585, -4.9092345, -4.875939, -4.8426805, -4.809447, -4.7761273, -4.742477, -4.708261, -4.673428, -4.6381464, -4.602811, -4.567694, -4.532751, -4.4978414, -4.462939, -4.4278984, -4.3923025, -4.3555064, -4.3164754, -4.273316, -4.2238026, -4.168506, -4.116016, -4.087668, -4.0923643, -4.1021156, -4.0899305, -4.0459676, -3.984812, -3.9246304, -3.8724108, -3.8263137, -3.7825165, -3.7390966, -3.6956327, -3.6520388, -3.6082125, -3.5640757, -3.5195956, -3.474761, -3.4295661, -3.384009, -3.3380926, -3.2918231, -3.2451477, -3.197866, -3.1499357, -3.1014051, -3.0523324, -3.0027328, -2.952414, -2.9024477], e = Float32[0.4639449, 0.469286, 0.41483182, 0.3613211, 0.31908765, 0.28752327, 0.26430503, 0.24745236, 0.2353515, 0.2268195, 0.22100374, 0.21724707, 0.21510933, 0.2141484, 0.21397607, 0.2143138, 0.21494812, 0.2155775, 0.21579124, 0.215343, 0.2140886, 0.21181239, 0.20833431, 0.20360571, 0.1975889, 0.19038075, 0.18235086, 0.17404312, 0.16591842, 0.15839544, 0.15184432, 0.14634097, 0.14175253, 0.13800894, 0.13504703, 0.13273026, 0.13087699, 0.12928389, 0.12788343, 0.12667072, 0.12560043, 0.12454946, 0.12342733, 0.12220508, 0.12092694, 0.11973829, 0.11866901, 0.11768243, 0.11680447, 0.116082326, 0.115497075, 0.11495976, 0.114372194, 0.113734856, 0.11305257, 0.11232769, 0.11156038, 0.11072683, 0.10980804, 0.10889585, 0.10814739, 0.10757968, 0.107098244, 0.10663653, 0.10633041, 0.106105186, 0.105785504, 0.10528702, 0.104638025, 0.10394787, 0.103425115, 0.10304939, 0.102583244, 0.10193329, 0.10111665, 0.100214235, 0.099230036, 0.09819855, 0.097162046, 0.09611983, 0.09508304, 0.094062135, 0.09302611, 0.09191174, 0.090631574, 0.08922945, 0.087836385, 0.0865604, 0.08543785, 0.08453201, 0.08385478, 0.08335817, 0.08300747, 0.08282708, 0.08283046, 0.08304069, 0.08362721, 0.0848616, 0.086809054, 0.08938144, 0.09256364, 0.09647529, 0.10106688, 0.106216714, 0.111612275, 0.11686557, 0.12120528, 0.12392799, 0.1246648, 0.12334678, 0.12032558, 0.11569132, 0.10988828, 0.10348702, 0.09672241, 0.08971855, 0.0830482, 0.076980956, 0.07148459, 0.06655921, 0.061987344, 0.05754796, 0.05327558, 0.049286928, 0.045645427, 0.042340226, 0.039339326, 0.036636297, 0.034242544, 0.03215836, 0.030349912, 0.028762199, 0.027354533, 0.026071677, 0.024865206, 0.023724023, 0.02268503, 0.02177116, 0.020961028, 0.02020877, 0.01948118, 0.018774947, 0.018112665, 0.017510029, 0.01696899, 0.016481483, 0.016020115, 0.015566674, 0.015120685, 0.014702672, 0.0143341515, 0.014008907, 0.013717649, 0.013465925, 0.013254685, 0.01308485, 0.012942009, 0.012806145, 0.012669009, 0.012536065, 0.012414866, 0.012301254, 0.012178647, 0.012054881, 0.011965717, 0.011985305, 0.012195375, 0.012659747, 0.013436815, 0.014587919, 0.016020503, 0.014322585, 0.009497274, 0.005525705, 0.0030389628, 0.0016730353, 0.0009543601, 0.0005699237, 0.00035670173, 0.00023324782, 0.00015866676, 0.00011177857, 8.121026f-5, 6.062561f-5, 4.63626f-5, 3.6229383f-5, 2.887102f-5, 2.342503f-5, 1.9327985f-5, 1.6202837f-5, 1.3791947f-5, 1.1915957f-5, 1.04480005f-5, 9.29718f-6, 8.397621f-6, 7.701456f-6, 7.173854f-6, 6.789774f-6, 6.531738f-6, 6.388417f-6], w′qᵗ′ = Float32[2.481476f-5, 4.9627855f-5, 4.952348f-5, 4.9395283f-5, 4.9261434f-5, 4.910724f-5, 4.8922986f-5, 4.8718066f-5, 4.849264f-5, 4.824766f-5, 4.8000053f-5, 4.7771206f-5, 4.7567348f-5, 4.738653f-5, 4.7226033f-5, 4.707716f-5, 4.6926303f-5, 4.6764755f-5, 4.6586545f-5, 4.638043f-5, 4.6150984f-5, 4.5925804f-5, 4.5735287f-5, 4.559879f-5, 4.5517714f-5, 4.546986f-5, 4.540535f-5, 4.5290326f-5, 4.513939f-5, 4.5001696f-5, 4.4916793f-5, 4.488277f-5, 4.486885f-5, 4.4831093f-5, 4.4718818f-5, 4.4540982f-5, 4.4323257f-5, 4.4087574f-5, 4.387085f-5, 4.366478f-5, 4.3423257f-5, 4.314404f-5, 4.2857715f-5, 4.258696f-5, 4.2326003f-5, 4.2043663f-5, 4.1715964f-5, 4.133734f-5, 4.0913586f-5, 4.045675f-5, 3.997186f-5, 3.9457223f-5, 3.8918897f-5, 3.836115f-5, 3.7792448f-5, 3.7211383f-5, 3.6614867f-5, 3.59975f-5, 3.5350167f-5, 3.468607f-5, 3.4041816f-5, 3.3418273f-5, 3.2789285f-5, 3.2164247f-5, 3.1558404f-5, 3.0984495f-5, 3.0446252f-5, 2.9908195f-5, 2.9350906f-5, 2.879725f-5, 2.824055f-5, 2.7662603f-5, 2.7081585f-5, 2.6545202f-5, 2.607427f-5, 2.561551f-5, 2.508528f-5, 2.4436173f-5, 2.3683275f-5, 2.2861848f-5, 2.202483f-5, 2.1245725f-5, 2.054369f-5, 1.9872401f-5, 1.9195586f-5, 1.8535648f-5, 1.7917388f-5, 1.7340313f-5, 1.6820644f-5, 1.6374133f-5, 1.5993734f-5, 1.5682297f-5, 1.5422194f-5, 1.5180564f-5, 1.4978577f-5, 1.4853086f-5, 1.4799578f-5, 1.4765722f-5, 1.4700513f-5, 1.45746835f-5, 1.4384604f-5, 1.4165168f-5, 1.39364465f-5, 1.3664745f-5, 1.3260116f-5, 1.2684562f-5, 1.1998301f-5, 1.123025f-5, 1.0330652f-5, 9.227331f-6, 7.897985f-6, 6.4268847f-6, 4.95977f-6, 3.5524793f-6, 2.2268944f-6, 1.1459405f-6, 4.132616f-7, -4.265281f-8, -3.127623f-7, -4.824193f-7, -5.904622f-7, -6.190939f-7, -5.6899273f-7, -4.5723135f-7, -3.189127f-7, -2.0540291f-7, -1.2728715f-7, -7.0450064f-8, -2.709981f-8, 1.9252582f-9, 7.976598f-9, 5.0261706f-9, 6.9687585f-9, 9.0679f-9, 9.305418f-9, 7.929891f-9, 6.1844307f-9, 5.0754907f-9, 4.729882f-9, 4.9986393f-9, 5.76903f-9, 6.716584f-9, 7.530257f-9, 8.210382f-9, 8.775682f-9, 8.99932f-9, 8.962533f-9, 9.511072f-9, 1.1589447f-8, 1.5202033f-8, 1.885856f-8, 2.0197199f-8, 1.8376037f-8, 1.5563494f-8, 1.47069805f-8, 1.6612526f-8, 1.9968859f-8, 2.275094f-8, 2.3381276f-8, 2.160681f-8, 1.8097431f-8, 1.3411827f-8, 7.96543f-9, 2.5523044f-9, -1.5000633f-9, -3.0106322f-9, -2.3150366f-9, -1.028118f-9, 5.2921406f-10, 4.3320085f-9, 1.3123475f-8, 2.5973243f-8, 3.537907f-8, 3.4255535f-8, 2.4580059f-8, 1.3941789f-8, 6.97831f-9, 3.615692f-9, 2.0769761f-9, 1.2482648f-9, 7.629594f-10, 4.824601f-10, 3.165153f-10, 2.1321044f-10, 1.4646713f-10, 1.02290745f-10, 7.245122f-11, 5.1847783f-11, 3.7350848f-11, 2.6987138f-11, 1.9409105f-11, 1.3561742f-11, 9.804506f-12, 7.1911322f-12, 4.6674335f-12, 2.9158865f-12, 1.5065582f-12, -4.7432926f-12, 5.745384f-11, 6.273353f-11], P = Float32[0.0001706271, 0.00089954626, 0.00050109107, 0.0002578599, 0.00013307217, 7.628171f-5, 4.8307218f-5, 3.381691f-5, 2.5914027f-5, 2.1748272f-5, 1.986027f-5, 1.9265059f-5, 1.9571811f-5, 2.0676403f-5, 2.2396192f-5, 2.4632096f-5, 2.7383021f-5, 3.0423636f-5, 3.3445263f-5, 3.6420635f-5, 3.9376406f-5, 4.212725f-5, 4.447814f-5, 4.6372068f-5, 4.7728492f-5, 4.8351278f-5, 4.8050788f-5, 4.6759647f-5, 4.4577344f-5, 4.168648f-5, 3.8152884f-5, 3.3985998f-5, 2.9467708f-5, 2.4962414f-5, 2.069287f-5, 1.676629f-5, 1.3206577f-5, 1.004503f-5, 7.366006f-6, 5.146312f-6, 3.1436568f-6, 1.1247862f-6, -8.514342f-7, -2.5752286f-6, -4.0279615f-6, -5.334075f-6, -6.6155167f-6, -7.90794f-6, -9.126993f-6, -1.0151125f-5, -1.0898405f-5, -1.1388222f-5, -1.1717739f-5, -1.1970791f-5, -1.2241998f-5, -1.25887545f-5, -1.2872758f-5, -1.3000787f-5, -1.29330465f-5, -1.2586595f-5, -1.1969507f-5, -1.12273865f-5, -1.0540929f-5, -9.970814f-6, -9.375791f-6, -8.693748f-6, -7.969126f-6, -7.137103f-6, -6.1357673f-6, -5.042893f-6, -3.8903017f-6, -2.7434467f-6, -1.6487807f-6, -6.7520097f-7, -1.421028f-8, 3.8603065f-7, 6.7935696f-7, 8.6201567f-7, 9.869278f-7, 1.1114726f-6, 1.3300839f-6, 1.7426372f-6, 2.4115682f-6, 3.2132552f-6, 3.87492f-6, 4.3747805f-6, 4.8811753f-6, 5.3570584f-6, 5.660908f-6, 5.8298715f-6, 5.9335553f-6, 6.02052f-6, 6.060736f-6, 5.913188f-6, 5.519823f-6, 5.0019235f-6, 4.537498f-6, 4.317143f-6, 4.231593f-6, 4.1284843f-6, 4.01623f-6, 3.923786f-6, 3.7533491f-6, 3.1763968f-6, 2.1247492f-6, 1.122545f-6, 8.020198f-7, 8.754372f-7, 9.320004f-7, 9.683021f-7, 1.0086325f-6, 1.2422349f-6, 1.7821352f-6, 2.3921243f-6, 2.7128592f-6, 2.5436696f-6, 1.8658645f-6, 9.1922516f-7, -9.2154785f-8, -9.738407f-7, -1.5426629f-6, -1.7812281f-6, -1.7753014f-6, -1.7039162f-6, -1.6614878f-6, -1.5592883f-6, -1.3835819f-6, -1.2471794f-6, -1.1912709f-6, -1.1614119f-6, -1.1377865f-6, -1.0934435f-6, -9.842464f-7, -7.811906f-7, -5.710109f-7, -4.65078f-7, -4.5087793f-7, -4.91094f-7, -5.4520666f-7, -5.6865514f-7, -5.5992314f-7, -5.54467f-7, -5.460719f-7, -5.096852f-7, -4.5699903f-7, -4.0953947f-7, -3.672165f-7, -3.317052f-7, -2.961496f-7, -2.4576119f-7, -1.7647656f-7, -1.19102154f-7, -1.1993174f-7, -1.8407785f-7, -2.53508f-7, -2.899224f-7, -2.8892893f-7, -2.426348f-7, -1.6490479f-7, -9.033925f-8, -3.348768f-8, 1.2315886f-8, 4.277745f-8, 5.470135f-8, 4.9307257f-8, 2.9155917f-8, -1.6500447f-8, -1.15908705f-7, -3.0621592f-7, -5.907977f-7, -8.1848185f-7, -4.1884655f-7, -3.732559f-9, 2.5251478f-7, 3.6475015f-7, 3.0233593f-7, 1.6918084f-7, 7.699896f-8, 3.4399772f-8, 1.7085004f-8, 9.528774f-9, 5.6814713f-9, 3.5108205f-9, 2.2293891f-9, 1.4488123f-9, 9.586361f-10, 6.426559f-10, 4.3467333f-10, 2.9543873f-10, 2.009171f-10, 1.3603628f-10, 9.125382f-11, 6.0481675f-11, 3.9259332f-11, 2.4502516f-11, 1.4371764f-11, 7.638543f-12, 3.4469359f-12, 1.1291245f-12, 3.9237592f-14], B = Float32[0.000108121574, 0.00037936354, 0.0005337978, 0.00058206334, 0.00057704124, 0.0005541283, 0.00052547216, 0.000494183, 0.00046179025, 0.00042891438, 0.0003962652, 0.00036409523, 0.00033230757, 0.00030099074, 0.00027015764, 0.00023992502, 0.00021028236, 0.00018093816, 0.00015166619, 0.00012250149, 9.3642215f-5, 6.5162596f-5, 3.700117f-5, 9.011543f-6, -1.8342878f-5, -4.2200158f-5, -5.3424807f-5, -4.1044343f-5, -4.2128186f-6, 4.471336f-5, 9.2041715f-5, 0.00013228165, 0.00016500513, 0.0001909327, 0.00021123233, 0.0002279412, 0.00024183572, 0.00025365886, 0.00026383038, 0.0002728292, 0.00028017073, 0.00028648024, 0.00029246023, 0.00029895268, 0.00030481428, 0.00030922325, 0.00031124664, 0.00031102198, 0.00030956315, 0.00030720484, 0.00030343927, 0.00029832963, 0.00029254632, 0.0002872474, 0.00028295, 0.0002788741, 0.00027580213, 0.00027318439, 0.0002706414, 0.00026813542, 0.00026500737, 0.0002606662, 0.00025642393, 0.00025313476, 0.0002505597, 0.00024829968, 0.0002448899, 0.00024024596, 0.0002351797, 0.00023053773, 0.00022638481, 0.00022196765, 0.00021631357, 0.00020945736, 0.00020220781, 0.00019448357, 0.00018694035, 0.00018069903, 0.00017580851, 0.0001714538, 0.00016720784, 0.00016203296, 0.00015592133, 0.00014956559, 0.00014287197, 0.00013594147, 0.00012882079, 0.00012325657, 0.00012025256, 0.000118479205, 0.00011693165, 0.00011607105, 0.00011627254, 0.00011850272, 0.00012301955, 0.00012923288, 0.00013569754, 0.00014198694, 0.0001471739, 0.0001512418, 0.00015376876, 0.00015529824, 0.00015487269, 0.00015067653, 0.00014255597, 0.00013171777, 0.00012019741, 0.00010714012, 9.116905f-5, 7.782871f-5, 7.1565926f-5, 7.04133f-5, 7.135336f-5, 7.3802265f-5, 7.8623554f-5, 8.187281f-5, 7.732475f-5, 6.719368f-5, 5.5940844f-5, 4.8212733f-5, 4.2302087f-5, 3.6611535f-5, 3.0789342f-5, 2.5178271f-5, 1.9373934f-5, 1.4113225f-5, 1.0310771f-5, 7.130622f-6, 4.394656f-6, 2.0642062f-6, 1.6988673f-7, -1.0078805f-6, -2.0177706f-6, -2.3964083f-6, -2.0473726f-6, -1.3120018f-6, -6.5460335f-7, -2.552568f-7, -3.8176644f-8, 2.1108557f-8, -9.31987f-8, -2.7236678f-7, -3.974677f-7, -4.6311777f-7, -5.0088096f-7, -4.9614056f-7, -4.5483793f-7, -5.0354834f-7, -7.7853275f-7, -1.2693741f-6, -1.7576375f-6, -1.9180943f-6, -1.640201f-6, -1.2413873f-6, -1.1088576f-6, -1.305701f-6, -1.6587285f-6, -1.9429228f-6, -1.9859935f-6, -1.7775667f-6, -1.4053471f-6, -9.339297f-7, -4.1844535f-7, 7.8309604f-8, 4.4676744f-7, 5.693002f-7, 4.7752053f-7, 3.4689214f-7, 2.675952f-7, 3.7789555f-8, -3.7029076f-7, -2.2196066f-6, -3.2930739f-6, -2.9563605f-6, -2.0111595f-6, -1.1420321f-6, -6.102296f-7, -3.320042f-7, -1.895817f-7, -1.13521956f-7, -7.059009f-8, -4.5349463f-8, -2.9964422f-8, -2.027062f-8, -1.3981083f-8, -9.780881f-9, -6.931678f-9, -4.9713242f-9, -3.5850125f-9, -2.5869917f-9, -1.8605566f-9, -1.3265599f-9, -9.313607f-10, -6.37634f-10, -4.2054318f-10, -2.6327435f-10, -1.5157602f-10, -7.356634f-11, -3.0468465f-11, -3.7238576f-12], cloud_fraction = 0.20433672f0, surface_temperature = 297.50833f0))Each figure shows the state — liquid-water potential temperature, total water, cloud liquid. Solid lines are the dry static stability, dashed the moist; blue is Nakanishi–Niino, red Rational; black is the LES.
function detail_figure(name, columns, les) fig = Figure(size = (1200, 400)) grid = columns.NN09.simulation.model.grid zc = znodes(grid, Center()) ax_θ = Axis(fig[1, 1]; xlabel = "θˡ (K)", ylabel = "z (m)", title = string(name)) ax_q = Axis(fig[1, 2]; xlabel = "qᵗ (g kg⁻¹)") ax_l = Axis(fig[1, 3]; xlabel = "qˡ (g kg⁻¹)") ztop = 1.6 * max(les.z[argmax(diff(les.θˡ))], 800) for ax in (ax_θ, ax_q, ax_l) ylims!(ax, 0, ztop) end for ax in (ax_q, ax_l) hideydecorations!(ax, grid = false) end # Axes scaled to the LES below the top of the plot below = les.z .≤ ztop xlims!(ax_θ, minimum(les.θˡ[below]) - 1, maximum(les.θˡ[below]) + 1) les_kw = (color = :black, linewidth = 3.5) lines!(ax_θ, les.θˡ, les.z; les_kw..., label = "LES") lines!(ax_q, 1e3 .* les.qᵗ, les.z; les_kw...) lines!(ax_l, 1e3 .* les.qˡ, les.z; les_kw...) for (set, column) in pairs(columns) m = column.means color = configuration_colors[set] linestyle = configuration_linestyles[set] lines!(ax_θ, m.θˡ, zc; color, linestyle, label = configuration_labels[set]) lines!(ax_q, 1e3 .* m.qᵗ, zc; color, linestyle) lines!(ax_l, 1e3 .* m.qˡ, zc; color, linestyle) end axislegend(ax_θ, position = :lt, framevisible = false) return figendfig = detail_figure(:stratocumulus, detail_columns.stratocumulus, detail_les.stratocumulus)figWith the dry static stability, both coefficient sets stop the boundary layer four hundred meters short of the LES inversion. The cloud layer of a stratocumulus deck is stably stratified in $θᵨ$ — condensation warms it toward the moist adiabat — so the penetration depth shuts the mixing off just where the LES's turbulence is strongest, at cloud top, where radiative cooling drives it. The closure carries no turbulent kinetic energy there, the layer never reaches the inversion, and the moisture it cannot lift condenses into a fog through the lower layer that the LES does not have. The total-water flux shows the mechanism: through that fog it alternates between adjacent levels, a grid-scale staircase that a closure builds wherever it diffuses $θˡ$ and $qᵗ$ down their gradients but reads a dry $N²$ that the diffusion itself makes stable. With the moist static stability the saturated layer is nearly neutral to the displacements the closure represents, and the fluxes are smooth. With the Nakanishi–Niino constants the layer deepens to the LES inversion and keeps a cloud at its top — twice the LES's liquid water, with the turbulent kinetic energy peaking in the middle of the layer rather than at cloud top, where the LES's radiative cooling puts it. Compare the rational configuration against these profiles in the figure below.
fig = detail_figure(:cumulus, detail_columns.cumulus, detail_les.cumulus)figThe trade-cumulus column shows what a local closure with all-or-nothing condensation does to a cumulus layer. With the dry static stability the layer is capped at 1.2–1.3 km, a kilometer below the LES's cloud tops; moisture piles up beneath the cap until the whole layer saturates into a stratocumulus with three grams per kilogram of liquid that the LES does not have, and the fluxes in it carry the grid-scale staircase. With the moist static stability the saturated layer is near-neutral and the closure mixes it to the trade inversion, where the LES's cloud tops are — but it mixes it as a stratocumulus should be mixed: $θˡ$ and $qᵗ$ are uniform where the LES keeps a stratified, conditionally unstable cumulus layer, a cloud deck with a gram per kilogram of liquid sits under the inversion where the LES has a few hundredths from scattered cumulus, and the turbulent kinetic energy is two to three times the LES's. The mean state is smooth and the fluxes are steady; the error is that once the grid mean saturates, a layer that is 7 % cloudy in the LES is 100 % cloudy in the column, and every subsequent step follows from that. A subgrid condensation scheme — a cloud fraction from the variance of the saturation deficit — is what the closures that do well in cumulus pair with a TKE equation, and it is not part of this closure. The coefficient sets are a second-order distinction in both columns.
The ensemble
Every member of the amip climate — 21 sites and four months, 83 columns — is run with the four configurations, and each is scored by the root-mean-square error of its time-mean $θˡ$ and $qᵗ$ below 3 km against its LES. The sites are laid out as in Shen et al. (2022): 2–4 lie off Peru, 11–15 in the deep tropics near the ITCZ, 17–18 under the California stratocumulus, and 19–23 across the northeast Pacific trades. Site 16 is not in the library and site 15 has no January member.
sites = [2:15; 17:23]months = ["01", "04", "07", "10"]errors = Dict(name => (θˡ = fill(NaN, length(sites), length(months)), qᵗ = fill(NaN, length(sites), length(months))) for name in keys(configurations))for (i, site) in enumerate(sites), (j, month) in enumerate(months) path = member(site, month) isfile(path) || continue les = les_means(path) for (name, closure) in pairs(configurations) simulation, averages = les_driven_column(path; closure) run!(simulation) means = time_means(averages) z = znodes(simulation.model.grid, Center()) errors[name].θˡ[i, j] = rmse(means.θˡ, les.θˡ, z) errors[name].qᵗ[i, j] = 1e3 * rmse(means.qᵗ, les.qᵗ, z) endendThe heatmaps put the sites along the transect on the horizontal axis and the months on the vertical, one panel per configuration, with a common color scale for each variable so that the panels can be read against each other.
function error_heatmaps(variable, label) fig = Figure(size = (1300, 620)) layout = (NN09 = (1, 1), Rational = (1, 2), NN09_moist = (2, 1), Rational_moist = (2, 2)) colorrange = (0, maximum(filter(isfinite, vcat((vec(errors[name][variable]) for name in keys(configurations))...)))) month_names = ["January", "April", "July", "October"] for (name, (row, col)) in pairs(layout) ax = Axis(fig[row, col]; title = configuration_labels[name], xticks = (1:length(sites), string.(sites)), yticks = (1:length(months), month_names), xlabel = row == 2 ? "cfSite" : "") heatmap!(ax, 1:length(sites), 1:length(months), errors[name][variable]; colormap = :viridis, colorrange) row == 2 || hidexdecorations!(ax, grid = false) col == 1 || hideydecorations!(ax, grid = false) end Colorbar(fig[:, 3]; colormap = :viridis, colorrange, label) return figendfig = error_heatmaps(:θˡ, "RMSE of θˡ below 3 km (K)")figAnd the same for total water:
fig = error_heatmaps(:qᵗ, "RMSE of qᵗ below 3 km (g kg⁻¹)")figThe ensemble plots compare how static stability and stability functions affect each regime. The median errors summarize the four configurations:
for (name, closure) in pairs(configurations) θ_error = median(filter(isfinite, errors[name].θˡ)) q_error = median(filter(isfinite, errors[name].qᵗ)) println(rpad(configuration_labels[name], 28), " median RMSE: θˡ ", round(θ_error, digits = 2), " K, qᵗ ", round(q_error, digits = 2), " g kg⁻¹")endNakanishi–Niino, dry N² median RMSE: θˡ 2.46 K, qᵗ 3.63 g kg⁻¹
Rational, dry N² median RMSE: θˡ 1.55 K, qᵗ 1.9 g kg⁻¹
Nakanishi–Niino, moist N² median RMSE: θˡ 1.37 K, qᵗ 1.31 g kg⁻¹
Rational, moist N² median RMSE: θˡ 1.02 K, qᵗ 0.96 g kg⁻¹
Julia version and environment information
This example was executed with the following version of Julia:
using InteractiveUtils: versioninfoversioninfo()Julia Version 1.13.2
Commit 45b6d15e34b (2026-10-14 20:33 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 8 × AMD EPYC 7R13 Processor
WORD_SIZE: 64
LLVM: libLLVM-20.1.8 (ORCJIT, znver3)
GC: Built with stock GC
Threads: 1 default, 1 interactive, 5 GC (on 8 virtual cores)
Environment:
JULIA_NUM_GC_THREADS = 4,1
JULIA_GPG = 64B779A570972FFF7BFC2B54EAD471E1A1F2C10A
JULIA_LOAD_PATH = :@breeze
JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
JULIA_VERSION = 1.13.2
JULIA_DEPOT_PATH = /usr/local/share/julia:
JULIA_PATH = /usr/local/julia
JULIA_PROJECT = @breeze
These were the top-level packages installed in the environment:
import PkgPkg.status()Status `/__w/Breeze.jl/Breeze.jl/docs/Project.toml`
⌃ [86bc3604] AtmosphericProfilesLibrary v0.1.8
[660aa2fb] Breeze v0.15.1 `.`
⌃ [052768ef] CUDA v6.4.1
[13f3f980] CairoMakie v0.15.17
[6a9e3e04] CloudMicrophysics v0.49.1
[e30172f5] Documenter v1.20.0
[daee34ce] DocumenterCitations v1.5.0
[b6400b83] DocumenterCodeBlocks v1.5.1
[1c52b33b] DocumenterLandingPage v0.2.2
[7da242da] Enzyme v0.13.219
⌅ [46192b85] GPUArraysCore v0.2.1
⌅ [63c18a36] KernelAbstractions v0.9.47
[98b081ad] Literate v2.21.1
[85f8d34a] NCDatasets v0.14.15
[cd8119b0] NumericalRadiation v0.2.1
[9e8cae18] Oceananigans v0.118.1
[a01a1ee8] RRTMGP v1.1.1
[3c362404] Reactant v0.2.308
[276daf66] SpecialFunctions v2.9.2
[10745b16] Statistics v1.11.5
[b77e0a4c] InteractiveUtils v1.11.0
[44cfe95a] Pkg v1.13.0
[9a3f8284] Random v1.11.0
Info Packages marked with ⌃ and ⌅ have new versions available. Those with ⌃ may be upgradable, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated`
This page was generated using Literate.jl.