Case API
Constructors return a configured case without advancing it. A caller can inspect or modify the simulation, attach additional diagnostics, and then call run!.
BreezeLab.eastern_north_atlantic — Function
eastern_north_atlantic(; arch=GPU(), FT=Float32, microphysics=:p3_n75,
Nx=256, Ny=256, stop_time=6hours,
data_dir, output_dir, kwargs...)Build the public Covert ENA development case for 18 July 2017, starting at 06 UTC. Return a named tuple containing simulation, model, config, and input metadata, without advancing the simulation. Call run!(case.simulation) to run it.
Defaults use 35 m horizontal spacing, 192 reconstructed vertical levels, prescribed surface fluxes, simple longwave radiation, no mean-wind nudging, and a fixed 0.5 s step. Choose :one_moment, :p3_n75, :p3_covert_n75 (prognostic aerosol activating the case's observed 75 cm⁻³) or :p3_aer2 (LASSO aer2 aerosol sensitivity); the aerosol members use diagnostic CCN replenishment. Extra keywords are passed to ena_simulation.
Inputs default to data/covert2022_bin in the package checkout; fetch them with julia data_wrangling/fetch_covert_inputs.jl. Outputs default to output/ena_<microphysics> in the working directory. Input acquisition and provenance writing are explicit caller actions.
This is the public development configuration, not the larger published experiment or official LASSO. Use ena_simulation with protocol=:lasso_ena_official and an official input bundle for LASSO.
BreezeLab.ena_simulation — Function
ena_simulation(data_dir; protocol, dimensions=nothing, kwargs...)Build an ENA experiment with an explicit protocol (:covert_public_bin or :lasso_ena_official). Overrides create a labelled sensitivity experiment and are recorded separately from the protocol defaults. For LASSO, supply the run ID member, epoch::DateTime (UTC; the year is never inferred from the day of year) and, when the namelist carries no dimensions, dimensions=(Nx, Ny, Nz); the bundle is validated by validate_lasso_bundle and its record is kept under case.bundle for provenance. This is a Breeze implementation of the forcing protocol, not a claim of SAM equivalence.
BreezeLab.ena_protocol_settings — Function
ena_protocol_settings(data_dir; protocol, dimensions=nothing, member=nothing, epoch=nothing)Read and validate protocol inputs without allocating a model. Return namelist-derived defaults. If a LASSO bundle omits dimensions from its namelist, supply dimensions=(Nx, Ny, Nz) from the original domain configuration; member (the run ID) and epoch (UTC) are checked against it (see inspect_lasso_bundle). Neither path is a numerically validated reproduction of the original SAM runs.
:covert_public_bin— the runnable development benchmark from the public files of the Covert et al. (2022) bin-paper repository:caseid = 256x256x192atdx = dy = 35 m(8.96 km),day0 = 199.25(18 July 2017 06 UTC),nstop × dt = 6 h, prescribed H/LE/τ (SFC_FLX_FXD,SFC_TAU_FXD), SAMrad_simplelongwave only, no wind nudging,doupperbound,dodamping. Not the 864²×192, 30.24-km, 06-15 UTC configuration of the published paper, and not an official LASSO-ENA reproduction.:lasso_ena_official— the official protocol from asaminbundle directory (snd,lsf,sfc,prm,grd): grid fromgrdand the namelist, bulk fluxes from SST, RRTMGP LW+SW with SAM's 0.95 surface emissivity and 14 μm ocean effective radius,taulswind nudging (n0), P3 with the member's aerosol setting and the SBMdiagCCNaerosol-reservoir projection,nrad × dtradiation cadence, fixeddt, durationnstop × dt, and the namelist'sperturb_type. Unsupported namelist settings (T/q nudging, delayed forcing, restarts, …) are rejected with the reason.
BreezeLab.ena_lasso — Function
ena_lasso(bundle_dir=lasso_bundle_directory(member); member=DEFAULT_LASSO_MEMBER, epoch,
dimensions=:documented, arch=nothing, FT=Float32, output_dir, output_prefix="ena_lasso", kwargs...)Build the official LASSO-ENA member member from its staged samin bundle without running it. Returns the ena_simulation case extended with staging (the bundle.toml written by data_wrangling/stage_lasso_bundle.jl, or a note when absent) so that write_provenance records the archive checksum, DOI and download date next to the input-file checksums.
epoch::DateTimeis the UTC start; it must agree with the namelistday0and the member date (checked).dimensions = :documenteduseslasso_documented_dimensionsfor the member's domain token (recorded in provenance as such); pass a tuple to be fully explicit, ornothingwhen the namelist carriesnx_gl/ny_gl/nz_gl.- A missing bundle raises an
ArgumentErrorwithlasso_bundle_missing_message, before the architecture is touched (arch = nothingbecomesGPU()only afterwards, so the staging message also appears on machines without a GPU).
Everything else (Nx, Ny, z_faces, microphysics, stop_time, …) is an explicit, provenance-recorded override of the protocol defaults, exactly as in ena_simulation.
BreezeLab.inspect_lasso_bundle — Function
inspect_lasso_bundle(directory; member=nothing, dimensions=nothing, epoch=nothing)Read a LASSO-ENA samin bundle (snd, lsf, sfc, prm, grd in directory) and return a record describing what it contains, what the Breeze adapter will use, and every setting the adapter cannot represent. Nothing is substituted or inferred:
member(run ID orLassoMember) fixes the member identity; it is required byena_lassoand recorded in provenance. The aerosol setting and the SAM microphysics come from it (the namelist does not carry them: the HUJI-SBM spectrum is compiled in).dimensions = (Nx, Ny, Nz)is required when the namelist carries neithernx_gl/ny_gl/nz_glnor a numericNxxNyxNzcase ID (SAM fixes them at compile time indomain.f90).epoch::DateTime(UTC) is checked againstday0and the member date when given; SAM'sday0never identifies the year.
The returned named tuple has problems (fatal, each an actionable sentence), warnings (deliberate, recorded differences), settings (keyword defaults for build_case), namelist, groups, grid, time, switches, checksums and member. Use validate_lasso_bundle to turn problems into an error.
BreezeLab.validate_lasso_bundle — Function
validate_lasso_bundle(directory; kwargs...)inspect_lasso_bundle and throw an ArgumentError listing every unsupported or missing setting when the bundle cannot be reproduced. Returns the inspection record.
BreezeLab.parse_lasso_member — Function
parse_lasso_member(id)Parse a LASSO-ENA run ID into a LassoMember. The ID is never guessed: an ID that does not follow the listing's pattern is an error.
BreezeLab.sea_starr — Function
sea_starr(; member=:CTRL, arch=GPU(), FT=Float32, data_dir, kwargs...)Build the SEA STARR experiment member from its DEPHY driver and return (; simulation, model, grid, driver, config, inputs, ...) without advancing it.
Keyword arguments (protocol defaults):
data_dir: directory holding the threeSEA_STARR_*_SCM_driver.ncfiles (defaultdata/seastarr_22241697in the package; stage them withjulia data_wrangling/fetch_manifest.jl cases/seastarr/inputs.toml data/seastarr_22241697)Nx = 192, Ny = 192,Δx = Δy = 50,z_faces = sea_starr_vertical_faces()(Nz = 288)stop_time = 66hours,Δt = 1,max_Δt = 1(fixed 1 s step unless the CFL wizard must shorten it),cfl = 0.7initialization = :equilibrium: partition (θₗ, qₜ) into (T, qᵛ, qᶜˡ) with Breeze's warm-phase saturation adjustment and activate the fractioninitial_activated_fraction(default 1) of the aerosol in cloudy cells;:condensate_freestarts from the supersaturated vapor and lets P3 condenseaerosol_surface_flux = 7e5m⁻² s⁻¹ (70 cm⁻² s⁻¹);regeneration = truemean_diameter = 185e-9,geometric_std = 1.5,kappa = 0.2radiation = :rrtmgp(all-sky LW+SW,radiation_interval = 60s) ornothing;ozone = :driverliquid_effective_radius = 10e-6,surface_albedo = 0.07,surface_emissivity = 0.98nudging = true,nudging_offset = 100,nudging_ramp = 200,inversion_search_top = 4000mvertical_advection = :full_fieldornothing;geostrophic = true;surface = :bulk_sstornothingsponge = SAMSponge(damping_depth_fraction=0.15): numerical damping of the top 15 % (not in the protocol)closure = :smagorinsky_lilly,advection_order = 5,perturbation = InitialPerturbation()- output:
output_dir,output_prefix,statistics_interval = 15minutes,timeseries_interval = 60,fields_2d_interval = 15minutes,fields_3d_interval = 1hour,checkpoint_interval = 3hours(ornothing),write_output = true,progress_interval = 10minutes
BreezeLab.tracer_dp_scream — Function
tracer_dp_scream(; iop_path, start=DateTime(2022, 8, 1), stop=DateTime(2022, 8, 15), kwargs...)Build the periodic TRACER case driven by the DP-SCREAM IOP forcing without running it. Returns the build_case bundle plus iop, start, stop, window and protocol records.
Defaults (all overridable, overrides are recorded in the provenance):
start/stop: UTCDateTimes on IOP records. The DP-SCREAM August run started at 2022-08-01 00 UTC and the paper's 5–15 August window is its days 5–15, so the default reproduces that initialization and continuous forcing history (14 days); the archived 0.5-km run started cold at 2022-08-05 00 UTC.arch = GPU(),FT = Float32,Nx = Ny = 256,Δx = Δy = 200m,z_faces = tracer_dp_scream_vertical_faces()microphysics = :p3_n75withdroplet_number = 200e6m⁻³ (continental assumption, see above)large_scale_transport = :iop_3d,hold_forcing = true(piecewise-constant hourly forcing)wind_nudging_timescale = nothing(archived runs),coriolis = nothingradiation = :rrtmgpeveryradiation_interval = 300s with the IOPTgas surface temperature,surface_albedofrom the IOP shortwave fluxes (≈ 0.15),surface_emissivity = 0.98surface = :prescribed_heat_fluxes_bulk_drag: IOP sensible/latent heat fluxes, neutral log-law drag forroughness_length = 0.1m referenced to the first cell center,gustiness = 1m/ssponge = SAMSponge(damping_depth_fraction = 0.25),Δt = 2,max_Δt = 5,cfl = 0.7- outputs: profiles every 30 min, time series every 60 s, slices every 30 min at 1500 m,
checkpoint_interval = nothing(set e.g.6hoursfor resumable runs)