Hello all
I am currently using two years of hourly data from a regional MITgcm model output (configuration similar to llc4320) to estimate vorticity, strain and other kinematic quantities. I am using xmitgcm and xgcm to open the datasets stored in a server:
uv = open_mdsdataset(data_dir, grid_dir, iters='all', delta_t=150,
ignore_unknown_vars=True, prefix=['diags_3D'],
ref_date="2015-01-01 2:0:0", geometry='sphericalpolar',
llc_method='smallchunks')
grid_llc = xgcm.Grid(uv, periodic=False)
I wonder if there is any way that I could just calculate for instance, relative vorticity in the first 10 Z-levels. I have tried using the following after the two lines above:
zeta = (-grid_llc.diff(uv.UVEL.isel(Z=np.arange(0, 11)) * uv.dxC, 'Y') +
grid_llc.diff(uv.VVEL.isel(Z=np.arange(0, 11)) * uv.dyC, 'X'))/ds.rAz.
However, running the code yields the error
ValueError: conflicting sizes for dimension 'Z': length 10 on <this-array> and length 90 on {'time': 'time', 'XG': 'XG', 'YG': 'YG', 'Z': 'drF'}
I would like to know if there is a way to first take a slice of the model output domain and then compute zeta, instead of computing zeta for the entire domain and Z levels, which takes up to 40 hrs.
Thanks
1 Like
Could you show the full xarray rep for uv (output of print(uv)
)?
You might try slicing uv
before passing it to Grid
.
This xgcm example also might be useful for calculating vorticity efficiently
https://xgcm.readthedocs.io/en/latest/ufunc_examples.html#vorticity
Heres the print of (uv):
<xarray.Dataset>
Dimensions: (time: 17661, Z: 90, YC: 576, XC: 672, XG: 672, YG: 576, Zl: 90,
Zp1: 91, Zu: 90)
Coordinates: (12/33)
iter (time) int64 dask.array<chunksize=(1,), meta=np.ndarray>
- time (time) datetime64[ns] 2015-12-27T03:00:00 … 2017-12-31T23:00:00
- XC (XC) >f4 230.0 230.0 230.1 230.1 230.1 … 243.9 243.9 243.9 244.0
- YC (YC) >f4 31.01 31.03 31.05 31.07 31.09 … 42.91 42.93 42.95 42.97
- XG (XG) >f4 230.0 230.0 230.0 230.1 230.1 … 243.9 243.9 243.9 244.0
- YG (YG) >f4 31.0 31.02 31.04 31.06 31.08 … 42.9 42.92 42.94 42.96
… …
maskW (Z, YC, XG) bool dask.array<chunksize=(90, 576, 672), meta=np.ndarray>
maskS (Z, YG, XC) bool dask.array<chunksize=(90, 576, 672), meta=np.ndarray>
maskInC (YC, XC) bool dask.array<chunksize=(576, 672), meta=np.ndarray>
maskInS (YG, XC) bool dask.array<chunksize=(576, 672), meta=np.ndarray>
maskInW (YC, XG) bool dask.array<chunksize=(576, 672), meta=np.ndarray>
rhoRef (Z) >f4 dask.array<chunksize=(90,), meta=np.ndarray>
Data variables:
THETA (time, Z, YC, XC) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
SALT (time, Z, YC, XC) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
UVEL (time, Z, YC, XG) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
VVEL (time, Z, YG, XC) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
WVEL (time, Zl, YC, XC) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
DRHODR (time, Zl, YC, XC) float32 dask.array<chunksize=(1, 90, 576, 672), meta=np.ndarray>
Attributes:
Conventions: CF-1.6
title: netCDF wrapper of MITgcm MDS binary data
source: MITgcm
history: Created by calling `open_mdsdataset(data_dir='/data/SO2/SWO…
Thanks Tom. I will have a look at it.
I first saved UVEL and VVEL into a new xarray dataset, then sliced the new array in XC, YC, XG, YG and Z and finally passed it to Grid. Those steps really worked for me. Thanks.
3 Likes