Hello Julia community!
We’re building GPU-first, finite volume, pure Julia software for atmospheric modeling called “Breeze.jl”, based on Oceananigans.jl. Breeze looks and smells like Oceananigans and reuses grids, fields, operators, solvers, and design principles.
We’re currently focused on high-resolution applications, from O(10 m) scale large eddy simulations to O(km) “mesoscale” simulations. Our priorities (now) are state-of-the-art cloud physics parameterizations, high performance, and differentiable workflows behind a radically easy-to-learn user interface (the Oceananigans Way), all with an eye towards weather science and forecasting.
This announcement is also a call to action. It takes a whole community to build the kind of atmosphere model we’re dreaming about.
Hello, world
Breeze’s syntax mirrors Oceananigans and is designed to maximize the productivity of scientists. Here’s a “hello world” for Breeze:
using Breeze
using Oceananigans.Units
grid = RectilinearGrid(size=(128, 128), x=(0, 1e4), z=(0, 5e3),
topology=(Periodic, Flat, Bounded))
Q₀ = 1000 # heat flux in W / m²
ρe_bcs = FieldBoundaryConditions(bottom=FluxBoundaryCondition(Q₀))
boundary_conditions = (; ρe=ρe_bcs)
model = AtmosphereModel(grid; advection=WENO(), boundary_conditions)
θ₀ = model.dynamics.reference_state.potential_temperature
θᵢ(x, z) = θ₀ + 1e-2 * rand()
set!(model, θ=θᵢ)
simulation = Simulation(model, Δt=10, stop_time=2hours)
conjure_time_step_wizard!(simulation, cfl=0.7)
run!(simulation)
using CairoMakie
heatmap(PotentialTemperature(model), colormap=:thermal)
This script produces a plot of a turbulent potential temperature field in free convection:
Current scope
Breeze’s current scope is driven by the needs of the current developers. These include capabilities for idealized air-sea interaction and ocean-atmosphere simulations (with contributors from University of Melbourne and University of Tasmania). A second driver is an initiative to build a differentiable, high-resolution, limited area modeling system for severe weather research, forecasting, and microphysics model development (with contributors and CI support from Aeolus Labs in San Francisco). All of us share the goal of attracting more users and developers from diverse areas in Earth system sciences who are interested in contributing to cutting-edge, beautifully-documented, ultra-efficient, and differentiable atmosphere modeling software for teaching, research, and operations.
Our focus on high-resolution, limited-area applications distinguishes the current scope of Breeze from global frameworks like SpeedyWeather and ClimaAtmos. Breeze development has proceeded rapidly over the past few months: we currently support both anelastic and compressible dynamics, potential temperature and static energy thermodynamic formulations, extensions to the Climate Modeling Alliance’s excellent CloudMicrophysics.jl and RRTMGP.jl packages, advection schemes and turbulence closures borrowed from Oceananigans, and more. Support for coupled ocean-atmosphere, Breeze-Oceananigans simulations is coming soon. We are pursuing the implementation of differentiable workflows using Reactant.jl and Enzyme.jl, as in Oceananigans. We’re also working on a JOSS paper that will describe these preliminary features.
Join us
We hope that Breeze’s potential and growing capabilities fertilize the growth of a vibrant, welcoming, and diverse community of atmospheric scientists, cloud physicists, compiler engineers, fluid dynamicists, Earth system scientists, students, researchers, users, and model developers. We’ve formed the NumericalEarth slack to help crystallize this effort. Check out Breeze’s source code and documentation, and consider joining us in this adventure.
Sincerely,
Breeze devs
PS: some eye candy below, generated by Breeze and Makie.
Clouds, updrafts, and rain in the canonical RICO LES case (VanZanten et al 2011)
Initial growth and roll up of a 2D cloudy Kelvin-Helmholtz instability
