Ocean Barotropic Volume Transport¶
In this lecture, we will use the ECCO State Estimate to explore and describe the ocean circulation. As discussed in Ocean State Estimation, the flow field produced by ECCO is constrained by nearly all relevant and available observations of the ocean and has been carefully validated across multiple dimensions. Nevertheless, we must remember that ECCO is not the real ocean. A particular shortcoming of this solution is its relatively low spatial resolution of approx. 1 degree. This means it does not resolve sharp boundary currents, fronts, or mesoscale variability.
Barotropic (Horizontal) Circulation¶
As a starting point for our study of ocean circulation, we will examine the Barotropic Circulation. Formally, a barotropic fluid is one where density depends only on pressure. This would be the case for the ocean only if temperature and salinity were uniform (or at least dependent only on depth). The real ocean is not a barotropic fluid; it is baroclinic (the opposite of barotropic).
However, in common usage in physical oceanography, Barotropic is taken to mean “depth-averaged”. By averaging a proprerty (usually the flow field) over depth, we obtain a simplified picture of the flow. As we will see in Vorticity, Sverdrup Transport, and Ocean Gyres, classical ocean circulation theory makes predicts for the barotropic flow.
Defining the Barotropic Flow¶
The full 3D velociety field of the ocean is the vector field \(\mathbf{u}(\mathbf{x}, t) = (u, v, w)\). Visualizing and understanding a time-varying vector field is very challenging, so we often want to remove one dimension.
As a first step, we define vertically-integrated flow components as
Continuity Equation¶
Now we apply the same integral to the Boussinesq continuity equation: \(\nabla \cdot \mathbf{u} = 0\) to obtain
The surface boundary condition is:
We will assume that the bottom is rigid and flat, in which case the bottom boundary condition is just \(w|_{z=-H} = 0\).
With these boundary conditions, we obtain.
This equation describes how the sea surface height (\(\eta\)) evolves in time in a Boussinesq, barotropic ocean. It can change either due to a convergence of horizontal volume fluxes or due to a flux of water from the atmosphere.
“Rigid Lid” and Streamfunction¶
A common and appropriate approximation is to assume that \(\partial \eta / \partial t\) and \(E - P - R\) are small compared to the terms related to the horizontal velocities. With this, we obtain
This is call two-dimensional non-divergent flow. We can always represent such flow using a streamfunction \(\Psi\), defined as
Any velocity field that is defined in this way will satisfy the 2D continuity equation by construction.
Streamfunctions are great because they summarize the vector flow field in a single scalar field. \(\Psi\) as defined here has units of m\(^3 /\) s. Horizontal boundary conditions are auomatically satisfied by setting \(\Psi = \)const. on the boundaries.
import xgcm
import xarray as xr
from matplotlib import pyplot as plt
import hvplot.xarray
import numpy as np
plt.rcParams['figure.figsize'] = (12, 8)
from dask_gateway import Gateway
gway = Gateway()
cluster = gway.new_cluster()
cluster
/srv/conda/envs/notebook/lib/python3.8/site-packages/dask_gateway/client.py:21: FutureWarning: format_bytes is deprecated and will be removed in a future release. Please use dask.utils.format_bytes instead.
from distributed.utils import LoopRunner, format_bytes
from ecco_utils import load_ecco_v4
ds = load_ecco_v4()
ds
<xarray.Dataset> Dimensions: (face: 13, lon_c: 360, lon_g: 360, lat_c: 240, lat_g: 240, Z: 50, Zl: 50, Zp1: 51, Zu: 50, time: 288, time_snp: 287) Coordinates: (12/42) * face (face) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 i (lon_c) int64 0 1 2 3 4 5 6 7 ... 352 353 354 355 356 357 358 359 i_g (lon_g) int64 0 1 2 3 4 5 6 7 ... 352 353 354 355 356 357 358 359 j (lat_c) int64 30 31 32 33 34 35 36 ... 264 265 266 267 268 269 j_g (lat_g) int64 30 31 32 33 34 35 36 ... 264 265 266 267 268 269 k (Z) int64 0 1 2 3 4 5 6 7 8 9 ... 40 41 42 43 44 45 46 47 48 49 ... ... dyG (lat_c, lon_g) float32 dask.array<chunksize=(60, 90), meta=np.ndarray> dxG (lat_g, lon_c) float32 dask.array<chunksize=(60, 90), meta=np.ndarray> * lon_c (lon_c) float32 -37.5 -36.5 -35.5 -34.5 ... 319.5 320.5 321.5 * lon_g (lon_g) float32 -38.0 -37.0 -36.0 -35.0 ... 319.0 320.0 321.0 * lat_c (lat_c) float32 -81.46 -81.13 -80.8 -80.45 ... 67.16 67.34 67.47 * lat_g (lat_g) float32 -81.61 -81.28 -80.95 -80.61 ... 67.06 67.25 67.4 Data variables: (12/35) ADVr_SLT (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> ADVr_TH (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> DFrE_SLT (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> DFrE_TH (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> DFrI_SLT (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> DFrI_TH (time, Zl, lat_c, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> ... ... UVELMASS (time, Z, lat_c, lon_g) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> VVELMASS (time, Z, lat_g, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> UVELSTAR (time, Z, lat_c, lon_g) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> VVELSTAR (time, Z, lat_g, lon_c) float32 dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray> oceTAUX (time, lat_c, lon_g) float32 dask.array<chunksize=(1, 60, 90), meta=np.ndarray> oceTAUY (time, lat_g, lon_c) float32 dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- face: 13
- lon_c: 360
- lon_g: 360
- lat_c: 240
- lat_g: 240
- Z: 50
- Zl: 50
- Zp1: 51
- Zu: 50
- time: 288
- time_snp: 287
- face(face)int640 1 2 3 4 5 6 7 8 9 10 11 12
- standard_name :
- face_index
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
- i(lon_c)int640 1 2 3 4 5 ... 355 356 357 358 359
- axis :
- X
- long_name :
- x-dimension of the t grid
- standard_name :
- x_grid_index
- swap_dim :
- XC
array([ 0, 1, 2, ..., 357, 358, 359])
- i_g(lon_g)int640 1 2 3 4 5 ... 355 356 357 358 359
- axis :
- X
- c_grid_axis_shift :
- -0.5
- long_name :
- x-dimension of the u grid
- standard_name :
- x_grid_index_at_u_location
- swap_dim :
- XG
array([ 0, 1, 2, ..., 357, 358, 359])
- j(lat_c)int6430 31 32 33 34 ... 266 267 268 269
- axis :
- Y
- long_name :
- y-dimension of the t grid
- standard_name :
- y_grid_index
- swap_dim :
- YC
array([ 30, 31, 32, ..., 267, 268, 269])
- j_g(lat_g)int6430 31 32 33 34 ... 266 267 268 269
- axis :
- Y
- c_grid_axis_shift :
- -0.5
- long_name :
- y-dimension of the v grid
- standard_name :
- y_grid_index_at_v_location
- swap_dim :
- YG
array([ 30, 31, 32, ..., 267, 268, 269])
- k(Z)int640 1 2 3 4 5 6 ... 44 45 46 47 48 49
- axis :
- Z
- long_name :
- z-dimension of the t grid
- standard_name :
- z_grid_index
- swap_dim :
- Z
array([ 0, 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])
- k_l(Zl)int640 1 2 3 4 5 6 ... 44 45 46 47 48 49
- axis :
- Z
- c_grid_axis_shift :
- -0.5
- long_name :
- z-dimension of the w grid
- standard_name :
- z_grid_index_at_upper_w_location
- swap_dim :
- Zl
array([ 0, 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])
- k_p1(Zp1)int640 1 2 3 4 5 6 ... 45 46 47 48 49 50
- axis :
- Z
- c_grid_axis_shift :
- [-0.5, 0.5]
- long_name :
- z-dimension of the w grid
- standard_name :
- z_grid_index_at_w_location
- swap_dim :
- Zp1
array([ 0, 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])
- k_u(Zu)int640 1 2 3 4 5 6 ... 44 45 46 47 48 49
- axis :
- Z
- c_grid_axis_shift :
- 0.5
- long_name :
- z-dimension of the w grid
- standard_name :
- z_grid_index_at_lower_w_location
- swap_dim :
- Zu
array([ 0, 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])
- time(time)datetime64[ns]1992-01-15 ... 2015-12-14
- axis :
- T
- long_name :
- Time
- standard_name :
- time
array(['1992-01-15T00:00:00.000000000', '1992-02-13T00:00:00.000000000', '1992-03-15T00:00:00.000000000', ..., '2015-10-15T00:00:00.000000000', '2015-11-14T00:00:00.000000000', '2015-12-14T00:00:00.000000000'], dtype='datetime64[ns]')
- time_snp(time_snp)datetime64[ns]1992-02-01 ... 2015-12-01
- axis :
- T
- c_grid_axis_shift :
- 0.5
- long_name :
- Time
- standard_name :
- time
array(['1992-02-01T00:00:00.000000000', '1992-03-01T00:00:00.000000000', '1992-04-01T00:00:00.000000000', ..., '2015-10-01T00:00:00.000000000', '2015-11-01T00:00:00.000000000', '2015-12-01T00:00:00.000000000'], dtype='datetime64[ns]')
- Depth(lat_c, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- XC YC
- long_name :
- ocean depth
- standard_name :
- ocean_depth
- units :
- m
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - PHrefC(Z)float32dask.array<chunksize=(50,), meta=np.ndarray>
- long_name :
- Reference Hydrostatic Pressure
- standard_name :
- cell_reference_pressure
- units :
- m2 s-2
Array Chunk Bytes 200 B 200 B Shape (50,) (50,) Count 2 Tasks 1 Chunks Type float32 numpy.ndarray - PHrefF(Zp1)float32dask.array<chunksize=(51,), meta=np.ndarray>
- long_name :
- Reference Hydrostatic Pressure
- standard_name :
- cell_reference_pressure
- units :
- m2 s-2
Array Chunk Bytes 204 B 204 B Shape (51,) (51,) Count 2 Tasks 1 Chunks Type float32 numpy.ndarray - XC(lat_c, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- longitude
- standard_name :
- longitude
- units :
- degrees_east
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - XG(lat_g, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YG XG
- long_name :
- longitude
- standard_name :
- longitude_at_f_location
- units :
- degrees_east
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - YC(lat_c, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- latitude
- standard_name :
- latitude
- units :
- degrees_north
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - YG(lat_g, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- long_name :
- latitude
- standard_name :
- latitude_at_f_location
- units :
- degrees_north
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - Z(Z)float32-5.0 -15.0 ... -5.906e+03
- long_name :
- vertical coordinate of cell center
- positive :
- down
- standard_name :
- depth
- units :
- m
- axis :
- Z
array([-5.000000e+00, -1.500000e+01, -2.500000e+01, -3.500000e+01, -4.500000e+01, -5.500000e+01, -6.500000e+01, -7.500500e+01, -8.502500e+01, -9.509500e+01, -1.053100e+02, -1.158700e+02, -1.271500e+02, -1.397400e+02, -1.544700e+02, -1.724000e+02, -1.947350e+02, -2.227100e+02, -2.574700e+02, -2.999300e+02, -3.506800e+02, -4.099300e+02, -4.774700e+02, -5.527100e+02, -6.347350e+02, -7.224000e+02, -8.144700e+02, -9.097400e+02, -1.007155e+03, -1.105905e+03, -1.205535e+03, -1.306205e+03, -1.409150e+03, -1.517095e+03, -1.634175e+03, -1.765135e+03, -1.914150e+03, -2.084035e+03, -2.276225e+03, -2.491250e+03, -2.729250e+03, -2.990250e+03, -3.274250e+03, -3.581250e+03, -3.911250e+03, -4.264250e+03, -4.640250e+03, -5.039250e+03, -5.461250e+03, -5.906250e+03], dtype=float32)
- Zl(Zl)float320.0 -10.0 ... -5.244e+03 -5.678e+03
- long_name :
- vertical coordinate of upper cell interface
- positive :
- down
- standard_name :
- depth_at_upper_w_location
- units :
- m
- axis :
- Z
- c_grid_axis_shift :
- -0.5
array([ 0. , -10. , -20. , -30. , -40. , -50. , -60. , -70. , -80.01, -90.04, -100.15, -110.47, -121.27, -133.03, -146.45, -162.49, -182.31, -207.16, -238.26, -276.68, -323.18, -378.18, -441.68, -513.26, -592.16, -677.31, -767.49, -861.45, -958.03, -1056.28, -1155.53, -1255.54, -1356.87, -1461.43, -1572.76, -1695.59, -1834.68, -1993.62, -2174.45, -2378. , -2604.5 , -2854. , -3126.5 , -3422. , -3740.5 , -4082. , -4446.5 , -4834. , -5244.5 , -5678. ], dtype=float32)
- Zp1(Zp1)float320.0 -10.0 ... -5.678e+03 -6.134e+03
- long_name :
- vertical coordinate of cell interface
- positive :
- down
- standard_name :
- depth_at_w_location
- units :
- m
- axis :
- Z
- c_grid_axis_shift :
- [-0.5, 0.5]
array([ 0. , -10. , -20. , -30. , -40. , -50. , -60. , -70. , -80.01, -90.04, -100.15, -110.47, -121.27, -133.03, -146.45, -162.49, -182.31, -207.16, -238.26, -276.68, -323.18, -378.18, -441.68, -513.26, -592.16, -677.31, -767.49, -861.45, -958.03, -1056.28, -1155.53, -1255.54, -1356.87, -1461.43, -1572.76, -1695.59, -1834.68, -1993.62, -2174.45, -2378. , -2604.5 , -2854. , -3126.5 , -3422. , -3740.5 , -4082. , -4446.5 , -4834. , -5244.5 , -5678. , -6134.5 ], dtype=float32)
- Zu(Zu)float32-10.0 -20.0 ... -6.134e+03
- long_name :
- vertical coordinate of lower cell interface
- positive :
- down
- standard_name :
- depth_at_lower_w_location
- units :
- m
- axis :
- Z
- c_grid_axis_shift :
- 0.5
array([ -10. , -20. , -30. , -40. , -50. , -60. , -70. , -80.01, -90.04, -100.15, -110.47, -121.27, -133.03, -146.45, -162.49, -182.31, -207.16, -238.26, -276.68, -323.18, -378.18, -441.68, -513.26, -592.16, -677.31, -767.49, -861.45, -958.03, -1056.28, -1155.53, -1255.54, -1356.87, -1461.43, -1572.76, -1695.59, -1834.68, -1993.62, -2174.45, -2378. , -2604.5 , -2854. , -3126.5 , -3422. , -3740.5 , -4082. , -4446.5 , -4834. , -5244.5 , -5678. , -6134.5 ], dtype=float32)
- basins(lat_c, lon_c)int16dask.array<chunksize=(60, 90), meta=np.ndarray>
Array Chunk Bytes 168.75 kiB 15.82 kiB Shape (240, 360) (90, 90) Count 86 Tasks 12 Chunks Type int16 numpy.ndarray - drC(Zp1)float32dask.array<chunksize=(51,), meta=np.ndarray>
- long_name :
- cell z size
- standard_name :
- cell_z_size_at_w_location
- units :
- m
Array Chunk Bytes 204 B 204 B Shape (51,) (51,) Count 2 Tasks 1 Chunks Type float32 numpy.ndarray - drF(Z)float32dask.array<chunksize=(50,), meta=np.ndarray>
- long_name :
- cell z size
- standard_name :
- cell_z_size
- units :
- m
Array Chunk Bytes 200 B 200 B Shape (50,) (50,) Count 2 Tasks 1 Chunks Type float32 numpy.ndarray - hFacC(Z, lat_c, lon_c)float32dask.array<chunksize=(50, 60, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction
Array Chunk Bytes 16.48 MiB 1.54 MiB Shape (50, 240, 360) (50, 90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - hFacS(Z, lat_g, lon_c)float32dask.array<chunksize=(50, 60, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction_at_v_location
Array Chunk Bytes 16.48 MiB 1.54 MiB Shape (50, 240, 360) (50, 90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - hFacW(Z, lat_c, lon_g)float32dask.array<chunksize=(50, 60, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction_at_u_location
Array Chunk Bytes 16.48 MiB 1.54 MiB Shape (50, 240, 360) (50, 90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - iter(time)int64dask.array<chunksize=(1,), meta=np.ndarray>
- long_name :
- model timestep number
- standard_name :
- timestep
Array Chunk Bytes 2.25 kiB 8 B Shape (288,) (1,) Count 289 Tasks 288 Chunks Type int64 numpy.ndarray - iter_snp(time_snp)int64dask.array<chunksize=(1,), meta=np.ndarray>
- long_name :
- model timestep number
- standard_name :
- timestep
Array Chunk Bytes 2.24 kiB 8 B Shape (287,) (1,) Count 288 Tasks 287 Chunks Type int64 numpy.ndarray - rA(lat_c, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- cell area
- standard_name :
- cell_area
- units :
- m2
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - rAs(lat_g, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- long_name :
- cell area
- standard_name :
- cell_area_at_v_location
- units :
- m2
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - rAw(lat_c, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YG XC
- long_name :
- cell area
- standard_name :
- cell_area_at_u_location
- units :
- m2
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - rAz(lat_g, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YG XG
- long_name :
- cell area
- standard_name :
- cell_area_at_f_location
- units :
- m
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 74 Tasks 12 Chunks Type float32 numpy.ndarray - dxC(lat_c, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YC XG
- long_name :
- cell x size
- standard_name :
- cell_x_size_at_u_location
- units :
- m
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 76 Tasks 12 Chunks Type float32 numpy.ndarray - dyC(lat_g, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YG XC
- long_name :
- cell y size
- standard_name :
- cell_y_size_at_v_location
- units :
- m
Array Chunk Bytes 337.50 kiB 31.29 kiB Shape (240, 360) (89, 90) Count 159 Tasks 20 Chunks Type float32 numpy.ndarray - dyG(lat_c, lon_g)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YC XG
- long_name :
- cell y size
- standard_name :
- cell_y_size_at_u_location
- units :
- m
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 76 Tasks 12 Chunks Type float32 numpy.ndarray - dxG(lat_g, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
- coordinate :
- YG XC
- long_name :
- cell x size
- standard_name :
- cell_x_size_at_v_location
- units :
- m
Array Chunk Bytes 337.50 kiB 31.29 kiB Shape (240, 360) (89, 90) Count 159 Tasks 20 Chunks Type float32 numpy.ndarray - lon_c(lon_c)float32-37.5 -36.5 -35.5 ... 320.5 321.5
- coordinate :
- YC XC
- long_name :
- longitude
- standard_name :
- longitude
- units :
- degrees_east
- axis :
- X
array([-37.5, -36.5, -35.5, ..., 319.5, 320.5, 321.5], dtype=float32)
- lon_g(lon_g)float32-38.0 -37.0 -36.0 ... 320.0 321.0
- coordinate :
- YG XG
- long_name :
- longitude
- standard_name :
- longitude_at_f_location
- units :
- degrees_east
- axis :
- X
- c_grid_axis_shift :
- -0.5
array([-38., -37., -36., ..., 319., 320., 321.], dtype=float32)
- lat_c(lat_c)float32-81.46 -81.13 -80.8 ... 67.34 67.47
- coordinate :
- YC XC
- long_name :
- latitude
- standard_name :
- latitude
- units :
- degrees_north
- axis :
- Y
array([-81.46223, -81.13084, -80.79505, ..., 67.16407, 67.33552, 67.47211], dtype=float32)
- lat_g(lat_g)float32-81.61 -81.28 -80.95 ... 67.25 67.4
- long_name :
- latitude
- standard_name :
- latitude_at_f_location
- units :
- degrees_north
- axis :
- Y
- c_grid_axis_shift :
- -0.5
array([-81.61184 , -81.283295, -80.95029 , ..., 67.06448 , 67.24895 , 67.40169 ], dtype=float32)
- ADVr_SLT(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Advective Flux of Salinity
- standard_name :
- ADVr_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - ADVr_TH(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Advective Flux of Pot.Temperature
- standard_name :
- ADVr_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - DFrE_SLT(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Diffusive Flux of Salinity (Explicit part)
- standard_name :
- DFrE_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - DFrE_TH(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Diffusive Flux of Pot.Temperature (Explicit part)
- standard_name :
- DFrE_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - DFrI_SLT(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Diffusive Flux of Salinity (Implicit part)
- standard_name :
- DFrI_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - DFrI_TH(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Diffusive Flux of Pot.Temperature (Implicit part)
- standard_name :
- DFrI_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - ETAN(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- Surface Height Anomaly
- standard_name :
- ETAN
- units :
- m
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - ETAN_snp(time_snp, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- Surface Height Anomaly
- standard_name :
- ETAN
- units :
- m
Array Chunk Bytes 94.59 MiB 31.64 kiB Shape (287, 240, 360) (1, 90, 90) Count 20952 Tasks 3444 Chunks Type float32 numpy.ndarray - GEOFLX(lat_c, lon_c)float32dask.array<chunksize=(60, 90), meta=np.ndarray>
Array Chunk Bytes 337.50 kiB 31.64 kiB Shape (240, 360) (90, 90) Count 75 Tasks 12 Chunks Type float32 numpy.ndarray - MXLDEPTH(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- coordinates :
- SN dt iter XC Depth YC CS rA
- long_name :
- Mixed-Layer Depth (>0)
- standard_name :
- MXLDEPTH
- units :
- m
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 24481 Tasks 3456 Chunks Type float32 numpy.ndarray - SALT(time, Z, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Salinity
- standard_name :
- SALT
- units :
- psu
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - SALT_snp(time_snp, Z, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Salinity
- standard_name :
- SALT
- units :
- psu
Array Chunk Bytes 4.62 GiB 1.54 MiB Shape (287, 50, 240, 360) (1, 50, 90, 90) Count 20952 Tasks 3444 Chunks Type float32 numpy.ndarray - SFLUX(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- total salt flux (match salt-content variations), >0 increases salt
- standard_name :
- SFLUX
- units :
- g/m^2/s
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - TFLUX(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- total heat flux (match heat-content variations), >0 increases theta
- standard_name :
- TFLUX
- units :
- W/m^2
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - THETA(time, Z, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Potential Temperature
- standard_name :
- THETA
- units :
- degC
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - THETA_snp(time_snp, Z, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Potential Temperature
- standard_name :
- THETA
- units :
- degC
Array Chunk Bytes 4.62 GiB 1.54 MiB Shape (287, 50, 240, 360) (1, 50, 90, 90) Count 20952 Tasks 3444 Chunks Type float32 numpy.ndarray - WVELMASS(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Vertical Mass-Weighted Comp of Velocity
- standard_name :
- WVELMASS
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - WVELSTAR(time, Zl, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- coordinates :
- Zl SN dt iter XC Depth YC CS rA
- long_name :
- Vertical Component of Bolus Velocity
- standard_name :
- WVELSTAR
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 24481 Tasks 3456 Chunks Type float32 numpy.ndarray - oceFWflx(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- net surface Fresh-Water flux into the ocean (+=down), >0 decreases salinity
- standard_name :
- oceFWflx
- units :
- kg/m^2/s
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - oceQsw(time, lat_c, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- long_name :
- net Short-Wave radiation (+=down), >0 increases theta
- standard_name :
- oceQsw
- units :
- W/m^2
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - oceSPtnd(time, Z, lat_c, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- salt tendency due to salt plume flux >0 increases salinity
- standard_name :
- oceSPtnd
- units :
- g/m^2/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21025 Tasks 3456 Chunks Type float32 numpy.ndarray - ADVx_SLT(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Zonal Advective Flux of Salinity
- mate :
- ADVy_SLT
- standard_name :
- ADVx_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21314 Tasks 3456 Chunks Type float32 numpy.ndarray - ADVy_SLT(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Meridional Advective Flux of Salinity
- mate :
- ADVx_SLT
- standard_name :
- ADVy_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 47522 Tasks 5760 Chunks Type float32 numpy.ndarray - ADVx_TH(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Zonal Advective Flux of Pot.Temperature
- mate :
- ADVy_TH
- standard_name :
- ADVx_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21314 Tasks 3456 Chunks Type float32 numpy.ndarray - ADVy_TH(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Meridional Advective Flux of Pot.Temperature
- mate :
- ADVx_TH
- standard_name :
- ADVy_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 47522 Tasks 5760 Chunks Type float32 numpy.ndarray - DFxE_SLT(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Zonal Diffusive Flux of Salinity
- mate :
- DFyE_SLT
- standard_name :
- DFxE_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21314 Tasks 3456 Chunks Type float32 numpy.ndarray - DFyE_SLT(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Meridional Diffusive Flux of Salinity
- mate :
- DFxE_SLT
- standard_name :
- DFyE_SLT
- units :
- psu.m^3/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 47522 Tasks 5760 Chunks Type float32 numpy.ndarray - DFxE_TH(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Zonal Diffusive Flux of Pot.Temperature
- mate :
- DFyE_TH
- standard_name :
- DFxE_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21314 Tasks 3456 Chunks Type float32 numpy.ndarray - DFyE_TH(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Meridional Diffusive Flux of Pot.Temperature
- mate :
- DFxE_TH
- standard_name :
- DFyE_TH
- units :
- degC.m^3/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 47522 Tasks 5760 Chunks Type float32 numpy.ndarray - UVELMASS(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Zonal Mass-Weighted Comp of Velocity (m/s)
- mate :
- VVELMASS
- standard_name :
- UVELMASS
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 21314 Tasks 3456 Chunks Type float32 numpy.ndarray - VVELMASS(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- long_name :
- Meridional Mass-Weighted Comp of Velocity (m/s)
- mate :
- UVELMASS
- standard_name :
- VVELMASS
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 47522 Tasks 5760 Chunks Type float32 numpy.ndarray - UVELSTAR(time, Z, lat_c, lon_g)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- coordinates :
- hFacW dt PHrefC Z iter dxC drF rAw dyG
- long_name :
- Zonal Component of Bolus Velocity
- mate :
- VVELSTAR
- standard_name :
- UVELSTAR
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.54 MiB Shape (288, 50, 240, 360) (1, 50, 90, 90) Count 28226 Tasks 3456 Chunks Type float32 numpy.ndarray - VVELSTAR(time, Z, lat_g, lon_c)float32dask.array<chunksize=(1, 50, 60, 90), meta=np.ndarray>
- coordinates :
- dt PHrefC Z iter dxG rAs hFacS dyC drF
- long_name :
- Meridional Component of Bolus Velocity
- mate :
- UVELSTAR
- standard_name :
- VVELSTAR
- units :
- m/s
Array Chunk Bytes 4.63 GiB 1.53 MiB Shape (288, 50, 240, 360) (1, 50, 89, 90) Count 54434 Tasks 5760 Chunks Type float32 numpy.ndarray - oceTAUX(time, lat_c, lon_g)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- coordinates :
- dt iter dxC rAw dyG
- long_name :
- zonal surface wind stress, >0 increases uVel
- mate :
- oceTAUY
- standard_name :
- oceTAUX
- units :
- N/m^2
Array Chunk Bytes 94.92 MiB 31.64 kiB Shape (288, 240, 360) (1, 90, 90) Count 28226 Tasks 3456 Chunks Type float32 numpy.ndarray - oceTAUY(time, lat_g, lon_c)float32dask.array<chunksize=(1, 60, 90), meta=np.ndarray>
- coordinates :
- dt dxG iter rAs dyC
- long_name :
- meridional surf. wind stress, >0 increases vVel
- mate :
- oceTAUX
- standard_name :
- oceTAUY
- units :
- N/m^2
Array Chunk Bytes 94.92 MiB 31.29 kiB Shape (288, 240, 360) (1, 89, 90) Count 54434 Tasks 5760 Chunks Type float32 numpy.ndarray
try:
ds_bt = xr.open_dataset("tmp_data/ECCO_barotropic_velocity.nc")
U_bt = ds_bt.U_bt
V_bt = ds_bt.V_bt
except FileNotFoundError:
U_bt = (ds.UVELMASS * ds.drF).sum('Z')
V_bt = (ds.VVELMASS * ds.drF).sum('Z')
cluster.scale(10)
with cluster.get_client():
U_bt.load()
V_bt.load()
cluster.scale(0)
ds_tmp = xr.merge([U_bt.rename('U_bt'), V_bt.rename('V_bt')])
ds_tmp.to_netcdf("tmp_data/ECCO_barotropic_velocity.nc")
U_bt
<xarray.DataArray 'U_bt' (time: 288, lat_c: 240, lon_g: 360)> [24883200 values with dtype=float32] Coordinates: i_g (lon_g) int64 0 1 2 3 4 5 6 7 8 ... 352 353 354 355 356 357 358 359 j (lat_c) int64 30 31 32 33 34 35 36 ... 263 264 265 266 267 268 269 * time (time) datetime64[ns] 1992-01-15 1992-02-13 ... 2015-12-14 iter (time) int64 732 1428 2172 2892 ... 208164 208908 209628 210360 rAw (lat_c, lon_g) float32 7.659e+08 7.671e+08 ... 3.766e+08 1.931e+08 dxC (lat_c, lon_g) float32 2.072e+04 2.071e+04 ... 2.25e+04 1.812e+04 dyG (lat_c, lon_g) float32 3.697e+04 3.704e+04 ... 1.971e+04 1.597e+04 * lon_g (lon_g) float32 -38.0 -37.0 -36.0 -35.0 ... 318.0 319.0 320.0 321.0 * lat_c (lat_c) float32 -81.46 -81.13 -80.8 -80.45 ... 67.16 67.34 67.47
- time: 288
- lat_c: 240
- lon_g: 360
- ...
[24883200 values with dtype=float32]
- i_g(lon_g)int64...
- axis :
- X
- c_grid_axis_shift :
- -0.5
- long_name :
- x-dimension of the u grid
- standard_name :
- x_grid_index_at_u_location
- swap_dim :
- XG
array([ 0, 1, 2, ..., 357, 358, 359])
- j(lat_c)int64...
- axis :
- Y
- long_name :
- y-dimension of the t grid
- standard_name :
- y_grid_index
- swap_dim :
- YC
array([ 30, 31, 32, ..., 267, 268, 269])
- time(time)datetime64[ns]1992-01-15 ... 2015-12-14
- axis :
- T
- long_name :
- Time
- standard_name :
- time
array(['1992-01-15T00:00:00.000000000', '1992-02-13T00:00:00.000000000', '1992-03-15T00:00:00.000000000', ..., '2015-10-15T00:00:00.000000000', '2015-11-14T00:00:00.000000000', '2015-12-14T00:00:00.000000000'], dtype='datetime64[ns]')
- iter(time)int64...
- long_name :
- model timestep number
- standard_name :
- timestep
array([ 732, 1428, 2172, ..., 208908, 209628, 210360])
- rAw(lat_c, lon_g)float32...
- coordinate :
- YG XC
- long_name :
- cell area
- standard_name :
- cell_area_at_u_location
- units :
- m2
array([[7.658765e+08, 7.671201e+08, 7.682600e+08, ..., 7.739473e+08, 7.754567e+08, 7.768595e+08], [7.893769e+08, 7.906239e+08, 7.917670e+08, ..., 7.978592e+08, 7.993736e+08, 8.007812e+08], [8.137284e+08, 8.149812e+08, 8.161300e+08, ..., 8.226221e+08, 8.241446e+08, 8.255601e+08], ..., [4.798101e+08, 5.111016e+08, 5.875418e+08, ..., 5.941027e+08, 4.923795e+08, 4.205797e+08], [3.358812e+08, 3.904717e+08, 5.007964e+08, ..., 5.323239e+08, 4.009158e+08, 2.800269e+08], [1.736957e+08, 2.921858e+08, 4.447714e+08, ..., 5.268568e+08, 3.766032e+08, 1.930606e+08]], dtype=float32)
- dxC(lat_c, lon_g)float32...
- coordinate :
- YC XG
- long_name :
- cell x size
- standard_name :
- cell_x_size_at_u_location
- units :
- m
array([[20715.676, 20707.52 , 20699.928, ..., 20743.303, 20733.596, 20724.377], [21095.637, 21086.865, 21078.715, ..., 21125.434, 21114.947, 21105.006], [21490.021, 21480.656, 21471.963, ..., 21521.916, 21510.676, 21500.035], ..., [23317.729, 24046.441, 25751.87 , ..., 27725.76 , 25751.87 , 24046.441], [19590.729, 21062.102, 23828.547, ..., 26457.6 , 23828.547, 21062.102], [14067.07 , 18116.71 , 22498.332, ..., 25686.383, 22498.332, 18116.71 ]], dtype=float32)
- dyG(lat_c, lon_g)float32...
- coordinate :
- YC XG
- long_name :
- cell y size
- standard_name :
- cell_y_size_at_u_location
- units :
- m
array([[36969.367, 37043.984, 37112.633, ..., 36709.71 , 36802.23 , 36888.78 ], [37417.46 , 37492.16 , 37560.887, ..., 37157.582, 37250.168, 37336.797], [37863.902, 37938.73 , 38007.586, ..., 37603.613, 37696.336, 37783.1 ], ..., [20508.13 , 21199.861, 22779.795, ..., 24591.26 , 22779.795, 21199.861], [16981.354, 18448.256, 20970.678, ..., 23327.838, 20970.678, 18448.256], [10930.409, 15965.378, 19713.574, ..., 22499.89 , 19713.574, 15965.378]], dtype=float32)
- lon_g(lon_g)float32-38.0 -37.0 -36.0 ... 320.0 321.0
- coordinate :
- YG XG
- long_name :
- longitude
- standard_name :
- longitude_at_f_location
- units :
- degrees_east
- axis :
- X
- c_grid_axis_shift :
- -0.5
array([-38., -37., -36., ..., 319., 320., 321.], dtype=float32)
- lat_c(lat_c)float32-81.46 -81.13 -80.8 ... 67.34 67.47
- coordinate :
- YC XC
- long_name :
- latitude
- standard_name :
- latitude
- units :
- degrees_north
- axis :
- Y
array([-81.46223, -81.13084, -80.79505, ..., 67.16407, 67.33552, 67.47211], dtype=float32)
grid = xgcm.Grid(ds, periodic=['X'])
rA = ds.rA.compute()
vol_flux_convergence_U = - (grid.diff(U_bt * U_bt.dyG, 'X', boundary='extend') / rA).fillna(0)
vol_flux_convergence_V = - (grid.diff(V_bt * V_bt.dxG, 'Y', boundary='extend') / rA).fillna(0)
vol_flux_convergence = vol_flux_convergence_V + vol_flux_convergence_U
rho0 = 1029.
vol_flux_surface = (ds.oceFWflx.compute()/rho0)
big_plot = (vol_flux_convergence_U.hvplot.quadmesh('lon_c', 'lat_c', clim=(-1e-4, 1e-4), cmap='RdBu_r', label='Zonal_Flux_Convergence') +
vol_flux_convergence_V.hvplot.quadmesh('lon_c', 'lat_c', clim=(-1e-4, 1e-4), cmap='RdBu_r', label='Meridional_Flux_Convergence') +
vol_flux_convergence.hvplot.quadmesh('lon_c', 'lat_c', clim=(-1e-7, 1e-7), cmap='RdBu_r', label='Total_Lateral_Flux_Convergence') +
vol_flux_surface.hvplot.quadmesh('lon_c', 'lat_c', clim=(-1e-7, 1e-7), cmap='RdBu_r', label='Surface_Flux')
).opts(shared_axes=False, width=400).cols(2)
Testing “Rigid Lid” Approximation¶
Below we examine the two ocean transport terms in depth-integrated continuity equation individually, and then summed together and compared with the surface volume flux.
This demonstrates the high degree of cancelation between the transport terms; their sum, mostly balanced by \(E - P - R\) is more than three order of magnitude smaller than each term individually.
big_plot