An Exception was encountered at ‘In [3]’.
Meridional Overturning Circulation#
%load_ext autoreload
%autoreload 2
%%capture
# comment above line to see details about the run(s) displayed
from misc import *
from mom6_tools import m6plot, m6toolbox
from mom6_tools.moc import *
import glob
%matplotlib inline
Execution using papermill encountered an exception here and stopped:
ds = []
for c, l, p in zip(casename,label, ocn_path):
dummy = xr.open_dataset(p+'{}_MOC.nc'.format(c))
ds.append(dummy)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:211, in CachingFileManager._acquire_with_cache_info(self, needs_lock)
210 try:
--> 211 file = self._cache[self._key]
212 except KeyError:
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/lru_cache.py:56, in LRUCache.__getitem__(self, key)
55 with self._lock:
---> 56 value = self._cache[key]
57 self._cache.move_to_end(key)
KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('/glade/u/home/gmarques/Notebooks/CESM_MOM6/B/b.e30_beta05.BLT1850.ne30_t232_wgx3.127/ncfiles/b.e30_beta05.BLT1850.ne30_t232_wgx3.127_MOC.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), '335981b9-6116-4b17-ba02-064e7798a6dc']
During handling of the above exception, another exception occurred:
FileNotFoundError Traceback (most recent call last)
Cell In[3], line 3
1 ds = []
2 for c, l, p in zip(casename,label, ocn_path):
----> 3 dummy = xr.open_dataset(p+'{}_MOC.nc'.format(c))
4 ds.append(dummy)
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/api.py:571, in open_dataset(filename_or_obj, engine, chunks, cache, decode_cf, mask_and_scale, decode_times, decode_timedelta, use_cftime, concat_characters, decode_coords, drop_variables, inline_array, chunked_array_type, from_array_kwargs, backend_kwargs, **kwargs)
559 decoders = _resolve_decoders_kwargs(
560 decode_cf,
561 open_backend_dataset_parameters=backend.open_dataset_parameters,
(...)
567 decode_coords=decode_coords,
568 )
570 overwrite_encoded_chunks = kwargs.pop("overwrite_encoded_chunks", None)
--> 571 backend_ds = backend.open_dataset(
572 filename_or_obj,
573 drop_variables=drop_variables,
574 **decoders,
575 **kwargs,
576 )
577 ds = _dataset_from_backend_dataset(
578 backend_ds,
579 filename_or_obj,
(...)
589 **kwargs,
590 )
591 return ds
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:645, in NetCDF4BackendEntrypoint.open_dataset(self, filename_or_obj, mask_and_scale, decode_times, concat_characters, decode_coords, drop_variables, use_cftime, decode_timedelta, group, mode, format, clobber, diskless, persist, lock, autoclose)
624 def open_dataset( # type: ignore[override] # allow LSP violation, not supporting **kwargs
625 self,
626 filename_or_obj: str | os.PathLike[Any] | BufferedIOBase | AbstractDataStore,
(...)
642 autoclose=False,
643 ) -> Dataset:
644 filename_or_obj = _normalize_path(filename_or_obj)
--> 645 store = NetCDF4DataStore.open(
646 filename_or_obj,
647 mode=mode,
648 format=format,
649 group=group,
650 clobber=clobber,
651 diskless=diskless,
652 persist=persist,
653 lock=lock,
654 autoclose=autoclose,
655 )
657 store_entrypoint = StoreBackendEntrypoint()
658 with close_on_error(store):
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:408, in NetCDF4DataStore.open(cls, filename, mode, format, group, clobber, diskless, persist, lock, lock_maker, autoclose)
402 kwargs = dict(
403 clobber=clobber, diskless=diskless, persist=persist, format=format
404 )
405 manager = CachingFileManager(
406 netCDF4.Dataset, filename, mode=mode, kwargs=kwargs
407 )
--> 408 return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:355, in NetCDF4DataStore.__init__(self, manager, group, mode, lock, autoclose)
353 self._group = group
354 self._mode = mode
--> 355 self.format = self.ds.data_model
356 self._filename = self.ds.filepath()
357 self.is_remote = is_remote_uri(self._filename)
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:417, in NetCDF4DataStore.ds(self)
415 @property
416 def ds(self):
--> 417 return self._acquire()
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:411, in NetCDF4DataStore._acquire(self, needs_lock)
410 def _acquire(self, needs_lock=True):
--> 411 with self._manager.acquire_context(needs_lock) as root:
412 ds = _nc4_require_group(root, self._group, self._mode)
413 return ds
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/contextlib.py:137, in _GeneratorContextManager.__enter__(self)
135 del self.args, self.kwds, self.func
136 try:
--> 137 return next(self.gen)
138 except StopIteration:
139 raise RuntimeError("generator didn't yield") from None
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:199, in CachingFileManager.acquire_context(self, needs_lock)
196 @contextlib.contextmanager
197 def acquire_context(self, needs_lock=True):
198 """Context manager for acquiring a file."""
--> 199 file, cached = self._acquire_with_cache_info(needs_lock)
200 try:
201 yield file
File /glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:217, in CachingFileManager._acquire_with_cache_info(self, needs_lock)
215 kwargs = kwargs.copy()
216 kwargs["mode"] = self._mode
--> 217 file = self._opener(*self._args, **kwargs)
218 if self._mode == "w":
219 # ensure file doesn't get overridden when opened again
220 self._mode = "a"
File src/netCDF4/_netCDF4.pyx:2470, in netCDF4._netCDF4.Dataset.__init__()
File src/netCDF4/_netCDF4.pyx:2107, in netCDF4._netCDF4._ensure_nc_success()
FileNotFoundError: [Errno 2] No such file or directory: '/glade/u/home/gmarques/Notebooks/CESM_MOM6/B/b.e30_beta05.BLT1850.ne30_t232_wgx3.127/ncfiles/b.e30_beta05.BLT1850.ne30_t232_wgx3.127_MOC.nc'
Global MOC#
pnum = len(ds)
varName = 'vmo'
Zmod = []
fname ='*.mom6.h.z.????-??.nc'
for i in range(pnum):
# this hack needs to be fixed
print(OUTDIR[i]+fname)
file = sorted(glob.glob(OUTDIR[i]+fname))[0:2]
ds1 = xr.open_mfdataset(file)
Zmod.append(m6toolbox.get_z(ds1, depth[i], varName))
for i in range(pnum):
m6plot.setFigureSize([16,9],576,debug=False)
axis = plt.gca()
cmap = plt.get_cmap('dunnePM')
zg = Zmod[i].min(axis=-1);
psiPlot = ds[i].moc.values
yyg = grd[i].geolat_c[:,:].max(axis=-1)+0*zg
ci=m6plot.pmCI(0.,40.,5.)
plotPsi(yyg, zg, psiPlot, ci, 'Global MOC [Sv], ' + \
'start_date:' + ds[i].start_date +' end_date:' + ds[i].end_date)
plt.xlabel(r'Latitude [$\degree$N]')
plt.suptitle(label[i])
findExtrema(yyg, zg, psiPlot, max_lat=-30.)
findExtrema(yyg, zg, psiPlot, min_lat=25., min_depth=250.)
findExtrema(yyg, zg, psiPlot, min_depth=2000., mult=-1.)
plt.gca().invert_yaxis()
Atlantic MOC#
for i in range(pnum):
basin_code = genBasinMasks(grd[i].geolon, grd[i].geolat, depth[i], xda=False);
m6plot.setFigureSize([16,9],576,debug=False)
cmap = plt.get_cmap('dunnePM')
ci=m6plot.pmCI(0.,22.,2.)
m = 0*basin_code; m[(basin_code==2) | (basin_code==4) | (basin_code==6) | (basin_code==7) | (basin_code==8)]=1
z = (m*Zmod[i]).min(axis=-1)
psiPlot = ds[i].amoc.values
yy = grd[i].geolat_c[:,:].max(axis=-1)+0*z
plotPsi(yy, z, psiPlot, ci, 'Atlantic MOC [Sv], ' + \
'start_date:' + ds[i].start_date +' end_date:' + ds[i].end_date)
plt.xlabel(r'Latitude [$\degree$N]')
plt.suptitle(label[i])
findExtrema(yy, z, psiPlot, min_lat=26.5, max_lat=27., min_depth=250.) # RAPID
findExtrema(yy, z, psiPlot, min_lat=44, max_lat=46., min_depth=250.) # RAPID
findExtrema(yy, z, psiPlot, max_lat=-33.)
findExtrema(yy, z, psiPlot)
findExtrema(yy, z, psiPlot, min_lat=5.)
plt.gca().invert_yaxis()
AMOC profile at 26N#
fig, ax = plt.subplots(figsize=(10,6))
rapid_vertical = xr.open_dataset('/glade/work/gmarques/cesm/datasets/RAPID/moc_vertical.nc')
ax.plot(rapid_vertical.stream_function_mar.mean('time'),
rapid_vertical.depth, 'k', label='RAPID', lw=3)
for i in range(pnum):
ax.plot(ds[i]['amoc'].sel(yq=26, method='nearest'), ds[i].zl, label=label[i], lw=3)
ax.legend()
plt.gca().invert_yaxis()
plt.grid()
ax.set_xlabel('AMOC @ 26N [Sv]')
ax.set_ylabel('Depth [m]');
AMOC time series#
# load RAPID time series
rapid = m6toolbox.weighted_temporal_mean_vars(xr.open_dataset('/glade/work/gmarques/cesm/datasets/RAPID/moc_transports.nc'))
# plot
fig = plt.figure(figsize=(12, 6))
for i in range(pnum):
plt.plot(np.arange(len(ds[i].time))+1. ,ds[i]['amoc_26'].values,
label=label[i], lw=3)
# rapid
plt.plot(np.arange(len(rapid.time))+46.5 ,rapid.moc_mar_hc10.values,
label='RAPID', lw=2)
plt.title('AMOC @ 26 $^o$ N', fontsize=16)
plt.ylim(5,20)
plt.xlim(0,1+len(ds[0].time))
plt.xlabel('Time [years]', fontsize=16); plt.ylabel('Sv', fontsize=16)
plt.legend(fontsize=13, ncol=2)
plt.grid()
# plot
fig = plt.figure(figsize=(12, 6))
for i in range(pnum):
plt.plot(np.arange(len(ds[i].time))+1 ,ds[i]['amoc_45'].values,
label=label[i], lw=3)
plt.title('AMOC @ 45 $^o$ N', fontsize=16)
plt.ylim(5,25)
plt.xlim(0,1+len(ds[0].time))
plt.xlabel('Time [years]', fontsize=16); plt.ylabel('Sv', fontsize=16)
plt.legend(fontsize=13, ncol=2);
plt.grid()
Submesoscale-induced Global MOC#
for i in range(pnum):
# create a ndarray subclass
class C(np.ndarray): pass
varName = 'moc_FFM'
psiPlot = np.ma.masked_invalid(ds[i][varName].values)
tmp = psiPlot[:].filled(0.)
VHmod = tmp.view(C)
VHmod.units = 'Sv'
# Global MOC
m6plot.setFigureSize([16,9],576,debug=False)
axis = plt.gca()
cmap = plt.get_cmap('dunnePM')
z = Zmod[i].min(axis=-1)
#yy = y[1:,:].max(axis=-1)+0*z
yy = grd[i].geolat_c[:,:].max(axis=-1)+0*z
ci=m6plot.pmCI(0.,40.,2.)
plotPsi(yy, z, psiPlot, ci, 'Global MOC [Sv] due to vhML', zval=[0.,-400.,-6500.])
plt.xlabel(r'Latitude [$\degree$N]')
plt.suptitle(label[i])
plt.gca().invert_yaxis()
Eddy(GM)-induced Global MOC#
for i in range(pnum):
# create a ndarray subclass
class C(np.ndarray): pass
varName = 'moc_GM'
psiPlot = np.ma.masked_invalid(ds[i][varName].values)
tmp = psiPlot[:].filled(0.)
VHmod = tmp.view(C)
VHmod.units = 'Sv'
# Global MOC
m6plot.setFigureSize([16,9],576,debug=False)
axis = plt.gca()
cmap = plt.get_cmap('dunnePM')
z = Zmod[i].min(axis=-1)
yy = grd[0].geolat_c[:,:].max(axis=-1)+0*z
ci=m6plot.pmCI(0.,20.,1.)
plotPsi(yy, z, psiPlot, ci, 'Global MOC [Sv] due to GM')
plt.xlabel(r'Latitude [$\degree$N]')
plt.suptitle(label[i])
findExtrema(yy, z, psiPlot, min_lat=-65., max_lat=-30, mult=-1.)
plt.gca().invert_yaxis()