Vertical Advection
The VertAdv class contains methods and arrays for calculating vertical
velocities and the tendencies of thickness, horizontal velocity, and tracers due
to vertical advection.
Initialization
The default VertAdv instance is created by calling VertAdv::init() method.
The default HorzMesh, VertCoord, and Tracers objects must be initialized
first. The default instance is retrieved by:
VertAdv *DefVertAdv = VertAdv::getDefault();
Additional instances can be created with the create method, which call the
constructor and places the new instance in a map identified with the label
Name:
VertAdv *VertAdv::create(const std::string &Name, ///< [in] name for new VertAdv
const HorzMesh *Mesh, ///< [in] associated HorzMesh
const VertCoord *VCoord, ///< [in] associated VertCoord
Config *Options ///< [in] configuration options
)
This instance is retrieved with the get method:
VertAdv *NewVertAdv = VertAdv::get("Name");
The constructor reads configuration options, stores some info from the
HorzMesh, VertCoord, and Tracers objects, allocates needed arrays,
and defines Field metadata.
Variables
The following arrays are stored as members of the VertAdv class.
Variable Name |
Type |
Dimensions |
|---|---|---|
VerticalVelocity |
Real |
NCellsSize, NVertLayersP1 |
TotalVerticalVelocity |
Real |
NCellsSize, NVertLayersP1 |
VertFlux |
Real |
NTracers, NCellsSize, NVertLayersP1 |
LowOrderVertFlux |
Real |
NTracers, NCellsSize, NVertLayersP1 |
The VerticalVelocity represents the raw vertical pseudovelocity through the
top interfaces of cell layers, computed from the divergence of the horizontal
velocity. The TotalVerticalVelocity is the transport velocity and includes
corrections applied to the VerticalVelocity. The VertFlux and
LowOrderVertFlux store tracer fluxes at layer interfaces. The specific
numerical algorithms to compute these fluxes are chosen by the user through
configuration options.
Methods
The VerticalVelocity and TotalVerticalVelocity arrays are computed by
calling the computeVerticalVelocity method:
VertAdv::computeVerticalVelocity(NormalVelocity, FluxLayerThickEdge);
This method takes as input the NormalVelocity field from the OceanState
object, and the FluxLayerThickEdge field from the AuxiliaryState. At
present, TotalVerticalVelocity is equivalent to VerticalVelocity;
additional corrections will be added in subsequent updates. The
TotalVerticalVelocity array is used by each of the tendency methods,
therefore computeVerticalVelocity must be called before any tendency
computations.
There are three methods for computing vertical advection tendencies of
thickness, horizontal velocity and tracers that are called from the time
stepper: computeThicknessVAdvTend, computeVelocityVAdvTend, and
computeTracerVAdvTend. Each method updates the corresponding tendency array
in place (inout).
Only the thickness tendency array is passed to the computeThicknessVAdvTend
method:
VertAdv::computeThicknessVAdvTend(ThickTend);
The computeVelocityVAdvTend method requires the NormalVelocity and
FluxLayerThickEdge fields, in addition to the velocity tendency array:
VertAdv::computeVelocityVAdvTend(VelTend, NormalVelocity, FluxLayerThickEdge);
The tracer vertical advection tendency depends on the configured settings.
The computeTracerVAdvTend method takes as arguments the full 3D array of
tracers, a thickness array (selected based on the configured advection
algorithm) and a TimeInterval representing the time step, along with the
tracer tendency array:
VertAdv::computeTracerVAdvTend(TracerTend, TracerArray, Thickness, TimeStep);
For the standard advection algorithm, LayerThickness from the OceanState is
passed as the thickness argument; for the FCT algorithm, the ProvThickness
from the AuxiliaryState is used instead.
This method first calls computeVerticalFluxes to compute the tracer fluxes at
layer interfaces, using the order of accuracy specified in the configuration
file. It then dispatches to the selected advection algorithm (standard or FCT)
to compute the tracer tendencies.