{
"cells": [
{
"cell_type": "markdown",
"id": "8a97d223",
"metadata": {
"tags": [
"papermill-error-cell-tag"
]
},
"source": [
"An Exception was encountered at 'In [14]'."
]
},
{
"cell_type": "markdown",
"id": "5a15547b",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.004325,
"end_time": "2025-08-21T16:28:04.041027",
"exception": false,
"start_time": "2025-08-21T16:28:04.036702",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## ROF monthly, annual, seasonal discharge at ocean outlets \n",
"\n",
"Use the following datasets\n",
"\n",
"1. reach-D19 gauge link ascii\n",
"2. D19 flow site geopackage\n",
"3. D19 discharge netCDF\n",
"4. monthly and yearly flow netCD (history file)\n",
"\n",
"[1. Setupt](#setup)\n",
"\n",
"\n",
"[2. Loading discharge data](#load_discharge_data)\n",
"\n",
"- Read monthly history files from archive. \n",
"- Reference data: monthly discharge estimates at 922 big river mouths from Dai et al. 2019 data (D19)\n",
"\n",
"[3. Read river, catchment, gauge information](#read_ancillary)\n",
"\n",
"- catchment polygon (geopackage)\n",
"- gauge point (geopackage)\n",
"- gauge-catchment link (csv)\n",
"- outlet reach information (netCDF) including discharging ocean names\n",
"\n",
"[4. Ocean discharge line plots](#24_large_rivers)\n",
"\n",
"- total seasonal flow for oceans. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "4ba1cfa4",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:04.047807Z",
"iopub.status.busy": "2025-08-21T16:28:04.047449Z",
"iopub.status.idle": "2025-08-21T16:28:06.767142Z",
"shell.execute_reply": "2025-08-21T16:28:06.766652Z"
},
"papermill": {
"duration": 2.723649,
"end_time": "2025-08-21T16:28:06.767789",
"exception": false,
"start_time": "2025-08-21T16:28:04.044140",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"The Python version: 3.11.4\n",
"xarray 2025.4.0\n",
"pandas 2.2.3\n",
"geopandas 1.0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"ERROR 1: PROJ: proj_create_from_database: Open of /glade/work/hannay/miniconda3/envs/cupid-analysis/share/proj failed\n"
]
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import os, sys\n",
"import glob\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import geopandas as gpd\n",
"import xarray as xr\n",
"import cartopy.feature as cfeature\n",
"\n",
"from scripts.utility import load_yaml\n",
"from scripts.utility import no_time_variable\n",
"from scripts.utility import read_shps\n",
"from scripts.utility import get_index_array\n",
"\n",
"rivers_50m = cfeature.NaturalEarthFeature(\"physical\", \"rivers_lake_centerlines\", \"50m\")\n",
"land = cfeature.LAND\n",
"\n",
"print(\"\\nThe Python version: %s.%s.%s\" % sys.version_info[:3])\n",
"print(xr.__name__, xr.__version__)\n",
"print(pd.__name__, pd.__version__)\n",
"print(gpd.__name__, gpd.__version__)"
]
},
{
"cell_type": "markdown",
"id": "413667d2",
"metadata": {
"papermill": {
"duration": 0.003078,
"end_time": "2025-08-21T16:28:06.774579",
"exception": false,
"start_time": "2025-08-21T16:28:06.771501",
"status": "completed"
},
"tags": []
},
"source": [
"-------------------------\n",
"## 1. Setup "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3aaeb9bc",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:06.782049Z",
"iopub.status.busy": "2025-08-21T16:28:06.781320Z",
"iopub.status.idle": "2025-08-21T16:28:06.784936Z",
"shell.execute_reply": "2025-08-21T16:28:06.784460Z"
},
"papermill": {
"duration": 0.007842,
"end_time": "2025-08-21T16:28:06.785430",
"exception": false,
"start_time": "2025-08-21T16:28:06.777588",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"parameters",
"hide-input"
]
},
"outputs": [],
"source": [
"# Parameter Defaults\n",
"# parameters are set in CUPiD's config.yml file\n",
"# when running interactively, manually set the parameters below\n",
"\n",
"CESM_output_dir = \"\"\n",
"case_name = None # case name: e.g., \"b.e30_beta02.BLT1850.ne30_t232.104\"\n",
"base_case_name = None # base case name: e.g., \"b.e23_alpha17f.BLT1850.ne30_t232.092\"\n",
"start_date = \"\"\n",
"end_date = \"\"\n",
"base_start_date = \"\" # base simulation starting date: \"0001-01-01\"\n",
"base_end_date = \"\" # base simulation ending date: \"0100-01-01\"\n",
"serial = True # use dask LocalCluster\n",
"lc_kwargs = {}\n",
"\n",
"analysis_name = \"\" # Used for Figure png names\n",
"climo_nyears = 10 # number of years to compute the climatology\n",
"grid_name = \"f09_f09_mosart\" # ROF grid name used in case\n",
"base_grid_name = (\n",
" grid_name # spcify ROF grid name for base_case in config.yml if different than case\n",
")\n",
"figureSave = False"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "36376c1f",
"metadata": {
"execution": {
"iopub.execute_input": "2025-08-21T16:28:06.792618Z",
"iopub.status.busy": "2025-08-21T16:28:06.792149Z",
"iopub.status.idle": "2025-08-21T16:28:06.797848Z",
"shell.execute_reply": "2025-08-21T16:28:06.797403Z"
},
"papermill": {
"duration": 0.010084,
"end_time": "2025-08-21T16:28:06.798665",
"exception": false,
"start_time": "2025-08-21T16:28:06.788581",
"status": "completed"
},
"tags": [
"injected-parameters"
]
},
"outputs": [],
"source": [
"# Parameters\n",
"case_name = \"b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.192\"\n",
"base_case_name = \"b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.188\"\n",
"CESM_output_dir = \"/glade/derecho/scratch/hannay/archive\"\n",
"base_case_output_dir = \"/glade/derecho/scratch/gmarques/archive\"\n",
"start_date = \"0002-01-01\"\n",
"end_date = \"0021-12-01\"\n",
"base_start_date = \"0002-01-01\"\n",
"base_end_date = \"0021-12-01\"\n",
"obs_data_dir = (\n",
" \"/glade/campaign/cesm/development/cross-wg/diagnostic_framework/CUPiD_obs_data\"\n",
")\n",
"ts_dir = None\n",
"lc_kwargs = {\"threads_per_worker\": 1}\n",
"serial = True\n",
"analysis_name = \"\"\n",
"grid_name = \"f09_f09_mosart\"\n",
"climo_nyears = 10\n",
"figureSave = False\n",
"subset_kwargs = {}\n",
"product = \"/glade/work/hannay/CUPiD/examples/key_metrics/computed_notebooks//rof/global_discharge_ocean_compare_obs.ipynb\"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "3be8e264",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:06.805976Z",
"iopub.status.busy": "2025-08-21T16:28:06.805704Z",
"iopub.status.idle": "2025-08-21T16:28:06.816558Z",
"shell.execute_reply": "2025-08-21T16:28:06.816209Z"
},
"papermill": {
"duration": 0.015695,
"end_time": "2025-08-21T16:28:06.817458",
"exception": false,
"start_time": "2025-08-21T16:28:06.801763",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [],
"source": [
"# ROF additional setup\n",
"setup = load_yaml(\"./setup/setup.yaml\")\n",
"\n",
"domain_dir = setup[\n",
" \"ancillary_dir\"\n",
"] # ancillary directory including such as ROF domain, river network data\n",
"geospatial_dir = setup[\"geospatial_dir\"] # including shapefiles or geopackages\n",
"ref_flow_dir = setup[\"ref_flow_dir\"] # including observed or reference flow data\n",
"case_meta = setup[\"case_meta\"] # RO grid meta\n",
"catch_gpkg = setup[\"catch_gpkg\"] # catchment geopackage meta\n",
"reach_gpkg = setup[\"reach_gpkg\"] # reach geopackage meta\n",
"network_nc = setup[\"river_network\"] # river network meta\n",
"\n",
"if not analysis_name:\n",
" analysis_name = case_name\n",
"if base_grid_name:\n",
" base_grid_name = grid_name\n",
"\n",
"case_dic = {\n",
" case_name: {\n",
" \"grid\": grid_name,\n",
" \"sim_period\": slice(f\"{start_date}\", f\"{end_date}\"),\n",
" \"climo_nyrs\": min(climo_nyears, int(end_date[:4]) - int(start_date[:4]) + 1),\n",
" },\n",
" base_case_name: {\n",
" \"grid\": grid_name,\n",
" \"sim_period\": slice(f\"{base_start_date}\", f\"{base_end_date}\"),\n",
" \"climo_nyrs\": min(\n",
" climo_nyears, int(base_end_date[:4]) - int(base_start_date[:4]) + 1\n",
" ),\n",
" },\n",
"}\n",
"oceans_list = [\n",
" \"arctic\",\n",
" \"atlantic\",\n",
" \"indian\",\n",
" \"mediterranean\",\n",
" \"pacific\",\n",
" \"south_china\",\n",
" \"global\",\n",
"]"
]
},
{
"cell_type": "markdown",
"id": "e0ba6aea",
"metadata": {
"papermill": {
"duration": 0.003083,
"end_time": "2025-08-21T16:28:06.823860",
"exception": false,
"start_time": "2025-08-21T16:28:06.820777",
"status": "completed"
},
"tags": []
},
"source": [
"-----\n",
"### dasks (optional)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "919faf72",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:06.831130Z",
"iopub.status.busy": "2025-08-21T16:28:06.830649Z",
"iopub.status.idle": "2025-08-21T16:28:06.834344Z",
"shell.execute_reply": "2025-08-21T16:28:06.833995Z"
},
"papermill": {
"duration": 0.007885,
"end_time": "2025-08-21T16:28:06.834889",
"exception": false,
"start_time": "2025-08-21T16:28:06.827004",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [],
"source": [
"# When running interactively, cupid_run should be set to False\n",
"cupid_run = True\n",
"\n",
"client = None\n",
"if cupid_run:\n",
" # Spin up cluster (if running in parallel)\n",
" if not serial:\n",
" from dask.distributed import Client, LocalCluster\n",
"\n",
" cluster = LocalCluster(**lc_kwargs)\n",
" client = Client(cluster)\n",
"else:\n",
" if not serial:\n",
" from dask.distributed import Client\n",
" from dask_jobqueue import PBSCluster\n",
"\n",
" cluster = PBSCluster(\n",
" cores=1,\n",
" processes=1,\n",
" memory=\"50GB\",\n",
" queue=\"casper\",\n",
" walltime=\"01:00:00\",\n",
" )\n",
" cluster.scale(jobs=10)\n",
" client = Client(cluster)\n",
"client"
]
},
{
"cell_type": "markdown",
"id": "caa147bf",
"metadata": {
"papermill": {
"duration": 0.003053,
"end_time": "2025-08-21T16:28:06.841164",
"exception": false,
"start_time": "2025-08-21T16:28:06.838111",
"status": "completed"
},
"tags": []
},
"source": [
"## 2. Loading discharge data "
]
},
{
"cell_type": "markdown",
"id": "71e770b4",
"metadata": {
"papermill": {
"duration": 0.003103,
"end_time": "2025-08-21T16:28:06.847400",
"exception": false,
"start_time": "2025-08-21T16:28:06.844297",
"status": "completed"
},
"tags": []
},
"source": [
"### 2.1. Monthly/annual flow netCDFs\n",
"- month_data (xr dataset)\n",
"- year_data (xr dataset)\n",
"- seas_data (xr dataset)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "59599f11",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:06.854834Z",
"iopub.status.busy": "2025-08-21T16:28:06.854379Z",
"iopub.status.idle": "2025-08-21T16:28:23.403150Z",
"shell.execute_reply": "2025-08-21T16:28:23.402584Z"
},
"papermill": {
"duration": 16.553186,
"end_time": "2025-08-21T16:28:23.403800",
"exception": false,
"start_time": "2025-08-21T16:28:06.850614",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Finished loading b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.192\n"
]
},
{
"ename": "OSError",
"evalue": "no files to open",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mOSError\u001b[39m Traceback (most recent call last)",
"\u001b[36mFile \u001b[39m\u001b[32m:28\u001b[39m\n",
"\u001b[36mFile \u001b[39m\u001b[32m/glade/work/hannay/miniconda3/envs/cupid-analysis/lib/python3.11/site-packages/xarray/backends/api.py:1597\u001b[39m, in \u001b[36mopen_mfdataset\u001b[39m\u001b[34m(paths, chunks, concat_dim, compat, preprocess, engine, data_vars, coords, combine, parallel, join, attrs_file, combine_attrs, **kwargs)\u001b[39m\n\u001b[32m 1594\u001b[39m paths = _find_absolute_paths(paths, engine=engine, **kwargs)\n\u001b[32m 1596\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m paths:\n\u001b[32m-> \u001b[39m\u001b[32m1597\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mno files to open\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 1599\u001b[39m paths1d: \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mstr\u001b[39m | ReadBuffer]\n\u001b[32m 1600\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m combine == \u001b[33m\"\u001b[39m\u001b[33mnested\u001b[39m\u001b[33m\"\u001b[39m:\n",
"\u001b[31mOSError\u001b[39m: no files to open"
]
}
],
"source": [
"%%time\n",
"\n",
"reachID = {}\n",
"month_data = {}\n",
"year_data = {}\n",
"seas_data = {}\n",
"for case, meta in case_dic.items():\n",
" in_dire = os.path.join(CESM_output_dir, case, \"rof/hist\")\n",
" model = case_meta[meta[\"grid\"]][\"model\"]\n",
" domain = case_meta[meta[\"grid\"]][\"domain_nc\"]\n",
" var_list = case_meta[meta[\"grid\"]][\"vars_read\"]\n",
"\n",
" def preprocess(ds):\n",
" return ds[var_list]\n",
"\n",
" year_list = [\n",
" \"{:04d}\".format(yr)\n",
" for yr in np.arange(\n",
" int(meta[\"sim_period\"].start[0:4]), int(meta[\"sim_period\"].stop[0:4]) + 1\n",
" )\n",
" ]\n",
"\n",
" nc_list = []\n",
" for nc_path in sorted(glob.glob(f\"{in_dire}/{case}.{model}.h*.????-*.nc\")):\n",
" for yr in year_list:\n",
" if yr in os.path.basename(nc_path):\n",
" nc_list.append(nc_path)\n",
"\n",
" # load data\n",
" ds = xr.open_mfdataset(\n",
" nc_list,\n",
" data_vars=\"minimal\",\n",
" parallel=True,\n",
" preprocess=preprocess,\n",
" ).sel(time=meta[\"sim_period\"])\n",
"\n",
" # monthly\n",
" month_data[case] = ds.isel(time=slice(-meta[\"climo_nyrs\"] * 12, None))\n",
" # annual\n",
" year_data[case] = (\n",
" ds.isel(time=slice(-meta[\"climo_nyrs\"] * 12, None))\n",
" .resample(time=\"YS\")\n",
" .mean(dim=\"time\")\n",
" .load()\n",
" )\n",
" # seasonal (compute here instead of reading for conisistent analysis period)\n",
" seas_data[case] = (\n",
" ds.isel(time=slice(-meta[\"climo_nyrs\"] * 12, None))\n",
" .groupby(\"time.month\")\n",
" .mean(\"time\")\n",
" .load()\n",
" )\n",
" vars_no_time = no_time_variable(month_data[case])\n",
" if vars_no_time:\n",
" seas_data[case][vars_no_time] = seas_data[case][vars_no_time].isel(\n",
" month=0, drop=True\n",
" )\n",
" mon_time = month_data[case].time.values\n",
" if domain == \"None\":\n",
" reachID[case] = month_data[case][\"reachID\"].values\n",
" else:\n",
" reachID[case] = (\n",
" xr.open_dataset(f\"{domain_dir}/{domain}\")[\"reachID\"]\n",
" .stack(seg=(\"lat\", \"lon\"))\n",
" .values\n",
" )\n",
" print(f\"Finished loading {case}\")"
]
},
{
"cell_type": "markdown",
"id": "590c0a25",
"metadata": {
"papermill": {
"duration": 0.003591,
"end_time": "2025-08-21T16:28:23.414687",
"exception": false,
"start_time": "2025-08-21T16:28:23.411096",
"status": "completed"
},
"tags": []
},
"source": [
"### 2.2 D19 discharge data\n",
"- ds_q_obs_mon (xr datasets)\n",
"- ds_q_obs_yr (xr datasets)\n",
"- dr_q_obs_seasonal (xr datasets)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ab451e27",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:23.422453Z",
"iopub.status.busy": "2025-08-21T16:28:23.422047Z",
"iopub.status.idle": "2025-08-21T16:28:23.587123Z",
"shell.execute_reply": "2025-08-21T16:28:23.586626Z"
},
"papermill": {
"duration": 0.169602,
"end_time": "2025-08-21T16:28:23.587706",
"exception": false,
"start_time": "2025-08-21T16:28:23.418104",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 155 ms, sys: 3.63 ms, total: 158 ms\n",
"Wall time: 160 ms\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
":6: DeprecationWarning: cftime_range() is deprecated, please use xarray.date_range(..., use_cftime=True) instead.\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# read monthly data\n",
"ds_q = xr.open_dataset(\n",
" \"%s/D09/coastal-stns-Vol-monthly.updated-May2019.mod.nc\" % (ref_flow_dir),\n",
" decode_times=False,\n",
")\n",
"ds_q[\"time\"] = xr.cftime_range(\n",
" start=\"1900-01-01\", end=\"2018-12-01\", freq=\"MS\", calendar=\"standard\"\n",
")\n",
"\n",
"# monthly- if time_period is outside observation period, use the entire obs period\n",
"obs_available = True\n",
"if ds_q[\"time\"].sel(time=slice(str(mon_time[0]), str(mon_time[-1]))).values.size == 0:\n",
" obs_available = False\n",
" ds_q_obs_mon = ds_q[\"FLOW\"]\n",
"else:\n",
" ds_q_obs_mon = ds_q[\"FLOW\"].sel(time=slice(str(mon_time[0]), str(mon_time[-1])))\n",
"# compute annual flow from monthly\n",
"ds_q_obs_yr = ds_q_obs_mon.resample(time=\"YE\").mean(dim=\"time\")\n",
"# compute annual cycle at monthly scale\n",
"dr_q_obs_seasonal = ds_q_obs_mon.groupby(\"time.month\").mean(\"time\")"
]
},
{
"cell_type": "markdown",
"id": "77fb914b",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.003394,
"end_time": "2025-08-21T16:28:23.594685",
"exception": false,
"start_time": "2025-08-21T16:28:23.591291",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## 3. Reading river, catchment, gauge infomation \n",
"\n",
"- gauge-catchment (or grid box) link (csv)\n",
"- gauge point (geopackage)\n",
"- ocean polygon (geopackage)\n",
"- catchment polygon (geopackage)\n",
"- outlet reach information (netCDF)"
]
},
{
"cell_type": "markdown",
"id": "f0156464",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.003319,
"end_time": "2025-08-21T16:28:23.601452",
"exception": false,
"start_time": "2025-08-21T16:28:23.598133",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"### 3.1. reach-D19 gauge link csv\n",
"- gauge_reach_lnk (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c62c8652",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:23.609284Z",
"iopub.status.busy": "2025-08-21T16:28:23.608768Z",
"iopub.status.idle": "2025-08-21T16:28:23.615887Z",
"shell.execute_reply": "2025-08-21T16:28:23.615470Z"
},
"papermill": {
"duration": 0.012014,
"end_time": "2025-08-21T16:28:23.616793",
"exception": false,
"start_time": "2025-08-21T16:28:23.604779",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [],
"source": [
"gauge_reach_lnk = {}\n",
"for case, meta in case_dic.items():\n",
" gauge_reach_lnk[case] = pd.read_csv(\n",
" \"%s/D09/D09_925.%s.asc\" % (ref_flow_dir, case_meta[meta[\"grid\"]][\"network\"])\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "5707ddd8",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.003318,
"end_time": "2025-08-21T16:28:23.623766",
"exception": false,
"start_time": "2025-08-21T16:28:23.620448",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"### 3.2 D19 flow site geopackage\n",
"- gauge_shp (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "b5cc3b41",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:23.631158Z",
"iopub.status.busy": "2025-08-21T16:28:23.630795Z",
"iopub.status.idle": "2025-08-21T16:28:23.693669Z",
"shell.execute_reply": "2025-08-21T16:28:23.693208Z"
},
"papermill": {
"duration": 0.067141,
"end_time": "2025-08-21T16:28:23.694236",
"exception": false,
"start_time": "2025-08-21T16:28:23.627095",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 13 ms, sys: 4.53 ms, total: 17.6 ms\n",
"Wall time: 41.2 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"gauge_shp = gpd.read_file(\n",
" os.path.join(ref_flow_dir, \"D09\", \"geospatial\", \"D09_925.gpkg\")\n",
")\n",
"gauge_shp = gauge_shp[gauge_shp[\"id\"] != 9999999]"
]
},
{
"cell_type": "markdown",
"id": "14d20670",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.003405,
"end_time": "2025-08-21T16:28:23.701259",
"exception": false,
"start_time": "2025-08-21T16:28:23.697854",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"### 3.3 Ocean polygon geopackage\n",
"- ocean_shp (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e2b5b872",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:23.709188Z",
"iopub.status.busy": "2025-08-21T16:28:23.708685Z",
"iopub.status.idle": "2025-08-21T16:28:34.701385Z",
"shell.execute_reply": "2025-08-21T16:28:34.700922Z"
},
"papermill": {
"duration": 10.997272,
"end_time": "2025-08-21T16:28:34.701976",
"exception": false,
"start_time": "2025-08-21T16:28:23.704704",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 182 ms, sys: 10.3 s, total: 10.5 s"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Wall time: 11 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"ocean_shp = gpd.read_file(os.path.join(geospatial_dir, \"oceans.gpkg\"))"
]
},
{
"cell_type": "markdown",
"id": "ec053bbf",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.004014,
"end_time": "2025-08-21T16:28:34.712083",
"exception": false,
"start_time": "2025-08-21T16:28:34.708069",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"### 3.3 Read river network information\n",
"- gdf_cat (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "de40a200",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:34.720369Z",
"iopub.status.busy": "2025-08-21T16:28:34.720124Z",
"iopub.status.idle": "2025-08-21T16:28:35.383382Z",
"shell.execute_reply": "2025-08-21T16:28:35.382920Z"
},
"papermill": {
"duration": 0.668215,
"end_time": "2025-08-21T16:28:35.384027",
"exception": false,
"start_time": "2025-08-21T16:28:34.715812",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Finished reading /glade/campaign/cesm/development/cross-wg/diagnostic_framework/rof_data/geospatial/MOSART_routing_Global_0.5x0.5_c170601_hru.gpkg\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Finished reading /glade/campaign/cesm/development/cross-wg/diagnostic_framework/rof_data/geospatial/MOSART_routing_Global_0.5x0.5_c170601_hru.gpkg\n",
"CPU times: user 574 ms, sys: 7.76 ms, total: 581 ms\n",
"Wall time: 660 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"## read catchment geopackage\n",
"gdf_cat = {}\n",
"for case, meta in case_dic.items():\n",
" cat_gpkg = os.path.join(\n",
" geospatial_dir, catch_gpkg[meta[\"grid\"]][\"file_name\"]\n",
" ) # geopackage name\n",
" id_name_cat = catch_gpkg[meta[\"grid\"]][\"id_name\"] # reach ID in geopackage\n",
" var_list = [id_name_cat]\n",
" if \"lk\" in grid_name:\n",
" var_list.append(\"lake\")\n",
" gdf_cat[case] = read_shps([cat_gpkg], var_list)"
]
},
{
"cell_type": "markdown",
"id": "146ff048",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.004067,
"end_time": "2025-08-21T16:28:35.395693",
"exception": false,
"start_time": "2025-08-21T16:28:35.391626",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"### 3.4 Read river outlet information\n",
"- Apppend into gdf_cat (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "2a420a6f",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:35.403983Z",
"iopub.status.busy": "2025-08-21T16:28:35.403574Z",
"iopub.status.idle": "2025-08-21T16:28:36.241267Z",
"shell.execute_reply": "2025-08-21T16:28:36.240764Z"
},
"papermill": {
"duration": 0.842493,
"end_time": "2025-08-21T16:28:36.241957",
"exception": false,
"start_time": "2025-08-21T16:28:35.399464",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 204 ms, sys: 558 ms, total: 762 ms\n",
"Wall time: 833 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# read river outlet netcdf\n",
"riv_ocean = {}\n",
"for case, meta in case_dic.items():\n",
" riv_ocean_file = os.path.join(\n",
" domain_dir,\n",
" network_nc[meta[\"grid\"]][\"file_name\"].replace(\".aug.nc\", \".outlet.nc\"),\n",
" ) # network netcdf name\n",
" ds_rn_ocean = xr.open_dataset(riv_ocean_file).set_index(seg=\"seg_id\")\n",
" df_tmp = ds_rn_ocean.to_dataframe()\n",
" riv_ocean[case] = pd.merge(\n",
" gdf_cat[case],\n",
" df_tmp,\n",
" left_on=catch_gpkg[meta[\"grid\"]][\"id_name\"],\n",
" right_index=True,\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "8c0af5da",
"metadata": {
"papermill": {
"duration": 0.003859,
"end_time": "2025-08-21T16:28:36.250239",
"exception": false,
"start_time": "2025-08-21T16:28:36.246380",
"status": "completed"
},
"tags": []
},
"source": [
"### 2.6 Merge gauge, outlet catchment dataframe\n",
"\n",
"- gauge_shp1 (dataframe)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "102c6249",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:36.258611Z",
"iopub.status.busy": "2025-08-21T16:28:36.258305Z",
"iopub.status.idle": "2025-08-21T16:28:36.274062Z",
"shell.execute_reply": "2025-08-21T16:28:36.273668Z"
},
"papermill": {
"duration": 0.020591,
"end_time": "2025-08-21T16:28:36.274605",
"exception": false,
"start_time": "2025-08-21T16:28:36.254014",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 10.6 ms, sys: 1.87 ms, total: 12.5 ms\n",
"Wall time: 11.9 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# Merge gauge_reach lnk (dataframe) into gauge shapefile\n",
"gauge_shp1 = {}\n",
"for case, meta in case_dic.items():\n",
" df = gauge_reach_lnk[case]\n",
"\n",
" # df = df.loc[(df['flag'] == 0)]\n",
" df1 = df.drop(columns=[\"riv_name\"])\n",
" df2 = pd.merge(gauge_shp, df1, how=\"inner\", left_on=\"id\", right_on=\"gauge_id\")\n",
" gauge_shp1[case] = pd.merge(\n",
" df2,\n",
" riv_ocean[case],\n",
" how=\"inner\",\n",
" left_on=\"route_id\",\n",
" right_on=catch_gpkg[meta[\"grid\"]][\"id_name\"],\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "4e1dba0b",
"metadata": {
"editable": true,
"papermill": {
"duration": 0.003766,
"end_time": "2025-08-21T16:28:36.282348",
"exception": false,
"start_time": "2025-08-21T16:28:36.278582",
"status": "completed"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"------\n",
"## 3. Plot annual cycle for global oceans "
]
},
{
"cell_type": "markdown",
"id": "7bfdab53",
"metadata": {
"tags": [
"papermill-error-cell-tag"
]
},
"source": [
"Execution using papermill encountered an exception here and stopped:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b232c13e",
"metadata": {
"editable": true,
"execution": {
"iopub.execute_input": "2025-08-21T16:28:36.290987Z",
"iopub.status.busy": "2025-08-21T16:28:36.290697Z",
"iopub.status.idle": "2025-08-21T16:28:36.849666Z",
"shell.execute_reply": "2025-08-21T16:28:36.849076Z"
},
"papermill": {
"duration": 0.5641,
"end_time": "2025-08-21T16:28:36.850241",
"exception": true,
"start_time": "2025-08-21T16:28:36.286141",
"status": "failed"
},
"slideshow": {
"slide_type": ""
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2 μs, sys: 2 μs, total: 4 μs\n",
"Wall time: 8.11 μs\n"
]
},
{
"ename": "KeyError",
"evalue": "'b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.188'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mKeyError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 36\u001b[39m\n\u001b[32m 31\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 32\u001b[39m id_list = gauge_shp1[case][gauge_shp1[case][\u001b[33m\"\u001b[39m\u001b[33mocean\u001b[39m\u001b[33m\"\u001b[39m] == ocean_name][\n\u001b[32m 33\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mroute_id\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 34\u001b[39m ].values\n\u001b[32m---> \u001b[39m\u001b[32m36\u001b[39m reach_index = get_index_array(\u001b[43mreachID\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcase\u001b[49m\u001b[43m]\u001b[49m, id_list)\n\u001b[32m 37\u001b[39m seas_data_vector = seas_data[case][q_name].stack(seg=(\u001b[33m\"\u001b[39m\u001b[33mlat\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mlon\u001b[39m\u001b[33m\"\u001b[39m))\n\u001b[32m 38\u001b[39m dr_flow = seas_data_vector.isel(seg=reach_index).sum(dim=\u001b[33m\"\u001b[39m\u001b[33mseg\u001b[39m\u001b[33m\"\u001b[39m)\n",
"\u001b[31mKeyError\u001b[39m: 'b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.188'"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%time\n",
"\n",
"nrows = 4\n",
"ncols = 2\n",
"fig, axes = plt.subplots(nrows, ncols, figsize=(7.25, 6.5))\n",
"plt.subplots_adjust(\n",
" top=0.95, bottom=0.065, right=0.98, left=0.10, hspace=0.225, wspace=0.250\n",
") # create some space below the plots by increasing the bottom-value\n",
"\n",
"for ix, ocean_name in enumerate(oceans_list):\n",
" row = ix // 2\n",
" col = ix % 2\n",
" for case, meta in case_dic.items():\n",
"\n",
" q_name = case_meta[meta[\"grid\"]][\"flow_name\"]\n",
"\n",
" if case_meta[meta[\"grid\"]][\"network_type\"] == \"vector\":\n",
" if ocean_name == \"global\":\n",
" id_list = gauge_shp1[case][\"route_id\"].values\n",
" else:\n",
" id_list = gauge_shp1[case][gauge_shp1[case][\"ocean\"] == ocean_name][\n",
" \"route_id\"\n",
" ].values\n",
" reach_index = get_index_array(reachID[case], id_list)\n",
" dr_flow = seas_data[case][q_name].isel(seg=reach_index).sum(dim=\"seg\")\n",
" dr_flow.plot(ax=axes[row, col], linestyle=\"-\", lw=0.75, label=case)\n",
"\n",
" elif case_meta[grid_name][\"network_type\"] == \"grid\": # means 2d grid\n",
" if ocean_name == \"global\":\n",
" id_list = gauge_shp1[case][\"route_id\"].values\n",
" else:\n",
" id_list = gauge_shp1[case][gauge_shp1[case][\"ocean\"] == ocean_name][\n",
" \"route_id\"\n",
" ].values\n",
"\n",
" reach_index = get_index_array(reachID[case], id_list)\n",
" seas_data_vector = seas_data[case][q_name].stack(seg=(\"lat\", \"lon\"))\n",
" dr_flow = seas_data_vector.isel(seg=reach_index).sum(dim=\"seg\")\n",
" dr_flow.plot(ax=axes[row, col], linestyle=\"-\", lw=0.75, label=case)\n",
"\n",
" # reference data\n",
" if obs_available:\n",
" if ocean_name == \"global\":\n",
" id_list = gauge_shp1[case][\"id\"].values\n",
" else:\n",
" id_list = gauge_shp1[case][gauge_shp1[case][\"ocean\"] == ocean_name][\n",
" \"id\"\n",
" ].values\n",
" gauge_index = get_index_array(ds_q[\"id\"].values, id_list)\n",
" dr_obs = dr_q_obs_seasonal.isel(station=gauge_index).sum(dim=\"station\")\n",
" dr_obs.plot(\n",
" ax=axes[row, col],\n",
" linestyle=\"None\",\n",
" marker=\"o\",\n",
" markersize=2,\n",
" c=\"k\",\n",
" label=\"D19\",\n",
" )\n",
"\n",
" axes[row, col].set_title(\"%d %s\" % (ix + 1, ocean_name), fontsize=9)\n",
" axes[row, col].set_xlabel(\"\")\n",
" if row < 7:\n",
" axes[row, col].set_xticklabels(\"\")\n",
" if col == 0:\n",
" axes[row, col].set_ylabel(\"Mon. flow [m$^3$/s]\", fontsize=9)\n",
" else:\n",
" axes[row, col].set_ylabel(\"\")\n",
" axes[row, col].tick_params(\"both\", labelsize=\"x-small\")\n",
"\n",
"# Legend- make space below the plot-raise bottom. there will be an label below the second last (bottom middle) ax, thanks to the bbox_to_anchor=(x, y) with a negative y-value.\n",
"axes[row, col].legend(\n",
" loc=\"center left\", bbox_to_anchor=(1.10, 0.40, 0.75, 0.1), ncol=1, fontsize=\"small\"\n",
")\n",
"\n",
"for jx in range(ix + 1, nrows * ncols):\n",
" row = jx // 2\n",
" col = jx % 2\n",
" fig.delaxes(axes[row][col])\n",
"\n",
"if figureSave:\n",
" plt.savefig(f\"./NB2_Fig1_ocean_discharge_season_{analysis_name}.png\", dpi=200)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fe26f035",
"metadata": {
"editable": true,
"papermill": {
"duration": null,
"end_time": null,
"exception": null,
"start_time": null,
"status": "pending"
},
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [],
"source": [
"if client:\n",
" client.shutdown()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "cupid-analysis",
"language": "python",
"name": "cupid-analysis"
},
"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.4"
},
"papermill": {
"duration": 35.200739,
"end_time": "2025-08-21T16:28:37.687834",
"exception": true,
"input_path": "/glade/derecho/scratch/hannay/tmp/tmpcuy9s_ef.ipynb",
"output_path": "/glade/work/hannay/CUPiD/examples/key_metrics/computed_notebooks/rof/global_discharge_ocean_compare_obs.ipynb",
"parameters": {
"CESM_output_dir": "/glade/derecho/scratch/hannay/archive",
"analysis_name": "",
"base_case_name": "b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.188",
"base_case_output_dir": "/glade/derecho/scratch/gmarques/archive",
"base_end_date": "0021-12-01",
"base_start_date": "0002-01-01",
"case_name": "b.e30_beta06.B1850C_LTso.ne30_t232_wgx3.192",
"climo_nyears": 10,
"end_date": "0021-12-01",
"figureSave": false,
"grid_name": "f09_f09_mosart",
"lc_kwargs": {
"threads_per_worker": 1
},
"obs_data_dir": "/glade/campaign/cesm/development/cross-wg/diagnostic_framework/CUPiD_obs_data",
"product": "/glade/work/hannay/CUPiD/examples/key_metrics/computed_notebooks//rof/global_discharge_ocean_compare_obs.ipynb",
"serial": true,
"start_date": "0002-01-01",
"subset_kwargs": {},
"ts_dir": null
},
"start_time": "2025-08-21T16:28:02.487095"
}
},
"nbformat": 4,
"nbformat_minor": 5
}