{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a081c1c6",
   "metadata": {
    "tags": [
     "papermill-error-cell-tag"
    ]
   },
   "source": [
    "<span style=\"color:red; font-family:Helvetica Neue, Helvetica, Arial, sans-serif; font-size:2em;\">An Exception was encountered at '<a href=\"#papermill-error-cell\">In [3]</a>'.</span>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb896a55",
   "metadata": {
    "papermill": {
     "duration": 0.004702,
     "end_time": "2025-03-26T20:45:25.488799",
     "exception": false,
     "start_time": "2025-03-26T20:45:25.484097",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Meridional Overturning Circulation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4673b17d-4c84-41a6-a97a-3d951fc976b5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-26T20:45:25.495706Z",
     "iopub.status.busy": "2025-03-26T20:45:25.495524Z",
     "iopub.status.idle": "2025-03-26T20:45:25.519893Z",
     "shell.execute_reply": "2025-03-26T20:45:25.519627Z"
    },
    "papermill": {
     "duration": 0.027741,
     "end_time": "2025-03-26T20:45:25.520759",
     "exception": false,
     "start_time": "2025-03-26T20:45:25.493018",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "126fdc0a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-26T20:45:25.526194Z",
     "iopub.status.busy": "2025-03-26T20:45:25.525669Z",
     "iopub.status.idle": "2025-03-26T20:45:41.389091Z",
     "shell.execute_reply": "2025-03-26T20:45:41.388758Z"
    },
    "papermill": {
     "duration": 15.866683,
     "end_time": "2025-03-26T20:45:41.390136",
     "exception": false,
     "start_time": "2025-03-26T20:45:25.523453",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%capture \n",
    "# comment above line to see details about the run(s) displayed\n",
    "from misc import *\n",
    "from  mom6_tools import m6plot, m6toolbox\n",
    "from mom6_tools.moc import  *\n",
    "import glob\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c50a76bc",
   "metadata": {
    "tags": [
     "papermill-error-cell-tag"
    ]
   },
   "source": [
    "<span id=\"papermill-error-cell\" style=\"color:red; font-family:Helvetica Neue, Helvetica, Arial, sans-serif; font-size:2em;\">Execution using papermill encountered an exception here and stopped:</span>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e4403d70",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-26T20:45:41.397449Z",
     "iopub.status.busy": "2025-03-26T20:45:41.396264Z",
     "iopub.status.idle": "2025-03-26T20:45:42.193899Z",
     "shell.execute_reply": "2025-03-26T20:45:42.192979Z"
    },
    "papermill": {
     "duration": 0.800476,
     "end_time": "2025-03-26T20:45:42.194389",
     "exception": true,
     "start_time": "2025-03-26T20:45:41.393913",
     "status": "failed"
    },
    "tags": []
   },
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[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'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:211\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m    210\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 211\u001b[0m     file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cache\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_key\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m    212\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/lru_cache.py:56\u001b[0m, in \u001b[0;36mLRUCache.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m     55\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock:\n\u001b[0;32m---> 56\u001b[0m     value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cache\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m     57\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cache\u001b[38;5;241m.\u001b[39mmove_to_end(key)\n",
      "\u001b[0;31mKeyError\u001b[0m: [<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']",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[3], line 3\u001b[0m\n\u001b[1;32m      1\u001b[0m ds \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m c, l, p \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(casename,label, ocn_path):\n\u001b[0;32m----> 3\u001b[0m   dummy \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mp\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;132;43;01m{}\u001b[39;49;00m\u001b[38;5;124;43m_MOC.nc\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mformat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mc\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m      4\u001b[0m   ds\u001b[38;5;241m.\u001b[39mappend(dummy) \n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/api.py:571\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(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)\u001b[0m\n\u001b[1;32m    559\u001b[0m decoders \u001b[38;5;241m=\u001b[39m _resolve_decoders_kwargs(\n\u001b[1;32m    560\u001b[0m     decode_cf,\n\u001b[1;32m    561\u001b[0m     open_backend_dataset_parameters\u001b[38;5;241m=\u001b[39mbackend\u001b[38;5;241m.\u001b[39mopen_dataset_parameters,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    567\u001b[0m     decode_coords\u001b[38;5;241m=\u001b[39mdecode_coords,\n\u001b[1;32m    568\u001b[0m )\n\u001b[1;32m    570\u001b[0m overwrite_encoded_chunks \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite_encoded_chunks\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 571\u001b[0m backend_ds \u001b[38;5;241m=\u001b[39m \u001b[43mbackend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    572\u001b[0m \u001b[43m    \u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    573\u001b[0m \u001b[43m    \u001b[49m\u001b[43mdrop_variables\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdrop_variables\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    574\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdecoders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    575\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    576\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    577\u001b[0m ds \u001b[38;5;241m=\u001b[39m _dataset_from_backend_dataset(\n\u001b[1;32m    578\u001b[0m     backend_ds,\n\u001b[1;32m    579\u001b[0m     filename_or_obj,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    589\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m    590\u001b[0m )\n\u001b[1;32m    591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:645\u001b[0m, in \u001b[0;36mNetCDF4BackendEntrypoint.open_dataset\u001b[0;34m(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)\u001b[0m\n\u001b[1;32m    624\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mopen_dataset\u001b[39m(  \u001b[38;5;66;03m# type: ignore[override]  # allow LSP violation, not supporting **kwargs\u001b[39;00m\n\u001b[1;32m    625\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    626\u001b[0m     filename_or_obj: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m|\u001b[39m os\u001b[38;5;241m.\u001b[39mPathLike[Any] \u001b[38;5;241m|\u001b[39m BufferedIOBase \u001b[38;5;241m|\u001b[39m AbstractDataStore,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    642\u001b[0m     autoclose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m    643\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m    644\u001b[0m     filename_or_obj \u001b[38;5;241m=\u001b[39m _normalize_path(filename_or_obj)\n\u001b[0;32m--> 645\u001b[0m     store \u001b[38;5;241m=\u001b[39m \u001b[43mNetCDF4DataStore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    646\u001b[0m \u001b[43m        \u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    647\u001b[0m \u001b[43m        \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    648\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m    649\u001b[0m \u001b[43m        \u001b[49m\u001b[43mgroup\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    650\u001b[0m \u001b[43m        \u001b[49m\u001b[43mclobber\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mclobber\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    651\u001b[0m \u001b[43m        \u001b[49m\u001b[43mdiskless\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdiskless\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    652\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpersist\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpersist\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    653\u001b[0m \u001b[43m        \u001b[49m\u001b[43mlock\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlock\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    654\u001b[0m \u001b[43m        \u001b[49m\u001b[43mautoclose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautoclose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    655\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    657\u001b[0m     store_entrypoint \u001b[38;5;241m=\u001b[39m StoreBackendEntrypoint()\n\u001b[1;32m    658\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m close_on_error(store):\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:408\u001b[0m, in \u001b[0;36mNetCDF4DataStore.open\u001b[0;34m(cls, filename, mode, format, group, clobber, diskless, persist, lock, lock_maker, autoclose)\u001b[0m\n\u001b[1;32m    402\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m    403\u001b[0m     clobber\u001b[38;5;241m=\u001b[39mclobber, diskless\u001b[38;5;241m=\u001b[39mdiskless, persist\u001b[38;5;241m=\u001b[39mpersist, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mformat\u001b[39m\n\u001b[1;32m    404\u001b[0m )\n\u001b[1;32m    405\u001b[0m manager \u001b[38;5;241m=\u001b[39m CachingFileManager(\n\u001b[1;32m    406\u001b[0m     netCDF4\u001b[38;5;241m.\u001b[39mDataset, filename, mode\u001b[38;5;241m=\u001b[39mmode, kwargs\u001b[38;5;241m=\u001b[39mkwargs\n\u001b[1;32m    407\u001b[0m )\n\u001b[0;32m--> 408\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroup\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlock\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautoclose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautoclose\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:355\u001b[0m, in \u001b[0;36mNetCDF4DataStore.__init__\u001b[0;34m(self, manager, group, mode, lock, autoclose)\u001b[0m\n\u001b[1;32m    353\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group \u001b[38;5;241m=\u001b[39m group\n\u001b[1;32m    354\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m mode\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mds\u001b[49m\u001b[38;5;241m.\u001b[39mdata_model\n\u001b[1;32m    356\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mds\u001b[38;5;241m.\u001b[39mfilepath()\n\u001b[1;32m    357\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_remote \u001b[38;5;241m=\u001b[39m is_remote_uri(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename)\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:417\u001b[0m, in \u001b[0;36mNetCDF4DataStore.ds\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    415\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m    416\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mds\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 417\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_acquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/netCDF4_.py:411\u001b[0m, in \u001b[0;36mNetCDF4DataStore._acquire\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m    410\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_acquire\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m--> 411\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire_context\u001b[49m\u001b[43m(\u001b[49m\u001b[43mneeds_lock\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mroot\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m    412\u001b[0m \u001b[43m        \u001b[49m\u001b[43mds\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m_nc4_require_group\u001b[49m\u001b[43m(\u001b[49m\u001b[43mroot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_group\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    413\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m ds\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/contextlib.py:137\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__enter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    135\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwds, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc\n\u001b[1;32m    136\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 137\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen)\n\u001b[1;32m    138\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[1;32m    139\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgenerator didn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt yield\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:199\u001b[0m, in \u001b[0;36mCachingFileManager.acquire_context\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m    196\u001b[0m \u001b[38;5;129m@contextlib\u001b[39m\u001b[38;5;241m.\u001b[39mcontextmanager\n\u001b[1;32m    197\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21macquire_context\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[1;32m    198\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Context manager for acquiring a file.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 199\u001b[0m     file, cached \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_acquire_with_cache_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mneeds_lock\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    200\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    201\u001b[0m         \u001b[38;5;28;01myield\u001b[39;00m file\n",
      "File \u001b[0;32m/glade/work/gmarques/conda-envs/mom6-tools/lib/python3.11/site-packages/xarray/backends/file_manager.py:217\u001b[0m, in \u001b[0;36mCachingFileManager._acquire_with_cache_info\u001b[0;34m(self, needs_lock)\u001b[0m\n\u001b[1;32m    215\u001b[0m     kwargs \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m    216\u001b[0m     kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode\n\u001b[0;32m--> 217\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_opener\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m    219\u001b[0m     \u001b[38;5;66;03m# ensure file doesn't get overridden when opened again\u001b[39;00m\n\u001b[1;32m    220\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
      "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2470\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4.Dataset.__init__\u001b[0;34m()\u001b[0m\n",
      "File \u001b[0;32msrc/netCDF4/_netCDF4.pyx:2107\u001b[0m, in \u001b[0;36mnetCDF4._netCDF4._ensure_nc_success\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [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'"
     ]
    }
   ],
   "source": [
    "ds = []\n",
    "for c, l, p in zip(casename,label, ocn_path):\n",
    "  dummy = xr.open_dataset(p+'{}_MOC.nc'.format(c))\n",
    "  ds.append(dummy) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3570fe2",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### Global MOC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "becbf5bf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:13.880906Z",
     "iopub.status.busy": "2025-02-25T17:40:13.880229Z",
     "iopub.status.idle": "2025-02-25T17:40:14.204393Z",
     "shell.execute_reply": "2025-02-25T17:40:14.203769Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "pnum = len(ds)\n",
    "varName = 'vmo'\n",
    "Zmod = []\n",
    "fname ='*.mom6.h.z.????-??.nc'\n",
    "for i in range(pnum):\n",
    "  # this hack needs to be fixed\n",
    "  print(OUTDIR[i]+fname)\n",
    "  file = sorted(glob.glob(OUTDIR[i]+fname))[0:2]\n",
    "  ds1 = xr.open_mfdataset(file)\n",
    "  Zmod.append(m6toolbox.get_z(ds1, depth[i], varName))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "37b105e7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:14.212379Z",
     "iopub.status.busy": "2025-02-25T17:40:14.211672Z",
     "iopub.status.idle": "2025-02-25T17:40:14.639593Z",
     "shell.execute_reply": "2025-02-25T17:40:14.639214Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "for i in range(pnum):\n",
    "  m6plot.setFigureSize([16,9],576,debug=False)\n",
    "  axis = plt.gca()\n",
    "  cmap = plt.get_cmap('dunnePM')\n",
    "  zg = Zmod[i].min(axis=-1); \n",
    "  psiPlot = ds[i].moc.values\n",
    "  yyg = grd[i].geolat_c[:,:].max(axis=-1)+0*zg\n",
    "\n",
    "  ci=m6plot.pmCI(0.,40.,5.)\n",
    "  plotPsi(yyg, zg, psiPlot, ci, 'Global MOC [Sv], ' + \\\n",
    "         'start_date:' + ds[i].start_date +' end_date:' + ds[i].end_date)\n",
    "  plt.xlabel(r'Latitude [$\\degree$N]')\n",
    "  plt.suptitle(label[i])\n",
    "\n",
    "  findExtrema(yyg, zg, psiPlot, max_lat=-30.)\n",
    "  findExtrema(yyg, zg, psiPlot, min_lat=25., min_depth=250.)\n",
    "  findExtrema(yyg, zg, psiPlot, min_depth=2000., mult=-1.)\n",
    "  plt.gca().invert_yaxis()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e6b0fed",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### Atlantic MOC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6dd8c125",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:14.657774Z",
     "iopub.status.busy": "2025-02-25T17:40:14.657599Z",
     "iopub.status.idle": "2025-02-25T17:40:16.777118Z",
     "shell.execute_reply": "2025-02-25T17:40:16.776743Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "for i in range(pnum):\n",
    "  basin_code = genBasinMasks(grd[i].geolon, grd[i].geolat, depth[i], xda=False);\n",
    "  m6plot.setFigureSize([16,9],576,debug=False)\n",
    "  cmap = plt.get_cmap('dunnePM')\n",
    "  ci=m6plot.pmCI(0.,22.,2.)\n",
    "  m = 0*basin_code; m[(basin_code==2) | (basin_code==4) | (basin_code==6) | (basin_code==7) | (basin_code==8)]=1\n",
    "  z = (m*Zmod[i]).min(axis=-1)\n",
    "  psiPlot = ds[i].amoc.values\n",
    "  yy = grd[i].geolat_c[:,:].max(axis=-1)+0*z\n",
    "  plotPsi(yy, z, psiPlot, ci, 'Atlantic MOC [Sv], ' + \\\n",
    "         'start_date:' + ds[i].start_date +' end_date:' + ds[i].end_date)\n",
    "  plt.xlabel(r'Latitude [$\\degree$N]')\n",
    "  plt.suptitle(label[i])\n",
    "  findExtrema(yy, z, psiPlot, min_lat=26.5, max_lat=27., min_depth=250.) # RAPID\n",
    "  findExtrema(yy, z, psiPlot, min_lat=44, max_lat=46., min_depth=250.) # RAPID\n",
    "  findExtrema(yy, z, psiPlot, max_lat=-33.)\n",
    "  findExtrema(yy, z, psiPlot)\n",
    "  findExtrema(yy, z, psiPlot, min_lat=5.)\n",
    "  plt.gca().invert_yaxis()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e5c88b9",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### AMOC profile at 26N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "61eed294",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:16.804222Z",
     "iopub.status.busy": "2025-02-25T17:40:16.804035Z",
     "iopub.status.idle": "2025-02-25T17:40:17.197710Z",
     "shell.execute_reply": "2025-02-25T17:40:17.197144Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "fig, ax = plt.subplots(figsize=(10,6))\n",
    "rapid_vertical = xr.open_dataset('/glade/work/gmarques/cesm/datasets/RAPID/moc_vertical.nc')\n",
    "ax.plot(rapid_vertical.stream_function_mar.mean('time'),\n",
    "        rapid_vertical.depth, 'k', label='RAPID', lw=3)\n",
    "for i in range(pnum):\n",
    "  ax.plot(ds[i]['amoc'].sel(yq=26, method='nearest'), ds[i].zl, label=label[i], lw=3)\n",
    "\n",
    "ax.legend()\n",
    "plt.gca().invert_yaxis()\n",
    "plt.grid()\n",
    "ax.set_xlabel('AMOC @ 26N [Sv]')\n",
    "ax.set_ylabel('Depth [m]');"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d80f89c",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### AMOC time series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d36d127c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:17.225903Z",
     "iopub.status.busy": "2025-02-25T17:40:17.225736Z",
     "iopub.status.idle": "2025-02-25T17:40:17.819920Z",
     "shell.execute_reply": "2025-02-25T17:40:17.819558Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# load RAPID time series\n",
    "rapid = m6toolbox.weighted_temporal_mean_vars(xr.open_dataset('/glade/work/gmarques/cesm/datasets/RAPID/moc_transports.nc'))\n",
    "\n",
    "# plot\n",
    "fig = plt.figure(figsize=(12, 6))\n",
    "for i in range(pnum):\n",
    "  plt.plot(np.arange(len(ds[i].time))+1. ,ds[i]['amoc_26'].values, \n",
    "           label=label[i], lw=3)\n",
    "# rapid\n",
    "plt.plot(np.arange(len(rapid.time))+46.5 ,rapid.moc_mar_hc10.values, \n",
    "         label='RAPID', lw=2)\n",
    "\n",
    "plt.title('AMOC @ 26 $^o$ N', fontsize=16)\n",
    "plt.ylim(5,20)\n",
    "plt.xlim(0,1+len(ds[0].time))\n",
    "plt.xlabel('Time [years]', fontsize=16); plt.ylabel('Sv', fontsize=16)\n",
    "plt.legend(fontsize=13, ncol=2)\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6ecd2157",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:17.836694Z",
     "iopub.status.busy": "2025-02-25T17:40:17.836401Z",
     "iopub.status.idle": "2025-02-25T17:40:18.055396Z",
     "shell.execute_reply": "2025-02-25T17:40:18.055005Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# plot\n",
    "fig = plt.figure(figsize=(12, 6))\n",
    "for i in range(pnum):\n",
    "  plt.plot(np.arange(len(ds[i].time))+1 ,ds[i]['amoc_45'].values, \n",
    "           label=label[i], lw=3)\n",
    "plt.title('AMOC @ 45 $^o$ N', fontsize=16)\n",
    "plt.ylim(5,25)\n",
    "plt.xlim(0,1+len(ds[0].time))\n",
    "plt.xlabel('Time [years]', fontsize=16); plt.ylabel('Sv', fontsize=16)\n",
    "plt.legend(fontsize=13, ncol=2);\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16c2b02f",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### Submesoscale-induced Global MOC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f142f61a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:18.087503Z",
     "iopub.status.busy": "2025-02-25T17:40:18.087329Z",
     "iopub.status.idle": "2025-02-25T17:40:18.681568Z",
     "shell.execute_reply": "2025-02-25T17:40:18.681192Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "for i in range(pnum):\n",
    "    # create a ndarray subclass\n",
    "    class C(np.ndarray): pass\n",
    "    varName = 'moc_FFM'\n",
    "\n",
    "    psiPlot = np.ma.masked_invalid(ds[i][varName].values)\n",
    "    tmp = psiPlot[:].filled(0.)\n",
    "    VHmod = tmp.view(C)\n",
    "    VHmod.units = 'Sv'\n",
    "\n",
    "    # Global MOC\n",
    "    m6plot.setFigureSize([16,9],576,debug=False)\n",
    "    axis = plt.gca()\n",
    "    cmap = plt.get_cmap('dunnePM')\n",
    "    z =  Zmod[i].min(axis=-1) \n",
    "    #yy = y[1:,:].max(axis=-1)+0*z\n",
    "    yy = grd[i].geolat_c[:,:].max(axis=-1)+0*z\n",
    "    ci=m6plot.pmCI(0.,40.,2.)\n",
    "    plotPsi(yy, z, psiPlot, ci, 'Global MOC [Sv] due to vhML', zval=[0.,-400.,-6500.])\n",
    "    plt.xlabel(r'Latitude [$\\degree$N]')\n",
    "    plt.suptitle(label[i])\n",
    "    plt.gca().invert_yaxis()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19dadf69",
   "metadata": {
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "source": [
    "### Eddy(GM)-induced Global MOC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a610564",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-25T17:40:18.721270Z",
     "iopub.status.busy": "2025-02-25T17:40:18.721087Z",
     "iopub.status.idle": "2025-02-25T17:40:19.091155Z",
     "shell.execute_reply": "2025-02-25T17:40:19.090543Z"
    },
    "papermill": {
     "duration": null,
     "end_time": null,
     "exception": null,
     "start_time": null,
     "status": "pending"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "for i in range(pnum):\n",
    "    # create a ndarray subclass\n",
    "    class C(np.ndarray): pass\n",
    "    varName = 'moc_GM'\n",
    "\n",
    "    psiPlot = np.ma.masked_invalid(ds[i][varName].values)\n",
    "    tmp = psiPlot[:].filled(0.)\n",
    "    VHmod = tmp.view(C)\n",
    "    VHmod.units = 'Sv'\n",
    "\n",
    "    # Global MOC\n",
    "    m6plot.setFigureSize([16,9],576,debug=False)\n",
    "    axis = plt.gca()\n",
    "    cmap = plt.get_cmap('dunnePM')\n",
    "    z =  Zmod[i].min(axis=-1) \n",
    "    yy = grd[0].geolat_c[:,:].max(axis=-1)+0*z\n",
    "    ci=m6plot.pmCI(0.,20.,1.)\n",
    "    plotPsi(yy, z, psiPlot, ci, 'Global MOC [Sv] due to GM')\n",
    "    plt.xlabel(r'Latitude [$\\degree$N]')\n",
    "    plt.suptitle(label[i])\n",
    "    findExtrema(yy, z, psiPlot, min_lat=-65., max_lat=-30, mult=-1.)\n",
    "    plt.gca().invert_yaxis()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (mom6-tools)",
   "language": "python",
   "name": "mom6-tools"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 19.982638,
   "end_time": "2025-03-26T20:45:44.318350",
   "environment_variables": {},
   "exception": true,
   "input_path": "moc.ipynb",
   "output_path": "moc.ipynb",
   "parameters": {},
   "start_time": "2025-03-26T20:45:24.335712",
   "version": "2.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}