How strongly the water column is stratified: the frequency at which a parcel displaced vertically would oscillate, squared. Written \(N^2\), and equal to \(-(g/\rho_0)\,\partial\rho/\partial z\).
Arguments
- env_dat
an
sfPOINT object with one row per location and time step, as datamatch's access functions return- shallow
name of the density column for the shallower level, in kg/m^3 or as sigma-theta; both give the same answer since only the difference enters
- deep
name of the density column for the deeper level
- depths
the two depths in metres, shallower first, positive downwards
- frequency
return \(N\) in s^-1 instead of \(N^2\) in s^-2.
NisNAwherever the column is unstable, since the root of a negative number is not a frequency- name
name for the new column
Details
This is the quantity that decides how much work mixing has to do, and it
governs a great deal of what plankton do. A strongly stratified column keeps a
surface bloom in the light and cuts it off from nutrients below; a weakly
stratified one lets both mix. vertical_gradient() approximates the same idea
with a temperature difference, which is a reasonable proxy only where salinity
is uniform — and in the Gulf of Maine it is not, because Scotian Shelf inflow
is fresh enough to stratify water that is barely warmer at the surface.
Getting the two levels
Two routes, depending on the source.
datamatch::accessCopernicus() takes a depth argument and returns one
level per call, so a second call at a different depth gives the deeper level
and the two are joined as columns on the same points:
surface <- datamatch::accessCopernicus(vars = c("SST", "SSS"), depth = c(0, 1), ...)
deep <- datamatch::accessCopernicus(vars = c("SST", "SSS"), depth = c(90, 100), ...)accessHYCOM() and accessFVCOM() instead serve the bottom as named
variables, BOTT and BOTS beside SST and SSS, so one fetch carries
both levels and the second depth is the water depth rather than a chosen
one. That makes a surface-to-bottom density difference available, where a
surface-and-bottom fetch from Copernicus gives a temperature difference only:
Copernicus serves bottomT but no bottom salinity.
Either way, compute a density for each level with potential_density() and
pass both here.
What a two-level estimate is and is not
It is a bulk stratification over the layer between the two depths, not a profile. Where a sharp pycnocline sits between the levels, the true peak \(N^2\) at that interface is far larger than the layer average reported here, and the depth of the peak is invisible.
The choice of levels therefore does much of the work, and the trap is the
mixed layer. If the two straddle its base, \(N^2\) is dominated by how much
of the well-mixed layer was included rather than by the stratification
itself, and it will vary through the season for that reason alone. Compare
the levels against MLD before reading a seasonal cycle into the result.
Negative values are returned rather than suppressed. They mean denser water sits above lighter, which is genuine convective instability in winter and otherwise usually a sign that the two levels are not what you think.
Examples
if (FALSE) { # \dontrun{
env <- potential_density(env, "SST", "SSS", name = "rho_surface")
env <- potential_density(env, "SST_deep", "SSS_deep", name = "rho_deep")
env <- buoyancy_frequency(env, "rho_surface", "rho_deep",
depths = c(0.494, 92.326))
} # }