Use seaduck.OceInterp
with ECCO#
seaduck
Lagrangian particle demonstration. This version uses a reduced version of the ECCO MITgcm velocity field data.
authors: Wenrui Jiang, Tom Haine Feb ‘23
Show code cell source
Hide code cell source
import cartopy.crs as ccrs
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import seaduck as sd
mpl.rcParams["figure.dpi"] = 300
Loading Dataset#
The ECCO MITgcm run is a low-resolution global state estimate(Forget et al, 2015). An artifact of note is that this dataset has complex grid topology, which means there is a face
(also called tile) dimension in the dataset.
A built-in function in seaduck.utils
can help access the snippet of ECCO that this example is based on. The grid of this dataset is the same as the original dataset, while all other variables are synthetic.
ecco = sd.utils.get_dataset("ecco")
ecco
<xarray.Dataset> Size: 1GB Dimensions: (Z: 50, face: 13, Y: 90, Xp1: 90, Yp1: 90, X: 90, Zl: 50, Zp1: 51, Zu: 50, time: 3, nv: 2, time_midp: 2) Coordinates: (12/42) CS (face, Y, X) float32 421kB dask.array<chunksize=(13, 90, 90), meta=np.ndarray> Depth (face, Y, X) float32 421kB dask.array<chunksize=(13, 90, 90), meta=np.ndarray> HFacC (Z, face, Y, X) float32 21MB dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray> HFacS (Z, face, Yp1, X) float32 21MB dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray> HFacW (Z, face, Y, Xp1) float32 21MB dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray> PHrefC (Z) float32 200B dask.array<chunksize=(50,), meta=np.ndarray> ... ... rAw (face, Y, Xp1) float32 421kB dask.array<chunksize=(13, 90, 90), meta=np.ndarray> rAz (face, Yp1, Xp1) float32 421kB dask.array<chunksize=(13, 90, 90), meta=np.ndarray> * time (time) datetime64[ns] 24B 1992-01-16T12:00:00 ... 1992-03-16T1... time_bnds (time, nv) datetime64[ns] 48B dask.array<chunksize=(3, 2), meta=np.ndarray> * time_midp (time_midp) datetime64[ns] 16B 1992-01-31T12:00:00 1992-03-01T... timestep (time) int64 24B dask.array<chunksize=(1,), meta=np.ndarray> Dimensions without coordinates: nv Data variables: (12/13) UVELMASS1 (Z, face, Y, Xp1) float16 11MB dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray> VVELMASS1 (Z, face, Yp1, X) float16 11MB dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray> WVELMASS1 (Zl, face, Y, X) float16 11MB dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray> UVELMASS (time, Z, face, Y, Xp1) float64 126MB 0.0 0.0 0.0 ... 0.0 0.0 0.0 WVELMASS (time, Zl, face, Y, X) float64 126MB 0.0 0.0 0.0 ... 0.0 0.0 0.0 VVELMASS (time, Z, face, Yp1, X) float64 126MB 0.0 0.0 0.0 ... 0.0 0.0 0.0 ... ... SALT_snap (time_midp, Z, face, Y, X) float64 84MB 31.5 31.61 ... 82.64 82.5 ETAN (time, face, Y, X) float64 3MB -0.01716 -0.0167 ... -0.05147 ETAN_snap (time_midp, face, Y, X) float64 2MB -0.02574 ... -0.04289 utrans (time, Z, face, Y, Xp1) float64 126MB dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray> vtrans (time, Z, face, Yp1, X) float64 126MB dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray> wtrans (time, Zl, face, Y, X) float64 126MB dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray> Attributes: (12/16) OceanSpy_description: ECCO v4r4 3D dataset, ocean simulations on LL... OceanSpy_face_connections: {'face': {0: {'X': ((12, 'Y', False), (3, 'X'... OceanSpy_grid_coords: {'Y': {'Y': None, 'Yp1': -0.5}, 'X': {'X': No... OceanSpy_name: ECCO_v4r4 OceanSpy_parameters: {'rSphere': 6371.0, 'eq_state': 'jmd95', 'rho... date_created: Mon Dec 30 11:13:26 2019 ... ... geospatial_vertical_max: -5.0 geospatial_vertical_min: -5906.25 nx: 90 ny: 90 nz: 50 title: ECCOv4 MITgcm grid information
- Z: 50
- face: 13
- Y: 90
- Xp1: 90
- Yp1: 90
- X: 90
- Zl: 50
- Zp1: 51
- Zu: 50
- time: 3
- nv: 2
- time_midp: 2
- CS(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- AngleCS
- units :
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - Depth(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- XC YC
- long_name :
- ocean depth
- standard_name :
- ocean_depth
- units :
- m
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - HFacC(Z, face, Y, X)float32dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction
- units :
Array Chunk Bytes 20.08 MiB 20.08 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - HFacS(Z, face, Yp1, X)float32dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction_at_v_location
- units :
Array Chunk Bytes 20.08 MiB 20.08 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - HFacW(Z, face, Y, Xp1)float32dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- vertical fraction of open cell
- standard_name :
- cell_vertical_fraction_at_u_location
- units :
Array Chunk Bytes 20.08 MiB 20.08 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data 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,) Dask graph 1 chunks in 2 graph layers Data 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,) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - SN(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- AngleSN
- units :
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - X(X)int640 1 2 3 4 5 6 ... 84 85 86 87 88 89
- axis :
- X
- long_name :
- x-dimension of the t grid
- swap_dim :
- XC
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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])
- XC(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- longitude
- units :
- degrees_east
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - XG(face, Yp1, Xp1)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YG XG
- long_name :
- longitude
- units :
- degrees_east
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - Xp1(Xp1)int640 1 2 3 4 5 6 ... 84 85 86 87 88 89
- axis :
- X
- c_grid_axis_shift :
- -0.5
- long_name :
- x-dimension of the u grid
- swap_dim :
- XG
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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])
- Y(Y)int640 1 2 3 4 5 6 ... 84 85 86 87 88 89
- axis :
- Y
- long_name :
- y-dimension of the t grid
- swap_dim :
- YC
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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])
- YC(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- latitude
- units :
- degrees_north
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - YG(face, Yp1, Xp1)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- long_name :
- latitude
- units :
- degrees_north
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - Yp1(Yp1)int640 1 2 3 4 5 6 ... 84 85 86 87 88 89
- axis :
- Y
- c_grid_axis_shift :
- -0.5
- long_name :
- y-dimension of the v grid
- swap_dim :
- YG
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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89])
- Z(Z)float32-5.0 -15.0 ... -5.906e+03
- long_name :
- vertical coordinate of cell center
- positive :
- down
- standard_name :
- depth
- units :
- m
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_lower_w_location
- units :
- m
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
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_upper_w_location
- units :
- m
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)
- 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,) Dask graph 1 chunks in 2 graph layers Data 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,) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - dxC(face, Y, Xp1)float32dask.array<chunksize=(13, 90, 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 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - dxG(face, Yp1, X)float32dask.array<chunksize=(13, 90, 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 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - dyC(face, Yp1, X)float32dask.array<chunksize=(13, 90, 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 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - dyG(face, Y, Xp1)float32dask.array<chunksize=(13, 90, 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 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - face(face)int640 1 2 3 4 5 6 7 8 9 10 11 12
- long_name :
- index of llc grid tile
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
- k(Z)int64dask.array<chunksize=(50,), meta=np.ndarray>
- axis :
- Z
- long_name :
- z-dimension of the t grid
- swap_dim :
- Z
Array Chunk Bytes 400 B 400 B Shape (50,) (50,) Dask graph 1 chunks in 2 graph layers Data type int64 numpy.ndarray - k_l(Zl)int64dask.array<chunksize=(50,), meta=np.ndarray>
- axis :
- Z
- c_grid_axis_shift :
- -0.5
- long_name :
- z-dimension of the w grid
- swap_dim :
- Zl
Array Chunk Bytes 400 B 400 B Shape (50,) (50,) Dask graph 1 chunks in 2 graph layers Data type int64 numpy.ndarray - k_p1(Zp1)int64dask.array<chunksize=(51,), meta=np.ndarray>
- axis :
- Z
- c_grid_axis_shift :
- [-0.5, 0.5]
- long_name :
- z-dimension of the w grid
- swap_dim :
- Zp1
Array Chunk Bytes 408 B 408 B Shape (51,) (51,) Dask graph 1 chunks in 2 graph layers Data type int64 numpy.ndarray - k_u(Zu)int64dask.array<chunksize=(50,), meta=np.ndarray>
- axis :
- Z
- c_grid_axis_shift :
- 0.5
- long_name :
- z-dimension of the w grid
- swap_dim :
- Zu
Array Chunk Bytes 400 B 400 B Shape (50,) (50,) Dask graph 1 chunks in 2 graph layers Data type int64 numpy.ndarray - maskC(Z, face, Y, X)int8dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- mask denoting wet point at center
- standard_name :
- sea_binary_mask_at_t_location
Array Chunk Bytes 5.02 MiB 5.02 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type int8 numpy.ndarray - maskS(Z, face, Yp1, X)int8dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- mask denoting wet point at interface
- standard_name :
- cell_vertical_fraction_at_v_location
Array Chunk Bytes 5.02 MiB 5.02 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type int8 numpy.ndarray - maskW(Z, face, Y, Xp1)int8dask.array<chunksize=(50, 13, 90, 90), meta=np.ndarray>
- long_name :
- mask denoting wet point at interface
- standard_name :
- cell_vertical_fraction_at_u_location
Array Chunk Bytes 5.02 MiB 5.02 MiB Shape (50, 13, 90, 90) (50, 13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type int8 numpy.ndarray - rA(face, Y, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YC XC
- long_name :
- cell area
- standard_name :
- cell_area
- units :
- m2
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - rAs(face, Yp1, X)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YG XC
- long_name :
- cell area
- standard_name :
- cell_area_at_v_location
- units :
- m2
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - rAw(face, Y, Xp1)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YG XC
- long_name :
- cell area
- standard_name :
- cell_area_at_u_location
- units :
- m2
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - rAz(face, Yp1, Xp1)float32dask.array<chunksize=(13, 90, 90), meta=np.ndarray>
- coordinate :
- YG XG
- long_name :
- cell area
- standard_name :
- cell_area_at_f_location
- units :
- m
Array Chunk Bytes 411.33 kiB 411.33 kiB Shape (13, 90, 90) (13, 90, 90) Dask graph 1 chunks in 2 graph layers Data type float32 numpy.ndarray - time(time)datetime64[ns]1992-01-16T12:00:00 ... 1992-03-...
- axis :
- T
- bounds :
- time_bnds
- long_name :
- center time of averaging period
array(['1992-01-16T12:00:00.000000000', '1992-02-15T12:00:00.000000000', '1992-03-16T12:00:00.000000000'], dtype='datetime64[ns]')
- time_bnds(time, nv)datetime64[ns]dask.array<chunksize=(3, 2), meta=np.ndarray>
- long_name :
- time bounds of averaging period
Array Chunk Bytes 48 B 48 B Shape (3, 2) (3, 2) Dask graph 1 chunks in 2 graph layers Data type datetime64[ns] numpy.ndarray - time_midp(time_midp)datetime64[ns]1992-01-31T12:00:00 1992-03-01T1...
- long_name :
- Mid-points of center time of averaging period
array(['1992-01-31T12:00:00.000000000', '1992-03-01T12:00:00.000000000'], dtype='datetime64[ns]')
- timestep(time)int64dask.array<chunksize=(1,), meta=np.ndarray>
- long_name :
- model timestep number
Array Chunk Bytes 24 B 8 B Shape (3,) (1,) Dask graph 3 chunks in 2 graph layers Data type int64 numpy.ndarray
- UVELMASS1(Z, face, Y, Xp1)float16dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray>
- long_name :
- X-Comp of Geometry-Weighted Velocity (m/s)
- mate :
- VVELMASS
- original_output :
- monthly mean
- standard_name :
- UVELMASS
- units :
- m/s
Array Chunk Bytes 10.04 MiB 692.14 kiB Shape (50, 13, 90, 90) (25, 7, 45, 45) Dask graph 16 chunks in 2 graph layers Data type float16 numpy.ndarray - VVELMASS1(Z, face, Yp1, X)float16dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray>
- long_name :
- Y-Comp of Geometry-Weighted Velocity (m/s)
- mate :
- UVELMASS
- original_output :
- monthly mean
- standard_name :
- VVELMASS
- units :
- m/s
Array Chunk Bytes 10.04 MiB 692.14 kiB Shape (50, 13, 90, 90) (25, 7, 45, 45) Dask graph 16 chunks in 2 graph layers Data type float16 numpy.ndarray - WVELMASS1(Zl, face, Y, X)float16dask.array<chunksize=(25, 7, 45, 45), meta=np.ndarray>
- long_name :
- Vertical Comp of Velocity (m/s)
- original_output :
- monthly mean
- standard_name :
- upward_sea_water_velocity
- units :
- m/s
Array Chunk Bytes 10.04 MiB 692.14 kiB Shape (50, 13, 90, 90) (25, 7, 45, 45) Dask graph 16 chunks in 2 graph layers Data type float16 numpy.ndarray - UVELMASS(time, Z, face, Y, Xp1)float640.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
array([[[[[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 4.12292480e-02, 3.69567871e-02, 3.78723145e-02, ..., 2.51617432e-02, 2.88391113e-02, 3.23791504e-02], [ 5.52978516e-02, 5.51452637e-02, 5.87768555e-02, ..., 3.08990479e-02, 3.22570801e-02, 3.43017578e-02], [ 7.32421875e-02, 7.67211914e-02, 8.12377930e-02, ..., 3.92761230e-02, 3.82080078e-02, 3.82690430e-02]], [[ 8.83178711e-02, 9.33837891e-02, 9.55810547e-02, ..., 4.92248535e-02, 4.67834473e-02, 4.54101562e-02], [ 8.78906250e-02, 9.29565430e-02, 9.16137695e-02, ..., 5.92651367e-02, 5.60302734e-02, 5.37109375e-02], [ 7.05566406e-02, 7.40356445e-02, 7.05566406e-02, ..., 6.74438477e-02, 6.48803711e-02, 6.26831055e-02], ... 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], [[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]]]], shape=(3, 50, 13, 90, 90))
- WVELMASS(time, Zl, face, Y, X)float640.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
array([[[[[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00], [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00], [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00]], [[-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00], [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00], [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00, ..., -0.00000000e+00, -0.00000000e+00, -0.00000000e+00], ... 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], [[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]]]], shape=(3, 50, 13, 90, 90))
- VVELMASS(time, Z, face, Yp1, X)float640.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
array([[[[[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 4.76074219e-02, 3.91235352e-02, 3.56445312e-02, ..., -7.71713257e-03, -7.88116455e-03, -7.05337524e-03], [ 5.32226562e-02, 3.98559570e-02, 3.46069336e-02, ..., -6.88171387e-03, -7.14874268e-03, -6.40487671e-03], [ 5.47485352e-02, 3.80249023e-02, 3.35083008e-02, ..., -2.93350220e-03, -4.25720215e-03, -5.00869751e-03]], [[ 5.23986816e-02, 3.51562500e-02, 3.52172852e-02, ..., 2.58636475e-03, 1.02579594e-04, -2.82096863e-03], [ 4.85229492e-02, 3.37829590e-02, 4.23889160e-02, ..., 9.02557373e-03, 5.72204590e-03, 3.54766846e-04], [ 4.43725586e-02, 3.55224609e-02, 5.53588867e-02, ..., 1.63116455e-02, 1.20391846e-02, 3.94058228e-03], ... 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], [[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]]]], shape=(3, 50, 13, 90, 90))
- SALT(time, Z, face, Y, X)float6433.0 33.06 33.12 ... 33.06 33.0
array([[[[[33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], ..., [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034]], [[33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], ... [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034]], [[33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], ..., [33.11558891, 33.05893526, 33.00000138, ..., 33.00000138, 33.05893526, 33.11558891], [33.05683374, 33.00000069, 33.05893526, ..., 33.05893526, 33.00000069, 33.05683374], [33.00000034, 33.05683374, 33.11558891, ..., 33.11558891, 33.05683374, 33.00000034]]]]], shape=(3, 50, 13, 90, 90))
- SALT_snap(time_midp, Z, face, Y, X)float6431.5 31.61 31.73 ... 82.64 82.5
array([[[[[31.50000068, 31.61366748, 31.73117781, ..., 31.73117781, 31.61366748, 31.50000068], [31.61366748, 31.50000137, 31.61787052, ..., 31.61787052, 31.50000137, 31.61366748], [31.73117781, 31.61787052, 31.50000275, ..., 31.50000275, 31.61787052, 31.73117781], ..., [31.73117781, 31.61787052, 31.50000275, ..., 31.50000275, 31.61787052, 31.73117781], [31.61366748, 31.50000137, 31.61787052, ..., 31.61787052, 31.50000137, 31.61366748], [31.50000068, 31.61366748, 31.73117781, ..., 31.73117781, 31.61366748, 31.50000068]], [[31.50000068, 31.61366748, 31.73117781, ..., 31.73117781, 31.61366748, 31.50000068], [31.61366748, 31.50000137, 31.61787052, ..., 31.61787052, 31.50000137, 31.61366748], [31.73117781, 31.61787052, 31.50000275, ..., 31.50000275, 31.61787052, 31.73117781], ... [82.78897227, 82.64733815, 82.50000344, ..., 82.50000344, 82.64733815, 82.78897227], [82.64208434, 82.50000172, 82.64733815, ..., 82.64733815, 82.50000172, 82.64208434], [82.50000084, 82.64208434, 82.78897227, ..., 82.78897227, 82.64208434, 82.50000084]], [[82.50000084, 82.64208434, 82.78897227, ..., 82.78897227, 82.64208434, 82.50000084], [82.64208434, 82.50000172, 82.64733815, ..., 82.64733815, 82.50000172, 82.64208434], [82.78897227, 82.64733815, 82.50000344, ..., 82.50000344, 82.64733815, 82.78897227], ..., [82.78897227, 82.64733815, 82.50000344, ..., 82.50000344, 82.64733815, 82.78897227], [82.64208434, 82.50000172, 82.64733815, ..., 82.64733815, 82.50000172, 82.64208434], [82.50000084, 82.64208434, 82.78897227, ..., 82.78897227, 82.64208434, 82.50000084]]]]], shape=(2, 50, 13, 90, 90))
- ETAN(time, face, Y, X)float64-0.01716 -0.0167 ... -0.05147
array([[[[-0.01715729, -0.01669768, -0.01641957, ..., -0.01641957, -0.01669768, -0.01715729], [-0.01669768, -0.01605222, -0.01558324, ..., -0.01558324, -0.01605222, -0.01669768], [-0.01641957, -0.01558324, -0.01491727, ..., -0.01491727, -0.01558324, -0.01641957], ..., [-0.01641957, -0.01558324, -0.01491727, ..., -0.01491727, -0.01558324, -0.01641957], [-0.01669768, -0.01605222, -0.01558324, ..., -0.01558324, -0.01605222, -0.01669768], [-0.01715729, -0.01669768, -0.01641957, ..., -0.01641957, -0.01669768, -0.01715729]], [[-0.01715729, -0.01669768, -0.01641957, ..., -0.01641957, -0.01669768, -0.01715729], [-0.01669768, -0.01605222, -0.01558324, ..., -0.01558324, -0.01605222, -0.01669768], [-0.01641957, -0.01558324, -0.01491727, ..., -0.01491727, -0.01558324, -0.01641957], ... [-0.04925871, -0.04674972, -0.04475182, ..., -0.04475182, -0.04674972, -0.04925871], [-0.05009303, -0.04815666, -0.04674972, ..., -0.04674972, -0.04815666, -0.05009303], [-0.05147186, -0.05009303, -0.04925871, ..., -0.04925871, -0.05009303, -0.05147186]], [[-0.05147186, -0.05009303, -0.04925871, ..., -0.04925871, -0.05009303, -0.05147186], [-0.05009303, -0.04815666, -0.04674972, ..., -0.04674972, -0.04815666, -0.05009303], [-0.04925871, -0.04674972, -0.04475182, ..., -0.04475182, -0.04674972, -0.04925871], ..., [-0.04925871, -0.04674972, -0.04475182, ..., -0.04475182, -0.04674972, -0.04925871], [-0.05009303, -0.04815666, -0.04674972, ..., -0.04674972, -0.04815666, -0.05009303], [-0.05147186, -0.05009303, -0.04925871, ..., -0.04925871, -0.05009303, -0.05147186]]]], shape=(3, 13, 90, 90))
- ETAN_snap(time_midp, face, Y, X)float64-0.02574 -0.02505 ... -0.04289
array([[[[-0.02573593, -0.02504652, -0.02462936, ..., -0.02462936, -0.02504652, -0.02573593], [-0.02504652, -0.02407833, -0.02337486, ..., -0.02337486, -0.02407833, -0.02504652], [-0.02462936, -0.02337486, -0.02237591, ..., -0.02237591, -0.02337486, -0.02462936], ..., [-0.02462936, -0.02337486, -0.02237591, ..., -0.02237591, -0.02337486, -0.02462936], [-0.02504652, -0.02407833, -0.02337486, ..., -0.02337486, -0.02407833, -0.02504652], [-0.02573593, -0.02504652, -0.02462936, ..., -0.02462936, -0.02504652, -0.02573593]], [[-0.02573593, -0.02504652, -0.02462936, ..., -0.02462936, -0.02504652, -0.02573593], [-0.02504652, -0.02407833, -0.02337486, ..., -0.02337486, -0.02407833, -0.02504652], [-0.02462936, -0.02337486, -0.02237591, ..., -0.02237591, -0.02337486, -0.02462936], ... [-0.04104893, -0.0389581 , -0.03729318, ..., -0.03729318, -0.0389581 , -0.04104893], [-0.04174419, -0.04013055, -0.0389581 , ..., -0.0389581 , -0.04013055, -0.04174419], [-0.04289322, -0.04174419, -0.04104893, ..., -0.04104893, -0.04174419, -0.04289322]], [[-0.04289322, -0.04174419, -0.04104893, ..., -0.04104893, -0.04174419, -0.04289322], [-0.04174419, -0.04013055, -0.0389581 , ..., -0.0389581 , -0.04013055, -0.04174419], [-0.04104893, -0.0389581 , -0.03729318, ..., -0.03729318, -0.0389581 , -0.04104893], ..., [-0.04104893, -0.0389581 , -0.03729318, ..., -0.03729318, -0.0389581 , -0.04104893], [-0.04174419, -0.04013055, -0.0389581 , ..., -0.0389581 , -0.04013055, -0.04174419], [-0.04289322, -0.04174419, -0.04104893, ..., -0.04104893, -0.04174419, -0.04289322]]]], shape=(2, 13, 90, 90))
- utrans(time, Z, face, Y, Xp1)float64dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray>
Array Chunk Bytes 120.51 MiB 120.51 MiB Shape (3, 50, 13, 90, 90) (3, 50, 13, 90, 90) Dask graph 1 chunks in 10 graph layers Data type float64 numpy.ndarray - vtrans(time, Z, face, Yp1, X)float64dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray>
Array Chunk Bytes 120.51 MiB 120.51 MiB Shape (3, 50, 13, 90, 90) (3, 50, 13, 90, 90) Dask graph 1 chunks in 10 graph layers Data type float64 numpy.ndarray - wtrans(time, Zl, face, Y, X)float64dask.array<chunksize=(3, 50, 13, 90, 90), meta=np.ndarray>
Array Chunk Bytes 120.51 MiB 120.51 MiB Shape (3, 50, 13, 90, 90) (3, 50, 13, 90, 90) Dask graph 1 chunks in 5 graph layers Data type float64 numpy.ndarray
- XPandasIndex
PandasIndex(Index([ 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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89], dtype='int64', name='X'))
- Xp1PandasIndex
PandasIndex(Index([ 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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89], dtype='int64', name='Xp1'))
- YPandasIndex
PandasIndex(Index([ 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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89], dtype='int64', name='Y'))
- Yp1PandasIndex
PandasIndex(Index([ 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, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89], dtype='int64', name='Yp1'))
- ZPandasIndex
PandasIndex(Index([ -5.0, -15.0, -25.0, -35.0, -45.0, -55.0, -65.0, -75.00499725341797, -85.0250015258789, -95.09500122070312, -105.30999755859375, -115.87000274658203, -127.1500015258789, -139.74000549316406, -154.47000122070312, -172.39999389648438, -194.73500061035156, -222.7100067138672, -257.4700012207031, -299.92999267578125, -350.67999267578125, -409.92999267578125, -477.4700012207031, -552.7100219726562, -634.7349853515625, -722.4000244140625, -814.469970703125, -909.739990234375, -1007.155029296875, -1105.905029296875, -1205.5350341796875, -1306.2049560546875, -1409.1500244140625, -1517.094970703125, -1634.175048828125, -1765.135009765625, -1914.1500244140625, -2084.034912109375, -2276.22509765625, -2491.25, -2729.25, -2990.25, -3274.25, -3581.25, -3911.25, -4264.25, -4640.25, -5039.25, -5461.25, -5906.25], dtype='float32', name='Z'))
- ZlPandasIndex
PandasIndex(Index([ 0.0, -10.0, -20.0, -30.0, -40.0, -50.0, -60.0, -70.0, -80.01000213623047, -90.04000091552734, -100.1500015258789, -110.47000122070312, -121.2699966430664, -133.02999877929688, -146.4499969482422, -162.49000549316406, -182.30999755859375, -207.16000366210938, -238.25999450683594, -276.67999267578125, -323.17999267578125, -378.17999267578125, -441.67999267578125, -513.260009765625, -592.1599731445312, -677.3099975585938, -767.489990234375, -861.4500122070312, -958.030029296875, -1056.280029296875, -1155.530029296875, -1255.5400390625, -1356.8699951171875, -1461.4300537109375, -1572.760009765625, -1695.5899658203125, -1834.6800537109375, -1993.6199951171875, -2174.449951171875, -2378.0, -2604.5, -2854.0, -3126.5, -3422.0, -3740.5, -4082.0, -4446.5, -4834.0, -5244.5, -5678.0], dtype='float32', name='Zl'))
- Zp1PandasIndex
PandasIndex(Index([ 0.0, -10.0, -20.0, -30.0, -40.0, -50.0, -60.0, -70.0, -80.01000213623047, -90.04000091552734, -100.1500015258789, -110.47000122070312, -121.2699966430664, -133.02999877929688, -146.4499969482422, -162.49000549316406, -182.30999755859375, -207.16000366210938, -238.25999450683594, -276.67999267578125, -323.17999267578125, -378.17999267578125, -441.67999267578125, -513.260009765625, -592.1599731445312, -677.3099975585938, -767.489990234375, -861.4500122070312, -958.030029296875, -1056.280029296875, -1155.530029296875, -1255.5400390625, -1356.8699951171875, -1461.4300537109375, -1572.760009765625, -1695.5899658203125, -1834.6800537109375, -1993.6199951171875, -2174.449951171875, -2378.0, -2604.5, -2854.0, -3126.5, -3422.0, -3740.5, -4082.0, -4446.5, -4834.0, -5244.5, -5678.0, -6134.5], dtype='float32', name='Zp1'))
- ZuPandasIndex
PandasIndex(Index([ -10.0, -20.0, -30.0, -40.0, -50.0, -60.0, -70.0, -80.01000213623047, -90.04000091552734, -100.1500015258789, -110.47000122070312, -121.2699966430664, -133.02999877929688, -146.4499969482422, -162.49000549316406, -182.30999755859375, -207.16000366210938, -238.25999450683594, -276.67999267578125, -323.17999267578125, -378.17999267578125, -441.67999267578125, -513.260009765625, -592.1599731445312, -677.3099975585938, -767.489990234375, -861.4500122070312, -958.030029296875, -1056.280029296875, -1155.530029296875, -1255.5400390625, -1356.8699951171875, -1461.4300537109375, -1572.760009765625, -1695.5899658203125, -1834.6800537109375, -1993.6199951171875, -2174.449951171875, -2378.0, -2604.5, -2854.0, -3126.5, -3422.0, -3740.5, -4082.0, -4446.5, -4834.0, -5244.5, -5678.0, -6134.5], dtype='float32', name='Zu'))
- facePandasIndex
PandasIndex(Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='int64', name='face'))
- timePandasIndex
PandasIndex(DatetimeIndex(['1992-01-16 12:00:00', '1992-02-15 12:00:00', '1992-03-16 12:00:00'], dtype='datetime64[ns]', name='time', freq=None))
- time_midpPandasIndex
PandasIndex(DatetimeIndex(['1992-01-31 12:00:00', '1992-03-01 12:00:00'], dtype='datetime64[ns]', name='time_midp', freq=None))
- OceanSpy_description :
- ECCO v4r4 3D dataset, ocean simulations on LLC90 grid (monthly mean output)
- OceanSpy_face_connections :
- {'face': {0: {'X': ((12, 'Y', False), (3, 'X', False)), 'Y': (None, (1, 'Y', False))}, 1: {'X': ((11, 'Y', False), (4, 'X', False)), 'Y': ((0, 'Y', False), (2, 'Y', False))}, 2: {'X': ((10, 'Y', False), (5, 'X', False)), 'Y': ((1, 'Y', False), (6, 'X', False))}, 3: {'X': ((0, 'X', False), (9, 'Y', False)), 'Y': (None, (4, 'Y', False))}, 4: {'X': ((1, 'X', False), (8, 'Y', False)), 'Y': ((3, 'Y', False), (5, 'Y', False))}, 5: {'X': ((2, 'X', False), (7, 'Y', False)), 'Y': ((4, 'Y', False), (6, 'Y', False))}, 6: {'X': ((2, 'Y', False), (7, 'X', False)), 'Y': ((5, 'Y', False), (10, 'X', False))}, 7: {'X': ((6, 'X', False), (8, 'X', False)), 'Y': ((5, 'X', False), (10, 'Y', False))}, 8: {'X': ((7, 'X', False), (9, 'X', False)), 'Y': ((4, 'X', False), (11, 'Y', False))}, 9: {'X': ((8, 'X', False), None), 'Y': ((3, 'X', False), (12, 'Y', False))}, 10: {'X': ((6, 'Y', False), (11, 'X', False)), 'Y': ((7, 'Y', False), (2, 'X', False))}, 11: {'X': ((10, 'X', False), (12, 'X', False)), 'Y': ((8, 'Y', False), (1, 'X', False))}, 12: {'X': ((11, 'X', False), None), 'Y': ((9, 'Y', False), (0, 'X', False))}}}
- OceanSpy_grid_coords :
- {'Y': {'Y': None, 'Yp1': -0.5}, 'X': {'X': None, 'Xp1': -0.5}, 'Z': {'Z': None, 'Zp1': 0.5, 'Zu': 0.5, 'Zl': -0.5}, 'time': {'time': -0.5, 'time_midp': None}}
- OceanSpy_name :
- ECCO_v4r4
- OceanSpy_parameters :
- {'rSphere': 6371.0, 'eq_state': 'jmd95', 'rho0': 1027, 'g': 9.81, 'eps_nh': 0, 'omega': 7.292123516990373e-05, 'c_p': 3986.0, 'tempFrz0': 0.0901, 'dTempFrz_dS': -0.0575}
- date_created :
- Mon Dec 30 11:13:26 2019
- geospatial_lat_max :
- 90.0
- geospatial_lat_min :
- -90.0
- geospatial_lon_max :
- 180.0
- geospatial_lon_min :
- -179.9991912841797
- geospatial_vertical_max :
- -5.0
- geospatial_vertical_min :
- -5906.25
- nx :
- 90
- ny :
- 90
- nz :
- 50
- title :
- ECCOv4 MITgcm grid information
Access full ECCO dataset
The ECCO dataset is publicly available on SciServer. The simulation output can be opened using the OceanSpy package with the from_catalog
method (Oceanspy is already available in the Oceanography container environment on SciServer).
Choose between the monthly-mean data (‘ECCO’)
ecco = ospy.open_oceandataset.from_catalog("ECCO")._ds
or the daily-mean data (‘daily_ecco’).
ecco = ospy.open_oceandataset.from_catalog('daily_ecco')._ds
Click here for a full list of the datasets hosted on SciServer.
Experiment setup#
Specify the parameters for the particles (number, positions, start time).
# Define the extent of the box
west = -90.0
east = 0.0
south = 23.0
north = 67.0
shallow = -10.0
deep = -10.0
time = "1992-02-15"
Nlon = 80 # How many along longitudinal direction?
Nlat = 80 # How many along latitudinal direction?
Ndep = 1 # How many along vertical direction?
x, y, z, t = sd.utils.easy_3d_cube(
(east, west, Nlon),
(south, north, Nlat),
(shallow, deep, Ndep),
time,
print_total_number=True,
)
A total of 6400 positions are defined.
Plot the particle positions
Show code cell source
Hide code cell source
ax = plt.axes(projection=ccrs.PlateCarree())
ax.plot(x, y, "ro", markersize=0.5)
ax.coastlines()
ax.set_title("Interpolation position")
plt.show()

Let’s explore seaduck.OceInterp
#
This is the most high-level function of the package. Yes, it’s very easy to use.
help(sd.OceInterp)
Show code cell output
Hide code cell output
Help on function OceInterp in module seaduck.oceinterp:
OceInterp(od, var_list, x, y, z, t, kernel_list=None, lagrangian=False, lagrange_kwarg={}, update_stops='default', return_in_between=True, return_pt_time=True, kernel_kwarg={})
Interp for people who just want to take a quick look.
**This is the centerpiece function of the package, through which
you can access almost all of its functionality.**.
Parameters
----------
od: OceInterp.OceData object or xarray.Dataset (limited support for netCDF Dataset)
The dataset to work on.
var_list: str or list
A list of variable or pair of variables.
kernel_list: OceInterp.KnW or list of OceInterp.KnW objects, optional
Indicates which kernel to use for each interpolation.
x, y, z: numpy.ndarray, float
The location of the particles, where x and y are in degrees,
and z is in meters (deeper locations are represented by more negative values).
t: numpy.ndarray, float, string/numpy.datetime64
In the Eulerian scheme, this represents the time of interpolation.
In the Lagrangian scheme, it represents the time needed for output.
lagrangian: bool, default False
Specifies whether the interpolation is done in the Eulerian or Lagrangian scheme.
lagrange_kwarg: dict, optional
Keyword arguments passed into the OceInterp.lagrangian.Particle object.
update_stops: None, 'default', or iterable of float
Specifies the time to update the prefetch velocity.
return_in_between: bool, default True
In Lagrangian mode, this returns the interpolation not only at time t,
but also at every point in time when the speed is updated.
return_pt_time: bool, default True
Specifies whether to return the time of all the steps.
kernel_kwarg: dict, optional
keyword arguments to pass into seaduck.KnW object.
Interpolate these ECCO fields at Eulerian positions.#
[s, (u, v), eta, mask] = sd.OceInterp(
ecco, ["SALT", ("UVELMASS", "VVELMASS"), "ETAN", "maskC"], x, y, z, t
)
Plot the interpolated salinity, \(u\), \(\eta\) field.
Warning
In case you haven’t notice, SALT, ETAN are purely synthetic.
Show code cell source
Hide code cell source
unit = ["psu", "m/s", "m"]
name = ["Salinity", "Zonal Velocity", "Sea Surface Height"]
for i, var in enumerate([s, u, eta]):
ax = plt.subplot(1, 3, 1 + i, projection=ccrs.PlateCarree())
c = ax.scatter(x, y, c=var, s=0.5)
ax.coastlines()
ax.set_xlim([west, east])
ax.set_ylim([south, north])
plt.colorbar(c, location="bottom", label=unit[i], pad=0.03)
ax.set_title(name[i])
plt.tight_layout()
plt.show()

The salinity and the sea surface height variable here are not model output but randomly generated noise and there are values on land as well. However, the package respects the mask provided by the model, so even though there are apparently values on land, NaNs are returned.
This is not the case for velocity. The mask for the staggered velocity field is not provided by the model, so the actual value (zero here) is returned.
Now compute Lagrangian trajectories for these particles.#
First, define the start_time
and end_time
. Here the particles are integrated backwards in time.
start_time = "1992-01-17"
end_time = "1992-03-12"
t_bnds = np.array(
[
sd.utils.convert_time(start_time),
sd.utils.convert_time(end_time),
]
)
Perform the particle trajectory simulation.#
To switch between Lagrangian and Eulerian modes, you only need to change the lagrangian
keyword argument.
The following code block simulates the trajectory and records the salinity along the particle trajectories, as well as their (lat,lon) positions.
stops, [s, raw, lat, lon] = sd.OceInterp(
ecco,
["SALT", "__particle.raw", "__particle.lat", "__particle.lon"],
x,
y,
z,
t_bnds,
lagrangian=True,
return_pt_time=True,
)
1992-01-31T12:00:00
1992-03-01T12:00:00
1992-03-12T00:00:00
There are 3 output times. See also the diagnostic output from running the integration.
len(stops)
3
The raw
output is a list of seaduck.Position
objects which stores, of course, the position of the particle at specific times.
raw
[<seaduck.lagrangian.Particle at 0x7f8dbc4922d0>,
<seaduck.lagrangian.Particle at 0x7f8dbc1b33d0>,
<seaduck.lagrangian.Particle at 0x7f8dbc067250>]
Plot the interpolated salinity field on the final particle positions.#
Show code cell source
Hide code cell source
ax = plt.axes(projection=ccrs.PlateCarree())
ax.scatter(lon[-1], lat[-1], c=s[-1], s=6)
ax.coastlines()
ax.set_xlim([-70, 0])
ax.set_ylim([30, 70])
plt.title("salinity map")
plt.show()

Calculate derivatives#
Kernel object#
The kernel
object defines which neighboring points are used for the interpolation, and also what kind of operation is conducted. The default is interpolation. However, you can also use this class to calculate derivatives.
KnW = sd.kernel_weight.KnW
help(KnW)
Show code cell output
Hide code cell output
Help on class KnW in module seaduck.kernel_weight:
class KnW(builtins.object)
| KnW(kernel=array([[ 0, 0],
| [ 0, 1],
| [ 0, 2],
| [ 0, -1],
| [ 0, -2],
| [-1, 0],
| [-2, 0],
| [ 1, 0],
| [ 2, 0]]), inheritance='auto', hkernel='interp', vkernel='nearest', tkernel='nearest', h_order=0, ignore_mask=False)
|
| Kernel object.
|
| A class that describes anything about the
| interpolation/derivative kernel to be used.
|
| Parameters
| ----------
| kernel: numpy.ndarray
| The largest horizontal kernel to be used
| inheritance: list
| The inheritance sequence of the kernels
| hkernel: str
| What to do in the horizontal direction
| 'interp', 'dx', or 'dy'?
| tkernel: str
| What kind of operation to do in the temporal dimension:
| 'linear', 'nearest' interpolation, or 'dt'
| vkernel: str
| What kind of operation to do in the vertical:
| 'linear', 'nearest' interpolation, or 'dz'
| h_order: int
| How many derivative to take in the horizontal direction.
| Zero for pure interpolation
| ignore_mask: bool
| Whether to diregard the masking of the dataset.
| You can select True if there is no
| inheritance, or if performance is a big concern.
|
| Methods defined here:
|
| __eq__(self, other)
| Return self==value.
|
| __hash__(self)
| Return hash(self).
|
| __init__(self, kernel=array([[ 0, 0],
| [ 0, 1],
| [ 0, 2],
| [ 0, -1],
| [ 0, -2],
| [-1, 0],
| [-2, 0],
| [ 1, 0],
| [ 2, 0]]), inheritance='auto', hkernel='interp', vkernel='nearest', tkernel='nearest', h_order=0, ignore_mask=False)
| Initialize self. See help(type(self)) for accurate signature.
|
| get_weight(self, rx, ry, rz=0, rt=0, pk4d=None, bottom_scheme='no flux')
| Return the weight of values given particle rel-coords.
|
| Parameters
| ----------
| rx,ry,rz,rt: numpy.ndarray
| 1D array of non-dimensional particle positions
| pk4d: list
| A mapping on which points should use which kernel.
| bottom_scheme: str
| Whether to assume there is a ghost point with same value at
| the bottom boundary.
| Choose None for vertical flux, 'no flux' for most other cases.
|
| Returns
| -------
| weight: numpy.ndarray
| The weight of interpolation/derivative for the points
| with shape (N,M),
| M is the num of node in the largest kernel.
|
| same_hsize(self, other)
| Return True if 2 KnW object has the same horizontal size.
|
| same_size(self, other)
| Return True if 2 KnW object has the same 4D size.
|
| size_hash(self)
| Produce a hash value based on the 4D size of the KnW object.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables
|
| __weakref__
| list of weak references to the object
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __slotnames__ = []
Let’s define derivative kernels for \(\partial / \partial z\), \(\partial^2 / \partial x^2\), \(\partial^2 / \partial y^2\), and \(\partial / \partial t\) as examples:
dz_kernel = KnW(vkernel="dz")
dx2_kernel = KnW(hkernel="dx", h_order=2, inheritance=None)
dy2_kernel = KnW(hkernel="dy", h_order=2, inheritance=None)
dt_kernel = KnW(tkernel="dt")
Apply the kernels to the ECCO fields:
d2edx2, d2edy2 = sd.OceInterp(
ecco, ["ETAN", "ETAN"], x, y, z, t, kernel_list=[dx2_kernel, dy2_kernel]
)
Plot one of the differentiated fields on the initial particle positions.#
laplacian = d2edx2 + d2edy2
Show code cell source
Hide code cell source
ax = plt.axes(projection=ccrs.PlateCarree())
c = ax.scatter(x, y, c=laplacian, s=5)
ax.coastlines()
plt.colorbar(c, location="bottom", label="m/s per grid scale squared")
plt.title("Laplacian of sea surface height")
plt.show()
