1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
def pea(temp, salinity, depth, levels):
"""
Calculate potential energy anomaly (stratification index).
Parameters
----------
temp : ndarray
Temperature data (depth-resolved).
salinity : ndarray
Salinity data (depth-resolved).
depth : ndarray
Water depth (positive down). Can be 1D (node) or 3D (time, siglay,
node).
levels : ndarray
Vertical levels (fractions of 0-1) (FVCOM = siglev).
Returns
-------
PEA : ndarray
Potential energy anomaly (J/m^{3}).
Notes
-----
"""
nd = np.ndim(depth)
g = 9.81
rho = dens_jackett(temp, salinity)
dz = np.abs(np.diff(levels, axis=0)) * depth
if nd == 1:
# dims is time only.
H = np.cumsum(dz, axis=0)
nz = dz.shape[0]
else:
# dims are [time, siglay, node].
H = np.cumsum(dz, axis=1)
nz = dz.shape[1]
# Depth-averaged density
rhobar = zbar(rho, dz)
# Potential energy anomaly.
PEA = np.zeros(rhobar.shape)
# Hofmeister thesis equation.
for i in range(nz):
if nd == 1:
PEA = PEA + ((rho[:, i, :] - rhobar) * g * H[i, :] * dz[i, :])
else:
PEA = PEA + ((rho[:, i, :] - rhobar) * g * H[:, i, :] * dz[:, i, :])
if nd == 1:
PEA = (1.0 / depth) * PEA
else:
PEA = (1.0 / depth.max(axis=1)) * PEA
return PEA |
Partager