Models
SpeedyWeather implements several models that define which equation are being solved
BarotropicModelsolves the 2D barotropic vorticity equationsShallowWaterModelsolves the 2D shallow water equationsPrimitiveDryModelsolves the 3D primitive equations without humidityPrimitiveWetModelsolves the 3D primitive equations with humidity
but each of these models has further modularity such that the equations being solved also depend on the model components being defined. For example, each of these models can have custom forcing and drag terms, or the primitive equation models can have endless combinations of parameterizations altering all sorts of components of the planetary climate system that is simulated.
We briefly provide an overview of the components of each model. Constructing a model follows the general syntax that is SomeModel(spectral_grid, component=my_component, ...) which we call the model constructor. The first argument is the spectral_grid defining the resolution, then additional keyword arguments can change model components for custom or non-default ones. The order does not matter and you can provide as many as you like just the model.component names have to fit the keywords of the arguments.
The model construction essentially gathers all default or non-default model components (it will construct the default components) but doesn't to much else. All the initialization of the model components and the allocation of Variables happens in initialize!(model).
Model components
Many types and components in SpeedyWeather have extended Julia's show function with some pretty printing to give you a better overview of its contents, e.g. a clock::Clock is printed as
using SpeedyWeather
clock = Clock()Clock{DateTime, Second, Int64, Mill...} <: SpeedyWeather.AbstractClock
├ time::DateTime = 2000-01-01T00:00:00
├ start::DateTime = 2000-01-01T00:00:00
├ period::Second = 0 seconds
├ timestep_counter::Int64 = 0
├ n_timesteps::Int64 = 0
└ Δt::Millisecond = 0 millisecondsillustrating the fields within a clock (one per row), their types (indicated by ::) and (unless they are an array) also their values. For structs (or NamedTuples) within structs however, this information, is not be printed by default. You can use Julia's autocomplete like clock.<tab> by hitting tab after the . to inspect the fields of an instance and that way go down every branch of the simulation "tree".
BarotropicModel
The BarotropicModel is the simplest model we have, which will not have many of the model components that are needed to define the primitive equations for example. If you create a model with non-default conponents they will show up here, so your model may look different depending on what you have constructed!
using SpeedyWeather
spectral_grid = SpectralGrid(nlayers=1) # 2D models require nlayers=1
model = BarotropicModel(spectral_grid)BarotropicModel{...} <: Barotropic (588.86 KB)
├ spectral_grid::SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU{Ker...
├ architecture::CPU{KernelAbstractions.CPU}
├ geometry::Geometry{SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU...
├ planet::Earth{Float32, Second, DateTime, Bool}
├ atmosphere::EarthDryAtmosphere{Float32}
├ coriolis::Coriolis{Vector{Float32}}
├ forcing::KolmogorovFlow{Float32}
├ drag::LinearVorticityDrag{Float32}
├ particle_advection::Nothing
├ initial_conditions::@NamedTuple{vordiv::RandomVelocity{Float32, Int64, Ra...
├ random_process::Nothing
├ tracers::Dict{Symbol, Tracer}
├ time_stepping::Leapfrog{Float32, Int64, Second, Millisecond, Bool}
├ spectral_transform::SpectralTransform{Float32, CPU{KernelAbstractions.CPU...
├ implicit::Nothing
├ horizontal_diffusion::HyperDiffusion{Float32, Matrix{Float32}, Int64, Sec...
├ output::NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{...
├ callbacks::Dict{Symbol, SpeedyWeather.AbstractCallback}
└ feedback::FeedbackShallowWaterModel
The ShallowWaterModel is similar to the BarotropicModel, but it contains for example orography, that the BarotropicModel doesn't have.
spectral_grid = SpectralGrid(nlayers=1) # 2D models require nlayers=1
model = ShallowWaterModel(spectral_grid)ShallowWaterModel{...} <: ShallowWater (606.75 KB)
├ spectral_grid::SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU{Ker...
├ architecture::CPU{KernelAbstractions.CPU}
├ geometry::Geometry{SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU...
├ planet::Earth{Float32, Second, DateTime, Bool}
├ atmosphere::EarthDryAtmosphere{Float32}
├ coriolis::Coriolis{Vector{Float32}}
├ orography::EarthOrography{Float32, Field{Float32, 1, Vector{Float32}, Oct...
├ forcing::Nothing
├ drag::Nothing
├ particle_advection::Nothing
├ initial_conditions::@NamedTuple{vordiv::ZonalJet{Float32}}
├ random_process::Nothing
├ tracers::Dict{Symbol, Tracer}
├ time_stepping::Leapfrog{Float32, Int64, Second, Millisecond, Bool}
├ spectral_transform::SpectralTransform{Float32, CPU{KernelAbstractions.CPU...
├ implicit::ImplicitShallowWater{Float32}
├ horizontal_diffusion::HyperDiffusion{Float32, Matrix{Float32}, Int64, Sec...
├ output::NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{...
├ callbacks::Dict{Symbol, SpeedyWeather.AbstractCallback}
└ feedback::FeedbackPrimitiveDryModel
The PrimitiveDryModel is a big jump in complexity compared to the 2D models, but because it doesn't contain humidity, several model components like surface_humidity_flux aren't needed.
spectral_grid = SpectralGrid()
model = PrimitiveDryModel(spectral_grid)PrimitiveDryModel{...} <: PrimitiveDry (1.03 MB)
├ spectral_grid::SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU{Ker...
├ architecture::CPU{KernelAbstractions.CPU}
├ dynamics::Bool
├ geometry::Geometry{SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU...
├ planet::Earth{Float32, Second, DateTime, Bool}
├ atmosphere::EarthDryAtmosphere{Float32}
├ coriolis::Coriolis{Vector{Float32}}
├ geopotential::Geopotential{Vector{Float32}}
├ adiabatic_conversion::AdiabaticConversion{Vector{Float32}}
├ particle_advection::Nothing
├ initial_conditions::@NamedTuple{vordiv::ZonalWind{Float32}, pres::Pressur...
├ forcing::Nothing
├ drag::SpeedLimitDrag{Float32}
├ random_process::Nothing
├ tracers::Dict{Symbol, Tracer}
├ dynamics_only::Bool
├ orography::EarthOrography{Float32, Field{Float32, 1, Vector{Float32}, Oct...
├ land_sea_mask::EarthLandSeaMask{Float32, Field{Float32, 1, Vector{Float32...
├ ocean::SlabOcean{Float32}
├ sea_ice::ThermodynamicSeaIce{Float32}
├ land::DryLandModel{LandGeometry{Vector{Float32}, Int64}, LandThermodynami...
├ solar_zenith::SolarZenith{Float32, SpeedyWeather.SinSolarDeclination{Eart...
├ albedo::OceanLandAlbedo{OceanSeaIceAlbedo{Float32}, LandSnowAlbedo{Float3...
├ boundary_layer_drag::BulkRichardsonDrag{Float32}
├ vertical_diffusion::BulkRichardsonDiffusion{Float32, Vector{Float32}}
├ surface_condition::SurfaceCondition{Float32}
├ surface_momentum_flux::SurfaceMomentumFlux{Float32}
├ surface_heat_flux::SurfaceHeatFlux{SurfaceOceanHeatFlux{Float32}, Surface...
├ convection::BettsMillerDryConvection{Float32}
├ shortwave_radiation::OneBandShortwave{NoClouds, ConstantShortwaveTransmis...
├ longwave_radiation::OneBandLongwave{ConstantLongwaveTransmissivity{Float3...
├ stochastic_physics::Nothing
├ custom_parameterization::Nothing
├ time_stepping::Leapfrog{Float32, Int64, Second, Millisecond, Bool}
├ spectral_transform::SpectralTransform{Float32, CPU{KernelAbstractions.CPU...
├ implicit::ImplicitPrimitiveEquation{Float32, Vector{Float32}, Matrix{Floa...
├ horizontal_diffusion::HyperDiffusion{Float32, Matrix{Float32}, Int64, Sec...
├ vertical_advection::CenteredVerticalAdvection{Float32, 1}
├ output::NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{...
├ callbacks::Dict{Symbol, SpeedyWeather.AbstractCallback}
├ feedback::Feedback
├ core_components::NTuple{8, Symbol}
├ parameterizations::NTuple{11, Symbol}
└ params::Val{(:solar_zenith, :vertical_diffusion, :convection, :albedo, :s...PrimitiveWetModel
The PrimitiveWetModel is the most complex model we currently have, hence its field tree is the longest, defining many components for the physics parameterizations.
model = PrimitiveWetModel(spectral_grid)PrimitiveWetModel{...} <: PrimitiveWet (1.05 MB)
├ spectral_grid::SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU{Ker...
├ architecture::CPU{KernelAbstractions.CPU}
├ dynamics::Bool
├ geometry::Geometry{SpectralGrid{CPU{KernelAbstractions.CPU}, Spectrum{CPU...
├ planet::Earth{Float32, Second, DateTime, Bool}
├ atmosphere::EarthAtmosphere{Float32}
├ coriolis::Coriolis{Vector{Float32}}
├ geopotential::Geopotential{Vector{Float32}}
├ adiabatic_conversion::AdiabaticConversion{Vector{Float32}}
├ particle_advection::Nothing
├ initial_conditions::@NamedTuple{vordiv::ZonalWind{Float32}, pres::Pressur...
├ forcing::Nothing
├ drag::SpeedLimitDrag{Float32}
├ random_process::Nothing
├ tracers::Dict{Symbol, Tracer}
├ dynamics_only::Bool
├ orography::EarthOrography{Float32, Field{Float32, 1, Vector{Float32}, Oct...
├ land_sea_mask::EarthLandSeaMask{Float32, Field{Float32, 1, Vector{Float32...
├ ocean::SlabOcean{Float32}
├ sea_ice::ThermodynamicSeaIce{Float32}
├ land::LandModel{LandGeometry{Vector{Float32}, Int64}, LandThermodynamics{...
├ solar_zenith::SolarZenith{Float32, SpeedyWeather.SinSolarDeclination{Eart...
├ albedo::OceanLandAlbedo{OceanSeaIceAlbedo{Float32}, LandSnowAlbedo{Float3...
├ boundary_layer_drag::BulkRichardsonDrag{Float32}
├ vertical_diffusion::BulkRichardsonDiffusion{Float32, Vector{Float32}}
├ surface_condition::SurfaceCondition{Float32}
├ surface_momentum_flux::SurfaceMomentumFlux{Float32}
├ surface_heat_flux::SurfaceHeatFlux{SurfaceOceanHeatFlux{Float32}, Surface...
├ surface_humidity_flux::SurfaceHumidityFlux{SurfaceOceanHumidityFlux{Float...
├ large_scale_condensation::ImplicitCondensation{Float32}
├ convection::BettsMillerConvection{Float32}
├ shortwave_radiation::OneBandShortwave{DiagnosticClouds{Float32}, Backgrou...
├ longwave_radiation::OneBandLongwave{FriersonLongwaveTransmissivity{Float3...
├ stochastic_physics::Nothing
├ custom_parameterization::Nothing
├ time_stepping::Leapfrog{Float32, Int64, Second, Millisecond, Bool}
├ spectral_transform::SpectralTransform{Float32, CPU{KernelAbstractions.CPU...
├ implicit::ImplicitPrimitiveEquation{Float32, Vector{Float32}, Matrix{Floa...
├ horizontal_diffusion::HyperDiffusion{Float32, Matrix{Float32}, Int64, Sec...
├ vertical_advection::CenteredVerticalAdvection{Float32, 1}
├ hole_filling::ClipNegatives
├ output::NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{...
├ callbacks::Dict{Symbol, SpeedyWeather.AbstractCallback}
├ feedback::Feedback
├ core_components::NTuple{8, Symbol}
├ parameterizations::NTuple{13, Symbol}
└ params::Val{(:solar_zenith, :vertical_diffusion, :large_scale_condensatio...