Here are some ideas for additional diagnostics inspired by discussions with @jonathanlilly and @JeffreyEarly.
Eigensolver for vertical modes
I think it would be nice to have an eigensolver to compute vertical modes from a horizontally-averaged / reduced buoyancy profile (or taking in the vertical derivative of buoyancy directly). This means solving the eigenproblem
$$ \partial_z \left ( \frac{f^2}{N^2} \partial_z \phi_n \right ) + \frac{1}{R_n^2} \phi_n = 0 \qquad \text{with} \qquad \partial_z \phi = 0 \qquad \text{at} \qquad z = -H, 0 $$
where $1/R_n^2$ are the eigenvalues, $R_n$ is the Rossby radii of deformation of mode $n$, $f$ is the Coriolis parameter (a constant) and $N^2(z)$ is the vertical derviative of buoyancy (a function of $z$). The eigenfunctions $\phi_n(z)$ are the "vertical modes".
Finite volume details: $\phi$ is located at Center in the vertical, while N^2 is located at Face. This works out naturally so no shenanigans seem to be required here.
I think this can be implemented by meshing Oceananigans.AbstractOperations with Krylov.jl. In other words I am imagining a user interface wherein we write something like
B = Field(Average(b, dims=(1, 2)))
N² = ∂z(B)
ϕ = Field{Nothing, Nothing, Center}(grid)
L = ∂z(f^2 / N² * ∂z(ϕ))
sol = eigensolve(L)
where b would be the buoyancy field and f the Coriolis parameter. Many permutations on the above syntax might make sense too.
Diagnostics for wave-mean decomposition
Related to vertical modes would be diagnostics that allow one to decompose solutions into an internal wave and mean (or quasi-geostrophic) component. I think @JeffreyEarly knows how to do this well.
We can also support a direct solver for the Omega equation; eg solving

using a solver similar to the FourierTridiagonalPoissonSolver (combining horizontal-FFT with vertical tridiagonal). This would require modest (not heroic) efforts. The screenshot is from Danioux et al 2016.
Here are some ideas for additional diagnostics inspired by discussions with @jonathanlilly and @JeffreyEarly.
Eigensolver for vertical modes
I think it would be nice to have an eigensolver to compute vertical modes from a horizontally-averaged / reduced buoyancy profile (or taking in the vertical derivative of buoyancy directly). This means solving the eigenproblem
where$1/R_n^2$ are the eigenvalues, $R_n$ is the Rossby radii of deformation of mode $n$ , $f$ is the Coriolis parameter (a constant) and $N^2(z)$ is the vertical derviative of buoyancy (a function of $z$ ). The eigenfunctions $\phi_n(z)$ are the "vertical modes".
Finite volume details:$\phi$ is located at
Centerin the vertical, whileN^2is located atFace. This works out naturally so no shenanigans seem to be required here.I think this can be implemented by meshing Oceananigans.AbstractOperations with Krylov.jl. In other words I am imagining a user interface wherein we write something like
where
bwould be the buoyancy field andfthe Coriolis parameter. Many permutations on the above syntax might make sense too.Diagnostics for wave-mean decomposition
Related to vertical modes would be diagnostics that allow one to decompose solutions into an internal wave and mean (or quasi-geostrophic) component. I think @JeffreyEarly knows how to do this well.
We can also support a direct solver for the Omega equation; eg solving
using a solver similar to the
FourierTridiagonalPoissonSolver(combining horizontal-FFT with vertical tridiagonal). This would require modest (not heroic) efforts. The screenshot is from Danioux et al 2016.