Nonlinear flux operations

A the nonlinear flux defines how energy moves between the wave-vortex coefficients—these are the nonlinear terms in the equations of motion, transformed into wave-vortex space.

The following nonlinear flux operations are available,

  • BoussinesqSpatial
  • WVNonlinearFlux
  • QGPVE
  • ForcedDissipativeQGPVE

Customized forcing and damping are implemented by creating subclasses of WVNonlinearFluxOperation.

To set the nonlinear flux operation to be used call, for example,

wvt.nonlinearFluxOperation = WVNonlinearFlux()

which then specifies how to compute F0, Fp, and Fm. The default nonlinear flux that is initialized with the WVTransform may not be appropriate for running a numerical model, which usually requires some combination of anti-aliasing or damping.

When initializing a model WVTransform you can set the nonlinear flux to something more appropriate, e.g.,

 model = WVModel(wvt,nonlinearFlux=WVNonlinearFlux(wvt,uv_damp=wvt.uvMax));

BoussinesqSpatial

The most basic implementation is a freely evolving, unforced (and undamped) flux.

The unforced, undamped nonlinear terms in the equations of motion are, \(\begin{align} \textrm{uNL}\equiv& u \partial_x u + v \partial_y u + w \partial_z u \\ \textrm{vNL}\equiv&u \partial_x v + v \partial_y v + w \partial_z v \\ \textrm{nNL}\equiv& u \partial_x \eta + v \partial_y \eta + w \left(\partial_z \eta +\eta \partial_z \ln N^2 \right) \end{align}\)

which, after a transformation into wave-vortex space, define the flux coefficients,

\[\left[\begin{array}{c} F_+ \\ F_- \\ F_0 \end{array} \right] \equiv - \mathcal{L} \left[\begin{array}{c} \textrm{uNL} \\ \textrm{vNL} \\ \textrm{nNL} \end{array} \right] \psi\]

In this notation, the nonlinear equations of motion are

\[\partial_t \left[\begin{array}{c} \hat{A}_+ \\ \hat{A}_- \\\hat{A}_0 \end{array}\right] = \left[\begin{array}{c} F_+ \\ F_- \\ F_0 \end{array} \right]\]

To implement this in code, you need to subclass the WVNonlinearFluxOperation and override the compute method. The simplest implementation of this operation can be found in the BoussinesqSpatial subclass of the WVNonlinearFluxOperation and is only 4 lines of code,

 function varargout = compute(self,wvt,varargin)
     varargout = cell(1,self.nVarOut);
     uNL = wvt.u .* wvt.diffX(wvt.u)   + wvt.v .* wvt.diffY(wvt.u)   + wvt.w .*  wvt.diffZF(wvt.u);
     vNL = wvt.u .* wvt.diffX(wvt.v)   + wvt.v .* wvt.diffY(wvt.v)   + wvt.w .*  wvt.diffZF(wvt.v);
     nNL = wvt.u .* wvt.diffX(wvt.eta) + wvt.v .* wvt.diffY(wvt.eta) + wvt.w .* (wvt.diffZG(wvt.eta) + wvt.eta .* wvt.dLnN2);

     [varargout{:}] = wvt.transformUVEtaToWaveVortex(-uNL,-vNL,-nNL,wvt.t);
end

This operation can now be used by the WVTransform to compute nonlinear fluxes, and therefore also used by the WVModel to time step forward (integrate) the model. If you are just using a WVTransform, then calling

wvt.nonlinearFluxOperation = BoussinesqSpatial()

will cause the WVTransform instance to use the new flux operation.

WVNonlinearFlux

The WVNonlinearFlux nonlinear flux operation computes exactly the same flux terms as BoussinesqSpatial, but is more computationally efficient and offers additional options for anti-aliasing and damping.

QGPVE

The QGPVE nonlinear flux operation computes the quasigeostrophic potential vorticity flux, which only operates on the vortex coefficients A0.