Compute the dynamic height of a column of seawater.

  referencePressure = 2000,
  subdivisions = 500,
  rel.tol = .Machine$double.eps^0.25,
  eos = getOption("oceEOS", default = "gsw")



a section object.


reference pressure (dbar). If this exceeds the highest pressure supplied to swDynamicHeight(), then that highest pressure is used, instead of the supplied value of referencePressure.


number of subdivisions for call to integrate(). (The default value is considerably larger than the default for integrate(), because otherwise some test profiles failed to integrate.


absolute tolerance for call to integrate(). Note that this call is made in scaled coordinates, i.e. pressure is divided by its maximum value, and dz/dp is also divided by its maximum.


equation of state, either "unesco" or "gsw".


In the first form, a list containing distance, the distance (km( from the first station in the section and height, the dynamic height (m). In the second form, a single value, containing the dynamic height (m).


If the first argument is a section, then dynamic height is calculated for each station within a section, and returns a list containing distance along the section along with dynamic height.

If the first argument is a ctd, then this returns just a single value, the dynamic height.

If eos="unesco", processing is as follows. First, a piecewise-linear model of the density variation with pressure is developed using stats::approxfun(). (The option rule=2 is used to extrapolate the uppermost density up to the surface, preventing a possible a bias for bottle data, in which the first depth may be a few metres below the surface.) A second function is constructed as the density of water with salinity 35PSU, temperature of 0\(^\circ\)C, and pressure as in the ctd. The difference of the reciprocals of these densities, is then integrated with stats::integrate() with pressure limits 0 to referencePressure. (For improved numerical results, the variables are scaled before the integration, making both independent and dependent variables be of order one.)

If eos="gsw", gsw::gsw_geo_strf_dyn_height() is used to calculate a result in m^2/s^2, and this is divided by 9.7963\(m/s^2\). If pressures are out of order, the data are sorted. If any pressure is repeated, only the first level is used. If there are under 4 remaining distinct pressures, NA is returned, with a warning.


Gill, A.E., 1982. Atmosphere-ocean Dynamics, Academic Press, New York, 662 pp.

See also


if (FALSE) { library(oce) data(section) # Dynamic height and geostrophy par(mfcol=c(2,2)) par(mar=c(4.5,4.5,2,1)) # Left-hand column: whole section # (The smoothing lowers Gulf Stream speed greatly) westToEast <- subset(section, 1<=stationId&stationId<=123) dh <- swDynamicHeight(westToEast) plot(dh$distance, dh$height, type='p', xlab="", ylab="dyn. height [m]") ok <- !$height) smu <- supsmu(dh$distance, dh$height) lines(smu, col="blue") f <- coriolis(section[["station", 1]][["latitude"]]) g <- gravity(section[["station", 1]][["latitude"]]) v <- diff(smu$y)/diff(smu$x) * g / f / 1e3 # 1e3 converts to m plot(smu$x[-1], v, type='l', col="blue", xlab="distance [km]", ylab="velocity (m/s)") # right-hand column: gulf stream region, unsmoothed gs <- subset(section, 102<=stationId&stationId<=124) <- swDynamicHeight(gs) plot($distance,$height, type='b', xlab="", ylab="dyn. height [m]") v <- diff($height)/diff($distance) * g / f / 1e3 plot($distance[-1], v, type='l', col="blue", xlab="distance [km]", ylab="velocity (m/s)") }