rho_mwjf
Computes ocean water density given a specified range for potential temperature (deg Celsius) and salinity (psu).
Prototype
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" ; This library is automatically loaded
; from NCL V6.2.0 onward.
; No need for user to explicitly load.
function rho_mwjf (
t2d [*][*] : numeric,
s2d [*][*] : numeric,
depth [1] : numeric
)
return_val : typeof(t2d)
Arguments
t2dA two-dimensional array of temperature values (must be deg C).
s2dA two-dimensional array of the same size as t2d containing salinity values (must be psu).
depthA scalar value for depth at which to compute density (meters).
Return value
The results are returned in an array of the same type and size as t2d.
Description
This function computes potential density for a specifed range or potential T and Salt. It can also be used for water mass T-S diagrams (see the example below).
This function is based on Steve Yeager's "Rhoalphabeta", which uses the CESM3 POP equation of state "mwjf" calculation to compute density.
Note: In September 2009, Dr. Arne Melson [Norwegian Meteorological Institute, R & D - Oceanography ] noted that the results were applicable for computing surface potential density only, i.e., where depth=0. A modification has since been applied [version 5.2.0] to accurately compute all density surfaces (depth >= 0).
References:
Levitus, S., R. Burgett, and T.P. Boyer, World Ocean Atlas
1994, Volume 3: Salinity, NOAA Atlas NESDIS 3, US Dept. of
Commerce, 1994.
Levitus, S. and T.P. Boyer, World Ocean Atlas 1994,
Volume 4: Temperature, NOAA Atlas NESDIS 4, US Dept. of
Commerce, 1994.
Dukowicz, J. K., 2000: Reduction of Pressure and Pressure
Gradient Errors in Ocean Simulations, J. Phys. Oceanogr.,
submitted.
Examples
; read potential temp (TEMP), salinity (SALT)
; compute potential density (PD) for specified range PD(t,s)
; (use ncl function based yeager's algorithm for rho computation)
; assumes annual and zonally avgeraged input data set (i.e, one time slice)
; used k.lindsay's "za" for zonal avg -- already binned into basins
; plots temp vs salt (scatter plot), pd overlay
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
begin
; ================================> ; PARAMETERS
case = "PHC2_gx1v3"
ocnfile = "za_PHC2_T_S_gx1v3.nc"
depth_min = 14895.82 ; in cm, depth of first layer to be included
depth_max = 537499.9
;
; plot limits
;
smincn = 32.5
smaxcn = 37.0
tmincn = -2.
tmaxcn = 22.
;
; Choose basin index
;
; 0 = global 1 = southern ocean 2 = pacific 3 = indian 6 = atlantic
; 8 = labrador 9 = GIN 10 = arctic
;
bi = 2
;=====> basin check
if(bi.lt.0.or.bi.gt.10) then
print("basin index "+ bi + " not supported")
exit
end if
if(bi.eq.0) then
basin = "Global"
blab = "global"
end if
if(bi.eq.1) then
basin = "Southern Ocean"
blab = "so"
end if
if(bi.eq.2) then
basin = "Pacific Ocean"
blab = "pacific"
end if
if(bi.eq.3) then
basin = "Indian Ocean"
blab = "indian"
end if
if(bi.eq.6) then
basin = "Atlantic Ocean"
blab = "atlantic"
end if
if(bi.eq.8) then
basin = "Labrador Sea"
blab = "lab"
end if
if(bi.eq.9) then
basin = "GIN Sea"
blab = "gin"
end if
if(bi.eq.10) then
basin = "Arctic Ocean"
blab = "arctic"
end if
;=====> initial resource settings
wks = gsn_open_wks("ps","TS_diagram") ; Open a Postscript file
;===== data
focn = addfile(ocnfile, "r")
salt = focn->SALT(0,:,{depth_min:depth_max},:) ;(basins, z_t, lat_t)
temp = focn->TEMP(0,:,{depth_min:depth_max},:)
;====section out choice basin
temp_ba = temp(bi,:,:)
salt_ba = salt(bi,:,:)
;===== put into scatter array format
tdata_ba = ndtooned(temp_ba)
sdata_ba = ndtooned(salt_ba)
ydata = tdata_ba
xdata = sdata_ba
;============== compute potenial density (PD), using rho_mwjf
;
; for potential density, depth = 0. (i.e. density as if brought to surface)
;
;===========================================================================
; WARNING: T-S diagrams use POTENTIAL DENSITY... if set depth to something
; other then 0, then you will be plotting density contours computed for the
; specified depth layer.
;===========================================================================
depth = 0. ;in meters
tspan = fspan(tmincn,tmaxcn,51)
sspan = fspan(smincn,smaxcn,51)
; the more points the better... using yeager's numbers
t_range = new((/51,51/),float)
s_range = new((/51,51/),float)
t_range = conform(t_range,tspan,0)
s_range = conform(s_range,sspan,1)
pd = rho_mwjf(t_range,s_range,depth)
pd!0 = "temp"
pd!1 = "salt"
pd&temp = tspan
pd&salt = sspan
pd = 1000.*(pd-1.) ; Put into kg/m3 pot den units
printVarSummary(pd)
printVarInfo(pd,"rho_mwjf")
;=================Graphics
;--- scatter plot
res = True
res@gsnDraw = False
res@gsnFrame = False
res@xyMarkLineModes = "Markers"
res@xyMarkers = 16
res@xyMarkerColors = "black"
res@pmLegendDisplayMode = "Never"
res@txFontHeightF = 0.01
res@tiXAxisString = salt@units
res@tiXAxisFontHeightF = 0.02
res@tiYAxisString = temp@units
res@tiYAxisFontHeightF = 0.02
res@trXMinF = smincn
res@trXMaxF = smaxcn
res@trYMinF = tmincn
res@trYMaxF = tmaxcn
res@gsnRightString = depth_min/100. + "-"+depth_max/100. +"m"
res@gsnLeftString = basin
plot = gsn_csm_xy(wks,xdata,ydata,res)
;----- pd overlay
resov = True
resov@gsnDraw = False
resov@gsnFrame = False
resov@cnLevelSelectionMode = "AutomaticLevels"
resov@cnInfoLabelOn = "False"
resov@cnLineLabelPlacementMode = "Constant"
resov@cnLineLabelFontHeightF = ".02"
plotpd = gsn_csm_contour(wks,pd,resov)
overlay(plot,plotpd)
; panel resources
pan = True
pan@gsnMaximize = True
pan@gsnPaperOrientation = "portrait"
pan@txFontHeightF = 0.025
pan@txString = case + " ANN AVG: T-S Diagram "
gsn_panel(wks,plot,(/1,1/),pan)
end