Breeze.jl
AGENTS.md90 starsChanged 3 months agoApache-2.0View on GitHub
Breeze.jl is Julia software for simulating atmospheric flows. It relies on Oceananigans.jl for grids, fields, solvers, and advection schemes, with extensions to CloudMicrophysics for microphysical schemes, RRTMGP for radiative transfer solvers, and interfaces with ClimaOcean for coupled atmosphere-ocean simulations. - Julia 1.10+ | CPU and GPU (CUDA) - Key packages: Oceananigans.jl, CloudMicrophysics.jl, RRTMGP.jl, NumericalEarth.jl, KernelAbstractions.jl, CUDA.jl, Enzyme.jl, Reactant.jl - Style: ExplicitImports.jl for source code; using Oceananigans and using Breeze for examples - Testing: ParallelTestRunner.jl for distributed testing - All structs…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,542 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository6 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- add-featureSkill
- babysit-ciSkill
- build-docsSkill
- new-simulationSkill
- run-testsSkill
The file
Show its rules and text
We split this AGENTS.md into the rules it gives an agent
21 rules. About 0 are common, 11 are distinctive, and 10 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈11
Distinctive · estimate
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 22
Use @kernel / @index (KernelAbstractions.jl)
- Very specific: line 24
Use ifelse — never short-circuiting if/else or ternary ?/: in kernels
- Distinctive: line 25
No error messages, no Models inside kernels
- Very specific: line 32
All structs must be concretely typed.
- Very specific: line 33
Use the materialization pattern: user-facing constructor creates a "skeleton" struct with placeholder types (like Nothing), then …
- Distinctive: line 44
Import Oceananigans/Breeze names first, then external packages
- Very specific: line 50
Use $(TYPEDSIGNATURES) from DocStringExtensions.jl (never write explicit signatures)
- Very specific: line 53
Citations: Use inline Author (year) syntax woven into prose
- Very specific: line 54
Use unicode for math (θ, ρ, Π), not LaTeX
- Distinctive: line 59
When something would be better in Oceananigans, add a detailed TODO note
- Distinctive: line 62
Use math or English consistently in expressions.
- Distinctive: line 132
Overconstraining types: use annotations for dispatch, not documentation
- Very specific: line 134
Plain
juliablocks in docstrings: always use jldoctest - Distinctive: line 138
Quick fixes that break correctness: if a test fails after a change, revisit the original edit
- Distinctive: line 139
Scope creep in PRs: keep changes focused on a single concern
- Very specific: line 140
Modifying Project.toml dependencies: never add, remove, or change [deps] or [weakdeps] in the root Project.toml unless the task absolutely …
- Very specific: line 143
Only touch [compat] bounds when explicitly asked.
- Distinctive: line 150
Follow ColPrac. Feature branches, descriptive commits, update tests and docs with code changes, check CI before merging.
- Distinctive: line 159
Follow established patterns in existing code
- Distinctive: line 160
Add tests for new functionality.
- Distinctive: line 162
When unsure: study working examples first (BOMEX, RICO, etc.), look at similar Oceananigans implementations, review tests for usage patterns
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Breeze.jl — Agent Rules
Project Overview
Breeze.jl is Julia software for simulating atmospheric flows. It relies on Oceananigans.jl for grids, fields, solvers, and advection schemes, with extensions to CloudMicrophysics for microphysical schemes, RRTMGP for radiative transfer solvers, and interfaces with ClimaOcean for coupled atmosphere-ocean simulations.
Language & Environment
- Julia 1.10+ | CPU and GPU (CUDA)
- Key packages: Oceananigans.jl, CloudMicrophysics.jl, RRTMGP.jl, NumericalEarth.jl, KernelAbstractions.jl, CUDA.jl, Enzyme.jl, Reactant.jl
- Style: ExplicitImports.jl for source code;
using Oceananigansandusing Breezefor examples - Testing: ParallelTestRunner.jl for distributed testing
Critical Rules
Kernel Functions (GPU compatibility)
- Use
@kernel/@index(KernelAbstractions.jl) - Kernels must be type-stable and allocation-free
- Use
ifelse— never short-circuitingif/elseor ternary?/:in kernels - No error messages, no Models inside kernels
- Mark functions called inside kernels with
@inline - Never loop over grid points outside kernels — use
launch! - Use literal zeros:
max(0, a)notmax(zero(FT), a). Julia handles type promotion.
Type Stability & Memory
- All structs must be concretely typed. Never use
Anyas a type parameter or field type. - Use the materialization pattern: user-facing constructor creates a "skeleton" struct with
placeholder types (like
Nothing), thenmaterialize_*creates the fully-typed version. - For mutable state within an immutable struct, use a
mutable structas the field type. - Type annotations are for dispatch, not documentation
- Minimize allocation; favor inline computation
Imports
- Source code: explicit imports (checked by tests). Never use
importto extend functions; always useModule.function_name(...) = ...orfunction Module.function_name() ... end - Exports at the top of module files, before other code
- Import Oceananigans/Breeze names first, then external packages
- Internal Breeze imports use absolute paths, not relative
- Examples/docs: rely on
using Oceananigansandusing Breeze
Docstrings
- Use
$(TYPEDSIGNATURES)from DocStringExtensions.jl (never write explicit signatures) - ALWAYS
jldoctestblocks, NEVER plainjuliablocks — doctests are tested; plain blocks rot - Include expected output after
# output; prefershowmethods over boolean comparisons - Citations: Use inline
[Author (year)](@cite Key)syntax woven into prose - Use unicode for math (
θ,ρ,Π), not LaTeX
Software Design
- Minimize code duplication (allow only for trivial one-liners)
- When something would be better in Oceananigans, add a detailed TODO note
- Almost always extend functions in source code, not in examples
- Coding style: consult
docs/src/appendix/notation.mdfor variable names - Use math or English consistently in expressions; don't mix
- Keyword arguments: no-space for inline
f(x=1), single-space for multilinef(a = 1, b = 2)
Naming Conventions
- Files: snake_case —
atmosphere_model.jl - Types/Constructors: PascalCase —
AtmosphereModel - Functions: snake_case —
compute_pressure! - Kernels: may prefix with underscore —
_kernel_function. The underscore prefix is reserved for kernel functions; do not use it to mark plain helpers as "internal" (we do not follow the Python convention). - Variables: English long name or unicode from
notation.md. Add new variables to that table. - Avoid abbreviations:
latitudenotlat,temperaturenottemp
Module Structure
src/
├── Breeze.jl # Main module, exports
├── Thermodynamics/ # Thermodynamic constants, states, reference states
├── AtmosphereModels/ # Core atmosphere model logic and diagnostics
├── StaticEnergyFormulations/ # Static energy thermodynamic formulation (prognostic ρs)
├── PotentialTemperatureFormulations/ # Liquid-ice potential temperature formulation (prognostic ρθ)
├── AnelasticEquations/ # Anelastic dynamics
├── CompressibleEquations/ # Fully compressible dynamics, acoustic substepping
├── KinematicDriver/ # Prescribed (kinematic) dynamics
├── TerrainFollowingDiscretization/ # Terrain-following vertical coordinates
├── TimeSteppers/ # Time stepping schemes for AtmosphereModel
├── Microphysics/ # Cloud microphysics
├── TurbulenceClosures/ # Including those ported from Oceananigans
├── BoundaryConditions/ # Bulk surface fluxes, drag, energy-flux BCs
├── Forcings/ # Forcing types (subsidence, geostrophic, ...)
├── CelestialMechanics/ # Solar zenith angle and solar geometry
├── ParcelModels/ # Parcel model dynamics
├── Advection.jl # Advection operators for anelastic models
├── Solvers.jl # Scalar nonlinear solvers (temperature inversion, saturation adjustment)
├── VerticalGrids.jl # Stretched vertical discretizations
├── single_column_mode.jl # Single-column and column-forest mode
├── Utils.jl # Small shared helpers
└── MoistAirBuoyancies.jl # Legacy buoyancy for Oceananigans.NonhydrostaticModelBreeze Formulations
Breeze separates the dynamics from the thermodynamic formulation. All prognostics are densities
(conservation form). Dynamics (dynamics keyword of AtmosphereModel):
AnelasticDynamics— anelastic equationsCompressibleDynamics— fully compressible equations with acoustic substeppingPrescribedDynamics— kinematic driver with prescribed density
Thermodynamic formulations (formulation keyword):
LiquidIcePotentialTemperatureFormulation(:LiquidIcePotentialTemperature, default) — prognosticρθStaticEnergyFormulation(:StaticEnergy) — prognosticρs
Planned: an entropy formulation (prognostic ρη).
Energy and water inputs are keyed agnostically, so a setup does not name a variable whose spelling depends on the formulation or the microphysics:
ρE(total energy density; specific aliasEfor forcings) is routed onto whichever thermodynamic variable the formulation evolves, converted as that variable requires.ρqᵗ(total moisture density; specific aliasqᵗ) is routed onto whichever moisture density the microphysics evolves — a pure re-key, since water needs no conversion.
The specific names (ρs, ρqᵛ, ρqᵉ) remain keys only where they are actually prognostic,
supplying both an interface key and its target is an error, and unrecognized keys raise an
ArgumentError rather than being silently dropped.
Common Pitfalls
- Type instability in kernels — ruins GPU performance
- Overconstraining types: use annotations for dispatch, not documentation
- Missing imports: tests will catch this — add explicit imports
- Plain
juliablocks in docstrings: always usejldoctest - Subtle bugs from missing method imports, especially in extensions
- Never extend
getpropertyto fix undefined property bugs — fix the caller instead - "Type is not callable": variable name shadows a function — rename or qualify
- Quick fixes that break correctness: if a test fails after a change, revisit the original edit
- Scope creep in PRs: keep changes focused on a single concern
- Modifying Project.toml dependencies: never add, remove, or change
[deps]or[weakdeps]in the rootProject.tomlunless the task absolutely requires it. Dependency changes have wide-reaching consequences — they affect CI, load time, and downstream compatibility. Only touch[compat]bounds when explicitly asked. - Underscore-prefixed helpers: an underscore prefix on a function name signals "kernel" in this codebase. Plain helper functions stay snake_case with no leading underscore.
Git Workflow & Whitespace
Follow ColPrac. Feature branches, descriptive commits, update tests and docs with code changes, check CI before merging.
PRs fail CI with trailing whitespace or trailing blank lines. Before committing: remove trailing whitespace, remove trailing blank lines, ensure file ends with exactly one newline.
Agent Behavior
- Prioritize type stability and GPU compatibility
- Follow established patterns in existing code
- Add tests for new functionality; update exports when adding public API
- Reference physics equations in comments when implementing dynamics
- When unsure: study working examples first (BOMEX, RICO, etc.), look at similar Oceananigans implementations, review tests for usage patterns
Further Reading
Detailed reference docs are in .agents/ — read on demand:
| Document | Content |
.agents/testing.md | Running tests, writing tests, debugging, QA |
.agents/documentation.md | Building docs, fast builds, Literate.jl examples, doctest details |
.agents/validation.md | Reproducing paper results, common issues, TC genesis |
.agents/physics-debugging.md | Thermodynamic variables, diagnose-before-fix, model architecture |
Auto-loading Rules
Rules in .claude/rules/ load automatically when you touch matching files:
kernel-rules.md— GPU kernel requirements (src/)docstring-rules.md— docstring and jldoctest conventions (src/)testing-rules.md— test writing and running (test/)docs-rules.md— documentation building and style (docs/)examples-rules.md— Literate.jl example conventions (examples/)
Skills (slash commands)
/run-tests— run targeted tests, prioritized by what's likely to break/build-docs— build documentation locally/add-feature— checklist for adding new physics/features/new-simulation— set up, run, and visualize a new simulation/babysit-ci— monitor CI, auto-fix small issues, retrigger flaky runs
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

