From f3c04bfeba75f57d92ef6829f8f9840e57dc7717 Mon Sep 17 00:00:00 2001 From: Willa Tobin Date: Mon, 20 Apr 2026 09:57:19 -0700 Subject: [PATCH 1/5] clean up paleo data into one download and one processing script --- paleo_scrips/paleo_benchmarks.ipynb | 438 -- .../ACCESS-ESM1-5/lig127k_wget_script.sh | 375 -- .../ACCESS-ESM1-5/midHolocene_wget_script.sh | 1041 ---- .../AWI-ESM-1-1-LR/lgm_wget_script.sh | 394 -- .../AWI-ESM-1-1-LR/lig127k_wget_script.sh | 394 -- .../AWI-ESM-1-1-LR/midHolocene_wget_script.sh | 1060 ---- .../CESM2-FV2/lgm_wget_script.sh | 384 -- .../CESM2-WACCM-FV2/lgm_wget_script.sh | 376 -- .../CESM2/lig127k_wget_script.sh | 388 -- .../CESM2/midHolocene_wget_script.sh | 1054 ---- .../CESM2/midPliocene-eoi400_wget_script.sh | 398 -- .../EC-Earth3-LR/lig127k_wget_script.sh | 584 -- .../EC-Earth3-LR/midHolocene_wget_script.sh | 1243 ---- .../midPliocene-eoi400_wget_script.sh | 574 -- .../FGOALS-f3-L/lig127k_wget_script.sh | 375 -- .../FGOALS-f3-L/midHolocene_wget_script.sh | 1041 ---- .../FGOALS-g3/lig127k_wget_script.sh | 424 -- .../FGOALS-g3/midHolocene_wget_script.sh | 1090 ---- .../GISS-E2-1-G/lig127k_wget_script.sh | 378 -- .../GISS-E2-1-G/midHolocene_wget_script.sh | 1042 ---- .../midPliocene-eoi400_wget_script.sh | 376 -- .../HadGEM3-GC31-LL/lig127k_wget_script.sh | 375 -- .../midHolocene_wget_script.sh | 1041 ---- .../midPliocene-eoi400_wget_script.sh | 376 -- .../INM-CM4-8/lgm_wget_script.sh | 376 -- .../INM-CM4-8/lig127k_wget_script.sh | 375 -- .../INM-CM4-8/midHolocene_wget_script.sh | 1042 ---- .../IPSL-CM6A-LR/lig127k_wget_script.sh | 378 -- .../IPSL-CM6A-LR/midHolocene_wget_script.sh | 1044 ---- .../midPliocene-eoi400_wget_script.sh | 375 -- .../MIROC-ES2L/lgm_wget_script.sh | 375 -- .../MPI-ESM1-2-LR/lgm_wget_script.sh | 399 -- .../MPI-ESM1-2-LR/midHolocene_wget_script.sh | 1065 ---- .../MRI-ESM2-0/midHolocene_wget_script.sh | 1041 ---- .../NESM3/lig127k_wget_script.sh | 375 -- .../NESM3/midHolocene_wget_script.sh | 1041 ---- .../NorESM1-F/lig127k_wget_script.sh | 394 -- .../NorESM1-F/midHolocene_wget_script.sh | 1060 ---- .../midPliocene-eoi400_wget_script.sh | 394 -- .../NorESM2-LM/lig127k_wget_script.sh | 384 -- .../NorESM2-LM/midHolocene_wget_script.sh | 1050 ---- .../paleo_data_cache/paleo_data_cache.py | 263 - paleo_scrips/prep_paleo_obs.ipynb | 444 -- paleo_scripts/README.md | 144 + paleo_scripts/download_paleo.py | 276 + paleo_scripts/paleo_constants.py | 5152 +++++++++++++++++ paleo_scripts/process_paleo.py | 478 ++ 47 files changed, 6050 insertions(+), 27096 deletions(-) delete mode 100644 paleo_scrips/paleo_benchmarks.ipynb delete mode 100755 paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/midHolocene_wget_script.sh delete mode 100644 paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/CESM2-FV2/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/CESM2-WACCM-FV2/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/CESM2/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/CESM2/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/CESM2/midPliocene-eoi400_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/EC-Earth3-LR/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/EC-Earth3-LR/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/EC-Earth3-LR/midPliocene-eoi400_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/FGOALS-f3-L/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/FGOALS-f3-L/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/FGOALS-g3/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/FGOALS-g3/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/GISS-E2-1-G/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/GISS-E2-1-G/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/GISS-E2-1-G/midPliocene-eoi400_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midPliocene-eoi400_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/INM-CM4-8/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/INM-CM4-8/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/INM-CM4-8/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midPliocene-eoi400_wget_script.sh delete mode 100644 paleo_scrips/paleo_data_cache/MIROC-ES2L/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/lgm_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/MRI-ESM2-0/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NESM3/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NESM3/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NorESM1-F/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NorESM1-F/midHolocene_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NorESM1-F/midPliocene-eoi400_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NorESM2-LM/lig127k_wget_script.sh delete mode 100755 paleo_scrips/paleo_data_cache/NorESM2-LM/midHolocene_wget_script.sh delete mode 100644 paleo_scrips/paleo_data_cache/paleo_data_cache.py delete mode 100644 paleo_scrips/prep_paleo_obs.ipynb create mode 100644 paleo_scripts/README.md create mode 100644 paleo_scripts/download_paleo.py create mode 100644 paleo_scripts/paleo_constants.py create mode 100644 paleo_scripts/process_paleo.py diff --git a/paleo_scrips/paleo_benchmarks.ipynb b/paleo_scrips/paleo_benchmarks.ipynb deleted file mode 100644 index bb161ae..0000000 --- a/paleo_scrips/paleo_benchmarks.ipynb +++ /dev/null @@ -1,438 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "34c6c309", - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr\n", - "import pandas as pd\n", - "import numpy as np\n", - "import glob\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import glob\n", - "import os\n", - "\n", - "import cartopy.crs as ccrs\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "id": "db423239", - "metadata": {}, - "source": [ - "# make annual maps for each period" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab7d5232", - "metadata": {}, - "outputs": [], - "source": [ - "root_path = 'paleo_data_cache'\n", - "# eocene\n", - "eocene_models = glob.glob(f'{root_path}/deepmip/dap.ceda.ac.uk/badc/cmip6/data/CMIP6Plus/DeepMIP/deepmip-eocene-p1/*/*/*-x*/*/climatology/*')\n", - "\n", - "# pliocene\n", - "pliocene_models = glob.glob(f'{root_path}/*/midPliocene-eoi400_tas_annual.nc')\n", - "# lig127k\n", - "lig127k_models = glob.glob(f'{root_path}/*/lig127k_tas_annual.nc')\n", - "# LGM\n", - "lgm_models = glob.glob(f'{root_path}/*/lgm_tas_annual.nc')\n", - "# midH\n", - "midHolocene_models = glob.glob(f'{root_path}/*/midHolocene_tas_annual.nc')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29fd269f", - "metadata": {}, - "outputs": [], - "source": [ - "# period = 'eocene'\n", - "# for file in eocene_models:\n", - "# model = file.split('/')[17]\n", - "# co2 = file.split('/')[18].split('-')[-1]\n", - "\n", - "# ds = xr.open_dataset(file)\n", - " \n", - "# if \"t\" in ds.dims:\n", - "# ds = ds.rename({'t':'time','latitude':'lat','longitude':'lon'})\n", - "# if \"time_counter\" in ds.dims:\n", - "# ds = ds.rename({'time_counter':'time'})\n", - " \n", - "# ds = ds.mean(dim='time')\n", - "\n", - "# fig, axis = plt.subplots(1, 1, figsize=(9,5),subplot_kw=dict(projection=ccrs.Robinson(central_longitude=180)))\n", - "\n", - "# cax = (ds['tas'] - 273.15).plot(\n", - "# ax=axis,transform=ccrs.PlateCarree(), \n", - "# vmin = -60,\n", - "# vmax = 60,\n", - "# cmap = 'RdBu_r',\n", - "# add_colorbar=False\n", - "# )\n", - "# cbar = fig.colorbar(cax, ticks=[-60,-30, 0, 30,60])\n", - "# axis.coastlines() # cartopy function\n", - "\n", - "# axis.set_title(f\"{model} CO2{co2}\",fontsize=20)\n", - "\n", - "# os.makedirs(f'results/paleo/{period}_maps',exist_ok=True)\n", - "# fig.savefig(f'results/paleo/{period}_maps/{model}_{float(co2[1:])}.png', bbox_inches='tight', pad_inches=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c8478718", - "metadata": {}, - "outputs": [], - "source": [ - "# period = 'pliocene' # run this for each non eocene period\n", - "# for file in pliocene_models:\n", - "# model = file.split('/')[8]\n", - "\n", - "# ds = xr.open_dataset(file)\n", - "\n", - "# fig, axis = plt.subplots(1, 1, figsize=(9,5),subplot_kw=dict(projection=ccrs.Robinson(central_longitude=180)))\n", - "\n", - "# cax = (ds['tas'] - 273.15).plot(\n", - "# ax=axis,transform=ccrs.PlateCarree(), \n", - "# vmin = -60,\n", - "# vmax = 60,\n", - "# cmap = 'RdBu_r',\n", - "# add_colorbar=False\n", - "# )\n", - "# cbar = fig.colorbar(cax, ticks=[-60,-30, 0, 30,60])\n", - "# axis.coastlines() # cartopy function\n", - "\n", - "# axis.set_title(model,fontsize=20)\n", - "\n", - "# os.makedirs(f'results/paleo/{period}_maps',exist_ok=True)\n", - "# fig.savefig(f'results/paleo/{period}_maps/{model}.png', bbox_inches='tight', pad_inches=0.1)" - ] - }, - { - "cell_type": "markdown", - "id": "1cd2797a", - "metadata": {}, - "source": [ - "for seasonal plots, do zonal means and make csv." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8626505d", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(\"https://cmip6.storage.googleapis.com/pangeo-cmip6.csv\")\n", - "piC_tas_df = df[(df['activity_id'] == 'CMIP') & (df['experiment_id'] == 'piControl')& (df['table_id'] == 'Amon')& (df['variable_id'] == 'tas')]#['table_id'].unique()\n", - "\n", - "piC_eocene = glob.glob(f'{root_path}/deepmip/dap.ceda.ac.uk/badc/cmip6/data/CMIP6Plus/DeepMIP/deepmip-eocene-p1/*/*/*-PI/*/climatology/*')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc4ef903", - "metadata": {}, - "outputs": [], - "source": [ - "### MONTHLY AVERAGES FOR EVERY MODEL AND TIME PERIOD ####\n", - "regions = {\n", - " 'global':[-90,90],\n", - " 'northern_hemisphere':[0,90],\n", - " 'tropics':[-30,30],\n", - " 'southern_hemisphere':[-90,0],\n", - "}\n", - "\n", - "monthly_files = glob.glob(f'{root_path}/*/*_tas_monthly.nc')\n", - "_results = []\n", - "\n", - "for region, bnds in regions.items():\n", - " for file in monthly_files:\n", - " model = file.split('/')[8]\n", - " period = file.split('/')[9].split('_')[0]\n", - "\n", - " ds = xr.open_dataset(file)\n", - " \n", - " ds_slice = ds.sel(lat = slice(bnds[0],bnds[1]))\n", - " ds_zmean = ds_slice['tas'].weighted(ds_slice['weight'].fillna(0)).mean(dim=['lat','lon'])\n", - "\n", - " # get pi control to calculate anomaly\n", - " piC_ds = xr.open_zarr(piC_tas_df[piC_tas_df['source_id'] == model].iloc[0]['zstore'],chunks={})\n", - " piC_zmean = piC_ds.sel(lat = slice(bnds[0],bnds[1]))['tas'].weighted(ds_slice['weight'].fillna(0)).mean(dim=['lat','lon'])\n", - " piC_zmean = piC_zmean.groupby('time.month').mean()\n", - " \n", - " df_zmean = ds_zmean.to_dataframe().reset_index()\n", - " df_zmean = df_zmean.merge(piC_zmean.to_dataframe().reset_index()[['month','tas']].rename(columns={'tas':'tas_pi'}),on='month')\n", - "\n", - " df_zmean['model'] = model\n", - " df_zmean['period'] = period\n", - " df_zmean['region'] = region\n", - " df_zmean['co2_exp'] = np.nan\n", - " _results.append(df_zmean)\n", - "\n", - " for file in eocene_models:\n", - " model = file.split('/')[17]\n", - " co2 = file.split('/')[18].split('-')[-1]\n", - " pi_file = [x for x in piC_eocene if model in x]\n", - "\n", - " ds = xr.open_dataset(file)\n", - " ds_pi = xr.open_dataset(pi_file[0])\n", - " \n", - " if \"t\" in ds.dims:\n", - " ds = ds.rename({'t':'time','latitude':'lat','longitude':'lon'})\n", - " ds_pi = ds_pi.rename({'t':'time','latitude':'lat','longitude':'lon'})\n", - " if \"time_counter\" in ds.dims:\n", - " ds = ds.rename({'time_counter':'time'})\n", - " ds_pi = ds_pi.rename({'time_counter':'time'})\n", - "\n", - " ds = ds.sortby('lat')\n", - " ds_pi = ds_pi.sortby('lat')\n", - " \n", - " ds = ds.groupby('time.month').mean()\n", - " ds_pi = ds_pi.groupby('time.month').mean()\n", - "\n", - " ds_slice = ds.sel(lat = slice(bnds[0],bnds[1]))\n", - " ds_pi_slice = ds_pi.sel(lat = slice(bnds[0],bnds[1]))\n", - "\n", - " weights = np.cos(np.deg2rad(ds_slice.lat))\n", - " weights = weights.expand_dims({\"lon\": ds_slice.lon})\n", - "\n", - " ds_zmean = ds_slice['tas'].weighted(weights.fillna(0)).mean(dim=['lat','lon'])\n", - " ds_pi_zmean = ds_pi_slice['tas'].weighted(weights.fillna(0)).mean(dim=['lat','lon'])\n", - "\n", - " df_zmean = ds_zmean.to_dataframe().reset_index()\n", - " df_zmean = df_zmean.merge(ds_pi_zmean.to_dataframe().reset_index()[['month','tas']].rename(columns={'tas':'tas_pi'}),on='month')\n", - "\n", - " df_zmean['model'] = model\n", - " df_zmean['period'] = 'eocene'\n", - " df_zmean['region'] = region\n", - " df_zmean['co2_exp'] = co2\n", - " _results.append(df_zmean)\n", - "\n", - "seasonal_paleo_results = pd.concat(_results)\n", - "# seasonal_paleo_results[(seasonal_paleo_results['period'] == 'lig127k') & (seasonal_paleo_results['region'] == 'global')].pivot_table(index='month',columns='model',values = 'tas').plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b39a0f97", - "metadata": {}, - "outputs": [], - "source": [ - "seasonal_paleo_results['co2_exp'] = seasonal_paleo_results['co2_exp'].str[1:].astype(float)\n", - "\n", - "seasonal_paleo_results['tas_anom'] = seasonal_paleo_results['tas'] - seasonal_paleo_results['tas_pi']\n", - "seasonal_paleo_results['tas'] = seasonal_paleo_results['tas'] - 273.15\n", - "seasonal_paleo_results['tas_pi'] = seasonal_paleo_results['tas_pi'] - 273.15\n", - "\n", - "seasonal_obs = pd.read_csv('paleo_observations/processed/monthly_mean_zonal_obs.csv').drop(columns=['Unnamed: 0'])\n", - "seasonal_obs = seasonal_obs[['month','period','region','tas_anom','error']].rename(columns={'tas_anom':'tas_obs'})\n", - "monthly_zonal_means = seasonal_paleo_results.merge(seasonal_obs,on=['month','period','region'],how='outer')\n", - "monthly_zonal_means['mae'] = (monthly_zonal_means['tas_anom'] - monthly_zonal_means['tas_obs']).abs()\n", - "monthly_zonal_means.drop(columns=['height']).to_csv('../results/paleo/monthly_zonal_means.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "44c681aa", - "metadata": {}, - "outputs": [], - "source": [ - "### ANNUAL AVERAGES FOR EVERY MODEL AND TIME PERIOD ####\n", - "\n", - "df = pd.read_csv(\"https://cmip6.storage.googleapis.com/pangeo-cmip6.csv\")\n", - "piC_tas_df = df[(df['activity_id'] == 'CMIP') & (df['experiment_id'] == 'piControl')& (df['table_id'] == 'Amon')& (df['variable_id'] == 'tas')]#['table_id'].unique()\n", - "\n", - "annual_files = glob.glob(f'{root_path}/*/*_tas_annual.nc')\n", - "_results = []\n", - "\n", - "for file in annual_files:\n", - " model = file.split('/')[8]\n", - " period = file.split('/')[9].split('_')[0]\n", - "\n", - " ds = xr.open_dataset(file)\n", - "\n", - " # get pi control to calculate anomaly\n", - " piC_ds = xr.open_zarr(piC_tas_df[piC_tas_df['source_id'] == model].iloc[0]['zstore'],chunks={})\n", - " ds_anom = ds - piC_ds.mean(dim='time').drop_vars(['height','lat_bnds','lon_bnds','time_bnds'],errors='ignore')\n", - "\n", - " ds_zmean = ds_anom['tas'].weighted(ds['weight'].fillna(0)).mean(dim=['lat','lon'])\n", - "\n", - " df_zmean = pd.DataFrame({\n", - " 'tas':[ds_zmean.values.tolist()],\n", - " 'model':[model],\n", - " 'period':[period],\n", - " 'region':['global'],\n", - " })\n", - " _results.append(df_zmean)\n", - "\n", - "annual_paleo_results = pd.concat(_results)\n", - "\n", - "annual_paleo_results['period_idx'] = 1\n", - "annual_paleo_results.loc[annual_paleo_results['period'] == 'lig127k','period_idx'] = 2\n", - "annual_paleo_results.loc[annual_paleo_results['period'] == 'lgm','period_idx'] = 3\n", - "annual_paleo_results.loc[annual_paleo_results['period'] == 'midHolocene','period_idx'] = 4\n", - "\n", - "\n", - "# get eocene annual results\n", - "eeco_files = glob.glob('paleo_data_cache/deepmip/dap.ceda.ac.uk/badc/cmip6/data/CMIP6Plus/DeepMIP/deepmip-eocene-p1/*/*/*/*/*/*')\n", - "\n", - "eeco_models_df = pd.concat([\n", - " pd.DataFrame(eeco_files).rename(columns={0:'local_path'}),\n", - " pd.DataFrame(eeco_files)[0].str.split('/',expand=True)[[17,18]].rename(columns={17:'model',18:'experiment'})\n", - "],axis=1)\n", - "\n", - "eeco_models_df['experiment_id'] = eeco_models_df['experiment'].str[-1]\n", - "eeco_models_df.loc[eeco_models_df['experiment_id'] == 'I','experiment_id'] = 0\n", - "eeco_models_df['experiment_id'] = eeco_models_df['experiment_id'].astype(int)\n", - "\n", - "eeco_exp_models = eeco_models_df[~(eeco_models_df['experiment_id'] == 0)] \n", - "\n", - "_results = []\n", - "for row in eeco_exp_models.itertuples(index=False):\n", - " model = row.model\n", - " eeco_path = row.local_path\n", - " pi_path = eeco_models_df[(eeco_models_df['model'] == model) & (eeco_models_df['experiment_id'] == 0)].iloc[0]['local_path']\n", - "\n", - " ds_piC = xr.open_dataset(pi_path,chunks={},decode_times=False)\n", - " ds_eeco = xr.open_dataset(eeco_path,chunks={},decode_times=False)\n", - "\n", - "\n", - " if \"t\" in ds_piC.dims:\n", - " ds_piC = ds_piC.rename({'t':'time','latitude':'lat','longitude':'lon'})\n", - " ds_eeco = ds_eeco.rename({'t':'time','latitude':'lat','longitude':'lon'})\n", - " if \"time_counter\" in ds_piC.dims:\n", - " ds_piC = ds_piC.rename({'time_counter':'time'})\n", - " ds_eeco = ds_eeco.rename({'time_counter':'time'})\n", - "\n", - " ds_piC = ds_piC.mean(dim='time').drop_vars(['height','lat_bnds','lon_bnds'],errors='ignore')\n", - " ds_eeco = ds_eeco.mean(dim='time').drop_vars(['height','lat_bnds','lon_bnds'],errors='ignore')\n", - "\n", - " ds_anom = ds_eeco - ds_piC\n", - "\n", - " weights = np.cos(np.deg2rad(ds_anom.lat))\n", - " weights = weights.expand_dims({\"lon\": ds_anom.lon})\n", - " weights.name = 'areacella'\n", - "\n", - " zmean = ds_anom.weighted(weights.fillna(0)).mean().compute()\n", - "\n", - " df_zmean = pd.DataFrame({\n", - " 'tas':[zmean['tas'].values.tolist()],\n", - " 'model':[model],\n", - " 'period':['eocene'],\n", - " 'region':['global'],\n", - " 'co2_exp':[row.experiment_id],\n", - " })\n", - " _results.append(df_zmean)\n", - "annual_eocene_results = pd.concat(_results)\n", - "annual_eocene_results['period_idx'] = 0\n", - "\n", - "annual_paleo_results = pd.concat([\n", - " annual_eocene_results,\n", - " annual_paleo_results\n", - "])\n", - "annual_paleo_results = annual_paleo_results.rename(columns={'tas':'tas_anom'})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a636d523", - "metadata": {}, - "outputs": [], - "source": [ - "# replicate IPCC fig 7.19\n", - "paleo_sat_avgs = pd.read_csv('paleo_observations/processed/annual_mean_global_obs.csv')\n", - "\n", - "fig, ax = plt.subplots()\n", - "\n", - "ax.errorbar(np.arange(1,6), paleo_sat_avgs['tas_anom'], yerr=paleo_sat_avgs['error'], fmt='o',label='Observations')\n", - "plt.scatter(x=annual_paleo_results['period_idx'] + 1.2,y=annual_paleo_results['tas_anom'],label='Models',color='orange')\n", - "\n", - "ax.set_xticks(np.arange(1,6))\n", - "ax.set_xticklabels(paleo_sat_avgs['period'],rotation=45);\n", - "ax.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "86b0ec03", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "mae_results = annual_paleo_results.merge(paleo_sat_avgs[['period','tas_anom']].rename(columns={'tas_anom':'tas_obs'}))\n", - "mae_results['mae'] = (mae_results['tas_anom'] - mae_results['tas_obs']).abs()\n", - "# add normalized MAE\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f4ce976e", - "metadata": {}, - "outputs": [], - "source": [ - "eocene_median_mae = mae_results[['period','co2_exp','mae']].groupby(['period','co2_exp']).median().reset_index().rename(columns={'mae':'median_mae'})\n", - "\n", - "non_eocene_median_mae = mae_results[['period','mae']].groupby('period').median().reset_index().rename(columns={'mae':'median_mae'})\n", - "non_eocene_median_mae = non_eocene_median_mae[non_eocene_median_mae['period'] != 'eocene']\n", - "non_eocene_median_mae['co2_exp'] = np.nan\n", - "\n", - "mae_results = mae_results.merge(\n", - " pd.concat([eocene_median_mae,non_eocene_median_mae]),\n", - " on=['period','co2_exp'],\n", - " how='outer'\n", - ")\n", - "\n", - "mae_results['nmae'] = mae_results['mae'] / mae_results['median_mae']\n", - "\n", - "mae_results.to_csv('../results/paleo/annual_zonal_means.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2dbfe586", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "backend_env", - "language": "python", - "name": "python3" - }, - "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.13.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/lig127k_wget_script.sh deleted file mode 100755 index ca34002..0000000 --- a/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/lig127k_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:54:20 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.lig127k.r1i1p1f1.Amon.tas.gn.v20191206|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/midHolocene_wget_script.sh deleted file mode 100755 index a8bc1fb..0000000 --- a/paleo_scrips/paleo_data_cache/ACCESS-ESM1-5/midHolocene_wget_script.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:37:46 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.midHolocene.r1i1p1f1.Amon.tas.gn.v20210422|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.midHolocene.r1i1p1f1.Amon.tas.gn.v20210422|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lgm_wget_script.sh deleted file mode 100644 index d54102c..0000000 --- a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lgm_wget_script.sh +++ /dev/null @@ -1,394 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:37:04 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lgm.r1i1p1f1.Amon.tas.gn.v20200212|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 20 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lig127k_wget_script.sh deleted file mode 100755 index 0d76f4b..0000000 --- a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/lig127k_wget_script.sh +++ /dev/null @@ -1,394 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:50:08 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lig127k.r1i1p1f1.Amon.tas.gn.v20200212|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 20 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/midHolocene_wget_script.sh deleted file mode 100755 index b0c5f1f..0000000 --- a/paleo_scrips/paleo_data_cache/AWI-ESM-1-1-LR/midHolocene_wget_script.sh +++ /dev/null @@ -1,1060 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:36:57 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20200212|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20200212|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/CESM2-FV2/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/CESM2-FV2/lgm_wget_script.sh deleted file mode 100755 index c9ba600..0000000 --- a/paleo_scrips/paleo_data_cache/CESM2-FV2/lgm_wget_script.sh +++ /dev/null @@ -1,384 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:37:19 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCAR.CESM2-FV2.lgm.r1i2p2f1.Amon.tas.gn.v20220915|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 10 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/CESM2-WACCM-FV2/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/CESM2-WACCM-FV2/lgm_wget_script.sh deleted file mode 100755 index ba6ac4d..0000000 --- a/paleo_scrips/paleo_data_cache/CESM2-WACCM-FV2/lgm_wget_script.sh +++ /dev/null @@ -1,376 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:40:33 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCAR.CESM2-WACCM-FV2.lgm.r1i2p2f1.Amon.tas.gn.v20220915|esgf-data.ucar.edu' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 2 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/CESM2/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/CESM2/lig127k_wget_script.sh deleted file mode 100755 index 39cae4f..0000000 --- a/paleo_scrips/paleo_data_cache/CESM2/lig127k_wget_script.sh +++ /dev/null @@ -1,388 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:56:09 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCAR.CESM2.lig127k.r1i1p1f1.Amon.tas.gn.v20190923|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 14 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/CESM2/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/CESM2/midHolocene_wget_script.sh deleted file mode 100755 index 4df648e..0000000 --- a/paleo_scrips/paleo_data_cache/CESM2/midHolocene_wget_script.sh +++ /dev/null @@ -1,1054 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:39:22 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCAR.CESM2.midHolocene.r1i1p1f1.Amon.tas.gn.v20190923|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCAR.CESM2.midHolocene.r1i1p1f1.Amon.tas.gn.v20190923|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/CESM2/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/CESM2/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index 2df4f04..0000000 --- a/paleo_scrips/paleo_data_cache/CESM2/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,398 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:21:42 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCAR.CESM2.midPliocene-eoi400.r1i1p1f1.Amon.tas.gn.v20200110|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 24 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/EC-Earth3-LR/lig127k_wget_script.sh deleted file mode 100755 index 0b11aa6..0000000 --- a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/lig127k_wget_script.sh +++ /dev/null @@ -1,584 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 16:37:21 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.lig127k.r1i1p1f1.Amon.tas.gr.v20200409|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 210 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midHolocene_wget_script.sh deleted file mode 100755 index 98eb639..0000000 --- a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midHolocene_wget_script.sh +++ /dev/null @@ -1,1243 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:36:25 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20200409|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20200409|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index b4cf704..0000000 --- a/paleo_scrips/paleo_data_cache/EC-Earth3-LR/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,574 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:19:36 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.midPliocene-eoi400.r1i1p1f1.Amon.tas.gr.v20200322|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 200 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/FGOALS-f3-L/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/FGOALS-f3-L/lig127k_wget_script.sh deleted file mode 100755 index 15b76bb..0000000 --- a/paleo_scrips/paleo_data_cache/FGOALS-f3-L/lig127k_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 17:03:11 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.CAS.FGOALS-f3-L.lig127k.r1i1p1f1.Amon.tas.gr.v20191025|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/FGOALS-f3-L/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/FGOALS-f3-L/midHolocene_wget_script.sh deleted file mode 100755 index c2730ed..0000000 --- a/paleo_scrips/paleo_data_cache/FGOALS-f3-L/midHolocene_wget_script.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:37:23 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CAS.FGOALS-f3-L.midHolocene.r1i1p1f1.Amon.tas.gr.v20191025|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CAS.FGOALS-f3-L.midHolocene.r1i1p1f1.Amon.tas.gr.v20191025|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/FGOALS-g3/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/FGOALS-g3/lig127k_wget_script.sh deleted file mode 100755 index 09ae103..0000000 --- a/paleo_scrips/paleo_data_cache/FGOALS-g3/lig127k_wget_script.sh +++ /dev/null @@ -1,424 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:51:12 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.CAS.FGOALS-g3.lig127k.r1i1p1f1.Amon.tas.gn.v20191030|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 50 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/FGOALS-g3/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/FGOALS-g3/midHolocene_wget_script.sh deleted file mode 100755 index a51e377..0000000 --- a/paleo_scrips/paleo_data_cache/FGOALS-g3/midHolocene_wget_script.sh +++ /dev/null @@ -1,1090 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:37:33 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r1i1p1f1.Amon.tas.gn.v20191024|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r1i1p1f1.Amon.tas.gn.v20191024|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/GISS-E2-1-G/lig127k_wget_script.sh deleted file mode 100755 index 6bbbe00..0000000 --- a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/lig127k_wget_script.sh +++ /dev/null @@ -1,378 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:55:17 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.lig127k.r1i1p1f1.Amon.tas.gn.v20190916|dpesgf03.nccs.nasa.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 4 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midHolocene_wget_script.sh deleted file mode 100755 index b97067d..0000000 --- a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midHolocene_wget_script.sh +++ /dev/null @@ -1,1042 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:38:58 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.midHolocene.r1i1p1f1.Amon.tas.gn.v20190916|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.midHolocene.r1i1p1f1.Amon.tas.gn.v20190916|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index c2eb056..0000000 --- a/paleo_scrips/paleo_data_cache/GISS-E2-1-G/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,376 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:21:17 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.midPliocene-eoi400.r1i1p1f1.Amon.tas.gn.v20190626|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 2 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/lig127k_wget_script.sh deleted file mode 100755 index ff1c9ba..0000000 --- a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/lig127k_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 16:33:46 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.lig127k.r1i1p1f1.Amon.tas.gn.v20210114|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midHolocene_wget_script.sh deleted file mode 100755 index 09258a5..0000000 --- a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midHolocene_wget_script.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:39:43 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NERC.HadGEM3-GC31-LL.midHolocene.r1i1p1f1.Amon.tas.gn.v20210111|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NERC.HadGEM3-GC31-LL.midHolocene.r1i1p1f1.Amon.tas.gn.v20210111|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index 01560df..0000000 --- a/paleo_scrips/paleo_data_cache/HadGEM3-GC31-LL/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,376 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:22:16 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.midPliocene-eoi400.r1i1p1f1.Amon.tas.gn.v20201222|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 2 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/INM-CM4-8/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/INM-CM4-8/lgm_wget_script.sh deleted file mode 100755 index 39ae6cf..0000000 --- a/paleo_scrips/paleo_data_cache/INM-CM4-8/lgm_wget_script.sh +++ /dev/null @@ -1,376 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:37:08 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.INM.INM-CM4-8.lgm.r1i1p1f1.Amon.tas.gr1.v20190802|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 2 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/INM-CM4-8/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/INM-CM4-8/lig127k_wget_script.sh deleted file mode 100755 index 9faf3aa..0000000 --- a/paleo_scrips/paleo_data_cache/INM-CM4-8/lig127k_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 17:04:35 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.INM.INM-CM4-8.lig127k.r1i1p1f1.Amon.tas.gr1.v20190802|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/INM-CM4-8/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/INM-CM4-8/midHolocene_wget_script.sh deleted file mode 100755 index 4180a91..0000000 --- a/paleo_scrips/paleo_data_cache/INM-CM4-8/midHolocene_wget_script.sh +++ /dev/null @@ -1,1042 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:38:02 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.INM.INM-CM4-8.midHolocene.r1i1p1f1.Amon.tas.gr1.v20190802|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.INM.INM-CM4-8.midHolocene.r1i1p1f1.Amon.tas.gr1.v20190802|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/lig127k_wget_script.sh deleted file mode 100755 index 7d05461..0000000 --- a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/lig127k_wget_script.sh +++ /dev/null @@ -1,378 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 16:36:28 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.lig127k.r1i1p1f1.Amon.tas.gr.v20180926|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 4 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midHolocene_wget_script.sh deleted file mode 100755 index 87373d6..0000000 --- a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midHolocene_wget_script.sh +++ /dev/null @@ -1,1044 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:38:14 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20180926|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20180926|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index db05ccd..0000000 --- a/paleo_scrips/paleo_data_cache/IPSL-CM6A-LR/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:21:07 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midPliocene-eoi400.r1i1p1f1.Amon.tas.gr.v20190118|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/MIROC-ES2L/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/MIROC-ES2L/lgm_wget_script.sh deleted file mode 100644 index 74d4a4d..0000000 --- a/paleo_scrips/paleo_data_cache/MIROC-ES2L/lgm_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:37:10 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.MIROC.MIROC-ES2L.lgm.r1i1p1f2.Amon.tas.gn.v20191002|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/lgm_wget_script.sh b/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/lgm_wget_script.sh deleted file mode 100755 index c2327b4..0000000 --- a/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/lgm_wget_script.sh +++ /dev/null @@ -1,399 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/08 13:37:15 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.lgm.r1i1p1f1.Amon.tas.gn.v20190710|esgf-node.ornl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 25 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/midHolocene_wget_script.sh deleted file mode 100755 index 220c062..0000000 --- a/paleo_scrips/paleo_data_cache/MPI-ESM1-2-LR/midHolocene_wget_script.sh +++ /dev/null @@ -1,1065 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:38:34 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20190710|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20190710|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/MRI-ESM2-0/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/MRI-ESM2-0/midHolocene_wget_script.sh deleted file mode 100755 index df08f5b..0000000 --- a/paleo_scrips/paleo_data_cache/MRI-ESM2-0/midHolocene_wget_script.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:38:45 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.MRI.MRI-ESM2-0.midHolocene.r1i1p1f1.Amon.tas.gn.v20190919|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.MRI.MRI-ESM2-0.midHolocene.r1i1p1f1.Amon.tas.gn.v20190919|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NESM3/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/NESM3/lig127k_wget_script.sh deleted file mode 100755 index 883e943..0000000 --- a/paleo_scrips/paleo_data_cache/NESM3/lig127k_wget_script.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 16:34:44 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NUIST.NESM3.lig127k.r1i1p1f1.Amon.tas.gn.v20190909|esg.lasg.ac.cn' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 1 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NESM3/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/NESM3/midHolocene_wget_script.sh deleted file mode 100755 index da91d6f..0000000 --- a/paleo_scrips/paleo_data_cache/NESM3/midHolocene_wget_script.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:36:44 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NUIST.NESM3.midHolocene.r1i1p1f1.Amon.tas.gn.v20190813|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NUIST.NESM3.midHolocene.r1i1p1f1.Amon.tas.gn.v20190813|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NorESM1-F/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/NorESM1-F/lig127k_wget_script.sh deleted file mode 100755 index ae3ad57..0000000 --- a/paleo_scrips/paleo_data_cache/NorESM1-F/lig127k_wget_script.sh +++ /dev/null @@ -1,394 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 15:57:19 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCC.NorESM1-F.lig127k.r1i1p1f1.Amon.tas.gn.v20190920|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 20 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NorESM1-F/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/NorESM1-F/midHolocene_wget_script.sh deleted file mode 100755 index f4b17e5..0000000 --- a/paleo_scrips/paleo_data_cache/NorESM1-F/midHolocene_wget_script.sh +++ /dev/null @@ -1,1060 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:22:42 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCC.NorESM1-F.midHolocene.r1i1p1f1.Amon.tas.gn.v20190920|esgf3.dkrz.de -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCC.NorESM1-F.midHolocene.r1i1p1f1.Amon.tas.gn.v20190920|esgf3.dkrz.de' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NorESM1-F/midPliocene-eoi400_wget_script.sh b/paleo_scrips/paleo_data_cache/NorESM1-F/midPliocene-eoi400_wget_script.sh deleted file mode 100755 index 3c8e728..0000000 --- a/paleo_scrips/paleo_data_cache/NorESM1-F/midPliocene-eoi400_wget_script.sh +++ /dev/null @@ -1,394 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/07 19:21:52 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCC.NorESM1-F.midPliocene-eoi400.r1i1p1f1.Amon.tas.gn.v20190920|eagle.alcf.anl.gov' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 20 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NorESM2-LM/lig127k_wget_script.sh b/paleo_scrips/paleo_data_cache/NorESM2-LM/lig127k_wget_script.sh deleted file mode 100755 index a569920..0000000 --- a/paleo_scrips/paleo_data_cache/NorESM2-LM/lig127k_wget_script.sh +++ /dev/null @@ -1,384 +0,0 @@ -#!/bin/bash -############################################################################## -# ESGF wget download script -# -# Template version: 0.4 -# Generated by nimbus.llnl.gov - 2025/08/05 16:32:38 -# Search URL: http://nimbus.llnl.gov/wget -# Request method: POST -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=0.4 -CACHE_FILE=.$(basename $0).status -search_url='http://nimbus.llnl.gov/wget' -request_method='POST' -url_params=( - 'CMIP6.PMIP.NCC.NorESM2-LM.lig127k.r1i1p1f1.Amon.tas.gn.v20191108|esgf-data04.diasjp.net' -) - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts 'F:w:iuUnSpdvqh' OPT; do - case $OPT in - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - S) skip_checksum=1;; # : Skip file checksum - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - post_data=$(IFS="&" ; echo "${url_params[*]}") - new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - $wget -O "$file" $url || { failed=1; break; } - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if ((skip_checksum)); then - echo "Skipping check of file checksum" - break - fi - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - unset failed - fi - - done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -# -# MAIN -# - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -cat <<'EOF-MESSAGE' -Script created for 10 file(s) -(The count won't match if you manually edit this file!) - -EOF-MESSAGE -sleep 1 - -check_os - -download - -dedup_cache_ - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/NorESM2-LM/midHolocene_wget_script.sh b/paleo_scrips/paleo_data_cache/NorESM2-LM/midHolocene_wget_script.sh deleted file mode 100755 index 9c2dbd5..0000000 --- a/paleo_scrips/paleo_data_cache/NorESM2-LM/midHolocene_wget_script.sh +++ /dev/null @@ -1,1050 +0,0 @@ -#!/bin/bash -############################################################################## -# ESG Federation download script -# -# Template version: 1.2 -# Generated by esgf-data.dkrz.de - 2025/08/01 14:40:54 -# Search URL: https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCC.NorESM2-LM.midHolocene.r1i1p1f1.Amon.tas.gn.v20191108|esgf.ceda.ac.uk -# -############################################################################### -# first be sure it's bash... anything out of bash or sh will break -# and the test will assure we are not using sh instead of bash -if [ $BASH ] && [ `basename $BASH` != bash ]; then - echo "######## This is a bash script! ##############" - echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." - echo "Trying to recover automatically..." - sleep 1 - /bin/bash $0 $@ - exit $? -fi - -version=1.3.2 -CACHE_FILE=.$(basename $0).status -openId= -search_url='https://esgf-data.dkrz.de/esg-search/wget?dataset_id=CMIP6.PMIP.NCC.NorESM2-LM.midHolocene.r1i1p1f1.Amon.tas.gn.v20191108|esgf.ceda.ac.uk' - -#These are the embedded files to be downloaded -download_files="$(cat < 10#${ver2[i]})) - then - return 1 - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - return 2 - fi - done - return 0 -} - -check_commands() { - #check wget - local MIN_WGET_VERSION=1.10 - vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION - case $? in - 2) #lower - wget -V - echo - echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 - exit 1 - esac -} - -usage() { - echo "Usage: $(basename $0) [flags] [openid] [username]" - echo "Flags is one of:" - sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 - echo - echo "This command stores the states of the downloads in .$0.status" - echo "For more information check the website: http://esgf.org/wiki/ESGF_wget" -} - -#defaults -debug=0 -clean_work=1 - -#parse flags -while getopts ':c:pfF:o:w:isuUndvqhHI:T' OPT; do - case $OPT in - H) skip_security=1 && use_http_sec=1;; # : Authenticate with OpenID (username,) and password, without the need for a certificate. - T) force_TLSv1=1;; # : Forces wget to use TLSv1. - c) ESG_CREDENTIALS="$OPTARG";; # : use this certificate for authentication. - f) force=1;; # : force certificate retrieval (defaults to only once per day); for certificate-less authentication (see -H option), this flag will force login and refresh cookies. - F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) - o) openId="$OPTARG";; #: Provide OpenID instead of interactively asking for it. - I) username_supplied="$OPTARG";; # : Explicitly set user ID. By default, the user ID is extracted from the last component of the OpenID URL. Use this flag to override this behaviour. - w) output="$OPTARG";; # : Write embedded files into a file and exit - i) insecure=1;; # : set insecure mode, i.e. don't check server certificate - s) skip_security=1 && use_cookies_for_http_basic_auth_start=1;; # : completely skip security. It will only work if the accessed data is not secured at all. -- works only if the accessed data is unsecured or a certificate exists or cookies are saved (latter applies to -H option only). - u) update=1;; # : Issue the search again and see if something has changed. - U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) - n) dry_run=1;; # : Don't download any files, just report. - p) clean_work=0;; # : preserve data that failed checksum - d) verbose=1;debug=1;; # : display debug information - v) verbose=1;; # : be more verbose - q) quiet=1;; # : be less verbose - h) usage && exit 0;; # : displays this help - \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; - \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; - esac -done -shift $(($OPTIND - 1)) - -#setup input as desired by the user -if [[ "$input_file" ]]; then - if [[ "$input_file" == '-' ]]; then - download_files="$(cat)" #read from STDIN - exec 0$output - exit -fi - - -#assure we have everything we need -check_commands - -if ((update)); then - echo "Checking the server for changes..." - new_wget="$(wget "$search_url" -qO -)" - compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" - if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then - echo "No changes detected." - else - echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" - counter=0 - while [[ -f $0.old.$counter ]]; do ((counter++)); done - mv $0 $0.old.$counter - echo "$new_wget" > $0 - fi - exit 0 -fi - - -############################################################################## -check_java() { - if ! type java >& /dev/null; then - echo "Java could not be found." >&2 - return 1 - fi - if java -version 2>&1|grep openjdk >/dev/null; then - openjdk=1; - else - openjdk=0; - fi - jversion=($(jversion=$(java -version 2>&1 | awk '/version/ {gsub("\"","");print $3}'); echo ${jversion//./ })) - mVer=${jversion[1]} - if [ $openjdk -eq 1 ]; then - mVer=${jversion[0]} - if ((mVer<5)); then - echo "Openjdk detected. Version 9+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - else - - if ((mVer<5)); then - echo "Java version 1.5+ is required for retrieving the certificate." >&2 - echo "Current version seems older: $(java -version | head -n1) " >&2 - return 1 - fi - fi -} - -check_myproxy_logon() { - if ! type myproxy-logon >& /dev/null; then - echo "myproxy-logon could not be found." >&2 - return 1 - fi - echo "myproxy-logon found" >&2 -} - -proxy_to_java() { - local proxy_user proxy_pass proxy_server proxy_port - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$http_proxy) - local JAVA_PROXY= - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttp.proxyPort=$proxy_port" - eval $(sed 's#^\(https\?://\)\?\(\([^:@]*\)\(:\([^@]*\)\)\?@\)\?\([^:/]*\)\(:\([0-9]*\)\)\?.*#proxy_user=\3;proxy_pass=\5;proxy_server=\6;proxy_port=\8#'<<<$https_proxy) - [[ "$proxy_server" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyHost=$proxy_server" - [[ "$proxy_port" ]] && JAVA_PROXY=$JAVA_PROXY" -Dhttps.proxyPort=$proxy_port" - - echo "$JAVA_PROXY" -} - -# get certificates from github -get_certificates() { - # don't if this was already done today - [[ -z $force && "$(find $ESG_CERT_DIR -type d -mtime -1 2>/dev/null)" ]] && return 0 - echo -n "Retrieving Federation Certificates..." >&2 - - if ! wget -O $ESG_HOME/esg-truststore.ts --no-check-certificate https://github.com/ESGF/esgf-dist/raw/master/installer/certs/esg-truststore.ts; then - echo "Could not fetch esg-truststore"; - return 1 - fi - - if ! wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar -O - -q | tar x -C $ESG_HOME; then - #certificates tarred into esg_trusted_certificates. (if it breaks, let the user know why - wget --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/esg_trusted_certificates.tar - echo "Could't update certs!" >&2 - return 1 - else - #if here everythng went fine. Replace old cert with this ones - [[ -d $ESG_CERT_DIR ]] && rm -r $ESG_CERT_DIR || mkdir -p $(dirname $ESG_CERT_DIR) - mv $ESG_HOME/esg_trusted_certificates $ESG_CERT_DIR - touch $ESG_CERT_DIR - echo "done!" >&2 - fi - -} - -# Retrieve ESG credentials -unset pass -get_credentials() { - if check_java - then - use_java=1 - else - use_java=0 - echo "No suitable java for obtaining certificate - checking for myproxy-logon instead" >&2 - check_myproxy_logon || exit 1 - fi - #get all certificates - get_certificates - - if [[ -z "$(find $MYPROXY_GETCERT -type f -mtime -1 2>/dev/null)" ]]; then - echo -n "(Downloading $MYPROXY_GETCERT... " - mkdir -p $(dirname $MYPROXY_GETCERT) - if wget -q --no-check-certificate https://raw.githubusercontent.com/ESGF/esgf-dist/master/installer/certs/getcert.jar -O $MYPROXY_GETCERT;then - echo 'done)' - touch $MYPROXY_GETCERT - else - echo 'failed)' - fi - fi - - #if the user already defined one, use it - if [[ -z $openId ]]; then - #try to parse the last valid value if any - [[ -f "$MYPROXY_STATUS" ]] && openId=$(awk -F= '/^OpenID/ {gsub("\\\\", ""); print $2}' $MYPROXY_STATUS) - if [[ -z $openId ]]; then - #no OpenID, we need to ask the user - echo -n "Please give your OpenID (Example: https://myserver/example/username) ? " - else - #Allow the user to change it if desired - echo -n "Please give your OpenID (hit ENTER to accept default: $openId)? " - fi - read -e - [[ "$REPLY" ]] && openId="$REPLY" - else - ((verbose)) && echo "Using user defined OpenID $openId (to change use -o )" - fi - - if grep -q ceda.ac.uk <<<$openId; then - username=${openId##*/} - echo -n "Please give your username if different [$username]: " - read -e - [[ "$REPLY" ]] && username="$REPLY" - fi - - - - if [ $use_java -eq 1 ] - then - local args= - #get password - [[ ! "$pass" ]] && read -sp "MyProxy Password? " pass - [[ "$openId" ]] && args=$args" --oid $openId" - [[ "$pass" ]] && args=$args" -P $pass" - [[ "$username" ]] && args=$args" -l $username" - - echo -n $'\nRetrieving Credentials...' >&2 - if ! java $(proxy_to_java) -jar $MYPROXY_GETCERT $args --ca-directory $ESG_CERT_DIR --output $ESG_CREDENTIALS ; then - echo "Certificate could not be retrieved" - exit 1 - fi - echo "done!" >&2 - else - args=`openid_to_myproxy_args $openId $username` || exit 1 - if ! myproxy-logon $args -b -o $ESG_CREDENTIALS - then - echo "Certificate could not be retrieved" - exit 1 - fi - cp $HOME/.globus/certificates/* $ESG_CERT_DIR/ - fi -} - -openid_to_myproxy_args() { - python - </dev/null; then - #check openssl and certificate - if ! openssl x509 -checkend $CERT_EXPIRATION_WARNING -noout -in $ESG_CERT 2>/dev/null; then - echo "The certificate expires in less than $((CERT_EXPIRATION_WARNING / 60 / 60)) hour(s). Renewing..." - get_credentials - else - #ok, certificate is fine - return 0 - fi - fi -} - -# -# Detect ESG credentials -# -find_credentials() { - - #is X509_USER_PROXY or $HOME/.esg/credential.pem - if [[ -f "$ESG_CREDENTIALS" ]]; then - # file found, proceed. - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - elif [[ -f "$X509_USER_CERT" && -f "$X509_USER_KEY" ]]; then - # second try, use these certificates. - ESG_CERT="$X509_USER_CERT" - ESG_KEY="$X509_USER_KEY" - else - # If credentials are not present, just point to where they should go - echo "No ESG Credentials found in $ESG_CREDENTIALS" >&2 - ESG_CERT="$ESG_CREDENTIALS" - ESG_KEY="$ESG_CREDENTIALS" - #they will be retrieved later one - fi - - - #chek openssl and certificate - if (which openssl &>/dev/null); then - if ( openssl version | grep 'OpenSSL 1\.0' ); then - echo '** WARNING: ESGF Host certificate checking might not be compatible with OpenSSL 1.0+' - fi - check_cert || { (($?==1)); exit 1; } - fi - - if [[ $CHECK_SERVER_CERT == "Yes" ]]; then - [[ -d "$ESG_CERT_DIR" ]] || { echo "CA certs not found. Aborting."; exit 1; } - PKI_WGET_OPTS="--ca-directory=$ESG_CERT_DIR" - fi - - #some wget version complain if there's no file present - [[ -f $COOKIE_JAR ]] || touch $COOKIE_JAR - - PKI_WGET_OPTS="$PKI_WGET_OPTS --certificate=$ESG_CERT --private-key=$ESG_KEY --save-cookies=$COOKIE_JAR --load-cookies=$COOKIE_JAR --ca-certificate=$ESG_CERT" - -} - -check_chksum() { - local file="$1" - local chk_type=$2 - local chk_value=$3 - local local_chksum=Unknown - - case $chk_type in - md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; - sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; - *) echo "Can't verify checksum." && return 0;; - esac - - #verify - ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 - echo $local_chksum -} - -#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) -md5sum_() { - hash -r - if type md5sum >& /dev/null; then - echo $(md5sum $@) - else - echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') - fi -} - -#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) -sha256sum_() { - hash -r - if type sha256sum >& /dev/null; then - echo $(sha256sum $@) - elif type shasum >& /dev/null; then - echo $(shasum -a 256 $@) - else - echo $(sha2 -q -256 $@) - fi -} - -get_mod_time_() { - if ((MACOSX)); then - #on a mac modtime is stat -f %m - echo "$(stat -f %m $@)" - else - #on linux (cygwin) modtime is stat -c %Y - echo "$(stat -c %Y $@)" - fi - return 0; -} - -remove_from_cache() { - local entry="$1" - local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" - echo "$tmp_file" > "$CACHE_FILE" - unset cached -} - -#Download data from node using cookies and not certificates. -download_http_sec() -{ - #The data to be downloaded. - data=" $url" - filename="$file" - - #Wget args. - if ((insecure)) - then - wget_args=" --no-check-certificate --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - else - wget_args=" --ca-directory=$WGET_TRUSTED_CERTIFICATES --cookies=on --keep-session-cookies --save-cookies $COOKIES_FOLDER/wcookies.txt " - fi - - if ((use_cookies_for_http_basic_auth_start)) || ((use_cookies_for_http_basic_auth)) - then - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - fi - - if((force_TLSv1)) - then - wget_args=" $wget_args"" --secure-protocol=TLSv1 " - fi - - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - wget_args="$wget_args $ESGF_WGET_OPTS" - fi - - - #use cookies for the next downloads - use_cookies_for_http_basic_auth=1; - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "wget $wget_args $data\n" - fi - - - #Try to download the data. - command="wget $wget_args -O $filename $data" - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Extract orp service from url ? - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" == 1 )) && - if echo "$http_resp" | grep -q "/esg-orp/" - then - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - orp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - - #Use cookies for transaction with orp. - wget_args=" $wget_args"" --load-cookies $COOKIES_FOLDER/wcookies.txt" - - #Download data using either http basic auth or http login form. - if [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - download_http_sec_open_id - else - download_http_sec_decide_service - fi - else - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo "ERROR : http request to OpenID Relying Party service failed." - failed=1 - fi - fi -} - - -#Function that decides which implementaion of idp to use. -download_http_sec_decide_service() -{ - #find claimed id - - pos=$(echo "$openid_c" | egrep -o '/' | wc -l) - username_c=$(echo "$openid_c" | cut -d'/' -f "$(($pos + 1))") - esgf_uri=$(echo "$openid_c" | egrep -o '/esgf-idp/openid/') - - host=$(echo "$openid_c" | cut -d'/' -f 3) - #test ceda first. - - if [[ -z "$esgf_uri" ]] - then - openid_c_tmp="https://""$host""/openid/" - else - openid_c_tmp="https://""$host""/esgf-idp/openid/" - fi - - command="wget "$openid_c_tmp" --no-check-certificate ${force_TLSv1:+--secure-protocol=TLSv1} -O-" - - if [[ ! -z "$ESGF_WGET_OPTS" ]] - then - command="$command $ESGF_WGET_OPTS" - fi - - #Debug message. - if ((debug)) - then - echo -e "\nExecuting:\n" - echo -e "$command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - if echo "$http_resp" | grep -q "[application/xrds+xml]" \ - && echo "$http_resp" | grep -q "200 OK" \ - && (( cmd_exit_status == 0 )) - then - openid_c=$openid_c_tmp - download_http_sec_open_id - else - if [[ -z "$esgf_uri" ]] - then - echo "ERROR : HTTP request to OpenID Relying Party service failed." - failed=1 - else - download_http_sec_cl_id - fi - fi -} - - -download_http_sec_retry() -{ - echo -e "\nRetrying....\n" - #Retry in case that last redirect did not work, this happens with older version of wget. - command="wget $wget_args $data" - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - if echo "$http_resp" | grep -q "401 Unauthorized" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || echo "$http_resp" | grep -q "Connection timed out." \ - || echo "$http_resp" | grep -q "no-check-certificate" \ - || (( $cmd_exit_status != 0 )) - then - echo -e "\nERROR : Retry failed.\n" - #rm "$filename" - failed=1 - fi #if retry failed. -} - -#Function for downloading data using the claimed id. -download_http_sec_cl_id() -{ - #Http request for sending openid to the orp service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" $wget_args -O- https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - - #Extract orp service from openid ? - #Evaluate response.If redirected to idp service send the credentials. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( redirects == 2 )) && - if echo "$http_resp" | grep -q "login.htm" && (( cmd_exit_status == 0 )) - then - - urls=$(echo "$http_resp" | egrep -o 'https://[^ ]+' | cut -d'/' -f 3) - idp_service=$(echo "$urls" | tr '\n' ' ' | cut -d' ' -f 2) - - command="wget --post-data password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$idp_service/esgf-idp/idp/login.htm" - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "wget $command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 5 )) \ - if echo "$http_resp" | grep -q "text/html" \ - || echo "$http_resp" | grep -q "403: Forbidden" \ - || (( cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi - - else - echo "ERROR : HTTP request to OpenID Provider service failed." - failed=1 - fi #if redirected to idp. -} - - - -download_http_sec_open_id() -{ - #Http request for sending openid to the orp web service. - command="wget --post-data \"openid_identifier=$openid_c&rememberOpenid=on\" --header=\"esgf-idea-agent-type:basic_auth\" --http-user=\"$username_c\" --http-password=\"$password_c\" $wget_args ${quiet:+-q} ${quiet:--v} -O $filename https://$orp_service/esg-orp/j_spring_openid_security_check.htm " - - - #Debug message. - if ((debug)) - then - echo -e "Executing:\n" - echo -e "$command\n" - fi - - #Execution of command. - http_resp=$(eval $command 2>&1) - cmd_exit_status="$?" - - - if ((debug)) - then - echo -e "\nHTTP response:\n $http_resp\n" - fi - - #Evaluate response. - #redirects=$(echo "$http_resp" | egrep -c ' 302 ') - #(( "$redirects" != 7 )) || - if echo "$http_resp" | grep -q "text/html" || (( $cmd_exit_status != 0 )) - then - rm "$filename" - download_http_sec_retry - fi #if error during http basic authentication. - -} - - -download() { - wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v} -c ${force_TLSv1:+--secure-protocol=TLSv1} $PKI_WGET_OPTS" - - while read line - do - # read csv here document into proper variables - eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) - - #Process the file - echo -n "$file ..." - - #get the cached entry if any. - cached="$(grep -e "^$file" "$CACHE_FILE")" - - #if we have the cache entry but no file, clean it. - if [[ ! -f $file && "$cached" ]]; then - #the file was removed, clean the cache - remove_from_cache "$file" - unset cached - fi - - #check it wasn't modified - if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then - if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then - echo "Already downloaded and verified" - continue - elif ((update_files)); then - #user want's to overwrite newer files - rm $file - remove_from_cache "$file" - unset cached - else - #file on server is different from what we have. - echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" - continue - fi - fi - unset chksum_err_value chksum_err_count - - while : ; do - # (if we had the file size, we could check before trying to complete) - echo "Downloading" - [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" - if ((dry_run)); then - #all important info was already displayed, if in dry_run mode just abort - #No status will be stored - break - else - if ((use_http_sec)) - then - download_http_sec - if ((failed)) - then - break - fi - else - $wget -O "$file" $url || { failed=1; break; } - fi - fi - - #check if file is there - if [[ -f $file ]]; then - ((debug)) && echo file found - if [[ ! "$chksum" ]]; then - echo "Checksum not provided, can't verify file integrity" - break - fi - result_chksum=$(check_chksum "$file" $chksum_type $chksum) - if [[ "$result_chksum" != "$chksum" ]]; then - echo " $chksum_type failed!" - if ((clean_work)); then - if !((chksum_err_count)); then - chksum_err_value=$result_chksum - chksum_err_count=2 - elif ((checksum_err_count--)); then - if [[ "$result_chksum" != "$chksum_err_value" ]]; then - #this is a real transmission problem - chksum_err_value=$result_chksum - chksum_err_count=2 - fi - else - #ok if here we keep getting the same "different" checksum - echo "The file returns always a different checksum!" - echo "Contact the data owner to verify what is happening." - echo - sleep 1 - break - fi - - rm $file - #try again - echo -n " re-trying..." - continue - else - echo " don't use -p or remove manually." - fi - else - echo " $chksum_type ok. done!" - echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE - fi - fi - #done! - break - done - - if ((failed)); then - echo "download failed" - # most common failure is certificate expiration, so check this - #if we have the pasword we can retrigger download - ((!skip_security)) && [[ "$pass" ]] && check_cert - unset failed - fi - -done <<<"$download_files" - -} - -dedup_cache_() { - local file=${1:-${CACHE_FILE}} - ((debug)) && echo "dedup'ing cache ${file} ..." - local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) - ((DEBUG)) && echo "$tmp" - echo "$tmp" > $file - ((debug)) && echo "(cache dedup'ed)" -} - -http_basic_auth_func_info_message() -{ - echo "********************************************************************************" - echo "* *" - echo "* Note that new functionality to allow authentication without the need for *" - echo "* certificates is available with this version of the wget script. To enable, *" - echo "* use the \"-H\" option and enter your OpenID and password when prompted: *" - echo "* *" - echo "* $ "$(basename "$0")" -H [options...] *" - echo "* *" - echo "* For a full description of the available options use the help option: *" - echo "* *" - echo "* $ "$(basename "$0")" -h *" - echo "* *" - echo "********************************************************************************" -} - -# -# MAIN -# - -if ((!use_http_sec)) -then - http_basic_auth_func_info_message -fi - -echo "Running $(basename $0) version: $version" -((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" -echo "Use $(basename $0) -h for help."$'\n' - -((debug)) && cat< 1)) || (("$#" == 1)) ) - then - openid_c=$1 - else - read -p "Enter your openid : " openid_c - fi - - - #Read username. - if [[ ! -z "$username_supplied" ]] - then - username_c="$username_supplied" - elif (("$#" == 2)) - then - username_c=$2 - elif [[ "$openid_c" == */openid/ || "$openid_c" == */openid ]] - then - read -p "Enter username : " username_c - fi - - #Read password. - read -s -p "Enter password : " password_c - echo -e "\n" - - fi #use cookies - -fi #use_http_sec - - -#do we have old results? Create the file if not -[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE - -#clean the force parameter if here (at htis point we already have the certificate) -unset force - -download - -dedup_cache_ - - -echo "done" diff --git a/paleo_scrips/paleo_data_cache/paleo_data_cache.py b/paleo_scrips/paleo_data_cache/paleo_data_cache.py deleted file mode 100644 index 7e69f21..0000000 --- a/paleo_scrips/paleo_data_cache/paleo_data_cache.py +++ /dev/null @@ -1,263 +0,0 @@ -import argparse -import logging -import os -import sys -import glob -from pathlib import Path -from typing import List, Optional - -import numpy as np -import xarray as xr - - -def setup_logging(log_level: str = "INFO", log_file: Optional[str] = None) -> None: - """Set up logging configuration.""" - log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" - - handlers = [logging.StreamHandler(sys.stdout)] - if log_file: - handlers.append(logging.FileHandler(log_file)) - - logging.basicConfig( - level=getattr(logging, log_level.upper()), - format=log_format, - handlers=handlers - ) - - -def find_model_folders(data_cache_dir: Path, paleo_period: str) -> List[str]: - """Find model folders containing wget scripts for the specified period.""" - search_pattern = data_cache_dir / "*" / f"{paleo_period}*.sh" - model_folders = glob.glob(str(search_pattern)) - - logging.info(f"Found {len(model_folders)} model folders for period '{paleo_period}'") - for folder in model_folders: - logging.debug(f"Model folder: {folder}") - - return model_folders - - -def download_data(wget_file: str) -> bool: - """Download data using wget script.""" - logging.info(f"Downloading data using script: {wget_file}") - - try: - # Make script executable - os.system(f"chmod +x {wget_file}") - # Execute download script - exit_code = os.system(f"{wget_file}") - - if exit_code == 0: - logging.info("Data download completed successfully") - return True - else: - logging.error(f"Download failed with exit code: {exit_code}") - return False - except Exception as e: - logging.error(f"Error during download: {e}") - return False - - -def load_netcdf_files(model_dir: str) -> Optional[xr.Dataset]: - """Load and merge NetCDF files with temperature data.""" - nc_files = glob.glob(f"{model_dir}tas*") - - if not nc_files: - logging.warning(f"No temperature files found in {model_dir}") - return None - - logging.info(f"Loading {len(nc_files)} NetCDF files") - - # Variables to drop if they exist - drop_vars = ["time_bnds", "lat_bnds", "lon_bnds", "height"] - - try: - # First attempt without cftime - ds = xr.open_mfdataset(nc_files, chunks={}).drop_vars(drop_vars, errors="ignore") - logging.info("Successfully loaded dataset without cftime") - except Exception as e: - logging.warning(f"Failed to load without cftime: {e}") - try: - # Second attempt with cftime for non-standard calendars - ds = xr.open_mfdataset(nc_files, use_cftime=True, chunks={}).drop_vars(drop_vars, errors="ignore") - logging.info("Successfully loaded dataset with cftime") - except Exception as e2: - logging.error(f"Failed to load dataset: {e2}") - return None - - return ds - - -def calculate_area_weights(ds: xr.Dataset) -> xr.Dataset: - """Calculate area weights based on latitude.""" - logging.info("Calculating area weights") - weights = np.cos(np.deg2rad(ds.lat)) - weights = weights.expand_dims({"lon": ds.lon}) - weights.name = "areacella" - return weights - - -def process_temperature_data(ds: xr.Dataset, model_dir: str, paleo_period: str) -> None: - """Process temperature data and save annual and monthly statistics.""" - logging.info("Processing temperature data") - - # Calculate area weights - weights = calculate_area_weights(ds) - - # Annual statistics - logging.info("Calculating annual mean and standard deviation") - ds_mean_annual = ds.mean(dim="time") - ds_std_annual = ds.std(dim="time").rename({"tas": "tas_std"}) - - annual_output = f"{model_dir}{paleo_period}_tas_annual.nc" - logging.info(f"Saving annual statistics to: {annual_output}") - xr.merge([ds_mean_annual, ds_std_annual, weights.to_dataset(name="weight")]).to_netcdf(annual_output) - - # Monthly statistics - logging.info("Calculating monthly mean and standard deviation") - ds_mean_mon = ds.groupby("time.month").mean() - ds_std_mon = ds.groupby("time.month").std().rename({"tas": "tas_std"}) - - monthly_output = f"{model_dir}{paleo_period}_tas_monthly.nc" - logging.info(f"Saving monthly statistics to: {monthly_output}") - xr.merge([ds_mean_mon, ds_std_mon, weights.to_dataset(name="weight")]).to_netcdf(monthly_output) - - -def cleanup_files(model_dir: str) -> None: - """Remove temporary NetCDF files after processing.""" - nc_files = glob.glob(f"{model_dir}tas*") - logging.info(f"Cleaning up {len(nc_files)} temporary files") - - for file in nc_files: - try: - os.remove(file) - logging.debug(f"Removed: {file}") - except Exception as e: - logging.warning(f"Failed to remove {file}: {e}") - - -def download_eocene_data() -> None: - """Handle special case for Eocene data download.""" - logging.info("Downloading Eocene data via direct wget") - wget_command = ( - 'wget -e robots=off --mirror --no-parent -r --accept "tas_*mean.nc" ' - 'https://dap.ceda.ac.uk/badc/cmip6/data/CMIP6Plus/DeepMIP/deepmip-eocene-p1/' - ) - - exit_code = os.system(wget_command) - if exit_code == 0: - logging.info("Eocene data download completed successfully") - else: - logging.error(f"Eocene data download failed with exit code: {exit_code}") - - -def process_paleo_period(data_cache_dir: Path, paleo_period: str, skip_download: bool = False) -> None: - """Process data for a specific paleoclimate period.""" - logging.info(f"Processing paleoclimate period: {paleo_period}") - - # Special handling for Eocene - if paleo_period == 'eocene': - download_eocene_data() - return - - # Find model folders - model_folders = find_model_folders(data_cache_dir, paleo_period) - - if not model_folders: - logging.error(f"No model folders found for period '{paleo_period}'") - return - - # Process each model - for wget_file in model_folders: - model_dir = "/".join(wget_file.split("/")[:-1]) + "/" - model_name = Path(wget_file).parent.name - logging.info(f"Processing model: {model_name}") - - # Download data unless skipped - if not skip_download: - if not download_data(wget_file): - logging.error(f"Skipping model {model_name} due to download failure") - continue - - # Load and process data - ds = load_netcdf_files(model_dir) - if ds is None: - logging.error(f"Skipping model {model_name} due to data loading failure") - continue - - try: - process_temperature_data(ds, model_dir, paleo_period) - logging.info(f"Successfully processed model: {model_name}") - except Exception as e: - logging.error(f"Failed to process model {model_name}: {e}") - continue - finally: - if not skip_download: - cleanup_files(model_dir) - - -def main() -> None: - """Main function with argument parsing and execution.""" - parser = argparse.ArgumentParser( - description="Process paleoclimate temperature data from CMIP6 models", - formatter_class=argparse.ArgumentDefaultsHelpFormatter - ) - - parser.add_argument( - "--paleo-period", - type=str, - choices=["lgm", "midHolocene", "lig127k", "midPliocene-eoi400", "eocene"], - help="Paleoclimate period to process" - ) - - parser.add_argument( - "--data-cache-dir", - type=Path, - required=True, - help="Path to the paleoclimate data cache directory" - ) - - parser.add_argument( - "--skip-download", - action="store_true", - help="Skip data download step (assume data already exists)" - ) - - parser.add_argument( - "--log-level", - choices=["DEBUG", "INFO", "WARNING", "ERROR"], - default="INFO", - help="Logging level" - ) - - parser.add_argument( - "--log-file", - type=str, - help="Path to log file (default: log to stdout only)" - ) - - args = parser.parse_args() - - # Setup logging - setup_logging(args.log_level, args.log_file) - - # Validate data cache directory - if not args.data_cache_dir.exists(): - logging.error(f"Data cache directory does not exist: {args.data_cache_dir}") - sys.exit(1) - - logging.info("Starting paleoclimate data processing") - logging.info(f"Period: {args.paleo_period}") - logging.info(f"Data cache directory: {args.data_cache_dir}") - logging.info(f"Skip download: {args.skip_download}") - - try: - process_paleo_period(args.data_cache_dir, args.paleo_period, args.skip_download) - logging.info("Processing completed successfully") - except Exception as e: - logging.error(f"Processing failed: {e}") - sys.exit(1) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/paleo_scrips/prep_paleo_obs.ipynb b/paleo_scrips/prep_paleo_obs.ipynb deleted file mode 100644 index 68028b0..0000000 --- a/paleo_scrips/prep_paleo_obs.ipynb +++ /dev/null @@ -1,444 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 22, - "id": "7de9f289", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import xarray as xr\n", - "import pandas as pd\n", - "\n", - "import os\n", - "import subprocess\n", - "import glob\n", - "\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "id": "e12473da", - "metadata": {}, - "source": [ - "### Collect paleoclimate observations for the following periods:\n", - "- Eocene ([paper](https://www.nature.com/articles/s43247-024-01531-3#Fig2)) ([download](https://data.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118))\n", - "- Pliocene ([paper](https://www.nature.com/articles/s43247-024-01531-3#Fig2)) ([download](https://data.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118))\n", - "- Last Inter Glacial (127k) ([paper](https://cp.copernicus.org/articles/17/63/2021/#section4&gid=1&pid=1)) (download)\n", - "- Last Glacial Maximum ([paper](https://www.nature.com/articles/s41586-020-2617-x)) ([download](https://github.com/jesstierney/lgmDA))\n", - "- Mid Holocene ([paper](https://www.nature.com/articles/s41597-020-0530-7)) ([download](https://www.ncei.noaa.gov/access/paleo-search/study/29712))" - ] - }, - { - "cell_type": "markdown", - "id": "1fbab751", - "metadata": {}, - "source": [ - "# Pliocene and Eocene\n", - "\n", - "only include those models that carried out simulations in the range ×4–×8 preindustrial levels of CO2, in accordance with CO2 proxy estimates for the EECO3. The exception is CESM2.1slab, which we include for context and which was run at ×3. ([ref](https://www.nature.com/articles/s43247-024-01531-3#Fig2))\n", - "\n", - "Model name Model generation ECS GMST\n", - "- CCSM3h 8x PMIP3/CMIP5 2.05.0 23.31\n", - "- CESM1.2 CAM5 6xCO2 PMIP4/CMIP6 2.0 str: + h = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(1 << 20), b""): + h.update(chunk) + return h.hexdigest() + + +def _wget_simple(url: str, dest: Path) -> None: + """Download url to dest, skip if dest already exists.""" + if dest.exists(): + logging.info(f" [skip] {dest.name}") + return + logging.info(f" Downloading {dest.name}") + subprocess.run(["wget", "-q", "-O", str(dest), url], check=True) + + +# --------------------------------------------------------------------------- +# CMIP6 +# --------------------------------------------------------------------------- + + +def _download_cmip6_file( + url: str, dest: Path, expected_checksum: str, dry_run: bool +) -> bool: + if dest.exists(): + if _sha256(dest) == expected_checksum.lower(): + logging.info(f" [skip] {dest.name} (verified)") + return True + logging.info(f" [redownload] {dest.name} (checksum mismatch)") + + if dry_run: + logging.info(f" [dry-run] {url}") + return True + + dest.parent.mkdir(parents=True, exist_ok=True) + tmp = dest.with_suffix(dest.suffix + ".part") + logging.info(f" Downloading {dest.name}") + try: + req = urllib.request.Request(url, headers={"User-Agent": "wget/1.21"}) + with urllib.request.urlopen(req, timeout=300) as resp, open(tmp, "wb") as out: + while chunk := resp.read(1 << 20): + out.write(chunk) + except urllib.error.URLError as e: + logging.error(f" ERROR: {e}") + tmp.unlink(missing_ok=True) + return False + + actual = _sha256(tmp) + if actual != expected_checksum.lower(): + logging.error( + f" Checksum mismatch for {dest.name}: expected {expected_checksum.lower()}, got {actual}" + ) + tmp.unlink() + return False + + tmp.rename(dest) + logging.info(f" OK {dest.name}") + return True + + +def download_cmip6(models: list[str], periods: list[str], dry_run: bool) -> bool: + ran = skipped = failed = 0 + for model in models: + for period in periods: + entries = PALEO_DOWNLOADS.get(model, {}).get(period) + if not entries: + logging.debug(f"No CMIP6 data for {model}/{period}, skipping") + skipped += 1 + continue + logging.info( + f"\n{'='*60}\n CMIP6 {model} / {period} ({len(entries)} files)\n{'='*60}" + ) + dest_dir = RAW_DIR / model + for filename, url, checksum in entries: + if not _download_cmip6_file( + url, dest_dir / filename, checksum, dry_run + ): + failed += 1 + ran += 1 + logging.info( + f"CMIP6: {ran} combination(s), {skipped} skipped, {failed} file error(s)." + ) + return failed == 0 + + +# --------------------------------------------------------------------------- +# Observations +# --------------------------------------------------------------------------- + + +def download_observations(dry_run: bool) -> bool: + obs_dir = RAW_DIR / "observations" + lig_dir = obs_dir / "lig127k" + + if dry_run: + logging.info( + "[dry-run] would download observational datasets to paleo_data_cache/raw/observations/" + ) + return True + + obs_dir.mkdir(parents=True, exist_ok=True) + lig_dir.mkdir(exist_ok=True) + + for filename, url in OBS_DOWNLOADS.items(): + _wget_simple(url, obs_dir / filename) + + # LIG127k — zip containing Excel tables + if all((lig_dir / t).exists() for t in LIG127K_TABLES): + logging.info(" [skip] lig127k tables already exist") + else: + zip_dest = obs_dir / "cp-17-63-2021-supplement.zip" + _wget_simple(LIG127K_ZIP_URL, zip_dest) + extract_dir = obs_dir / "SI_CP-2019-174_20210105" + try: + subprocess.run( + ["unzip", "-q", str(zip_dest), "-d", str(obs_dir)], timeout=30 + ) + except subprocess.TimeoutExpired: + pass + for table in LIG127K_TABLES: + src = extract_dir / table + if src.exists(): + src.rename(lig_dir / table) + for f in extract_dir.iterdir(): + f.unlink() + extract_dir.rmdir() + zip_dest.unlink(missing_ok=True) + (obs_dir / "cp-17-63-2021-supplement-title-page.pdf").unlink(missing_ok=True) + + return True + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def list_available() -> None: + print("CMIP6 model/period combinations:") + for model in PALEO_MODELS: + for period in PALEO_PERIODS: + if model in PALEO_DOWNLOADS and period in PALEO_DOWNLOADS[model]: + n = len(PALEO_DOWNLOADS[model][period]) + print( + f" {model:25s} / {period:25s} ({n} file{'s' if n != 1 else ''})" + ) + print("\nObservational datasets:") + print(" IPCC AR6 Fig 7.19 CSV (Eocene, Pliocene global mean)") + print(" Capron et al. 2021 (xlsx tables) (Last Interglacial proxy anomalies)") + print( + " lgmDA v2.1 Tierney et al. (Last Glacial Maximum data assimilation)" + ) + print( + " Temp12k Kaufman et al. 2020 (Mid Holocene temperature reconstruction)" + ) + + +def main() -> None: + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[logging.StreamHandler(sys.stdout)], + ) + + parser = argparse.ArgumentParser( + description="Download raw paleoclimate data.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + parser.add_argument( + "--source", + choices=["cmip6", "observations", "all"], + help="Which data to download", + ) + parser.add_argument( + "--model", + default="all", + help="CMIP6 model name or 'all' (only used with --source cmip6/all)", + ) + parser.add_argument( + "--period", + default="all", + help="Paleo period or 'all' (only used with --source cmip6/all)", + ) + parser.add_argument( + "--list", action="store_true", help="List available data and exit" + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Report what would be downloaded without downloading", + ) + args = parser.parse_args() + + if args.list: + list_available() + return + + if not args.source: + parser.error("--source is required") + + success = True + + if args.source in ("cmip6", "all"): + models = PALEO_MODELS if args.model == "all" else [args.model] + periods = PALEO_PERIODS if args.period == "all" else [args.period] + invalid_m = [m for m in models if m not in PALEO_DOWNLOADS] + invalid_p = [p for p in periods if p not in PALEO_PERIODS] + if invalid_m: + parser.error(f"Unknown model(s): {invalid_m}. Run --list to see options.") + if invalid_p: + parser.error(f"Unknown period(s): {invalid_p}. Run --list to see options.") + success &= download_cmip6(models, periods, args.dry_run) + + if args.source in ("observations", "all"): + success &= download_observations(args.dry_run) + + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/paleo_scripts/paleo_constants.py b/paleo_scripts/paleo_constants.py new file mode 100644 index 0000000..02c6e63 --- /dev/null +++ b/paleo_scripts/paleo_constants.py @@ -0,0 +1,5152 @@ +PALEO_MODELS = [ + "ACCESS-ESM1-5", + "AWI-ESM-1-1-LR", + "CESM2", + "CESM2-FV2", + "CESM2-WACCM-FV2", + "EC-Earth3-LR", + "FGOALS-f3-L", + "FGOALS-g3", + "GISS-E2-1-G", + "HadGEM3-GC31-LL", + "INM-CM4-8", + "IPSL-CM6A-LR", + "MIROC-ES2L", + "MPI-ESM1-2-LR", + "MRI-ESM2-0", + "NESM3", + "NorESM1-F", + "NorESM2-LM", +] + +PALEO_PERIODS = [ + "lgm", + "lig127k", + "midHolocene", + "midPliocene-eoi400", +] + +# {model: {period: [(filename, url, sha256_checksum), ...]}} +PALEO_DOWNLOADS = { + "ACCESS-ESM1-5": { + "lig127k": [ + ( + "tas_Amon_ACCESS-ESM1-5_lig127k_r1i1p1f1_gn_090101-110012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CSIRO/ACCESS-ESM1-5/lig127k/r1i1p1f1/Amon/tas/gn/v20191206/tas_Amon_ACCESS-ESM1-5_lig127k_r1i1p1f1_gn_090101-110012.nc", + "fcdcece93685efde5ad6f5d54c17112a388cf526f15a540a428698c8de9614b0", + ), + ], + "midHolocene": [ + ( + "tas_Amon_ACCESS-ESM1-5_midHolocene_r1i1p1f1_gn_050101-080012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CSIRO/ACCESS-ESM1-5/midHolocene/r1i1p1f1/Amon/tas/gn/v20210422/tas_Amon_ACCESS-ESM1-5_midHolocene_r1i1p1f1_gn_050101-080012.nc", + "67881c124bd7646c7e038bace8321c420ee42172a09d4a21c65ae34b0e48e408", + ), + ], + }, + "AWI-ESM-1-1-LR": { + "lgm": [ + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392101-392512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392101-392512.nc", + "918ca0b1777ca37a1cd00c41d396aaa745386ac17cf2da52c49369f5352d6c36", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397601-398012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397601-398012.nc", + "e4e429dcf0406188bf5d32787df0424450232303b1d7a6fb37955ca1648d7154", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397101-397512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397101-397512.nc", + "cc43f30669a075efb68d94799705670b0964ce1d27c14a3cc2f8d2e21d3be8ce", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394101-394512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394101-394512.nc", + "52c583a40838362ef7d18f063dc98aef927a13176bf5835c0c481b624722863c", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394601-395012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394601-395012.nc", + "04a4edbd4076a95dc04da5fd848e979d4e3d58691d0b4ef261958eef3858f0da", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395101-395512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395101-395512.nc", + "de09fd37bb82d811168af09fe9fbd20dd4b7a3550e209bf64cf4f922a21f9ebc", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391601-392012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391601-392012.nc", + "36ff8ad34b863fc4584c4b4a763b50c08daa76abb4d3eb5bd70be690acab2baa", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392601-393012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392601-393012.nc", + "24bbf983ba16b30f09f06a42bdf03d338bf19dfb108250d0edcb555dd5ec6ee8", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395601-396012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395601-396012.nc", + "a7a9f8310f73cd931f868fbb16ed54d21563e2c7d2143a84c9ae06a17e40df6f", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390101-390512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390101-390512.nc", + "5a847587fe5f9643c9e38219024b08ba4560da24c5cc314dfea76823f728bf15", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391101-391512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391101-391512.nc", + "91b9a1868dec42616a60122605ce370698ef39a2f621dc7cb419daef9b36cac0", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399101-399512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399101-399512.nc", + "0dda3ed7e14a9100ce9072821092a5f7fc4cb088dbfa13ed4341723b40507ba6", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396101-396512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396101-396512.nc", + "a279aefe5b8ca2bb2d45e0b5d3d580168b2d34b171f06d38cd491ff3cba04846", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398601-399012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398601-399012.nc", + "5fb4304a4b64ce4d4be8730f617f1583c042d3a9a72cbefc20f163f8626f3b7b", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390601-391012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390601-391012.nc", + "6bdefa0d1589ff1b42195680a0603d4aa3e4aee04c734ab5cb6a70a702114e99", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393101-393512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393101-393512.nc", + "ae8bfbeca44826a4226a66d1c1163292c72dc6f42b1bc2ce241e48a9bdf5b33e", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393601-394012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393601-394012.nc", + "e4b64888544d23f77c4c659291a07e094b2d2de944905d98a645b36d492dd760", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396601-397012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396601-397012.nc", + "eeebe43b8062b3889c06c184090051f302eefaad2e032a27dfec649da3ff41d0", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398101-398512.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398101-398512.nc", + "9294cd0f4919c0a2e122abff8f27b40b1a3cb657cc36f76bb0b68dc51af18019", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399601-400012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399601-400012.nc", + "5cad8ec973c541a9b3446d8a76d3c3bbea6b57f1f873c6c0fb6dd33e6519b286", + ), + ], + "lig127k": [ + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308601-309012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308601-309012.nc", + "bd000fa0826986374db8f904294e02a1cd0da14cf40340cab9698260a6ed3efe", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306101-306512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306101-306512.nc", + "ca3e7948ba9271fa1d9e5f3c5ee0a2a034fa8f1f54ad3892b082c71cec396ffe", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306601-307012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306601-307012.nc", + "08edf288e31d80cd4ceab8c76af10e55ab6c564316971aec2ff2e624d0dce05d", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309101-309512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309101-309512.nc", + "493d0bf7e1583f180dd5cb82617d1ebb3add4aaff3c7dc9c5ae110d9fb432b6a", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300601-301012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300601-301012.nc", + "8846e012af87b64701c86a89e8b5dcf8d80b00a82165c93a56c27b96ae154c01", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305101-305512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305101-305512.nc", + "49037913b20ae7571caf3ad29201bb0156612649daacfe2661c5861b20392e84", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307601-308012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307601-308012.nc", + "062c47b4158d45b89de2e63a87e4c2d01f290a0dc4f4640495672ba47f158351", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309601-310012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309601-310012.nc", + "68de68254b26bdac5982454aa7b5b373e00474e689fce0482e3e312e7e5071df", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303101-303512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303101-303512.nc", + "ffa940919238ce01a0d28a36a10b31f31fb55ad1327ad2b351666134b1a9c989", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301601-302012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301601-302012.nc", + "bb0dc284a16c419ef561311ce4fac3710d083ddc4b1f4b29ea3c695358993c25", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302101-302512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302101-302512.nc", + "385a753f2e3f395f353b3ec69f74c2cdaa3c681a17903e47ab8bb970e52540ca", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307101-307512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307101-307512.nc", + "c9d8be7442afd1e399cfeffbe6c9a6a6f43dbfe42da6980d0ed169264ffa3ce8", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300101-300512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300101-300512.nc", + "1fa717df2e3489e175ecac97340165b59abd3a7cd5998b7bf7d9d95b66416df9", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304101-304512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304101-304512.nc", + "a6ffbf97d9693c377ac1f400e36a9cddbdf655756a7327578ef7a9848cfe7313", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302601-303012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302601-303012.nc", + "bbadfe9324b186cf0aed9073635a8fdb9ac1ef4dd444a0ebd95fc71a40c60cf4", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304601-305012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304601-305012.nc", + "1dbdb85f9ffe2c803c29ea91941c301abff82e14635fb03c6d05f0a2fa70c0ab", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301101-301512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301101-301512.nc", + "45ba6a26f55fa80ccde3f59c5db7c18800f5913f3108e8cf831a80ff3491da89", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303601-304012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303601-304012.nc", + "17de5e02eb3297b9735cdc26b6dbe3ee3a0067ff7888203dee4e7204cb3d3cfd", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305601-306012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305601-306012.nc", + "7b228eced9c0ed703d5d5fc571d319a06ae6104880cc91284883b8c30586710e", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308101-308512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308101-308512.nc", + "ca64ab4b9b6964bfb37eb27684e9bf0b2bd4f4f1dade6d68c3a7c6c12cf14301", + ), + ], + "midHolocene": [ + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_310601-311012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_310601-311012.nc", + "1f1e847e12aa35645f83262c58e5d05aada0915a7b9b7632b8b0409404115a07", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311101-311512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311101-311512.nc", + "3ad84cabaff0e138552ecd9a20e8b668ee049f597e73f4b22cfa07322f7da579", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311601-312012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311601-312012.nc", + "b4d68123bde132838f90042fa5bfc07bffa196091b4b2aeb611ed51e7bf925ea", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312101-312512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312101-312512.nc", + "c550d32a9c3dd70e7212fc30e75fb6c577a290836a69bfd5034c0f69b15babed", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312601-313012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312601-313012.nc", + "2a13ce2601a07f4be365797c21618315f445ec84521dd603f629f1f05b93163c", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313101-313512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313101-313512.nc", + "df3c9dff6ef57c785c9ded62b659acfe2bb958d0b93e78dbb700af55c81b108c", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313601-314012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313601-314012.nc", + "fd8f9550350ea63ee412eafb5c628843384957f181d6b875391ee3c85d94c3d8", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314101-314512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314101-314512.nc", + "87f9be02ded8479df2429d2a36e81115888b349f8dab721e5a95bf759890ef71", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314601-315012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314601-315012.nc", + "fba47e17827e11429a26ab30a8abf3128eb78b9676428d5789342e2147f07ef6", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315101-315512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315101-315512.nc", + "bfa5fa342a99e01d530d1be41ffea7f9cf9f6590da72f987360218c8c370903f", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315601-316012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315601-316012.nc", + "612055568dc631ef2f7f16170ef264b807f53bc476633ee74bee8d31a21dcfc5", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316101-316512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316101-316512.nc", + "9d808081f5aac416004d47baded0b7b6fa014a0f590d4b01372b2ea12b47f609", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316601-317012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316601-317012.nc", + "fe68ece0197d8b419c1eb15f50566739439996dbf00b8208071ee8f522e61a13", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317101-317512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317101-317512.nc", + "78671f23f1b636316ff75b9b92da17881892c9a2c7b89fe6a620411abb0b307f", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317601-318012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317601-318012.nc", + "8e8c4f61224ac8a560f9a79dc2a36641fc479d281892667f9b8a7f51962b2522", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318101-318512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318101-318512.nc", + "9bf6baac6bed3b7a330cd21d306db7cef3f11f19168182b2b2510c460bbac4c9", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318601-319012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318601-319012.nc", + "5253a8d2083ad580fe882907e624ad823f203c855b76477689f4f7fadb8313aa", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319101-319512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319101-319512.nc", + "8d84172e8e6c0cf852f71557d60c5ea247033943c5c4d99b39c72ef18e60fe4f", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319601-320012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319601-320012.nc", + "45f5c2ba05234d7dbe2a6933fe7f439f092bab7e7438465e777dabcb0b41e377", + ), + ( + "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_320101-320512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_320101-320512.nc", + "45c47e80faf7a3c0fd59e067def415dc88167ca4d1ee0f73dc5c3a98da968cd4", + ), + ], + }, + "CESM2": { + "lig127k": [ + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_045101-050012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_045101-050012.nc", + "5fca5f69c8928d43ca5b2e3997c7ea6445469f5fec3694678d0b5daee4ec03e0", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_065101-070012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_065101-070012.nc", + "a0184e19282ba1b9351dfc6fe421a4ed22007aa98e67ad2f331ffc9edb97b688", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_005101-010012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_005101-010012.nc", + "a4cbe00dffe027dfaf227022921cb6e512696e753dccd2b4ccd591e1369de9d2", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_010101-015012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_010101-015012.nc", + "9a4ca2796ee948e7aec015345149230ebc66c0fa45650c57bc18ddbb8fcdf92f", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_030101-035012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_030101-035012.nc", + "aa1c2de785b2fb526766a2dda503676c20bc8195d6df9cd24e6ccdb2c7d1fd91", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_025101-030012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_025101-030012.nc", + "f8a8bf73e7b939b95c0d70d81802aecadb829cd1c695f6cbb6684659a7c3a7e4", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_035101-040012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_035101-040012.nc", + "2ca4d224faf3686232126ca51c806dc66bc385f2572abfcfd2c4b7ec2a7c79ec", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_000101-005012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_000101-005012.nc", + "445a2f76d3883d6b2dadc34f15c412785af4469aebb5d764ebd2345939b417bf", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_040101-045012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_040101-045012.nc", + "c873daa7db3c1c52462c8ad5c48739edcc5d375dfb6e17533602033b7465ba7c", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_050101-055012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_050101-055012.nc", + "89af16519d90c96a1aab61e370b4891178b917091131071ce3120af21b5c4c2c", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_055101-060012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_055101-060012.nc", + "e567cbb51f8d685411d4ea4b221b2973e39c12c0f802fc261fe446ffa873ff83", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_015101-020012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_015101-020012.nc", + "4338af59ae17953cf35facb313c34ffb16a15b90861ccc27cf855267d7d9e174", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_020101-025012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_020101-025012.nc", + "61693e7271bfae15592a419ca2bdc7d2efe912bfdfbb2ca3dbaab8cfcbf8e72a", + ), + ( + "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_060101-065012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_060101-065012.nc", + "a191056df714fdb02fd39ff70d1378b133de9af056f393d582ad17c4fc441c00", + ), + ], + "midHolocene": [ + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_000101-005012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_000101-005012.nc", + "01e07ddb0c246af3405ac81185438710dd98f96f4655807cf1932da63b760f27", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_005101-010012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_005101-010012.nc", + "b36dfc9788588cfcd9c9b6a380de5cd63a7bca107f0aafb12e7b4a6467b27c49", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_010101-015012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_010101-015012.nc", + "6d8e59e1e71a72ec9577abd22ca915ec85b60c8581554e417a474158727c3324", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_015101-020012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_015101-020012.nc", + "6e1d0ae8db756ed7ab7caa7c451507eb5bf164210bc47713fd177216550a3f7e", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_020101-025012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_020101-025012.nc", + "b7e50443dc2c6e2fa071f12ee9ac1887cf99437736dea3b6f5acf2c77a3b55eb", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_025101-030012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_025101-030012.nc", + "16a17fa7398fe9a4d3c2255d1b173207bfef4fb4c860bae0c34a72479d5185e1", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_030101-035012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_030101-035012.nc", + "6d7e909994c90576649975469e11e9b9ebad48900c45e51da289b5116497b3ca", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_035101-040012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_035101-040012.nc", + "30214ead75b3da037738d67e244dad58f8f367572b54aa18168c138aceb45ccd", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_040101-045012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_040101-045012.nc", + "0249efba728b66b9013428d66ec70933ebc146c86b8250d8b9e24da67668124f", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_045101-050012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_045101-050012.nc", + "dc818ab134bd0fc99ef508c9c34fb1e6b66c05afa501e502eff7f0e263975b8f", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_050101-055012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_050101-055012.nc", + "92aed716108a5b16ef86ee31300a7ff04e8891a17949aeda0d85e588deb188e8", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_055101-060012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_055101-060012.nc", + "e6e3ae14c2d663353f777bf31f271216d6699d60b5cd3c1054718c238b254be4", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_060101-065012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_060101-065012.nc", + "c9876e954990708909f86bd1cb4deb41b23c74ae9d6428062455ad85b4c662ea", + ), + ( + "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_065101-070012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_065101-070012.nc", + "79b5c448921afc803335111b322b487f9e58abc2e406df9f92eb357065aa58de", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_085101-090012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_085101-090012.nc", + "9b5268fdb6a332118d03494f449042a63e6137c09883a91c2a2a8bc34ea801ba", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_100101-105012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_100101-105012.nc", + "ed5729eb026413c5445632abcae926e9f93d5a50664d231fcae3e5cb27c69349", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_015101-020012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_015101-020012.nc", + "8ebc15062bcc9a9c81eee323464f4e4838ea990c1ea7fe66189bbe8a0e5b831c", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_075101-080012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_075101-080012.nc", + "eb5c0c4497c5cb5d5fa66fca3b875d27b526e80c305398ff4f6c1dfbccb26bc7", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_095101-100012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_095101-100012.nc", + "f1a9249c7ddef31a95c0e238abade6fa1e2f07c5eea8a650d248e7d2c806c799", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_070101-075012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_070101-075012.nc", + "95bf39c2a3069a7369ea0d168bc5712fbb1ce110e7f6e8aab5e6e55d11b8f874", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_010101-015012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_010101-015012.nc", + "4d8cea3293fa469553a3ae5a334337defd2e861863765fb78056130e11add920", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_030101-035012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_030101-035012.nc", + "505cb07b02d18685a8f44d7ed4d7e64e38ff44954b7027839af1479876b341dc", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_115101-120012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_115101-120012.nc", + "78db54d18cf8790271d4a494c275e8888e62452eb24a493e4e7f7a268f65c0b5", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_040101-045012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_040101-045012.nc", + "6daf1ed4010bdb2b982b3f516457d9698b5a3721eaad99cf3dfe665f1fd183ed", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_105101-110012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_105101-110012.nc", + "6e63ce1def1882a4f39054218f54bcd27fe06dc8dc8d68ca4b689c82cc31de47", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_110101-115012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_110101-115012.nc", + "bf96693f1b45c75ee2f3e577a8fab6f787123070a59362fed798c7d58d5a421e", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_025101-030012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_025101-030012.nc", + "814a26e4902814b329e27faa76072381e6fc0bf01d0f724a8f8ea2c94655dce4", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_055101-060012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_055101-060012.nc", + "827117e9161d686c3c16679bad28415004c417f2bdae7f910aca5ecde16f2cff", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_080101-085012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_080101-085012.nc", + "27f95f70c1e00c63d81630485bf782540f6475ad8b15bf1fcf19c0c0e3aec25b", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_005101-010012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_005101-010012.nc", + "5df09fa84a344772a8fc8ae8b724e535fbbbc759fb05b723e38d2c1c937d52d0", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_090101-095012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_090101-095012.nc", + "4a727176cf31e7fb7be15810749f248688800c2ac6155e51fba4e19b4fe3e6bc", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_035101-040012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_035101-040012.nc", + "28275a210bdeef1be3e9557a5bac103b06ea44433f64e10f55847d40a4cde7c3", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_050101-055012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_050101-055012.nc", + "b4cf87b2ddd8e1a8fddb2dfb17fa2a50a06d819e5aa738392d54f2ee76f802eb", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_060101-065012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_060101-065012.nc", + "c19381abc4353a940c1e3a1b9cf5f7b1a96b726b00815267a052f9b35379de18", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_020101-025012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_020101-025012.nc", + "6acf31d99cf6819d8925e2117898b4f780b76c7ea5e0d8df7bbf3f4390f05c11", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_000101-005012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_000101-005012.nc", + "4d7c8753e2f368c6730c249b28d9298f25bbf1fae340fcab8d19ca5004a58564", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_045101-050012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_045101-050012.nc", + "dc47040b53a3876a8c7ba5a57a7313d11fdabad9e7a5c42a7153a39a1cb721c1", + ), + ( + "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_065101-070012.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_065101-070012.nc", + "e58e2a135ca18ea1aee3366c496080b9306020efd594da0ffd0c959e4499f26c", + ), + ], + }, + "CESM2-FV2": { + "lgm": [ + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_045101-050012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_045101-050012.nc", + "bf91467ff3004ad60413a5d08d9c947b95522a7117d2b4dcb2644cf5137f8ab7", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_035101-040012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_035101-040012.nc", + "8e1a198fa5bd39fbf2be8633a77d944eaf659723ee12f0becf6c1ede3348d6d8", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", + "5d8fb3ed1fc155f3ac6c0697274486e00bde7356149a7a0191a6f85c80ae60b5", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_040101-045012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_040101-045012.nc", + "c334123786eee32dd620fdebeb939eb10d71d47fa70c16bd94b36466576f52c3", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_015101-020012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_015101-020012.nc", + "042b25292d5e4da036f921d7cef713cf451ab31887a6391fbc1ce97e93a84ac0", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_025101-030012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_025101-030012.nc", + "f06ab9753371e04e1e680a408c12afc4102702937dd856205bb3580cb8cfd332", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_030101-035012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_030101-035012.nc", + "8b5288734ae46997196204b44263af8e8a0f3f90d62669d1a547357263ad627c", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_010101-015012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_010101-015012.nc", + "3d9ee43afb45f9c67e54993fca1434d065a60b599280c7c18d57d4a994ea4686", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_020101-025012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_020101-025012.nc", + "2ee95695530585b1d9c11ea70b7d92fb6e4dbe5798e67a2e0ea881330e541401", + ), + ( + "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", + "c8aa4065c1963ea14847a3a44cb306f65253b1f9ad6cc22b0228daddbd8e2588", + ), + ], + }, + "CESM2-WACCM-FV2": { + "lgm": [ + ( + "tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", + "http://esgf-data.ucar.edu/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2-WACCM-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", + "0fe2e2f821da164da89bd1aa14e5c230d14ea60b2d7f4dacdd8d436a9092d6a3", + ), + ( + "tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", + "http://esgf-data.ucar.edu/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2-WACCM-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", + "4f2ebaad6fec4e01b68b6b44adceb7da570c8b427f6329dfde4312d46628fa9f", + ), + ], + }, + "EC-Earth3-LR": { + "lig127k": [ + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224001-224012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224001-224012.nc", + "1855b96a9410678e19307d7a5de9701d587aca0422774ff567bdef5088738899", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225301-225312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225301-225312.nc", + "70d1d2690f197c15dd6245a6c4278a5fd903c17ccfae45750fe6e868d2281b3d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227901-227912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227901-227912.nc", + "c173b0c1d3274eb56cbf436c5557fd2de3249b853371435a497e7f57d910c28d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229401-229412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229401-229412.nc", + "26ef1bb2a40338260479da9f8f1e74717d1300ff36ad75aee89ac7bc491356f6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229601-229612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229601-229612.nc", + "c048f599a6145b0698149ad037d06ec1dc804b906b69ccb2fea83879bbefe40d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231701-231712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231701-231712.nc", + "ded30e8a88cac957fb317be9c15601e4b9af8d9d8c1ef0c7101b0286e9de6d37", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234401-234412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234401-234412.nc", + "39e4441bd2e758486eed77af3005fdf21339d2bb175e63456855d1503dda9a7a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235701-235712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235701-235712.nc", + "687fb112b978aad0e12cf1f2491aca49ac3ab8f491fdd2a769a09431f2e09aec", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237001-237012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237001-237012.nc", + "107843c03e385ace57d3e734a6bae5ac4d368499d9fcd2ead755cdc4acf2ecb2", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241101-241112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241101-241112.nc", + "59f4c574469f042e2575a697a5868ad681016523db79b65c9882d351f67a9b53", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241401-241412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241401-241412.nc", + "13cb7fc0eb4d05eb5b5d47a2b7132f0b87b3678fdeef223cb64001e4ef10dfcd", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241801-241812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241801-241812.nc", + "690335f0f728abea59115bf4fca3149440733aa476880500dc8d73ac9423d23f", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225201-225212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225201-225212.nc", + "2c85aff0bfbd9aca981a6bf51dee2f363a4e3e8315c3aee515239dbdeba2595a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226601-226612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226601-226612.nc", + "b5618c162c6cc0eff83f9294c85a2acc9c0fbd6f900d86e865157e0bb8a6ad9f", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229001-229012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229001-229012.nc", + "5fff7cd5fc8ce6ae508a050fdb3307db975b5d9c88c2e2cb72e06ccebdebd5c6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230901-230912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230901-230912.nc", + "9eff2fbb29087f8fdf89e16094b016c7a7a2360286b9edad0a194bfa67cb95cd", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231101-231112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231101-231112.nc", + "9890f90bc3cb176474e304f2cad4a8d1fef164f5239665b187275aa537339baa", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233401-233412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233401-233412.nc", + "539ea80b5e19c252ca642e92377fe236aa0eeef0994b97cdf761efe4f52653ff", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233501-233512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233501-233512.nc", + "7d3d266f485a32f3889542734b1797eee024236102de571bf1a013ace52a53e0", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236401-236412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236401-236412.nc", + "740e37d95f856367bccb97f2322a9123b04c3bbad9f25b8117398ca12416c730", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241001-241012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241001-241012.nc", + "19020b9b84daf85abeab63d2aca7211126ec25835e7ab4a8430a9348bd779cd3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242001-242012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242001-242012.nc", + "8a652771165307b2d5c33f192339a392dc9aba1088dbef73e9e90e36f8ce5f99", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244301-244312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244301-244312.nc", + "8ff15dc4b3983760d805e08b8ceafe7b541fc647c4357bb17bcb6cae900b17b2", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244801-244812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244801-244812.nc", + "b3d45c5f5163afc56f6e90ba3b03e57337eac342b5d5e6c13f07849487f571e6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225501-225512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225501-225512.nc", + "37d0e3b9fddb45c870168ee38bfbc0d64d6350eceff77ceed8459bd302bde9ef", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226301-226312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226301-226312.nc", + "62d1006390e5ba0d38eb4c367aeadd5888b12066187a2c37a84fcae008d346a3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226801-226812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226801-226812.nc", + "5d42d552541249e82d86ad5aa90f95b522c4352d69e27bfeb627d2205498eeca", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226901-226912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226901-226912.nc", + "14364cd35003771ea31050b3009c1841d52af7c9c05d095e393223479292e31b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227701-227712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227701-227712.nc", + "6c607aab5c09af54ecf1666b1e1eb1233bb1dc8773dcb27fe969415a9d5dd084", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228401-228412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228401-228412.nc", + "38c24ac86d6b326cfb2dd867a957512bada12641c34dd2fe7da30bd59bb78db7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230401-230412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230401-230412.nc", + "6e783c94b224a6ecd4646d3d6076d1799db50b60ae3c38448e3048ff2ef4d48b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232101-232112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232101-232112.nc", + "35a0de5d3752bea8617e741db9b111819c1371700119f7938571382512343d9b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232301-232312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232301-232312.nc", + "65b5495ffea8a52cd1a3bcb992d07911ea969b78c9ec71a1fc1dce532fb1ddb8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233301-233312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233301-233312.nc", + "e4fb29ec8dbdddcc7c7a5347049e429e0689f40bc843fadb47bb72959abdb2a7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233601-233612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233601-233612.nc", + "be1f4a0193e53271f8c86740ede172d827eeac721af9336105703bad1b12a5d1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237501-237512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237501-237512.nc", + "b66abf40b4d5e768943188b4c436fcffa82b36154aa0b87469a607851547ce7d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238801-238812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238801-238812.nc", + "d82be313b903ffa23c24aefb8a0081800c5543d2d35d14cd805e077b3b44984d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239201-239212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239201-239212.nc", + "fdb436613a94a729f5cc50c2c5333b7b5ff1a11fc0b4c5d2cd19340864eceae9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239401-239412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239401-239412.nc", + "9ea73340d51eb88a039a76a15ba79f3ab39bf1f3b3a6a5a4000cbc74be711bf8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240001-240012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240001-240012.nc", + "b38ab05852f55a851bcec5890f79c32922f27813205de781ad2c2bbaeb5a0ee0", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240201-240212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240201-240212.nc", + "492cdbcf9cbf1e0889eac7c8e8f382a29e930cdbf87eec54a55adc80f22f8c35", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240701-240712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240701-240712.nc", + "726c4d5c9e3d3b62298fe07e574bfed96f7e9eed218e2e64999536b459db90f3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242601-242612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242601-242612.nc", + "f46920d23bdfd3b32c0e13acf6c62ab1e440f645c5dbc9b9443c8c728bb452cf", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242901-242912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242901-242912.nc", + "9900a18d0b78f4f7e902a92a42f89e360ea1f54cd961d76058513c39b31f3b4a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243801-243812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243801-243812.nc", + "0e0e95ea2a91fc7fc818eeafb7ab59b4d03f61abffa482e087dc164b57a04e8e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244701-244712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244701-244712.nc", + "1ea5fb326c652e1623dd46bfd4333bce924096c88c0420120d49f427fdeb3842", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224401-224412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224401-224412.nc", + "6bf02133080bf44f5936bbf00479906f080127920772da0c3eb98e8c8b48965a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225101-225112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225101-225112.nc", + "92fc43b3329bed49b47f3b0a8ad04934a90f5ce7dc4c09d9c1f4aadbda0d77e5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227501-227512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227501-227512.nc", + "98e3b1706d4e57679a0322a7e609c253cf9add09d8cf24e0ff175d18d36aa725", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229701-229712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229701-229712.nc", + "afef07bbe9d5e7623a37270a65eb3d72768db9e85d7faf20a67e2c7af53ec6fd", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235101-235112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235101-235112.nc", + "b50aae6b4b33fda73d38846557f113103b8a96665e022269ce43fb97eaff4ddb", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238701-238712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238701-238712.nc", + "1594e548c3e3d863019f6f33fa827c839c1f4264a6a5fe3680ba915c5d45f1f7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239801-239812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239801-239812.nc", + "15a23552b859f30af7fcb5e5407a2d5ab02a514ab8598d886810e9d84249ae9d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240501-240512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240501-240512.nc", + "f834156f187921f13eefd5d5d9e6dae09635a7b8281a229e1dcc559b17998a7e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241601-241612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241601-241612.nc", + "d208489234b86dc9cadec3d3ae2bea6499de0ef31b7d03f520465c64e11652b5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242301-242312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242301-242312.nc", + "eb0e47e02205094762a70ee077f95c9c2ba2e2aa3181ffa693afbc80135416bd", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242501-242512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242501-242512.nc", + "668bcf3a8b3135cad0ec1ef583e2384f24f419ba911357ff91ebd3ec3c06bd4e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243101-243112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243101-243112.nc", + "a6c1086dd2572d9e524aa6007534bfdbe7aeff7ae066280444a4682c844585e2", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243301-243312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243301-243312.nc", + "23d5527e19f0609ee64d7cdefa661bf485a336da39ee407171e6cd967885997a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243601-243612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243601-243612.nc", + "41ae8e7bc60854aa976a33b7cca23b2ff7cf0b21029535e5cb94dd6c91e176f4", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224601-224612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224601-224612.nc", + "b9175f69f881704bdb3f1191e973c6da2e8fce4f3ae9283fe53825afae937190", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226001-226012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226001-226012.nc", + "f39843cf82020da8f6f37b9b8f15f618cc6ba838b4f2d9138c3c2f4064e2c564", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226101-226112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226101-226112.nc", + "e67a13d239bc68ccf9cdb3d977049a6019dfa6cc2d3655c1a11943b770a03bd7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226201-226212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226201-226212.nc", + "db39de03aff8729b4f4567c7dd4406e919802b4f27f6cda3f9536b12655e7096", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227401-227412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227401-227412.nc", + "998405f9e99e7d9a3391caf5f19ad9402577ff686dddc33357e660831f658145", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227601-227612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227601-227612.nc", + "6fc31167df8809971ca0b1d8542c08343f42ccd81e379af0c102e06e27d57b0c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228101-228112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228101-228112.nc", + "e64afcae12be0db6f0d379b979b506f735e5d59b40d7f5e27908a6e0fa9ea7f1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228301-228312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228301-228312.nc", + "e0ca619361295f3d053487c7e1c42bf9f2f3467fc48d0b610f3a1d06c7d939eb", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230601-230612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230601-230612.nc", + "39eb3f104f40498ab46e92a3de86905d5d1b5448886067f1d491472a0e375ab6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232401-232412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232401-232412.nc", + "088b0f7bb5b84c04e352cd34e554aed90a26afc6d633d5c60ab9eb482623ab98", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235001-235012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235001-235012.nc", + "fad8eacd931952db2c7427781d1cc9501422421f10641de5f680e0a52c730e8b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235401-235412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235401-235412.nc", + "9567d6001412bd4ec8b24e7ee8c1e5bf783add2eada9500146c253405ce86c3c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236701-236712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236701-236712.nc", + "acb4f812606fffc879211987815b70ef6a68992e191b5e3d436c2f31526d4ba8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237701-237712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237701-237712.nc", + "15f44cd57426959570d1623b2872294aedc7bbc68808d2262affbd4bc6d0f31b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237801-237812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237801-237812.nc", + "50296f679810bb0748e55d0d2d785a7ef8a0751dcca6645b6af41904dd2fc636", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238901-238912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238901-238912.nc", + "f4aadec91b6e100c75555667eed5dbbe7c6d4454f6f2f6bf4bf6e43c8282f7ca", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239001-239012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239001-239012.nc", + "c6ba7a4edb4d44182b5fad7c27ee92a1727774de4f3c87275e56b114ab76f0ef", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239501-239512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239501-239512.nc", + "657de1f27e8949653aa2d03b7a44f024b6300e5ee6feb2ae2741228b2258f335", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242401-242412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242401-242412.nc", + "1d479d4f4c6ed7a0c7c543ea7d60ac73e334da4259bd634aa41e004099419cd1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244001-244012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244001-244012.nc", + "0471fca3fd73a0a11bcf771efe68e4f6de36aded48f48a7e3545cba44976e418", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224501-224512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224501-224512.nc", + "cc1a314bb220f6d618e699523a913aa81fbb07768f09ec99fbcda01ef882eb4e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226401-226412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226401-226412.nc", + "9fdaa802fd0d3bcb298f57a6aaf848f37a862fc3164f7ca14ce37dedfdce891f", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228601-228612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228601-228612.nc", + "34f9345eb3f8699d8f862b010cf02cc47940aecfb8619732d0cdd6ee4ad17cc9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228701-228712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228701-228712.nc", + "b03b9a50ba45fbacd09a73df9a22b432ad86f63f69c25096eca6416ee2f9bfeb", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228901-228912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228901-228912.nc", + "4c5ad49280f5f3a6a5c0ac17f310bb07c09880069b1f6d959c23ac04d54efe95", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229301-229312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229301-229312.nc", + "2da719e0b12f8eebb32882acb6610f5375ca1b6298a1d67dd01de503c0b32383", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231301-231312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231301-231312.nc", + "da835ec39edd95815abbe43cd52db50f2eb685e435f43e2afd6426040693554e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231801-231812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231801-231812.nc", + "2584b4c526ff9d70059b8b1d1f7d56e3d9ebe572d2b5b9bb0f85a69491641491", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", + "fe185801e5960698e6c3a868102a5c4e3c8370b8fadcf43c705c85864826228e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235501-235512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235501-235512.nc", + "89306894ebb58a7e6f8b5e58c53fdf266be2a0057f258bcef2ee614081f2f3e3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236201-236212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236201-236212.nc", + "6c302791f90a0363852202abee92f74692719952709377e1179cd8850fb5ed2a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237401-237412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237401-237412.nc", + "f12f5c842cc31563b43d512a228f14d95547a20592b279310f2098a476ddc522", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239901-239912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239901-239912.nc", + "1926bf13f78f2f9be044fb6e768079fd36c1f7c10e220cb66b67f692851c6fdf", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240601-240612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240601-240612.nc", + "8b1fdc9078dd3628c8e8ca3002fbe20582f62790e4a6671f165b0a976183e130", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242701-242712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242701-242712.nc", + "5c5f94c9c29a09d006ab6e3a3406c95dfc1402815aeeb6ff0d0775319a0fd024", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243901-243912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243901-243912.nc", + "30917032a89dd9cd6ad1ae5a7055cdc39930e01f15c611c01835ed3091761eca", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224901-224912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224901-224912.nc", + "d349353668a22585de6eec6d9bb20a9f1a56b94b6d58174ee4367fb66d40f57f", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228801-228812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228801-228812.nc", + "12ae86409c4ab958f08229931aa07d7a685dba41100ec0a761525b68649dcdec", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229101-229112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229101-229112.nc", + "7d9501df5ae4e67f3916824bbc3ff5488ba90dd50695856ece0620c67475237b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231001-231012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231001-231012.nc", + "05e9a5f393a4732e501583b10762e8270bd49b3db0d2da06427bb3aafc950308", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231201-231212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231201-231212.nc", + "b493f4b5e908e234f17705d696232dcdcfcf93f51fcf4f4b21434fe4a1e486a1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232001-232012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232001-232012.nc", + "463eb29b4bad25d2ac26399dcd136fd846bcfbe100141d94ffd9a186b6e79918", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233701-233712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233701-233712.nc", + "6b31cd6654eec590c5b38d746b7b37e35e9ba046664154e7fd3bec1ecdec1e77", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234301-234312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234301-234312.nc", + "df0c390658c5987ad17790256bee78c931be6856cc8a5ef7b21e8a1599ff745c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235901-235912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235901-235912.nc", + "9404e5212ed5f3cee5e856634d24bafa201f60e3651973e6d7f59406847e2fd9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236301-236312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236301-236312.nc", + "327fb597f306535a00621fbefd46dd7f7a92d0c67a4766b4f393e4b44e8281c5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244201-244212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244201-244212.nc", + "fa13fa8c542b8e073223bfd2daac5e69eb1286cd83c66b7fbf3a2d7af7ab2b6b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244501-244512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244501-244512.nc", + "7ea805634438d1a8933f4850007ad9ea4b55d8a5fc850f57cdaa662960a8f423", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224801-224812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224801-224812.nc", + "9d45acc361c4779620a13a90a574e6b5312cb3dacb0dd432dc1254097b03f377", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227201-227212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227201-227212.nc", + "36e5b82fc2fd282cbb03c9ad6c62eb618b3ca45506f9659e7ca7cd87589c7d58", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229901-229912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229901-229912.nc", + "ae7f330370a0a5d857834fa13fee807e27c3ea2c5075652188e1177da5b24ad8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230001-230012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230001-230012.nc", + "402b79123eee20a8aa5cec8fd9657657bc11f316c27a888460213f332dc3738c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232501-232512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232501-232512.nc", + "59a71ce3bf4e248bb4524ab67127be7bd89746fb3c1cc165daba32daea85e127", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232601-232612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232601-232612.nc", + "1859cdae71fe6f9baa575171503991e66b71b2505fdb78dcba59d09147d827db", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233201-233212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233201-233212.nc", + "4a79f0bfdf1ac2f90968e877db8d4a56c21648ef6ecf0dd60b5eb274a675e16d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238101-238112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238101-238112.nc", + "b5a81042483bb3575237959a093b0a29b7a8606b39ed3b68031800f01d4c3c16", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238201-238212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238201-238212.nc", + "f1609d8dc7556a03a9075cb81258241be562ddd2a0791e1ac7cd9865281240f5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241301-241312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241301-241312.nc", + "88960df8a816f15678d480b7bce5c8acc5bd19f8ab2aa90746514fd65acf9300", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241701-241712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241701-241712.nc", + "f3528ffcd6907d404290f1b822f01fa5db209fb652f13b98ffddddddf8113cd7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242801-242812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242801-242812.nc", + "4d5dee320540ec3b362ed1781b6bf9cfe086042c762f21d19fa5c2c64f6d5b52", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225001-225012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225001-225012.nc", + "0db5849aa5a1930cca0f7c0d17b3a9af7deea02cb4bc89b2f2d0c7ca88eb2263", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227001-227012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227001-227012.nc", + "fb5cce0cae189943d5a0fb8cc8adec417e2b54c836f819961d680ab12b503412", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228201-228212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228201-228212.nc", + "afcb7af1ac018923becfb7af81a8ee07e1e5163165e8a05b2bc4ed5c40915ee7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230101-230112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230101-230112.nc", + "b8cd6126e47acdcb3a6f6cfcca016cba0e885f1dcc916b975749739e994c337e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230301-230312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230301-230312.nc", + "2910c0ba8745ab5bc329e1428986e1cdae5ee83f982bf04b83205b70ae2347a6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232901-232912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232901-232912.nc", + "54aa29d463ed2d71b6561c53cd8755da3b3c5afea7f2aa05b3f15cc6dc3078e3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233101-233112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233101-233112.nc", + "ef94bd33d5a46dc896e1e45954e0d91b6b539b93b678efa5732c75a48968c3f6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234501-234512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234501-234512.nc", + "a390318c2b97e016075f24e97154c7a3d6c7199c727a9e4ab3e15a04cdccbae9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236001-236012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236001-236012.nc", + "b8d8f56195bd89c91e26a751466c9bf66f6b76d91a8375a2b8d85f29ca6e8517", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237901-237912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237901-237912.nc", + "523ed8ef103ce5b42c00cf07c5053fdb2db9951d58613d82d1aa70d66c7a781c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238601-238612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238601-238612.nc", + "c067b0632fd58b60cffcf2ac78cbefac437050ecbd5fa0ef6f9764611a4dcae3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239701-239712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239701-239712.nc", + "651c7b44c19fe952757c406a9c960f5055adbad8f64c019183c46f8069b96981", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243201-243212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243201-243212.nc", + "2183186e3b9e17a0b564744de9e939bf5fc1dd727af8e0f95ce01cfa76b1c7ba", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244601-244612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244601-244612.nc", + "c851a960bda464eb8965925b7a088236865f56ad16cf8d2a0fdf223997d01f12", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224301-224312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224301-224312.nc", + "990c0d592ac7b6e636f99a969494698153f98f33e30192bf1265f82a77aa50a9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227101-227112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227101-227112.nc", + "c16972e3ed667e10f8851199f78c40166e29eaf380e22826cdc9dfbf6fa5bdd5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229501-229512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229501-229512.nc", + "84e09316c6f13a195449237a01fc12f322fbe881f72a02e0af9a818b11036f98", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230501-230512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230501-230512.nc", + "727080fa7aa00b786de3f86c369b946fb973557c254d3a71e7b16710cc38aafc", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231601-231612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231601-231612.nc", + "5e851128b0f9ccb46159ecb43fff788e6ce9c0516c139d63a10115eb111a88f0", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233901-233912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233901-233912.nc", + "e61203e34cbdf83879bb2cf2d89be55cf4cd5d5fac66143fe677bcd53e187731", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235601-235612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235601-235612.nc", + "bec82b3f4b24daefdb9e55630527a1f32434a8ef3cb41ac341e9d4c7904f88b9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240301-240312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240301-240312.nc", + "ec0a5baacfdf66776308c252da75c9299fb2bdd1536b6068be966397e20e0907", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240801-240812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240801-240812.nc", + "2272ad492cd0a362ad4ffbe02981cf874832eea0370163bec371c3b85aaf5103", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241501-241512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241501-241512.nc", + "d5ebeff4cb1d4c266c6c407130f2392e3faa13c88335e17f2815eead53e5f834", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225701-225712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225701-225712.nc", + "2e031c4c80009476ae1edb044dfc677f0db2921e4646b09a741e4bb49ce15bc4", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225801-225812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225801-225812.nc", + "e8aff3285a966090f3e13a1d4e4246ff04137bc8d452224a9af286e32203ede7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226501-226512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226501-226512.nc", + "8c7c39269b8533cba45e63f89959c627ca4bd15b582311a19b05cc227b6202a6", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232701-232712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232701-232712.nc", + "a1378bb02055eb5aa0389d10843c758cee3f5a5abd62ff48bf732c971df7b124", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233801-233812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233801-233812.nc", + "6906d30f22e11028296573992eebac46f87a2ab3fb93e14e55e7f0ae7b326187", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234101-234112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234101-234112.nc", + "d51f37dc86ea148cff70d10080fb0320da72df9611cf7bb8954a399b7dfa9ea1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234201-234212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234201-234212.nc", + "3acc25df0bf862e03a186ee6dd20a1584242dc6b3a753c35cac20c17addcd735", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235301-235312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235301-235312.nc", + "396921c7ffb3ce639403ed78ad911d8caf2d9ea90e8cb59e0b766b8b62ddc381", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236501-236512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236501-236512.nc", + "d8dfb766ac73579a4e2e3dfef1bd73b5fa7c27c761f17a5857e8b436580afb9f", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244901-244912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244901-244912.nc", + "0b7e928b719d33343ca76f7c2426e14a902165f64f557381b6d5633e960bd7f8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224101-224112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224101-224112.nc", + "65d2da00b7818e29668e85202c819ba978387ca1eea45880cd2f7b99540192bf", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224201-224212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224201-224212.nc", + "79d74b6d2519182d8b56f2c7fa4165632ae0e48bd32b4cb82d2cf08f8aa4f12e", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225401-225412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225401-225412.nc", + "dbb3950a585e4e364daa1c4e553a690e80b0ec6faa00f1d0c15fb4b40d247333", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225601-225612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225601-225612.nc", + "eddb46e577f1267cefe8221a51f2c1770251c296c648410db7c499a9987711e0", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225901-225912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225901-225912.nc", + "05f5e4074a5ab796a7306a7eaffb7c953d6d259296776d134a7dd833f8da6319", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227801-227812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227801-227812.nc", + "66ceb2649585fea3b2636a4036ad2d04ccdaf97dec4e2decefab5ca56b7e83e1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228501-228512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228501-228512.nc", + "46d70d28403154b83ef25956281bbb03d115566ccbdb015ebded3affcbb3e118", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230801-230812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230801-230812.nc", + "9c89ad7b098082d5276200e118f53d9f848d5f83d4fc890ff3a595b1dedfaa30", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231501-231512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231501-231512.nc", + "c34693930ae4dfafa925d1f104cf97060e97f1c5e2b891e5b1e9006c9d1ba148", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236901-236912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236901-236912.nc", + "3a9cda3f4d561bd5429d1f045c402fefde5f378f60286b70cfc406d964c3cf01", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237301-237312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237301-237312.nc", + "f32ae358bd63a8611f98828e61cef6e1d076a04c6a97b5fc78e27ad0297d2248", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238401-238412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238401-238412.nc", + "0ec139b7586482f461952ca3bd56c8cada09d7b6b99b5aeed3cc7672723273d9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239601-239612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239601-239612.nc", + "75b0a0b64fc19c837adb04fb25c2c65796476ab200d1b4ca11165ef437954448", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240901-240912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240901-240912.nc", + "9db4c494bbc7521cfba9642d53b12675559b93ccfa0709b9b316ccc77646bf6a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241201-241212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241201-241212.nc", + "728409634df7c92f93f871b26688e6f1f21bacf7f88f9ab51542755dc938e1f4", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242201-242212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242201-242212.nc", + "b6cb6a585b67f61c181fab95e042c1b93e46ed68b0340783d4a0ad858103efd5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243001-243012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243001-243012.nc", + "0aae60e8283455a8fa6ff8c625697e179aa3ff94e4e05e4e108f7163e03c3055", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226701-226712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226701-226712.nc", + "ba086550f3daf0c7859057a613d7d6cb1d8ad1e9fa9f01d528e2c55eeb3cca1c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230201-230212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230201-230212.nc", + "05e4ad9e2c6e57b19dca8f18bbbbadb9efee91857964cbf9891aebd4fcfaeeb1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231401-231412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231401-231412.nc", + "5cdf45f885a3656b58b31924922fd581c03431ff382c7ee4dcd2c678e889b0f3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232201-232212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232201-232212.nc", + "de0b10ee3c3c2a25e0a391b66ed41add4b4eae1a107c97f032cc8b0d309c0b0a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234801-234812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234801-234812.nc", + "9589c4b8fda071b58eb19d207912ab4bcd7617a8cba5c4fa9096c6c3b64f40e8", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236801-236812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236801-236812.nc", + "bb3bdb6433fd797aa2398a0de94bf220d290f4449505cf597f0a4f638d086d7b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237201-237212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237201-237212.nc", + "ed2bb244f962d78b1a3e7a4c195e8966d8a6795b0df1ae7ab49ba3e1a14eb7e4", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238001-238012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238001-238012.nc", + "4f1ec36103dd7a869e28a627ed44d36811e2260e2e91de9d487e6c1f1768c4ac", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238301-238312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238301-238312.nc", + "766edd6e6dfa7ff70c947e225b17c5cd90e017e92c80d92af12db4bc1c3c31a5", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241901-241912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241901-241912.nc", + "4037908ed6ed43d718c6ae58c00d138d9a3db1008300dc356fd34fd327760fb9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243501-243512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243501-243512.nc", + "1183c91b4b26bee3a091c8f0dcedc0ce336b1fee869e02ec59040bcb767c32ae", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243701-243712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243701-243712.nc", + "ffa6dcd298ef3a6e2192dfaeac7a8a31c861c86e5d80a3193460da3f7da55c00", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244401-244412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244401-244412.nc", + "1b55b34ac250fc9501c9d3d2e67ae32e4dbce2874dca1cdb668663c8f7ca74aa", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227301-227312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227301-227312.nc", + "a0a3355e62af2f6b2ac7f78aaf8aef6fb5d7a9a35bbcf973aa506034727602c1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229201-229212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229201-229212.nc", + "90a6aed83bdc1630128aa4e00187d2621cb03eef5bba2a9507627203481baa25", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234001-234012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234001-234012.nc", + "740140b2820a95769a0a016fb8349852b65a245fc2358a74009f6681410a9e57", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234601-234612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234601-234612.nc", + "750b0c26d1701c577dac7b4ca29a50dfeb03def99840942a958385ce583487b2", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235801-235812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235801-235812.nc", + "4c0ccc00055d43923674fbf12e19507ad4d17a08461fe9215702f9ead974c943", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236101-236112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236101-236112.nc", + "51ca8f9b620c18702e9fe95fe244300b9e0e6c31b66d2ff6b81d89f917a336b9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236601-236612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236601-236612.nc", + "a2278c51bbb070165cb61c589fa0a167e303f24e64b505559d49d42c788e37c7", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237101-237112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237101-237112.nc", + "872f59b7bc4edec5643a7e465d42d405b492bb5a280656b880740742a96eb05c", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238501-238512.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238501-238512.nc", + "08e8494fa038f5ee29dd9b7b845337605d65791a97a5d34cc2ba7d02060591cf", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239101-239112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239101-239112.nc", + "4022432819087954e5185226c48c4b9ee0ebd7f56e47663a836c9fed82f8ccc9", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240101-240112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240101-240112.nc", + "22e16b305ff5d53aca17ff7b0189abafc696054435ce1d3c22a09dfce7f7920a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240401-240412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240401-240412.nc", + "595198da3a9da8f5316f67c94d5c0787a7eb9265495a0642385f9e3fe58fa243", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243401-243412.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243401-243412.nc", + "a08bec712b6f10fd77a8bd0ddce3366121863b2e8f7fe7f9f3f94d88b7224013", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224701-224712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224701-224712.nc", + "b7d5de8d938879c7aae610e2c7710b0b9b7295a62bbd858a31230be498f0b59a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228001-228012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228001-228012.nc", + "c38d233e9d69573c3e326c832e8a81e18e371fecc337a2069ea97b44bf35a855", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229801-229812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229801-229812.nc", + "ccbfe38bc25d8d32e592904f73cc27828547d8bc99f118c5ded6a0187526aa0d", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230701-230712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230701-230712.nc", + "e7ed17dfcfe5dd27cd42a6a8a4993d745305d53ef4a31b46dd60235fd5e3c2f1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231901-231912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231901-231912.nc", + "4e3b6a67e91466bca7a5b02e64db39ad6400a4662b2e09db29de8326d2b3cec1", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232801-232812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232801-232812.nc", + "2307f68b10cf6276ac4add34283af10931cbf39ae81abe073ef4055754f6647a", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233001-233012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233001-233012.nc", + "086f113b881d08fb96e2e951953480750ea40f6082a1059903e89df47b067346", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234701-234712.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234701-234712.nc", + "4a362b903f8b31a6354417b1ba39ec872c5f1477818004157be95d5d83182c5b", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235201-235212.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235201-235212.nc", + "d72e6f83770a47052893a967147b4e29d6dc862a078307e521796a37d6f13904", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237601-237612.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237601-237612.nc", + "ce2055d9b91ad05f5d1a1973796a6ac0cca2603b1221f495622658db2a56ac69", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239301-239312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239301-239312.nc", + "b83f31aa28e10a19a61fd2e7b00791a527f39906bd0cfdfeab6309e1fdd22b62", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242101-242112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242101-242112.nc", + "7a0cc4e6cca0c3bf98e9f94e8471f8be73ebc7a136104208a1eace9c9aaf70f3", + ), + ( + "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244101-244112.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244101-244112.nc", + "bb99e75c5bee5d372bef2c3c86f5a7904c17a6ce5dc463c222bf92ec6b25e317", + ), + ], + "midHolocene": [ + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224501-224512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224501-224512.nc", + "84c3a2ca484d23e45e75fa9dc827601d5ae2287aaca37d03b7dfccff1793db27", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224601-224612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224601-224612.nc", + "2206736f47a6043a8e8f68abbaee04a7d7f1f294b07502186819f0af86aaf805", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224701-224712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224701-224712.nc", + "c0cec79576978b30fc59bea2c05f01610bbfbab2c0fa6946f2dc76013ce05522", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224801-224812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224801-224812.nc", + "9fb9a689dad5be252c3faf8c9e5e18e7d3c62dbacb5d41104e510cb7160b7c4c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224901-224912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224901-224912.nc", + "24b62657d780c026664e81bd04087de4545a97fb1a5277c76aa162d49ccbc19c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225001-225012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225001-225012.nc", + "24b6260befdee435d30b97706c28ee0e64abccd1cf7d2a0927727b2e04828fbe", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225101-225112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225101-225112.nc", + "27a7801d4d11e3713b169a3072fc3c8e9b30d2750fd51f54ea092392760f816f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225201-225212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225201-225212.nc", + "4d0c7cb29417e58652598e5e69e2529f10efe079cf3769b57dec92ae14dbb99e", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225301-225312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225301-225312.nc", + "b09c98421142b8c630c0bf91fea78f18521739119ab862cab94574cb9915ef93", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225401-225412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225401-225412.nc", + "7c4b4f4ce6c31027690b9922488f7343b58ef5c62cb86544de5ffc08f7e6aca0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225501-225512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225501-225512.nc", + "5e9257b78b986cbc59d1697e0f8bc6dd5c5520290ecd2611e230ad3eae8913e9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225601-225612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225601-225612.nc", + "d2106aad407e8868e34e96f3e85bcb4a24ec2e3bdc7a87991bf94e36495b1ce8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225701-225712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225701-225712.nc", + "e2b6af4c14bcf39eb59f6f1d84c8bfdb1bdae922781bcb4f6b1cb4233acb56fa", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225801-225812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225801-225812.nc", + "d17bbffb240e01d0386f62f92316f82c92755b67252246e365f6e2ed9ea324c4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225901-225912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225901-225912.nc", + "9943d01b2ec9bd132ae6de7fe1530b6c1145f609924cb4648e4428b8180eedda", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226001-226012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226001-226012.nc", + "c80c6f6a2964ee0f39439169efed541dab1145c2e98df5a6f0919be84171e212", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226101-226112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226101-226112.nc", + "5c90b364c2436deab23d847eb743668e5223312bf04fb9646908bc00a546a80b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226201-226212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226201-226212.nc", + "74c2dc48a8669510843fb30096c09fc1138c7351b9b4a29a51db164b8d965cf7", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226301-226312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226301-226312.nc", + "dbc1a36a430a21f28777ddda75dd0d7347a9d45f5433585a061edbe8979f6bed", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226401-226412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226401-226412.nc", + "94c6177ac2c3ef776898fd53b1d5476c34382cabfeff5fe1da0a4c73ed8efd22", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226501-226512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226501-226512.nc", + "17d9a5d9863df444679b25e780634d71696e08577eea4d40830a86324672fd40", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226601-226612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226601-226612.nc", + "33e9d4ef24d99f5bf38438d672f35b510937aee5d4087803a6c05d4b433b533d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226701-226712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226701-226712.nc", + "39e4ad29da64e02d6a3f8c311bedacdfa55fe85649f4f2c98399f28529cb8f39", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226801-226812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226801-226812.nc", + "3e1eaec95cfd964661517c1249ae7e4e3b81ed00b2883f3bcb47b82870d5a55d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226901-226912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226901-226912.nc", + "61ec9501b4ea212c24b4ee499623c862798b23237b8f11d07925db54734d9970", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227001-227012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227001-227012.nc", + "ee69bfe9ef791480773cb0e705214a3e12c0b4f60c516c0f4b7bd5ce6a96250a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227101-227112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227101-227112.nc", + "1703f48585645a700fc8d48b63621c579d7678996449610654b0c8b40e71f9fb", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227201-227212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227201-227212.nc", + "a7c5a766c189e56939330c5e949d1c38fbc46f8a02462d4f5a328b03528d4d5f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227301-227312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227301-227312.nc", + "b4a248062e90bcc66d6fe2367a8ed384abb24d08e423f218382c1f522f7b5254", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227401-227412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227401-227412.nc", + "00d8f141e9d39a7bbaf0be383f3adf9311db513df894d1baecaa6d973f43901a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227501-227512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227501-227512.nc", + "7590543f2a28263d6cfd6b5e0fc7820859a428a6d12040fe46612640cb14328d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227601-227612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227601-227612.nc", + "8116575c996bb7f4d0625ce40450d5fe387d00cf14695f62c81adc1cbc19b1ee", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227701-227712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227701-227712.nc", + "b8b687c0e3e63ab29b53dec0e9426ec81f44387383af9b19beaeafb52f5c4c78", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227801-227812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227801-227812.nc", + "670865d771df2695f1f4652efba0cb71f7d0c9e5ec352f12c7c5f6e71918811b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227901-227912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227901-227912.nc", + "fa089111764a3e61abdf92eb9a3042d915434200159033612a33a94cd3e6a3f3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228001-228012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228001-228012.nc", + "81874e846a4bf9399427c471282b1e2a6d3f1c6c38b84628900977c80092bddb", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228101-228112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228101-228112.nc", + "451563d35565cbc80f2ea3d225c4fc0e4a14e36b95d577bf9e7cabf111ac2de2", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228201-228212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228201-228212.nc", + "fe828033ad6995b894fedffae4e170ba06d147e32251a1e3e9ecf28ccbe7b2a3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228301-228312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228301-228312.nc", + "6b595b970fecc26c6ae8497d58ecc77f5ebef8c973a4862ffd79c21e011be8b5", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228401-228412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228401-228412.nc", + "251476af32edb480503929a5860d4b67931286dabfea193bcee7166879151ce1", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228501-228512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228501-228512.nc", + "6c181380483514e399ae7475816d17465bc7ee8b87fba2de1b1d6362f6a81342", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228601-228612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228601-228612.nc", + "0e673c22d7f6d099dfc45ea915edf1cd2d3c51412708842cd27d15980e3b058b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228701-228712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228701-228712.nc", + "6c11be34826d2aaf6319b095a37daaf1cf8d6085d4c463ae67b0933cb3b5a449", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228801-228812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228801-228812.nc", + "8326144bdc2818727b2529ae29c1f3fa9828ff3a2bb6b3de5bbecd084ee0019f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228901-228912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228901-228912.nc", + "80ac09e3560272a40221538b42e18d34e43567c8e352de72ef2f1906a0181cbf", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229001-229012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229001-229012.nc", + "d11ec03994308b9b3ba5f547a938d5e10d30e71125cee71fd66a31ed143da44c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229101-229112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229101-229112.nc", + "a01ab43bd4e213ebb65edc4b173139598503fb29aa5ed80e1f4bd72cbd3bb4e5", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229201-229212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229201-229212.nc", + "7ec648ec1147ed9a3b4bf37bf842540425534057feb8364b45d2b2129b215315", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229301-229312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229301-229312.nc", + "981f2b8275ca61c0bedfb8202fe4babbba073bfc57e72d4e8f1626b21472040a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229401-229412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229401-229412.nc", + "150cc2abbc909e24859d5242d40ada60c4ce61c5955d6d930df15a7ea34c2e19", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229501-229512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229501-229512.nc", + "f76359c3bf74bc2857927801caf2e37555fe121a5810b6ac1e057aca2e4dd635", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229601-229612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229601-229612.nc", + "24445c23184fe5d59893ea8aad91783484504670fc97a05869c869ca02c04ca5", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229701-229712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229701-229712.nc", + "8565a1461c7e2319cf65e335bf92a1a090faecc0821df91add8665012ec49246", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229801-229812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229801-229812.nc", + "ce2b534a0c41c50d7df93996ce89891134f1c2284364ffc13ef274ce92d8a444", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229901-229912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229901-229912.nc", + "ab449f4ad4402be15eed4f6ee2dea71f427f4ab92ba4ffdc71e84ee2bb2020f1", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230001-230012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230001-230012.nc", + "373db0e35303b755f68b0573d4a439a56abd0067484f2648aa2be4ce258f4a6a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230101-230112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230101-230112.nc", + "a5067f29a8a006608c90850728b001c4657260daa23211dbe399ef837892b223", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230201-230212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230201-230212.nc", + "7c0e6d9ef2f6ba4e03f7e480b1d2f2026bce0a1edf5fd3f29df5e59d77932e0c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230301-230312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230301-230312.nc", + "23a953c31e1b9ba3de1d9ee3d850b8b74dfd9898874dcc1134b5d46742b74426", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230401-230412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230401-230412.nc", + "d460037a5102d8fcde3a2a3b539eccee64b32feb13676ae62bd11e2c40268eeb", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230501-230512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230501-230512.nc", + "189c6ce81434defa5f20455c1e195dbb0b18ea8f7b9b1cc96745bdd6c514fedf", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230601-230612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230601-230612.nc", + "f8ce35b441a314e81ec753445b3a0b4ea4d8f96fb188a43311f6bf30b706ebc0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230701-230712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230701-230712.nc", + "26c300f62a854f43d6e12bd2ea73566aaf4451effcfe4ebec5e85aefe3be8bea", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230801-230812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230801-230812.nc", + "c60337dfe735fce56b5b2a1180a2332a952501447f8357468dbfe9137ceb753b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230901-230912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230901-230912.nc", + "0be1c3726fb9d68ea75cdf8519898bc98578603c238b72b892008a3b5f58ebb6", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231001-231012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231001-231012.nc", + "b3e53dae83e8fc25b9ec846f7a7de68d2d4db4ab5213c476ed03f7ee392e3e6e", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231101-231112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231101-231112.nc", + "08b9ed5e96896e9ef60c89a01446752946420268bfe9c8a5f79da83f90ffc5c0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231201-231212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231201-231212.nc", + "63875add8981846d31ec3a30f0f80e0a4c8e64c36d45693a84c2b43cecf07454", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231301-231312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231301-231312.nc", + "d543332047b1e0e2db0781ecbd8794c3122bb22e4f7f8ffd386d2552e1248953", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231401-231412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231401-231412.nc", + "d9e6f405c0961c6264411cdf64a5beeea72b46c7a7dc0bbb623303ebea22472f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231501-231512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231501-231512.nc", + "5905a064a9b8e206f8aeb6ac219713fee199b0d5631f824b78a54779ada60e7a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231601-231612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231601-231612.nc", + "8136fcc97d71a0fc4ae3b677c1a69269a2c1d069eb6f2383c209db7d9f0e208c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231701-231712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231701-231712.nc", + "635ec5364903a149eb2b09b08c0a0540e450bc639fcd32e7d417dd853d5778dc", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231801-231812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231801-231812.nc", + "4774ccf58166e30a00273cb4cfe6f869dab51546fd77a77107c6326f17dcc65f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231901-231912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231901-231912.nc", + "af868f465f91426d27b92698e1ed0be6bd88e7f9e68b2a53ae31010db25de9d6", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232001-232012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232001-232012.nc", + "6764d8042f55b511b5b1cf7d860a93a7b7ec4b6bd8a15e96258bf1dc10fc4a1d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232101-232112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232101-232112.nc", + "a81ce18580fa8c863a24be406aa6150378c873a80c2b1661354dc5899aa19dfa", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232201-232212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232201-232212.nc", + "61dd8892cb2b8c9edfdf61dd308eb007b1bfd39550e910a3f21260185eab0480", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232301-232312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232301-232312.nc", + "138279617c081a3fca49af2f8081da16613c1136ecf725ef8a69cd31560da2b3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232401-232412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232401-232412.nc", + "74a5d34d848933d38034ada012c3ab34174611c4f0657f47cd784f112133b3ff", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232501-232512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232501-232512.nc", + "15c02d49ec8c52f3b042cb8f6f3bba71f88f6aa94d52173c32a4904a72b006ef", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232601-232612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232601-232612.nc", + "a3b1c140e76d4a80976aaec7fbbac452a552c974b1e0324c83e8d58e54b2b4f0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232701-232712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232701-232712.nc", + "a6dd6820d7e4e2abcf4dc045fe94f847a12a0969f88dae667dad4bd7b88cb43f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232801-232812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232801-232812.nc", + "cd9f15bb3e420769ba60af84ccc846a05e08414dc7ee9f30edce6fb5f8da7175", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232901-232912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232901-232912.nc", + "bb91243790e5e441fc8153969317fb8ea4df09b23bfc22561c9ee7001133559a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233001-233012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233001-233012.nc", + "7018b5c79c2d02a938f8d177e90bafdc0beaf48b7e38925911f696a13111331e", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233101-233112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233101-233112.nc", + "5619014d2c1548d2082ebfe73568e32292e5a6bf6e3859190810a171e46b510c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233201-233212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233201-233212.nc", + "cdb8b0722ee6a2f5c27c76f134762728913afa1bea8097ae205ff9b20f9c6e97", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233301-233312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233301-233312.nc", + "3f1f0bfbc4cb3c731d183027c7f1b0a7a931fb62aa8a0d29fc65d6b1fc2f38fe", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233401-233412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233401-233412.nc", + "e5f934da64064a4e5144465f77c418f3f20e391617e364764ee7d727dee160f9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233501-233512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233501-233512.nc", + "115107cc8a9ab1178216f2521456720ee97792d3fdf9bbacbd1d02d036a45fcf", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233601-233612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233601-233612.nc", + "286242425dbad2fe78029cd398df4c55d9d248c3e1b41a48ca50c054952f8a65", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233701-233712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233701-233712.nc", + "1db499aa1ecd4ba94b51ccabe1e22b46d39cd4bff4cff9b4d9f3429adb2ba537", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233801-233812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233801-233812.nc", + "47b1283568b99ecb9b7ec2cc78a57c71aa25e132a0bee6c88aebd23fc3d98843", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233901-233912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233901-233912.nc", + "4da49839c5caceab2cc36630bb305bd680377ff12c3e3d0015705affef7fc791", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234001-234012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234001-234012.nc", + "5a65f5dc3dc6859d3cba464b9a429f521b45a04f0607457cc2b459c7639228a2", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234101-234112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234101-234112.nc", + "378778488d9b6946515684d618c8ae6425435b21268ea3476be7404dd11536c5", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234201-234212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234201-234212.nc", + "8216fdfcbbefc085fc4fdc64d4922ffe1e565ac9a253419b77e45628a7a09c16", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234301-234312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234301-234312.nc", + "44d3e2a07972696c24f13fd4010ce3c4f24b55cb8a667f3b8c5b5fbc2c8743e8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234401-234412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234401-234412.nc", + "c4d71492e1c962192fa74e523cf3258dc2bdfa22df9b9f41f7bc9fa1d688f0c8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234501-234512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234501-234512.nc", + "ce6eb8eada9caf80d52a868d070094ae3a4104a2c4de168a04bf04da61f2fba0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234601-234612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234601-234612.nc", + "43f61e6f312ef40f70ca415eb7f10c5fd253276417cf85b047400cddc0522523", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234701-234712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234701-234712.nc", + "74e537759a218a825636fa0c11a9ee1ca59ecd30279deed05ad89bc5817f0bf3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234801-234812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234801-234812.nc", + "2081e92d1faf2ae89a40d07decd1935f16171cae8cf2c57f36b1e5db698b9605", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", + "e1281bbbef280bd364a32e10f384ddb05865b3565fa313e348dc83b0a55b747b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235001-235012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235001-235012.nc", + "b23af5841586363a01ff9f6ae19834605a16d2501933e05654a994ce3b0af098", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235101-235112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235101-235112.nc", + "31db2f0a41562781250d30a7459aea9ae340f9e2e67e186a329c6d7e56185a2b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235201-235212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235201-235212.nc", + "332bc43fd13330746c36113db2a0ffa40b189863a764edb92ede153d349e25d3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235301-235312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235301-235312.nc", + "d614ef43a9d3e048c32dde1f3d3b0d6502efacacf72ddbfd3fe0ad02df097ca3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235401-235412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235401-235412.nc", + "57424c2b28cd43071a7c4edd549ed2796502c0f9fb1a03daf387185e9d91e7d9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235501-235512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235501-235512.nc", + "6818cd6c55a56a88bc17a496e70ef95645bb2d7b413f743d9315a6b65a4feee9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235601-235612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235601-235612.nc", + "ed8a6791e46019beb0f15681195facd1ee622f124c3cad1362fb003a1d58c6a8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235701-235712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235701-235712.nc", + "b61d96ed14673e852ce21c4eeddb655db65fdfcdb75b33b6e35252726e870a3d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235801-235812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235801-235812.nc", + "5d78495baf0652f07dbaf98a4bb03ae92bd57bbcfd03ebc3614647fb5e71b946", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235901-235912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235901-235912.nc", + "7e1f47e7937cef2b7c72aaf3b163cdff18edc47f38281f9698152d8734d6fc8c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236001-236012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236001-236012.nc", + "f8c4be36111cd000eb36e95210dfc2e354e6307b8960d5e1b99e9f20f4097d5b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236101-236112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236101-236112.nc", + "e0ba63efc604746d4f81d5e1d15ce24b66d44dadace4cbd02a3964645d3e27f4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236201-236212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236201-236212.nc", + "72ea5a878de07c18f55c6863a8075a08561e0a5499762293a59cb21e4008b467", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236301-236312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236301-236312.nc", + "29db42935f13f49e16c528735097162a213622b858a95eae0517fe988e5b7f08", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236401-236412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236401-236412.nc", + "17758c4c634d0eb63c28cdb36b81b735da7825d983d67f071f46dcd198d4875e", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236501-236512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236501-236512.nc", + "11d011620c95e24dda1e7355a5b93738a054369a56e80e6f085147b5c6980ef2", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236601-236612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236601-236612.nc", + "118c870e60b26d2e0ed44404aabc606e091b88b50c6198c003e3af53ee73a5ad", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236701-236712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236701-236712.nc", + "5b1b1847cdba3566ea0da3f8edfdf3dd60baf8e2b30f0170ae249d0e6e0898df", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236801-236812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236801-236812.nc", + "6c2fb9249895643ca127e2e8e8fe6c08eb3ed07007c3826eccf53b4682b3cbb2", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236901-236912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236901-236912.nc", + "5344c86d654f4dea5bfb55daa0d5e5810a274b605d503d12eb7d393159831654", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237001-237012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237001-237012.nc", + "11dc06a1cd5a206bebe446ad1219e2ce9ceda59c409b0d9afe831e18628a4e1c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237101-237112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237101-237112.nc", + "c2b592e2422f629dee564630d05a377bd6ee1e6ec54de033094da1841adbe445", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237201-237212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237201-237212.nc", + "7a287b431a8a705226ccecb81341086090cef3dce8661d0ee29d55d754a7b516", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237301-237312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237301-237312.nc", + "27371b8efd3a0eb41cdc34e29cbb0f9464ee2d001f3f13c4bee8cc6113025476", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237401-237412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237401-237412.nc", + "9a8281009d82c97738c2924c3ba4bf5b8ee8750d40286fe002ce1bf1e1cff901", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237501-237512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237501-237512.nc", + "72412f6c93ce8a8fb42c4e38ba3a4b6f18a1612a78587f156e509d97a488227b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237601-237612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237601-237612.nc", + "0005d23c73ddd83e94de81c22f38a8c2599a79884afa94c0284bc4bf7c73f525", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237701-237712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237701-237712.nc", + "de801b8d3f3935def601987e344ab0afa1d4f4acfbb15c7c6f663784e343ad53", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237801-237812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237801-237812.nc", + "a005f233399619ec804e7363c6aafe7557862e48a7ed6ab8853b5ce3a0bbf1b4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237901-237912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237901-237912.nc", + "d0d1049afaedf4fc4a1bb0a432e5543c5f0ed2ac0c04607731afaa2d5c2529b4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238001-238012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238001-238012.nc", + "937e9761395ae2785962c29faa561d5465d7b68641bd2f6e4feb004306b914c6", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238101-238112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238101-238112.nc", + "c5513c67dda23ae4ed1de3ab16eb6f5c5fc5b64090316060c61ab6dac4f04601", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238201-238212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238201-238212.nc", + "b2e7d5848f82350d044424e2f81a5a62eff5096959fb8c03faf86bc0ba6550ea", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238301-238312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238301-238312.nc", + "8e557a6aa1f4216c0a849e8cb637b68219edcd86fc9d5605226b20094b300876", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238401-238412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238401-238412.nc", + "29f8833fa0855dcfc738d3c6581afd8dbf71a3175b91b3cda0f3785b9510d78f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238501-238512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238501-238512.nc", + "141d09990df89de2e3a1f88b1535c34b45c80e8424f46d48fa980dd0130ae77b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238601-238612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238601-238612.nc", + "0c3efebf7426587d273c6366ed0311cbd3faaf5534b706e13a2b7f272de9bbdb", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238701-238712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238701-238712.nc", + "bea934827f0716e95414de6c868304e19e59499c3abd4e0b272adbc365f37da1", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238801-238812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238801-238812.nc", + "ed57202480862ccb5f961fd635ca28225f2ec6b84b17ffa7986287e5ee694ce3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238901-238912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238901-238912.nc", + "2552fa0f4a943d1cf243187656f9c2c122c711fe577dacc3eeb8d493f798eedc", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239001-239012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239001-239012.nc", + "35accdb44277a921133b4d8ae14ff8cfcfa0b5a0b945f892052bc84116b3c944", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239101-239112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239101-239112.nc", + "904b865abee3fabd465308937ffbe5569108259de56442dad3dfa7dbc5a448a9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239201-239212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239201-239212.nc", + "de0bebbaceb22cfd4bcd40a024d6b1f15d0716fc94422248acb5434e6a31740c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239301-239312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239301-239312.nc", + "10fcc610c0ce1693da89b7b6094336872cbd3dacc40f92106bc8caf43d9f5af0", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239401-239412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239401-239412.nc", + "39f5431fca5cde736eed7930cff163a227305eb15216e0369c0e8b9927fccfd3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239501-239512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239501-239512.nc", + "1e7ba7a32137c329784fd7224a1ddcddd429c4cc73d9fbbab575ed1b9199af50", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239601-239612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239601-239612.nc", + "3d57230c04c51153e8728c972c2d852b0e59597147c05432ddc7d0cc56f0d21f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239701-239712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239701-239712.nc", + "f242db56f1a53686793529a7a8b23c826a026171e36d4febc174c355de39ab46", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239801-239812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239801-239812.nc", + "56e9aae121e54be125e6577cebc8cdff78faf94ab5d0b72b9dae73fabed0ec36", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239901-239912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239901-239912.nc", + "045f4e18ad15ac5bf9ea134335ec9d6306937686134513d0691e7f14f665a190", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240001-240012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240001-240012.nc", + "85e29df37a76506793177c892b21857b751574784ea90ec37ddaa5c07b3297e8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240101-240112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240101-240112.nc", + "4529b0590cc259dd1ead61cbb4227de797d4914ad1650892b25492b8781913ae", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240201-240212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240201-240212.nc", + "08615dd66bb1f2ec22dca1337508d9958d22e543b114a49495be9c010b9e1f59", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240301-240312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240301-240312.nc", + "0dc5dcd753e800241adac1bda914d9ffb3aa9a548ee316f953319504e0d293c7", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240401-240412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240401-240412.nc", + "b322ecbe6a69668d72e20b37d3aee6740fa05d4556f9c773568962cd6ac2110b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240501-240512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240501-240512.nc", + "c3d8d719a849861241a80e0c4e456d2b220812b43f810770ff94d399eda35a0f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240601-240612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240601-240612.nc", + "66f65380a79e3590a84d30556fa475af56b615a1646c1f0b44640fa4c02116b4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240701-240712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240701-240712.nc", + "390d3febf06b3aadd560910de8f8d24284ceee2e8b29939491324db38df4379f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240801-240812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240801-240812.nc", + "b490555be1a72234cc9634f3f39f244702a485f52eebccf1f13699421b82b746", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240901-240912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240901-240912.nc", + "3670693302af0a8cb84fe5657b1a48ef6db0bfa6ac6701702bb6b10941ab0786", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241001-241012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241001-241012.nc", + "d13467653257a2c8e717dbcad41281d3b9fa48316aa352c9f36ffcc8934a7677", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241101-241112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241101-241112.nc", + "e24d85b25b4643dffd377635e2a2406e8b905988da342949d0d41710f88b5413", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241201-241212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241201-241212.nc", + "9f065e8a3474e67235d3cf2054bca8aecbf0cfe530a7691eb8474ec9be756191", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241301-241312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241301-241312.nc", + "2661ce395005cf3956b3cb148681a0f8a8d3a0909ee2642284ec2a44f036e689", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241401-241412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241401-241412.nc", + "73c3619c314b2ef92fed18d655d318309b0e38af09c95bc2587ded35dfbed30c", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241501-241512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241501-241512.nc", + "62c77889597951e07b5f609e3db442a53e1b3bef5f139a883acddca6a7d1f426", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241601-241612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241601-241612.nc", + "5b0fcd82a30fc20987371066175fa4bae229e5963a6556915c1a1761e509b887", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241701-241712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241701-241712.nc", + "e17d5ed59bc5a0abf061d04b22d31809ddbad1f8355d73b15aa589d0600a6b27", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241801-241812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241801-241812.nc", + "b65b42516faab7c6efabbbef1e675074050c7a1d765a8f204c558ebce88aad7f", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241901-241912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241901-241912.nc", + "d18e9ae72814a08d995fb63806b330a58022b74517a17512f37326ff94fcbdb4", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242001-242012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242001-242012.nc", + "d7bd4559f58ca2e331cc39f697a9af13e6370e14f056a4db2e8606e9ad379ed2", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242101-242112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242101-242112.nc", + "c012a133105696ebe11ba5511d4d1b23b89238d9c8be32bcd67f92d9b7765bdd", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242201-242212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242201-242212.nc", + "828844051fc993a67384ab32fe7ab18a19c3b742eb0b5dda0e81b23d67eed97a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242301-242312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242301-242312.nc", + "2b640349f48d72915c3a3e7a2915f2ece60c33aac0a239cb03ebd611d26d83a3", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242401-242412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242401-242412.nc", + "8738a7dc154761fba816eb5f18a6c8abf3d52f68dd2ae20324fc89ecbcb16c1a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242501-242512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242501-242512.nc", + "5a4f678813ab292a205b578a9bdef163d548868ea9db97d1f4cedfa52f8e0b5b", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242601-242612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242601-242612.nc", + "36841cfc5a5098574b893985934682eb97c461346b8e217775e6789c87be9929", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242701-242712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242701-242712.nc", + "4f889b7b6960900259d026c7c32016f777a3322b434a8f46becd78bed6020fbd", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242801-242812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242801-242812.nc", + "4a2de4eefff7e50cb1152b49ef85ca74ce2232de89b96696cf6b91815f518b7d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242901-242912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242901-242912.nc", + "0d2f13fc833fc1d76abcf1e4cf58aa0d0624d619b2637fd76337c23ec57b123a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243001-243012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243001-243012.nc", + "23028c47ed0dc651006a24f9bcdf291094bbbcd7c4019a379c023a2815955baa", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243101-243112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243101-243112.nc", + "b6f55ff49db386f1cb877d168835900ca3072070256c87acd7acabdca89c7d37", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243201-243212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243201-243212.nc", + "966d0fb816d33e38c51ac2d4b03529ee0362fc4220a678b38aea637438df6545", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243301-243312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243301-243312.nc", + "f0c17f547a9a58b58fd941f57b8f82b6e360f90ace110201837d5989e34aea91", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243401-243412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243401-243412.nc", + "7c5b21e2600ad89444c8c685d604c4a48a765dc3ee06628e9909dde74d4d4657", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243501-243512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243501-243512.nc", + "0d0cbc87e195b95d11bb7d19472a5261dc6a692ce1a3a8f6360d23bfb3aa1a8d", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243601-243612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243601-243612.nc", + "06cbc2a73e3c402705035a16bc99af67aa2b99b0f3f4e2bb935fd8699af5f307", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243701-243712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243701-243712.nc", + "2abce6f49b5f60d0a8764e8e32da2edbfb40e5d5a07fb9aa2b1f95729ea2aec8", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243801-243812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243801-243812.nc", + "7c025c08e4b1f9984fbc31ca08b5087a22724e4bf38618fe7145074a0feb619a", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243901-243912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243901-243912.nc", + "48b8cbeab4c3b81925aec544c77dbc7c2756cf653c7901c71dce5e2f3e8aadf9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244001-244012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244001-244012.nc", + "074ebaec354ee395507d8f135e5ee79981c5c5ec2a51bdcb175330cc57a52b93", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244101-244112.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244101-244112.nc", + "804610a7a5ceb036881e2c951ea05efaaa2e59834acaed69e494324d14cfe8ac", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244201-244212.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244201-244212.nc", + "6d74544b4ee1cc5755d5757e8ac8a99371baf6fd346f5423cc0b0b73f2d65575", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244301-244312.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244301-244312.nc", + "753e591678a405cd37777f069ad81818ff4b2419b99d3db08416c15728732b17", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244401-244412.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244401-244412.nc", + "94da4def1c8e220afa4ca8ca736cabe75b78b945b72bc185bb789c69f4e692b9", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244501-244512.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244501-244512.nc", + "8220505027930951ac717c94c1917baecd21eda21096a4ef696fa4008dab4788", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244601-244612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244601-244612.nc", + "56b2b1c08f0f69989b5b7c098edc2cc6d6df07c485e45a73bdbcdc7d8d828a10", + ), + ( + "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244701-244712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244701-244712.nc", + "cb124d278c4f91a507f90069bec61ac1059202305c2ef88fa0bb353cbffc99d9", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322901-322912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322901-322912.nc", + "f97d3488854f211b981ce6e90742c184224b62a2bc09312a38ddd027d6dd5696", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324201-324212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324201-324212.nc", + "a4150fc0bfdee553648f9c579853dbf55074027d61c7e6996185f58ae9222973", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328601-328612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328601-328612.nc", + "dd0d8496695e310e1fc585fd23fa89ec06df2c1d9049e237463634b8ea814beb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331401-331412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331401-331412.nc", + "9845094194c04c3ad30f8b79d4ea1635fc5812b5896fdad24d89b2589e2e9c4f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332501-332512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332501-332512.nc", + "bd8c435c33c9c675216d93f273456a3c0c45cd20854dbe72e89e30415f6c4453", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334701-334712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334701-334712.nc", + "5cc2c09e892f932682ef367853367a3df22d6491f52b6a68ef6ba776793b20f0", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335001-335012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335001-335012.nc", + "a71e719d6e49c9d0a95e95c3183be70d1b2b56a3e47536c2ed291510f96ab49b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340101-340112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340101-340112.nc", + "61f9a619a7226234f4fbf49aec23116951eecd206da095dddf8bf697fc01f4f0", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320801-320812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320801-320812.nc", + "70c0111095c2d4f8907421cf3113b550d69ad06a22da7aa4ebbc60538ef9f616", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321401-321412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321401-321412.nc", + "379f355cd783e0c81506bee0514f03ba40ac6f5004ed6f56990d4ef1d4b2d162", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322201-322212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322201-322212.nc", + "d0a3d67853aaaddfc7643eb4599ba77dd4b883c45ead7e1fd31573d40868de23", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322701-322712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322701-322712.nc", + "3d4a8c2ae9939dcceb8198b99052cf8dd112959c7168eb007e8dbdfc477f93f5", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323101-323112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323101-323112.nc", + "4bd0a6ca8b7d9682cba3f5cce78c505e7556a301b5fd6ac8110aaa9298786363", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324101-324112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324101-324112.nc", + "c1775ab29d437f08d49c037e9aa6a25977ec193865286025a0afc5f6bc941c82", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327701-327712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327701-327712.nc", + "f907bc9898ae4d039a28802c5013e44e20543c23010147f0843170453bf1e92d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329401-329412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329401-329412.nc", + "b9c2280655ef0cf32a06889e3751fa44cfa6bd06c0bf1a0303987852c7db6204", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333801-333812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333801-333812.nc", + "398846597ba4a084200b0b4af5df04fa26acd2ef933a1920c9c302d7c31971ac", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334101-334112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334101-334112.nc", + "4f4e3d66b5d08bd1b187f80205ffaa6a416803df503f25d85329cd7ab5c98ca7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336301-336312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336301-336312.nc", + "6abc9f3c14551d37ebe7ce3e478a561c081a21e27663a26a2e5ad70979687cb5", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336501-336512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336501-336512.nc", + "74326fc18b35dad0830184fbd02e541920c56f776c231265b5961b72990c9d7e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339201-339212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339201-339212.nc", + "39d718603e8b056948a9e32cdd4943454d1eb3097acc354eb47b01abbadb209c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339701-339712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339701-339712.nc", + "16966415e759d07705ccbda102bb11830750061444f22fe3abdf542a68c4ee8d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340001-340012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340001-340012.nc", + "a0cec37a33618a210fae273b8ae142958f976a4e380aee727647af3206b46e47", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322301-322312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322301-322312.nc", + "bc953c3aaeee015d0e481626b40cba522d69df36e0739010b6e76fcd934bdf2a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322601-322612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322601-322612.nc", + "2256fc14e8b783f2e4a8967f254f8edd3c261ed093a470ad9c7a5c7fd7d16512", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326001-326012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326001-326012.nc", + "1c90d0d2c65a7904e91b82c274eb24e88f10ad7215c963d43becb82af5d4ba06", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326301-326312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326301-326312.nc", + "bb911829b6d3fae8f6f8306fe4b7dba9faa56e99a2df64809ac77cb4bdc58f55", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329601-329612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329601-329612.nc", + "2d95834e37678ca0072f4e302d94fd5c8c559061816e91bef097542567dbc173", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329901-329912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329901-329912.nc", + "6f43abaa718a9196392719c0b956d379c0f1fff7017a47c9f0c3d62b9f1ca3fb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330401-330412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330401-330412.nc", + "df593e3d65bd173ae88cb1f99becacb51f866e9b208f28383c297f575169b593", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332901-332912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332901-332912.nc", + "6b533695af4a1237a8156d6fa0ac021026eb8f364a0e94eeabb9fb9fa096aa37", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334301-334312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334301-334312.nc", + "9c739d4afc061bf03aa5b1514056a2c1132182379287be8a83ac31554549ba0e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335901-335912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335901-335912.nc", + "48396970d56dd226de7c7df9296610e94d38040a1cdb8211aeb075f6176a351a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336601-336612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336601-336612.nc", + "7700a6fcca16def8e161dfee191db5dd7bc7e89d66925a888a59f9f5f925a4b9", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336701-336712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336701-336712.nc", + "c4de06dc08a5cb391e6f2106775df7f8a67e6edd9c1dd4760454034d20bfa54e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321701-321712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321701-321712.nc", + "8bb1385ab4c543ffc6b4bfa484547afc98198597b4ab33f44c1c764cbef36826", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322801-322812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322801-322812.nc", + "eb2c072696f1c95ab47956935d607ec71eb949d107c292d1c6190e6fdcc061f7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324901-324912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324901-324912.nc", + "ce3d6f556021ea454bf1e7d0ffa604943b666dc379d0fed955467dd484bf8414", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328001-328012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328001-328012.nc", + "771b73ce3201953540ca64865052a960b79c8f5064ef87b0d2ad67ecc0b850d1", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333901-333912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333901-333912.nc", + "807fbb70cf0811cc30745982e90f83bb8b8a4586e50a79a4dfbc07bc882a6f88", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334901-334912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334901-334912.nc", + "4c52723eef28b9563ef5e994f4f645be7754a7db8f3d6a1a5a26b0826ce75489", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335201-335212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335201-335212.nc", + "b2dd563440b36baef12e6537fac8bc837e0e3c3081cfd523a6f2ddbb31bd9037", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335801-335812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335801-335812.nc", + "3efe04ac5fd9410eaf28c579cb9539e8f159679c8969be83ebc69a1f376960e6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336401-336412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336401-336412.nc", + "8a2f31ff22572dc2af574013fe2ab9431c43eceb22eb31622ab23ad5e351d825", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336901-336912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336901-336912.nc", + "9924bee166d47b2bc076d82b0e1c9e3a42cf22df3277582cff14817afc48c1bc", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338101-338112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338101-338112.nc", + "c49949b9b23ee8068150fab5426db8e9dd203bdb781a26b58b62443a48630458", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338201-338212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338201-338212.nc", + "75dff4e38e5c52e310fea5ef3775c9f8d4171e0004ac4e6382093cbb44c1665d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322101-322112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322101-322112.nc", + "80b380650bbfc7c5eafc1ba6c0c7837598dafa90e11cc7aaa756f0f0dfa18757", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323001-323012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323001-323012.nc", + "7cf2cd8517637641c21674dbbf95db95460d3ffcf1d6d306b5c92a861877b34e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325501-325512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325501-325512.nc", + "eacd5f630dc3635ee98c247cab7f6627f0c24e000490c8c6ac0c549fbd12dbb3", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325701-325712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325701-325712.nc", + "1886c8e649fa2ce0c203360bbb721bdc4af9fb48f206748097e0b5e99f5425a9", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326701-326712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326701-326712.nc", + "59ba2442e9fd7ba264732037c0c86531b2d4a91a732fd5277beb7f83f35033c3", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327901-327912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327901-327912.nc", + "659cd5c1ee1d9de80a12bb1e4f583bc8d4a0e3df397f3688fe5945938880086f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330801-330812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330801-330812.nc", + "cfdb71aae37f68a88c6e48a20fc7eda5c20a92a177d7648ea0b436df3ee657db", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332001-332012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332001-332012.nc", + "c79c5478f58062f73ad2affa0e3397a2d2d4456a2b885430e1ba80ae7fdedf84", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332101-332112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332101-332112.nc", + "d2429d6b5aa1fe069d396ef557590dbb13c30688e25f72c6279b98a11ce7ec45", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333101-333112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333101-333112.nc", + "a05b8ab1fd53ecd56c654b4f5d0df7c6e2763fc260e8a76a317e36299b8989c6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333701-333712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333701-333712.nc", + "c58400d601c537ca0829976156497948b47092d79d44a112c1e4035dcf156b7d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338001-338012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338001-338012.nc", + "85cc37ec74605367ce6fb4cc30eda4eb624a2597fecc37284222cff416ac8a35", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338501-338512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338501-338512.nc", + "b11a59e55a00066ea46f65242192353d50d6c784083210cf1c7d8bb5ec2aaf46", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321101-321112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321101-321112.nc", + "7f5a5db2feb2f48d1130b9d7dcd061dcdf934bf548e6fe0e6675090f85925c65", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321201-321212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321201-321212.nc", + "a60347bba5b0130e55b8ad1b6a277729eeed1036f9e96db6d7faf80d9efe0164", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321901-321912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321901-321912.nc", + "91071a545ff7af1da212fb6b5c770e4e68cddd9f22727919c68f400c513859d7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323201-323212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323201-323212.nc", + "d05cd38daa4a80c8d3a3c4ee17c5f46a515d5bb15e05253eba8365d9b4fbb384", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324301-324312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324301-324312.nc", + "ca472c3bc745ee4f1099674eb373b6e623c64ead60131b09f4d1ef5815294a11", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324401-324412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324401-324412.nc", + "858ff3d80a81addc919b84bfb7c2f6115f7b28d6435220ae67bf98f8114220bb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324601-324612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324601-324612.nc", + "f43836c72a96e3772e438f890c43d34d68097fc5196ceda710ba52b453ab23ba", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324701-324712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324701-324712.nc", + "1c90222475fd1c546a8dc821148c43e3e3a0ccb658db4e424cae4eeb073e5c2b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327401-327412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327401-327412.nc", + "97b6c268b303fd1220d153a59c7bcf99c073bc3fe4bcf59c77a5f050c0f5e2ca", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328201-328212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328201-328212.nc", + "ce7de0fc4c2a0153e4b14a46617725d172c9852969435ae8c9ef93c03f7f9f3d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328701-328712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328701-328712.nc", + "9a0d036271e182999ed8e8f8d1b12a910187a0fd1273ac0a46b1b34b2247ef3b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328801-328812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328801-328812.nc", + "7dcfbc4b2db7d0d632387144ae1f2a3eb435c3cf2904b88824d4b3c5ff7c2ce5", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328901-328912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328901-328912.nc", + "4b554cf8bb5dc82352df6ecd75d3beb5be7ea438d1367ce0e28c4f942a8e2c5f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331601-331612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331601-331612.nc", + "6404c9cdf55d6b141f9b4caf24054e158ff675bc29ccafa7d2dfd1e993ba94d8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331701-331712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331701-331712.nc", + "ab532d596cba36b44b2a0ae8fc11998287c1599bf43218ffe04cc87f2e8c25b7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332801-332812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332801-332812.nc", + "133395553e89a715eb1f68a60537c54dc4e55090d1204ee1bf0562214def98eb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333501-333512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333501-333512.nc", + "3a773040c9682c56ce54f63ad143222a1ee02664a05de7e43d4ca248e8f8360a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334201-334212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334201-334212.nc", + "515a1be4fdc1ba7dd617a9b3abad0259bacb4ad74aa5f411b274152e9a2240eb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335701-335712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335701-335712.nc", + "654cc017a26b37abcfd427b7c44efb084f2ee156634082ea4cbed6b84b341d20", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338601-338612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338601-338612.nc", + "0dca5fee016776e0099c3754e0092b844a73d94b578962a2bfaa127acfe86197", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338801-338812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338801-338812.nc", + "1aa29bb742c6a271ae5f17c88652908a5531419cb96db602635af1bb07ab918f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321601-321612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321601-321612.nc", + "198aa1c63890075646f246f3529d08584ea9727a0f59a73b246c2d0a3b60a002", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323301-323312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323301-323312.nc", + "a71616e0b706c27aacb470a07971afc47375267b33621bda59ec9ae4ea773e17", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323701-323712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323701-323712.nc", + "c3682e1cbb159b683933306c2ca8664ac21e89dc965ae3a3058edbd5f41a9041", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325001-325012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325001-325012.nc", + "2c5d9ad83ee89b937289bcf83d288b45d9e2bc29e88af9f1599309ca8b9bcf22", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328401-328412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328401-328412.nc", + "d1a3dd7368998725040dc51cf0191e64bcd171354b7cc6bb2d0102188cdb892e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333001-333012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333001-333012.nc", + "9347a68b5ff4e6aa9ceab31ce1a7b6c05f7d9a921667fe94100bcfa9e8019bd9", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334801-334812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334801-334812.nc", + "294bc8e1ffd61a05e107975ebe750aa443f9f1b744adc490e3296e6f4e790b4b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335501-335512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335501-335512.nc", + "b7063cc8dee0cd76c0b4aca31d7d6493af0d24caedc29d2a118aab7de54ab7c3", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337201-337212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337201-337212.nc", + "a0f43553ec4739099a515b1f73b9ede62641dfea36aef9596391dc578013b9cb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337701-337712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337701-337712.nc", + "8f3171fd7f4b6ee65d55dd2b893389d659b42992ed9d85a9d23a3b4c6d84d985", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339401-339412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339401-339412.nc", + "0e7d78b14b5aec0052abbde6bab17b277c3f0a5fa56943f985f8b1d6a4f5fb78", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339601-339612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339601-339612.nc", + "253e65cf3c088ebf297646627534f0a8e3f4331225de85def0030594cd2a6a13", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320701-320712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320701-320712.nc", + "43d5c6ebdcdbce5d87b57e3a869283bd7fb7920fd276b04eba38cfb2609456dc", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320901-320912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320901-320912.nc", + "81c879dcf9efef3414123b66128dc0ae478dba4454a079e55d802efc020e831c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321801-321812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321801-321812.nc", + "35fa68e7b8268856f5f44496a23609b578638608fc1cf72f98f7ee31bdf757a9", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322001-322012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322001-322012.nc", + "2f0ace05b0804e074cd78666fde78d0de424e44cab78b1f5dae036e1956c81a4", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322501-322512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322501-322512.nc", + "d1be746f0f6ce683c5b611c6582f0ef26b1c394210a1b891c6604dc116f5987f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325401-325412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325401-325412.nc", + "72c126dcec7a3fe73233cb897f17634c3f92c28d0b25480c320b6724505b6e41", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329001-329012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329001-329012.nc", + "2e1adc68ed3b048a2fbcdfa6fac5701e15518dccff07a84ac89aa5dd0334adc7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331201-331212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331201-331212.nc", + "abb7747bcc728464c61eac3ba269489e5ea7e6ed07be4ad5d25cc9af84dc132a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337601-337612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337601-337612.nc", + "9bf1b62b773caca122c53f2a13ed963106a80601f0a0593291e715bed70403e8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339001-339012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339001-339012.nc", + "0b5e93e8f9e933381054e9ea9d97a8b633ad4e4c18c09b9b3d0b641070b3b21c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323801-323812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323801-323812.nc", + "77328eb66f583ff52077f5c9ece2f7c4ec952978104de699e2a1854620c00711", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324501-324512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324501-324512.nc", + "a2487f67adab3c73bbef5a21e5aaf2261a8148381318c3491b2931501b8460d3", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326501-326512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326501-326512.nc", + "f2de75b2f02ea259afad473e8a7161acf605da62fe242d1c4c81f73961629406", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326601-326612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326601-326612.nc", + "d43200c600f929c2d0a47ff3bc7bbbca6e023c14da219a4d304265eee21466be", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327501-327512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327501-327512.nc", + "849966dc59b4dd970c7497793e552120ff11426484f6ab0e1a7aa45df5cac097", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327801-327812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327801-327812.nc", + "b7cfb50e93fcf0e5ff9eb119efbdc4757b1db60b281a30cadc239f0db7eefe6b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328501-328512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328501-328512.nc", + "1637d52e254f292c018ef0e36ca6f4a4db4cdb2b52ddc89e5736263044b91ac6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329501-329512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329501-329512.nc", + "19bca5cbbd0e9e177842e9394599696b1f0c2a261db83e280e5f4357851925d7", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331301-331312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331301-331312.nc", + "b28fc0563cb9a597d94f81ac3fe66e6109873510650f01b1f57f4ef4ea74c803", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332701-332712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332701-332712.nc", + "46d959defce4e437ac469c1bb47c3114c63f2bed1348f2e35ef0530fbf998e28", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335301-335312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335301-335312.nc", + "ac6347ee845ad8137fd4ba9111fafade97d2ad72d2e53a3d6087a65d5a6b22cb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335601-335612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335601-335612.nc", + "b3573fe7dd1b9bf8202fead435a8cb2bfcfb1a5131314aeb319f2b2044140194", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337401-337412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337401-337412.nc", + "199944f5a46e8962a1d0938913ef479ec62aa7a839b8c2bac8612d4325c068a2", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323901-323912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323901-323912.nc", + "811c63d3aa20717c9ce467c3d35ca19ab3f3fc7622cc32bf7d6952988bce0dd1", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325601-325612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325601-325612.nc", + "5575490622db7cba3a054d61bedf0e8cd9b56115d359dff77255f293069fab61", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325901-325912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325901-325912.nc", + "e472a45a78f1654d38540a1f391c6d2c52ef985ce8119c251e160be914d3ffe4", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326901-326912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326901-326912.nc", + "c4e186f3b22e4f6bf409937fa2a4e0615e264b19a3c54a855fbce5995bb27ec5", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327301-327312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327301-327312.nc", + "0d2630df87bfa62ceb0973c5e2e5a955efbbfd12ed8bc9a80759b98780a6684f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327601-327612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327601-327612.nc", + "ba22c222d80b34556a810bcae4564f0724b6ca8ff4732bc452d3edb300c77f74", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329101-329112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329101-329112.nc", + "b05244c9249b3b8c613ef5008fb7325e1f784cc63e456e30e7eed6caf7629e18", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329301-329312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329301-329312.nc", + "32afffe7f35ec720a2751645e4c9f7b99a13a6cbc395acc83ca99d0048ba1162", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331001-331012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331001-331012.nc", + "46e2a63ffe03522cf27563e3c006a080d4167bf252dc7034ee302b58cbc7d010", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332301-332312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332301-332312.nc", + "ed56d98cd1ab50d104157aaaccbec39d1c8893949cb5a29b2201172fa8e42eb1", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333301-333312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333301-333312.nc", + "69240d909b51a22f5838d99fd7f83ade3fc489cccb72f1ba0021d5fc77d6fbf6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333601-333612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333601-333612.nc", + "9c36c6826cd00ecab4320fc1c536f5d136e16676dbbb36dc1eac68d4831bf40d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336801-336812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336801-336812.nc", + "f2757080ba71fb509a1a2f12deed07f2758882d82ed421f229d08ae01547729a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338401-338412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338401-338412.nc", + "a205ce88a8080fc1bde0cc4195c23fb8127e5af11dce6622159263d59ba2699c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339101-339112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339101-339112.nc", + "81c3a8b36b2eb277c788e6e9448c1faa0c9ccf39b80df37eef1552eddd960042", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339301-339312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339301-339312.nc", + "2bc96071f9c7e7d5b7072254cc887953db505de4bfab77f40e2dd7fe19d26699", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339901-339912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339901-339912.nc", + "b0093863581e13e2364bd98fabb4b6c420a664550b424d7fa983e0243d476800", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340201-340212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340201-340212.nc", + "46c5bbb6224747e054eabfe2bddd4170458b35e0f29683d7b63783a6e7c44788", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324801-324812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324801-324812.nc", + "64088c8719d271c93a92a18ad8afd35363219d2932aea581b9cb98adb198d452", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325101-325112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325101-325112.nc", + "947ff9ed919a653212735c88adf118e8137fe251b630a139767e24958d4ef46d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326101-326112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326101-326112.nc", + "33293d2e7b0ca842a8b4c4eff990c3e368cca75510030cccf0884ccb55b3342a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327201-327212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327201-327212.nc", + "245cf1f2e5efd1267e421570f4bdbd97509931615ae2fa4e9a0340c46cf6237e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329801-329812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329801-329812.nc", + "ac35d4aa1033836cdb9d1bfe55382913259c2722be9b55d56a0e84aa7d1e39b8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330201-330212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330201-330212.nc", + "4a7d36bafb66a5b885adfaf7cedddc97a6b884ef689d63286144922fec76ac36", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337101-337112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337101-337112.nc", + "337b03c35806013ffc7d2c2c57191b7aa42cfe6c15247188ef68ed3905fc57e6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337301-337312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337301-337312.nc", + "653c7786ce24f17bc0e10fce0c54398b0af1720a4d581c6dce208fe84367f41b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337501-337512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337501-337512.nc", + "e406d6c095b19d2b9a3748036263c76a953e4e1f30c2440a202b8c09c728c93c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338701-338712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338701-338712.nc", + "161deab94b5a627059b616c11779b6c7548e35b8ded6eaef5298d603c800b19a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338901-338912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338901-338912.nc", + "4c7ebd5ad6e1517a552f7531b53df929a1a8eff6d5b97b2bd60e8597785c6d7b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340501-340512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340501-340512.nc", + "4e69dc3631c6ba6645c6ad4f8380f75bfb7787d19bab92dfab81b498731757f4", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340601-340612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340601-340612.nc", + "64156507e19bbb306ce809b52b4f00511bbbadcb1766c885ff98c8c710d3490a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323601-323612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323601-323612.nc", + "81e0651d08a883d5eaae7a4025f224b46d42523e9d43fe13ee116d507a6acb5d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325801-325812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325801-325812.nc", + "0c2c5f4195a09e7e5bf4816c3a65fc01b02e4d277a8ea6adf59353a7a9788a2b", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327001-327012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327001-327012.nc", + "4921f0c6b9ef3e0dd2a6e356fc7d9e171075cafb55a26e1d863e3cffcf974326", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328101-328112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328101-328112.nc", + "cb7307d2e18a4ec96c2d7a4e0af6d580ecd1b19f35f9931442359c7f7a19b6d6", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330601-330612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330601-330612.nc", + "04e3d1de6f3feffeabf004e0714b355db701e35f105cae2412bba41d0172008a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332201-332212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332201-332212.nc", + "7ab0791df7a1e9ae20c1d86cc70bcc061034452158d6536d2f47195aa2d034fc", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334601-334612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334601-334612.nc", + "e3735a860b2710c8b5d40b99278450134cf47be39a77a2661b3e25c5a1a2e237", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336001-336012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336001-336012.nc", + "c263beb12498a24f590b912c5bab1839753c7916b23f673f75fbe26956b81fed", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321001-321012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321001-321012.nc", + "cd9ff0970561bf087e584338cbf389860e1d1fcd86c4cc0ee2527251462f42a8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321301-321312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321301-321312.nc", + "2a57f8d3a59151e4a523eaa009d860f91fb67c27780100c345a0047e8d15a127", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322401-322412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322401-322412.nc", + "613e2aa25c8a0de611b37ecbffdb4a3600c382dc47b7eec8cbb2e056fd140c52", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323401-323412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323401-323412.nc", + "6bef766026b2a4a0f56ccb88b3d20b3ce75287a8eddf0fc4468e8f6fcd133adb", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323501-323512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323501-323512.nc", + "d478bc0be4ef11684c34c96df3c0db8deec99c22d8b91b900ef29f65a6a0268e", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326801-326812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326801-326812.nc", + "3d8c411012f3a6cd6bf07c92eb36a1b5bbd8879be4a030b3dfb73be7db66040a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330501-330512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330501-330512.nc", + "6473c5e17edfd2a3b972bb0eb963deb75485a8e62dcf18695e7fefa4de31e90c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330701-330712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330701-330712.nc", + "b3f4292e451425c32658e2ab69dc3166494225bec4a82bd15792fc74f14aa840", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331801-331812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331801-331812.nc", + "8a81a83f723b0b641843dbb8729b72f61a36e3430d9f8dfa21efed4b933cc74a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333401-333412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333401-333412.nc", + "3cdb205225aae14b37adb32cc6443d8ba1185c7f09e3ca791fcd539890e870c8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334401-334412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334401-334412.nc", + "0fe75e8ba9be2dc7ad0785a918a2132d89cf15557a5ed7371904447499e05bbd", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336201-336212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336201-336212.nc", + "57090a27268be96698b34838c08bbc16368f7b31bd5fa86aa1c75e85b0d2403f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338301-338312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338301-338312.nc", + "f316b7a9d3ddd2017c221c4087b32b24287f43ac2e7343bf56d41b33c52646bc", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321501-321512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321501-321512.nc", + "b951f305ce7dedfb432fd30465358a38f20aba0c49a9a18a435126673300d282", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325201-325212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325201-325212.nc", + "b3bd86ec2cd71a9262f8e6eaf485ed6e45e0c73b1c936daf29d4ed433eb3925f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325301-325312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325301-325312.nc", + "e3a4618075d12c30ddb48156d8fc13f37065dd6daf544b21790a39de1f2a2340", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326201-326212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326201-326212.nc", + "f91a0db387a6024b19743af796e2773e4111b1bca504e8426a604a64fae303da", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328301-328312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328301-328312.nc", + "6336e8d0fa6e6fc0b249306cdee3fe3fda6d763f7be9dd54b91c1049844895f4", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329201-329212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329201-329212.nc", + "36b38bb0dc79fd07d56afbddce523054ba6d08c6fed9da39344e9f1039cc2896", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329701-329712.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329701-329712.nc", + "bb9eddbae4bbde6402e792879859a9962b6777424e43fbf02780c51fe0f00819", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330901-330912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330901-330912.nc", + "e5728370a1f2d6939656b94e878ae16644f99cebe2c3830608b460790ea501bd", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332601-332612.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332601-332612.nc", + "3481beb5b6203a458fccfac4299b012b44da90df9a2b57b6fff14a0f5fa64b1d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334001-334012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334001-334012.nc", + "c3bc68b0f2f3948d73cec88987f6746508e479ee1e711ca3e1ead6a48161689c", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334501-334512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334501-334512.nc", + "06b64f4da6b1e16fcdc9c7a1f58b76361bd2549b884dc9523173d47ffd4f44d1", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337001-337012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337001-337012.nc", + "74dda9f5735ed04ef699a7dc02c3290a8e6392077ed474a5cdeb883055a12d33", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337901-337912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337901-337912.nc", + "942189e2f77115b61ce71e9e0b6a97bc535a0e8de2d662362beee0c204ba5423", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339501-339512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339501-339512.nc", + "afa8800bc810a6567036404eca024ebbd3749d8f7a602cca97b631af384fd1e8", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339801-339812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339801-339812.nc", + "2f6414185b739879d6300198938f0e72b6499f5602aadea317e199f2dac7be07", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340301-340312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340301-340312.nc", + "0d8f395f30965357469720189ea9b08c6b5ebcef7152b66dfbc515d2cc4d1679", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340401-340412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340401-340412.nc", + "b297016f83deaffb590ee534d8d7a4edf4f0e9925f26c527846abb1eefd7579d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324001-324012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324001-324012.nc", + "345d9b594dba9bdbb6980bccab5b18f48ec282bc601a40d5b0754d8e510c0edd", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326401-326412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326401-326412.nc", + "f384814352052e5b6969b360757a7a4c9f37af88b423bfffc4a098f79a14877a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327101-327112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327101-327112.nc", + "02568439c3e868fab20f553b708192d94469108b9a28ff7031117179e0e222bf", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330001-330012.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330001-330012.nc", + "86c5cbc4aa917613927d839650472e595cbbb4b568d7a33f516375d5c3e31d20", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330101-330112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330101-330112.nc", + "6170eac5fd3ff6960bc944a7a22eb73ad5f1fffe44687ad596756fdeb6d58930", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330301-330312.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330301-330312.nc", + "80ff024d6ec393ad92ef35a9f16d55157fe4daca61d2a869006abf4de5a1c282", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331101-331112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331101-331112.nc", + "488032708d55d0b8481079d259258c6cd9e38f44b0fcedc261cf71cd65224e63", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331501-331512.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331501-331512.nc", + "0910c28bf0a146469bd7a7704699f3bc86c19c9511d56107c6b4dac9033c2538", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331901-331912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331901-331912.nc", + "48398069d425a510ce34b5853ff762c0195ae0aa86bc2899bff0dd74abd4ef9d", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332401-332412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332401-332412.nc", + "79e3567e185d01022d8065ac21a831fd855a2d87e5997818c5a94a1308fe77c1", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333201-333212.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333201-333212.nc", + "2a1165e4842748295af8f62348c1e33bff433f3087f9a2b59f88070a1de21d80", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335101-335112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335101-335112.nc", + "6b927aa111b37aa2be3307d7ad65667453d317a0f48747abd0c7d82327e4a99f", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335401-335412.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335401-335412.nc", + "9b12e95614365967b2caef65539044382eeebbd1601a2b5d12de9f3248a84229", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336101-336112.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336101-336112.nc", + "bf706657eb75710df95e9d89ca6363ce293ee4263c54eb168aadd311d992035a", + ), + ( + "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337801-337812.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337801-337812.nc", + "dc91dc88d5637c1dae5a3b883bf9491658513b88d85658222d67a16ffb48e8e9", + ), + ], + }, + "FGOALS-f3-L": { + "lig127k": [ + ( + "tas_Amon_FGOALS-f3-L_lig127k_r1i1p1f1_gr_070001-119912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/CAS/FGOALS-f3-L/lig127k/r1i1p1f1/Amon/tas/gr/v20191025/tas_Amon_FGOALS-f3-L_lig127k_r1i1p1f1_gr_070001-119912.nc", + "714198c7c21fed3fe7d078c5a2c069707e325442e1b3a4ef6c5dab307def75e9", + ), + ], + "midHolocene": [ + ( + "tas_Amon_FGOALS-f3-L_midHolocene_r1i1p1f1_gr_072001-121912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-f3-L/midHolocene/r1i1p1f1/Amon/tas/gr/v20191025/tas_Amon_FGOALS-f3-L_midHolocene_r1i1p1f1_gr_072001-121912.nc", + "424d0fdc8df77bc7734a2d168429fa8bdbba00e963a7d05844e45f441f7ef273", + ), + ], + }, + "FGOALS-g3": { + "lig127k": [ + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_090001-090912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_090001-090912.nc", + "0e270bde4030b08dbda78087ddf46a7760d17dcd4eefdbf6b2e1b32281dc4be2", + ), + ( + "as_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_104001-104912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_104001-104912.nc", + "21698fb3c7c3f9e5930972f3df62231267f61bd746b30c8144d2afbbbe38edc5", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_115001-115912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_115001-115912.nc", + "58ee918529a2a54862b46921849c8d7051a7dc8b1e87d1224f489bfe6126344b", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_080001-080912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_080001-080912.nc", + "7cae976c33392eea2ab11fec9b6448ccf65214a2918257924b533949d4a512ec", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_093001-093912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_093001-093912.nc", + "fe382392442af0f1d5d5c968260f2d17e64d9f73eea280bbc836d9d37f2bba50", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_110001-110912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_110001-110912.nc", + "a6286f9484f9dfc8788d0e140a063fb8ff01384bb2f1a18bc27f77fd6ce4e8c5", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_117001-117912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_117001-117912.nc", + "5689f4b1ad0c60dc595577a705438947f8dd1b2d4852b2985c8db56ec494b37d", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_122001-122912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_122001-122912.nc", + "b64c511d2f5decd0b245795c5af50f1df2470f83b57bd9d4eacf4c39e766264f", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_094001-094912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_094001-094912.nc", + "b96dd6e9bc3075e2ae9e2822c650fede2f2a116ee23cdc131c79519e4e2f2ad4", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_119001-119912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_119001-119912.nc", + "b64fb5e36d9debe04c27003639f18054aa406cdcdf2df03d81e1863ee8415caa", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_097001-097912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_097001-097912.nc", + "f10475c50e49f89f5aa7eef508ffce41b4e8f50412d4409ecd584e0bfcb77bc2", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_101001-101912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_101001-101912.nc", + "0a5dc12f28bb8c20a35d3afe71ec5dbb32caaf91cd45f9baaab4b8f385882300", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_105001-105912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_105001-105912.nc", + "431da63d7e3e7aacd13f2aeebf7d49161490c099e3be34ee435ec419e4189e5a", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_120001-120912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_120001-120912.nc", + "bc35e521b22b11883968f36198bf5d8f08151dc8c90e01ef0af0f1d15200967a", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_075001-075912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_075001-075912.nc", + "d101b111f3a444c6bed0417d0e2b617b1ed38faf7547277680e51bc45e50020a", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_079001-079912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_079001-079912.nc", + "729b96faafdd940d514bf4c62b74cb8d12e292df438b63d7f1135fb6146230a9", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_088001-088912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_088001-088912.nc", + "0eeb51354d2ec8721d06b0bf89c6422d6c4938209548cd3c29a2490da78a7071", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_113001-113912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_113001-113912.nc", + "b55b073ae0ef1ad37b190d88d08be46214b29028f3cc62c1f1e543b6e7de453e", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_091001-091912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_091001-091912.nc", + "e73294f914d0cb89a5b9338c13d2a88c466806720d5a8a29e02a8c17af6e1936", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_116001-116912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_116001-116912.nc", + "ddd305c2fdcc00b2fe2b9c834be9e0509c97b1348e0c90e6cb488ddae1f48bcc", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_076001-076912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_076001-076912.nc", + "011342124995f2e623f72c080b5f2a354e90d8b3ce836511ea528727a248ac4d", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_092001-092912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_092001-092912.nc", + "65f8da6716237a2e1c56acfc49955865fbf4a9fbabc43fa6f9d571de2f03b44a", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_100001-100912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_100001-100912.nc", + "11e1d6065684bf2fd962f97d45dde7cc96e2c37dcf3234e600ecce52197d6469", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_103001-103912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_103001-103912.nc", + "07a71cf98995a2c2afdca0485699f86d02a13771e37ed0d22fe90dac08cb1e99", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_108001-108912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_108001-108912.nc", + "478a2ee39a6a6a4f22a84537b379960152854e2f5aa78384760e252edc784426", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_098001-098912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_098001-098912.nc", + "833d0eebd2803eee9d1e1a5578fe46349c5f1b359ad98bb3cb4ae5b2453d36a2", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_106001-106912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_106001-106912.nc", + "d19fac4d95be604b86c1f3e2dd98ab3a2dd514195a2845ec431ba69c754cc5db", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_111001-111912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_111001-111912.nc", + "9d7845917a647ace93afca2caa8c2f9d9ca85d3e1e4489b60ce83bf95aa850a5", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_083001-083912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_083001-083912.nc", + "61a0fff7d1db6a637e33c5510961d3b21ce06483e8408b14803e3d90ca70d007", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_099001-099912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_099001-099912.nc", + "295112ca84b919191a1ac0907711247e4aa5a9e86e0f8ea591c6a3aaa38d53a0", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_102001-102912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_102001-102912.nc", + "76d5d7d6fb5c6229220e56e33e177529f6540d20eb389d7729b9071e46da09e1", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_089001-089912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_089001-089912.nc", + "e76d0bb1bfb00675dacbf9d092a87ae59d41992b781b41d2b2ba47bbfc878a51", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_107001-107912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_107001-107912.nc", + "b13489a84c77a648400d399925c35cae55fdc8044e081edeb035f710939c7df8", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_114001-114912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_114001-114912.nc", + "f160aa61323a2b1c4927aad396c0ea90c3390b89f7a5bca26e011ebfb416acad", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_123001-123912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_123001-123912.nc", + "3cdea5815d00069d9ac7c42e933980b2b5540e4f12624469a2a4732dfae9b111", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_124001-124912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_124001-124912.nc", + "69eb2ebfb339b59dd5fa5c9cce53cf42d649403a804ddfde40a373274bad6144", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_109001-109912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_109001-109912.nc", + "5799dc1b24b444b47e0a40e67c7a80928ef8624f05d2b069325169cb78f36f10", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_112001-112912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_112001-112912.nc", + "cfdd186b14f97f8c9734d390871f8d09b04dc24528662c6cb25336514264758e", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_121001-121912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_121001-121912.nc", + "9f8c5e397f1411bc163750be46be5a66261996ad068cb7cd818a9e7fbbbf3e43", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_081001-081912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_081001-081912.nc", + "6051df39900c789dc022dfc0c11afc1abaebeddb62cebc5e176514e73bfbddc7", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_085001-085912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_085001-085912.nc", + "baf86d5a4e6c8fee5d7380889ce0571654586d007989d6fa753412827a01469d", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_077001-077912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_077001-077912.nc", + "b8bccec643a3ce749fbe9261513f7dbb69ff44b82f6a0a4dd1958c6af17ea068", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_078001-078912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_078001-078912.nc", + "c8b3a7f5003a701191358b8ad0d674cb13cadb24d6ad7a25777bd745e5e94d2b", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_087001-087912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_087001-087912.nc", + "c4ec8e2c50b247e421586d7fe94c51def840b7178c1799431959f576b9abdb36", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_096001-096912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_096001-096912.nc", + "c4b75a48e134e8b1c03d354dbc565005b67afb179daca38c617855acbb5b3c3f", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_086001-086912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_086001-086912.nc", + "375acb92f0e0b4ae876430171cbf9b7dede30983da79208ae7e9280de13c9802", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_095001-095912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_095001-095912.nc", + "ea274d36ddc16e67d274e54cf20fa339019dab237c8674aace478281c81bdea1", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_118001-118912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_118001-118912.nc", + "4c08a0a4912052a0a2b5f6c2fa73ebe68e837ead8349655401ad46a61e697d70", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_082001-082912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_082001-082912.nc", + "7beb4a87619cb2909c0563ccb459456c6cbc5ed21ae3649aedc086b60db422f7", + ), + ( + "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_084001-084912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_084001-084912.nc", + "bff522dd69a9c92eccd95909d4a1173f67afb43194ab92fbe4be97356a9c3385", + ), + ], + "midHolocene": [ + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_062701-063612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_062701-063612.nc", + "4fd29fe693d54759de22b822ee62cb8f15335ac806380134fe91feec966dc1fd", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_063701-064612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_063701-064612.nc", + "c42da9446bcce358bbfe8759f56f57a874f906065fed8d6b9016cc8ea8437c42", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_064701-065612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_064701-065612.nc", + "9b9f200e1cac95c38f1d5d030ef192cc3cb1c19b1b4cfd843378cd936c06f177", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_065701-066612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_065701-066612.nc", + "24befa3141e117496e15a167b71e33104b53bbc8f0dcf6c69db5c0604931c689", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_066701-067612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_066701-067612.nc", + "4b0bfcb8cce9b8a0445edc551d76f6c1ac2a2b15fa8b484589e977c2491fe1c7", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_067701-068612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_067701-068612.nc", + "6deb2ea0d27a0e671cbd2077005f562c1b2681330e7fe0b8adcf2efe70769548", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_068701-069612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_068701-069612.nc", + "2786f66429ac029e34264099076b429e27c3625f12acc44bcb3460bf65350722", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_069701-070612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_069701-070612.nc", + "6601193d52abeaa9f9ee2592bae2dc81e4261589c1cdf15fc116c32a8b4f692d", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_070701-071612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_070701-071612.nc", + "207207520f76ab4c3f95902125851732bad1fd1248f4e2c4717c2a78d8b60b5c", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_071701-072612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_071701-072612.nc", + "65fa1a557738ec2034cd0ddcefcdb86408a89869eed61f49aa4c3642ebedf4d7", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_072701-073612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_072701-073612.nc", + "3cbf08889a78ebcfe6d8b7f1bf1261db84a403d17fb9e8282a728e6123e6cbb0", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_073701-074612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_073701-074612.nc", + "e9639653f514b4b5171d34865ab169f44cca64d427e9c7f7e40e1c8696452a65", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_074701-075612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_074701-075612.nc", + "87ccf438e2d0e8cf8383aff2824df92778c547d881430f3304d094b18813058f", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_075701-076612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_075701-076612.nc", + "31b99e20ecf609585b3e3141444257cd3d9478c1d20ff7875eb14ad9e1cc906f", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_076701-077612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_076701-077612.nc", + "53ca91d7bc5adfcb62c1b5852fd3fb3c03d35df41a28015e76588e31c4406ce6", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_077701-078612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_077701-078612.nc", + "0bc959e13700f85bc863e84edbb30eb32118bf47f4810018e82b4ed2ba557edd", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_078701-079612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_078701-079612.nc", + "587ffc5d41d83813d4520c4b89c0d46f2699416ffbcf22f4e79987dd22a4ea1e", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_079701-080612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_079701-080612.nc", + "9667591a4d0aa007885dc140ee076a85ce22ac27fc299ba1815ea382fbd84baa", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_080701-081612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_080701-081612.nc", + "45436d7c1fdea4a172059696f4b6373c19aa119829167927335ef4ae8fb7b69a", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_081701-082612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_081701-082612.nc", + "d43e92450ace64f4859c3613f3fb213c1380f982dde6a8ac06256e0917f416d3", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_082701-083612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_082701-083612.nc", + "85fa224c3fef51392cb98e803e7cca997ae3050429639538e18ec284d6148681", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_083701-084612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_083701-084612.nc", + "9f88d813302df429954852239f64277a1794ba120f56c3185a5bbb2ed79b735c", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_084701-085612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_084701-085612.nc", + "db0ca85147f5df4ccebc61bb1d4a2c20a0c193ddb7a174d7b5df3bfa89328a1e", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_085701-086612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_085701-086612.nc", + "dc80cb8cc2e56cfd016ee30462f7796e45e2e0b97c60bdce990ea09fd57b47a1", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_086701-087612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_086701-087612.nc", + "2cb7786a2e1afbc7513aa20941e52a2932261378a7f4649ee1083c33be29f3ee", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_087701-088612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_087701-088612.nc", + "18558540a083acfb8c1caa18b3d06b4b1c05b32cf91d3e1e4fe0090876cb7bbb", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_088701-089612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_088701-089612.nc", + "1412ad8125acfb63e567bb18a43e1ba1b13aaa4aff9ba054d8ab08c2c28f424d", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_089701-090612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_089701-090612.nc", + "eed6c105610c9db287e48213c53e842a9837746c5a06228e89c6cb396c648603", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_090701-091612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_090701-091612.nc", + "a29d926e6d19112da34e93ae99c881b66c5696a59ce1ec9fa84a4ac1cda61182", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_091701-092612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_091701-092612.nc", + "24755f2fa0029fb3926d8ff8dafa8271491414594b6f16b773aeb9b86fd3245f", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_092701-093612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_092701-093612.nc", + "caa7448296d27fa10e33f92388080782dfccb0806fa48b7c4d488cf99f065714", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_093701-094612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_093701-094612.nc", + "cf4b5fb3203a59bccd6e2403d4a66f8124182ec5e006a3aeef2f31d5aa3ce739", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_094701-095612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_094701-095612.nc", + "a92ae7190148c4184dcdeb1b6d86b81cae82898b2e12b95601f5e5de1ad305aa", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_095701-096612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_095701-096612.nc", + "6d5e6a273c2776ed1f66a78ce53b1f05ab1c110a602f16d83bb5c5bed435fe11", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_096701-097612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_096701-097612.nc", + "8eb5f3b9957767d8eb32202aa488968d72903f78c99b7987ff3f683ff959efc5", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_097701-098612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_097701-098612.nc", + "6420b03b3859d7d8b8d7d2ad12dfd70fa05a34e26a5a700e905a998846d9c6e2", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_098701-099612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_098701-099612.nc", + "ee634e506f7520dd007231c4aaa0957e6f0b802b2adbeec7d886ec4930b03307", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_099701-100612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_099701-100612.nc", + "2fa4577a43e63363fafcc1cae6e5bf32d057935c9a3c5e25cf679792476757fb", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_100701-101612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_100701-101612.nc", + "8c9bcbc77c56af2ceff425a653b58a5ea33870d4acf3e297d1c2cb00a35d38e6", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_101701-102612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_101701-102612.nc", + "9ebf8fd5801f62996c5ce5e6f73dcc058563900e0346d8fe24d7fdc869dacded", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_102701-103612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_102701-103612.nc", + "48daaef94dfbe3e2577ffd8557a4d425e4bb71b012a6ee6096096fccc66b587d", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_103701-104612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_103701-104612.nc", + "a283d4708c1cf5ea95aa0495907b19ab2354e8d15c210ece791b1f3dfd75b165", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_104701-105612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_104701-105612.nc", + "a4aa27e433246a8c423e636228c38bdff49a9f5b12449974a91922ce1caf94a8", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_105701-106612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_105701-106612.nc", + "650423f62f7bfc840b0c27c983226900d646ef399696b477df0f792f934139d7", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_106701-107612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_106701-107612.nc", + "edb7a56654d6cb14d433125925bb4f7d314d3e5a08d68591e4baf6d692ffd43b", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_107701-108612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_107701-108612.nc", + "6fae5b1f3751f7f694523509ed2158356d4e722695f6dac2bf52899b5bbbae4f", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_108701-109612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_108701-109612.nc", + "65001c916cf357e0de5f8a8afffffaabeeed2102ac13b1f69599a6b4368159e8", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_109701-110612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_109701-110612.nc", + "bbf7ea61da5ac3733c427754214d2a2dd7f1b2ed8d24e77d71430ff1bed01af0", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_110701-111612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_110701-111612.nc", + "d67b5a665b988ae70d06850e27e5236b61523ae985d7edef17a7dc8a94d920b9", + ), + ( + "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_111701-112612.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_111701-112612.nc", + "1913b4708b53900f7b56a3c40cd091d06c3fa48b29304f8eb4383039a7131654", + ), + ], + }, + "GISS-E2-1-G": { + "lig127k": [ + ( + "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_295001-299912.nc", + "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_295001-299912.nc", + "a07551dc07730b797a387b2d6f73db3046b76776b12a62c3bceaed2b3d6a02f9", + ), + ( + "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_315001-319912.nc", + "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_315001-319912.nc", + "50fc220c4c8b30395a688eeb7313622a89b7f9d71dc795bc5022a85b5abcd034", + ), + ( + "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_290001-294912.nc", + "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_290001-294912.nc", + "e181091e8431eb9db8a1c97efb38ded2beb93f7cdb54f68ea79af6696918aea3", + ), + ( + "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_310001-314912.nc", + "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_310001-314912.nc", + "2e5494d23dd66ed54915c7e90c355c8afad5480f9c3ec20008b2f75102fe5407", + ), + ], + "midHolocene": [ + ( + "tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_290001-294912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midHolocene/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_290001-294912.nc", + "102338b8428997db72348de9ce7cb0cda99ba6db56bee182c331b35bab904a60", + ), + ( + "tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_295001-299912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midHolocene/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_295001-299912.nc", + "577f4dcd3ecc194ea568b3a16aab524c4998f0bfb74b552c4293bc35c83f40ca", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_310101-315012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190626/tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_310101-315012.nc", + "2d6667cfab220b22dcb739650d799a2786070681cdeb6c74d6e37b9753e42c37", + ), + ( + "tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_305101-310012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190626/tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_305101-310012.nc", + "367845352ae29104b6578658b456b5a1485b038dd572997bbe5638fae99bb50d", + ), + ], + }, + "HadGEM3-GC31-LL": { + "lig127k": [ + ( + "tas_Amon_HadGEM3-GC31-LL_lig127k_r1i1p1f1_gn_185001-204912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/lig127k/r1i1p1f1/Amon/tas/gn/v20210114/tas_Amon_HadGEM3-GC31-LL_lig127k_r1i1p1f1_gn_185001-204912.nc", + "406331de7f84f4b656cc73b0a47ced3ba142650f179674aa5795e6c34fc36138", + ), + ], + "midHolocene": [ + ( + "tas_Amon_HadGEM3-GC31-LL_midHolocene_r1i1p1f1_gn_225001-234912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midHolocene/r1i1p1f1/Amon/tas/gn/v20210111/tas_Amon_HadGEM3-GC31-LL_midHolocene_r1i1p1f1_gn_225001-234912.nc", + "cbdb344e8ffff205ffb56f79e8058ddb9c8f5c45612a4bec8f492c499885bae3", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_239401-243312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20201222/tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_239401-243312.nc", + "9e5068df9aeb99d84848f77fe3bcca39fa5620665de96bb7fe792b3621c6afbe", + ), + ( + "tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_233401-239312.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20201222/tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_233401-239312.nc", + "55950b87ce68a7f4973557cbcba2f07be2ab93bdf68a809bd6b4b4343934df54", + ), + ], + }, + "INM-CM4-8": { + "lgm": [ + ( + "tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_190001-199912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/INM/INM-CM4-8/lgm/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_190001-199912.nc", + "9f1d3904db25d350d0d21bd75a989f78d8c6f7a33a1d6189cd22e8fb3ef90716", + ), + ( + "tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_200001-209912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/INM/INM-CM4-8/lgm/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_200001-209912.nc", + "1c6131c17b8b1857f8cf6dbd55339708ed4a70c98740b1b35d9b11bf4d730529", + ), + ], + "lig127k": [ + ( + "tas_Amon_INM-CM4-8_lig127k_r1i1p1f1_gr1_190001-199912.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/INM/INM-CM4-8/lig127k/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lig127k_r1i1p1f1_gr1_190001-199912.nc", + "eed0fc06aac4d3ce5aa809523ea66b0c0f8008704b38aa866510fbc3420f7c8f", + ), + ], + "midHolocene": [ + ( + "tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_188001-197912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/INM/INM-CM4-8/midHolocene/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_188001-197912.nc", + "20bfc2903ff9abbd3067652ed99aa0d52d4b255138f4bf9a6605e7b48888810b", + ), + ( + "tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_198001-207912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/INM/INM-CM4-8/midHolocene/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_198001-207912.nc", + "5444242398a0cb4a5dbe0f87d284a3cebb09828f52d001fb3f94f054d7c04138", + ), + ], + }, + "IPSL-CM6A-LR": { + "lig127k": [ + ( + "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_195001-234812.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_195001-234812.nc", + "f979ee76cbedb20252c1412f70daa31f19ff4f0ff8572abd43250231d4d9dfb9", + ), + ( + "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_235001-239912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_235001-239912.nc", + "664a3d92554e39be17f534294dad2aa90319db36806441f8aaf482a5bf4ae472", + ), + ( + "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", + "b983aac14573d2a25deab2f611dbad4aebb406fe904500fdbee0def8e6624dcb", + ), + ( + "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_185001-194912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_185001-194912.nc", + "d9b7f7970dd1de6babe6100dde7765b66a289edfecc4f3d823f8d6e9713b0c10", + ), + ], + "midHolocene": [ + ( + "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_185001-204912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_185001-204912.nc", + "03e154f96f1b082184e0cdf8e2b9bde33edb5771eed68602c6c9b84b476d35ff", + ), + ( + "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_205001-234812.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_205001-234812.nc", + "ac3a88d376fbb08da70ed91e0aa80dd7ec8ccda2913541999f6b6b44c9cf966b", + ), + ( + "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", + "1596a2acd87c460ee39c309845d24d04a8fefe50f9527718132df9d5dcd33e8e", + ), + ( + "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_235001-239912.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_235001-239912.nc", + "bd38488ddb851772a4f58a20d96b0ee0897952e042166e741bae9a9cbcfd15b2", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_IPSL-CM6A-LR_midPliocene-eoi400_r1i1p1f1_gr_185001-204912.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20190118/tas_Amon_IPSL-CM6A-LR_midPliocene-eoi400_r1i1p1f1_gr_185001-204912.nc", + "6d894b8eac6e4a714e6e3452d7bc91a7209fb7a89c7d5bd22a09cfcb2831b48b", + ), + ], + }, + "MIROC-ES2L": { + "lgm": [ + ( + "tas_Amon_MIROC-ES2L_lgm_r1i1p1f2_gn_320001-329912.nc", + "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MIROC/MIROC-ES2L/lgm/r1i1p1f2/Amon/tas/gn/v20191002/tas_Amon_MIROC-ES2L_lgm_r1i1p1f2_gn_320001-329912.nc", + "52832665fa04026426de2c7c93b4fc1b738f8cd5a2edfda8519a6c7df942c118", + ), + ], + }, + "MPI-ESM1-2-LR": { + "lgm": [ + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_223001-224912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_223001-224912.nc", + "af5d2b47b44160ed5ccb0a7db8a81694456c7c321dbd8b719be56aafc490ac0a", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_203001-204912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_203001-204912.nc", + "06478b12ccaa7f4cf411c388612c1e6613becdab98c5ca55ec997926f49cb37e", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_219001-220912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_219001-220912.nc", + "46df9a60a6fccba119493a105eb89d269241f2f03e984c230f5204b3cd800984", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_233001-234912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_233001-234912.nc", + "7d72da6af20f47cf2d44250383c03ad4289776a43b52408d4bf82b1af64048cc", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_191001-192912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_191001-192912.nc", + "cb77dcb6fed865f3e72127eb66e3f924fd47307a5acf58e6ad9696570cc9902f", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_195001-196912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_195001-196912.nc", + "7201cf1112fd4955d6773debfd861a0655766b059ec583dea7f06d85a72ece99", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_227001-228912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_227001-228912.nc", + "2de0c1cf1aa88f55e2afc41535a299a6f85d9e0f5a6a49baf00d62f6ff35317c", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_207001-208912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_207001-208912.nc", + "2eb31836dc913c6c15bfb2db97f13e1c1635832d5e363d46e29b7a4e4212d9f5", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_213001-214912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_213001-214912.nc", + "6c63848ec32997a82e49323aa61182049552a9ad1b4e946d882a4180204bf77e", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_201001-202912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_201001-202912.nc", + "605114d0ba6c5c8dd611fc775cabb4f9ce236c9466defa8a19dfdf3de546f457", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_215001-216912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_215001-216912.nc", + "b6628c5f6febfc297e9ddda549fb926337d75d084f9ae294a3d73dc46433e3b3", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_193001-194912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_193001-194912.nc", + "c2c4d8ab5ed60d0acc6bfdd0e0de47b45e1bb1197bbc8affd38bb2e689903521", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_205001-206912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_205001-206912.nc", + "d3b9eb7b20b14fc16e62fc7e60adb83319bed5bda794e847ac8e8834b3546a87", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_189001-190912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_189001-190912.nc", + "a0fbdba0c2837e079158501ad2f68ce793fcc38ed04362e708c4ee2dfb45ed5a", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_187001-188912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_187001-188912.nc", + "be4efa16221c09137e82ea22ad3829769b6cce37ec7a8988509ac231219154e4", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_221001-222912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_221001-222912.nc", + "bb099587148b6cb98569abdf7616648f7e5d1de55a59914591e9172fe32b4bdf", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_229001-230912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_229001-230912.nc", + "ac2db21b7da4b6374dd7c7974741ec8b9f2b576892f80bcfdf20047afd3ed40f", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_199001-200912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_199001-200912.nc", + "3493470f0105d059b24ee7f2afbb3dd0ca9c1eb037a17f8c4c6d6b785066e51d", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_185001-186912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_185001-186912.nc", + "0b42b99bbef08c521b74b5d96003e7001cc7347b891319da65574f76cecd8f1b", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_211001-212912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_211001-212912.nc", + "40e9f246ab03721fb6865945be41b492dc047ce225841a51ce51475aa1b0d2a5", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_225001-226912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_225001-226912.nc", + "4d431145208c86e942b35a28f4b84b270b4899b2d6b54abc799aa1ae7a6737d4", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_231001-232912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_231001-232912.nc", + "1f67700673c4cfca73a6c6c442c65683aa1b82009f3eab5cbba510d95a4033c4", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_197001-198912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_197001-198912.nc", + "990f2c28bc486b699d19b13232a9dd7bc2f50c6f7f66e70b3df5fb38ad1824a2", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_209001-210912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_209001-210912.nc", + "235a0536897fca72cb4b682eeb54e4606fd66b79fed45e328e053bda77a3479f", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_217001-218912.nc", + "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_217001-218912.nc", + "710ef3b26960a0a7030faad907e3a45dc3caccc3504dae43f25c709b8101d7cf", + ), + ], + "midHolocene": [ + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_100101-102012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_100101-102012.nc", + "058612d852cd64df6dc18df7c6714eb33c607c8428304cbe5ab87a76ce8dd4af", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_102101-104012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_102101-104012.nc", + "eba6aec05dd309a0a1101df2ddf5f3087adf31a40bc2b0a55b65924e95be0f46", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_104101-106012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_104101-106012.nc", + "93ad3029c2e05c65cb36e3cd93ab4cb57ebca50144568cf7703ffaaebfb701e6", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_106101-108012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_106101-108012.nc", + "10f72ae88f0fc6ab48450960a938c3bbf6f8839a22c269aa23ca92bf2995cc73", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_108101-110012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_108101-110012.nc", + "489a91feff8fe353b5102a4a2fe044bab8abd02f16a2c6aa3522c5126e3ed7cb", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_110101-112012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_110101-112012.nc", + "52cebf9794ef3c8594c95badcb6c6183785a873c0c07158e798f927c0e29908c", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_112101-114012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_112101-114012.nc", + "1860d2e5749344eb9d78806f7d297d7702ca00e6326cee41c62c12fb6c14ff6c", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_114101-116012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_114101-116012.nc", + "09e4fc82a86bf8b47db46089ac979dae6b4663eb113ef67074d7bfabd9baf1ee", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_116101-118012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_116101-118012.nc", + "de1b1e0552fe116bd8232b970a16e389badb5f87539f8a1f1ea5662ea4f27f91", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_118101-120012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_118101-120012.nc", + "92a47aed6ce68c17f02a1867a03ac5b169299e7a517d5a50ed28f75b17ecf788", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_120101-122012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_120101-122012.nc", + "1157a7a792bdf459214f72d1a89666024c29b6ea1c1105df52422707e309ab17", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_122101-124012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_122101-124012.nc", + "ed852e49cf87af45c8cf7ae98ae4ea019014934e724b4515f3280f236b1fc328", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_124101-126012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_124101-126012.nc", + "5db6bb738349206a79060384555f537be9ba1189be5574ad9c20ba66f20fd868", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_126101-128012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_126101-128012.nc", + "4687007a5d995078ff94a137f63005c81150899f6cf118572efc4793fd3badf5", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_128101-130012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_128101-130012.nc", + "a42da2340da4a65698df7f9e362056898c94a9af41dd475ae221510df47ffa5b", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_130101-132012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_130101-132012.nc", + "11306c379182548d647b1af1b0345e59fcbd0b589a6f5001fc40a6d4dd5c50e3", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_132101-134012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_132101-134012.nc", + "d7968c47ab84f99ee6a1ded8963b29cc007172c50aa5513bbe916262a00b43e0", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_134101-136012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_134101-136012.nc", + "aab3741881721d56fe0ce9d2dd0081d9beaa0ca2dabc2472d614e77655d2f213", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_136101-138012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_136101-138012.nc", + "7ffd48adba83bbb1cead00d05f219f54d6e8724b949953c3e8e909951be84dc8", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_138101-140012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_138101-140012.nc", + "871f4e8bf8257d7aab85c2530d2166bb5fb005cb6146c84a31ca93ad76d1a145", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_140101-142012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_140101-142012.nc", + "c92294625b8bd395efbb6842a69d954041a8172181782377b45e559798a7a6d2", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_142101-144012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_142101-144012.nc", + "7fe257824fb98e125e73910eb4a7e289539183d2631dde59d8e2fafb91ffb6c7", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_144101-146012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_144101-146012.nc", + "83c419131470cfff783214cfbec93a9a13d510801f9bb396f4365a32ebc96c6c", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_146101-148012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_146101-148012.nc", + "4b0f98ad810f29723c115ea670a7dd2fd356164c5462d780df3547ac2bf34287", + ), + ( + "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_148101-150012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_148101-150012.nc", + "cbf40efdfb06984510b42a88d8a5ea668d078919b5db435c535ccaeb545acfa7", + ), + ], + }, + "MRI-ESM2-0": { + "midHolocene": [ + ( + "tas_Amon_MRI-ESM2-0_midHolocene_r1i1p1f1_gn_195101-215012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MRI/MRI-ESM2-0/midHolocene/r1i1p1f1/Amon/tas/gn/v20190919/tas_Amon_MRI-ESM2-0_midHolocene_r1i1p1f1_gn_195101-215012.nc", + "c641f080d52a0595f8bfe412dac00616e2acd59cc1d739f06988abc7425ff5a9", + ), + ], + }, + "NESM3": { + "lig127k": [ + ( + "tas_Amon_NESM3_lig127k_r1i1p1f1_gn_160001-169912.nc", + "http://esg.lasg.ac.cn/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NUIST/NESM3/lig127k/r1i1p1f1/Amon/tas/gn/v20190909/tas_Amon_NESM3_lig127k_r1i1p1f1_gn_160001-169912.nc", + "a79e92b36d83beb7de1387fbb26711b9872bfc90954e06b6a51ee1b8f9338586", + ), + ], + "midHolocene": [ + ( + "tas_Amon_NESM3_midHolocene_r1i1p1f1_gn_179801-189712.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NUIST/NESM3/midHolocene/r1i1p1f1/Amon/tas/gn/v20190813/tas_Amon_NESM3_midHolocene_r1i1p1f1_gn_179801-189712.nc", + "d9e3f2729829136051f943e5efe0b0d8b0ca610542ed27ddc2ca7c270eaffde6", + ), + ], + }, + "NorESM1-F": { + "lig127k": [ + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_154101-155012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_154101-155012.nc", + "77f5f6b112d0b137afbcc07620388bf523d45c06f7209c3eb2e33f2ebe4679cd", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_155101-156012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_155101-156012.nc", + "8ea5c7e662979f33787d31feb8f1ea7f5804504082abb59722dcbe93af608b86", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_156101-157012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_156101-157012.nc", + "2db41e376907f4e95d6d9d997ea22fdb050cff047d9a78c16c0f111a3900daa2", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_160101-161012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_160101-161012.nc", + "e4d32f22a2432e58fa0dbf618bcdd099d0a1999a01605c2b6ef69e81951abd7f", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_169101-170012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_169101-170012.nc", + "a65ca0079a289c35f18627dc823c0c630a7cd53d1427acb0e5bdcfbd5320f8cc", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_158101-159012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_158101-159012.nc", + "fc3e3104fcc008527ebafbdc7c6926672dab5b01bf22a7ae277d2b6938614770", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_157101-158012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_157101-158012.nc", + "651f40868d4c541b030e4c1ab72b43cd38a62dda742c66de43df2488e08d4655", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_159101-160012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_159101-160012.nc", + "7ac9d0655bc6a9dd4830fc0b5c93b44dadf095d5a0d62b5e5f3c8f5827c5a6de", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_163101-164012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_163101-164012.nc", + "716e9fa460790ecef97f760207b204afd83c15bf191787d8a81a1aa7546e34d4", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_165101-166012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_165101-166012.nc", + "0ddd4481da264dfb6e89a9639fab689fe68b11e1de958ab3a996c5921030086d", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_166101-167012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_166101-167012.nc", + "6c2dd03751ba30fb4f0831055c61ac4e8a3929c14ad22f19d3bf4260e9455aee", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_153101-154012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_153101-154012.nc", + "27eee2b4da71eb9a8bb3430116e528cf7b1cd522fefdfc952fc4d88842902db2", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_162101-163012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_162101-163012.nc", + "8a80fa63d1ef87e0598082445935a4e3f004b13e7ede4a59c8371312e18c0c66", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_167101-168012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_167101-168012.nc", + "63df21b15dc803ccc064e82df8c63f5a11de20b1ac95da64d6d7ea3833750ac7", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_151101-152012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_151101-152012.nc", + "1fa62ec334d8441a32062a54106bd3885d8b7d42aefd40b5c0614d0a2d90a467", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_152101-153012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_152101-153012.nc", + "099c2d94b78130d86a77e7e2e62cf15ee11cb0f7c46785af1a22c60b44c07dc7", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_150101-151012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_150101-151012.nc", + "31777c4194e86ab5639a23768b9a511bdfa18ebc9639558664f12e035ed76327", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_161101-162012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_161101-162012.nc", + "8b9d3c01c934da5f1017036516cce0c3bcdfdad147c27adb086a01a3cada95dc", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_164101-165012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_164101-165012.nc", + "f93c9fd3b0c223f04c09d5b32084a65d7430dda656b4e5343a8befad00890c86", + ), + ( + "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_168101-169012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_168101-169012.nc", + "a2a2edd6e9e859db4b1b4739db05028b22682ac3bae1001ff3c435f2a6fd4f9d", + ), + ], + "midHolocene": [ + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_150101-151012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_150101-151012.nc", + "31614cbe650d200291b4afdc898f8edd6f5f7fb75fbcd4ec481918603cd2bb73", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_151101-152012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_151101-152012.nc", + "65db10fa1ef3dbfb02032818c919dac0bd3022fecf0643b2ee9b4f62ec6fe27b", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_152101-153012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_152101-153012.nc", + "54570dab6598d095420e105553d3990c051b6c19f16f723a09f642c21db7a618", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_153101-154012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_153101-154012.nc", + "cc7407f53496553e88090bf456104a98b4d593b728f62b31e9ca5150fe18ba18", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_154101-155012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_154101-155012.nc", + "282bfcc9e0accd01a61f57a99fc2138c237536fbe2c19cf85d544b3912b581ed", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_155101-156012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_155101-156012.nc", + "c8910c20b34cbd2885520f8bbddb91651261e11b507084494f725037d1f1d0fb", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_156101-157012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_156101-157012.nc", + "b2df08ab191482042e80e3f07b90da159cc7c08ff77ff4cd36dc451eb9322388", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_157101-158012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_157101-158012.nc", + "c54533bc46c09f11cd45ad9091826461e25d8a1d374117118ce1983d03d9e9db", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_158101-159012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_158101-159012.nc", + "c3518096b5174fbf9bb006153233c5ed8d68be4a64ab46b0038577a597f322c6", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_159101-160012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_159101-160012.nc", + "16a2870dd2131f80076e0f753f6a3f87cb1ed1efb58cc0d4ee9e78a8f545af23", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_160101-161012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_160101-161012.nc", + "d8b8c39578194b988e9804490466bda3abc6539195e9387b5a412c9ad1131b6b", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_161101-162012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_161101-162012.nc", + "bdfd8486f649caaced7a30f7d876ce4a13ca010db3f15d25fc92ddfef59deed8", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_162101-163012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_162101-163012.nc", + "7a8fd6aadebe062b71170dfe36ddfc31ba1683203b7736d6cc5dff12313ec057", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_163101-164012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_163101-164012.nc", + "8235ad839a79fd3c7e35f114e481cb354e3ee0b87f304e531153a7b5bce05367", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_164101-165012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_164101-165012.nc", + "99c4121756418d4bae16f91102677deaea2a8ba3cd1172fa4676d21bfac9c7f1", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_165101-166012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_165101-166012.nc", + "61109533cdad1c33761c9c5b899f80e5c941e380cb26064d5d63283fcb2bd82d", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_166101-167012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_166101-167012.nc", + "ae9781449fb1e35cddad53ccba19aa8e3de58d344c0c7b2cf780044b39d4e361", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_167101-168012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_167101-168012.nc", + "768ba193c7a081697953ece773816a3b23e3954339f4f3493155e68cdb8a146d", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_168101-169012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_168101-169012.nc", + "d637554903860088537c725becf32cd78bc6e5cf2446005fc5363b4b7a3ab222", + ), + ( + "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_169101-170012.nc", + "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_169101-170012.nc", + "43cc513019a9db7861c940921cfa58d0f883aae91f148272d089d81a8e62f499", + ), + ], + "midPliocene-eoi400": [ + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_242101-243012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_242101-243012.nc", + "da191151a818a9e00ab948f7277c06afcce60c9731044ae7e8fc0e45b30d5bb7", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_231101-232012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_231101-232012.nc", + "2fa67ee816d215c7a6d870c1fdf030b8549ac6fbc71c143a03d8323a711fbd21", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_243101-244012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_243101-244012.nc", + "6816fe7eaf40f14c2ffa41af37dd18c72b733e550dda8c1135a0365c91522f9e", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_234101-235012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_234101-235012.nc", + "0dd0a840aaff57f530876cbfb4ced868e91e8b3732999be7c555a991b280f0f3", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_245101-246012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_245101-246012.nc", + "f4db34a8dbf985e31042e4d5bcadc6ff0f7e8df4d4e653fb815904297a754f54", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_232101-233012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_232101-233012.nc", + "d89b91a50a4baeaa741985aa87f778d947c40a310c4cd664490b9ba428763091", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_236101-237012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_236101-237012.nc", + "cd5977ad887bc4e3207c734d9d2bc1167ab4520225e3f2d8dacd2f6ea4f17108", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_240101-241012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_240101-241012.nc", + "d75d912e362817301bf1d484e88f52739d71a295a81fc2c209463d624a98a0bc", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_248101-249012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_248101-249012.nc", + "3b32fc1156b51e3a92fc66884b6059aa495d359acbfa38f8bf839cf5df83444c", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_235101-236012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_235101-236012.nc", + "242cee1b225b04138fe396da3898cb561bc0c0d46d02ae65eb6f960eab8dc2f1", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_238101-239012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_238101-239012.nc", + "02176e7cb937c61f9a135737053c20842c79a6725ff4a74a0eb91d7c94ce7817", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_241101-242012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_241101-242012.nc", + "72509f5b0193978df6279d8f7ad0744a6860245c4646f817314d80f3adecf1fa", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_246101-247012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_246101-247012.nc", + "3d7be1a874a52bf1e6a34dc116b4e022bdf165f4b7a9783988597a9cff34d728", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_239101-240012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_239101-240012.nc", + "b3bac58f54bfcf464d0cc5185e99db39fc7b1cb83ff30746d47cd2fe0559f5af", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_247101-248012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_247101-248012.nc", + "fb123ccf2cd324d8afe5919ca5a1c3f434480b1041270473ea986daa88659ecc", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_233101-234012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_233101-234012.nc", + "1b748905b2edc45a21a8ad9fb9ddae4684a0513327139e1a1fe58793d29444c3", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_249101-250012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_249101-250012.nc", + "9cc7f85e8a63e42f89d9778ba5d12c1cbff0290a7f7adbd34ea8250f7a287b55", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_237101-238012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_237101-238012.nc", + "208cba41538b587178e6cf54425370058ccfe16df2b2c8222af10e1fda86da11", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_244101-245012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_244101-245012.nc", + "b68830d6837d3474bdf8fc17b129fe9407e86e2b9f468c2d9455b639baf08520", + ), + ( + "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_230101-231012.nc", + "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_230101-231012.nc", + "1aa1b55867c2e0a370bf9d101efe8ad49ff9b662b46387129b0dd612aba5307f", + ), + ], + }, + "NorESM2-LM": { + "lig127k": [ + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_211101-212012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_211101-212012.nc", + "5f35e7d7b9abb66aaab9e8598b8ac910b20b9737313ed5fdd74d93d0299a281e", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_213101-214012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_213101-214012.nc", + "ca15107d32596ddb7ba8d59d5dd56580f687453e45fb6928ce853a449ce2610d", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_216101-217012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_216101-217012.nc", + "a1db790c42145daf48e5850bfe99649a98ce62f8ceb17b2e9b4fb068aabe8db2", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_219101-220012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_219101-220012.nc", + "08581eba518098a4749daed4228570810ce2eae136fec9641793a170dd1a2189", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_217101-218012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_217101-218012.nc", + "b61ffddbcc636e030b6a756412187da9c6e1e10c375c028b622c5484744f82ec", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_212101-213012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_212101-213012.nc", + "710e45827ed86cd36a293a685b7dc4176dea7b4a82ff4b18bb2d6b19da7b6974", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_210101-211012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_210101-211012.nc", + "278c60640402db1d65a481cc7029818356eefa54cd11d55db93fca6d5aac06b8", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_215101-216012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_215101-216012.nc", + "99869afb0fcc717d594b49fec9ce6747aad833f2f5b9af49230294346e103931", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_218101-219012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_218101-219012.nc", + "560dd87a42e4c86a4f28ea7734ef494da0408015c7c5b7958a1c109866c450e7", + ), + ( + "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_214101-215012.nc", + "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_214101-215012.nc", + "be5dbc7cea06ece2990917063c7f7483be455a5f866e1533c5d5e9035ca0b328", + ), + ], + "midHolocene": [ + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_210101-211012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_210101-211012.nc", + "ea41920beb357339a3b544740e44ed3a3b6d328308e8b21bd6d42b9199750f38", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_211101-212012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_211101-212012.nc", + "e522766186efd3c603eaeda814811e2996cbc71ae825d1d1a47f11f315d5962d", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_212101-213012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_212101-213012.nc", + "73887f1c72f74ac3744d5b77532e042fa77a2f0f1f1520c69ad205c864e18692", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_213101-214012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_213101-214012.nc", + "413eb12fa2c7a6c0dba7c0debb64bef62cf5d1e3865448815b2e2761b7d4b38b", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_214101-215012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_214101-215012.nc", + "d6d7cab7acd1cc2ed7a5621142b649242b05f0929d8ec32b70371970a95b4af0", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_215101-216012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_215101-216012.nc", + "6f9d26c2002f37030f52f83114329d47a40f3858253848ac1204099796c87adb", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_216101-217012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_216101-217012.nc", + "b9bedb69cf7f744d149c73f37b7ed8d060c4e322dbf7cb2e0514e0f71088f6a1", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_217101-218012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_217101-218012.nc", + "e7be813954761ab14503eeca93ba8833752aac6262b1b68a0857b24e9f59f778", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_218101-219012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_218101-219012.nc", + "bbe0272a18d11c249079ba5d55b8e94964bbdcced145ae8aa195d0e683c25854", + ), + ( + "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_219101-220012.nc", + "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_219101-220012.nc", + "8b597479de552826a486adae4d6b44e64ae3e60a268650b0fd1898d93e2c8a2f", + ), + ], + }, +} diff --git a/paleo_scripts/process_paleo.py b/paleo_scripts/process_paleo.py new file mode 100644 index 0000000..7c1f8f4 --- /dev/null +++ b/paleo_scripts/process_paleo.py @@ -0,0 +1,478 @@ +""" +Process raw paleoclimate data into a unified dataset. + +Reads from paleo_data_cache/raw/ and writes to paleo_data_cache/processed/. + +CMIP6 processing (--source cmip6): + Reads raw tas_Amon_*.nc files per model, computes time-mean annual and + monthly climatologies, writes: + paleo_data_cache/processed/{MODEL}/{period}_tas_annual.nc + paleo_data_cache/processed/{MODEL}/{period}_tas_monthly.nc + Then deletes the raw files (unless --skip-cleanup). + +Observations processing (--source observations): + Reads downloaded proxy/reanalysis files and produces unified CSVs/NetCDF: + paleo_data_cache/processed/observations/annual_mean_global_obs.csv + paleo_data_cache/processed/observations/annual_mean_zonal_obs.csv + paleo_data_cache/processed/observations/monthly_mean_zonal_obs.csv + paleo_data_cache/processed/observations/LGM_da.nc + +Run download_paleo.py first to populate paleo_data_cache/raw/. + +Usage: + python process_paleo.py --source all + python process_paleo.py --source cmip6 --period lgm + python process_paleo.py --source cmip6 --period all --skip-cleanup + python process_paleo.py --source observations +""" + +import argparse +import logging +import sys +from pathlib import Path +from typing import Optional + +import numpy as np +import pandas as pd +import xarray as xr + +from paleo_constants import PALEO_DOWNLOADS, PALEO_MODELS, PALEO_PERIODS + +RAW_DIR = Path(__file__).parent / "paleo_data_cache" / "raw" +PROCESSED_DIR = Path(__file__).parent / "paleo_data_cache" / "processed" + + +def setup_logging(log_level: str = "INFO", log_file: Optional[str] = None) -> None: + handlers = [logging.StreamHandler(sys.stdout)] + if log_file: + handlers.append(logging.FileHandler(log_file)) + logging.basicConfig( + level=getattr(logging, log_level.upper()), + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=handlers, + ) + + +# --------------------------------------------------------------------------- +# CMIP6 processing +# --------------------------------------------------------------------------- + + +def _load_netcdf(model_dir: Path) -> Optional[xr.Dataset]: + nc_files = sorted(model_dir.glob("tas_Amon_*.nc")) + if not nc_files: + logging.warning(f"No tas_Amon_*.nc files in {model_dir}") + return None + logging.info(f" Loading {len(nc_files)} file(s) from {model_dir.name}") + drop_vars = ["time_bnds", "lat_bnds", "lon_bnds", "height"] + try: + return xr.open_mfdataset(nc_files, chunks={}).drop_vars( + drop_vars, errors="ignore" + ) + except Exception: + try: + return xr.open_mfdataset(nc_files, use_cftime=True, chunks={}).drop_vars( + drop_vars, errors="ignore" + ) + except Exception as e: + logging.error(f" Failed to load {model_dir.name}: {e}") + return None + + +def _area_weights(ds: xr.Dataset) -> xr.DataArray: + w = np.cos(np.deg2rad(ds.lat)).expand_dims({"lon": ds.lon}) + w.name = "areacella" + return w + + +def _process_cmip6_model( + raw_dir: Path, processed_dir: Path, period: str, skip_cleanup: bool +) -> bool: + ds = _load_netcdf(raw_dir) + if ds is None: + return False + + processed_dir.mkdir(parents=True, exist_ok=True) + try: + weights = _area_weights(ds) + + xr.merge( + [ + ds.mean(dim="time"), + ds.std(dim="time").rename({"tas": "tas_std"}), + weights.to_dataset(name="weight"), + ] + ).to_netcdf(processed_dir / f"{period}_tas_annual.nc") + logging.info(f" Saved {period}_tas_annual.nc") + + xr.merge( + [ + ds.groupby("time.month").mean(), + ds.groupby("time.month").std().rename({"tas": "tas_std"}), + weights.to_dataset(name="weight"), + ] + ).to_netcdf(processed_dir / f"{period}_tas_monthly.nc") + logging.info(f" Saved {period}_tas_monthly.nc") + except Exception as e: + logging.error(f" Processing failed for {raw_dir.name}: {e}") + return False + finally: + ds.close() + + if not skip_cleanup: + for nc in raw_dir.glob("tas_Amon_*.nc"): + nc.unlink() + + return True + + +def process_cmip6(periods: list[str], skip_cleanup: bool) -> None: + for period in periods: + models = [m for m in PALEO_MODELS if period in PALEO_DOWNLOADS.get(m, {})] + logging.info( + f"\n{'='*60}\n CMIP6 period: {period} ({len(models)} models)\n{'='*60}" + ) + ok = failed = 0 + for model in models: + raw_dir = RAW_DIR / model + if not raw_dir.exists(): + logging.warning(f" {raw_dir} not found — run download_paleo.py first") + failed += 1 + continue + logging.info(f" Processing {model}") + if _process_cmip6_model( + raw_dir, PROCESSED_DIR / model, period, skip_cleanup + ): + ok += 1 + else: + failed += 1 + logging.info(f" {period}: {ok} succeeded, {failed} failed") + + +# --------------------------------------------------------------------------- +# Observations processing +# --------------------------------------------------------------------------- + + +def _parse_holocene(hol_ds: xr.Dataset, var: str) -> xr.Dataset: + latband = xr.Dataset( + { + "tas": (["lat_bnd", "age", "ens"], hol_ds[f"{var}_latbands"].data), + "lat_bnd_weights": (["lat_bnd"], hol_ds.latband_weights.data), + }, + coords={ + "lat_bnd": hol_ds["latband_ranges"].data, + "age": hol_ds.age.data, + "ens": np.arange(500), + }, + ) + global_ = xr.Dataset( + { + "tas": ( + ["lat_bnd", "age", "ens"], + hol_ds[f"{var}_globalmean"] + .expand_dims({"lat_bnds": ["90S_to_90N"]}) + .data, + ), + "lat_bnd_weights": (["lat_bnd"], [1]), + }, + coords={ + "lat_bnd": ["90S_to_90N"], + "age": hol_ds.age.data, + "ens": np.arange(500), + }, + ) + combined = xr.concat([latband, global_], dim="lat_bnd") + midH = combined.sel(age=slice(4000, 8000)).mean(dim="age") + return xr.merge( + [midH.mean(dim="ens"), midH["tas"].std(dim="ens").to_dataset(name="tas_std")] + ) + + +def process_observations() -> None: + obs_raw = RAW_DIR / "observations" + obs_proc = PROCESSED_DIR / "observations" + obs_proc.mkdir(parents=True, exist_ok=True) + + # --- Mid Holocene (Temp12k) --- + logging.info("Processing Mid Holocene (Temp12k)") + hol_ds = xr.open_dataset(obs_raw / "temp12k_alldata.nc").load() + midH_scc = _parse_holocene(hol_ds, "scc") + + # --- Last Interglacial (Capron et al. 2021) --- + logging.info("Processing Last Interglacial (lig127k)") + lig_df = pd.concat( + [ + pd.read_excel( + obs_raw + / "lig127k" + / "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", + skiprows=2, + ), + pd.read_excel( + obs_raw + / "lig127k" + / "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", + skiprows=2, + ), + pd.read_excel( + obs_raw + / "lig127k" + / "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", + skiprows=2, + ), + ] + ) + lig_df["SD"] = lig_df["Anom+1SD"] - lig_df["Anom"] + lig_ds = ( + lig_df[["Latitude", "Longitude", "Anom", "SD"]] + .groupby(["Latitude", "Longitude"]) + .mean() + .to_xarray() + .rename({"Latitude": "lat", "Longitude": "lon", "Anom": "tas", "SD": "tas_std"}) + ) + lig_weights = np.cos(np.deg2rad(lig_ds.lat)).expand_dims({"lon": lig_ds.lon}) + lig_zmean = lig_ds.weighted(lig_weights).mean() + + # --- Last Glacial Maximum (lgmDA) --- + logging.info("Processing Last Glacial Maximum (lgmDA)") + lgm_raw = xr.open_dataset(obs_raw / "lgmDA_lgm_ATM_monthly_climo.nc") + pi_raw = xr.open_dataset(obs_raw / "lgmDA_hol_ATM_monthly_climo.nc") + lgm_combined = xr.Dataset( + { + "lgm_tas": (["month", "lat", "lon"], lgm_raw.tas.data), + "pi_tas": (["month", "lat", "lon"], pi_raw.tas.data), + "lgm_tas_std": (["month", "lat", "lon"], lgm_raw.tas_std.data), + "pi_tas_std": (["month", "lat", "lon"], pi_raw.tas_std.data), + }, + coords={ + "month": np.arange(1, 13), + "lon": lgm_raw.lon.data, + "lat": lgm_raw.lat.data, + }, + ) + lgm_combined.to_netcdf(obs_proc / "LGM_da.nc") + logging.info("Saved LGM_da.nc") + + lgm_ds = (lgm_combined["lgm_tas"] - lgm_combined["pi_tas"]).to_dataset(name="tas") + lgm_ds["tas_std"] = lgm_combined["lgm_tas_std"] + lgm_annual = lgm_ds.mean(dim="month") + lgm_weights = np.cos(np.deg2rad(lgm_annual.lat)).expand_dims( + {"lon": lgm_annual.lon} + ) + + # --- Global mean annual CSV (all periods) --- + logging.info("Building annual_mean_global_obs.csv") + paleo_avgs = pd.read_csv(obs_raw / "Figure7_19_obs.csv", skiprows=2) + midH_global = midH_scc.sel(lat_bnd="90S_to_90N") + midH_mean, midH_std = float(midH_global["tas"].values), float( + midH_global["tas_std"].values + ) + lig_mean, lig_std = float(lig_zmean["tas"].values), float( + lig_zmean["tas_std"].values + ) + + paleo_avgs = pd.concat( + [ + paleo_avgs, + pd.DataFrame( + { + "Time Period": ["midHolocene"], + "min temperature [degreesC]": [midH_mean - midH_std], + "mean temperature [degreesC]": [midH_mean], + "max temperature [degreesC]": [midH_mean + midH_std], + } + ), + pd.DataFrame( + { + "Time Period": ["lig127k"], + "min temperature [degreesC]": [lig_mean - lig_std], + "mean temperature [degreesC]": [lig_mean], + "max temperature [degreesC]": [lig_mean + lig_std], + } + ), + ] + ) + paleo_avgs["error [degreesC]"] = ( + paleo_avgs["max temperature [degreesC]"] + - paleo_avgs["mean temperature [degreesC]"] + ) + paleo_avgs = paleo_avgs[ + ~paleo_avgs["Time Period"].isin(["Historical", "post 1975"]) + ] + paleo_avgs["period_idx"] = [3, 1, 0, 4, 2] + paleo_avgs = paleo_avgs.sort_values("period_idx") + paleo_avgs["period"] = [ + "eocene", + "midPliocene-eoi400", + "lig127k", + "lgm", + "midHolocene", + ] + ( + paleo_avgs.rename( + columns={ + "mean temperature [degreesC]": "tas_anom", + "error [degreesC]": "error", + } + )[["tas_anom", "error", "period", "period_idx"]].to_csv( + obs_proc / "annual_mean_global_obs.csv" + ) + ) + logging.info("Saved annual_mean_global_obs.csv") + + # --- Zonal mean annual CSV --- + logging.info("Building annual_mean_zonal_obs.csv") + regions = { + "global": [-90, 90], + "northern_hemisphere": [0, 90], + "tropics": [-30, 30], + "southern_hemisphere": [-90, 0], + } + regions_midH = { + "global": ["90S_to_90N"], + "northern_hemisphere": ["0N_to_30N", "30N_to_60N", "60N_to_90N"], + "tropics": ["30S_to_0S", "0N_to_30N"], + "southern_hemisphere": ["30S_to_0S", "60S_to_30S", "90S_to_60S"], + } + rows = [] + for region, (lat_min, lat_max) in regions.items(): + lig_sl = lig_ds.sel(lat=slice(lat_min, lat_max)) + lig_w = lig_weights.sel(lat=slice(lat_min, lat_max)) + lgm_sl = lgm_annual.sel(lat=slice(lat_min, lat_max)) + lgm_w = lgm_weights.sel(lat=slice(lat_min, lat_max)) + midH_sl = midH_scc.sel(lat_bnd=regions_midH[region]) + + for period, tas, err in [ + ( + "lig127k", + float( + lig_sl["tas"] + .weighted(lig_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .values + ), + float( + lig_sl["tas_std"] + .weighted(lig_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .values + ), + ), + ( + "lgm", + float( + lgm_sl["tas"] + .weighted(lgm_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .values + ), + float( + lgm_sl["tas_std"] + .weighted(lgm_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .values + ), + ), + ( + "midHolocene", + float( + midH_sl["tas"] + .weighted(midH_sl["lat_bnd_weights"].fillna(0)) + .mean(dim=["lat_bnd"]) + .values + ), + float( + midH_sl["tas_std"] + .weighted(midH_sl["lat_bnd_weights"].fillna(0)) + .mean(dim=["lat_bnd"]) + .values + ), + ), + ]: + rows.append( + {"period": period, "region": region, "tas_anom": tas, "error": err} + ) + + pd.DataFrame(rows).to_csv(obs_proc / "annual_mean_zonal_obs.csv", index=False) + logging.info("Saved annual_mean_zonal_obs.csv") + + # --- Monthly zonal CSV (LGM only — only dataset with monthly resolution) --- + logging.info("Building monthly_mean_zonal_obs.csv") + rows = [] + for region, (lat_min, lat_max) in regions.items(): + lgm_sl = lgm_ds.sel(lat=slice(lat_min, lat_max)) + lgm_w = lgm_weights.sel(lat=slice(lat_min, lat_max)) + tas_df = ( + lgm_sl["tas"] + .weighted(lgm_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .to_dataframe() + .reset_index() + ) + std_df = ( + lgm_sl["tas_std"] + .weighted(lgm_w.fillna(0)) + .mean(dim=["lat", "lon"]) + .to_dataframe() + .reset_index() + ) + df = pd.merge(tas_df, std_df, on="month").rename( + columns={"tas": "tas_anom", "tas_std": "error"} + ) + df["region"] = region + df["period"] = "lgm" + rows.append(df) + pd.concat(rows).to_csv(obs_proc / "monthly_mean_zonal_obs.csv", index=False) + logging.info("Saved monthly_mean_zonal_obs.csv") + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Process raw paleoclimate data into a unified dataset.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + parser.add_argument( + "--source", + choices=["cmip6", "observations", "all"], + required=True, + help="Which data to process", + ) + parser.add_argument( + "--period", + default="all", + help="CMIP6 period or 'all' (only used with --source cmip6/all)", + ) + parser.add_argument( + "--skip-cleanup", + action="store_true", + help="Keep raw tas_Amon_*.nc files after CMIP6 processing", + ) + parser.add_argument( + "--log-level", choices=["DEBUG", "INFO", "WARNING", "ERROR"], default="INFO" + ) + parser.add_argument("--log-file", type=str) + args = parser.parse_args() + + setup_logging(args.log_level, args.log_file) + + if args.source in ("cmip6", "all"): + periods = PALEO_PERIODS if args.period == "all" else [args.period] + invalid = [p for p in periods if p not in PALEO_PERIODS] + if invalid: + parser.error(f"Unknown period(s): {invalid}") + process_cmip6(periods, args.skip_cleanup) + + if args.source in ("observations", "all"): + logging.info(f"\n{'='*60}\n Observations\n{'='*60}") + process_observations() + + +if __name__ == "__main__": + main() From 2644a8ef17d7e6ca0255fbe17afcaa3ab8ce77be Mon Sep 17 00:00:00 2001 From: Willa Tobin Date: Thu, 30 Apr 2026 17:50:28 -0700 Subject: [PATCH 2/5] paleo data evaluation codes --- .gitignore | 4 + CLAUDE.md | 24 +- paleo_scripts/download_paleo.py | 252 +++++++++- paleo_scripts/paleo_benchmark.py | 789 +++++++++++++++++++++++++++++++ paleo_scripts/process_paleo.py | 348 +++++++++++--- 5 files changed, 1337 insertions(+), 80 deletions(-) create mode 100644 .gitignore create mode 100644 paleo_scripts/paleo_benchmark.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..414159e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +observations +results +scratch.ipynb +paleo_data_cache \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index 8c09af4..e3ea21b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -90,10 +90,30 @@ chmod +x run_benchmark.sh **Paleoclimate data download:** ```bash -cd paleo_scrips/paleo_data_cache -python paleo_data_cache.py --paleo-period lgm --data-cache-dir path/to/paleo_scrips/paleo_data_cache +cd paleo_scripts +python download_paleo.py --source observations +python download_paleo.py --source cmip6 --model AWI-ESM-1-1-LR --period lgm +python download_paleo.py --source cmip6 --model all --period all ``` +**Paleoclimate data processing:** +```bash +cd paleo_scripts +python process_paleo.py --source observations +python process_paleo.py --source cmip6 --period lgm +``` + +**Paleoclimate benchmark (spatial RMSE/MAE/CRPS):** +```bash +cd paleo_scripts +python paleo_benchmark.py --model AWI-ESM-1-1-LR --period lgm +python paleo_benchmark.py --model all --period all +python paleo_benchmark.py --model MIROC-ES2L --period lgm --use-picontrol +``` + +PI reference for anomaly computation: lgmDA Holocene (default) or model piControl (`--use-picontrol`). +Precipitation benchmarks (Bartlein MAP, Scussolini LIG) require `--use-picontrol` and processed `pr` data. + ## Architecture ### Data Flow diff --git a/paleo_scripts/download_paleo.py b/paleo_scripts/download_paleo.py index c7464fa..3caf3c6 100644 --- a/paleo_scripts/download_paleo.py +++ b/paleo_scripts/download_paleo.py @@ -20,29 +20,61 @@ import argparse import hashlib import logging +import shutil import subprocess import sys import urllib.error import urllib.request from pathlib import Path +import pandas as pd + from paleo_constants import PALEO_DOWNLOADS, PALEO_MODELS, PALEO_PERIODS RAW_DIR = Path(__file__).parent / "paleo_data_cache" / "raw" +PANGEO_CATALOG_URL = "https://storage.googleapis.com/cmip6/pangeo-cmip6.csv" +PANGEO_CATALOG_PATH = Path(__file__).parent / "paleo_data_cache" / "pangeo-cmip6.csv" OBS_DOWNLOADS = { "Figure7_19_obs.csv": "https://dap.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118/Figure7_19_obs.csv", "lgmDA_lgm_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.1/lgmDA_lgm_ATM_monthly_climo.nc", "lgmDA_hol_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.0/lgmDA_hol_ATM_monthly_climo.nc", "temp12k_alldata.nc": "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/kaufman2020/temp12k_alldata.nc", + "bartlein2011_pollen_climate_recon.zip": "https://static-content.springer.com/esm/art%3A10.1007%2Fs00382-010-0904-1/MediaObjects/382_2010_904_MOESM2_ESM.zip", + "THansenMethod.csv": "https://raw.githubusercontent.com/jesstierney/PastClimates/master/THansenMethod.csv", } +TEMP12K_V1_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/climate12k/temperature/version1.0.0/" +TEMP12K_V1_FILES = [ + "Temp12k_v1_0_0.pkl", + "Temp12k_v1_essential_metadata_NOAA.csv", + "Temp12k_v1_record_list_NOAA.csv", +] +OSMAN2021_BASE_URL = ( + "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/osman2021/" +) +OSMAN2021_FILES = [ + "LGMR_GMST_climo.nc", + "LGMR_GMST_ens.nc", + "LGMR_SAT_climo.nc", + "LGMR_SST_climo.nc", +] +SISAL_V3_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/speleothem/SISAL-v3/" +SISAL_V3_FILES = [ + "sisalv3_database_mysql_csv.zip", + "sisalv3_codes.zip", +] LIG127K_ZIP_URL = ( "https://cp.copernicus.org/articles/17/63/2021/cp-17-63-2021-supplement.zip" ) +# Otto-Bliesner et al. (2021), Clim. Past 17, 63–88, doi:10.5194/cp-17-63-2021 +# Tables S2–S4: annual temperature anomalies by latitude band +# Tables S5–S6: JJA temperature anomalies for NH oceans and terrestrial sites LIG127K_TABLES = [ "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", + "Table S5. JJA - NH Oceans (40-90N) JJA_CP-2019-174.xlsx", + "Table S6. JJA - NH terrestrial (40-90N) JJA__CP-2019-174.xlsx", ] @@ -68,6 +100,82 @@ def _wget_simple(url: str, dest: Path) -> None: subprocess.run(["wget", "-q", "-O", str(dest), url], check=True) +# --------------------------------------------------------------------------- +# Pangeo / GCS helpers +# --------------------------------------------------------------------------- + + +def _get_pangeo_catalog() -> pd.DataFrame | None: + """Return the Pangeo CMIP6 catalog, downloading it once if needed.""" + if not PANGEO_CATALOG_PATH.exists(): + PANGEO_CATALOG_PATH.parent.mkdir(parents=True, exist_ok=True) + logging.info(" Downloading Pangeo CMIP6 catalog...") + try: + urllib.request.urlretrieve(PANGEO_CATALOG_URL, PANGEO_CATALOG_PATH) + except Exception as e: + logging.warning(f" Could not fetch Pangeo catalog: {e}") + return None + return pd.read_csv(PANGEO_CATALOG_PATH) + + +def _download_cmip6_from_gcs( + model: str, period: str, dest_dir: Path, catalog: pd.DataFrame +) -> bool: + """Fallback: stream PMIP tas from the Pangeo GCS Zarr store into a single NetCDF. + + Returns True if a file was written or already existed, False on failure. + The output file is named tas_Amon_{model}_{period}_{member}_{grid}_full.nc + so that process_paleo.py's glob("tas_Amon_*.nc") picks it up correctly. + If the GCS download succeeds, any partial ESGF .nc files for this + model/period are removed to prevent duplicate time ranges during load. + """ + sub = catalog[ + (catalog["source_id"] == model) + & (catalog["experiment_id"] == period) + & (catalog["variable_id"] == "tas") + & (catalog["table_id"] == "Amon") + ] + if sub.empty: + return False + + row = sub.sort_values("version", ascending=False).iloc[0] + zstore = row["zstore"] + member = row.get("member_id", "r1i1p1f1") + grid = row.get("grid_label", "gn") + out_name = f"tas_Amon_{model}_{period}_{member}_{grid}_full.nc" + out_path = dest_dir / out_name + + if out_path.exists(): + logging.info(f" [skip] {out_name} (GCS full file)") + return True + + try: + import gcsfs + import xarray as xr + + fs = gcsfs.GCSFileSystem(token="anon") + store = fs.get_mapper(zstore) + logging.info(f" [gcs] Streaming {model}/{period} from Pangeo → {out_name}") + ds = xr.open_zarr(store, consolidated=True) + dest_dir.mkdir(parents=True, exist_ok=True) + ds[["tas"]].to_netcdf(out_path) + logging.info(f" [gcs] Saved {out_name}") + + # Remove any partial ESGF files to avoid mixing time ranges on load + removed = 0 + for esgf_nc in dest_dir.glob(f"tas_Amon_{model}_{period}_*.nc"): + if esgf_nc != out_path: + esgf_nc.unlink() + removed += 1 + if removed: + logging.info(f" [gcs] Removed {removed} partial ESGF file(s)") + + return True + except Exception as e: + logging.error(f" [gcs] Failed for {model}/{period}: {e}") + return False + + # --------------------------------------------------------------------------- # CMIP6 # --------------------------------------------------------------------------- @@ -113,7 +221,9 @@ def _download_cmip6_file( def download_cmip6(models: list[str], periods: list[str], dry_run: bool) -> bool: - ran = skipped = failed = 0 + catalog = _get_pangeo_catalog() + ran = skipped = gcs_ok = esgf_failed = 0 + for model in models: for period in periods: entries = PALEO_DOWNLOADS.get(model, {}).get(period) @@ -121,20 +231,64 @@ def download_cmip6(models: list[str], periods: list[str], dry_run: bool) -> bool logging.debug(f"No CMIP6 data for {model}/{period}, skipping") skipped += 1 continue + + dest_dir = RAW_DIR / model + + # If a GCS full file already exists, nothing more to do + if list(dest_dir.glob(f"tas_Amon_{model}_{period}_*_full.nc")): + logging.info( + f"\n{'='*60}\n CMIP6 {model} / {period} [skip — GCS file present]\n{'='*60}" + ) + ran += 1 + continue + logging.info( - f"\n{'='*60}\n CMIP6 {model} / {period} ({len(entries)} files)\n{'='*60}" + f"\n{'='*60}\n CMIP6 {model} / {period} ({len(entries)} ESGF files)\n{'='*60}" ) - dest_dir = RAW_DIR / model + + # Attempt ESGF downloads + failures = [] for filename, url, checksum in entries: if not _download_cmip6_file( url, dest_dir / filename, checksum, dry_run ): - failed += 1 + failures.append(filename) + + if failures and not dry_run: + logging.warning( + f" {len(failures)}/{len(entries)} ESGF file(s) failed — " + "trying Pangeo GCS fallback" + ) + if catalog is not None and _download_cmip6_from_gcs( + model, period, dest_dir, catalog + ): + gcs_ok += 1 + else: + esgf_failed += len(failures) + if ( + catalog is None + or catalog[ + (catalog["source_id"] == model) + & (catalog["experiment_id"] == period) + & (catalog["variable_id"] == "tas") + ].empty + ): + logging.error( + f" {model}/{period} is not in the Pangeo GCS catalog.\n" + " To download manually:\n" + " 1. Visit https://esgf-node.llnl.gov/search/cmip6/\n" + " 2. Filter: activity=PMIP, source_id, experiment_id, variable=tas\n" + " 3. Download files and place them in:\n" + f" {dest_dir}/" + ) + ran += 1 + logging.info( - f"CMIP6: {ran} combination(s), {skipped} skipped, {failed} file error(s)." + f"CMIP6: {ran} combination(s), {skipped} skipped, " + f"{gcs_ok} via GCS fallback, {esgf_failed} file error(s)." ) - return failed == 0 + return esgf_failed == 0 # --------------------------------------------------------------------------- @@ -152,14 +306,63 @@ def download_observations(dry_run: bool) -> bool: ) return True + osman_dir = obs_dir / "osman2021" + temp12k_dir = obs_dir / "climate12k" + sisal_dir = obs_dir / "sisal_v3" + obs_dir.mkdir(parents=True, exist_ok=True) lig_dir.mkdir(exist_ok=True) + osman_dir.mkdir(exist_ok=True) + temp12k_dir.mkdir(exist_ok=True) + sisal_dir.mkdir(exist_ok=True) for filename, url in OBS_DOWNLOADS.items(): _wget_simple(url, obs_dir / filename) - # LIG127k — zip containing Excel tables - if all((lig_dir / t).exists() for t in LIG127K_TABLES): + # Scussolini et al. 2019 — Science.org blocks automated downloads. + # wget produces a 0-byte file; the real download lands as the original + # Science.org filename (aax7047_external_database_s1.xlsx) when done via + # a browser. Rename it to the canonical name if found. + scussolini_dest = obs_dir / "scussolini2019_lig_precip_proxy.xlsx" + scussolini_orig = obs_dir / "aax7047_external_database_s1.xlsx" + if scussolini_dest.exists() and scussolini_dest.stat().st_size > 0: + logging.info(f" [skip] {scussolini_dest.name}") + elif scussolini_orig.exists() and scussolini_orig.stat().st_size > 0: + if scussolini_dest.exists(): + scussolini_dest.unlink() # remove 0-byte placeholder + scussolini_orig.rename(scussolini_dest) + logging.info( + " Renamed aax7047_external_database_s1.xlsx → scussolini2019_lig_precip_proxy.xlsx" + ) + else: + logging.warning( + "\n" + " ACTION REQUIRED: scussolini2019_lig_precip_proxy.xlsx must be downloaded manually.\n" + " Science.org blocks automated downloads for this file.\n" + "\n" + " 1. Copy and paste this URL into your browser:\n" + " https://www.science.org/doi/suppl/10.1126/sciadv.aax7047/suppl_file/aax7047_external_database_s1.xlsx\n" + " 2. Save the file (it will download as aax7047_external_database_s1.xlsx).\n" + " 3. Move it to:\n" + f" {scussolini_dest}\n" + ) + + # Kaufman et al. 2020 Temp12k v1.0.0 full database (NCEI study 27330) + for filename in TEMP12K_V1_FILES: + _wget_simple(TEMP12K_V1_BASE_URL + filename, temp12k_dir / filename) + + # Osman et al. 2021 Last Glacial Maximum Reanalysis (LGMR) + for filename in OSMAN2021_FILES: + _wget_simple(OSMAN2021_BASE_URL + filename, osman_dir / filename) + + # SISAL v3 — Speleothem Isotopes Synthesis and Analysis database + for filename in SISAL_V3_FILES: + _wget_simple(SISAL_V3_BASE_URL + filename, sisal_dir / filename) + + # LIG127k — Otto-Bliesner et al. (2021), Clim. Past 17, 63–88 + # Zip contains Tables S2–S6; extract any that are not already in lig_dir. + missing_tables = [t for t in LIG127K_TABLES if not (lig_dir / t).exists()] + if not missing_tables: logging.info(" [skip] lig127k tables already exist") else: zip_dest = obs_dir / "cp-17-63-2021-supplement.zip" @@ -167,19 +370,22 @@ def download_observations(dry_run: bool) -> bool: extract_dir = obs_dir / "SI_CP-2019-174_20210105" try: subprocess.run( - ["unzip", "-q", str(zip_dest), "-d", str(obs_dir)], timeout=30 + ["unzip", "-q", "-o", str(zip_dest), "-d", str(obs_dir)], timeout=30 ) except subprocess.TimeoutExpired: pass for table in LIG127K_TABLES: src = extract_dir / table - if src.exists(): - src.rename(lig_dir / table) - for f in extract_dir.iterdir(): - f.unlink() - extract_dir.rmdir() + dest = lig_dir / table + if src.exists() and not dest.exists(): + src.rename(dest) + # Clean up extracted directory and zip + shutil.rmtree(extract_dir, ignore_errors=True) zip_dest.unlink(missing_ok=True) (obs_dir / "cp-17-63-2021-supplement-title-page.pdf").unlink(missing_ok=True) + # Remove macOS resource-fork junk left by unzip + macos_junk = obs_dir / "__MACOSX" + shutil.rmtree(macos_junk, ignore_errors=True) return True @@ -201,12 +407,30 @@ def list_available() -> None: print("\nObservational datasets:") print(" IPCC AR6 Fig 7.19 CSV (Eocene, Pliocene global mean)") print(" Capron et al. 2021 (xlsx tables) (Last Interglacial proxy anomalies)") + print( + " Scussolini et al. 2019 (xlsx) (Last Interglacial boreal precipitation proxy database)" + ) + print( + " Bartlein et al. 2011 (zip) (Pollen-based temperature/precip reconstructions at 6 ka and 21 ka)" + ) + print( + " Tierney THansenMethod.csv (Hansen-method deep-time temperature reconstruction)" + ) print( " lgmDA v2.1 Tierney et al. (Last Glacial Maximum data assimilation)" ) print( " Temp12k Kaufman et al. 2020 (Mid Holocene temperature reconstruction)" ) + print( + " Temp12k v1.0.0 Kaufman et al. 2020 (Full proxy database: pkl + metadata CSVs, NCEI study 27330)" + ) + print( + " Osman et al. 2021 LGMR (Last Glacial Maximum Reanalysis: GMST/SAT/SST climo + GMST ensemble)" + ) + print( + " SISAL v3 (Speleothem Isotopes Synthesis and Analysis: MySQL/CSV database + codes)" + ) def main() -> None: diff --git a/paleo_scripts/paleo_benchmark.py b/paleo_scripts/paleo_benchmark.py new file mode 100644 index 0000000..d0d0598 --- /dev/null +++ b/paleo_scripts/paleo_benchmark.py @@ -0,0 +1,789 @@ +"""Paleo climate benchmark: spatial temperature and precipitation evaluation with CRPS scoring. + +Compares PMIP4/CMIP6 model climatologies against paleoclimate proxy reconstructions and +data assimilation (DA) products for LGM, mid-Holocene, and LIG periods. + +Temperature benchmarks: + LGM: lgmDA absolute temperatures (Tierney et al. 2020) + lgmDA anomaly (LGM - Holocene DA) + LGMR SAT anomaly (Osman et al. 2021) + Bartlein et al. 2011 pollen-based MAT anomaly + midHolocene: Bartlein et al. 2011 pollen-based MAT anomaly + lig127k: Otto-Bliesner et al. 2021 proxy temperature anomalies + +Precipitation benchmarks: + LGM: Bartlein et al. 2011 pollen-based MAP anomaly + midHolocene: Bartlein et al. 2011 pollen-based MAP anomaly + lig127k: Scussolini et al. 2019 semi-quantitative precipitation changes + +CRPS uses proxy/DA uncertainty as the width of a Gaussian forecast distribution, +scoring the model value as the "observation". This directly penalises models +whose paleo response falls outside proxy uncertainty bounds. + +For anomaly-based comparisons the model paleo temperature is differenced against +the lgmDA Holocene (PI) field as a spatially resolved modern reference. Pass +--use-picontrol to load the model's own piControl from the main ClimateBench +DataFinder pipeline instead (requires processed piControl data). + +Usage: + cd paleo_scripts + python paleo_benchmark.py --model AWI-ESM-1-1-LR --period lgm + python paleo_benchmark.py --model all --period all + python paleo_benchmark.py --model MIROC-ES2L --period lgm --use-picontrol + python paleo_benchmark.py --model all --period lgm --save-to-cloud + +Results saved to: + ../results/paleo/{period}_paleo_benchmark_results.csv + +References: + Tierney et al. (2020) Nature 584, 569–573 [lgmDA] + Osman et al. (2021) Nature 599, 485–490 [LGMR] + Bartlein et al. (2011) Clim Dyn 37, 775–802 [pollen reconstructions] + Otto-Bliesner et al. (2021) Clim Past 17, 63–88 [LIG proxies] + Scussolini et al. (2019) Science Advances [LIG precip] +""" + +import argparse +import logging +import sys +from pathlib import Path + +import numpy as np +import pandas as pd +import xarray as xr +from scipy.special import erf + +sys.path.append("..") +from utils import standardize_dims + +# --------------------------------------------------------------------------- +# Paths +# --------------------------------------------------------------------------- +PALEO_DIR = Path(__file__).parent +OBS_DIR = PALEO_DIR / "paleo_data_cache" / "processed" / "observations" +MODEL_DIR = PALEO_DIR / "paleo_data_cache" / "processed" +RESULTS_DIR = PALEO_DIR.parent / "results" / "paleo" + +logger = logging.getLogger(__name__) +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + force=True, +) + +# --------------------------------------------------------------------------- +# PALEO_MODELS / PALEO_PERIODS imported from constants +# --------------------------------------------------------------------------- +try: + from paleo_constants import PALEO_MODELS, PALEO_PERIODS +except ImportError: + PALEO_MODELS = [] + PALEO_PERIODS = ["lgm", "lig127k", "midHolocene"] + + +# --------------------------------------------------------------------------- +# CRPS and spatial metrics +# --------------------------------------------------------------------------- + + +def _crps_gaussian(obs: np.ndarray, mu: np.ndarray, sigma: np.ndarray) -> np.ndarray: + """CRPS for Gaussian N(mu, sigma) scored against point observations. + + Positive-orientated: lower CRPS = better forecast. + Formula from Gneiting & Raftery (2007): + CRPS = sigma * [z*(2*Phi(z)-1) + 2*phi(z) - 1/sqrt(pi)] + where z = (obs - mu) / sigma. + """ + sigma = np.maximum(np.abs(sigma), 1e-6) + z = (obs - mu) / sigma + phi = np.exp(-0.5 * z**2) / np.sqrt(2 * np.pi) + Phi = 0.5 * (1.0 + erf(z / np.sqrt(2.0))) + return sigma * (z * (2.0 * Phi - 1.0) + 2.0 * phi - 1.0 / np.sqrt(np.pi)) + + +def _spatial_metrics( + model_vals: np.ndarray, + proxy_mu: np.ndarray, + proxy_sigma: np.ndarray, + weights: np.ndarray | None = None, +) -> dict: + """Compute RMSE, MAE, and CRPS across valid proxy sites/grid cells. + + Args: + model_vals: model values interpolated/regridded to proxy locations + proxy_mu: proxy reconstruction mean (same units as model_vals) + proxy_sigma: proxy reconstruction uncertainty (1-sigma) + weights: optional area weights (e.g. cos-lat); uniform if None + + Returns: + dict with keys: n_sites, rmse, mae, mean_crps, crps_skill + """ + flat_model = np.asarray(model_vals).ravel() + flat_mu = np.asarray(proxy_mu).ravel() + flat_sigma = np.asarray(proxy_sigma).ravel() + flat_w = np.ones_like(flat_mu) if weights is None else np.asarray(weights).ravel() + + valid = np.isfinite(flat_model) & np.isfinite(flat_mu) & np.isfinite(flat_sigma) + if valid.sum() == 0: + return dict( + n_sites=0, rmse=np.nan, mae=np.nan, mean_crps=np.nan, crps_skill=np.nan + ) + + m = flat_model[valid] + mu = flat_mu[valid] + sig = flat_sigma[valid] + w = flat_w[valid] + w = w / w.sum() + + diff = m - mu + rmse = float(np.sqrt(np.sum(w * diff**2))) + mae = float(np.sum(w * np.abs(diff))) + + crps_vals = _crps_gaussian(m, mu, sig) + mean_crps = float(np.sum(w * crps_vals)) + + # Skill relative to a "climatological" forecast: N(mean(proxy), std(proxy)) + clim_mu = float(np.sum(w * mu)) + clim_sig = float(np.sqrt(np.sum(w * (mu - clim_mu) ** 2))) + if clim_sig < 1e-6: + clim_sig = float(np.mean(sig)) + crps_ref = float(np.mean(_crps_gaussian(m, clim_mu, clim_sig))) + crps_skill = float(1.0 - mean_crps / crps_ref) if crps_ref > 1e-9 else np.nan + + return dict( + n_sites=int(valid.sum()), + rmse=round(rmse, 4), + mae=round(mae, 4), + mean_crps=round(mean_crps, 4), + crps_skill=round(crps_skill, 4), + ) + + +# --------------------------------------------------------------------------- +# Regridding helpers +# --------------------------------------------------------------------------- + + +def _to_celsius(da: xr.DataArray) -> xr.DataArray: + """Convert K → °C if values look like Kelvin (mean > 100).""" + if float(da.mean()) > 100: + return da - 273.15 + return da + + +def _regrid( + source: xr.DataArray, target_lat: np.ndarray, target_lon: np.ndarray +) -> xr.DataArray: + """Bilinearly interpolate source DataArray to a target regular lat/lon grid. + + Handles 0–360 vs −180–180 lon convention by remapping target lons. + """ + src_lon = source.lon.values % 360 + tgt_lon = target_lon % 360 + source = source.assign_coords(lon=src_lon).sortby("lon") + return source.interp( + lat=target_lat, + lon=tgt_lon, + method="linear", + kwargs={"fill_value": "extrapolate"}, + ) + + +def _interp_to_points( + source: xr.DataArray, lats: np.ndarray, lons: np.ndarray +) -> np.ndarray: + """Nearest-neighbour interpolation to scattered lat/lon points.""" + lons_norm = lons % 360 + src_lon = source.lon.values % 360 + source = source.assign_coords(lon=src_lon).sortby("lon") + vals = [] + for la, lo in zip(lats, lons_norm): + try: + v = float(source.sel(lat=la, lon=lo, method="nearest")) + except Exception: + v = np.nan + vals.append(v) + return np.array(vals) + + +# --------------------------------------------------------------------------- +# Model data loaders +# --------------------------------------------------------------------------- + + +def _load_model_tas(model: str, period: str) -> xr.DataArray | None: + """Load annual-mean tas from processed CMIP6 paleo file. + + Returns DataArray in °C, or None if data is unavailable. + """ + nc = MODEL_DIR / model / f"{period}_tas_annual.nc" + if not nc.exists(): + logger.warning( + f" [skip] No processed {period} tas for {model} — run process_paleo.py first" + ) + return None + ds = xr.open_dataset(nc) + da = ds["tas"] + da = standardize_dims(da.to_dataset(name="tas"))["tas"] + return _to_celsius(da) + + +def _load_model_pr(model: str, period: str) -> xr.DataArray | None: + """Load annual-mean pr from processed CMIP6 paleo file (kg m-2 s-1 → mm/yr). + + Returns DataArray in mm/yr, or None if data is unavailable. + """ + nc = MODEL_DIR / model / f"{period}_pr_annual.nc" + if not nc.exists(): + return None + ds = xr.open_dataset(nc) + da = ds["pr"] + da = standardize_dims(da.to_dataset(name="pr"))["pr"] + # Convert kg m-2 s-1 → mm/yr + return da * 86400 * 365.25 + + +def _load_picontrol_tas(model: str) -> xr.DataArray | None: + """Load piControl annual-mean tas via the main ClimateBench DataFinder.""" + try: + sys.path.append(str(PALEO_DIR.parent / "benchmark_scrips")) + from benchmark_utils import DataFinder + + df = DataFinder(model=model, variable="tas", start_year=1850, end_year=2000) + pi_ds = df.load_experiment_ds(experiment="piControl", ensemble_mean=True) + pi_da = standardize_dims(pi_ds)["tas"] + # Annual mean over all time steps + return _to_celsius(pi_da.mean(dim="time")) + except Exception as e: + logger.warning(f" Could not load piControl for {model}: {e}") + return None + + +def _load_lgmda_pi_tas() -> xr.DataArray | None: + """Load lgmDA Holocene (PI) annual-mean tas as a spatially resolved modern reference.""" + nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + if not nc.exists(): + logger.warning(" lgm_lgmda_da.nc not found — cannot compute model anomalies") + return None + ds = xr.open_dataset(nc) + # Monthly mean → annual mean; lgmDA is in °C + pi = ds["pi_tas"].mean(dim="month") + return _to_celsius(pi) + + +def _compute_model_anom(model_tas: xr.DataArray, pi_ref: xr.DataArray) -> xr.DataArray: + """Compute model temperature anomaly (paleo − PI reference). + + Regrids pi_ref to the model grid before differencing. + """ + pi_on_model = _regrid(pi_ref, model_tas.lat.values, model_tas.lon.values) + return model_tas - pi_on_model + + +# --------------------------------------------------------------------------- +# Per-dataset benchmark functions +# --------------------------------------------------------------------------- + + +def _result_row(model, period, dataset, variable, metrics: dict) -> dict: + return dict( + model=model, period=period, dataset=dataset, variable=variable, **metrics + ) + + +def bench_lgmda_absolute( + model_tas: xr.DataArray, model: str, period: str +) -> list[dict]: + """Absolute temperature comparison: model lgm tas vs lgmDA lgm_tas.""" + nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + lgmda_lgm = _to_celsius(ds["lgm_tas"].mean(dim="month")) + lgmda_std = ds["lgm_tas_std"].mean(dim="month") + + model_on_lgmda = _regrid(model_tas, lgmda_lgm.lat.values, lgmda_lgm.lon.values) + cos_w = np.cos(np.deg2rad(lgmda_lgm.lat.values)) + w2d = np.tile(cos_w[:, None], (1, len(lgmda_lgm.lon))) + + metrics = _spatial_metrics( + model_on_lgmda.values, lgmda_lgm.values, lgmda_std.values, w2d + ) + logger.info( + f" lgmDA absolute tas: n={metrics['n_sites']} RMSE={metrics['rmse']:.2f}°C CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "lgmDA", "tas_absolute_C", metrics)] + + +def bench_lgmda_anomaly( + model_anom: xr.DataArray, model: str, period: str +) -> list[dict]: + """Anomaly comparison: model − lgmDA_pi vs lgmDA (lgm_tas − pi_tas).""" + nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + proxy_anom = _to_celsius(ds["lgm_tas"] - ds["pi_tas"]).mean(dim="month") + # Propagate lgm and pi stds + proxy_sigma = np.sqrt( + ds["lgm_tas_std"].mean(dim="month") ** 2 + + ds["pi_tas_std"].mean(dim="month") ** 2 + ) + + model_on_lgmda = _regrid(model_anom, proxy_anom.lat.values, proxy_anom.lon.values) + cos_w = np.cos(np.deg2rad(proxy_anom.lat.values)) + w2d = np.tile(cos_w[:, None], (1, len(proxy_anom.lon))) + + metrics = _spatial_metrics( + model_on_lgmda.values, proxy_anom.values, proxy_sigma.values, w2d + ) + logger.info( + f" lgmDA anomaly tas: n={metrics['n_sites']} RMSE={metrics['rmse']:.2f}°C CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "lgmDA", "tas_anomaly_K", metrics)] + + +def bench_lgmr_sat(model_anom: xr.DataArray, model: str, period: str) -> list[dict]: + """Anomaly comparison: model vs LGMR SAT (Osman et al. 2021).""" + nc = OBS_DIR / "da" / "lgm_lgmr_sat_da.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + proxy_mu = ds["sat"] + proxy_sigma = ds["sat_std"] + + model_on_lgmr = _regrid(model_anom, proxy_mu.lat.values, proxy_mu.lon.values) + cos_w = np.cos(np.deg2rad(proxy_mu.lat.values)) + w2d = np.tile(cos_w[:, None], (1, len(proxy_mu.lon))) + + metrics = _spatial_metrics( + model_on_lgmr.values, proxy_mu.values, proxy_sigma.values, w2d + ) + logger.info( + f" LGMR SAT anomaly: n={metrics['n_sites']} RMSE={metrics['rmse']:.2f}°C CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "LGMR_SAT", "tas_anomaly_K", metrics)] + + +def bench_bartlein_tas(model_anom: xr.DataArray, period: str, model: str) -> list[dict]: + """Pollen-based MAT anomaly comparison (Bartlein et al. 2011). + + Uses mat_anm_mean (°C anomaly) and mat_se_mean (standard error) from + the Bartlein gridded reconstructions. Only cells with significant signal + (mat_sig == 1) are included. + """ + tag = "lgm" if period == "lgm" else "midh" + nc = OBS_DIR / "proxy" / f"{tag}_bartlein_proxy.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + proxy_mu = ds["mat_anm_mean"] + proxy_sigma = ds["mat_se_mean"] + # mat_sig_val stores the anomaly at significant cells (0 where not significant); + # mat_sig == ±1 uses a stricter threshold. We keep all cells where the + # anomaly is significant (mat_sig_val != 0) which matches |t| > ~2. + sig_mask = np.isfinite(ds["mat_sig_val"].values) & (ds["mat_sig_val"].values != 0) + + proxy_mu_masked = proxy_mu.where( + xr.DataArray(sig_mask, dims=proxy_mu.dims, coords=proxy_mu.coords) + ) + proxy_sig_masked = proxy_sigma.where( + xr.DataArray(sig_mask, dims=proxy_sigma.dims, coords=proxy_sigma.coords) + ) + + model_on_bart = _regrid(model_anom, proxy_mu.lat.values, proxy_mu.lon.values) + cos_w = np.cos(np.deg2rad(proxy_mu.lat.values)) + w2d = np.tile(cos_w[:, None], (1, len(proxy_mu.lon))) + + metrics = _spatial_metrics( + model_on_bart.values, proxy_mu_masked.values, proxy_sig_masked.values, w2d + ) + logger.info( + f" Bartlein MAT anomaly ({period}): n={metrics['n_sites']} RMSE={metrics['rmse']:.2f}°C CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "Bartlein2011", "tas_anomaly_K", metrics)] + + +def bench_bartlein_pr( + model_pr_anom: xr.DataArray | None, period: str, model: str +) -> list[dict]: + """Pollen-based MAP anomaly comparison (Bartlein et al. 2011). + + map_anm_mean in mm/yr, map_se_mean is standard error. + """ + if model_pr_anom is None: + return [] + tag = "lgm" if period == "lgm" else "midh" + nc = OBS_DIR / "proxy" / f"{tag}_bartlein_proxy.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + proxy_mu = ds["map_anm_mean"] + proxy_sigma = ds["map_se_mean"] + sig_mask = np.isfinite(ds["map_sig_val"].values) & (ds["map_sig_val"].values != 0) + + proxy_mu_masked = proxy_mu.where( + xr.DataArray(sig_mask, dims=proxy_mu.dims, coords=proxy_mu.coords) + ) + proxy_sig_masked = proxy_sigma.where( + xr.DataArray(sig_mask, dims=proxy_sigma.dims, coords=proxy_sigma.coords) + ) + + model_on_bart = _regrid(model_pr_anom, proxy_mu.lat.values, proxy_mu.lon.values) + cos_w = np.cos(np.deg2rad(proxy_mu.lat.values)) + w2d = np.tile(cos_w[:, None], (1, len(proxy_mu.lon))) + + metrics = _spatial_metrics( + model_on_bart.values, proxy_mu_masked.values, proxy_sig_masked.values, w2d + ) + logger.info( + f" Bartlein MAP anomaly ({period}): n={metrics['n_sites']} RMSE={metrics['rmse']:.1f}mm/yr CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "Bartlein2011", "pr_anomaly_mmyr", metrics)] + + +def bench_ottobliesner_lig( + model_anom: xr.DataArray | None, model: str, period: str +) -> list[dict]: + """LIG proxy temperature comparison (Otto-Bliesner et al. 2021).""" + if model_anom is None: + return [] + nc = OBS_DIR / "proxy" / "lig127k_ottobliesner_tas_proxy.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + # tas/tas_std are on a sparse grid; flatten to valid sites + tas = ds["tas"].values.ravel() + tas_std = ds["tas_std"].values.ravel() + lon_grid, lat_grid = np.meshgrid(ds.lon.values, ds.lat.values) + lats = lat_grid.ravel() + lons = lon_grid.ravel() + valid = np.isfinite(tas) + lats, lons = lats[valid], lons[valid] + proxy_mu, proxy_sigma = tas[valid], tas_std[valid] + + model_vals = _interp_to_points(model_anom, lats, lons) + metrics = _spatial_metrics(model_vals, proxy_mu, proxy_sigma) + logger.info( + f" Otto-Bliesner LIG TAS: n={metrics['n_sites']} RMSE={metrics['rmse']:.2f}°C CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "OttoBliesner2021", "tas_anomaly_K", metrics)] + + +def bench_scussolini_lig( + model_pr_anom: xr.DataArray | None, model: str, period: str +) -> list[dict]: + """LIG precipitation comparison (Scussolini et al. 2019). + + Uses only sites with quantitative ΔP (mm) estimates and reliability ≥ 1. + Semi-quantitative signal is used as ordinal class (−2 to +2) when + quantitative ΔP is absent; those sites get a proxy_sigma of 200 mm/yr + so CRPS is appropriately wide. + """ + if model_pr_anom is None: + return [] + csv = OBS_DIR / "proxy" / "lig127k_scussolini_pr_proxy.csv" + if not csv.exists(): + return [] + df = pd.read_csv(csv) + + # Filter to sites with usable data + has_quant = df["Quantitative signal of ΔP (mm)"].notna() + reliable = df["Reliability score"].fillna(0) >= 1 + quant_sites = df[has_quant & reliable].copy() + if quant_sites.empty: + logger.warning(" Scussolini: no quantitative precipitation sites available") + return [] + + lats = quant_sites["lat"].values + lons = quant_sites["lon"].values + proxy_mu = quant_sites["Quantitative signal of ΔP (mm)"].values.astype(float) + # Use reliability score to set uncertainty: reliability 1 → ±300 mm/yr, 2 → ±150 mm/yr + reliability = quant_sites["Reliability score"].values + proxy_sigma = np.where(reliability >= 2, 150.0, 300.0) + + model_vals = _interp_to_points(model_pr_anom, lats, lons) + metrics = _spatial_metrics(model_vals, proxy_mu, proxy_sigma) + logger.info( + f" Scussolini LIG precip: n={metrics['n_sites']} RMSE={metrics['rmse']:.1f}mm/yr CRPS={metrics['mean_crps']:.3f} skill={metrics['crps_skill']:.3f}" + ) + return [_result_row(model, period, "Scussolini2019", "pr_anomaly_mmyr", metrics)] + + +# --------------------------------------------------------------------------- +# Per-period orchestration +# --------------------------------------------------------------------------- + + +def _run_lgm(model: str, use_picontrol: bool) -> list[dict]: + rows = [] + model_tas = _load_model_tas(model, "lgm") + if model_tas is None: + return rows + + # PI reference for anomaly computation + if use_picontrol: + pi_ref = _load_picontrol_tas(model) + if pi_ref is None: + logger.warning(" Falling back to lgmDA PI reference") + pi_ref = _load_lgmda_pi_tas() + else: + pi_ref = _load_lgmda_pi_tas() + + # Absolute temperature comparison (no PI ref needed) + rows += bench_lgmda_absolute(model_tas, model, "lgm") + + if pi_ref is not None: + model_anom = _compute_model_anom(model_tas, pi_ref) + rows += bench_lgmda_anomaly(model_anom, model, "lgm") + rows += bench_lgmr_sat(model_anom, model, "lgm") + rows += bench_bartlein_tas(model_anom, "lgm", model) + + model_pr = _load_model_pr(model, "lgm") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "lgm", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_bartlein_pr(model_pr_anom, "lgm", model) + else: + logger.warning(" No PI reference — skipping anomaly benchmarks for LGM") + + return rows + + +def _run_midholocene(model: str, use_picontrol: bool) -> list[dict]: + rows = [] + model_tas = _load_model_tas(model, "midHolocene") + if model_tas is None: + return rows + + pi_ref = _load_picontrol_tas(model) if use_picontrol else _load_lgmda_pi_tas() + if pi_ref is None: + logger.warning( + " No PI reference — skipping anomaly benchmarks for midHolocene" + ) + return rows + + model_anom = _compute_model_anom(model_tas, pi_ref) + rows += bench_bartlein_tas(model_anom, "midHolocene", model) + + model_pr = _load_model_pr(model, "midHolocene") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "midHolocene", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_bartlein_pr(model_pr_anom, "midHolocene", model) + return rows + + +def _run_lig127k(model: str, use_picontrol: bool) -> list[dict]: + rows = [] + model_tas = _load_model_tas(model, "lig127k") + if model_tas is None: + return rows + + pi_ref = _load_picontrol_tas(model) if use_picontrol else _load_lgmda_pi_tas() + if pi_ref is None: + logger.warning(" No PI reference — skipping anomaly benchmarks for lig127k") + return rows + + model_anom = _compute_model_anom(model_tas, pi_ref) + rows += bench_ottobliesner_lig(model_anom, model, "lig127k") + + model_pr = _load_model_pr(model, "lig127k") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "lig127k", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_scussolini_lig(model_pr_anom, model, "lig127k") + return rows + + +def _compute_pr_anom( + model_pr: xr.DataArray | None, + model: str, + period: str, + use_picontrol: bool, +) -> xr.DataArray | None: + """Compute model precipitation anomaly (mm/yr) relative to PI reference.""" + if model_pr is None: + return None + # Load piControl pr if available; otherwise skip (no lgmDA precip reference) + if use_picontrol: + try: + sys.path.append(str(PALEO_DIR.parent / "benchmark_scrips")) + from benchmark_utils import DataFinder + + df = DataFinder(model=model, variable="pr", start_year=1850, end_year=2000) + pi_ds = df.load_experiment_ds(experiment="piControl", ensemble_mean=True) + pi_pr = standardize_dims(pi_ds)["pr"].mean(dim="time") * 86400 * 365.25 + pi_pr_on_model = _regrid(pi_pr, model_pr.lat.values, model_pr.lon.values) + return model_pr - pi_pr_on_model + except Exception as e: + logger.warning(f" Could not load piControl pr: {e}") + logger.warning( + f" No precipitation PI reference for {period} — skipping pr anomaly benchmarks. " + "Pass --use-picontrol to enable." + ) + return None + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +PERIOD_RUNNERS = { + "lgm": _run_lgm, + "midHolocene": _run_midholocene, + "lig127k": _run_lig127k, +} + + +def main( + models: list[str], + periods: list[str], + use_picontrol: bool = False, + save_to_cloud: bool = False, + overwrite: bool = False, +) -> pd.DataFrame: + # Collect rows per period so each period gets its own results file + rows_by_period: dict[str, list[dict]] = {p: [] for p in periods} + + for model in models: + for period in periods: + if period not in PERIOD_RUNNERS: + logger.info( + f" No benchmark configured for period '{period}' — skipping" + ) + continue + logger.info(f"\n{'='*60}\n {model} / {period}\n{'='*60}") + rows = PERIOD_RUNNERS[period](model, use_picontrol) + rows_by_period[period].extend(rows) + if not rows: + logger.warning(f" No benchmark results for {model}/{period}") + + all_dfs = [] + for period, rows in rows_by_period.items(): + if not rows: + continue + period_df = pd.DataFrame(rows) + _save_results(period_df, period, save_to_cloud, overwrite) + all_dfs.append(period_df) + + if not all_dfs: + logger.warning("No results collected.") + return pd.DataFrame() + + return pd.concat(all_dfs, ignore_index=True) + + +def _save_results( + df: pd.DataFrame, period: str, save_to_cloud: bool, overwrite: bool +) -> None: + results_file = RESULTS_DIR / f"{period}_paleo_benchmark_results.csv" + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + + if save_to_cloud: + try: + from google.cloud import storage + + gcs_path = f"results/paleo/{results_file.name}" + storage_client = storage.Client(project="JCM and Benchmarking") + storage_client.bucket("climatebench") + df.to_csv(f"gs://climatebench/{gcs_path}", index=False) + logger.info(f"Results saved to cloud: gs://climatebench/{gcs_path}") + except Exception as e: + logger.warning(f"Cloud save failed: {e}. Saving locally instead.") + save_to_cloud = False + + if not save_to_cloud: + if overwrite or not results_file.exists(): + df.to_csv(results_file, index=False) + else: + existing = pd.read_csv(results_file) + key_cols = ["model", "period", "dataset", "variable"] + existing = existing[ + ~existing.set_index(key_cols).index.isin(df.set_index(key_cols).index) + ] + pd.concat([existing, df], ignore_index=True).to_csv( + results_file, index=False + ) + logger.info(f"Results saved: {results_file}") + + print(df.to_string(index=False)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Paleo benchmark: spatial RMSE/MAE/CRPS against proxy and DA observations" + ) + parser.add_argument( + "--model", + default="all", + help="Model name or 'all' for all models with processed data (default: all)", + ) + parser.add_argument( + "--period", + default="all", + choices=["lgm", "midHolocene", "lig127k", "all"], + help="Paleo period to benchmark (default: all)", + ) + parser.add_argument( + "--use-picontrol", + action="store_true", + default=False, + help="Load model piControl from main ClimateBench DataFinder for anomaly computation " + "(requires processed piControl data; default uses lgmDA Holocene as PI reference)", + ) + parser.add_argument( + "--save-to-cloud", + action="store_true", + default=False, + help="Save results to GCS bucket 'climatebench'", + ) + parser.add_argument( + "--overwrite", + action="store_true", + default=False, + help="Overwrite existing results CSV instead of appending", + ) + args = parser.parse_args() + + # Resolve model list + if args.model == "all": + available = [ + p.name + for p in MODEL_DIR.iterdir() + if p.is_dir() + and p.name != "observations" + and any(p.glob("*_tas_annual.nc")) + ] + if not available: + logger.error( + "No processed model data found in paleo_data_cache/processed/. " + "Run process_paleo.py --source cmip6 first." + ) + sys.exit(1) + model_list = sorted(available) + else: + model_list = [args.model] + + # Resolve period list + period_list = list(PERIOD_RUNNERS) if args.period == "all" else [args.period] + + logger.info(f"Models: {model_list}") + logger.info(f"Periods: {period_list}") + logger.info( + f"PI reference: {'piControl (DataFinder)' if args.use_picontrol else 'lgmDA Holocene'}" + ) + + main( + models=model_list, + periods=period_list, + use_picontrol=args.use_picontrol, + save_to_cloud=args.save_to_cloud, + overwrite=args.overwrite, + ) diff --git a/paleo_scripts/process_paleo.py b/paleo_scripts/process_paleo.py index 7c1f8f4..83f6a98 100644 --- a/paleo_scripts/process_paleo.py +++ b/paleo_scripts/process_paleo.py @@ -11,11 +11,22 @@ Then deletes the raw files (unless --skip-cleanup). Observations processing (--source observations): - Reads downloaded proxy/reanalysis files and produces unified CSVs/NetCDF: + Proxy data — site-level or gridded, saved per period: + paleo_data_cache/processed/observations/proxy/lig127k_ottobliesner_tas_proxy.nc + paleo_data_cache/processed/observations/proxy/lig127k_scussolini_pr_proxy.csv + paleo_data_cache/processed/observations/proxy/lgm_bartlein_proxy.csv + paleo_data_cache/processed/observations/proxy/midh_bartlein_proxy.csv + paleo_data_cache/processed/observations/proxy/deeptime_hansen_proxy.csv + paleo_data_cache/processed/observations/proxy/sisal_v3/ + + Data assimilation — gridded, saved per period: + paleo_data_cache/processed/observations/da/lgm_lgmda_da.nc + paleo_data_cache/processed/observations/da/lgm_lgmr_da.nc + + Multi-period summaries: paleo_data_cache/processed/observations/annual_mean_global_obs.csv paleo_data_cache/processed/observations/annual_mean_zonal_obs.csv paleo_data_cache/processed/observations/monthly_mean_zonal_obs.csv - paleo_data_cache/processed/observations/LGM_da.nc Run download_paleo.py first to populate paleo_data_cache/raw/. @@ -29,6 +40,7 @@ import argparse import logging import sys +import zipfile from pathlib import Path from typing import Optional @@ -150,7 +162,7 @@ def process_cmip6(periods: list[str], skip_cleanup: bool) -> None: # --------------------------------------------------------------------------- -# Observations processing +# Observations — sub-processors # --------------------------------------------------------------------------- @@ -189,56 +201,11 @@ def _parse_holocene(hol_ds: xr.Dataset, var: str) -> xr.Dataset: ) -def process_observations() -> None: - obs_raw = RAW_DIR / "observations" - obs_proc = PROCESSED_DIR / "observations" - obs_proc.mkdir(parents=True, exist_ok=True) - - # --- Mid Holocene (Temp12k) --- - logging.info("Processing Mid Holocene (Temp12k)") - hol_ds = xr.open_dataset(obs_raw / "temp12k_alldata.nc").load() - midH_scc = _parse_holocene(hol_ds, "scc") - - # --- Last Interglacial (Capron et al. 2021) --- - logging.info("Processing Last Interglacial (lig127k)") - lig_df = pd.concat( - [ - pd.read_excel( - obs_raw - / "lig127k" - / "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", - skiprows=2, - ), - pd.read_excel( - obs_raw - / "lig127k" - / "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", - skiprows=2, - ), - pd.read_excel( - obs_raw - / "lig127k" - / "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", - skiprows=2, - ), - ] - ) - lig_df["SD"] = lig_df["Anom+1SD"] - lig_df["Anom"] - lig_ds = ( - lig_df[["Latitude", "Longitude", "Anom", "SD"]] - .groupby(["Latitude", "Longitude"]) - .mean() - .to_xarray() - .rename({"Latitude": "lat", "Longitude": "lon", "Anom": "tas", "SD": "tas_std"}) - ) - lig_weights = np.cos(np.deg2rad(lig_ds.lat)).expand_dims({"lon": lig_ds.lon}) - lig_zmean = lig_ds.weighted(lig_weights).mean() - - # --- Last Glacial Maximum (lgmDA) --- - logging.info("Processing Last Glacial Maximum (lgmDA)") +def _process_lgmda(obs_raw: Path, da_dir: Path) -> xr.Dataset: + """lgmDA monthly gridded fields → da/lgm_lgmda_da.nc. Returns the combined dataset.""" lgm_raw = xr.open_dataset(obs_raw / "lgmDA_lgm_ATM_monthly_climo.nc") pi_raw = xr.open_dataset(obs_raw / "lgmDA_hol_ATM_monthly_climo.nc") - lgm_combined = xr.Dataset( + ds = xr.Dataset( { "lgm_tas": (["month", "lat", "lon"], lgm_raw.tas.data), "pi_tas": (["month", "lat", "lon"], pi_raw.tas.data), @@ -251,26 +218,279 @@ def process_observations() -> None: "lat": lgm_raw.lat.data, }, ) - lgm_combined.to_netcdf(obs_proc / "LGM_da.nc") - logging.info("Saved LGM_da.nc") + ds.to_netcdf(da_dir / "lgm_lgmda_da.nc") + logging.info(" Saved da/lgm_lgmda_da.nc") + return ds + + +def _process_lgmr(obs_raw: Path, da_dir: Path) -> None: + """Osman et al. 2021 LGMR → da/lgm_lgmr_{sat,sst,gmst}_da.nc. + + All LGMR variables are absolute temperatures (°C). Anomalies are computed + relative to the pre-industrial reference (100–1000 BP mean). + + SAT and SST live on different grids (96×144 vs 384×320) so they are saved + as separate files. + + GMST is saved as a full deglaciation time series (anomaly vs PI) so the + complete 0–26 ka record is available for plotting. + """ + osman_dir = obs_raw / "osman2021" + required = osman_dir / "LGMR_SAT_climo.nc" + if not required.exists(): + logging.warning(" [skip] lgm_lgmr_*_da.nc — LGMR_SAT_climo.nc not found") + return + + # PI reference: 100–1000 BP (5 youngest 200-yr bins, pre-industrial) + # LGM window: 19–24 ka BP + pi_age = slice(100, 1000) + lgm_age = slice(19000, 24000) + + # --- Gridded files: SAT and SST --- + for fname, out_name, skip_vars in [ + ("LGMR_SAT_climo.nc", "lgm_lgmr_sat_da.nc", set()), + ("LGMR_SST_climo.nc", "lgm_lgmr_sst_da.nc", {"tarea"}), + ]: + p = osman_dir / fname + if not p.exists(): + logging.warning(f" [skip] {out_name} — {fname} not found") + continue + ds = xr.open_dataset(p).load() + pi_mean = ds.sel(age=pi_age).mean(dim="age") + lgm_mean = ds.sel(age=lgm_age).mean(dim="age") + + out = xr.Dataset() + for var in ds.data_vars: + if var in skip_vars: + out[var] = ( + ds[var].isel(age=0, drop=True) if "age" in ds[var].dims else ds[var] + ) + elif var.endswith("_std"): + # Keep LGM-period ensemble spread; differencing stds is not meaningful + out[var] = lgm_mean[var] + out[var].attrs = {**ds[var].attrs, "note": "ensemble spread at LGM"} + else: + out[var] = lgm_mean[var] - pi_mean[var] + out[var].attrs = { + **ds[var].attrs, + "note": "LGM (19–24 ka) anomaly relative to PI (100–1000 BP)", + } + out.to_netcdf(da_dir / out_name) + logging.info(f" Saved da/{out_name}") + + # --- GMST: save full time series as anomaly vs PI --- + gmst_path = osman_dir / "LGMR_GMST_climo.nc" + if not gmst_path.exists(): + logging.warning(" [skip] lgm_lgmr_gmst_da.nc — LGMR_GMST_climo.nc not found") + return + ds = xr.open_dataset(gmst_path).load() + pi_val = float(ds["gmst"].sel(age=pi_age).mean(dim="age").values) + out = xr.Dataset( + { + "gmst_anom": ds["gmst"] - pi_val, + "gmst_anom_std": ds["gmst_std"], + "gmst_abs": ds["gmst"], + } + ) + out["gmst_anom"].attrs = { + "units": "degrees Celsius", + "long_name": "GMST anomaly relative to PI (100–1000 BP)", + } + out["gmst_anom_std"].attrs = ds["gmst_std"].attrs + out["gmst_abs"].attrs = {**ds["gmst"].attrs, "note": "absolute temperature"} + out.to_netcdf(da_dir / "lgm_lgmr_gmst_da.nc") + logging.info(" Saved da/lgm_lgmr_gmst_da.nc") + + +def _process_ottobliesner_lig( + obs_raw: Path, proxy_dir: Path +) -> tuple[xr.Dataset, xr.DataArray]: + """Otto-Bliesner et al. (2021), Clim. Past 17, 63–88 LIG proxy tables → + proxy/lig127k_ottobliesner_tas_proxy.nc. + Returns (lig_ds, lig_weights) for use in summary CSVs.""" + lig_dir = obs_raw / "lig127k" + tables = [ + "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", + "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", + "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", + ] + lig_df = pd.concat([pd.read_excel(lig_dir / t, skiprows=2) for t in tables]) + lig_df["SD"] = lig_df["Anom+1SD"] - lig_df["Anom"] + lig_ds = ( + lig_df[["Latitude", "Longitude", "Anom", "SD"]] + .groupby(["Latitude", "Longitude"]) + .mean() + .to_xarray() + .rename({"Latitude": "lat", "Longitude": "lon", "Anom": "tas", "SD": "tas_std"}) + ) + lig_ds.to_netcdf(proxy_dir / "lig127k_ottobliesner_tas_proxy.nc") + logging.info(" Saved proxy/lig127k_ottobliesner_tas_proxy.nc") + lig_weights = np.cos(np.deg2rad(lig_ds.lat)).expand_dims({"lon": lig_ds.lon}) + return lig_ds, lig_weights + + +def _process_scussolini(obs_raw: Path, proxy_dir: Path) -> None: + """Scussolini et al. 2019 LIG precip proxy → proxy/lig127k_scussolini_pr_proxy.csv.""" + xlsx_path = obs_raw / "scussolini2019_lig_precip_proxy.xlsx" + if not xlsx_path.exists() or xlsx_path.stat().st_size == 0: + logging.warning( + " [skip] proxy/lig127k_scussolini_pr_proxy.csv — file missing or empty" + " (manual download required, see download_paleo.py)" + ) + return + + # Data is in the 'Proxy_Database' sheet; 'LatºN' and 'LonºE' are the coords. + df = pd.read_excel( + xlsx_path, sheet_name="Proxy_Database", header=0, engine="openpyxl" + ) + col_lower = {c.lower(): c for c in df.columns} + lat_col = next((col_lower[k] for k in col_lower if "lat" in k), None) + lon_col = next((col_lower[k] for k in col_lower if "lon" in k), None) + if lat_col is None or lon_col is None: + logging.warning( + f" Scussolini xlsx: could not detect lat/lon columns. Found: {list(df.columns)}" + ) + return + + df.rename(columns={lat_col: "lat", lon_col: "lon"}, inplace=True) + df.to_csv(proxy_dir / "lig127k_scussolini_pr_proxy.csv", index=False) + logging.info(f" Saved proxy/lig127k_scussolini_pr_proxy.csv ({len(df)} records)") + + +def _process_bartlein2011(obs_raw: Path, proxy_dir: Path) -> None: + """Bartlein et al. 2011 pollen reconstructions → proxy/lgm_bartlein_proxy.nc + and proxy/midh_bartlein_proxy.nc. + + The zip contains one NetCDF per variable per period + ({var}_delta_{06|21}ka_ALL_grid_2x2.nc). Variables are merged into one + Dataset per period (6ka = midHolocene, 21ka = LGM). + """ + import tempfile + + zip_path = obs_raw / "bartlein2011_pollen_climate_recon.zip" + if not zip_path.exists(): + logging.warning(" [skip] Bartlein 2011 — zip not downloaded") + return + + with zipfile.ZipFile(zip_path) as zf, tempfile.TemporaryDirectory() as tmp: + tmp_path = Path(tmp) + zf.extractall(tmp_path) + + period_datasets: dict[str, list[xr.Dataset]] = {"06ka": [], "21ka": []} + for nc_file in sorted(tmp_path.glob("*.nc")): + name = nc_file.stem # e.g. mat_delta_06ka_ALL_grid_2x2 + for period in period_datasets: + if f"_{period}_" in name: + period_datasets[period].append(xr.open_dataset(nc_file).load()) + break + + period_out = { + "06ka": ("midh_bartlein_proxy.nc", "midH"), + "21ka": ("lgm_bartlein_proxy.nc", "LGM"), + } + for period, datasets in period_datasets.items(): + out_name, label = period_out[period] + if not datasets: + logging.warning(f" Bartlein 2011: no files found for {period}") + continue + merged = xr.merge(datasets) + merged.to_netcdf(proxy_dir / out_name) + logging.info( + f" Saved proxy/{out_name} ({label}, {len(datasets)} variables)" + ) + + +def _process_hansen_deeptime(obs_raw: Path, proxy_dir: Path) -> None: + """Tierney THansenMethod.csv → proxy/deeptime_hansen_proxy.csv.""" + csv_path = obs_raw / "THansenMethod.csv" + if not csv_path.exists(): + logging.warning( + " [skip] proxy/deeptime_hansen_proxy.csv — THansenMethod.csv not found" + ) + return + pd.read_csv(csv_path).to_csv(proxy_dir / "deeptime_hansen_proxy.csv", index=False) + logging.info(" Saved proxy/deeptime_hansen_proxy.csv") + + +def _process_sisal(obs_raw: Path, proxy_dir: Path) -> None: + """Extract SISAL v3 speleothem database zips into proxy/sisal_v3/.""" + sisal_raw = obs_raw / "sisal_v3" + sisal_proc = proxy_dir / "sisal_v3" + + for fname in ["sisalv3_database_mysql_csv.zip", "sisalv3_codes.zip"]: + zip_path = sisal_raw / fname + if not zip_path.exists(): + logging.warning(f" [skip] sisal_v3 — {fname} not found") + continue + dest = sisal_proc / fname.replace(".zip", "") + if dest.exists(): + logging.info(f" [skip] {fname} already extracted") + continue + dest.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(zip_path) as zf: + zf.extractall(dest) + logging.info(f" Extracted {fname} → proxy/sisal_v3/{dest.name}/") + + +# --------------------------------------------------------------------------- +# Observations — top-level orchestrator +# --------------------------------------------------------------------------- + - lgm_ds = (lgm_combined["lgm_tas"] - lgm_combined["pi_tas"]).to_dataset(name="tas") - lgm_ds["tas_std"] = lgm_combined["lgm_tas_std"] +def process_observations() -> None: + obs_raw = RAW_DIR / "observations" + obs_proc = PROCESSED_DIR / "observations" + proxy_dir = obs_proc / "proxy" + da_dir = obs_proc / "da" + + for d in (obs_proc, proxy_dir, da_dir): + d.mkdir(parents=True, exist_ok=True) + + # ---- Data assimilation ---- + logging.info("Processing LGM lgmDA (data assimilation)") + lgmda_ds = _process_lgmda(obs_raw, da_dir) + + logging.info("Processing LGM Osman 2021 LGMR (data assimilation)") + _process_lgmr(obs_raw, da_dir) + + # ---- Proxy ---- + logging.info("Processing LIG Otto-Bliesner et al. 2021 temperature proxy") + lig_ds, lig_weights = _process_ottobliesner_lig(obs_raw, proxy_dir) + + logging.info("Processing LIG Scussolini et al. 2019 precipitation proxy") + _process_scussolini(obs_raw, proxy_dir) + + logging.info("Processing Bartlein et al. 2011 pollen reconstructions (LGM + midH)") + _process_bartlein2011(obs_raw, proxy_dir) + + logging.info("Processing deep-time Hansen reconstruction") + _process_hansen_deeptime(obs_raw, proxy_dir) + + logging.info("Extracting SISAL v3 speleothem database") + _process_sisal(obs_raw, proxy_dir) + + # ---- Mid Holocene (Temp12k) — needed for summary CSVs ---- + logging.info("Processing Mid Holocene Temp12k (Kaufman et al. 2020)") + hol_ds = xr.open_dataset(obs_raw / "temp12k_alldata.nc").load() + midH_scc = _parse_holocene(hol_ds, "scc") + + # ---- Derived LGM anomaly fields for summaries ---- + lgm_ds = (lgmda_ds["lgm_tas"] - lgmda_ds["pi_tas"]).to_dataset(name="tas") + lgm_ds["tas_std"] = lgmda_ds["lgm_tas_std"] lgm_annual = lgm_ds.mean(dim="month") lgm_weights = np.cos(np.deg2rad(lgm_annual.lat)).expand_dims( {"lon": lgm_annual.lon} ) - # --- Global mean annual CSV (all periods) --- + # ---- Global mean annual CSV (all periods) ---- logging.info("Building annual_mean_global_obs.csv") paleo_avgs = pd.read_csv(obs_raw / "Figure7_19_obs.csv", skiprows=2) midH_global = midH_scc.sel(lat_bnd="90S_to_90N") - midH_mean, midH_std = float(midH_global["tas"].values), float( - midH_global["tas_std"].values - ) - lig_mean, lig_std = float(lig_zmean["tas"].values), float( - lig_zmean["tas_std"].values - ) + midH_mean = float(midH_global["tas"].values) + midH_std = float(midH_global["tas_std"].values) + lig_zmean = lig_ds.weighted(lig_weights).mean() + lig_mean = float(lig_zmean["tas"].values) + lig_std = float(lig_zmean["tas_std"].values) paleo_avgs = pd.concat( [ @@ -321,7 +541,7 @@ def process_observations() -> None: ) logging.info("Saved annual_mean_global_obs.csv") - # --- Zonal mean annual CSV --- + # ---- Zonal mean annual CSV ---- logging.info("Building annual_mean_zonal_obs.csv") regions = { "global": [-90, 90], @@ -397,7 +617,7 @@ def process_observations() -> None: pd.DataFrame(rows).to_csv(obs_proc / "annual_mean_zonal_obs.csv", index=False) logging.info("Saved annual_mean_zonal_obs.csv") - # --- Monthly zonal CSV (LGM only — only dataset with monthly resolution) --- + # ---- Monthly zonal CSV (LGM lgmDA — only dataset with monthly resolution) ---- logging.info("Building monthly_mean_zonal_obs.csv") rows = [] for region, (lat_min, lat_max) in regions.items(): From 85ae8dea50793eb5e2e3a1bf28b74948e5fa763f Mon Sep 17 00:00:00 2001 From: Willa Tobin Date: Wed, 13 May 2026 08:50:37 -0700 Subject: [PATCH 3/5] paleo workflow refactor --- .gitignore | 5 +- paleo_scripts/README.md | 247 ++++-- paleo_scripts/download_model_data/lgm_pr.sh | 430 ++++++++++ paleo_scripts/download_model_data/lgm_tas.sh | 440 ++++++++++ .../download_model_data/lig127k_pr.sh | 718 ++++++++++++++++ .../download_model_data/lig127k_tas.sh | 718 ++++++++++++++++ .../download_model_data/midholocene_pr.sh | 789 ++++++++++++++++++ .../download_model_data/midholocene_tas.sh | 789 ++++++++++++++++++ paleo_scripts/download_paleo.py | 500 ----------- paleo_scripts/download_paleo_observations.py | 379 +++++++++ paleo_scripts/paleo_benchmark.py | 397 +++++---- paleo_scripts/process_paleo.py | 698 ---------------- paleo_scripts/process_paleo_models.py | 217 +++++ paleo_scripts/process_paleo_observations.py | 750 +++++++++++++++++ 14 files changed, 5624 insertions(+), 1453 deletions(-) create mode 100755 paleo_scripts/download_model_data/lgm_pr.sh create mode 100755 paleo_scripts/download_model_data/lgm_tas.sh create mode 100755 paleo_scripts/download_model_data/lig127k_pr.sh create mode 100755 paleo_scripts/download_model_data/lig127k_tas.sh create mode 100755 paleo_scripts/download_model_data/midholocene_pr.sh create mode 100755 paleo_scripts/download_model_data/midholocene_tas.sh delete mode 100644 paleo_scripts/download_paleo.py create mode 100644 paleo_scripts/download_paleo_observations.py delete mode 100644 paleo_scripts/process_paleo.py create mode 100644 paleo_scripts/process_paleo_models.py create mode 100644 paleo_scripts/process_paleo_observations.py diff --git a/.gitignore b/.gitignore index 414159e..4043a28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ observations results scratch.ipynb -paleo_data_cache \ No newline at end of file +paleo_data_cache +.DS_Store +pangeo-cmip6.csv +__pycache__ \ No newline at end of file diff --git a/paleo_scripts/README.md b/paleo_scripts/README.md index 819f299..80d57d1 100644 --- a/paleo_scripts/README.md +++ b/paleo_scripts/README.md @@ -1,127 +1,185 @@ # Paleoclimate Scripts -Tools for downloading and processing paleoclimate temperature data from CMIP6 model simulations and observational proxy datasets. +Five scripts cover the full paleo benchmark workflow: download observations, download model data, process both, then run benchmarks. + +--- ## Workflow -``` -python download_paleo.py --source all -python process_paleo.py --source all +```bash +cd paleo_scripts + +# Step 1 — Download proxy/reanalysis observations +python download_paleo_observations.py + +# Step 2 — Download CMIP6 model data (ESGF-generated wget scripts) +# Note: best to download and process model data one period/var at a time as the raw data is large. +cd download_model_data +bash lgm_tas.sh +bash lgm_pr.sh + +cd .. + +# Step 3 — Process observations into period-sorted folders +python process_paleo_observations.py + +# Step 4 — Compute monthly climatologies from raw model files +python process_paleo_models.py --model all --period all + +# Step 5 — Run benchmarks +python paleo_benchmark.py --model all --period all ``` Raw files land in `paleo_data_cache/raw/`, processed outputs in `paleo_data_cache/processed/`. --- -## Available Data +## Script Reference -### CMIP6 Model Simulations (`--source cmip6`) +### `download_paleo_observations.py` — Download proxy and reanalysis datasets -Monthly surface air temperature (`tas`) from PMIP4/CMIP6 paleoclimate experiments, downloaded from ESGF nodes. All files are SHA-256 verified. +```bash +python download_paleo_observations.py # all datasets +python download_paleo_observations.py --dataset lgmda lig127k +python download_paleo_observations.py --dry-run +python download_paleo_observations.py --list # show all dataset keys +``` -| Period | Description | Age | -|---|---|---| -| `lgm` | Last Glacial Maximum | ~21 ka | -| `lig127k` | Last Interglacial | ~127 ka | -| `midHolocene` | Mid-Holocene | ~6 ka | -| `midPliocene-eoi400` | Mid-Pliocene Warm Period | ~3 Ma | - -| Model | lgm | lig127k | midHolocene | midPliocene | -|-------------------|:-----:|:-------:|:-----------:|:-----------:| -| ACCESS-ESM1-5 | | ✓ | ✓ | | -| AWI-ESM-1-1-LR | ✓ | ✓ | ✓ | | -| CESM2 | | ✓ | ✓ | ✓ | -| CESM2-FV2 | ✓ | | | | -| CESM2-WACCM-FV2 | ✓ | | | | -| EC-Earth3-LR | | ✓ | ✓ | ✓ | -| FGOALS-f3-L | | ✓ | ✓ | | -| FGOALS-g3 | | ✓ | ✓ | | -| GISS-E2-1-G | | ✓ | ✓ | ✓ | -| HadGEM3-GC31-LL | | ✓ | ✓ | ✓ | -| INM-CM4-8 | ✓ | ✓ | ✓ | | -| IPSL-CM6A-LR | | ✓ | ✓ | ✓ | -| MIROC-ES2L | ✓ | | | | -| MPI-ESM1-2-LR | ✓ | | ✓ | | -| MRI-ESM2-0 | | | ✓ | | -| NESM3 | | ✓ | ✓ | | -| NorESM1-F | | ✓ | ✓ | ✓ | -| NorESM2-LM | | ✓ | ✓ | | - -Raw files: `paleo_data_cache/raw/{MODEL}/tas_Amon_*.nc` -Processed files: `paleo_data_cache/processed/{MODEL}/{period}_tas_annual.nc` and `{period}_tas_monthly.nc` +Downloads are skipped if the file already exists and its size is non-zero. 0-byte failed downloads are re-fetched. + +**Dataset keys:** `ipcc_ar6`, `lgmda`, `bartlein2011`, `temp12k`, `osman2021`, `sisal_v3`, `lig127k`, `scussolini2019`, `tierney_hansen` + +Raw files: `paleo_data_cache/raw/observations/` --- -### Observational Datasets (`--source observations`) +### `download_model_data/` — ESGF wget scripts -| Dataset | Period | Variable | Source | -|---|---|---|---| -| IPCC AR6 Fig 7.19 CSV | Eocene, Pliocene, LGM, LIG, midHolocene | Global mean GMST anomaly | [CEDA](https://dap.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118/) | -| Capron et al. 2021 | Last Interglacial (lig127k) | SST/SAT proxy anomalies by lat band | [Copernicus/CP](https://cp.copernicus.org/articles/17/63/2021/) | -| lgmDA v2.1 (Tierney et al.) | Last Glacial Maximum | Monthly absolute SAT (data assimilation) | [GitHub](https://github.com/jesstierney/lgmDA) | -| Temp12k (Kaufman et al. 2020) | Mid-Holocene (4–8 ka) | SAT reconstruction by lat band, 500 ensemble members | [NCEI](https://www.ncei.noaa.gov/access/paleo-search/study/29712) | +Model downloads use ESGF-generated wget scripts that embed per-file SHA-256 checksums and resume logic. Each script routes files into `paleo_data_cache/raw/models/{MODEL}/` automatically. -Raw files: `paleo_data_cache/raw/observations/` -Processed outputs: `paleo_data_cache/processed/observations/` +**Naming convention:** `{period}_{variable}.sh` -| Output file | Contents | +| Script | Models | |---|---| -| `annual_mean_global_obs.csv` | Global mean GMST anomaly ± error for all five periods | -| `annual_mean_zonal_obs.csv` | Area-weighted zonal mean anomalies for LGM, LIG, midHolocene across four regions | -| `monthly_mean_zonal_obs.csv` | Monthly zonal mean anomalies for LGM (only dataset with monthly resolution) | -| `LGM_da.nc` | Combined lgmDA LGM + late-Holocene absolute temperatures and std, gridded | +| `lgm_tas.sh` | AWI-ESM-1-1-LR, CESM2-FV2, CESM2-WACCM-FV2, INM-CM4-8, MIROC-ES2L, MPI-ESM1-2-LR | +| `lgm_pr.sh` | AWI-ESM-1-1-LR, CESM2-WACCM-FV2, INM-CM4-8, MIROC-ES2L, MPI-ESM1-2-LR | +| `midholocene_tas.sh` | ACCESS-ESM1-5, AWI-ESM-1-1-LR, CESM2, EC-Earth3-LR, FGOALS-f3-L, FGOALS-g3, GISS-E2-1-G, HadGEM3-GC31-LL, INM-CM4-8, IPSL-CM6A-LR, MIROC-ES2L, MPI-ESM1-2-LR, MRI-ESM2-0, NESM3, NorESM1-F, NorESM2-LM | +| `midholocene_pr.sh` | ACCESS-ESM1-5, AWI-ESM-1-1-LR, CESM2, EC-Earth3-LR, FGOALS-f3-L, FGOALS-g3, GISS-E2-1-G, HadGEM3-GC31-LL, INM-CM4-8, IPSL-CM6A-LR, MIROC-ES2L, MPI-ESM1-2-LR, MRI-ESM2-0, NESM3, NorESM1-F, NorESM2-LM | +| `lig127k_tas.sh` | ACCESS-ESM1-5, AWI-ESM-1-1-LR, CESM2, CNRM-CM6-1, EC-Earth3-LR, FGOALS-f3-L, FGOALS-g3, GISS-E2-1-G, HadGEM3-GC31-LL, INM-CM4-8, IPSL-CM6A-LR, MIROC-ES2L, NESM3, NorESM1-F, NorESM2-LM | +| `lig127k_pr.sh` | ACCESS-ESM1-5, AWI-ESM-1-1-LR, CESM2, CNRM-CM6-1, EC-Earth3-LR, FGOALS-f3-L, FGOALS-g3, GISS-E2-1-G, HadGEM3-GC31-LL, INM-CM4-8, IPSL-CM6A-LR, MIROC-ES2L, NESM3, NorESM1-F, NorESM2-LM | -Regions used for zonal means: `global`, `northern_hemisphere` (0–90°N), `tropics` (30°S–30°N), `southern_hemisphere` (90°S–0°). +Note: CESM2-FV2 has no `pr` data for lgm on ESGF — only `tas` was downloaded. --- -## Scripts - -### `download_paleo.py` — Download raw data +### `process_paleo_observations.py` — Process raw observations ```bash -# Download everything -python download_paleo.py --source all +python process_paleo_observations.py # all sources +python process_paleo_observations.py --source lgmda bartlein2011 +python process_paleo_observations.py --source all --log-level DEBUG +``` -# CMIP6 only — all models and periods -python download_paleo.py --source cmip6 --model all --period all +**Source keys:** `ipcc_ar6`, `tierney2020`, `lgmda`, `lgmr_sat`, `lgmr_sst`, `bartlein2011`, `temp12k`, `ottobliesner2021`, `scussolini2019` -# CMIP6 — specific model and period -python download_paleo.py --source cmip6 --model CESM2 --period lgm +**Output layout:** +``` +paleo_data_cache/processed/observations/ + lgm/ + lgmDA_v2.1_tas.nc vars: pi_tas, tas (anomaly), tas_std + LGMR_SAT_tas.nc vars: tas, tas_std + LGMR_SST_tos.nc vars: tos, tos_std + Bartlein2011_tas.nc vars: tas, tas_std, tas_sig_val + Bartlein2011_pr.nc vars: pr, pr_std, pr_sig_val + midHolocene/ + Bartlein2011_tas.nc + Bartlein2011_pr.nc + Temp12k_tas.nc vars: tas_anom, latband_weights + lig127k/ + OttoBliesner2021_tas.nc vars: tas, tas_std (site dimension) + Scussolini2019_pr.nc vars: pr, pr_reliability (site dimension) + multi_period/ + ipcc_ar6_fig7_19.csv + tierney2020_global_tas.csv + lgmDA_v2.1_holocene_tas.nc vars: pi_tas, pi_tas_std (PI reference) +``` -# Observations only -python download_paleo.py --source observations +Every NetCDF carries global attributes: `source`, `doi`, `source_url`, `variable`, `units`, `period`, `anomaly_ref`, `processing_date`. -# See all available model/period combinations -python download_paleo.py --list +--- -# Dry run (report what would be downloaded) -python download_paleo.py --dry-run --source cmip6 --model CESM2 --period lgm +### `process_paleo_models.py` — Compute monthly climatologies from raw model data + +```bash +python process_paleo_models.py # all models, all periods +python process_paleo_models.py --model AWI-ESM-1-1-LR --period lgm +python process_paleo_models.py --model AWI-ESM-1-1-LR --period lgm --variable pr +python process_paleo_models.py --model all --period all --overwrite +python process_paleo_models.py --model all --period lgm --delete-raw ``` -Downloads are skipped if the file already exists and its SHA-256 checksum matches. Partial downloads (`.part` files) are cleaned up on failure. +For each model/period/variable with raw files, concatenates all Amon chunks and computes a 12-month climatology. Annual mean is computed on the fly by callers. -### `process_paleo.py` — Process raw data into unified outputs +| Flag | Default | Description | +|---|---|---| +| `--model` | `all` | Model name(s) or `all` (discovers from `raw/models/` subdirs) | +| `--period` | `all` | `lgm`, `lig127k`, `midHolocene`, `midPliocene-eoi400`, or `all` | +| `--variable` | `all` | `tas`, `pr`, or `all` | +| `--overwrite` | False | Reprocess even if output already exists | +| `--delete-raw` | False | Delete raw source files after successful processing | -```bash -# Process everything -python process_paleo.py --source all +**Output layout:** +``` +paleo_data_cache/processed/models/ + {MODEL}/ + {period}_{variable}_monthly_climo.nc # shape: (month=12, lat, lon) +``` -# CMIP6 only — all periods -python process_paleo.py --source cmip6 --period all +--- -# CMIP6 only — specific period, keep raw files -python process_paleo.py --source cmip6 --period lgm --skip-cleanup +### `paleo_benchmark.py` — Spatial benchmark against proxy reconstructions -# Observations only -python process_paleo.py --source observations +Compares PMIP4/CMIP6 model climatologies against paleoclimate proxy and data assimilation products. Scores with RMSE, MAE, and CRPS (using proxy uncertainty as the forecast spread). + +```bash +python paleo_benchmark.py --model all --period all +python paleo_benchmark.py --model AWI-ESM-1-1-LR --period lgm +python paleo_benchmark.py --model MIROC-ES2L --period lgm --use-picontrol +python paleo_benchmark.py --model all --period lgm --obs-source lgmDA +python paleo_benchmark.py --model all --period lgm --obs-source Bartlein2011 --variable tas +python paleo_benchmark.py --model all --period all --save-to-cloud ``` -By default, raw `tas_Amon_*.nc` files are deleted after CMIP6 processing. Use `--skip-cleanup` to keep them. +| Flag | Default | Description | +|---|---|---| +| `--model` | `all` | Model name or `all` (discovers from `processed/models/`) | +| `--period` | `all` | `lgm`, `midHolocene`, `lig127k`, or `all` | +| `--obs-source` | all | Filter to specific observation dataset(s) | +| `--variable` | `all` | `tas`, `pr`, or `all` | +| `--use-picontrol` | False | Use model's own piControl (via DataFinder) as PI reference instead of lgmDA Holocene | +| `--save-to-cloud` | False | Save results to GCS `climatebench` bucket | +| `--overwrite` | False | Overwrite existing results CSV | + +**Observation sources by period:** + +| Period | Source key | Variable | Dataset | +|---|---|---|---| +| lgm | `lgmDA` | tas | Tierney et al. 2020 data assimilation (absolute + anomaly) | +| lgm | `LGMR_SAT` | tas | Osman et al. 2021 SAT reconstruction | +| lgm | `Bartlein2011` | tas, pr | Pollen-based MAT/MAP anomalies | +| midHolocene | `Bartlein2011` | tas, pr | Pollen-based MAT/MAP anomalies | +| midHolocene | `Temp12k` | tas | Kaufman et al. 2020 (stub — not yet implemented) | +| lig127k | `OttoBliesner2021` | tas | Otto-Bliesner et al. 2021 proxy anomalies | +| lig127k | `Scussolini2019` | pr | Scussolini et al. 2019 semi-quantitative precip | + +**Results:** `../results/paleo/{period}_paleo_benchmark_results.csv` +Columns: `model`, `period`, `dataset`, `variable`, `n_sites`, `rmse`, `mae`, `mean_crps`, `crps_skill` + +--- -### `paleo_constants.py` — Download registry +### `paleo_constants.py` — Model/period registry -Contains `PALEO_DOWNLOADS`: a nested dict `{model: {period: [(filename, url, sha256), ...]}}` with all 1001 CMIP6 ESGF download entries. Used by `download_paleo.py`. Not intended to be run directly. +Contains `PALEO_MODELS` and `PALEO_PERIODS` lists used by `paleo_benchmark.py`. Not run directly. --- @@ -129,16 +187,27 @@ Contains `PALEO_DOWNLOADS`: a nested dict `{model: {period: [(filename, url, sha ``` paleo_scripts/ -├── download_paleo.py # Download raw data -├── process_paleo.py # Process raw → unified outputs -├── paleo_constants.py # CMIP6 ESGF file registry +├── download_paleo_observations.py # Step 1: download proxy/reanalysis data +├── download_model_data/ # Step 2: ESGF wget scripts per period/variable +│ ├── lgm_tas.sh +│ ├── lgm_pr.sh +│ └── ... +├── process_paleo_observations.py # Step 3: process raw observations +├── process_paleo_models.py # Step 4: compute model climatologies +├── paleo_benchmark.py # Step 5: run spatial benchmarks +├── paleo_constants.py # Model/period registry ├── README.md └── paleo_data_cache/ ├── raw/ - │ ├── {MODEL}/ # Raw tas_Amon_*.nc per model - │ └── observations/ # Downloaded proxy/reanalysis files - │ └── lig127k/ # LIG127k Excel tables + │ ├── models/ + │ │ └── {MODEL}/ # Raw tas_Amon_*.nc, pr_Amon_*.nc chunks + │ └── observations/ # Downloaded proxy/reanalysis files └── processed/ - ├── {MODEL}/ # {period}_tas_annual.nc, {period}_tas_monthly.nc - └── observations/ # annual_mean_global_obs.csv, LGM_da.nc, etc. + ├── models/ + │ └── {MODEL}/ # {period}_{variable}_monthly_climo.nc + └── observations/ + ├── lgm/ + ├── midHolocene/ + ├── lig127k/ + └── multi_period/ ``` diff --git a/paleo_scripts/download_model_data/lgm_pr.sh b/paleo_scripts/download_model_data/lgm_pr.sh new file mode 100755 index 0000000..d3bde81 --- /dev/null +++ b/paleo_scripts/download_model_data/lgm_pr.sh @@ -0,0 +1,430 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 16:15:14 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lgm.r1i1p1f1.Amon.pr.gn.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.lgm.r1i1p1f1.Amon.pr.gr1.v20190802|eagle.alcf.anl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.lgm.r1i1p1f2.Amon.pr.gn.v20191002|esgf-node.ornl.gov', 'CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.lgm.r1i1p1f1.Amon.pr.gn.v20190710|eagle.alcf.anl.gov', 'CMIP6.PMIP.NCAR.CESM2-WACCM-FV2.lgm.r1i2p2f1.Amon.pr.gn.v20220915|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: pr_Amon_{MODEL}_lgm_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 50 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_model_data/lgm_tas.sh b/paleo_scripts/download_model_data/lgm_tas.sh new file mode 100755 index 0000000..6d4b901 --- /dev/null +++ b/paleo_scripts/download_model_data/lgm_tas.sh @@ -0,0 +1,440 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 16:49:12 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lgm.r1i1p1f1.Amon.tas.gn.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.lgm.r1i1p1f1.Amon.tas.gr1.v20190802|eagle.alcf.anl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.lgm.r1i1p1f2.Amon.tas.gn.v20191002|eagle.alcf.anl.gov', 'CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.lgm.r1i1p1f1.Amon.tas.gn.v20190710|esgf-node.ornl.gov', 'CMIP6.PMIP.NCAR.CESM2-FV2.lgm.r1i2p2f1.Amon.tas.gn.v20220915|esgf-node.ornl.gov', 'CMIP6.PMIP.NCAR.CESM2-WACCM-FV2.lgm.r1i2p2f1.Amon.tas.gn.v20220915|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: tas_Amon_{MODEL}_lgm_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 60 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_model_data/lig127k_pr.sh b/paleo_scripts/download_model_data/lig127k_pr.sh new file mode 100755 index 0000000..0b60119 --- /dev/null +++ b/paleo_scripts/download_model_data/lig127k_pr.sh @@ -0,0 +1,718 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 17:40:08 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lig127k.r1i1p1f1.Amon.pr.gn.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-f3-L.lig127k.r1i1p1f1.Amon.pr.gr.v20191025|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.lig127k.r1i1p1f1.Amon.pr.gn.v20191030|esgf-node.ornl.gov', 'CMIP6.PMIP.CNRM-CERFACS.CNRM-CM6-1.lig127k.r1i1p1f2.Amon.pr.gr.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.lig127k.r1i1p1f1.Amon.pr.gn.v20191206|esgf-node.ornl.gov', 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.lig127k.r1i1p1f1.Amon.pr.gr.v20200409|esgf-node.ornl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.lig127k.r1i1p1f1.Amon.pr.gr1.v20190802|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.lig127k.r1i1p1f1.Amon.pr.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.lig127k.r1i1p1f2.Amon.pr.gn.v20191118|esgf-node.ornl.gov', 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.lig127k.r1i1p1f1.Amon.pr.gn.v20190916|esgf-node.ornl.gov', 'CMIP6.PMIP.NCAR.CESM2.lig127k.r1i1p1f1.Amon.pr.gn.v20190923|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM1-F.lig127k.r1i1p1f1.Amon.pr.gn.v20190920|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM2-LM.lig127k.r1i1p1f1.Amon.pr.gn.v20191108|esgf-node.ornl.gov', 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.lig127k.r1i1p1f1.Amon.pr.gn.v20210114|esgf-node.ornl.gov', 'CMIP6.PMIP.NUIST.NESM3.lig127k.r1i1p1f1.Amon.pr.gn.v20190909|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: pr_Amon_{MODEL}_lig127k_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 338 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_model_data/lig127k_tas.sh b/paleo_scripts/download_model_data/lig127k_tas.sh new file mode 100755 index 0000000..19c0be2 --- /dev/null +++ b/paleo_scripts/download_model_data/lig127k_tas.sh @@ -0,0 +1,718 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 16:56:40 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.lig127k.r1i1p1f1.Amon.tas.gn.v20200212|eagle.alcf.anl.gov', 'CMIP6.PMIP.CAS.FGOALS-f3-L.lig127k.r1i1p1f1.Amon.tas.gr.v20191025|eagle.alcf.anl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.lig127k.r1i1p1f1.Amon.tas.gn.v20191030|esgf-node.ornl.gov', 'CMIP6.PMIP.CNRM-CERFACS.CNRM-CM6-1.lig127k.r1i1p1f2.Amon.tas.gr.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.lig127k.r1i1p1f1.Amon.tas.gn.v20191206|esgf-node.ornl.gov', 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.lig127k.r1i1p1f1.Amon.tas.gr.v20200409|eagle.alcf.anl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.lig127k.r1i1p1f1.Amon.tas.gr1.v20190802|eagle.alcf.anl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.lig127k.r1i1p1f1.Amon.tas.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.lig127k.r1i1p1f2.Amon.tas.gn.v20191118|eagle.alcf.anl.gov', 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.lig127k.r1i1p1f1.Amon.tas.gn.v20190916|eagle.alcf.anl.gov', 'CMIP6.PMIP.NCAR.CESM2.lig127k.r1i1p1f1.Amon.tas.gn.v20190923|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM1-F.lig127k.r1i1p1f1.Amon.tas.gn.v20190920|eagle.alcf.anl.gov', 'CMIP6.PMIP.NCC.NorESM2-LM.lig127k.r1i1p1f1.Amon.tas.gn.v20191108|eagle.alcf.anl.gov', 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.lig127k.r1i1p1f1.Amon.tas.gn.v20210114|eagle.alcf.anl.gov', 'CMIP6.PMIP.NUIST.NESM3.lig127k.r1i1p1f1.Amon.tas.gn.v20190909|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: tas_Amon_{MODEL}_lig127k_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 338 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_model_data/midholocene_pr.sh b/paleo_scripts/download_model_data/midholocene_pr.sh new file mode 100755 index 0000000..2d08b3c --- /dev/null +++ b/paleo_scripts/download_model_data/midholocene_pr.sh @@ -0,0 +1,789 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 17:46:29 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.midHolocene.r1i1p1f1.Amon.pr.gn.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-f3-L.midHolocene.r1i1p1f1.Amon.pr.gr.v20191025|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r1i1p1f1.Amon.pr.gn.v20191024|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r2i1p1f1.Amon.pr.gn.v20191024|esgf-node.ornl.gov', 'CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.midHolocene.r1i1p1f1.Amon.pr.gn.v20210422|esgf-node.ornl.gov', 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.midHolocene.r1i1p1f1.Amon.pr.gr.v20200409|esgf-node.ornl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.midHolocene.r1i1p1f1.Amon.pr.gr1.v20190802|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f1.Amon.pr.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f2.Amon.pr.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f3.Amon.pr.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f4.Amon.pr.gr.v20191118|esgf-node.ornl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.midHolocene.r1i1p1f2.Amon.pr.gn.v20191002|esgf-node.ornl.gov', 'CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.midHolocene.r1i1p1f1.Amon.pr.gn.v20190710|esgf-node.ornl.gov', 'CMIP6.PMIP.MRI.MRI-ESM2-0.midHolocene.r1i1p1f1.Amon.pr.gn.v20190919|esgf-node.ornl.gov', 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.midHolocene.r1i1p1f1.Amon.pr.gn.v20190916|esgf-node.ornl.gov', 'CMIP6.PMIP.NCAR.CESM2.midHolocene.r1i1p1f1.Amon.pr.gn.v20190923|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM1-F.midHolocene.r1i1p1f1.Amon.pr.gn.v20190920|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM2-LM.midHolocene.r1i1p1f1.Amon.pr.gn.v20191108|esgf-node.ornl.gov', 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.midHolocene.r1i1p1f1.Amon.pr.gn.v20210111|esgf-node.ornl.gov', 'CMIP6.PMIP.NUIST.NESM3.midHolocene.r1i1p1f1.Amon.pr.gn.v20190813|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: pr_Amon_{MODEL}_midHolocene_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 409 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_model_data/midholocene_tas.sh b/paleo_scripts/download_model_data/midholocene_tas.sh new file mode 100755 index 0000000..f30d27f --- /dev/null +++ b/paleo_scripts/download_model_data/midholocene_tas.sh @@ -0,0 +1,789 @@ +#!/bin/bash +############################################################################## +# ESGF wget download script +# +# Template version: 0.4 +# Generated by metagrid.esgf-west.org - 2026/05/12 17:48:55 +# Search URL: http://metagrid.esgf-west.org/proxy/wget +# Request method: POST +# +############################################################################### +# first be sure it's bash... anything out of bash or sh will break +# and the test will assure we are not using sh instead of bash +if [ $BASH ] && [ `basename $BASH` != bash ]; then + echo "######## This is a bash script! ##############" + echo "Change the execution bit 'chmod u+x $0' or start with 'bash $0' instead of sh." + echo "Trying to recover automatically..." + sleep 1 + /bin/bash $0 $@ + exit $? +fi + +version=0.4 +CACHE_FILE=.$(basename $0).status +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TARGET_DIR="${SCRIPT_DIR}/../paleo_data_cache/raw/models" +search_url='http://metagrid.esgf-west.org/proxy/wget' +request_method='POST' +url_params=( + '['CMIP6.PMIP.AWI.AWI-ESM-1-1-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20200212|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-f3-L.midHolocene.r1i1p1f1.Amon.tas.gr.v20191025|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r1i1p1f1.Amon.tas.gn.v20191024|esgf-node.ornl.gov', 'CMIP6.PMIP.CAS.FGOALS-g3.midHolocene.r2i1p1f1.Amon.tas.gn.v20191024|esgf-node.ornl.gov', 'CMIP6.PMIP.CSIRO.ACCESS-ESM1-5.midHolocene.r1i1p1f1.Amon.tas.gn.v20210422|esgf-node.ornl.gov', 'CMIP6.PMIP.EC-Earth-Consortium.EC-Earth3-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20200409|esgf-node.ornl.gov', 'CMIP6.PMIP.INM.INM-CM4-8.midHolocene.r1i1p1f1.Amon.tas.gr1.v20190802|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f1.Amon.tas.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f2.Amon.tas.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f3.Amon.tas.gr.v20180926|esgf-node.ornl.gov', 'CMIP6.PMIP.IPSL.IPSL-CM6A-LR.midHolocene.r1i1p1f4.Amon.tas.gr.v20191118|esgf-node.ornl.gov', 'CMIP6.PMIP.MIROC.MIROC-ES2L.midHolocene.r1i1p1f2.Amon.tas.gn.v20191002|esgf-node.ornl.gov', 'CMIP6.PMIP.MPI-M.MPI-ESM1-2-LR.midHolocene.r1i1p1f1.Amon.tas.gn.v20190710|esgf-node.ornl.gov', 'CMIP6.PMIP.MRI.MRI-ESM2-0.midHolocene.r1i1p1f1.Amon.tas.gn.v20190919|esgf-node.ornl.gov', 'CMIP6.PMIP.NASA-GISS.GISS-E2-1-G.midHolocene.r1i1p1f1.Amon.tas.gn.v20190916|esgf-node.ornl.gov', 'CMIP6.PMIP.NCAR.CESM2.midHolocene.r1i1p1f1.Amon.tas.gn.v20190923|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM1-F.midHolocene.r1i1p1f1.Amon.tas.gn.v20190920|esgf-node.ornl.gov', 'CMIP6.PMIP.NCC.NorESM2-LM.midHolocene.r1i1p1f1.Amon.tas.gn.v20191108|esgf-node.ornl.gov', 'CMIP6.PMIP.NERC.HadGEM3-GC31-LL.midHolocene.r1i1p1f1.Amon.tas.gn.v20210111|esgf-node.ornl.gov', 'CMIP6.PMIP.NUIST.NESM3.midHolocene.r1i1p1f1.Amon.tas.gn.v20190813|esgf-node.ornl.gov']' +) + +#These are the embedded files to be downloaded +download_files="$(cat < 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +check_commands() { + #check wget + local MIN_WGET_VERSION=1.10 + vercomp $(wget -V | sed -n 's/^.* \([1-9]\.[0-9.]*\) .*$/\1/p') $MIN_WGET_VERSION + case $? in + 2) #lower + wget -V + echo + echo "** ERROR: wget version is too old. Use version $MIN_WGET_VERSION or greater. **" >&2 + exit 1 + esac +} + +usage() { + echo "Usage: $(basename $0) [flags]" + echo "Flags is one of:" + sed -n '/^while getopts/,/^done/ s/^\([^)]*\)[^#]*#\(.*$\)/\1 \2/p' $0 + echo + echo "This command stores the states of the downloads in .$0.status" +} + +#defaults +debug=0 +clean_work=1 + +#parse flags +while getopts 'F:w:iuUnSpdvqh' OPT; do + case $OPT in + F) input_file="$OPTARG";; # : read input from file instead of the embedded one (use - to read from stdin) + w) output="$OPTARG";; # : Write embedded files into a file and exit + i) insecure=1;; # : set insecure mode, i.e. don't check server certificate + u) update=1;; # : Issue the search again and see if something has changed. + U) update_files=1;; # : Update files from server overwriting local ones (detect with -u) + n) dry_run=1;; # : Don't download any files, just report. + S) skip_checksum=1;; # : Skip file checksum + p) clean_work=0;; # : preserve data that failed checksum + d) verbose=1;debug=1;; # : display debug information + v) verbose=1;; # : be more verbose + q) quiet=1;; # : be less verbose + h) usage && exit 0;; # : displays this help + \?) echo "Unknown option '$OPTARG'" >&2 && usage && exit 1;; + \:) echo "Missing parameter for flag '$OPTARG'" >&2 && usage && exit 1;; + esac +done +shift $(($OPTIND - 1)) + +#setup input as desired by the user +if [[ "$input_file" ]]; then + if [[ "$input_file" == '-' ]]; then + download_files="$(cat)" #read from STDIN + exec 0$output + exit +fi + +#assure we have everything we need +check_commands + +if ((update)); then + echo "Checking the server for changes..." + post_data=$(IFS="&" ; echo "${url_params[*]}") + new_wget="$(wget --post-data "$post_data" "$search_url" -qO -)" + compare_cmd="grep -vE '^(# Generated by|# Search URL|search_url=)'" + if diff -q <(eval $compare_cmd<<<"$new_wget") <(eval $compare_cmd $0) >/dev/null; then + echo "No changes detected." + else + echo "Wget was changed. Dowloading. (old renamed to $0.old.#N)" + counter=0 + while [[ -f $0.old.$counter ]]; do ((counter++)); done + mv $0 $0.old.$counter + echo "$new_wget" > $0 + fi + exit 0 +fi + +check_chksum() { + local file="$1" + local chk_type=$2 + local chk_value=$3 + local local_chksum=Unknown + + case $chk_type in + md5) local_chksum=$(md5sum_ $file | cut -f1 -d" ");; + sha256) local_chksum=$(sha256sum_ $file|awk '{print $1}'|cut -d ' ' -f1);; + *) echo "Can't verify checksum." && return 0;; + esac + + #verify + ((debug)) && echo "local:$local_chksum vs remote:$chk_value" >&2 + echo $local_chksum +} + +#Our own md5sum function call that takes into account machines that don't have md5sum but do have md5 (i.e. mac os x) +md5sum_() { + hash -r + if type md5sum >& /dev/null; then + echo $(md5sum $@) + else + echo $(md5 $@ | sed -n 's/MD5[ ]*\(.*\)[^=]*=[ ]*\(.*$\)/\2 \1/p') + fi +} + +#Our own sha256sum function call that takes into account machines that don't have sha256sum but do have sha2 (i.e. mac os x) +sha256sum_() { + hash -r + if type sha256sum >& /dev/null; then + echo $(sha256sum $@) + elif type shasum >& /dev/null; then + echo $(shasum -a 256 $@) + else + echo $(sha2 -q -256 $@) + fi +} + +get_mod_time_() { + if ((MACOSX)); then + #on a mac modtime is stat -f %m + echo "$(stat -f %m $@)" + else + #on linux (cygwin) modtime is stat -c %Y + echo "$(stat -c %Y $@)" + fi + return 0; +} + +remove_from_cache() { + local entry="$1" + local tmp_file="$(grep -ve "^$entry" "$CACHE_FILE")" + echo "$tmp_file" > "$CACHE_FILE" + unset cached +} + +download() { + wget="wget ${insecure:+--no-check-certificate} ${quiet:+-q} ${quiet:--v}" + + while read line + do + # read csv here document into proper variables + eval $(awk -F "' '" '{$0=substr($0,2,length($0)-2); $3=tolower($3); print "file=\""$1"\";url=\""$2"\";chksum_type=\""$3"\";chksum=\""$4"\""}' <(echo $line) ) + + # Route into per-model subdirectory: tas_Amon_{MODEL}_midHolocene_... → raw/models/{MODEL}/ + model=$(echo "$file" | cut -d_ -f3) + file="${TARGET_DIR}/${model}/${file}" + + #Process the file + echo -n "$file ..." + + #get the cached entry if any. + cached="$(grep -e "^$file" "$CACHE_FILE")" + + #if we have the cache entry but no file, clean it. + if [[ ! -f $file && "$cached" ]]; then + #the file was removed, clean the cache + remove_from_cache "$file" + unset cached + fi + + #check it wasn't modified + if [[ -n "$cached" && "$(get_mod_time_ $file)" == $(echo "$cached" | cut -d ' ' -f2) ]]; then + if [[ "$chksum" == "$(echo "$cached" | cut -d ' ' -f3)" ]]; then + echo "Already downloaded and verified" + continue + elif ((update_files)); then + #user want's to overwrite newer files + rm $file + remove_from_cache "$file" + unset cached + else + #file on server is different from what we have. + echo "WARNING: The remote file was changed (probably a new version is available). Use -U to Update/overwrite" + continue + fi + fi + unset chksum_err_value chksum_err_count + + while : ; do + # (if we had the file size, we could check before trying to complete) + echo "Downloading" + [[ ! -d "$(dirname "$file")" ]] && mkdir -p "$(dirname "$file")" + if ((dry_run)); then + #all important info was already displayed, if in dry_run mode just abort + #No status will be stored + break + else + $wget -O "$file" $url || { failed=1; break; } + fi + + #check if file is there + if [[ -f $file ]]; then + ((debug)) && echo file found + if ((skip_checksum)); then + echo "Skipping check of file checksum" + break + fi + if [[ ! "$chksum" ]]; then + echo "Checksum not provided, can't verify file integrity" + break + fi + result_chksum=$(check_chksum "$file" $chksum_type $chksum) + if [[ "$result_chksum" != "$chksum" ]]; then + echo " $chksum_type failed!" + if ((clean_work)); then + if !((chksum_err_count)); then + chksum_err_value=$result_chksum + chksum_err_count=2 + elif ((checksum_err_count--)); then + if [[ "$result_chksum" != "$chksum_err_value" ]]; then + #this is a real transmission problem + chksum_err_value=$result_chksum + chksum_err_count=2 + fi + else + #ok if here we keep getting the same "different" checksum + echo "The file returns always a different checksum!" + echo "Contact the data owner to verify what is happening." + echo + sleep 1 + break + fi + + rm $file + #try again + echo -n " re-trying..." + continue + else + echo " don't use -p or remove manually." + fi + else + echo " $chksum_type ok. done!" + echo "$file" $(get_mod_time_ "$file") $chksum >> $CACHE_FILE + fi + fi + #done! + break + done + + if ((failed)); then + echo "download failed" + unset failed + fi + + done <<<"$download_files" + +} + +dedup_cache_() { + local file=${1:-${CACHE_FILE}} + ((debug)) && echo "dedup'ing cache ${file} ..." + local tmp=$(LC_ALL='C' sort -r -k1,2 $file | awk '!($1 in a) {a[$1];print $0}' | sort -k2,2) + ((DEBUG)) && echo "$tmp" + echo "$tmp" > $file + ((debug)) && echo "(cache dedup'ed)" +} + +#do we have old results? Create the file if not +[ ! -f $CACHE_FILE ] && echo "#filename mtime checksum" > $CACHE_FILE && chmod 666 $CACHE_FILE + +# +# MAIN +# + +echo "Running $(basename $0) version: $version" +((verbose)) && echo "we use other tools in here, don't try to user their proposed 'options' directly" +echo "Use $(basename $0) -h for help."$'\n' + +cat <<'EOF-MESSAGE' +Script created for 409 file(s) +(The count won't match if you manually edit this file!) + +EOF-MESSAGE +sleep 1 + +check_os + +download + +dedup_cache_ + +echo "done" diff --git a/paleo_scripts/download_paleo.py b/paleo_scripts/download_paleo.py deleted file mode 100644 index 3caf3c6..0000000 --- a/paleo_scripts/download_paleo.py +++ /dev/null @@ -1,500 +0,0 @@ -#!/usr/bin/env python3 -""" -Download raw paleoclimate data. - -Downloads two categories of data into paleo_data_cache/raw/: - cmip6 CMIP6 PMIP tas model simulations from ESGF - → paleo_data_cache/raw/{MODEL}/tas_Amon_*.nc - observations Proxy/reanalysis observational datasets - → paleo_data_cache/raw/observations/ - -Usage: - python download_paleo.py --source all - python download_paleo.py --source cmip6 --model all --period all - python download_paleo.py --source cmip6 --model CESM2 --period lgm - python download_paleo.py --source observations - python download_paleo.py --list - python download_paleo.py --dry-run --source cmip6 --model CESM2 --period lig127k -""" - -import argparse -import hashlib -import logging -import shutil -import subprocess -import sys -import urllib.error -import urllib.request -from pathlib import Path - -import pandas as pd - -from paleo_constants import PALEO_DOWNLOADS, PALEO_MODELS, PALEO_PERIODS - -RAW_DIR = Path(__file__).parent / "paleo_data_cache" / "raw" -PANGEO_CATALOG_URL = "https://storage.googleapis.com/cmip6/pangeo-cmip6.csv" -PANGEO_CATALOG_PATH = Path(__file__).parent / "paleo_data_cache" / "pangeo-cmip6.csv" - -OBS_DOWNLOADS = { - "Figure7_19_obs.csv": "https://dap.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118/Figure7_19_obs.csv", - "lgmDA_lgm_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.1/lgmDA_lgm_ATM_monthly_climo.nc", - "lgmDA_hol_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.0/lgmDA_hol_ATM_monthly_climo.nc", - "temp12k_alldata.nc": "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/kaufman2020/temp12k_alldata.nc", - "bartlein2011_pollen_climate_recon.zip": "https://static-content.springer.com/esm/art%3A10.1007%2Fs00382-010-0904-1/MediaObjects/382_2010_904_MOESM2_ESM.zip", - "THansenMethod.csv": "https://raw.githubusercontent.com/jesstierney/PastClimates/master/THansenMethod.csv", -} -TEMP12K_V1_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/climate12k/temperature/version1.0.0/" -TEMP12K_V1_FILES = [ - "Temp12k_v1_0_0.pkl", - "Temp12k_v1_essential_metadata_NOAA.csv", - "Temp12k_v1_record_list_NOAA.csv", -] -OSMAN2021_BASE_URL = ( - "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/osman2021/" -) -OSMAN2021_FILES = [ - "LGMR_GMST_climo.nc", - "LGMR_GMST_ens.nc", - "LGMR_SAT_climo.nc", - "LGMR_SST_climo.nc", -] -SISAL_V3_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/speleothem/SISAL-v3/" -SISAL_V3_FILES = [ - "sisalv3_database_mysql_csv.zip", - "sisalv3_codes.zip", -] -LIG127K_ZIP_URL = ( - "https://cp.copernicus.org/articles/17/63/2021/cp-17-63-2021-supplement.zip" -) -# Otto-Bliesner et al. (2021), Clim. Past 17, 63–88, doi:10.5194/cp-17-63-2021 -# Tables S2–S4: annual temperature anomalies by latitude band -# Tables S5–S6: JJA temperature anomalies for NH oceans and terrestrial sites -LIG127K_TABLES = [ - "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", - "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", - "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", - "Table S5. JJA - NH Oceans (40-90N) JJA_CP-2019-174.xlsx", - "Table S6. JJA - NH terrestrial (40-90N) JJA__CP-2019-174.xlsx", -] - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _sha256(path: Path) -> str: - h = hashlib.sha256() - with open(path, "rb") as f: - for chunk in iter(lambda: f.read(1 << 20), b""): - h.update(chunk) - return h.hexdigest() - - -def _wget_simple(url: str, dest: Path) -> None: - """Download url to dest, skip if dest already exists.""" - if dest.exists(): - logging.info(f" [skip] {dest.name}") - return - logging.info(f" Downloading {dest.name}") - subprocess.run(["wget", "-q", "-O", str(dest), url], check=True) - - -# --------------------------------------------------------------------------- -# Pangeo / GCS helpers -# --------------------------------------------------------------------------- - - -def _get_pangeo_catalog() -> pd.DataFrame | None: - """Return the Pangeo CMIP6 catalog, downloading it once if needed.""" - if not PANGEO_CATALOG_PATH.exists(): - PANGEO_CATALOG_PATH.parent.mkdir(parents=True, exist_ok=True) - logging.info(" Downloading Pangeo CMIP6 catalog...") - try: - urllib.request.urlretrieve(PANGEO_CATALOG_URL, PANGEO_CATALOG_PATH) - except Exception as e: - logging.warning(f" Could not fetch Pangeo catalog: {e}") - return None - return pd.read_csv(PANGEO_CATALOG_PATH) - - -def _download_cmip6_from_gcs( - model: str, period: str, dest_dir: Path, catalog: pd.DataFrame -) -> bool: - """Fallback: stream PMIP tas from the Pangeo GCS Zarr store into a single NetCDF. - - Returns True if a file was written or already existed, False on failure. - The output file is named tas_Amon_{model}_{period}_{member}_{grid}_full.nc - so that process_paleo.py's glob("tas_Amon_*.nc") picks it up correctly. - If the GCS download succeeds, any partial ESGF .nc files for this - model/period are removed to prevent duplicate time ranges during load. - """ - sub = catalog[ - (catalog["source_id"] == model) - & (catalog["experiment_id"] == period) - & (catalog["variable_id"] == "tas") - & (catalog["table_id"] == "Amon") - ] - if sub.empty: - return False - - row = sub.sort_values("version", ascending=False).iloc[0] - zstore = row["zstore"] - member = row.get("member_id", "r1i1p1f1") - grid = row.get("grid_label", "gn") - out_name = f"tas_Amon_{model}_{period}_{member}_{grid}_full.nc" - out_path = dest_dir / out_name - - if out_path.exists(): - logging.info(f" [skip] {out_name} (GCS full file)") - return True - - try: - import gcsfs - import xarray as xr - - fs = gcsfs.GCSFileSystem(token="anon") - store = fs.get_mapper(zstore) - logging.info(f" [gcs] Streaming {model}/{period} from Pangeo → {out_name}") - ds = xr.open_zarr(store, consolidated=True) - dest_dir.mkdir(parents=True, exist_ok=True) - ds[["tas"]].to_netcdf(out_path) - logging.info(f" [gcs] Saved {out_name}") - - # Remove any partial ESGF files to avoid mixing time ranges on load - removed = 0 - for esgf_nc in dest_dir.glob(f"tas_Amon_{model}_{period}_*.nc"): - if esgf_nc != out_path: - esgf_nc.unlink() - removed += 1 - if removed: - logging.info(f" [gcs] Removed {removed} partial ESGF file(s)") - - return True - except Exception as e: - logging.error(f" [gcs] Failed for {model}/{period}: {e}") - return False - - -# --------------------------------------------------------------------------- -# CMIP6 -# --------------------------------------------------------------------------- - - -def _download_cmip6_file( - url: str, dest: Path, expected_checksum: str, dry_run: bool -) -> bool: - if dest.exists(): - if _sha256(dest) == expected_checksum.lower(): - logging.info(f" [skip] {dest.name} (verified)") - return True - logging.info(f" [redownload] {dest.name} (checksum mismatch)") - - if dry_run: - logging.info(f" [dry-run] {url}") - return True - - dest.parent.mkdir(parents=True, exist_ok=True) - tmp = dest.with_suffix(dest.suffix + ".part") - logging.info(f" Downloading {dest.name}") - try: - req = urllib.request.Request(url, headers={"User-Agent": "wget/1.21"}) - with urllib.request.urlopen(req, timeout=300) as resp, open(tmp, "wb") as out: - while chunk := resp.read(1 << 20): - out.write(chunk) - except urllib.error.URLError as e: - logging.error(f" ERROR: {e}") - tmp.unlink(missing_ok=True) - return False - - actual = _sha256(tmp) - if actual != expected_checksum.lower(): - logging.error( - f" Checksum mismatch for {dest.name}: expected {expected_checksum.lower()}, got {actual}" - ) - tmp.unlink() - return False - - tmp.rename(dest) - logging.info(f" OK {dest.name}") - return True - - -def download_cmip6(models: list[str], periods: list[str], dry_run: bool) -> bool: - catalog = _get_pangeo_catalog() - ran = skipped = gcs_ok = esgf_failed = 0 - - for model in models: - for period in periods: - entries = PALEO_DOWNLOADS.get(model, {}).get(period) - if not entries: - logging.debug(f"No CMIP6 data for {model}/{period}, skipping") - skipped += 1 - continue - - dest_dir = RAW_DIR / model - - # If a GCS full file already exists, nothing more to do - if list(dest_dir.glob(f"tas_Amon_{model}_{period}_*_full.nc")): - logging.info( - f"\n{'='*60}\n CMIP6 {model} / {period} [skip — GCS file present]\n{'='*60}" - ) - ran += 1 - continue - - logging.info( - f"\n{'='*60}\n CMIP6 {model} / {period} ({len(entries)} ESGF files)\n{'='*60}" - ) - - # Attempt ESGF downloads - failures = [] - for filename, url, checksum in entries: - if not _download_cmip6_file( - url, dest_dir / filename, checksum, dry_run - ): - failures.append(filename) - - if failures and not dry_run: - logging.warning( - f" {len(failures)}/{len(entries)} ESGF file(s) failed — " - "trying Pangeo GCS fallback" - ) - if catalog is not None and _download_cmip6_from_gcs( - model, period, dest_dir, catalog - ): - gcs_ok += 1 - else: - esgf_failed += len(failures) - if ( - catalog is None - or catalog[ - (catalog["source_id"] == model) - & (catalog["experiment_id"] == period) - & (catalog["variable_id"] == "tas") - ].empty - ): - logging.error( - f" {model}/{period} is not in the Pangeo GCS catalog.\n" - " To download manually:\n" - " 1. Visit https://esgf-node.llnl.gov/search/cmip6/\n" - " 2. Filter: activity=PMIP, source_id, experiment_id, variable=tas\n" - " 3. Download files and place them in:\n" - f" {dest_dir}/" - ) - - ran += 1 - - logging.info( - f"CMIP6: {ran} combination(s), {skipped} skipped, " - f"{gcs_ok} via GCS fallback, {esgf_failed} file error(s)." - ) - return esgf_failed == 0 - - -# --------------------------------------------------------------------------- -# Observations -# --------------------------------------------------------------------------- - - -def download_observations(dry_run: bool) -> bool: - obs_dir = RAW_DIR / "observations" - lig_dir = obs_dir / "lig127k" - - if dry_run: - logging.info( - "[dry-run] would download observational datasets to paleo_data_cache/raw/observations/" - ) - return True - - osman_dir = obs_dir / "osman2021" - temp12k_dir = obs_dir / "climate12k" - sisal_dir = obs_dir / "sisal_v3" - - obs_dir.mkdir(parents=True, exist_ok=True) - lig_dir.mkdir(exist_ok=True) - osman_dir.mkdir(exist_ok=True) - temp12k_dir.mkdir(exist_ok=True) - sisal_dir.mkdir(exist_ok=True) - - for filename, url in OBS_DOWNLOADS.items(): - _wget_simple(url, obs_dir / filename) - - # Scussolini et al. 2019 — Science.org blocks automated downloads. - # wget produces a 0-byte file; the real download lands as the original - # Science.org filename (aax7047_external_database_s1.xlsx) when done via - # a browser. Rename it to the canonical name if found. - scussolini_dest = obs_dir / "scussolini2019_lig_precip_proxy.xlsx" - scussolini_orig = obs_dir / "aax7047_external_database_s1.xlsx" - if scussolini_dest.exists() and scussolini_dest.stat().st_size > 0: - logging.info(f" [skip] {scussolini_dest.name}") - elif scussolini_orig.exists() and scussolini_orig.stat().st_size > 0: - if scussolini_dest.exists(): - scussolini_dest.unlink() # remove 0-byte placeholder - scussolini_orig.rename(scussolini_dest) - logging.info( - " Renamed aax7047_external_database_s1.xlsx → scussolini2019_lig_precip_proxy.xlsx" - ) - else: - logging.warning( - "\n" - " ACTION REQUIRED: scussolini2019_lig_precip_proxy.xlsx must be downloaded manually.\n" - " Science.org blocks automated downloads for this file.\n" - "\n" - " 1. Copy and paste this URL into your browser:\n" - " https://www.science.org/doi/suppl/10.1126/sciadv.aax7047/suppl_file/aax7047_external_database_s1.xlsx\n" - " 2. Save the file (it will download as aax7047_external_database_s1.xlsx).\n" - " 3. Move it to:\n" - f" {scussolini_dest}\n" - ) - - # Kaufman et al. 2020 Temp12k v1.0.0 full database (NCEI study 27330) - for filename in TEMP12K_V1_FILES: - _wget_simple(TEMP12K_V1_BASE_URL + filename, temp12k_dir / filename) - - # Osman et al. 2021 Last Glacial Maximum Reanalysis (LGMR) - for filename in OSMAN2021_FILES: - _wget_simple(OSMAN2021_BASE_URL + filename, osman_dir / filename) - - # SISAL v3 — Speleothem Isotopes Synthesis and Analysis database - for filename in SISAL_V3_FILES: - _wget_simple(SISAL_V3_BASE_URL + filename, sisal_dir / filename) - - # LIG127k — Otto-Bliesner et al. (2021), Clim. Past 17, 63–88 - # Zip contains Tables S2–S6; extract any that are not already in lig_dir. - missing_tables = [t for t in LIG127K_TABLES if not (lig_dir / t).exists()] - if not missing_tables: - logging.info(" [skip] lig127k tables already exist") - else: - zip_dest = obs_dir / "cp-17-63-2021-supplement.zip" - _wget_simple(LIG127K_ZIP_URL, zip_dest) - extract_dir = obs_dir / "SI_CP-2019-174_20210105" - try: - subprocess.run( - ["unzip", "-q", "-o", str(zip_dest), "-d", str(obs_dir)], timeout=30 - ) - except subprocess.TimeoutExpired: - pass - for table in LIG127K_TABLES: - src = extract_dir / table - dest = lig_dir / table - if src.exists() and not dest.exists(): - src.rename(dest) - # Clean up extracted directory and zip - shutil.rmtree(extract_dir, ignore_errors=True) - zip_dest.unlink(missing_ok=True) - (obs_dir / "cp-17-63-2021-supplement-title-page.pdf").unlink(missing_ok=True) - # Remove macOS resource-fork junk left by unzip - macos_junk = obs_dir / "__MACOSX" - shutil.rmtree(macos_junk, ignore_errors=True) - - return True - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -def list_available() -> None: - print("CMIP6 model/period combinations:") - for model in PALEO_MODELS: - for period in PALEO_PERIODS: - if model in PALEO_DOWNLOADS and period in PALEO_DOWNLOADS[model]: - n = len(PALEO_DOWNLOADS[model][period]) - print( - f" {model:25s} / {period:25s} ({n} file{'s' if n != 1 else ''})" - ) - print("\nObservational datasets:") - print(" IPCC AR6 Fig 7.19 CSV (Eocene, Pliocene global mean)") - print(" Capron et al. 2021 (xlsx tables) (Last Interglacial proxy anomalies)") - print( - " Scussolini et al. 2019 (xlsx) (Last Interglacial boreal precipitation proxy database)" - ) - print( - " Bartlein et al. 2011 (zip) (Pollen-based temperature/precip reconstructions at 6 ka and 21 ka)" - ) - print( - " Tierney THansenMethod.csv (Hansen-method deep-time temperature reconstruction)" - ) - print( - " lgmDA v2.1 Tierney et al. (Last Glacial Maximum data assimilation)" - ) - print( - " Temp12k Kaufman et al. 2020 (Mid Holocene temperature reconstruction)" - ) - print( - " Temp12k v1.0.0 Kaufman et al. 2020 (Full proxy database: pkl + metadata CSVs, NCEI study 27330)" - ) - print( - " Osman et al. 2021 LGMR (Last Glacial Maximum Reanalysis: GMST/SAT/SST climo + GMST ensemble)" - ) - print( - " SISAL v3 (Speleothem Isotopes Synthesis and Analysis: MySQL/CSV database + codes)" - ) - - -def main() -> None: - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s - %(levelname)s - %(message)s", - handlers=[logging.StreamHandler(sys.stdout)], - ) - - parser = argparse.ArgumentParser( - description="Download raw paleoclimate data.", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=__doc__, - ) - parser.add_argument( - "--source", - choices=["cmip6", "observations", "all"], - help="Which data to download", - ) - parser.add_argument( - "--model", - default="all", - help="CMIP6 model name or 'all' (only used with --source cmip6/all)", - ) - parser.add_argument( - "--period", - default="all", - help="Paleo period or 'all' (only used with --source cmip6/all)", - ) - parser.add_argument( - "--list", action="store_true", help="List available data and exit" - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Report what would be downloaded without downloading", - ) - args = parser.parse_args() - - if args.list: - list_available() - return - - if not args.source: - parser.error("--source is required") - - success = True - - if args.source in ("cmip6", "all"): - models = PALEO_MODELS if args.model == "all" else [args.model] - periods = PALEO_PERIODS if args.period == "all" else [args.period] - invalid_m = [m for m in models if m not in PALEO_DOWNLOADS] - invalid_p = [p for p in periods if p not in PALEO_PERIODS] - if invalid_m: - parser.error(f"Unknown model(s): {invalid_m}. Run --list to see options.") - if invalid_p: - parser.error(f"Unknown period(s): {invalid_p}. Run --list to see options.") - success &= download_cmip6(models, periods, args.dry_run) - - if args.source in ("observations", "all"): - success &= download_observations(args.dry_run) - - sys.exit(0 if success else 1) - - -if __name__ == "__main__": - main() diff --git a/paleo_scripts/download_paleo_observations.py b/paleo_scripts/download_paleo_observations.py new file mode 100644 index 0000000..4d76180 --- /dev/null +++ b/paleo_scripts/download_paleo_observations.py @@ -0,0 +1,379 @@ +#!/usr/bin/env python3 +""" +Download raw paleoclimate observational datasets. + +Downloads proxy/reanalysis observations into paleo_data_cache/raw/observations/. + +Datasets: + ipcc_ar6 IPCC AR6 Fig 7.19 CSV — Eocene/Pliocene global mean anomalies + lgmda lgmDA v2.1 (Tierney et al.) — LGM data assimilation + bartlein2011 Bartlein et al. 2011 — pollen-based temp/precip reconstructions (LGM, mid-Holocene) + temp12k Temp12k (Kaufman et al. 2020) — mid-Holocene temperature reconstruction + osman2021 Osman et al. 2021 LGMR — LGM Reanalysis (GMST/SAT/SST climo + ensemble) + sisal_v3 SISAL v3 — Speleothem Isotopes Synthesis and Analysis + lig127k Otto-Bliesner et al. 2021 — Last Interglacial proxy anomaly tables + scussolini2019 Scussolini et al. 2019 — LIG boreal precipitation proxy + (manual download required — Science.org blocks automated downloads) + tierney_hansen Tierney THansenMethod.csv — Hansen-method deep-time reconstruction + +Usage: + python download_paleo_observations.py + python download_paleo_observations.py --dataset lgmda + python download_paleo_observations.py --dataset lig127k osman2021 + python download_paleo_observations.py --dry-run + python download_paleo_observations.py --list +""" + +import argparse +import logging +import shutil +import subprocess +import sys +import zipfile +from pathlib import Path + +RAW_DIR = Path(__file__).parent / "paleo_data_cache" / "raw" + +# --------------------------------------------------------------------------- +# URL registries +# --------------------------------------------------------------------------- + +LGMDA_FILES = { + "lgmDA_lgm_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.1/lgmDA_lgm_ATM_monthly_climo.nc", + "lgmDA_hol_ATM_monthly_climo.nc": "https://github.com/jesstierney/lgmDA/raw/refs/heads/master/version2.0/lgmDA_hol_ATM_monthly_climo.nc", +} + +TEMP12K_BASE_URL = ( + "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/kaufman2020/" +) +TEMP12K_FILES = ["temp12k_alldata.nc"] + +TEMP12K_V1_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/climate12k/temperature/version1.0.0/" +TEMP12K_V1_FILES = [ + "Temp12k_v1_0_0.pkl", + "Temp12k_v1_essential_metadata_NOAA.csv", + "Temp12k_v1_record_list_NOAA.csv", +] + +OSMAN2021_BASE_URL = ( + "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/osman2021/" +) +OSMAN2021_FILES = [ + "LGMR_GMST_climo.nc", + "LGMR_GMST_ens.nc", + "LGMR_SAT_climo.nc", + "LGMR_SST_climo.nc", +] + +SISAL_V3_BASE_URL = "https://www.ncei.noaa.gov/pub/data/paleo/speleothem/SISAL-v3/" +SISAL_V3_FILES = [ + "sisalv3_database_mysql_csv.zip", + "sisalv3_codes.zip", +] + +LIG127K_ZIP_URL = ( + "https://cp.copernicus.org/articles/17/63/2021/cp-17-63-2021-supplement.zip" +) +LIG127K_TABLES = [ + "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", + "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", + "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", + "Table S5. JJA - NH Oceans (40-90N) JJA_CP-2019-174.xlsx", + "Table S6. JJA - NH terrestrial (40-90N) JJA__CP-2019-174.xlsx", +] + +BARTLEIN_ZIP_URL = "https://static-content.springer.com/esm/art%3A10.1007%2Fs00382-010-0904-1/MediaObjects/382_2010_904_MOESM2_ESM.zip" + +TIERNEY_HANSEN_URL = "https://raw.githubusercontent.com/jesstierney/PastClimates/master/THansenMethod.csv" + +IPCC_AR6_URL = "https://dap.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/v20230118/Figure7_19_obs.csv" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _wget_simple(url: str, dest: Path, dry_run: bool = False) -> None: + """Download url to dest; skip if dest already exists and is non-empty.""" + if dest.exists() and dest.stat().st_size > 0: + logging.info(f" [skip] {dest.name}") + return + if dry_run: + logging.info(f" [dry-run] would download {dest.name}") + return + logging.info(f" Downloading {dest.name} ...") + subprocess.run(["wget", "-q", "-O", str(dest), url], check=True) + + +def _extract_zip_robust(zip_path: Path, dest_dir: Path) -> Path: + """Extract a zip into dest_dir and return the top-level extracted directory. + + Uses the zipfile module to discover the actual top-level directory name + rather than assuming it, which avoids brittle hardcoded path assumptions. + """ + with zipfile.ZipFile(zip_path) as zf: + top_dirs = {Path(name).parts[0] for name in zf.namelist() if "/" in name} + zf.extractall(dest_dir) + + if len(top_dirs) == 1: + return dest_dir / top_dirs.pop() + # Multiple top-level dirs: return dest_dir and let the caller search + return dest_dir + + +# --------------------------------------------------------------------------- +# Per-dataset download functions +# --------------------------------------------------------------------------- + + +def _download_ipcc_ar6(obs_dir: Path, dry_run: bool) -> None: + """IPCC AR6 Figure 7.19 — global mean temperature anomalies.""" + _wget_simple(IPCC_AR6_URL, obs_dir / "Figure7_19_obs.csv", dry_run) + + +def _download_lgmda(obs_dir: Path, dry_run: bool) -> None: + """lgmDA v2.1 (Tierney et al.) — LGM and Holocene monthly climatologies.""" + for filename, url in LGMDA_FILES.items(): + _wget_simple(url, obs_dir / filename, dry_run) + + +def _download_bartlein2011(obs_dir: Path, dry_run: bool) -> None: + """Bartlein et al. 2011 — pollen-based temperature/precipitation reconstructions.""" + dest = obs_dir / "bartlein2011_pollen_climate_recon.zip" + _wget_simple(BARTLEIN_ZIP_URL, dest, dry_run) + if dry_run or not dest.exists(): + return + # Leave the zip in place; process_paleo_observations.py handles extraction. + logging.info(f" bartlein2011 zip ready at {dest.name}") + + +def _download_temp12k(obs_dir: Path, dry_run: bool) -> None: + """Temp12k (Kaufman et al. 2020) — Holocene temperature reconstruction.""" + temp12k_dir = obs_dir / "climate12k" + if not dry_run: + temp12k_dir.mkdir(exist_ok=True) + for filename in TEMP12K_FILES: + _wget_simple(TEMP12K_BASE_URL + filename, obs_dir / filename, dry_run) + for filename in TEMP12K_V1_FILES: + _wget_simple(TEMP12K_V1_BASE_URL + filename, temp12k_dir / filename, dry_run) + + +def _download_osman2021(obs_dir: Path, dry_run: bool) -> None: + """Osman et al. 2021 LGMR — LGM Reanalysis (GMST/SAT/SST).""" + osman_dir = obs_dir / "osman2021" + if not dry_run: + osman_dir.mkdir(exist_ok=True) + for filename in OSMAN2021_FILES: + _wget_simple(OSMAN2021_BASE_URL + filename, osman_dir / filename, dry_run) + + +def _download_sisal_v3(obs_dir: Path, dry_run: bool) -> None: + """SISAL v3 — Speleothem Isotopes Synthesis and Analysis database.""" + sisal_dir = obs_dir / "sisal_v3" + if not dry_run: + sisal_dir.mkdir(exist_ok=True) + for filename in SISAL_V3_FILES: + _wget_simple(SISAL_V3_BASE_URL + filename, sisal_dir / filename, dry_run) + + +def _download_lig127k(obs_dir: Path, dry_run: bool) -> None: + """Otto-Bliesner et al. 2021 LIG127k — Last Interglacial proxy anomaly tables.""" + lig_dir = obs_dir / "lig127k" + if not dry_run: + lig_dir.mkdir(exist_ok=True) + + missing_tables = [t for t in LIG127K_TABLES if not (lig_dir / t).exists()] + if not missing_tables: + logging.info(" [skip] lig127k tables already extracted") + return + + zip_dest = obs_dir / "cp-17-63-2021-supplement.zip" + _wget_simple(LIG127K_ZIP_URL, zip_dest, dry_run) + if dry_run or not zip_dest.exists(): + return + + logging.info(" Extracting lig127k supplement zip ...") + extract_root = _extract_zip_robust(zip_dest, obs_dir) + + # Move each expected table from wherever it landed in the extract tree + for table in LIG127K_TABLES: + dest = lig_dir / table + if dest.exists(): + continue + # Search the extracted tree for the file (handles nested dirs) + matches = list(obs_dir.rglob(table)) + if matches: + matches[0].rename(dest) + else: + logging.warning(f" [warn] Table not found in zip: {table}") + + # Clean up extracted tree and zip + if extract_root != obs_dir and extract_root.exists(): + shutil.rmtree(extract_root, ignore_errors=True) + for leftover in ["cp-17-63-2021-supplement-title-page.pdf", "__MACOSX"]: + p = obs_dir / leftover + if p.is_dir(): + shutil.rmtree(p, ignore_errors=True) + elif p.exists(): + p.unlink(missing_ok=True) + zip_dest.unlink(missing_ok=True) + + +def _download_scussolini2019(obs_dir: Path, dry_run: bool) -> None: + """Scussolini et al. 2019 — LIG boreal precipitation proxy (manual download required).""" + scussolini_dest = obs_dir / "scussolini2019_lig_precip_proxy.xlsx" + scussolini_orig = obs_dir / "aax7047_external_database_s1.xlsx" + + if scussolini_dest.exists() and scussolini_dest.stat().st_size > 0: + logging.info(" [skip] scussolini2019_lig_precip_proxy.xlsx") + return + + if scussolini_orig.exists() and scussolini_orig.stat().st_size > 0: + if scussolini_dest.exists(): + scussolini_dest.unlink() + scussolini_orig.rename(scussolini_dest) + logging.info( + " Renamed aax7047_external_database_s1.xlsx → scussolini2019_lig_precip_proxy.xlsx" + ) + return + + logging.warning( + "\n" + " ACTION REQUIRED: scussolini2019_lig_precip_proxy.xlsx must be downloaded manually.\n" + " Science.org blocks automated downloads for this file.\n" + "\n" + " 1. Open this URL in a browser:\n" + " https://www.science.org/doi/suppl/10.1126/sciadv.aax7047/suppl_file/aax7047_external_database_s1.xlsx\n" + " 2. Save the file (downloads as aax7047_external_database_s1.xlsx).\n" + " 3. Move it to:\n" + f" {scussolini_dest}\n" + " Then re-run this script to rename it automatically.\n" + ) + + +def _download_tierney_hansen(obs_dir: Path, dry_run: bool) -> None: + """Tierney THansenMethod.csv — Hansen-method deep-time temperature reconstruction.""" + _wget_simple(TIERNEY_HANSEN_URL, obs_dir / "THansenMethod.csv", dry_run) + + +# --------------------------------------------------------------------------- +# Dataset registry — maps CLI name → downloader function +# --------------------------------------------------------------------------- + +DATASET_REGISTRY: dict[str, tuple[str, callable]] = { + "ipcc_ar6": ("IPCC AR6 Fig 7.19 global mean anomalies", _download_ipcc_ar6), + "lgmda": ("lgmDA v2.1 Tierney et al. — LGM data assimilation", _download_lgmda), + "bartlein2011": ( + "Bartlein et al. 2011 pollen temp/precip recon", + _download_bartlein2011, + ), + "temp12k": ( + "Temp12k Kaufman et al. 2020 — Holocene reconstruction", + _download_temp12k, + ), + "osman2021": ( + "Osman et al. 2021 LGMR — SAT/SST/GMST reanalysis", + _download_osman2021, + ), + "sisal_v3": ("SISAL v3 speleothem database", _download_sisal_v3), + "lig127k": ("Otto-Bliesner et al. 2021 LIG127k proxy tables", _download_lig127k), + "scussolini2019": ( + "Scussolini et al. 2019 LIG precipitation proxy", + _download_scussolini2019, + ), + "tierney_hansen": ( + "Tierney THansenMethod deep-time reconstruction", + _download_tierney_hansen, + ), +} + + +# --------------------------------------------------------------------------- +# CLI helpers +# --------------------------------------------------------------------------- + + +def list_datasets() -> None: + print("Available datasets (--dataset ):") + for key, (description, _) in DATASET_REGISTRY.items(): + print(f" {key:<18} {description}") + + +def download_datasets(dataset_names: list[str], dry_run: bool) -> bool: + obs_dir = RAW_DIR / "observations" + if not dry_run: + obs_dir.mkdir(parents=True, exist_ok=True) + + ok = True + for name in dataset_names: + if name not in DATASET_REGISTRY: + logging.error( + f"Unknown dataset '{name}'. Run --list to see available options." + ) + ok = False + continue + description, fn = DATASET_REGISTRY[name] + logging.info(f"\n[{name}] {description}") + try: + fn(obs_dir, dry_run) + except Exception as exc: + logging.error(f" Failed to download {name}: {exc}") + ok = False + return ok + + +def main() -> None: + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[logging.StreamHandler(sys.stdout)], + ) + + parser = argparse.ArgumentParser( + description="Download raw paleoclimate observational datasets.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + parser.add_argument( + "--dataset", + nargs="+", + default=["all"], + metavar="NAME", + help=( + "One or more dataset names to download, or 'all' (default). " + "Run --list to see available names." + ), + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Report what would be downloaded without downloading", + ) + parser.add_argument( + "--list", + action="store_true", + help="List available datasets and exit", + ) + args = parser.parse_args() + + if args.list: + list_datasets() + return + + # Resolve dataset names; "all" expands to every registered key (order-preserving dedup) + seen: dict[str, None] = {} + for token in args.dataset: + if token == "all": + for key in DATASET_REGISTRY: + seen[key] = None + else: + seen[token] = None + names = list(seen) + + success = download_datasets(names, args.dry_run) + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/paleo_scripts/paleo_benchmark.py b/paleo_scripts/paleo_benchmark.py index d0d0598..aaf6b0e 100644 --- a/paleo_scripts/paleo_benchmark.py +++ b/paleo_scripts/paleo_benchmark.py @@ -30,7 +30,9 @@ python paleo_benchmark.py --model AWI-ESM-1-1-LR --period lgm python paleo_benchmark.py --model all --period all python paleo_benchmark.py --model MIROC-ES2L --period lgm --use-picontrol - python paleo_benchmark.py --model all --period lgm --save-to-cloud + python paleo_benchmark.py --model all --period lgm --obs-source lgmDA + python paleo_benchmark.py --model all --period lgm --obs-source Bartlein2011 --variable tas + python paleo_benchmark.py --model all --period all --save-to-cloud Results saved to: ../results/paleo/{period}_paleo_benchmark_results.csv @@ -54,15 +56,14 @@ from scipy.special import erf sys.path.append("..") -from utils import standardize_dims +from utils import save_results_csv, standardize_dims # --------------------------------------------------------------------------- # Paths # --------------------------------------------------------------------------- PALEO_DIR = Path(__file__).parent OBS_DIR = PALEO_DIR / "paleo_data_cache" / "processed" / "observations" -MODEL_DIR = PALEO_DIR / "paleo_data_cache" / "processed" -RESULTS_DIR = PALEO_DIR.parent / "results" / "paleo" +MODEL_PROC_DIR = PALEO_DIR / "paleo_data_cache" / "processed" / "models" logger = logging.getLogger(__name__) logging.basicConfig( @@ -212,34 +213,33 @@ def _interp_to_points( def _load_model_tas(model: str, period: str) -> xr.DataArray | None: - """Load annual-mean tas from processed CMIP6 paleo file. + """Load annual-mean tas from processed monthly climatology. Returns DataArray in °C, or None if data is unavailable. """ - nc = MODEL_DIR / model / f"{period}_tas_annual.nc" + nc = MODEL_PROC_DIR / model / f"{period}_tas_monthly_climo.nc" if not nc.exists(): logger.warning( - f" [skip] No processed {period} tas for {model} — run process_paleo.py first" + f" [skip] No processed {period} tas for {model} — run process_paleo_models.py first" ) return None ds = xr.open_dataset(nc) - da = ds["tas"] + da = ds["tas"].mean("month") da = standardize_dims(da.to_dataset(name="tas"))["tas"] return _to_celsius(da) def _load_model_pr(model: str, period: str) -> xr.DataArray | None: - """Load annual-mean pr from processed CMIP6 paleo file (kg m-2 s-1 → mm/yr). + """Load annual-mean pr from processed monthly climatology (kg m-2 s-1 → mm/yr). Returns DataArray in mm/yr, or None if data is unavailable. """ - nc = MODEL_DIR / model / f"{period}_pr_annual.nc" + nc = MODEL_PROC_DIR / model / f"{period}_pr_monthly_climo.nc" if not nc.exists(): return None ds = xr.open_dataset(nc) - da = ds["pr"] + da = ds["pr"].mean("month") da = standardize_dims(da.to_dataset(name="pr"))["pr"] - # Convert kg m-2 s-1 → mm/yr return da * 86400 * 365.25 @@ -252,7 +252,6 @@ def _load_picontrol_tas(model: str) -> xr.DataArray | None: df = DataFinder(model=model, variable="tas", start_year=1850, end_year=2000) pi_ds = df.load_experiment_ds(experiment="piControl", ensemble_mean=True) pi_da = standardize_dims(pi_ds)["tas"] - # Annual mean over all time steps return _to_celsius(pi_da.mean(dim="time")) except Exception as e: logger.warning(f" Could not load piControl for {model}: {e}") @@ -261,13 +260,16 @@ def _load_picontrol_tas(model: str) -> xr.DataArray | None: def _load_lgmda_pi_tas() -> xr.DataArray | None: """Load lgmDA Holocene (PI) annual-mean tas as a spatially resolved modern reference.""" - nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + nc = OBS_DIR / "multi_period" / "lgmDA_v2.1_holocene_tas.nc" if not nc.exists(): - logger.warning(" lgm_lgmda_da.nc not found — cannot compute model anomalies") + logger.warning( + " lgmDA_v2.1_holocene_tas.nc not found — cannot compute model anomalies" + ) return None ds = xr.open_dataset(nc) - # Monthly mean → annual mean; lgmDA is in °C - pi = ds["pi_tas"].mean(dim="month") + pi = ds["pi_tas"] + if "month" in pi.dims: + pi = pi.mean(dim="month") return _to_celsius(pi) @@ -295,12 +297,12 @@ def bench_lgmda_absolute( model_tas: xr.DataArray, model: str, period: str ) -> list[dict]: """Absolute temperature comparison: model lgm tas vs lgmDA lgm_tas.""" - nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + nc = OBS_DIR / "lgm" / "lgmDA_v2.1_tas.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - lgmda_lgm = _to_celsius(ds["lgm_tas"].mean(dim="month")) - lgmda_std = ds["lgm_tas_std"].mean(dim="month") + lgmda_lgm = _to_celsius((ds["pi_tas"] + ds["tas"]).mean(dim="month")) + lgmda_std = ds["tas_std"].mean(dim="month") model_on_lgmda = _regrid(model_tas, lgmda_lgm.lat.values, lgmda_lgm.lon.values) cos_w = np.cos(np.deg2rad(lgmda_lgm.lat.values)) @@ -319,16 +321,12 @@ def bench_lgmda_anomaly( model_anom: xr.DataArray, model: str, period: str ) -> list[dict]: """Anomaly comparison: model − lgmDA_pi vs lgmDA (lgm_tas − pi_tas).""" - nc = OBS_DIR / "da" / "lgm_lgmda_da.nc" + nc = OBS_DIR / "lgm" / "lgmDA_v2.1_tas.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - proxy_anom = _to_celsius(ds["lgm_tas"] - ds["pi_tas"]).mean(dim="month") - # Propagate lgm and pi stds - proxy_sigma = np.sqrt( - ds["lgm_tas_std"].mean(dim="month") ** 2 - + ds["pi_tas_std"].mean(dim="month") ** 2 - ) + proxy_anom = ds["tas"].mean(dim="month") + proxy_sigma = ds["tas_std"].mean(dim="month") model_on_lgmda = _regrid(model_anom, proxy_anom.lat.values, proxy_anom.lon.values) cos_w = np.cos(np.deg2rad(proxy_anom.lat.values)) @@ -345,12 +343,12 @@ def bench_lgmda_anomaly( def bench_lgmr_sat(model_anom: xr.DataArray, model: str, period: str) -> list[dict]: """Anomaly comparison: model vs LGMR SAT (Osman et al. 2021).""" - nc = OBS_DIR / "da" / "lgm_lgmr_sat_da.nc" + nc = OBS_DIR / "lgm" / "LGMR_SAT_tas.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - proxy_mu = ds["sat"] - proxy_sigma = ds["sat_std"] + proxy_mu = ds["tas"] + proxy_sigma = ds["tas_std"] model_on_lgmr = _regrid(model_anom, proxy_mu.lat.values, proxy_mu.lon.values) cos_w = np.cos(np.deg2rad(proxy_mu.lat.values)) @@ -368,21 +366,18 @@ def bench_lgmr_sat(model_anom: xr.DataArray, model: str, period: str) -> list[di def bench_bartlein_tas(model_anom: xr.DataArray, period: str, model: str) -> list[dict]: """Pollen-based MAT anomaly comparison (Bartlein et al. 2011). - Uses mat_anm_mean (°C anomaly) and mat_se_mean (standard error) from - the Bartlein gridded reconstructions. Only cells with significant signal - (mat_sig == 1) are included. + Uses tas and tas_std. Only cells with significant signal (tas_sig_val != 0) are included. """ - tag = "lgm" if period == "lgm" else "midh" - nc = OBS_DIR / "proxy" / f"{tag}_bartlein_proxy.nc" + nc = OBS_DIR / period / "Bartlein2011_tas.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - proxy_mu = ds["mat_anm_mean"] - proxy_sigma = ds["mat_se_mean"] - # mat_sig_val stores the anomaly at significant cells (0 where not significant); - # mat_sig == ±1 uses a stricter threshold. We keep all cells where the - # anomaly is significant (mat_sig_val != 0) which matches |t| > ~2. - sig_mask = np.isfinite(ds["mat_sig_val"].values) & (ds["mat_sig_val"].values != 0) + proxy_mu = ds["tas"] + proxy_sigma = ds["tas_std"] + sig_var = ( + ds["tas_sig_val"] if "tas_sig_val" in ds else ds.get("tas_sig", proxy_mu * 0) + ) + sig_mask = np.isfinite(sig_var.values) & (sig_var.values != 0) proxy_mu_masked = proxy_mu.where( xr.DataArray(sig_mask, dims=proxy_mu.dims, coords=proxy_mu.coords) @@ -409,18 +404,20 @@ def bench_bartlein_pr( ) -> list[dict]: """Pollen-based MAP anomaly comparison (Bartlein et al. 2011). - map_anm_mean in mm/yr, map_se_mean is standard error. + pr in mm/yr; pr_std is standard error. """ if model_pr_anom is None: return [] - tag = "lgm" if period == "lgm" else "midh" - nc = OBS_DIR / "proxy" / f"{tag}_bartlein_proxy.nc" + nc = OBS_DIR / period / "Bartlein2011_pr.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - proxy_mu = ds["map_anm_mean"] - proxy_sigma = ds["map_se_mean"] - sig_mask = np.isfinite(ds["map_sig_val"].values) & (ds["map_sig_val"].values != 0) + if "pr" not in ds: + return [] + proxy_mu = ds["pr"] + proxy_sigma = ds["pr_std"] + sig_var = ds["pr_sig_val"] if "pr_sig_val" in ds else ds.get("pr_sig", proxy_mu * 0) + sig_mask = np.isfinite(sig_var.values) & (sig_var.values != 0) proxy_mu_masked = proxy_mu.where( xr.DataArray(sig_mask, dims=proxy_mu.dims, coords=proxy_mu.coords) @@ -448,19 +445,17 @@ def bench_ottobliesner_lig( """LIG proxy temperature comparison (Otto-Bliesner et al. 2021).""" if model_anom is None: return [] - nc = OBS_DIR / "proxy" / "lig127k_ottobliesner_tas_proxy.nc" + nc = OBS_DIR / "lig127k" / "OttoBliesner2021_tas.nc" if not nc.exists(): return [] ds = xr.open_dataset(nc) - # tas/tas_std are on a sparse grid; flatten to valid sites - tas = ds["tas"].values.ravel() - tas_std = ds["tas_std"].values.ravel() - lon_grid, lat_grid = np.meshgrid(ds.lon.values, ds.lat.values) - lats = lat_grid.ravel() - lons = lon_grid.ravel() - valid = np.isfinite(tas) + lats = ds["lat"].values + lons = ds["lon"].values + proxy_mu = ds["tas"].values + proxy_sigma = ds["tas_std"].values + valid = np.isfinite(proxy_mu) lats, lons = lats[valid], lons[valid] - proxy_mu, proxy_sigma = tas[valid], tas_std[valid] + proxy_mu, proxy_sigma = proxy_mu[valid], proxy_sigma[valid] model_vals = _interp_to_points(model_anom, lats, lons) metrics = _spatial_metrics(model_vals, proxy_mu, proxy_sigma) @@ -476,31 +471,35 @@ def bench_scussolini_lig( """LIG precipitation comparison (Scussolini et al. 2019). Uses only sites with quantitative ΔP (mm) estimates and reliability ≥ 1. - Semi-quantitative signal is used as ordinal class (−2 to +2) when - quantitative ΔP is absent; those sites get a proxy_sigma of 200 mm/yr - so CRPS is appropriately wide. + Reliability 1 → proxy_sigma = 300 mm/yr; reliability ≥ 2 → 150 mm/yr. """ if model_pr_anom is None: return [] - csv = OBS_DIR / "proxy" / "lig127k_scussolini_pr_proxy.csv" - if not csv.exists(): + nc = OBS_DIR / "lig127k" / "Scussolini2019_pr.nc" + if not nc.exists(): + return [] + ds = xr.open_dataset(nc) + if "pr" not in ds: + logger.warning(" Scussolini: no pr variable in NetCDF") return [] - df = pd.read_csv(csv) - # Filter to sites with usable data - has_quant = df["Quantitative signal of ΔP (mm)"].notna() - reliable = df["Reliability score"].fillna(0) >= 1 - quant_sites = df[has_quant & reliable].copy() - if quant_sites.empty: + lats = ds["lat"].values + lons = ds["lon"].values + proxy_mu_all = ds["pr"].values + reliability = ( + ds["pr_reliability"].values if "pr_reliability" in ds else np.ones(len(lats)) + ) + + has_quant = np.isfinite(proxy_mu_all) + reliable = reliability >= 1 + mask = has_quant & reliable + if not mask.any(): logger.warning(" Scussolini: no quantitative precipitation sites available") return [] - lats = quant_sites["lat"].values - lons = quant_sites["lon"].values - proxy_mu = quant_sites["Quantitative signal of ΔP (mm)"].values.astype(float) - # Use reliability score to set uncertainty: reliability 1 → ±300 mm/yr, 2 → ±150 mm/yr - reliability = quant_sites["Reliability score"].values - proxy_sigma = np.where(reliability >= 2, 150.0, 300.0) + lats, lons = lats[mask], lons[mask] + proxy_mu = proxy_mu_all[mask] + proxy_sigma = np.where(reliability[mask] >= 2, 150.0, 300.0) model_vals = _interp_to_points(model_pr_anom, lats, lons) metrics = _spatial_metrics(model_vals, proxy_mu, proxy_sigma) @@ -510,18 +509,55 @@ def bench_scussolini_lig( return [_result_row(model, period, "Scussolini2019", "pr_anomaly_mmyr", metrics)] +def bench_temp12k( + model_anom: xr.DataArray | None, model: str, period: str +) -> list[dict]: + """Holocene temperature reconstruction (Kaufman et al. 2020 / Temp12k). Stub — not yet implemented.""" + logger.warning(" bench_temp12k: not yet implemented") + return [] + + +# --------------------------------------------------------------------------- +# Obs source registry — maps period → source → {variable → benchmark functions} +# Used for --obs-source filtering +# --------------------------------------------------------------------------- + +OBS_SOURCE_REGISTRY: dict[str, dict[str, dict[str, tuple]]] = { + "lgm": { + "lgmDA": {"tas": (bench_lgmda_absolute, bench_lgmda_anomaly)}, + "LGMR_SAT": {"tas": (bench_lgmr_sat,)}, + "Bartlein2011": {"tas": (bench_bartlein_tas,), "pr": (bench_bartlein_pr,)}, + }, + "midHolocene": { + "Bartlein2011": {"tas": (bench_bartlein_tas,), "pr": (bench_bartlein_pr,)}, + "Temp12k": {"tas": (bench_temp12k,)}, + }, + "lig127k": { + "OttoBliesner2021": {"tas": (bench_ottobliesner_lig,)}, + "Scussolini2019": {"pr": (bench_scussolini_lig,)}, + }, +} + + # --------------------------------------------------------------------------- # Per-period orchestration # --------------------------------------------------------------------------- -def _run_lgm(model: str, use_picontrol: bool) -> list[dict]: +def _run_lgm( + model: str, + use_picontrol: bool, + obs_sources: list[str] | None, + variables: list[str], +) -> list[dict]: rows = [] - model_tas = _load_model_tas(model, "lgm") - if model_tas is None: + run_tas = "tas" in variables + run_pr = "pr" in variables + + model_tas = _load_model_tas(model, "lgm") if run_tas else None + if run_tas and model_tas is None: return rows - # PI reference for anomaly computation if use_picontrol: pi_ref = _load_picontrol_tas(model) if pi_ref is None: @@ -530,32 +566,50 @@ def _run_lgm(model: str, use_picontrol: bool) -> list[dict]: else: pi_ref = _load_lgmda_pi_tas() - # Absolute temperature comparison (no PI ref needed) - rows += bench_lgmda_absolute(model_tas, model, "lgm") + sources = obs_sources or list(OBS_SOURCE_REGISTRY["lgm"]) - if pi_ref is not None: - model_anom = _compute_model_anom(model_tas, pi_ref) - rows += bench_lgmda_anomaly(model_anom, model, "lgm") - rows += bench_lgmr_sat(model_anom, model, "lgm") - rows += bench_bartlein_tas(model_anom, "lgm", model) + if run_tas and "lgmDA" in sources and model_tas is not None: + rows += bench_lgmda_absolute(model_tas, model, "lgm") - model_pr = _load_model_pr(model, "lgm") - model_pr_anom = ( - _compute_pr_anom(model_pr, model, "lgm", use_picontrol) - if model_pr is not None - else None + if pi_ref is not None: + model_anom = ( + _compute_model_anom(model_tas, pi_ref) if model_tas is not None else None ) - rows += bench_bartlein_pr(model_pr_anom, "lgm", model) + + if run_tas and model_anom is not None: + if "lgmDA" in sources: + rows += bench_lgmda_anomaly(model_anom, model, "lgm") + if "LGMR_SAT" in sources: + rows += bench_lgmr_sat(model_anom, model, "lgm") + if "Bartlein2011" in sources: + rows += bench_bartlein_tas(model_anom, "lgm", model) + + if run_pr and "Bartlein2011" in sources: + model_pr = _load_model_pr(model, "lgm") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "lgm", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_bartlein_pr(model_pr_anom, "lgm", model) else: logger.warning(" No PI reference — skipping anomaly benchmarks for LGM") return rows -def _run_midholocene(model: str, use_picontrol: bool) -> list[dict]: +def _run_midholocene( + model: str, + use_picontrol: bool, + obs_sources: list[str] | None, + variables: list[str], +) -> list[dict]: rows = [] - model_tas = _load_model_tas(model, "midHolocene") - if model_tas is None: + run_tas = "tas" in variables + run_pr = "pr" in variables + + model_tas = _load_model_tas(model, "midHolocene") if run_tas else None + if run_tas and model_tas is None: return rows pi_ref = _load_picontrol_tas(model) if use_picontrol else _load_lgmda_pi_tas() @@ -565,40 +619,60 @@ def _run_midholocene(model: str, use_picontrol: bool) -> list[dict]: ) return rows - model_anom = _compute_model_anom(model_tas, pi_ref) - rows += bench_bartlein_tas(model_anom, "midHolocene", model) + sources = obs_sources or list(OBS_SOURCE_REGISTRY["midHolocene"]) + + if run_tas and model_tas is not None: + model_anom = _compute_model_anom(model_tas, pi_ref) + if "Bartlein2011" in sources: + rows += bench_bartlein_tas(model_anom, "midHolocene", model) + if "Temp12k" in sources: + rows += bench_temp12k(model_anom, model, "midHolocene") + + if run_pr and "Bartlein2011" in sources: + model_pr = _load_model_pr(model, "midHolocene") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "midHolocene", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_bartlein_pr(model_pr_anom, "midHolocene", model) - model_pr = _load_model_pr(model, "midHolocene") - model_pr_anom = ( - _compute_pr_anom(model_pr, model, "midHolocene", use_picontrol) - if model_pr is not None - else None - ) - rows += bench_bartlein_pr(model_pr_anom, "midHolocene", model) return rows -def _run_lig127k(model: str, use_picontrol: bool) -> list[dict]: +def _run_lig127k( + model: str, + use_picontrol: bool, + obs_sources: list[str] | None, + variables: list[str], +) -> list[dict]: rows = [] - model_tas = _load_model_tas(model, "lig127k") - if model_tas is None: - return rows + run_tas = "tas" in variables + run_pr = "pr" in variables + + model_tas = _load_model_tas(model, "lig127k") if run_tas else None pi_ref = _load_picontrol_tas(model) if use_picontrol else _load_lgmda_pi_tas() if pi_ref is None: logger.warning(" No PI reference — skipping anomaly benchmarks for lig127k") return rows - model_anom = _compute_model_anom(model_tas, pi_ref) - rows += bench_ottobliesner_lig(model_anom, model, "lig127k") + sources = obs_sources or list(OBS_SOURCE_REGISTRY["lig127k"]) + + if run_tas and model_tas is not None: + model_anom = _compute_model_anom(model_tas, pi_ref) + if "OttoBliesner2021" in sources: + rows += bench_ottobliesner_lig(model_anom, model, "lig127k") + + if run_pr and "Scussolini2019" in sources: + model_pr = _load_model_pr(model, "lig127k") + model_pr_anom = ( + _compute_pr_anom(model_pr, model, "lig127k", use_picontrol) + if model_pr is not None + else None + ) + rows += bench_scussolini_lig(model_pr_anom, model, "lig127k") - model_pr = _load_model_pr(model, "lig127k") - model_pr_anom = ( - _compute_pr_anom(model_pr, model, "lig127k", use_picontrol) - if model_pr is not None - else None - ) - rows += bench_scussolini_lig(model_pr_anom, model, "lig127k") return rows @@ -611,7 +685,6 @@ def _compute_pr_anom( """Compute model precipitation anomaly (mm/yr) relative to PI reference.""" if model_pr is None: return None - # Load piControl pr if available; otherwise skip (no lgmDA precip reference) if use_picontrol: try: sys.path.append(str(PALEO_DIR.parent / "benchmark_scrips")) @@ -648,8 +721,12 @@ def main( use_picontrol: bool = False, save_to_cloud: bool = False, overwrite: bool = False, + obs_sources: list[str] | None = None, + variables: list[str] | None = None, ) -> pd.DataFrame: - # Collect rows per period so each period gets its own results file + if variables is None: + variables = ["tas", "pr"] + rows_by_period: dict[str, list[dict]] = {p: [] for p in periods} for model in models: @@ -660,7 +737,7 @@ def main( ) continue logger.info(f"\n{'='*60}\n {model} / {period}\n{'='*60}") - rows = PERIOD_RUNNERS[period](model, use_picontrol) + rows = PERIOD_RUNNERS[period](model, use_picontrol, obs_sources, variables) rows_by_period[period].extend(rows) if not rows: logger.warning(f" No benchmark results for {model}/{period}") @@ -670,7 +747,9 @@ def main( if not rows: continue period_df = pd.DataFrame(rows) - _save_results(period_df, period, save_to_cloud, overwrite) + results_file = f"../results/paleo/{period}_paleo_benchmark_results.csv" + save_results_csv(period_df, results_file, save_to_cloud, overwrite) + print(period_df.to_string(index=False)) all_dfs.append(period_df) if not all_dfs: @@ -680,42 +759,6 @@ def main( return pd.concat(all_dfs, ignore_index=True) -def _save_results( - df: pd.DataFrame, period: str, save_to_cloud: bool, overwrite: bool -) -> None: - results_file = RESULTS_DIR / f"{period}_paleo_benchmark_results.csv" - RESULTS_DIR.mkdir(parents=True, exist_ok=True) - - if save_to_cloud: - try: - from google.cloud import storage - - gcs_path = f"results/paleo/{results_file.name}" - storage_client = storage.Client(project="JCM and Benchmarking") - storage_client.bucket("climatebench") - df.to_csv(f"gs://climatebench/{gcs_path}", index=False) - logger.info(f"Results saved to cloud: gs://climatebench/{gcs_path}") - except Exception as e: - logger.warning(f"Cloud save failed: {e}. Saving locally instead.") - save_to_cloud = False - - if not save_to_cloud: - if overwrite or not results_file.exists(): - df.to_csv(results_file, index=False) - else: - existing = pd.read_csv(results_file) - key_cols = ["model", "period", "dataset", "variable"] - existing = existing[ - ~existing.set_index(key_cols).index.isin(df.set_index(key_cols).index) - ] - pd.concat([existing, df], ignore_index=True).to_csv( - results_file, index=False - ) - logger.info(f"Results saved: {results_file}") - - print(df.to_string(index=False)) - - if __name__ == "__main__": parser = argparse.ArgumentParser( description="Paleo benchmark: spatial RMSE/MAE/CRPS against proxy and DA observations" @@ -731,12 +774,31 @@ def _save_results( choices=["lgm", "midHolocene", "lig127k", "all"], help="Paleo period to benchmark (default: all)", ) + parser.add_argument( + "--obs-source", + nargs="+", + default=None, + metavar="SOURCE", + help=( + "Observation source(s) to benchmark against. " + "LGM: lgmDA, LGMR_SAT, Bartlein2011. " + "midHolocene: Bartlein2011, Temp12k. " + "lig127k: OttoBliesner2021, Scussolini2019. " + "Default: all sources for the selected period." + ), + ) + parser.add_argument( + "--variable", + nargs="+", + default=["all"], + choices=["tas", "pr", "all"], + help="Variable(s) to benchmark: tas, pr, or all (default: all)", + ) parser.add_argument( "--use-picontrol", action="store_true", default=False, - help="Load model piControl from main ClimateBench DataFinder for anomaly computation " - "(requires processed piControl data; default uses lgmDA Holocene as PI reference)", + help="Load model piControl from main ClimateBench DataFinder for anomaly computation", ) parser.add_argument( "--save-to-cloud", @@ -756,15 +818,13 @@ def _save_results( if args.model == "all": available = [ p.name - for p in MODEL_DIR.iterdir() - if p.is_dir() - and p.name != "observations" - and any(p.glob("*_tas_annual.nc")) + for p in MODEL_PROC_DIR.iterdir() + if p.is_dir() and any(p.glob("*_tas_monthly_climo.nc")) ] if not available: logger.error( - "No processed model data found in paleo_data_cache/processed/. " - "Run process_paleo.py --source cmip6 first." + "No processed model data found in paleo_data_cache/processed/models/. " + "Run process_paleo_models.py first." ) sys.exit(1) model_list = sorted(available) @@ -774,8 +834,13 @@ def _save_results( # Resolve period list period_list = list(PERIOD_RUNNERS) if args.period == "all" else [args.period] - logger.info(f"Models: {model_list}") - logger.info(f"Periods: {period_list}") + # Resolve variable list + variable_list = ["tas", "pr"] if "all" in args.variable else args.variable + + logger.info(f"Models: {model_list}") + logger.info(f"Periods: {period_list}") + logger.info(f"Variables: {variable_list}") + logger.info(f"Sources: {args.obs_source or 'all'}") logger.info( f"PI reference: {'piControl (DataFinder)' if args.use_picontrol else 'lgmDA Holocene'}" ) @@ -786,4 +851,6 @@ def _save_results( use_picontrol=args.use_picontrol, save_to_cloud=args.save_to_cloud, overwrite=args.overwrite, + obs_sources=args.obs_source, + variables=variable_list, ) diff --git a/paleo_scripts/process_paleo.py b/paleo_scripts/process_paleo.py deleted file mode 100644 index 83f6a98..0000000 --- a/paleo_scripts/process_paleo.py +++ /dev/null @@ -1,698 +0,0 @@ -""" -Process raw paleoclimate data into a unified dataset. - -Reads from paleo_data_cache/raw/ and writes to paleo_data_cache/processed/. - -CMIP6 processing (--source cmip6): - Reads raw tas_Amon_*.nc files per model, computes time-mean annual and - monthly climatologies, writes: - paleo_data_cache/processed/{MODEL}/{period}_tas_annual.nc - paleo_data_cache/processed/{MODEL}/{period}_tas_monthly.nc - Then deletes the raw files (unless --skip-cleanup). - -Observations processing (--source observations): - Proxy data — site-level or gridded, saved per period: - paleo_data_cache/processed/observations/proxy/lig127k_ottobliesner_tas_proxy.nc - paleo_data_cache/processed/observations/proxy/lig127k_scussolini_pr_proxy.csv - paleo_data_cache/processed/observations/proxy/lgm_bartlein_proxy.csv - paleo_data_cache/processed/observations/proxy/midh_bartlein_proxy.csv - paleo_data_cache/processed/observations/proxy/deeptime_hansen_proxy.csv - paleo_data_cache/processed/observations/proxy/sisal_v3/ - - Data assimilation — gridded, saved per period: - paleo_data_cache/processed/observations/da/lgm_lgmda_da.nc - paleo_data_cache/processed/observations/da/lgm_lgmr_da.nc - - Multi-period summaries: - paleo_data_cache/processed/observations/annual_mean_global_obs.csv - paleo_data_cache/processed/observations/annual_mean_zonal_obs.csv - paleo_data_cache/processed/observations/monthly_mean_zonal_obs.csv - -Run download_paleo.py first to populate paleo_data_cache/raw/. - -Usage: - python process_paleo.py --source all - python process_paleo.py --source cmip6 --period lgm - python process_paleo.py --source cmip6 --period all --skip-cleanup - python process_paleo.py --source observations -""" - -import argparse -import logging -import sys -import zipfile -from pathlib import Path -from typing import Optional - -import numpy as np -import pandas as pd -import xarray as xr - -from paleo_constants import PALEO_DOWNLOADS, PALEO_MODELS, PALEO_PERIODS - -RAW_DIR = Path(__file__).parent / "paleo_data_cache" / "raw" -PROCESSED_DIR = Path(__file__).parent / "paleo_data_cache" / "processed" - - -def setup_logging(log_level: str = "INFO", log_file: Optional[str] = None) -> None: - handlers = [logging.StreamHandler(sys.stdout)] - if log_file: - handlers.append(logging.FileHandler(log_file)) - logging.basicConfig( - level=getattr(logging, log_level.upper()), - format="%(asctime)s - %(levelname)s - %(message)s", - handlers=handlers, - ) - - -# --------------------------------------------------------------------------- -# CMIP6 processing -# --------------------------------------------------------------------------- - - -def _load_netcdf(model_dir: Path) -> Optional[xr.Dataset]: - nc_files = sorted(model_dir.glob("tas_Amon_*.nc")) - if not nc_files: - logging.warning(f"No tas_Amon_*.nc files in {model_dir}") - return None - logging.info(f" Loading {len(nc_files)} file(s) from {model_dir.name}") - drop_vars = ["time_bnds", "lat_bnds", "lon_bnds", "height"] - try: - return xr.open_mfdataset(nc_files, chunks={}).drop_vars( - drop_vars, errors="ignore" - ) - except Exception: - try: - return xr.open_mfdataset(nc_files, use_cftime=True, chunks={}).drop_vars( - drop_vars, errors="ignore" - ) - except Exception as e: - logging.error(f" Failed to load {model_dir.name}: {e}") - return None - - -def _area_weights(ds: xr.Dataset) -> xr.DataArray: - w = np.cos(np.deg2rad(ds.lat)).expand_dims({"lon": ds.lon}) - w.name = "areacella" - return w - - -def _process_cmip6_model( - raw_dir: Path, processed_dir: Path, period: str, skip_cleanup: bool -) -> bool: - ds = _load_netcdf(raw_dir) - if ds is None: - return False - - processed_dir.mkdir(parents=True, exist_ok=True) - try: - weights = _area_weights(ds) - - xr.merge( - [ - ds.mean(dim="time"), - ds.std(dim="time").rename({"tas": "tas_std"}), - weights.to_dataset(name="weight"), - ] - ).to_netcdf(processed_dir / f"{period}_tas_annual.nc") - logging.info(f" Saved {period}_tas_annual.nc") - - xr.merge( - [ - ds.groupby("time.month").mean(), - ds.groupby("time.month").std().rename({"tas": "tas_std"}), - weights.to_dataset(name="weight"), - ] - ).to_netcdf(processed_dir / f"{period}_tas_monthly.nc") - logging.info(f" Saved {period}_tas_monthly.nc") - except Exception as e: - logging.error(f" Processing failed for {raw_dir.name}: {e}") - return False - finally: - ds.close() - - if not skip_cleanup: - for nc in raw_dir.glob("tas_Amon_*.nc"): - nc.unlink() - - return True - - -def process_cmip6(periods: list[str], skip_cleanup: bool) -> None: - for period in periods: - models = [m for m in PALEO_MODELS if period in PALEO_DOWNLOADS.get(m, {})] - logging.info( - f"\n{'='*60}\n CMIP6 period: {period} ({len(models)} models)\n{'='*60}" - ) - ok = failed = 0 - for model in models: - raw_dir = RAW_DIR / model - if not raw_dir.exists(): - logging.warning(f" {raw_dir} not found — run download_paleo.py first") - failed += 1 - continue - logging.info(f" Processing {model}") - if _process_cmip6_model( - raw_dir, PROCESSED_DIR / model, period, skip_cleanup - ): - ok += 1 - else: - failed += 1 - logging.info(f" {period}: {ok} succeeded, {failed} failed") - - -# --------------------------------------------------------------------------- -# Observations — sub-processors -# --------------------------------------------------------------------------- - - -def _parse_holocene(hol_ds: xr.Dataset, var: str) -> xr.Dataset: - latband = xr.Dataset( - { - "tas": (["lat_bnd", "age", "ens"], hol_ds[f"{var}_latbands"].data), - "lat_bnd_weights": (["lat_bnd"], hol_ds.latband_weights.data), - }, - coords={ - "lat_bnd": hol_ds["latband_ranges"].data, - "age": hol_ds.age.data, - "ens": np.arange(500), - }, - ) - global_ = xr.Dataset( - { - "tas": ( - ["lat_bnd", "age", "ens"], - hol_ds[f"{var}_globalmean"] - .expand_dims({"lat_bnds": ["90S_to_90N"]}) - .data, - ), - "lat_bnd_weights": (["lat_bnd"], [1]), - }, - coords={ - "lat_bnd": ["90S_to_90N"], - "age": hol_ds.age.data, - "ens": np.arange(500), - }, - ) - combined = xr.concat([latband, global_], dim="lat_bnd") - midH = combined.sel(age=slice(4000, 8000)).mean(dim="age") - return xr.merge( - [midH.mean(dim="ens"), midH["tas"].std(dim="ens").to_dataset(name="tas_std")] - ) - - -def _process_lgmda(obs_raw: Path, da_dir: Path) -> xr.Dataset: - """lgmDA monthly gridded fields → da/lgm_lgmda_da.nc. Returns the combined dataset.""" - lgm_raw = xr.open_dataset(obs_raw / "lgmDA_lgm_ATM_monthly_climo.nc") - pi_raw = xr.open_dataset(obs_raw / "lgmDA_hol_ATM_monthly_climo.nc") - ds = xr.Dataset( - { - "lgm_tas": (["month", "lat", "lon"], lgm_raw.tas.data), - "pi_tas": (["month", "lat", "lon"], pi_raw.tas.data), - "lgm_tas_std": (["month", "lat", "lon"], lgm_raw.tas_std.data), - "pi_tas_std": (["month", "lat", "lon"], pi_raw.tas_std.data), - }, - coords={ - "month": np.arange(1, 13), - "lon": lgm_raw.lon.data, - "lat": lgm_raw.lat.data, - }, - ) - ds.to_netcdf(da_dir / "lgm_lgmda_da.nc") - logging.info(" Saved da/lgm_lgmda_da.nc") - return ds - - -def _process_lgmr(obs_raw: Path, da_dir: Path) -> None: - """Osman et al. 2021 LGMR → da/lgm_lgmr_{sat,sst,gmst}_da.nc. - - All LGMR variables are absolute temperatures (°C). Anomalies are computed - relative to the pre-industrial reference (100–1000 BP mean). - - SAT and SST live on different grids (96×144 vs 384×320) so they are saved - as separate files. - - GMST is saved as a full deglaciation time series (anomaly vs PI) so the - complete 0–26 ka record is available for plotting. - """ - osman_dir = obs_raw / "osman2021" - required = osman_dir / "LGMR_SAT_climo.nc" - if not required.exists(): - logging.warning(" [skip] lgm_lgmr_*_da.nc — LGMR_SAT_climo.nc not found") - return - - # PI reference: 100–1000 BP (5 youngest 200-yr bins, pre-industrial) - # LGM window: 19–24 ka BP - pi_age = slice(100, 1000) - lgm_age = slice(19000, 24000) - - # --- Gridded files: SAT and SST --- - for fname, out_name, skip_vars in [ - ("LGMR_SAT_climo.nc", "lgm_lgmr_sat_da.nc", set()), - ("LGMR_SST_climo.nc", "lgm_lgmr_sst_da.nc", {"tarea"}), - ]: - p = osman_dir / fname - if not p.exists(): - logging.warning(f" [skip] {out_name} — {fname} not found") - continue - ds = xr.open_dataset(p).load() - pi_mean = ds.sel(age=pi_age).mean(dim="age") - lgm_mean = ds.sel(age=lgm_age).mean(dim="age") - - out = xr.Dataset() - for var in ds.data_vars: - if var in skip_vars: - out[var] = ( - ds[var].isel(age=0, drop=True) if "age" in ds[var].dims else ds[var] - ) - elif var.endswith("_std"): - # Keep LGM-period ensemble spread; differencing stds is not meaningful - out[var] = lgm_mean[var] - out[var].attrs = {**ds[var].attrs, "note": "ensemble spread at LGM"} - else: - out[var] = lgm_mean[var] - pi_mean[var] - out[var].attrs = { - **ds[var].attrs, - "note": "LGM (19–24 ka) anomaly relative to PI (100–1000 BP)", - } - out.to_netcdf(da_dir / out_name) - logging.info(f" Saved da/{out_name}") - - # --- GMST: save full time series as anomaly vs PI --- - gmst_path = osman_dir / "LGMR_GMST_climo.nc" - if not gmst_path.exists(): - logging.warning(" [skip] lgm_lgmr_gmst_da.nc — LGMR_GMST_climo.nc not found") - return - ds = xr.open_dataset(gmst_path).load() - pi_val = float(ds["gmst"].sel(age=pi_age).mean(dim="age").values) - out = xr.Dataset( - { - "gmst_anom": ds["gmst"] - pi_val, - "gmst_anom_std": ds["gmst_std"], - "gmst_abs": ds["gmst"], - } - ) - out["gmst_anom"].attrs = { - "units": "degrees Celsius", - "long_name": "GMST anomaly relative to PI (100–1000 BP)", - } - out["gmst_anom_std"].attrs = ds["gmst_std"].attrs - out["gmst_abs"].attrs = {**ds["gmst"].attrs, "note": "absolute temperature"} - out.to_netcdf(da_dir / "lgm_lgmr_gmst_da.nc") - logging.info(" Saved da/lgm_lgmr_gmst_da.nc") - - -def _process_ottobliesner_lig( - obs_raw: Path, proxy_dir: Path -) -> tuple[xr.Dataset, xr.DataArray]: - """Otto-Bliesner et al. (2021), Clim. Past 17, 63–88 LIG proxy tables → - proxy/lig127k_ottobliesner_tas_proxy.nc. - Returns (lig_ds, lig_weights) for use in summary CSVs.""" - lig_dir = obs_raw / "lig127k" - tables = [ - "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", - "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", - "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", - ] - lig_df = pd.concat([pd.read_excel(lig_dir / t, skiprows=2) for t in tables]) - lig_df["SD"] = lig_df["Anom+1SD"] - lig_df["Anom"] - lig_ds = ( - lig_df[["Latitude", "Longitude", "Anom", "SD"]] - .groupby(["Latitude", "Longitude"]) - .mean() - .to_xarray() - .rename({"Latitude": "lat", "Longitude": "lon", "Anom": "tas", "SD": "tas_std"}) - ) - lig_ds.to_netcdf(proxy_dir / "lig127k_ottobliesner_tas_proxy.nc") - logging.info(" Saved proxy/lig127k_ottobliesner_tas_proxy.nc") - lig_weights = np.cos(np.deg2rad(lig_ds.lat)).expand_dims({"lon": lig_ds.lon}) - return lig_ds, lig_weights - - -def _process_scussolini(obs_raw: Path, proxy_dir: Path) -> None: - """Scussolini et al. 2019 LIG precip proxy → proxy/lig127k_scussolini_pr_proxy.csv.""" - xlsx_path = obs_raw / "scussolini2019_lig_precip_proxy.xlsx" - if not xlsx_path.exists() or xlsx_path.stat().st_size == 0: - logging.warning( - " [skip] proxy/lig127k_scussolini_pr_proxy.csv — file missing or empty" - " (manual download required, see download_paleo.py)" - ) - return - - # Data is in the 'Proxy_Database' sheet; 'LatºN' and 'LonºE' are the coords. - df = pd.read_excel( - xlsx_path, sheet_name="Proxy_Database", header=0, engine="openpyxl" - ) - col_lower = {c.lower(): c for c in df.columns} - lat_col = next((col_lower[k] for k in col_lower if "lat" in k), None) - lon_col = next((col_lower[k] for k in col_lower if "lon" in k), None) - if lat_col is None or lon_col is None: - logging.warning( - f" Scussolini xlsx: could not detect lat/lon columns. Found: {list(df.columns)}" - ) - return - - df.rename(columns={lat_col: "lat", lon_col: "lon"}, inplace=True) - df.to_csv(proxy_dir / "lig127k_scussolini_pr_proxy.csv", index=False) - logging.info(f" Saved proxy/lig127k_scussolini_pr_proxy.csv ({len(df)} records)") - - -def _process_bartlein2011(obs_raw: Path, proxy_dir: Path) -> None: - """Bartlein et al. 2011 pollen reconstructions → proxy/lgm_bartlein_proxy.nc - and proxy/midh_bartlein_proxy.nc. - - The zip contains one NetCDF per variable per period - ({var}_delta_{06|21}ka_ALL_grid_2x2.nc). Variables are merged into one - Dataset per period (6ka = midHolocene, 21ka = LGM). - """ - import tempfile - - zip_path = obs_raw / "bartlein2011_pollen_climate_recon.zip" - if not zip_path.exists(): - logging.warning(" [skip] Bartlein 2011 — zip not downloaded") - return - - with zipfile.ZipFile(zip_path) as zf, tempfile.TemporaryDirectory() as tmp: - tmp_path = Path(tmp) - zf.extractall(tmp_path) - - period_datasets: dict[str, list[xr.Dataset]] = {"06ka": [], "21ka": []} - for nc_file in sorted(tmp_path.glob("*.nc")): - name = nc_file.stem # e.g. mat_delta_06ka_ALL_grid_2x2 - for period in period_datasets: - if f"_{period}_" in name: - period_datasets[period].append(xr.open_dataset(nc_file).load()) - break - - period_out = { - "06ka": ("midh_bartlein_proxy.nc", "midH"), - "21ka": ("lgm_bartlein_proxy.nc", "LGM"), - } - for period, datasets in period_datasets.items(): - out_name, label = period_out[period] - if not datasets: - logging.warning(f" Bartlein 2011: no files found for {period}") - continue - merged = xr.merge(datasets) - merged.to_netcdf(proxy_dir / out_name) - logging.info( - f" Saved proxy/{out_name} ({label}, {len(datasets)} variables)" - ) - - -def _process_hansen_deeptime(obs_raw: Path, proxy_dir: Path) -> None: - """Tierney THansenMethod.csv → proxy/deeptime_hansen_proxy.csv.""" - csv_path = obs_raw / "THansenMethod.csv" - if not csv_path.exists(): - logging.warning( - " [skip] proxy/deeptime_hansen_proxy.csv — THansenMethod.csv not found" - ) - return - pd.read_csv(csv_path).to_csv(proxy_dir / "deeptime_hansen_proxy.csv", index=False) - logging.info(" Saved proxy/deeptime_hansen_proxy.csv") - - -def _process_sisal(obs_raw: Path, proxy_dir: Path) -> None: - """Extract SISAL v3 speleothem database zips into proxy/sisal_v3/.""" - sisal_raw = obs_raw / "sisal_v3" - sisal_proc = proxy_dir / "sisal_v3" - - for fname in ["sisalv3_database_mysql_csv.zip", "sisalv3_codes.zip"]: - zip_path = sisal_raw / fname - if not zip_path.exists(): - logging.warning(f" [skip] sisal_v3 — {fname} not found") - continue - dest = sisal_proc / fname.replace(".zip", "") - if dest.exists(): - logging.info(f" [skip] {fname} already extracted") - continue - dest.mkdir(parents=True, exist_ok=True) - with zipfile.ZipFile(zip_path) as zf: - zf.extractall(dest) - logging.info(f" Extracted {fname} → proxy/sisal_v3/{dest.name}/") - - -# --------------------------------------------------------------------------- -# Observations — top-level orchestrator -# --------------------------------------------------------------------------- - - -def process_observations() -> None: - obs_raw = RAW_DIR / "observations" - obs_proc = PROCESSED_DIR / "observations" - proxy_dir = obs_proc / "proxy" - da_dir = obs_proc / "da" - - for d in (obs_proc, proxy_dir, da_dir): - d.mkdir(parents=True, exist_ok=True) - - # ---- Data assimilation ---- - logging.info("Processing LGM lgmDA (data assimilation)") - lgmda_ds = _process_lgmda(obs_raw, da_dir) - - logging.info("Processing LGM Osman 2021 LGMR (data assimilation)") - _process_lgmr(obs_raw, da_dir) - - # ---- Proxy ---- - logging.info("Processing LIG Otto-Bliesner et al. 2021 temperature proxy") - lig_ds, lig_weights = _process_ottobliesner_lig(obs_raw, proxy_dir) - - logging.info("Processing LIG Scussolini et al. 2019 precipitation proxy") - _process_scussolini(obs_raw, proxy_dir) - - logging.info("Processing Bartlein et al. 2011 pollen reconstructions (LGM + midH)") - _process_bartlein2011(obs_raw, proxy_dir) - - logging.info("Processing deep-time Hansen reconstruction") - _process_hansen_deeptime(obs_raw, proxy_dir) - - logging.info("Extracting SISAL v3 speleothem database") - _process_sisal(obs_raw, proxy_dir) - - # ---- Mid Holocene (Temp12k) — needed for summary CSVs ---- - logging.info("Processing Mid Holocene Temp12k (Kaufman et al. 2020)") - hol_ds = xr.open_dataset(obs_raw / "temp12k_alldata.nc").load() - midH_scc = _parse_holocene(hol_ds, "scc") - - # ---- Derived LGM anomaly fields for summaries ---- - lgm_ds = (lgmda_ds["lgm_tas"] - lgmda_ds["pi_tas"]).to_dataset(name="tas") - lgm_ds["tas_std"] = lgmda_ds["lgm_tas_std"] - lgm_annual = lgm_ds.mean(dim="month") - lgm_weights = np.cos(np.deg2rad(lgm_annual.lat)).expand_dims( - {"lon": lgm_annual.lon} - ) - - # ---- Global mean annual CSV (all periods) ---- - logging.info("Building annual_mean_global_obs.csv") - paleo_avgs = pd.read_csv(obs_raw / "Figure7_19_obs.csv", skiprows=2) - midH_global = midH_scc.sel(lat_bnd="90S_to_90N") - midH_mean = float(midH_global["tas"].values) - midH_std = float(midH_global["tas_std"].values) - lig_zmean = lig_ds.weighted(lig_weights).mean() - lig_mean = float(lig_zmean["tas"].values) - lig_std = float(lig_zmean["tas_std"].values) - - paleo_avgs = pd.concat( - [ - paleo_avgs, - pd.DataFrame( - { - "Time Period": ["midHolocene"], - "min temperature [degreesC]": [midH_mean - midH_std], - "mean temperature [degreesC]": [midH_mean], - "max temperature [degreesC]": [midH_mean + midH_std], - } - ), - pd.DataFrame( - { - "Time Period": ["lig127k"], - "min temperature [degreesC]": [lig_mean - lig_std], - "mean temperature [degreesC]": [lig_mean], - "max temperature [degreesC]": [lig_mean + lig_std], - } - ), - ] - ) - paleo_avgs["error [degreesC]"] = ( - paleo_avgs["max temperature [degreesC]"] - - paleo_avgs["mean temperature [degreesC]"] - ) - paleo_avgs = paleo_avgs[ - ~paleo_avgs["Time Period"].isin(["Historical", "post 1975"]) - ] - paleo_avgs["period_idx"] = [3, 1, 0, 4, 2] - paleo_avgs = paleo_avgs.sort_values("period_idx") - paleo_avgs["period"] = [ - "eocene", - "midPliocene-eoi400", - "lig127k", - "lgm", - "midHolocene", - ] - ( - paleo_avgs.rename( - columns={ - "mean temperature [degreesC]": "tas_anom", - "error [degreesC]": "error", - } - )[["tas_anom", "error", "period", "period_idx"]].to_csv( - obs_proc / "annual_mean_global_obs.csv" - ) - ) - logging.info("Saved annual_mean_global_obs.csv") - - # ---- Zonal mean annual CSV ---- - logging.info("Building annual_mean_zonal_obs.csv") - regions = { - "global": [-90, 90], - "northern_hemisphere": [0, 90], - "tropics": [-30, 30], - "southern_hemisphere": [-90, 0], - } - regions_midH = { - "global": ["90S_to_90N"], - "northern_hemisphere": ["0N_to_30N", "30N_to_60N", "60N_to_90N"], - "tropics": ["30S_to_0S", "0N_to_30N"], - "southern_hemisphere": ["30S_to_0S", "60S_to_30S", "90S_to_60S"], - } - rows = [] - for region, (lat_min, lat_max) in regions.items(): - lig_sl = lig_ds.sel(lat=slice(lat_min, lat_max)) - lig_w = lig_weights.sel(lat=slice(lat_min, lat_max)) - lgm_sl = lgm_annual.sel(lat=slice(lat_min, lat_max)) - lgm_w = lgm_weights.sel(lat=slice(lat_min, lat_max)) - midH_sl = midH_scc.sel(lat_bnd=regions_midH[region]) - - for period, tas, err in [ - ( - "lig127k", - float( - lig_sl["tas"] - .weighted(lig_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .values - ), - float( - lig_sl["tas_std"] - .weighted(lig_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .values - ), - ), - ( - "lgm", - float( - lgm_sl["tas"] - .weighted(lgm_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .values - ), - float( - lgm_sl["tas_std"] - .weighted(lgm_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .values - ), - ), - ( - "midHolocene", - float( - midH_sl["tas"] - .weighted(midH_sl["lat_bnd_weights"].fillna(0)) - .mean(dim=["lat_bnd"]) - .values - ), - float( - midH_sl["tas_std"] - .weighted(midH_sl["lat_bnd_weights"].fillna(0)) - .mean(dim=["lat_bnd"]) - .values - ), - ), - ]: - rows.append( - {"period": period, "region": region, "tas_anom": tas, "error": err} - ) - - pd.DataFrame(rows).to_csv(obs_proc / "annual_mean_zonal_obs.csv", index=False) - logging.info("Saved annual_mean_zonal_obs.csv") - - # ---- Monthly zonal CSV (LGM lgmDA — only dataset with monthly resolution) ---- - logging.info("Building monthly_mean_zonal_obs.csv") - rows = [] - for region, (lat_min, lat_max) in regions.items(): - lgm_sl = lgm_ds.sel(lat=slice(lat_min, lat_max)) - lgm_w = lgm_weights.sel(lat=slice(lat_min, lat_max)) - tas_df = ( - lgm_sl["tas"] - .weighted(lgm_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .to_dataframe() - .reset_index() - ) - std_df = ( - lgm_sl["tas_std"] - .weighted(lgm_w.fillna(0)) - .mean(dim=["lat", "lon"]) - .to_dataframe() - .reset_index() - ) - df = pd.merge(tas_df, std_df, on="month").rename( - columns={"tas": "tas_anom", "tas_std": "error"} - ) - df["region"] = region - df["period"] = "lgm" - rows.append(df) - pd.concat(rows).to_csv(obs_proc / "monthly_mean_zonal_obs.csv", index=False) - logging.info("Saved monthly_mean_zonal_obs.csv") - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -def main() -> None: - parser = argparse.ArgumentParser( - description="Process raw paleoclimate data into a unified dataset.", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=__doc__, - ) - parser.add_argument( - "--source", - choices=["cmip6", "observations", "all"], - required=True, - help="Which data to process", - ) - parser.add_argument( - "--period", - default="all", - help="CMIP6 period or 'all' (only used with --source cmip6/all)", - ) - parser.add_argument( - "--skip-cleanup", - action="store_true", - help="Keep raw tas_Amon_*.nc files after CMIP6 processing", - ) - parser.add_argument( - "--log-level", choices=["DEBUG", "INFO", "WARNING", "ERROR"], default="INFO" - ) - parser.add_argument("--log-file", type=str) - args = parser.parse_args() - - setup_logging(args.log_level, args.log_file) - - if args.source in ("cmip6", "all"): - periods = PALEO_PERIODS if args.period == "all" else [args.period] - invalid = [p for p in periods if p not in PALEO_PERIODS] - if invalid: - parser.error(f"Unknown period(s): {invalid}") - process_cmip6(periods, args.skip_cleanup) - - if args.source in ("observations", "all"): - logging.info(f"\n{'='*60}\n Observations\n{'='*60}") - process_observations() - - -if __name__ == "__main__": - main() diff --git a/paleo_scripts/process_paleo_models.py b/paleo_scripts/process_paleo_models.py new file mode 100644 index 0000000..e807185 --- /dev/null +++ b/paleo_scripts/process_paleo_models.py @@ -0,0 +1,217 @@ +""" +Process raw CMIP6 paleoclimate model data into monthly climatologies. + +For each model/period/variable combination, all raw Amon NetCDF chunks are +concatenated, a 12-month climatology is computed, and the result is written to: + + paleo_data_cache/processed/models/{MODEL}/{period}_{variable}_monthly_climo.nc + +Annual mean is computed on the fly by callers (mean over the month dimension). + +Usage: + python process_paleo_models.py + python process_paleo_models.py --model AWI-ESM-1-1-LR --period lgm + python process_paleo_models.py --model AWI-ESM-1-1-LR --period lgm --variable pr + python process_paleo_models.py --model all --period all --variable all --overwrite + python process_paleo_models.py --model all --period lgm --delete-raw + python process_paleo_models.py --log-level DEBUG +""" + +import argparse +import logging +import sys +from datetime import date +from pathlib import Path + +import xarray as xr + +sys.path.insert(0, str(Path(__file__).parent.parent)) +from utils import standardize_dims + +PALEO_DIR = Path(__file__).parent +RAW_MODELS = PALEO_DIR / "paleo_data_cache" / "raw" / "models" +PROC_MODELS = PALEO_DIR / "paleo_data_cache" / "processed" / "models" + +PROCESSING_DATE = date.today().isoformat() + +KNOWN_PERIODS = ["lgm", "lig127k", "midHolocene", "midPliocene-eoi400"] +KNOWN_VARIABLES = ["tas", "pr"] + + +# --------------------------------------------------------------------------- +# Core processing +# --------------------------------------------------------------------------- + + +def _discover_periods(model_dir: Path) -> list[str]: + """Return periods that have at least one raw file in model_dir.""" + periods = set() + for f in model_dir.glob("*.nc"): + parts = f.name.split("_") + # filename pattern: {var}_Amon_{model}_{period}_... + if len(parts) >= 4: + periods.add(parts[3]) + return sorted(periods) + + +def _process_one( + model: str, period: str, variable: str, overwrite: bool, delete_raw: bool = False +) -> bool: + """Process a single model/period/variable. Returns True if output was written.""" + model_raw = RAW_MODELS / model + pattern = f"{variable}_Amon_*_{period}_*.nc" + files = sorted(model_raw.glob(pattern)) + + if not files: + logging.warning( + f" [skip] {model} / {period} / {variable} — no raw files found" + ) + return False + + out_dir = PROC_MODELS / model + out_path = out_dir / f"{period}_{variable}_monthly_climo.nc" + + if out_path.exists() and not overwrite: + logging.info( + f" [skip] {out_path.relative_to(PALEO_DIR)} already exists (use --overwrite)" + ) + return False + + logging.info( + f" Processing {model} / {period} / {variable} ({len(files)} file(s))" + ) + + ds = xr.open_mfdataset( + files, + combine="by_coords", + use_cftime=True, + data_vars="minimal", + coords="minimal", + compat="override", + ) + ds = standardize_dims(ds) + + climo = ds[[variable]].groupby("time.month").mean("time") + n_years = len(ds.time) // 12 + + climo.attrs = ds[variable].attrs + climo[variable].attrs = ds[variable].attrs + climo.attrs.update( + { + "model": model, + "period": period, + "variable": variable, + "n_years_averaged": n_years, + "source_files": ", ".join(f.name for f in files), + "processing_date": PROCESSING_DATE, + } + ) + + out_dir.mkdir(parents=True, exist_ok=True) + out_path.unlink(missing_ok=True) + climo.to_netcdf(out_path) + logging.info(f" Saved {out_path.relative_to(PALEO_DIR)}") + ds.close() + + if delete_raw: + for f in files: + f.unlink() + logging.debug(f" Deleted {f.relative_to(PALEO_DIR)}") + logging.info(f" Deleted {len(files)} raw file(s)") + + return True + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Process CMIP6 paleo model data into monthly climatologies." + ) + parser.add_argument( + "--model", + nargs="+", + default=["all"], + help="Model name(s) or 'all' to discover from raw/models/ subdirectories", + ) + parser.add_argument( + "--period", + nargs="+", + default=["all"], + choices=KNOWN_PERIODS + ["all"], + help="Period(s) or 'all'", + ) + parser.add_argument( + "--variable", + nargs="+", + default=["all"], + choices=KNOWN_VARIABLES + ["all"], + help="Variable(s) or 'all'", + ) + parser.add_argument( + "--overwrite", + action="store_true", + help="Reprocess even if output already exists", + ) + parser.add_argument( + "--delete-raw", + action="store_true", + help="Delete raw source files after successful processing", + ) + parser.add_argument( + "--log-level", default="INFO", choices=["DEBUG", "INFO", "WARNING", "ERROR"] + ) + args = parser.parse_args() + + logging.basicConfig( + level=getattr(logging, args.log_level), format="%(levelname)s %(message)s" + ) + + # Resolve models + if "all" in args.model: + if not RAW_MODELS.exists(): + logging.error(f"Raw models directory not found: {RAW_MODELS}") + sys.exit(1) + models = sorted(d.name for d in RAW_MODELS.iterdir() if d.is_dir()) + else: + models = args.model + + # Resolve variables + variables = KNOWN_VARIABLES if "all" in args.variable else args.variable + + written = 0 + skipped = 0 + + for model in models: + model_dir = RAW_MODELS / model + if not model_dir.exists(): + logging.warning(f"[skip] {model} — directory not found in raw/models/") + continue + + # Resolve periods: either explicit list or discover from filenames + if "all" in args.period: + periods = _discover_periods(model_dir) + if not periods: + logging.warning(f"[skip] {model} — no raw NetCDF files found") + continue + else: + periods = args.period + + for period in periods: + for variable in variables: + ok = _process_one( + model, period, variable, args.overwrite, args.delete_raw + ) + if ok: + written += 1 + else: + skipped += 1 + + logging.info(f"Done — {written} file(s) written, {skipped} skipped.") + + +if __name__ == "__main__": + main() diff --git a/paleo_scripts/process_paleo_observations.py b/paleo_scripts/process_paleo_observations.py new file mode 100644 index 0000000..274fb68 --- /dev/null +++ b/paleo_scripts/process_paleo_observations.py @@ -0,0 +1,750 @@ +""" +Process raw paleoclimate observational data into standardized, period-sorted files. + +Output structure — all under paleo_data_cache/processed/observations/ + lgm/ + lgmDA_v2.1_tas.nc lgmDA LGM climatology + Holocene PI reference + anomaly + LGMR_SAT_tas.nc LGMR LGM surface air temperature anomaly (Osman et al. 2021) + LGMR_SST_tos.nc LGMR LGM sea surface temperature anomaly (Osman et al. 2021) + Bartlein2011_tas.nc Pollen-based LGM MAT anomaly (Bartlein et al. 2011) + Bartlein2011_pr.nc Pollen-based LGM MAP anomaly (Bartlein et al. 2011) + midHolocene/ + Bartlein2011_tas.nc Pollen-based mid-Holocene MAT anomaly + Bartlein2011_pr.nc Pollen-based mid-Holocene MAP anomaly + Temp12k_tas.nc Holocene temperature reconstruction (Kaufman et al. 2020) + lig127k/ + OttoBliesner2021_tas.nc LIG proxy temperature anomalies (Otto-Bliesner et al. 2021) + Scussolini2019_pr.nc LIG boreal precipitation proxy (Scussolini et al. 2019) + multi_period/ + ipcc_ar6_fig7_19.csv Global mean temperature anomalies (IPCC AR6) + tierney2020_global_tas.csv Deep-time global mean temperature (Tierney et al. 2020) + +Each NetCDF carries global attributes: source, doi, source_url, variable, units, period, +anomaly_ref (where applicable), and processing_date. + +Variable naming conventions (matched to paleo_benchmark.py): + tas, tas_std, tas_sig_val surface air temperature, uncertainty, significance flag + pr, pr_std, pr_sig_val precipitation anomaly, uncertainty, significance flag + pr_reliability semi-quantitative reliability score (Scussolini only) + pi_tas pre-industrial (Holocene) monthly tas (lgmDA only) + tos, tos_std sea surface temperature, uncertainty + +Usage: + python process_paleo_observations.py + python process_paleo_observations.py --source lgmda bartlein2011 + python process_paleo_observations.py --source all --log-level DEBUG + python process_paleo_observations.py --delete-raw +""" + +import argparse +import logging +import shutil +import sys +import tempfile +import zipfile +from datetime import date +from pathlib import Path +from typing import Optional + +import numpy as np +import pandas as pd +import xarray as xr + +PALEO_DIR = Path(__file__).parent +RAW_DIR = PALEO_DIR / "paleo_data_cache" / "raw" / "observations" +OBS_PROC = PALEO_DIR / "paleo_data_cache" / "processed" / "observations" + +PROCESSING_DATE = date.today().isoformat() + +# LGM age window (years BP) used to average the LGMR reanalysis +LGM_AGE_MIN = 19_000 +LGM_AGE_MAX = 23_000 + + +# --------------------------------------------------------------------------- +# Metadata / IO helpers +# --------------------------------------------------------------------------- + + +def _write_nc(ds: xr.Dataset, path: Path, attrs: dict) -> None: + """Write dataset to NetCDF with standardised global attributes.""" + attrs.setdefault("processing_date", PROCESSING_DATE) + ds.attrs = attrs + path.parent.mkdir(parents=True, exist_ok=True) + path.unlink(missing_ok=True) + ds.to_netcdf(path) + logging.info(f" Saved {path.relative_to(PALEO_DIR)}") + + +def _write_csv(df: pd.DataFrame, path: Path, comment_lines: list[str]) -> None: + """Write CSV with comment-header lines documenting provenance.""" + path.parent.mkdir(parents=True, exist_ok=True) + with open(path, "w") as f: + for line in comment_lines: + f.write(f"# {line}\n") + df.to_csv(f, index=False) + logging.info(f" Saved {path.relative_to(PALEO_DIR)} ({len(df)} rows)") + + +# --------------------------------------------------------------------------- +# IPCC AR6 Figure 7.19 +# --------------------------------------------------------------------------- + + +def _process_ipcc_ar6(raw: Path, proc: Path) -> None: + """Multi-period global mean temperature anomalies → multi_period/ipcc_ar6_fig7_19.csv""" + p = raw / "Figure7_19_obs.csv" + if not p.exists(): + logging.warning(" [skip] ipcc_ar6 — Figure7_19_obs.csv not found") + return + + df = pd.read_csv(p, header=2) + df.columns = ["time_period", "tas_min_anom", "tas_anom", "tas_max_anom"] + df["units"] = "K" + + _write_csv( + df, + proc / "multi_period" / "ipcc_ar6_fig7_19.csv", + [ + "source: IPCC AR6 Figure 7.19", + "source_url: https://dap.ceda.ac.uk/badc/ar6_wg1/data/ch_07/ch7_fig19/", + "variable: tas anomaly relative to pre-industrial", + "units: K", + "periods: Eocene, Pliocene, LGM, and others", + f"processing_date: {PROCESSING_DATE}", + ], + ) + + +# --------------------------------------------------------------------------- +# Tierney 2020 deep-time reconstruction +# --------------------------------------------------------------------------- + + +def _process_tierney2020(raw: Path, proc: Path) -> None: + """Deep-time global mean TAS timeseries → multi_period/tierney2020_global_tas.csv""" + p = raw / "THansenMethod.csv" + if not p.exists(): + logging.warning(" [skip] tierney2020 — THansenMethod.csv not found") + return + + df = pd.read_csv(p) + df.columns = ["age_Ma", "tas_degC"] + df["units"] = "degC" + + _write_csv( + df, + proc / "multi_period" / "tierney2020_global_tas.csv", + [ + "source: Tierney et al. (2020) Hansen-method deep-time reconstruction", + "source_url: https://github.com/jesstierney/PastClimates", + "variable: global mean surface temperature", + "units: degC (relative to pre-industrial)", + "age_Ma: millions of years before present", + f"processing_date: {PROCESSING_DATE}", + ], + ) + + +# --------------------------------------------------------------------------- +# lgmDA — LGM data assimilation (Tierney et al. 2020) +# --------------------------------------------------------------------------- + + +def _process_lgmda(raw: Path, proc: Path) -> None: + """lgmDA → lgm/lgmDA_v2.1_tas.nc with pi_tas, tas (anomaly), tas_std. + + Also writes multi_period/lgmDA_v2.1_holocene_tas.nc as a standalone + Holocene PI reference for use in anomaly computation across all periods. + """ + path_hol = raw / "lgmDA_hol_ATM_monthly_climo.nc" + path_lgm = raw / "lgmDA_lgm_ATM_monthly_climo.nc" + if not path_hol.exists() or not path_lgm.exists(): + logging.warning(" [skip] lgmda — raw files not found") + return + + def _load_lgmda(path: Path) -> xr.Dataset: + ds = xr.open_dataset(path).load() + return ( + ds.swap_dims({"nmonth": "nMonth"}) + .set_index({"nLat": "lat", "nLon": "lon", "nMonth": "month"}) + .rename({"nLat": "lat", "nLon": "lon", "nMonth": "month"}) + ) + + ds_hol = _load_lgmda(path_hol) + ds_lgm = _load_lgmda(path_lgm) + + # --- lgm/lgmDA_v2.1_tas.nc --- + # pi_tas: Holocene monthly climatology (absolute) + # tas: LGM − Holocene monthly anomaly + # tas_std: LGM posterior standard deviation + lgm_ds = xr.Dataset( + { + "pi_tas": ds_hol["tas"], # Holocene monthly clim + "tas": ds_lgm["tas"] - ds_hol["tas"], # LGM anomaly + "tas_std": ds_lgm["tas_std"], # LGM uncertainty + } + ) + _write_nc( + lgm_ds, + proc / "lgm" / "lgmDA_v2.1_tas.nc", + { + "source": "Tierney et al. (2020)", + "doi": "10.1038/s41586-020-2617-x", + "source_url": "https://github.com/jesstierney/lgmDA", + "variable": "tas", + "units": "K", + "period": "lgm", + "anomaly_ref": "Holocene (lgmDA v2.0)", + "pi_tas_description": "Holocene (PI) monthly mean surface air temperature (absolute)", + "tas_description": "LGM − Holocene monthly surface air temperature anomaly", + "tas_std_description": "LGM posterior 1-sigma uncertainty", + }, + ) + + # --- multi_period/lgmDA_v2.1_holocene_tas.nc --- + # Standalone Holocene reference file used as PI baseline for all periods + hol_ds = ds_hol[["tas", "tas_std"]].rename( + {"tas": "pi_tas", "tas_std": "pi_tas_std"} + ) + _write_nc( + hol_ds, + proc / "multi_period" / "lgmDA_v2.1_holocene_tas.nc", + { + "source": "Tierney et al. (2020)", + "doi": "10.1038/s41586-020-2617-x", + "source_url": "https://github.com/jesstierney/lgmDA", + "variable": "tas", + "units": "K", + "period": "Holocene (PI reference)", + "description": "Holocene monthly mean surface air temperature — PI reference for anomaly computation", + }, + ) + + +# --------------------------------------------------------------------------- +# LGMR SAT (Osman et al. 2021) +# --------------------------------------------------------------------------- + + +def _process_lgmr_sat(raw: Path, proc: Path) -> None: + """LGMR SAT → lgm/LGMR_SAT_tas.nc (LGM-window mean, lat/lon grid).""" + p = raw / "osman2021" / "LGMR_SAT_climo.nc" + if not p.exists(): + logging.warning(" [skip] lgmr_sat — LGMR_SAT_climo.nc not found") + return + + ds = xr.open_dataset(p).load() + + # Average over the LGM age window + lgm_mask = (ds.age >= LGM_AGE_MIN) & (ds.age <= LGM_AGE_MAX) + ds_lgm = ds.sel(age=lgm_mask).mean(dim="age") + n_ages = int(lgm_mask.sum()) + logging.info( + f" LGMR SAT: averaged over {n_ages} age slices ({LGM_AGE_MIN}–{LGM_AGE_MAX} BP)" + ) + + out_ds = xr.Dataset({"tas": ds_lgm["sat"], "tas_std": ds_lgm["sat_std"]}) + _write_nc( + out_ds, + proc / "lgm" / "LGMR_SAT_tas.nc", + { + "source": "Osman et al. (2021)", + "doi": "10.1038/s41586-021-03984-4", + "source_url": "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/osman2021/", + "variable": "tas", + "units": "degC", + "period": "lgm", + "anomaly_ref": "modern (LGMR reanalysis internal reference)", + "lgm_age_window_BP": f"{LGM_AGE_MIN}–{LGM_AGE_MAX}", + }, + ) + + +# --------------------------------------------------------------------------- +# LGMR SST (Osman et al. 2021) +# --------------------------------------------------------------------------- + + +def _process_lgmr_sst(raw: Path, proc: Path) -> None: + """LGMR SST → lgm/LGMR_SST_tos.nc (2D curvilinear lat/lon grid).""" + p = raw / "osman2021" / "LGMR_SST_climo.nc" + if not p.exists(): + logging.warning(" [skip] lgmr_sst — LGMR_SST_climo.nc not found") + return + + ds = xr.open_dataset(p).load() + + # Average over the LGM age window + lgm_mask = (ds.age >= LGM_AGE_MIN) & (ds.age <= LGM_AGE_MAX) + ds_lgm = ds.sel(age=lgm_mask).mean(dim="age") + + # The SST grid has 2D lat/lon; promote them to proper coordinates + lat_2d = ds_lgm["lat"].values + lon_2d = ds_lgm["lon"].values + ds_lgm = ds_lgm.drop_vars(["lat", "lon"]) + ds_lgm = ds_lgm.rename({"lat": "y", "lon": "x"}) + ny, nx = lat_2d.shape + ds_lgm = ds_lgm.assign_coords(y=np.arange(ny), x=np.arange(nx)) + ds_lgm = ds_lgm.assign_coords( + lat=xr.DataArray(lat_2d, dims=["y", "x"]), + lon=xr.DataArray(lon_2d, dims=["y", "x"]), + ) + if "nEns" in ds_lgm: + ds_lgm = ds_lgm.drop_vars("nEns") + + # Roll x so longitude starts near 0° (raw grid starts at ~320°) + roll_by = int(np.argmin(ds_lgm["lon"].values[ny // 2, :])) + ds_lgm = ds_lgm.roll(x=-roll_by, roll_coords=False) + ds_lgm = ds_lgm.assign_coords(x=np.arange(nx)) + + out_ds = xr.Dataset({"tos": ds_lgm["sst"], "tos_std": ds_lgm["sst_std"]}) + _write_nc( + out_ds, + proc / "lgm" / "LGMR_SST_tos.nc", + { + "source": "Osman et al. (2021)", + "doi": "10.1038/s41586-021-03984-4", + "source_url": "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/osman2021/", + "variable": "tos", + "units": "degC", + "period": "lgm", + "anomaly_ref": "modern (LGMR reanalysis internal reference)", + "grid": "curvilinear 2D lat/lon (y, x dimensions)", + "lgm_age_window_BP": f"{LGM_AGE_MIN}–{LGM_AGE_MAX}", + }, + ) + + +# --------------------------------------------------------------------------- +# Bartlein et al. 2011 +# --------------------------------------------------------------------------- + +_BARTLEIN_PERIOD_MAP = { + "06ka": ("midHolocene", "MIDH"), + "21ka": ("lgm", "LGM"), +} + + +def _extract_bartlein_zip(raw: Path) -> Optional[Path]: + """Extract the Bartlein zip to a temp-like subdirectory; return path or None.""" + zp = raw / "bartlein2011_pollen_climate_recon.zip" + if not zp.exists(): + logging.warning(" [skip] bartlein2011 — zip not found") + return None + dest = raw / "bartlein2011" + if dest.exists(): + # Already extracted + return dest + dest.mkdir() + with zipfile.ZipFile(zp) as zf: + zf.extractall(dest) + return dest + + +def _process_bartlein2011(raw: Path, proc: Path) -> None: + """Bartlein → lgm/Bartlein2011_{tas,pr}.nc and midHolocene/Bartlein2011_{tas,pr}.nc""" + bart_dir = _extract_bartlein_zip(raw) + if bart_dir is None: + return + + per_period: dict[str, dict[str, xr.Dataset]] = {} + + for ka, (period_dir, period_label) in _BARTLEIN_PERIOD_MAP.items(): + mat_file = bart_dir / f"mat_delta_{ka}_ALL_grid_2x2.nc" + map_file = bart_dir / f"map_delta_{ka}_ALL_grid_2x2.nc" + + if not mat_file.exists() or not map_file.exists(): + logging.warning(f" [skip] bartlein2011 {ka} — NC files not found in zip") + continue + + ds_mat = xr.open_dataset(mat_file) + ds_map = xr.open_dataset(map_file) + + tas_ds = xr.Dataset( + { + "tas": ds_mat["mat_anm_mean"], + "tas_std": ds_mat["mat_se_mean"], + "tas_sig_val": ds_mat["mat_sig"], + } + ) + pr_ds = xr.Dataset( + { + "pr": ds_map["map_anm_mean"], + "pr_std": ds_map["map_se_mean"], + "pr_sig_val": ds_map["map_sig"], + } + ) + + common_attrs = { + "source": "Bartlein et al. (2011)", + "doi": "10.1007/s00382-010-0904-1", + "source_url": "https://static-content.springer.com/esm/art%3A10.1007%2Fs00382-010-0904-1/", + "period": period_dir, + "processing_date": PROCESSING_DATE, + } + + _write_nc( + tas_ds, + proc / period_dir / "Bartlein2011_tas.nc", + { + **common_attrs, + "variable": "tas", + "units": "K (anomaly relative to pre-industrial)", + "tas_description": "Mean Annual Temperature anomaly (mat_anm_mean)", + "tas_std_description": "Standard error of MAT anomaly (mat_se_mean)", + "tas_sig_val_description": "Significance flag: non-zero = significant", + }, + ) + _write_nc( + pr_ds, + proc / period_dir / "Bartlein2011_pr.nc", + { + **common_attrs, + "variable": "pr", + "units": "mm/yr (anomaly relative to pre-industrial)", + "pr_description": "Mean Annual Precipitation anomaly (map_anm_mean)", + "pr_std_description": "Standard error of MAP anomaly (map_se_mean)", + "pr_sig_val_description": "Significance flag: non-zero = significant", + }, + ) + + +# --------------------------------------------------------------------------- +# Temp12k (Kaufman et al. 2020) +# --------------------------------------------------------------------------- + + +def _process_temp12k(raw: Path, proc: Path) -> None: + """Temp12k → midHolocene/Temp12k_tas.nc (latitudinal band reconstructions).""" + p = raw / "temp12k_alldata.nc" + if not p.exists(): + logging.warning(" [skip] temp12k — temp12k_alldata.nc not found") + return + + ds = xr.open_dataset(p).load() + + ds_all = ds.set_coords(["age", "latband_ranges"]).swap_dims( + {"latbands": "latband_ranges"} + ) + ds_latbnds = ds_all.drop_vars( + [ + "scc_globalmean", + "dcc_globalmean", + "gam_globalmean", + "cps_globalmean", + "pai_globalmean", + ] + ) + ds_glob = ds_all[ + [ + "scc_globalmean", + "dcc_globalmean", + "gam_globalmean", + "cps_globalmean", + "pai_globalmean", + ] + ] + ds_glob = ds_glob.expand_dims({"latband_ranges": ["90S_to_90N"]}).rename( + { + "scc_globalmean": "scc_latbands", + "dcc_globalmean": "dcc_latbands", + "gam_globalmean": "gam_latbands", + "cps_globalmean": "cps_latbands", + "pai_globalmean": "pai_latbands", + } + ) + ds_all = xr.concat([ds_latbnds, ds_glob], dim="latband_ranges") + + dataset_list = [] + for var in ds_all.data_vars: + if var != "latband_weights": + ds_temp = ds_all[var].expand_dims( + {"reconstruct_method": [var.split("_")[0]]} + ) + dataset_list.append(ds_temp.to_dataset(name="tas_anom")) + + ds_new = xr.concat(dataset_list, dim="reconstruct_method") + ds_new = xr.merge([ds_new, ds_all[["latband_weights"]]]) + + _write_nc( + ds_new, + proc / "midHolocene" / "Temp12k_tas.nc", + { + "source": "Kaufman et al. (2020)", + "doi": "10.1038/s41597-020-0530-7", + "source_url": "https://www.ncei.noaa.gov/pub/data/paleo/reconstructions/kaufman2020/", + "variable": "tas", + "units": "K (anomaly relative to pre-industrial)", + "period": "midHolocene", + "description": "Holocene latitudinal band surface temperature reconstructions (5 methods)", + "methods": "scc, dcc, gam, cps, pai", + }, + ) + + +# --------------------------------------------------------------------------- +# Otto-Bliesner et al. 2021 (LIG127k) +# --------------------------------------------------------------------------- + + +def _process_ottobliesner2021(raw: Path, proc: Path) -> None: + """Otto-Bliesner → lig127k/OttoBliesner2021_tas.nc (site-dimension NetCDF).""" + lig_dir = raw / "lig127k" + tables = [ + "Table S2. Annual - NH Oceans, Europe, and Greenland (40-90N)_CP-2019-174.xlsx", + "Table S3. Annual - Low latitudes (40S-40N)_CP-2019-174.xlsx", + "Table S4. Annual - SH Oceans and Antarctica (40-90S)_CP-2019-174.xlsx", + ] + columns_needed = ["Latitude", "Longitude", "Anom-1SD", "Anom", "Anom+1SD"] + + frames = [] + for t in tables: + p = lig_dir / t + if p.exists(): + df = pd.read_excel(p, header=2)[columns_needed] + frames.append(df) + else: + logging.warning(f" Otto-Bliesner: {t} not found") + + if not frames: + logging.warning(" [skip] ottobliesner2021 — no table files found") + return + + df = pd.concat(frames, ignore_index=True).dropna(subset=["Anom"]) + n = len(df) + + # 1-sigma = average of upper and lower 1SD bounds + tas = df["Anom"].values.astype(float) + tas_std = ((df["Anom+1SD"] - df["Anom-1SD"]) / 2.0).values.astype(float) + + ds = xr.Dataset( + { + "tas": xr.DataArray(tas, dims=["site"]), + "tas_std": xr.DataArray(tas_std, dims=["site"]), + }, + coords={ + "lat": xr.DataArray(df["Latitude"].values.astype(float), dims=["site"]), + "lon": xr.DataArray(df["Longitude"].values.astype(float), dims=["site"]), + }, + ) + _write_nc( + ds, + proc / "lig127k" / "OttoBliesner2021_tas.nc", + { + "source": "Otto-Bliesner et al. (2021)", + "doi": "10.5194/cp-17-63-2021", + "source_url": "https://cp.copernicus.org/articles/17/63/2021/", + "variable": "tas", + "units": "K (anomaly relative to pre-industrial)", + "period": "lig127k", + "n_sites": n, + "tas_description": "Annual mean temperature anomaly (Anom column)", + "tas_std_description": "1-sigma = (Anom+1SD − Anom−1SD) / 2", + "tables_used": "S2 (NH), S3 (Tropics), S4 (SH)", + }, + ) + + +# --------------------------------------------------------------------------- +# Scussolini et al. 2019 (LIG precipitation) +# --------------------------------------------------------------------------- + + +def _process_scussolini2019(raw: Path, proc: Path) -> None: + """Scussolini → lig127k/Scussolini2019_pr.nc (site-dimension NetCDF).""" + p = raw / "scussolini2019_lig_precip_proxy.xlsx" + if not p.exists(): + logging.warning( + " [skip] scussolini2019 — file not found. " + "Run download_paleo_observations.py --dataset scussolini2019 and follow instructions." + ) + return + + df = pd.read_excel(p, sheet_name="Proxy_Database", header=0) + + lat_col = "LatºN" + lon_col = "LonºE" + pr_col = "Quantitative signal of ΔP (mm)" + rel_col = "Reliability score" + + # Keep only rows with valid lat/lon + df = df.dropna(subset=[lat_col, lon_col]) + n_total = len(df) + + # pr_col may be missing/NaN for sites without quantitative estimates + if pr_col not in df.columns: + logging.warning(" [skip] scussolini2019 — quantitative ΔP column not found") + return + + pr = df[pr_col].values.astype(float) + reliability = ( + df[rel_col].values.astype(float) if rel_col in df.columns else np.ones(n_total) + ) + + ds = xr.Dataset( + { + "pr": xr.DataArray(pr, dims=["site"]), + "pr_reliability": xr.DataArray(reliability, dims=["site"]), + }, + coords={ + "lat": xr.DataArray(df[lat_col].values.astype(float), dims=["site"]), + "lon": xr.DataArray(df[lon_col].values.astype(float), dims=["site"]), + }, + ) + n_quant = int(np.isfinite(pr).sum()) + _write_nc( + ds, + proc / "lig127k" / "Scussolini2019_pr.nc", + { + "source": "Scussolini et al. (2019)", + "doi": "10.1126/sciadv.aax7047", + "source_url": "https://www.science.org/doi/10.1126/sciadv.aax7047", + "variable": "pr", + "units": "mm (annual precipitation anomaly relative to present)", + "period": "lig127k", + "n_sites_total": n_total, + "n_sites_quantitative": n_quant, + "pr_description": "Quantitative annual precipitation anomaly (ΔP mm); NaN = qualitative only", + "pr_reliability_description": ( + "Reliability score (0–2): 0=low, 1=moderate, 2=high. " + "Benchmark uses σ=300 mm/yr for score 1, σ=150 mm/yr for score ≥2" + ), + }, + ) + + +# --------------------------------------------------------------------------- +# Source registry +# --------------------------------------------------------------------------- + +SOURCE_REGISTRY: dict[str, tuple[str, callable]] = { + "ipcc_ar6": ( + "IPCC AR6 Fig 7.19 multi-period global mean anomalies", + _process_ipcc_ar6, + ), + "tierney2020": ( + "Tierney et al. 2020 deep-time global mean TAS", + _process_tierney2020, + ), + "lgmda": ( + "lgmDA v2.1 — LGM data assimilation (Tierney et al. 2020)", + _process_lgmda, + ), + "lgmr_sat": ( + "LGMR SAT — LGM surface air temp (Osman et al. 2021)", + _process_lgmr_sat, + ), + "lgmr_sst": ( + "LGMR SST — LGM sea surface temp (Osman et al. 2021)", + _process_lgmr_sst, + ), + "bartlein2011": ( + "Bartlein et al. 2011 pollen-based LGM/mid-Hol recon", + _process_bartlein2011, + ), + "temp12k": ( + "Temp12k — Holocene lat-band reconstruction (Kaufman 2020)", + _process_temp12k, + ), + "ottobliesner2021": ( + "Otto-Bliesner et al. 2021 LIG127k proxy temperatures", + _process_ottobliesner2021, + ), + "scussolini2019": ( + "Scussolini et al. 2019 LIG boreal precipitation proxy", + _process_scussolini2019, + ), +} + + +# --------------------------------------------------------------------------- +# Orchestration +# --------------------------------------------------------------------------- + + +def process_observations( + source_names: list[str], + delete_raw: bool = False, +) -> None: + OBS_PROC.mkdir(parents=True, exist_ok=True) + for period_dir in ("lgm", "midHolocene", "lig127k", "multi_period"): + (OBS_PROC / period_dir).mkdir(exist_ok=True) + + for name in source_names: + description, fn = SOURCE_REGISTRY[name] + logging.info(f"\n[{name}] {description}") + try: + fn(RAW_DIR, OBS_PROC) + except Exception as exc: + logging.error(f" Error processing {name}: {exc}", exc_info=True) + + if delete_raw: + shutil.rmtree(RAW_DIR) + logging.info(f" Deleted {RAW_DIR}") + + +def setup_logging(log_level: str = "INFO", log_file: Optional[str] = None) -> None: + handlers: list[logging.Handler] = [logging.StreamHandler(sys.stdout)] + if log_file: + handlers.append(logging.FileHandler(log_file)) + logging.basicConfig( + level=getattr(logging, log_level.upper()), + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=handlers, + force=True, + ) + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Process raw paleoclimate observational data into standardized period-sorted files.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + parser.add_argument( + "--source", + nargs="+", + default=["all"], + metavar="NAME", + help=( + "One or more source names to process, or 'all' (default). " + "Choices: " + ", ".join(SOURCE_REGISTRY) + ), + ) + parser.add_argument( + "--log-level", + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + default="INFO", + ) + parser.add_argument("--log-file", type=str) + parser.add_argument( + "--delete-raw", + action="store_true", + help="Delete the raw/observations directory after processing.", + ) + args = parser.parse_args() + setup_logging(args.log_level, args.log_file) + + # Resolve source list + seen: dict[str, None] = {} + for token in args.source: + if token == "all": + for key in SOURCE_REGISTRY: + seen[key] = None + elif token in SOURCE_REGISTRY: + seen[token] = None + else: + logging.error( + f"Unknown source '{token}'. Choices: {', '.join(SOURCE_REGISTRY)}" + ) + sys.exit(1) + source_names = list(seen) + + logging.info(f"\n{'='*60}\n Processing paleoclimate observations\n{'='*60}") + logging.info(f" Sources: {source_names}") + process_observations(source_names, delete_raw=args.delete_raw) + + +if __name__ == "__main__": + main() From 060c12cd85a8e7e8ac7247fddc17253ca2625b58 Mon Sep 17 00:00:00 2001 From: Willa Tobin Date: Wed, 13 May 2026 09:02:06 -0700 Subject: [PATCH 4/5] removed constants file --- paleo_scripts/paleo_benchmark.py | 9 - paleo_scripts/paleo_constants.py | 5152 ------------------------------ 2 files changed, 5161 deletions(-) delete mode 100644 paleo_scripts/paleo_constants.py diff --git a/paleo_scripts/paleo_benchmark.py b/paleo_scripts/paleo_benchmark.py index aaf6b0e..4fcd309 100644 --- a/paleo_scripts/paleo_benchmark.py +++ b/paleo_scripts/paleo_benchmark.py @@ -72,15 +72,6 @@ force=True, ) -# --------------------------------------------------------------------------- -# PALEO_MODELS / PALEO_PERIODS imported from constants -# --------------------------------------------------------------------------- -try: - from paleo_constants import PALEO_MODELS, PALEO_PERIODS -except ImportError: - PALEO_MODELS = [] - PALEO_PERIODS = ["lgm", "lig127k", "midHolocene"] - # --------------------------------------------------------------------------- # CRPS and spatial metrics diff --git a/paleo_scripts/paleo_constants.py b/paleo_scripts/paleo_constants.py deleted file mode 100644 index 02c6e63..0000000 --- a/paleo_scripts/paleo_constants.py +++ /dev/null @@ -1,5152 +0,0 @@ -PALEO_MODELS = [ - "ACCESS-ESM1-5", - "AWI-ESM-1-1-LR", - "CESM2", - "CESM2-FV2", - "CESM2-WACCM-FV2", - "EC-Earth3-LR", - "FGOALS-f3-L", - "FGOALS-g3", - "GISS-E2-1-G", - "HadGEM3-GC31-LL", - "INM-CM4-8", - "IPSL-CM6A-LR", - "MIROC-ES2L", - "MPI-ESM1-2-LR", - "MRI-ESM2-0", - "NESM3", - "NorESM1-F", - "NorESM2-LM", -] - -PALEO_PERIODS = [ - "lgm", - "lig127k", - "midHolocene", - "midPliocene-eoi400", -] - -# {model: {period: [(filename, url, sha256_checksum), ...]}} -PALEO_DOWNLOADS = { - "ACCESS-ESM1-5": { - "lig127k": [ - ( - "tas_Amon_ACCESS-ESM1-5_lig127k_r1i1p1f1_gn_090101-110012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CSIRO/ACCESS-ESM1-5/lig127k/r1i1p1f1/Amon/tas/gn/v20191206/tas_Amon_ACCESS-ESM1-5_lig127k_r1i1p1f1_gn_090101-110012.nc", - "fcdcece93685efde5ad6f5d54c17112a388cf526f15a540a428698c8de9614b0", - ), - ], - "midHolocene": [ - ( - "tas_Amon_ACCESS-ESM1-5_midHolocene_r1i1p1f1_gn_050101-080012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CSIRO/ACCESS-ESM1-5/midHolocene/r1i1p1f1/Amon/tas/gn/v20210422/tas_Amon_ACCESS-ESM1-5_midHolocene_r1i1p1f1_gn_050101-080012.nc", - "67881c124bd7646c7e038bace8321c420ee42172a09d4a21c65ae34b0e48e408", - ), - ], - }, - "AWI-ESM-1-1-LR": { - "lgm": [ - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392101-392512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392101-392512.nc", - "918ca0b1777ca37a1cd00c41d396aaa745386ac17cf2da52c49369f5352d6c36", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397601-398012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397601-398012.nc", - "e4e429dcf0406188bf5d32787df0424450232303b1d7a6fb37955ca1648d7154", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397101-397512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_397101-397512.nc", - "cc43f30669a075efb68d94799705670b0964ce1d27c14a3cc2f8d2e21d3be8ce", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394101-394512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394101-394512.nc", - "52c583a40838362ef7d18f063dc98aef927a13176bf5835c0c481b624722863c", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394601-395012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_394601-395012.nc", - "04a4edbd4076a95dc04da5fd848e979d4e3d58691d0b4ef261958eef3858f0da", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395101-395512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395101-395512.nc", - "de09fd37bb82d811168af09fe9fbd20dd4b7a3550e209bf64cf4f922a21f9ebc", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391601-392012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391601-392012.nc", - "36ff8ad34b863fc4584c4b4a763b50c08daa76abb4d3eb5bd70be690acab2baa", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392601-393012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_392601-393012.nc", - "24bbf983ba16b30f09f06a42bdf03d338bf19dfb108250d0edcb555dd5ec6ee8", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395601-396012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_395601-396012.nc", - "a7a9f8310f73cd931f868fbb16ed54d21563e2c7d2143a84c9ae06a17e40df6f", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390101-390512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390101-390512.nc", - "5a847587fe5f9643c9e38219024b08ba4560da24c5cc314dfea76823f728bf15", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391101-391512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_391101-391512.nc", - "91b9a1868dec42616a60122605ce370698ef39a2f621dc7cb419daef9b36cac0", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399101-399512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399101-399512.nc", - "0dda3ed7e14a9100ce9072821092a5f7fc4cb088dbfa13ed4341723b40507ba6", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396101-396512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396101-396512.nc", - "a279aefe5b8ca2bb2d45e0b5d3d580168b2d34b171f06d38cd491ff3cba04846", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398601-399012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398601-399012.nc", - "5fb4304a4b64ce4d4be8730f617f1583c042d3a9a72cbefc20f163f8626f3b7b", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390601-391012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_390601-391012.nc", - "6bdefa0d1589ff1b42195680a0603d4aa3e4aee04c734ab5cb6a70a702114e99", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393101-393512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393101-393512.nc", - "ae8bfbeca44826a4226a66d1c1163292c72dc6f42b1bc2ce241e48a9bdf5b33e", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393601-394012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_393601-394012.nc", - "e4b64888544d23f77c4c659291a07e094b2d2de944905d98a645b36d492dd760", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396601-397012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_396601-397012.nc", - "eeebe43b8062b3889c06c184090051f302eefaad2e032a27dfec649da3ff41d0", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398101-398512.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_398101-398512.nc", - "9294cd0f4919c0a2e122abff8f27b40b1a3cb657cc36f76bb0b68dc51af18019", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399601-400012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lgm/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lgm_r1i1p1f1_gn_399601-400012.nc", - "5cad8ec973c541a9b3446d8a76d3c3bbea6b57f1f873c6c0fb6dd33e6519b286", - ), - ], - "lig127k": [ - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308601-309012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308601-309012.nc", - "bd000fa0826986374db8f904294e02a1cd0da14cf40340cab9698260a6ed3efe", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306101-306512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306101-306512.nc", - "ca3e7948ba9271fa1d9e5f3c5ee0a2a034fa8f1f54ad3892b082c71cec396ffe", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306601-307012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_306601-307012.nc", - "08edf288e31d80cd4ceab8c76af10e55ab6c564316971aec2ff2e624d0dce05d", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309101-309512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309101-309512.nc", - "493d0bf7e1583f180dd5cb82617d1ebb3add4aaff3c7dc9c5ae110d9fb432b6a", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300601-301012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300601-301012.nc", - "8846e012af87b64701c86a89e8b5dcf8d80b00a82165c93a56c27b96ae154c01", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305101-305512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305101-305512.nc", - "49037913b20ae7571caf3ad29201bb0156612649daacfe2661c5861b20392e84", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307601-308012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307601-308012.nc", - "062c47b4158d45b89de2e63a87e4c2d01f290a0dc4f4640495672ba47f158351", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309601-310012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_309601-310012.nc", - "68de68254b26bdac5982454aa7b5b373e00474e689fce0482e3e312e7e5071df", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303101-303512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303101-303512.nc", - "ffa940919238ce01a0d28a36a10b31f31fb55ad1327ad2b351666134b1a9c989", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301601-302012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301601-302012.nc", - "bb0dc284a16c419ef561311ce4fac3710d083ddc4b1f4b29ea3c695358993c25", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302101-302512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302101-302512.nc", - "385a753f2e3f395f353b3ec69f74c2cdaa3c681a17903e47ab8bb970e52540ca", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307101-307512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_307101-307512.nc", - "c9d8be7442afd1e399cfeffbe6c9a6a6f43dbfe42da6980d0ed169264ffa3ce8", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300101-300512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_300101-300512.nc", - "1fa717df2e3489e175ecac97340165b59abd3a7cd5998b7bf7d9d95b66416df9", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304101-304512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304101-304512.nc", - "a6ffbf97d9693c377ac1f400e36a9cddbdf655756a7327578ef7a9848cfe7313", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302601-303012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_302601-303012.nc", - "bbadfe9324b186cf0aed9073635a8fdb9ac1ef4dd444a0ebd95fc71a40c60cf4", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304601-305012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_304601-305012.nc", - "1dbdb85f9ffe2c803c29ea91941c301abff82e14635fb03c6d05f0a2fa70c0ab", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301101-301512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_301101-301512.nc", - "45ba6a26f55fa80ccde3f59c5db7c18800f5913f3108e8cf831a80ff3491da89", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303601-304012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_303601-304012.nc", - "17de5e02eb3297b9735cdc26b6dbe3ee3a0067ff7888203dee4e7204cb3d3cfd", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305601-306012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_305601-306012.nc", - "7b228eced9c0ed703d5d5fc571d319a06ae6104880cc91284883b8c30586710e", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308101-308512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/lig127k/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_lig127k_r1i1p1f1_gn_308101-308512.nc", - "ca64ab4b9b6964bfb37eb27684e9bf0b2bd4f4f1dade6d68c3a7c6c12cf14301", - ), - ], - "midHolocene": [ - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_310601-311012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_310601-311012.nc", - "1f1e847e12aa35645f83262c58e5d05aada0915a7b9b7632b8b0409404115a07", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311101-311512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311101-311512.nc", - "3ad84cabaff0e138552ecd9a20e8b668ee049f597e73f4b22cfa07322f7da579", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311601-312012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_311601-312012.nc", - "b4d68123bde132838f90042fa5bfc07bffa196091b4b2aeb611ed51e7bf925ea", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312101-312512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312101-312512.nc", - "c550d32a9c3dd70e7212fc30e75fb6c577a290836a69bfd5034c0f69b15babed", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312601-313012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_312601-313012.nc", - "2a13ce2601a07f4be365797c21618315f445ec84521dd603f629f1f05b93163c", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313101-313512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313101-313512.nc", - "df3c9dff6ef57c785c9ded62b659acfe2bb958d0b93e78dbb700af55c81b108c", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313601-314012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_313601-314012.nc", - "fd8f9550350ea63ee412eafb5c628843384957f181d6b875391ee3c85d94c3d8", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314101-314512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314101-314512.nc", - "87f9be02ded8479df2429d2a36e81115888b349f8dab721e5a95bf759890ef71", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314601-315012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_314601-315012.nc", - "fba47e17827e11429a26ab30a8abf3128eb78b9676428d5789342e2147f07ef6", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315101-315512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315101-315512.nc", - "bfa5fa342a99e01d530d1be41ffea7f9cf9f6590da72f987360218c8c370903f", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315601-316012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_315601-316012.nc", - "612055568dc631ef2f7f16170ef264b807f53bc476633ee74bee8d31a21dcfc5", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316101-316512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316101-316512.nc", - "9d808081f5aac416004d47baded0b7b6fa014a0f590d4b01372b2ea12b47f609", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316601-317012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_316601-317012.nc", - "fe68ece0197d8b419c1eb15f50566739439996dbf00b8208071ee8f522e61a13", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317101-317512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317101-317512.nc", - "78671f23f1b636316ff75b9b92da17881892c9a2c7b89fe6a620411abb0b307f", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317601-318012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_317601-318012.nc", - "8e8c4f61224ac8a560f9a79dc2a36641fc479d281892667f9b8a7f51962b2522", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318101-318512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318101-318512.nc", - "9bf6baac6bed3b7a330cd21d306db7cef3f11f19168182b2b2510c460bbac4c9", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318601-319012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_318601-319012.nc", - "5253a8d2083ad580fe882907e624ad823f203c855b76477689f4f7fadb8313aa", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319101-319512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319101-319512.nc", - "8d84172e8e6c0cf852f71557d60c5ea247033943c5c4d99b39c72ef18e60fe4f", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319601-320012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_319601-320012.nc", - "45f5c2ba05234d7dbe2a6933fe7f439f092bab7e7438465e777dabcb0b41e377", - ), - ( - "tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_320101-320512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/AWI/AWI-ESM-1-1-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20200212/tas_Amon_AWI-ESM-1-1-LR_midHolocene_r1i1p1f1_gn_320101-320512.nc", - "45c47e80faf7a3c0fd59e067def415dc88167ca4d1ee0f73dc5c3a98da968cd4", - ), - ], - }, - "CESM2": { - "lig127k": [ - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_045101-050012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_045101-050012.nc", - "5fca5f69c8928d43ca5b2e3997c7ea6445469f5fec3694678d0b5daee4ec03e0", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_065101-070012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_065101-070012.nc", - "a0184e19282ba1b9351dfc6fe421a4ed22007aa98e67ad2f331ffc9edb97b688", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_005101-010012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_005101-010012.nc", - "a4cbe00dffe027dfaf227022921cb6e512696e753dccd2b4ccd591e1369de9d2", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_010101-015012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_010101-015012.nc", - "9a4ca2796ee948e7aec015345149230ebc66c0fa45650c57bc18ddbb8fcdf92f", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_030101-035012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_030101-035012.nc", - "aa1c2de785b2fb526766a2dda503676c20bc8195d6df9cd24e6ccdb2c7d1fd91", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_025101-030012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_025101-030012.nc", - "f8a8bf73e7b939b95c0d70d81802aecadb829cd1c695f6cbb6684659a7c3a7e4", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_035101-040012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_035101-040012.nc", - "2ca4d224faf3686232126ca51c806dc66bc385f2572abfcfd2c4b7ec2a7c79ec", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_000101-005012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_000101-005012.nc", - "445a2f76d3883d6b2dadc34f15c412785af4469aebb5d764ebd2345939b417bf", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_040101-045012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_040101-045012.nc", - "c873daa7db3c1c52462c8ad5c48739edcc5d375dfb6e17533602033b7465ba7c", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_050101-055012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_050101-055012.nc", - "89af16519d90c96a1aab61e370b4891178b917091131071ce3120af21b5c4c2c", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_055101-060012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_055101-060012.nc", - "e567cbb51f8d685411d4ea4b221b2973e39c12c0f802fc261fe446ffa873ff83", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_015101-020012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_015101-020012.nc", - "4338af59ae17953cf35facb313c34ffb16a15b90861ccc27cf855267d7d9e174", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_020101-025012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_020101-025012.nc", - "61693e7271bfae15592a419ca2bdc7d2efe912bfdfbb2ca3dbaab8cfcbf8e72a", - ), - ( - "tas_Amon_CESM2_lig127k_r1i1p1f1_gn_060101-065012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2/lig127k/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_lig127k_r1i1p1f1_gn_060101-065012.nc", - "a191056df714fdb02fd39ff70d1378b133de9af056f393d582ad17c4fc441c00", - ), - ], - "midHolocene": [ - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_000101-005012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_000101-005012.nc", - "01e07ddb0c246af3405ac81185438710dd98f96f4655807cf1932da63b760f27", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_005101-010012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_005101-010012.nc", - "b36dfc9788588cfcd9c9b6a380de5cd63a7bca107f0aafb12e7b4a6467b27c49", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_010101-015012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_010101-015012.nc", - "6d8e59e1e71a72ec9577abd22ca915ec85b60c8581554e417a474158727c3324", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_015101-020012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_015101-020012.nc", - "6e1d0ae8db756ed7ab7caa7c451507eb5bf164210bc47713fd177216550a3f7e", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_020101-025012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_020101-025012.nc", - "b7e50443dc2c6e2fa071f12ee9ac1887cf99437736dea3b6f5acf2c77a3b55eb", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_025101-030012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_025101-030012.nc", - "16a17fa7398fe9a4d3c2255d1b173207bfef4fb4c860bae0c34a72479d5185e1", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_030101-035012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_030101-035012.nc", - "6d7e909994c90576649975469e11e9b9ebad48900c45e51da289b5116497b3ca", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_035101-040012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_035101-040012.nc", - "30214ead75b3da037738d67e244dad58f8f367572b54aa18168c138aceb45ccd", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_040101-045012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_040101-045012.nc", - "0249efba728b66b9013428d66ec70933ebc146c86b8250d8b9e24da67668124f", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_045101-050012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_045101-050012.nc", - "dc818ab134bd0fc99ef508c9c34fb1e6b66c05afa501e502eff7f0e263975b8f", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_050101-055012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_050101-055012.nc", - "92aed716108a5b16ef86ee31300a7ff04e8891a17949aeda0d85e588deb188e8", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_055101-060012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_055101-060012.nc", - "e6e3ae14c2d663353f777bf31f271216d6699d60b5cd3c1054718c238b254be4", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_060101-065012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_060101-065012.nc", - "c9876e954990708909f86bd1cb4deb41b23c74ae9d6428062455ad85b4c662ea", - ), - ( - "tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_065101-070012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCAR/CESM2/midHolocene/r1i1p1f1/Amon/tas/gn/v20190923/tas_Amon_CESM2_midHolocene_r1i1p1f1_gn_065101-070012.nc", - "79b5c448921afc803335111b322b487f9e58abc2e406df9f92eb357065aa58de", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_085101-090012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_085101-090012.nc", - "9b5268fdb6a332118d03494f449042a63e6137c09883a91c2a2a8bc34ea801ba", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_100101-105012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_100101-105012.nc", - "ed5729eb026413c5445632abcae926e9f93d5a50664d231fcae3e5cb27c69349", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_015101-020012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_015101-020012.nc", - "8ebc15062bcc9a9c81eee323464f4e4838ea990c1ea7fe66189bbe8a0e5b831c", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_075101-080012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_075101-080012.nc", - "eb5c0c4497c5cb5d5fa66fca3b875d27b526e80c305398ff4f6c1dfbccb26bc7", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_095101-100012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_095101-100012.nc", - "f1a9249c7ddef31a95c0e238abade6fa1e2f07c5eea8a650d248e7d2c806c799", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_070101-075012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_070101-075012.nc", - "95bf39c2a3069a7369ea0d168bc5712fbb1ce110e7f6e8aab5e6e55d11b8f874", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_010101-015012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_010101-015012.nc", - "4d8cea3293fa469553a3ae5a334337defd2e861863765fb78056130e11add920", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_030101-035012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_030101-035012.nc", - "505cb07b02d18685a8f44d7ed4d7e64e38ff44954b7027839af1479876b341dc", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_115101-120012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_115101-120012.nc", - "78db54d18cf8790271d4a494c275e8888e62452eb24a493e4e7f7a268f65c0b5", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_040101-045012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_040101-045012.nc", - "6daf1ed4010bdb2b982b3f516457d9698b5a3721eaad99cf3dfe665f1fd183ed", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_105101-110012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_105101-110012.nc", - "6e63ce1def1882a4f39054218f54bcd27fe06dc8dc8d68ca4b689c82cc31de47", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_110101-115012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_110101-115012.nc", - "bf96693f1b45c75ee2f3e577a8fab6f787123070a59362fed798c7d58d5a421e", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_025101-030012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_025101-030012.nc", - "814a26e4902814b329e27faa76072381e6fc0bf01d0f724a8f8ea2c94655dce4", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_055101-060012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_055101-060012.nc", - "827117e9161d686c3c16679bad28415004c417f2bdae7f910aca5ecde16f2cff", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_080101-085012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_080101-085012.nc", - "27f95f70c1e00c63d81630485bf782540f6475ad8b15bf1fcf19c0c0e3aec25b", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_005101-010012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_005101-010012.nc", - "5df09fa84a344772a8fc8ae8b724e535fbbbc759fb05b723e38d2c1c937d52d0", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_090101-095012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_090101-095012.nc", - "4a727176cf31e7fb7be15810749f248688800c2ac6155e51fba4e19b4fe3e6bc", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_035101-040012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_035101-040012.nc", - "28275a210bdeef1be3e9557a5bac103b06ea44433f64e10f55847d40a4cde7c3", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_050101-055012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_050101-055012.nc", - "b4cf87b2ddd8e1a8fddb2dfb17fa2a50a06d819e5aa738392d54f2ee76f802eb", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_060101-065012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_060101-065012.nc", - "c19381abc4353a940c1e3a1b9cf5f7b1a96b726b00815267a052f9b35379de18", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_020101-025012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_020101-025012.nc", - "6acf31d99cf6819d8925e2117898b4f780b76c7ea5e0d8df7bbf3f4390f05c11", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_000101-005012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_000101-005012.nc", - "4d7c8753e2f368c6730c249b28d9298f25bbf1fae340fcab8d19ca5004a58564", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_045101-050012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_045101-050012.nc", - "dc47040b53a3876a8c7ba5a57a7313d11fdabad9e7a5c42a7153a39a1cb721c1", - ), - ( - "tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_065101-070012.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20200110/tas_Amon_CESM2_midPliocene-eoi400_r1i1p1f1_gn_065101-070012.nc", - "e58e2a135ca18ea1aee3366c496080b9306020efd594da0ffd0c959e4499f26c", - ), - ], - }, - "CESM2-FV2": { - "lgm": [ - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_045101-050012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_045101-050012.nc", - "bf91467ff3004ad60413a5d08d9c947b95522a7117d2b4dcb2644cf5137f8ab7", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_035101-040012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_035101-040012.nc", - "8e1a198fa5bd39fbf2be8633a77d944eaf659723ee12f0becf6c1ede3348d6d8", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", - "5d8fb3ed1fc155f3ac6c0697274486e00bde7356149a7a0191a6f85c80ae60b5", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_040101-045012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_040101-045012.nc", - "c334123786eee32dd620fdebeb939eb10d71d47fa70c16bd94b36466576f52c3", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_015101-020012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_015101-020012.nc", - "042b25292d5e4da036f921d7cef713cf451ab31887a6391fbc1ce97e93a84ac0", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_025101-030012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_025101-030012.nc", - "f06ab9753371e04e1e680a408c12afc4102702937dd856205bb3580cb8cfd332", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_030101-035012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_030101-035012.nc", - "8b5288734ae46997196204b44263af8e8a0f3f90d62669d1a547357263ad627c", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_010101-015012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_010101-015012.nc", - "3d9ee43afb45f9c67e54993fca1434d065a60b599280c7c18d57d4a994ea4686", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_020101-025012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_020101-025012.nc", - "2ee95695530585b1d9c11ea70b7d92fb6e4dbe5798e67a2e0ea881330e541401", - ), - ( - "tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/NCAR/CESM2-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", - "c8aa4065c1963ea14847a3a44cb306f65253b1f9ad6cc22b0228daddbd8e2588", - ), - ], - }, - "CESM2-WACCM-FV2": { - "lgm": [ - ( - "tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", - "http://esgf-data.ucar.edu/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2-WACCM-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_000101-005012.nc", - "0fe2e2f821da164da89bd1aa14e5c230d14ea60b2d7f4dacdd8d436a9092d6a3", - ), - ( - "tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", - "http://esgf-data.ucar.edu/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCAR/CESM2-WACCM-FV2/lgm/r1i2p2f1/Amon/tas/gn/v20220915/tas_Amon_CESM2-WACCM-FV2_lgm_r1i2p2f1_gn_005101-010012.nc", - "4f2ebaad6fec4e01b68b6b44adceb7da570c8b427f6329dfde4312d46628fa9f", - ), - ], - }, - "EC-Earth3-LR": { - "lig127k": [ - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224001-224012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224001-224012.nc", - "1855b96a9410678e19307d7a5de9701d587aca0422774ff567bdef5088738899", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225301-225312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225301-225312.nc", - "70d1d2690f197c15dd6245a6c4278a5fd903c17ccfae45750fe6e868d2281b3d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227901-227912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227901-227912.nc", - "c173b0c1d3274eb56cbf436c5557fd2de3249b853371435a497e7f57d910c28d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229401-229412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229401-229412.nc", - "26ef1bb2a40338260479da9f8f1e74717d1300ff36ad75aee89ac7bc491356f6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229601-229612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229601-229612.nc", - "c048f599a6145b0698149ad037d06ec1dc804b906b69ccb2fea83879bbefe40d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231701-231712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231701-231712.nc", - "ded30e8a88cac957fb317be9c15601e4b9af8d9d8c1ef0c7101b0286e9de6d37", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234401-234412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234401-234412.nc", - "39e4441bd2e758486eed77af3005fdf21339d2bb175e63456855d1503dda9a7a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235701-235712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235701-235712.nc", - "687fb112b978aad0e12cf1f2491aca49ac3ab8f491fdd2a769a09431f2e09aec", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237001-237012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237001-237012.nc", - "107843c03e385ace57d3e734a6bae5ac4d368499d9fcd2ead755cdc4acf2ecb2", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241101-241112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241101-241112.nc", - "59f4c574469f042e2575a697a5868ad681016523db79b65c9882d351f67a9b53", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241401-241412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241401-241412.nc", - "13cb7fc0eb4d05eb5b5d47a2b7132f0b87b3678fdeef223cb64001e4ef10dfcd", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241801-241812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241801-241812.nc", - "690335f0f728abea59115bf4fca3149440733aa476880500dc8d73ac9423d23f", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225201-225212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225201-225212.nc", - "2c85aff0bfbd9aca981a6bf51dee2f363a4e3e8315c3aee515239dbdeba2595a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226601-226612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226601-226612.nc", - "b5618c162c6cc0eff83f9294c85a2acc9c0fbd6f900d86e865157e0bb8a6ad9f", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229001-229012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229001-229012.nc", - "5fff7cd5fc8ce6ae508a050fdb3307db975b5d9c88c2e2cb72e06ccebdebd5c6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230901-230912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230901-230912.nc", - "9eff2fbb29087f8fdf89e16094b016c7a7a2360286b9edad0a194bfa67cb95cd", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231101-231112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231101-231112.nc", - "9890f90bc3cb176474e304f2cad4a8d1fef164f5239665b187275aa537339baa", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233401-233412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233401-233412.nc", - "539ea80b5e19c252ca642e92377fe236aa0eeef0994b97cdf761efe4f52653ff", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233501-233512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233501-233512.nc", - "7d3d266f485a32f3889542734b1797eee024236102de571bf1a013ace52a53e0", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236401-236412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236401-236412.nc", - "740e37d95f856367bccb97f2322a9123b04c3bbad9f25b8117398ca12416c730", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241001-241012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241001-241012.nc", - "19020b9b84daf85abeab63d2aca7211126ec25835e7ab4a8430a9348bd779cd3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242001-242012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242001-242012.nc", - "8a652771165307b2d5c33f192339a392dc9aba1088dbef73e9e90e36f8ce5f99", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244301-244312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244301-244312.nc", - "8ff15dc4b3983760d805e08b8ceafe7b541fc647c4357bb17bcb6cae900b17b2", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244801-244812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244801-244812.nc", - "b3d45c5f5163afc56f6e90ba3b03e57337eac342b5d5e6c13f07849487f571e6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225501-225512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225501-225512.nc", - "37d0e3b9fddb45c870168ee38bfbc0d64d6350eceff77ceed8459bd302bde9ef", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226301-226312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226301-226312.nc", - "62d1006390e5ba0d38eb4c367aeadd5888b12066187a2c37a84fcae008d346a3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226801-226812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226801-226812.nc", - "5d42d552541249e82d86ad5aa90f95b522c4352d69e27bfeb627d2205498eeca", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226901-226912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226901-226912.nc", - "14364cd35003771ea31050b3009c1841d52af7c9c05d095e393223479292e31b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227701-227712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227701-227712.nc", - "6c607aab5c09af54ecf1666b1e1eb1233bb1dc8773dcb27fe969415a9d5dd084", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228401-228412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228401-228412.nc", - "38c24ac86d6b326cfb2dd867a957512bada12641c34dd2fe7da30bd59bb78db7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230401-230412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230401-230412.nc", - "6e783c94b224a6ecd4646d3d6076d1799db50b60ae3c38448e3048ff2ef4d48b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232101-232112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232101-232112.nc", - "35a0de5d3752bea8617e741db9b111819c1371700119f7938571382512343d9b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232301-232312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232301-232312.nc", - "65b5495ffea8a52cd1a3bcb992d07911ea969b78c9ec71a1fc1dce532fb1ddb8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233301-233312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233301-233312.nc", - "e4fb29ec8dbdddcc7c7a5347049e429e0689f40bc843fadb47bb72959abdb2a7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233601-233612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233601-233612.nc", - "be1f4a0193e53271f8c86740ede172d827eeac721af9336105703bad1b12a5d1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237501-237512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237501-237512.nc", - "b66abf40b4d5e768943188b4c436fcffa82b36154aa0b87469a607851547ce7d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238801-238812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238801-238812.nc", - "d82be313b903ffa23c24aefb8a0081800c5543d2d35d14cd805e077b3b44984d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239201-239212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239201-239212.nc", - "fdb436613a94a729f5cc50c2c5333b7b5ff1a11fc0b4c5d2cd19340864eceae9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239401-239412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239401-239412.nc", - "9ea73340d51eb88a039a76a15ba79f3ab39bf1f3b3a6a5a4000cbc74be711bf8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240001-240012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240001-240012.nc", - "b38ab05852f55a851bcec5890f79c32922f27813205de781ad2c2bbaeb5a0ee0", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240201-240212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240201-240212.nc", - "492cdbcf9cbf1e0889eac7c8e8f382a29e930cdbf87eec54a55adc80f22f8c35", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240701-240712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240701-240712.nc", - "726c4d5c9e3d3b62298fe07e574bfed96f7e9eed218e2e64999536b459db90f3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242601-242612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242601-242612.nc", - "f46920d23bdfd3b32c0e13acf6c62ab1e440f645c5dbc9b9443c8c728bb452cf", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242901-242912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242901-242912.nc", - "9900a18d0b78f4f7e902a92a42f89e360ea1f54cd961d76058513c39b31f3b4a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243801-243812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243801-243812.nc", - "0e0e95ea2a91fc7fc818eeafb7ab59b4d03f61abffa482e087dc164b57a04e8e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244701-244712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244701-244712.nc", - "1ea5fb326c652e1623dd46bfd4333bce924096c88c0420120d49f427fdeb3842", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224401-224412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224401-224412.nc", - "6bf02133080bf44f5936bbf00479906f080127920772da0c3eb98e8c8b48965a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225101-225112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225101-225112.nc", - "92fc43b3329bed49b47f3b0a8ad04934a90f5ce7dc4c09d9c1f4aadbda0d77e5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227501-227512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227501-227512.nc", - "98e3b1706d4e57679a0322a7e609c253cf9add09d8cf24e0ff175d18d36aa725", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229701-229712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229701-229712.nc", - "afef07bbe9d5e7623a37270a65eb3d72768db9e85d7faf20a67e2c7af53ec6fd", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235101-235112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235101-235112.nc", - "b50aae6b4b33fda73d38846557f113103b8a96665e022269ce43fb97eaff4ddb", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238701-238712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238701-238712.nc", - "1594e548c3e3d863019f6f33fa827c839c1f4264a6a5fe3680ba915c5d45f1f7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239801-239812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239801-239812.nc", - "15a23552b859f30af7fcb5e5407a2d5ab02a514ab8598d886810e9d84249ae9d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240501-240512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240501-240512.nc", - "f834156f187921f13eefd5d5d9e6dae09635a7b8281a229e1dcc559b17998a7e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241601-241612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241601-241612.nc", - "d208489234b86dc9cadec3d3ae2bea6499de0ef31b7d03f520465c64e11652b5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242301-242312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242301-242312.nc", - "eb0e47e02205094762a70ee077f95c9c2ba2e2aa3181ffa693afbc80135416bd", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242501-242512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242501-242512.nc", - "668bcf3a8b3135cad0ec1ef583e2384f24f419ba911357ff91ebd3ec3c06bd4e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243101-243112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243101-243112.nc", - "a6c1086dd2572d9e524aa6007534bfdbe7aeff7ae066280444a4682c844585e2", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243301-243312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243301-243312.nc", - "23d5527e19f0609ee64d7cdefa661bf485a336da39ee407171e6cd967885997a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243601-243612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243601-243612.nc", - "41ae8e7bc60854aa976a33b7cca23b2ff7cf0b21029535e5cb94dd6c91e176f4", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224601-224612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224601-224612.nc", - "b9175f69f881704bdb3f1191e973c6da2e8fce4f3ae9283fe53825afae937190", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226001-226012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226001-226012.nc", - "f39843cf82020da8f6f37b9b8f15f618cc6ba838b4f2d9138c3c2f4064e2c564", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226101-226112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226101-226112.nc", - "e67a13d239bc68ccf9cdb3d977049a6019dfa6cc2d3655c1a11943b770a03bd7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226201-226212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226201-226212.nc", - "db39de03aff8729b4f4567c7dd4406e919802b4f27f6cda3f9536b12655e7096", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227401-227412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227401-227412.nc", - "998405f9e99e7d9a3391caf5f19ad9402577ff686dddc33357e660831f658145", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227601-227612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227601-227612.nc", - "6fc31167df8809971ca0b1d8542c08343f42ccd81e379af0c102e06e27d57b0c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228101-228112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228101-228112.nc", - "e64afcae12be0db6f0d379b979b506f735e5d59b40d7f5e27908a6e0fa9ea7f1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228301-228312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228301-228312.nc", - "e0ca619361295f3d053487c7e1c42bf9f2f3467fc48d0b610f3a1d06c7d939eb", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230601-230612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230601-230612.nc", - "39eb3f104f40498ab46e92a3de86905d5d1b5448886067f1d491472a0e375ab6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232401-232412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232401-232412.nc", - "088b0f7bb5b84c04e352cd34e554aed90a26afc6d633d5c60ab9eb482623ab98", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235001-235012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235001-235012.nc", - "fad8eacd931952db2c7427781d1cc9501422421f10641de5f680e0a52c730e8b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235401-235412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235401-235412.nc", - "9567d6001412bd4ec8b24e7ee8c1e5bf783add2eada9500146c253405ce86c3c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236701-236712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236701-236712.nc", - "acb4f812606fffc879211987815b70ef6a68992e191b5e3d436c2f31526d4ba8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237701-237712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237701-237712.nc", - "15f44cd57426959570d1623b2872294aedc7bbc68808d2262affbd4bc6d0f31b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237801-237812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237801-237812.nc", - "50296f679810bb0748e55d0d2d785a7ef8a0751dcca6645b6af41904dd2fc636", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238901-238912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238901-238912.nc", - "f4aadec91b6e100c75555667eed5dbbe7c6d4454f6f2f6bf4bf6e43c8282f7ca", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239001-239012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239001-239012.nc", - "c6ba7a4edb4d44182b5fad7c27ee92a1727774de4f3c87275e56b114ab76f0ef", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239501-239512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239501-239512.nc", - "657de1f27e8949653aa2d03b7a44f024b6300e5ee6feb2ae2741228b2258f335", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242401-242412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242401-242412.nc", - "1d479d4f4c6ed7a0c7c543ea7d60ac73e334da4259bd634aa41e004099419cd1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244001-244012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244001-244012.nc", - "0471fca3fd73a0a11bcf771efe68e4f6de36aded48f48a7e3545cba44976e418", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224501-224512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224501-224512.nc", - "cc1a314bb220f6d618e699523a913aa81fbb07768f09ec99fbcda01ef882eb4e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226401-226412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226401-226412.nc", - "9fdaa802fd0d3bcb298f57a6aaf848f37a862fc3164f7ca14ce37dedfdce891f", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228601-228612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228601-228612.nc", - "34f9345eb3f8699d8f862b010cf02cc47940aecfb8619732d0cdd6ee4ad17cc9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228701-228712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228701-228712.nc", - "b03b9a50ba45fbacd09a73df9a22b432ad86f63f69c25096eca6416ee2f9bfeb", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228901-228912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228901-228912.nc", - "4c5ad49280f5f3a6a5c0ac17f310bb07c09880069b1f6d959c23ac04d54efe95", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229301-229312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229301-229312.nc", - "2da719e0b12f8eebb32882acb6610f5375ca1b6298a1d67dd01de503c0b32383", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231301-231312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231301-231312.nc", - "da835ec39edd95815abbe43cd52db50f2eb685e435f43e2afd6426040693554e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231801-231812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231801-231812.nc", - "2584b4c526ff9d70059b8b1d1f7d56e3d9ebe572d2b5b9bb0f85a69491641491", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", - "fe185801e5960698e6c3a868102a5c4e3c8370b8fadcf43c705c85864826228e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235501-235512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235501-235512.nc", - "89306894ebb58a7e6f8b5e58c53fdf266be2a0057f258bcef2ee614081f2f3e3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236201-236212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236201-236212.nc", - "6c302791f90a0363852202abee92f74692719952709377e1179cd8850fb5ed2a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237401-237412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237401-237412.nc", - "f12f5c842cc31563b43d512a228f14d95547a20592b279310f2098a476ddc522", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239901-239912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239901-239912.nc", - "1926bf13f78f2f9be044fb6e768079fd36c1f7c10e220cb66b67f692851c6fdf", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240601-240612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240601-240612.nc", - "8b1fdc9078dd3628c8e8ca3002fbe20582f62790e4a6671f165b0a976183e130", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242701-242712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242701-242712.nc", - "5c5f94c9c29a09d006ab6e3a3406c95dfc1402815aeeb6ff0d0775319a0fd024", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243901-243912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243901-243912.nc", - "30917032a89dd9cd6ad1ae5a7055cdc39930e01f15c611c01835ed3091761eca", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224901-224912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224901-224912.nc", - "d349353668a22585de6eec6d9bb20a9f1a56b94b6d58174ee4367fb66d40f57f", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228801-228812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228801-228812.nc", - "12ae86409c4ab958f08229931aa07d7a685dba41100ec0a761525b68649dcdec", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229101-229112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229101-229112.nc", - "7d9501df5ae4e67f3916824bbc3ff5488ba90dd50695856ece0620c67475237b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231001-231012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231001-231012.nc", - "05e9a5f393a4732e501583b10762e8270bd49b3db0d2da06427bb3aafc950308", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231201-231212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231201-231212.nc", - "b493f4b5e908e234f17705d696232dcdcfcf93f51fcf4f4b21434fe4a1e486a1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232001-232012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232001-232012.nc", - "463eb29b4bad25d2ac26399dcd136fd846bcfbe100141d94ffd9a186b6e79918", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233701-233712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233701-233712.nc", - "6b31cd6654eec590c5b38d746b7b37e35e9ba046664154e7fd3bec1ecdec1e77", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234301-234312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234301-234312.nc", - "df0c390658c5987ad17790256bee78c931be6856cc8a5ef7b21e8a1599ff745c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235901-235912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235901-235912.nc", - "9404e5212ed5f3cee5e856634d24bafa201f60e3651973e6d7f59406847e2fd9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236301-236312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236301-236312.nc", - "327fb597f306535a00621fbefd46dd7f7a92d0c67a4766b4f393e4b44e8281c5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244201-244212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244201-244212.nc", - "fa13fa8c542b8e073223bfd2daac5e69eb1286cd83c66b7fbf3a2d7af7ab2b6b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244501-244512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244501-244512.nc", - "7ea805634438d1a8933f4850007ad9ea4b55d8a5fc850f57cdaa662960a8f423", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224801-224812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224801-224812.nc", - "9d45acc361c4779620a13a90a574e6b5312cb3dacb0dd432dc1254097b03f377", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227201-227212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227201-227212.nc", - "36e5b82fc2fd282cbb03c9ad6c62eb618b3ca45506f9659e7ca7cd87589c7d58", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229901-229912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229901-229912.nc", - "ae7f330370a0a5d857834fa13fee807e27c3ea2c5075652188e1177da5b24ad8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230001-230012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230001-230012.nc", - "402b79123eee20a8aa5cec8fd9657657bc11f316c27a888460213f332dc3738c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232501-232512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232501-232512.nc", - "59a71ce3bf4e248bb4524ab67127be7bd89746fb3c1cc165daba32daea85e127", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232601-232612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232601-232612.nc", - "1859cdae71fe6f9baa575171503991e66b71b2505fdb78dcba59d09147d827db", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233201-233212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233201-233212.nc", - "4a79f0bfdf1ac2f90968e877db8d4a56c21648ef6ecf0dd60b5eb274a675e16d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238101-238112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238101-238112.nc", - "b5a81042483bb3575237959a093b0a29b7a8606b39ed3b68031800f01d4c3c16", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238201-238212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238201-238212.nc", - "f1609d8dc7556a03a9075cb81258241be562ddd2a0791e1ac7cd9865281240f5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241301-241312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241301-241312.nc", - "88960df8a816f15678d480b7bce5c8acc5bd19f8ab2aa90746514fd65acf9300", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241701-241712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241701-241712.nc", - "f3528ffcd6907d404290f1b822f01fa5db209fb652f13b98ffddddddf8113cd7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242801-242812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242801-242812.nc", - "4d5dee320540ec3b362ed1781b6bf9cfe086042c762f21d19fa5c2c64f6d5b52", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225001-225012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225001-225012.nc", - "0db5849aa5a1930cca0f7c0d17b3a9af7deea02cb4bc89b2f2d0c7ca88eb2263", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227001-227012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227001-227012.nc", - "fb5cce0cae189943d5a0fb8cc8adec417e2b54c836f819961d680ab12b503412", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228201-228212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228201-228212.nc", - "afcb7af1ac018923becfb7af81a8ee07e1e5163165e8a05b2bc4ed5c40915ee7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230101-230112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230101-230112.nc", - "b8cd6126e47acdcb3a6f6cfcca016cba0e885f1dcc916b975749739e994c337e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230301-230312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230301-230312.nc", - "2910c0ba8745ab5bc329e1428986e1cdae5ee83f982bf04b83205b70ae2347a6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232901-232912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232901-232912.nc", - "54aa29d463ed2d71b6561c53cd8755da3b3c5afea7f2aa05b3f15cc6dc3078e3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233101-233112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233101-233112.nc", - "ef94bd33d5a46dc896e1e45954e0d91b6b539b93b678efa5732c75a48968c3f6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234501-234512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234501-234512.nc", - "a390318c2b97e016075f24e97154c7a3d6c7199c727a9e4ab3e15a04cdccbae9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236001-236012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236001-236012.nc", - "b8d8f56195bd89c91e26a751466c9bf66f6b76d91a8375a2b8d85f29ca6e8517", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237901-237912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237901-237912.nc", - "523ed8ef103ce5b42c00cf07c5053fdb2db9951d58613d82d1aa70d66c7a781c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238601-238612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238601-238612.nc", - "c067b0632fd58b60cffcf2ac78cbefac437050ecbd5fa0ef6f9764611a4dcae3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239701-239712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239701-239712.nc", - "651c7b44c19fe952757c406a9c960f5055adbad8f64c019183c46f8069b96981", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243201-243212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243201-243212.nc", - "2183186e3b9e17a0b564744de9e939bf5fc1dd727af8e0f95ce01cfa76b1c7ba", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244601-244612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244601-244612.nc", - "c851a960bda464eb8965925b7a088236865f56ad16cf8d2a0fdf223997d01f12", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224301-224312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224301-224312.nc", - "990c0d592ac7b6e636f99a969494698153f98f33e30192bf1265f82a77aa50a9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227101-227112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227101-227112.nc", - "c16972e3ed667e10f8851199f78c40166e29eaf380e22826cdc9dfbf6fa5bdd5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229501-229512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229501-229512.nc", - "84e09316c6f13a195449237a01fc12f322fbe881f72a02e0af9a818b11036f98", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230501-230512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230501-230512.nc", - "727080fa7aa00b786de3f86c369b946fb973557c254d3a71e7b16710cc38aafc", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231601-231612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231601-231612.nc", - "5e851128b0f9ccb46159ecb43fff788e6ce9c0516c139d63a10115eb111a88f0", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233901-233912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233901-233912.nc", - "e61203e34cbdf83879bb2cf2d89be55cf4cd5d5fac66143fe677bcd53e187731", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235601-235612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235601-235612.nc", - "bec82b3f4b24daefdb9e55630527a1f32434a8ef3cb41ac341e9d4c7904f88b9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240301-240312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240301-240312.nc", - "ec0a5baacfdf66776308c252da75c9299fb2bdd1536b6068be966397e20e0907", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240801-240812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240801-240812.nc", - "2272ad492cd0a362ad4ffbe02981cf874832eea0370163bec371c3b85aaf5103", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241501-241512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241501-241512.nc", - "d5ebeff4cb1d4c266c6c407130f2392e3faa13c88335e17f2815eead53e5f834", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225701-225712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225701-225712.nc", - "2e031c4c80009476ae1edb044dfc677f0db2921e4646b09a741e4bb49ce15bc4", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225801-225812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225801-225812.nc", - "e8aff3285a966090f3e13a1d4e4246ff04137bc8d452224a9af286e32203ede7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226501-226512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226501-226512.nc", - "8c7c39269b8533cba45e63f89959c627ca4bd15b582311a19b05cc227b6202a6", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232701-232712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232701-232712.nc", - "a1378bb02055eb5aa0389d10843c758cee3f5a5abd62ff48bf732c971df7b124", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233801-233812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233801-233812.nc", - "6906d30f22e11028296573992eebac46f87a2ab3fb93e14e55e7f0ae7b326187", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234101-234112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234101-234112.nc", - "d51f37dc86ea148cff70d10080fb0320da72df9611cf7bb8954a399b7dfa9ea1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234201-234212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234201-234212.nc", - "3acc25df0bf862e03a186ee6dd20a1584242dc6b3a753c35cac20c17addcd735", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235301-235312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235301-235312.nc", - "396921c7ffb3ce639403ed78ad911d8caf2d9ea90e8cb59e0b766b8b62ddc381", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236501-236512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236501-236512.nc", - "d8dfb766ac73579a4e2e3dfef1bd73b5fa7c27c761f17a5857e8b436580afb9f", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244901-244912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244901-244912.nc", - "0b7e928b719d33343ca76f7c2426e14a902165f64f557381b6d5633e960bd7f8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224101-224112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224101-224112.nc", - "65d2da00b7818e29668e85202c819ba978387ca1eea45880cd2f7b99540192bf", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224201-224212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224201-224212.nc", - "79d74b6d2519182d8b56f2c7fa4165632ae0e48bd32b4cb82d2cf08f8aa4f12e", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225401-225412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225401-225412.nc", - "dbb3950a585e4e364daa1c4e553a690e80b0ec6faa00f1d0c15fb4b40d247333", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225601-225612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225601-225612.nc", - "eddb46e577f1267cefe8221a51f2c1770251c296c648410db7c499a9987711e0", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225901-225912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_225901-225912.nc", - "05f5e4074a5ab796a7306a7eaffb7c953d6d259296776d134a7dd833f8da6319", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227801-227812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227801-227812.nc", - "66ceb2649585fea3b2636a4036ad2d04ccdaf97dec4e2decefab5ca56b7e83e1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228501-228512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228501-228512.nc", - "46d70d28403154b83ef25956281bbb03d115566ccbdb015ebded3affcbb3e118", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230801-230812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230801-230812.nc", - "9c89ad7b098082d5276200e118f53d9f848d5f83d4fc890ff3a595b1dedfaa30", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231501-231512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231501-231512.nc", - "c34693930ae4dfafa925d1f104cf97060e97f1c5e2b891e5b1e9006c9d1ba148", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236901-236912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236901-236912.nc", - "3a9cda3f4d561bd5429d1f045c402fefde5f378f60286b70cfc406d964c3cf01", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237301-237312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237301-237312.nc", - "f32ae358bd63a8611f98828e61cef6e1d076a04c6a97b5fc78e27ad0297d2248", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238401-238412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238401-238412.nc", - "0ec139b7586482f461952ca3bd56c8cada09d7b6b99b5aeed3cc7672723273d9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239601-239612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239601-239612.nc", - "75b0a0b64fc19c837adb04fb25c2c65796476ab200d1b4ca11165ef437954448", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240901-240912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240901-240912.nc", - "9db4c494bbc7521cfba9642d53b12675559b93ccfa0709b9b316ccc77646bf6a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241201-241212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241201-241212.nc", - "728409634df7c92f93f871b26688e6f1f21bacf7f88f9ab51542755dc938e1f4", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242201-242212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242201-242212.nc", - "b6cb6a585b67f61c181fab95e042c1b93e46ed68b0340783d4a0ad858103efd5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243001-243012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243001-243012.nc", - "0aae60e8283455a8fa6ff8c625697e179aa3ff94e4e05e4e108f7163e03c3055", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226701-226712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_226701-226712.nc", - "ba086550f3daf0c7859057a613d7d6cb1d8ad1e9fa9f01d528e2c55eeb3cca1c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230201-230212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230201-230212.nc", - "05e4ad9e2c6e57b19dca8f18bbbbadb9efee91857964cbf9891aebd4fcfaeeb1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231401-231412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231401-231412.nc", - "5cdf45f885a3656b58b31924922fd581c03431ff382c7ee4dcd2c678e889b0f3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232201-232212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232201-232212.nc", - "de0b10ee3c3c2a25e0a391b66ed41add4b4eae1a107c97f032cc8b0d309c0b0a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234801-234812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234801-234812.nc", - "9589c4b8fda071b58eb19d207912ab4bcd7617a8cba5c4fa9096c6c3b64f40e8", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236801-236812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236801-236812.nc", - "bb3bdb6433fd797aa2398a0de94bf220d290f4449505cf597f0a4f638d086d7b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237201-237212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237201-237212.nc", - "ed2bb244f962d78b1a3e7a4c195e8966d8a6795b0df1ae7ab49ba3e1a14eb7e4", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238001-238012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238001-238012.nc", - "4f1ec36103dd7a869e28a627ed44d36811e2260e2e91de9d487e6c1f1768c4ac", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238301-238312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238301-238312.nc", - "766edd6e6dfa7ff70c947e225b17c5cd90e017e92c80d92af12db4bc1c3c31a5", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241901-241912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_241901-241912.nc", - "4037908ed6ed43d718c6ae58c00d138d9a3db1008300dc356fd34fd327760fb9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243501-243512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243501-243512.nc", - "1183c91b4b26bee3a091c8f0dcedc0ce336b1fee869e02ec59040bcb767c32ae", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243701-243712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243701-243712.nc", - "ffa6dcd298ef3a6e2192dfaeac7a8a31c861c86e5d80a3193460da3f7da55c00", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244401-244412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244401-244412.nc", - "1b55b34ac250fc9501c9d3d2e67ae32e4dbce2874dca1cdb668663c8f7ca74aa", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227301-227312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_227301-227312.nc", - "a0a3355e62af2f6b2ac7f78aaf8aef6fb5d7a9a35bbcf973aa506034727602c1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229201-229212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229201-229212.nc", - "90a6aed83bdc1630128aa4e00187d2621cb03eef5bba2a9507627203481baa25", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234001-234012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234001-234012.nc", - "740140b2820a95769a0a016fb8349852b65a245fc2358a74009f6681410a9e57", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234601-234612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234601-234612.nc", - "750b0c26d1701c577dac7b4ca29a50dfeb03def99840942a958385ce583487b2", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235801-235812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235801-235812.nc", - "4c0ccc00055d43923674fbf12e19507ad4d17a08461fe9215702f9ead974c943", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236101-236112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236101-236112.nc", - "51ca8f9b620c18702e9fe95fe244300b9e0e6c31b66d2ff6b81d89f917a336b9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236601-236612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_236601-236612.nc", - "a2278c51bbb070165cb61c589fa0a167e303f24e64b505559d49d42c788e37c7", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237101-237112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237101-237112.nc", - "872f59b7bc4edec5643a7e465d42d405b492bb5a280656b880740742a96eb05c", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238501-238512.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_238501-238512.nc", - "08e8494fa038f5ee29dd9b7b845337605d65791a97a5d34cc2ba7d02060591cf", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239101-239112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239101-239112.nc", - "4022432819087954e5185226c48c4b9ee0ebd7f56e47663a836c9fed82f8ccc9", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240101-240112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240101-240112.nc", - "22e16b305ff5d53aca17ff7b0189abafc696054435ce1d3c22a09dfce7f7920a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240401-240412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_240401-240412.nc", - "595198da3a9da8f5316f67c94d5c0787a7eb9265495a0642385f9e3fe58fa243", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243401-243412.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_243401-243412.nc", - "a08bec712b6f10fd77a8bd0ddce3366121863b2e8f7fe7f9f3f94d88b7224013", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224701-224712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_224701-224712.nc", - "b7d5de8d938879c7aae610e2c7710b0b9b7295a62bbd858a31230be498f0b59a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228001-228012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_228001-228012.nc", - "c38d233e9d69573c3e326c832e8a81e18e371fecc337a2069ea97b44bf35a855", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229801-229812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_229801-229812.nc", - "ccbfe38bc25d8d32e592904f73cc27828547d8bc99f118c5ded6a0187526aa0d", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230701-230712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_230701-230712.nc", - "e7ed17dfcfe5dd27cd42a6a8a4993d745305d53ef4a31b46dd60235fd5e3c2f1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231901-231912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_231901-231912.nc", - "4e3b6a67e91466bca7a5b02e64db39ad6400a4662b2e09db29de8326d2b3cec1", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232801-232812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_232801-232812.nc", - "2307f68b10cf6276ac4add34283af10931cbf39ae81abe073ef4055754f6647a", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233001-233012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_233001-233012.nc", - "086f113b881d08fb96e2e951953480750ea40f6082a1059903e89df47b067346", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234701-234712.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_234701-234712.nc", - "4a362b903f8b31a6354417b1ba39ec872c5f1477818004157be95d5d83182c5b", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235201-235212.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_235201-235212.nc", - "d72e6f83770a47052893a967147b4e29d6dc862a078307e521796a37d6f13904", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237601-237612.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_237601-237612.nc", - "ce2055d9b91ad05f5d1a1973796a6ac0cca2603b1221f495622658db2a56ac69", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239301-239312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_239301-239312.nc", - "b83f31aa28e10a19a61fd2e7b00791a527f39906bd0cfdfeab6309e1fdd22b62", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242101-242112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_242101-242112.nc", - "7a0cc4e6cca0c3bf98e9f94e8471f8be73ebc7a136104208a1eace9c9aaf70f3", - ), - ( - "tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244101-244112.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_lig127k_r1i1p1f1_gr_244101-244112.nc", - "bb99e75c5bee5d372bef2c3c86f5a7904c17a6ce5dc463c222bf92ec6b25e317", - ), - ], - "midHolocene": [ - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224501-224512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224501-224512.nc", - "84c3a2ca484d23e45e75fa9dc827601d5ae2287aaca37d03b7dfccff1793db27", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224601-224612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224601-224612.nc", - "2206736f47a6043a8e8f68abbaee04a7d7f1f294b07502186819f0af86aaf805", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224701-224712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224701-224712.nc", - "c0cec79576978b30fc59bea2c05f01610bbfbab2c0fa6946f2dc76013ce05522", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224801-224812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224801-224812.nc", - "9fb9a689dad5be252c3faf8c9e5e18e7d3c62dbacb5d41104e510cb7160b7c4c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224901-224912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_224901-224912.nc", - "24b62657d780c026664e81bd04087de4545a97fb1a5277c76aa162d49ccbc19c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225001-225012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225001-225012.nc", - "24b6260befdee435d30b97706c28ee0e64abccd1cf7d2a0927727b2e04828fbe", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225101-225112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225101-225112.nc", - "27a7801d4d11e3713b169a3072fc3c8e9b30d2750fd51f54ea092392760f816f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225201-225212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225201-225212.nc", - "4d0c7cb29417e58652598e5e69e2529f10efe079cf3769b57dec92ae14dbb99e", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225301-225312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225301-225312.nc", - "b09c98421142b8c630c0bf91fea78f18521739119ab862cab94574cb9915ef93", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225401-225412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225401-225412.nc", - "7c4b4f4ce6c31027690b9922488f7343b58ef5c62cb86544de5ffc08f7e6aca0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225501-225512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225501-225512.nc", - "5e9257b78b986cbc59d1697e0f8bc6dd5c5520290ecd2611e230ad3eae8913e9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225601-225612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225601-225612.nc", - "d2106aad407e8868e34e96f3e85bcb4a24ec2e3bdc7a87991bf94e36495b1ce8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225701-225712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225701-225712.nc", - "e2b6af4c14bcf39eb59f6f1d84c8bfdb1bdae922781bcb4f6b1cb4233acb56fa", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225801-225812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225801-225812.nc", - "d17bbffb240e01d0386f62f92316f82c92755b67252246e365f6e2ed9ea324c4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225901-225912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_225901-225912.nc", - "9943d01b2ec9bd132ae6de7fe1530b6c1145f609924cb4648e4428b8180eedda", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226001-226012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226001-226012.nc", - "c80c6f6a2964ee0f39439169efed541dab1145c2e98df5a6f0919be84171e212", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226101-226112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226101-226112.nc", - "5c90b364c2436deab23d847eb743668e5223312bf04fb9646908bc00a546a80b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226201-226212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226201-226212.nc", - "74c2dc48a8669510843fb30096c09fc1138c7351b9b4a29a51db164b8d965cf7", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226301-226312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226301-226312.nc", - "dbc1a36a430a21f28777ddda75dd0d7347a9d45f5433585a061edbe8979f6bed", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226401-226412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226401-226412.nc", - "94c6177ac2c3ef776898fd53b1d5476c34382cabfeff5fe1da0a4c73ed8efd22", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226501-226512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226501-226512.nc", - "17d9a5d9863df444679b25e780634d71696e08577eea4d40830a86324672fd40", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226601-226612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226601-226612.nc", - "33e9d4ef24d99f5bf38438d672f35b510937aee5d4087803a6c05d4b433b533d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226701-226712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226701-226712.nc", - "39e4ad29da64e02d6a3f8c311bedacdfa55fe85649f4f2c98399f28529cb8f39", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226801-226812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226801-226812.nc", - "3e1eaec95cfd964661517c1249ae7e4e3b81ed00b2883f3bcb47b82870d5a55d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226901-226912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_226901-226912.nc", - "61ec9501b4ea212c24b4ee499623c862798b23237b8f11d07925db54734d9970", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227001-227012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227001-227012.nc", - "ee69bfe9ef791480773cb0e705214a3e12c0b4f60c516c0f4b7bd5ce6a96250a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227101-227112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227101-227112.nc", - "1703f48585645a700fc8d48b63621c579d7678996449610654b0c8b40e71f9fb", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227201-227212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227201-227212.nc", - "a7c5a766c189e56939330c5e949d1c38fbc46f8a02462d4f5a328b03528d4d5f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227301-227312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227301-227312.nc", - "b4a248062e90bcc66d6fe2367a8ed384abb24d08e423f218382c1f522f7b5254", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227401-227412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227401-227412.nc", - "00d8f141e9d39a7bbaf0be383f3adf9311db513df894d1baecaa6d973f43901a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227501-227512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227501-227512.nc", - "7590543f2a28263d6cfd6b5e0fc7820859a428a6d12040fe46612640cb14328d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227601-227612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227601-227612.nc", - "8116575c996bb7f4d0625ce40450d5fe387d00cf14695f62c81adc1cbc19b1ee", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227701-227712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227701-227712.nc", - "b8b687c0e3e63ab29b53dec0e9426ec81f44387383af9b19beaeafb52f5c4c78", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227801-227812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227801-227812.nc", - "670865d771df2695f1f4652efba0cb71f7d0c9e5ec352f12c7c5f6e71918811b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227901-227912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_227901-227912.nc", - "fa089111764a3e61abdf92eb9a3042d915434200159033612a33a94cd3e6a3f3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228001-228012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228001-228012.nc", - "81874e846a4bf9399427c471282b1e2a6d3f1c6c38b84628900977c80092bddb", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228101-228112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228101-228112.nc", - "451563d35565cbc80f2ea3d225c4fc0e4a14e36b95d577bf9e7cabf111ac2de2", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228201-228212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228201-228212.nc", - "fe828033ad6995b894fedffae4e170ba06d147e32251a1e3e9ecf28ccbe7b2a3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228301-228312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228301-228312.nc", - "6b595b970fecc26c6ae8497d58ecc77f5ebef8c973a4862ffd79c21e011be8b5", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228401-228412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228401-228412.nc", - "251476af32edb480503929a5860d4b67931286dabfea193bcee7166879151ce1", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228501-228512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228501-228512.nc", - "6c181380483514e399ae7475816d17465bc7ee8b87fba2de1b1d6362f6a81342", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228601-228612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228601-228612.nc", - "0e673c22d7f6d099dfc45ea915edf1cd2d3c51412708842cd27d15980e3b058b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228701-228712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228701-228712.nc", - "6c11be34826d2aaf6319b095a37daaf1cf8d6085d4c463ae67b0933cb3b5a449", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228801-228812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228801-228812.nc", - "8326144bdc2818727b2529ae29c1f3fa9828ff3a2bb6b3de5bbecd084ee0019f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228901-228912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_228901-228912.nc", - "80ac09e3560272a40221538b42e18d34e43567c8e352de72ef2f1906a0181cbf", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229001-229012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229001-229012.nc", - "d11ec03994308b9b3ba5f547a938d5e10d30e71125cee71fd66a31ed143da44c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229101-229112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229101-229112.nc", - "a01ab43bd4e213ebb65edc4b173139598503fb29aa5ed80e1f4bd72cbd3bb4e5", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229201-229212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229201-229212.nc", - "7ec648ec1147ed9a3b4bf37bf842540425534057feb8364b45d2b2129b215315", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229301-229312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229301-229312.nc", - "981f2b8275ca61c0bedfb8202fe4babbba073bfc57e72d4e8f1626b21472040a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229401-229412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229401-229412.nc", - "150cc2abbc909e24859d5242d40ada60c4ce61c5955d6d930df15a7ea34c2e19", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229501-229512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229501-229512.nc", - "f76359c3bf74bc2857927801caf2e37555fe121a5810b6ac1e057aca2e4dd635", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229601-229612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229601-229612.nc", - "24445c23184fe5d59893ea8aad91783484504670fc97a05869c869ca02c04ca5", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229701-229712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229701-229712.nc", - "8565a1461c7e2319cf65e335bf92a1a090faecc0821df91add8665012ec49246", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229801-229812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229801-229812.nc", - "ce2b534a0c41c50d7df93996ce89891134f1c2284364ffc13ef274ce92d8a444", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229901-229912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_229901-229912.nc", - "ab449f4ad4402be15eed4f6ee2dea71f427f4ab92ba4ffdc71e84ee2bb2020f1", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230001-230012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230001-230012.nc", - "373db0e35303b755f68b0573d4a439a56abd0067484f2648aa2be4ce258f4a6a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230101-230112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230101-230112.nc", - "a5067f29a8a006608c90850728b001c4657260daa23211dbe399ef837892b223", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230201-230212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230201-230212.nc", - "7c0e6d9ef2f6ba4e03f7e480b1d2f2026bce0a1edf5fd3f29df5e59d77932e0c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230301-230312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230301-230312.nc", - "23a953c31e1b9ba3de1d9ee3d850b8b74dfd9898874dcc1134b5d46742b74426", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230401-230412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230401-230412.nc", - "d460037a5102d8fcde3a2a3b539eccee64b32feb13676ae62bd11e2c40268eeb", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230501-230512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230501-230512.nc", - "189c6ce81434defa5f20455c1e195dbb0b18ea8f7b9b1cc96745bdd6c514fedf", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230601-230612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230601-230612.nc", - "f8ce35b441a314e81ec753445b3a0b4ea4d8f96fb188a43311f6bf30b706ebc0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230701-230712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230701-230712.nc", - "26c300f62a854f43d6e12bd2ea73566aaf4451effcfe4ebec5e85aefe3be8bea", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230801-230812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230801-230812.nc", - "c60337dfe735fce56b5b2a1180a2332a952501447f8357468dbfe9137ceb753b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230901-230912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_230901-230912.nc", - "0be1c3726fb9d68ea75cdf8519898bc98578603c238b72b892008a3b5f58ebb6", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231001-231012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231001-231012.nc", - "b3e53dae83e8fc25b9ec846f7a7de68d2d4db4ab5213c476ed03f7ee392e3e6e", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231101-231112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231101-231112.nc", - "08b9ed5e96896e9ef60c89a01446752946420268bfe9c8a5f79da83f90ffc5c0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231201-231212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231201-231212.nc", - "63875add8981846d31ec3a30f0f80e0a4c8e64c36d45693a84c2b43cecf07454", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231301-231312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231301-231312.nc", - "d543332047b1e0e2db0781ecbd8794c3122bb22e4f7f8ffd386d2552e1248953", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231401-231412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231401-231412.nc", - "d9e6f405c0961c6264411cdf64a5beeea72b46c7a7dc0bbb623303ebea22472f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231501-231512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231501-231512.nc", - "5905a064a9b8e206f8aeb6ac219713fee199b0d5631f824b78a54779ada60e7a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231601-231612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231601-231612.nc", - "8136fcc97d71a0fc4ae3b677c1a69269a2c1d069eb6f2383c209db7d9f0e208c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231701-231712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231701-231712.nc", - "635ec5364903a149eb2b09b08c0a0540e450bc639fcd32e7d417dd853d5778dc", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231801-231812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231801-231812.nc", - "4774ccf58166e30a00273cb4cfe6f869dab51546fd77a77107c6326f17dcc65f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231901-231912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_231901-231912.nc", - "af868f465f91426d27b92698e1ed0be6bd88e7f9e68b2a53ae31010db25de9d6", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232001-232012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232001-232012.nc", - "6764d8042f55b511b5b1cf7d860a93a7b7ec4b6bd8a15e96258bf1dc10fc4a1d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232101-232112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232101-232112.nc", - "a81ce18580fa8c863a24be406aa6150378c873a80c2b1661354dc5899aa19dfa", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232201-232212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232201-232212.nc", - "61dd8892cb2b8c9edfdf61dd308eb007b1bfd39550e910a3f21260185eab0480", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232301-232312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232301-232312.nc", - "138279617c081a3fca49af2f8081da16613c1136ecf725ef8a69cd31560da2b3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232401-232412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232401-232412.nc", - "74a5d34d848933d38034ada012c3ab34174611c4f0657f47cd784f112133b3ff", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232501-232512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232501-232512.nc", - "15c02d49ec8c52f3b042cb8f6f3bba71f88f6aa94d52173c32a4904a72b006ef", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232601-232612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232601-232612.nc", - "a3b1c140e76d4a80976aaec7fbbac452a552c974b1e0324c83e8d58e54b2b4f0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232701-232712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232701-232712.nc", - "a6dd6820d7e4e2abcf4dc045fe94f847a12a0969f88dae667dad4bd7b88cb43f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232801-232812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232801-232812.nc", - "cd9f15bb3e420769ba60af84ccc846a05e08414dc7ee9f30edce6fb5f8da7175", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232901-232912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_232901-232912.nc", - "bb91243790e5e441fc8153969317fb8ea4df09b23bfc22561c9ee7001133559a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233001-233012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233001-233012.nc", - "7018b5c79c2d02a938f8d177e90bafdc0beaf48b7e38925911f696a13111331e", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233101-233112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233101-233112.nc", - "5619014d2c1548d2082ebfe73568e32292e5a6bf6e3859190810a171e46b510c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233201-233212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233201-233212.nc", - "cdb8b0722ee6a2f5c27c76f134762728913afa1bea8097ae205ff9b20f9c6e97", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233301-233312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233301-233312.nc", - "3f1f0bfbc4cb3c731d183027c7f1b0a7a931fb62aa8a0d29fc65d6b1fc2f38fe", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233401-233412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233401-233412.nc", - "e5f934da64064a4e5144465f77c418f3f20e391617e364764ee7d727dee160f9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233501-233512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233501-233512.nc", - "115107cc8a9ab1178216f2521456720ee97792d3fdf9bbacbd1d02d036a45fcf", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233601-233612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233601-233612.nc", - "286242425dbad2fe78029cd398df4c55d9d248c3e1b41a48ca50c054952f8a65", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233701-233712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233701-233712.nc", - "1db499aa1ecd4ba94b51ccabe1e22b46d39cd4bff4cff9b4d9f3429adb2ba537", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233801-233812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233801-233812.nc", - "47b1283568b99ecb9b7ec2cc78a57c71aa25e132a0bee6c88aebd23fc3d98843", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233901-233912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_233901-233912.nc", - "4da49839c5caceab2cc36630bb305bd680377ff12c3e3d0015705affef7fc791", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234001-234012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234001-234012.nc", - "5a65f5dc3dc6859d3cba464b9a429f521b45a04f0607457cc2b459c7639228a2", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234101-234112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234101-234112.nc", - "378778488d9b6946515684d618c8ae6425435b21268ea3476be7404dd11536c5", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234201-234212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234201-234212.nc", - "8216fdfcbbefc085fc4fdc64d4922ffe1e565ac9a253419b77e45628a7a09c16", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234301-234312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234301-234312.nc", - "44d3e2a07972696c24f13fd4010ce3c4f24b55cb8a667f3b8c5b5fbc2c8743e8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234401-234412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234401-234412.nc", - "c4d71492e1c962192fa74e523cf3258dc2bdfa22df9b9f41f7bc9fa1d688f0c8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234501-234512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234501-234512.nc", - "ce6eb8eada9caf80d52a868d070094ae3a4104a2c4de168a04bf04da61f2fba0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234601-234612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234601-234612.nc", - "43f61e6f312ef40f70ca415eb7f10c5fd253276417cf85b047400cddc0522523", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234701-234712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234701-234712.nc", - "74e537759a218a825636fa0c11a9ee1ca59ecd30279deed05ad89bc5817f0bf3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234801-234812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234801-234812.nc", - "2081e92d1faf2ae89a40d07decd1935f16171cae8cf2c57f36b1e5db698b9605", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", - "e1281bbbef280bd364a32e10f384ddb05865b3565fa313e348dc83b0a55b747b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235001-235012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235001-235012.nc", - "b23af5841586363a01ff9f6ae19834605a16d2501933e05654a994ce3b0af098", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235101-235112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235101-235112.nc", - "31db2f0a41562781250d30a7459aea9ae340f9e2e67e186a329c6d7e56185a2b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235201-235212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235201-235212.nc", - "332bc43fd13330746c36113db2a0ffa40b189863a764edb92ede153d349e25d3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235301-235312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235301-235312.nc", - "d614ef43a9d3e048c32dde1f3d3b0d6502efacacf72ddbfd3fe0ad02df097ca3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235401-235412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235401-235412.nc", - "57424c2b28cd43071a7c4edd549ed2796502c0f9fb1a03daf387185e9d91e7d9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235501-235512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235501-235512.nc", - "6818cd6c55a56a88bc17a496e70ef95645bb2d7b413f743d9315a6b65a4feee9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235601-235612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235601-235612.nc", - "ed8a6791e46019beb0f15681195facd1ee622f124c3cad1362fb003a1d58c6a8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235701-235712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235701-235712.nc", - "b61d96ed14673e852ce21c4eeddb655db65fdfcdb75b33b6e35252726e870a3d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235801-235812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235801-235812.nc", - "5d78495baf0652f07dbaf98a4bb03ae92bd57bbcfd03ebc3614647fb5e71b946", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235901-235912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_235901-235912.nc", - "7e1f47e7937cef2b7c72aaf3b163cdff18edc47f38281f9698152d8734d6fc8c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236001-236012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236001-236012.nc", - "f8c4be36111cd000eb36e95210dfc2e354e6307b8960d5e1b99e9f20f4097d5b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236101-236112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236101-236112.nc", - "e0ba63efc604746d4f81d5e1d15ce24b66d44dadace4cbd02a3964645d3e27f4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236201-236212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236201-236212.nc", - "72ea5a878de07c18f55c6863a8075a08561e0a5499762293a59cb21e4008b467", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236301-236312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236301-236312.nc", - "29db42935f13f49e16c528735097162a213622b858a95eae0517fe988e5b7f08", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236401-236412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236401-236412.nc", - "17758c4c634d0eb63c28cdb36b81b735da7825d983d67f071f46dcd198d4875e", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236501-236512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236501-236512.nc", - "11d011620c95e24dda1e7355a5b93738a054369a56e80e6f085147b5c6980ef2", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236601-236612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236601-236612.nc", - "118c870e60b26d2e0ed44404aabc606e091b88b50c6198c003e3af53ee73a5ad", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236701-236712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236701-236712.nc", - "5b1b1847cdba3566ea0da3f8edfdf3dd60baf8e2b30f0170ae249d0e6e0898df", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236801-236812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236801-236812.nc", - "6c2fb9249895643ca127e2e8e8fe6c08eb3ed07007c3826eccf53b4682b3cbb2", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236901-236912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_236901-236912.nc", - "5344c86d654f4dea5bfb55daa0d5e5810a274b605d503d12eb7d393159831654", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237001-237012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237001-237012.nc", - "11dc06a1cd5a206bebe446ad1219e2ce9ceda59c409b0d9afe831e18628a4e1c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237101-237112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237101-237112.nc", - "c2b592e2422f629dee564630d05a377bd6ee1e6ec54de033094da1841adbe445", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237201-237212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237201-237212.nc", - "7a287b431a8a705226ccecb81341086090cef3dce8661d0ee29d55d754a7b516", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237301-237312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237301-237312.nc", - "27371b8efd3a0eb41cdc34e29cbb0f9464ee2d001f3f13c4bee8cc6113025476", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237401-237412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237401-237412.nc", - "9a8281009d82c97738c2924c3ba4bf5b8ee8750d40286fe002ce1bf1e1cff901", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237501-237512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237501-237512.nc", - "72412f6c93ce8a8fb42c4e38ba3a4b6f18a1612a78587f156e509d97a488227b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237601-237612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237601-237612.nc", - "0005d23c73ddd83e94de81c22f38a8c2599a79884afa94c0284bc4bf7c73f525", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237701-237712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237701-237712.nc", - "de801b8d3f3935def601987e344ab0afa1d4f4acfbb15c7c6f663784e343ad53", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237801-237812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237801-237812.nc", - "a005f233399619ec804e7363c6aafe7557862e48a7ed6ab8853b5ce3a0bbf1b4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237901-237912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_237901-237912.nc", - "d0d1049afaedf4fc4a1bb0a432e5543c5f0ed2ac0c04607731afaa2d5c2529b4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238001-238012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238001-238012.nc", - "937e9761395ae2785962c29faa561d5465d7b68641bd2f6e4feb004306b914c6", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238101-238112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238101-238112.nc", - "c5513c67dda23ae4ed1de3ab16eb6f5c5fc5b64090316060c61ab6dac4f04601", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238201-238212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238201-238212.nc", - "b2e7d5848f82350d044424e2f81a5a62eff5096959fb8c03faf86bc0ba6550ea", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238301-238312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238301-238312.nc", - "8e557a6aa1f4216c0a849e8cb637b68219edcd86fc9d5605226b20094b300876", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238401-238412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238401-238412.nc", - "29f8833fa0855dcfc738d3c6581afd8dbf71a3175b91b3cda0f3785b9510d78f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238501-238512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238501-238512.nc", - "141d09990df89de2e3a1f88b1535c34b45c80e8424f46d48fa980dd0130ae77b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238601-238612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238601-238612.nc", - "0c3efebf7426587d273c6366ed0311cbd3faaf5534b706e13a2b7f272de9bbdb", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238701-238712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238701-238712.nc", - "bea934827f0716e95414de6c868304e19e59499c3abd4e0b272adbc365f37da1", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238801-238812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238801-238812.nc", - "ed57202480862ccb5f961fd635ca28225f2ec6b84b17ffa7986287e5ee694ce3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238901-238912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_238901-238912.nc", - "2552fa0f4a943d1cf243187656f9c2c122c711fe577dacc3eeb8d493f798eedc", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239001-239012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239001-239012.nc", - "35accdb44277a921133b4d8ae14ff8cfcfa0b5a0b945f892052bc84116b3c944", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239101-239112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239101-239112.nc", - "904b865abee3fabd465308937ffbe5569108259de56442dad3dfa7dbc5a448a9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239201-239212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239201-239212.nc", - "de0bebbaceb22cfd4bcd40a024d6b1f15d0716fc94422248acb5434e6a31740c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239301-239312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239301-239312.nc", - "10fcc610c0ce1693da89b7b6094336872cbd3dacc40f92106bc8caf43d9f5af0", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239401-239412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239401-239412.nc", - "39f5431fca5cde736eed7930cff163a227305eb15216e0369c0e8b9927fccfd3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239501-239512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239501-239512.nc", - "1e7ba7a32137c329784fd7224a1ddcddd429c4cc73d9fbbab575ed1b9199af50", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239601-239612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239601-239612.nc", - "3d57230c04c51153e8728c972c2d852b0e59597147c05432ddc7d0cc56f0d21f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239701-239712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239701-239712.nc", - "f242db56f1a53686793529a7a8b23c826a026171e36d4febc174c355de39ab46", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239801-239812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239801-239812.nc", - "56e9aae121e54be125e6577cebc8cdff78faf94ab5d0b72b9dae73fabed0ec36", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239901-239912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_239901-239912.nc", - "045f4e18ad15ac5bf9ea134335ec9d6306937686134513d0691e7f14f665a190", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240001-240012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240001-240012.nc", - "85e29df37a76506793177c892b21857b751574784ea90ec37ddaa5c07b3297e8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240101-240112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240101-240112.nc", - "4529b0590cc259dd1ead61cbb4227de797d4914ad1650892b25492b8781913ae", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240201-240212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240201-240212.nc", - "08615dd66bb1f2ec22dca1337508d9958d22e543b114a49495be9c010b9e1f59", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240301-240312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240301-240312.nc", - "0dc5dcd753e800241adac1bda914d9ffb3aa9a548ee316f953319504e0d293c7", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240401-240412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240401-240412.nc", - "b322ecbe6a69668d72e20b37d3aee6740fa05d4556f9c773568962cd6ac2110b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240501-240512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240501-240512.nc", - "c3d8d719a849861241a80e0c4e456d2b220812b43f810770ff94d399eda35a0f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240601-240612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240601-240612.nc", - "66f65380a79e3590a84d30556fa475af56b615a1646c1f0b44640fa4c02116b4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240701-240712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240701-240712.nc", - "390d3febf06b3aadd560910de8f8d24284ceee2e8b29939491324db38df4379f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240801-240812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240801-240812.nc", - "b490555be1a72234cc9634f3f39f244702a485f52eebccf1f13699421b82b746", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240901-240912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_240901-240912.nc", - "3670693302af0a8cb84fe5657b1a48ef6db0bfa6ac6701702bb6b10941ab0786", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241001-241012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241001-241012.nc", - "d13467653257a2c8e717dbcad41281d3b9fa48316aa352c9f36ffcc8934a7677", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241101-241112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241101-241112.nc", - "e24d85b25b4643dffd377635e2a2406e8b905988da342949d0d41710f88b5413", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241201-241212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241201-241212.nc", - "9f065e8a3474e67235d3cf2054bca8aecbf0cfe530a7691eb8474ec9be756191", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241301-241312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241301-241312.nc", - "2661ce395005cf3956b3cb148681a0f8a8d3a0909ee2642284ec2a44f036e689", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241401-241412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241401-241412.nc", - "73c3619c314b2ef92fed18d655d318309b0e38af09c95bc2587ded35dfbed30c", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241501-241512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241501-241512.nc", - "62c77889597951e07b5f609e3db442a53e1b3bef5f139a883acddca6a7d1f426", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241601-241612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241601-241612.nc", - "5b0fcd82a30fc20987371066175fa4bae229e5963a6556915c1a1761e509b887", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241701-241712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241701-241712.nc", - "e17d5ed59bc5a0abf061d04b22d31809ddbad1f8355d73b15aa589d0600a6b27", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241801-241812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241801-241812.nc", - "b65b42516faab7c6efabbbef1e675074050c7a1d765a8f204c558ebce88aad7f", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241901-241912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_241901-241912.nc", - "d18e9ae72814a08d995fb63806b330a58022b74517a17512f37326ff94fcbdb4", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242001-242012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242001-242012.nc", - "d7bd4559f58ca2e331cc39f697a9af13e6370e14f056a4db2e8606e9ad379ed2", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242101-242112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242101-242112.nc", - "c012a133105696ebe11ba5511d4d1b23b89238d9c8be32bcd67f92d9b7765bdd", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242201-242212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242201-242212.nc", - "828844051fc993a67384ab32fe7ab18a19c3b742eb0b5dda0e81b23d67eed97a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242301-242312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242301-242312.nc", - "2b640349f48d72915c3a3e7a2915f2ece60c33aac0a239cb03ebd611d26d83a3", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242401-242412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242401-242412.nc", - "8738a7dc154761fba816eb5f18a6c8abf3d52f68dd2ae20324fc89ecbcb16c1a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242501-242512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242501-242512.nc", - "5a4f678813ab292a205b578a9bdef163d548868ea9db97d1f4cedfa52f8e0b5b", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242601-242612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242601-242612.nc", - "36841cfc5a5098574b893985934682eb97c461346b8e217775e6789c87be9929", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242701-242712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242701-242712.nc", - "4f889b7b6960900259d026c7c32016f777a3322b434a8f46becd78bed6020fbd", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242801-242812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242801-242812.nc", - "4a2de4eefff7e50cb1152b49ef85ca74ce2232de89b96696cf6b91815f518b7d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242901-242912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_242901-242912.nc", - "0d2f13fc833fc1d76abcf1e4cf58aa0d0624d619b2637fd76337c23ec57b123a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243001-243012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243001-243012.nc", - "23028c47ed0dc651006a24f9bcdf291094bbbcd7c4019a379c023a2815955baa", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243101-243112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243101-243112.nc", - "b6f55ff49db386f1cb877d168835900ca3072070256c87acd7acabdca89c7d37", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243201-243212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243201-243212.nc", - "966d0fb816d33e38c51ac2d4b03529ee0362fc4220a678b38aea637438df6545", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243301-243312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243301-243312.nc", - "f0c17f547a9a58b58fd941f57b8f82b6e360f90ace110201837d5989e34aea91", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243401-243412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243401-243412.nc", - "7c5b21e2600ad89444c8c685d604c4a48a765dc3ee06628e9909dde74d4d4657", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243501-243512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243501-243512.nc", - "0d0cbc87e195b95d11bb7d19472a5261dc6a692ce1a3a8f6360d23bfb3aa1a8d", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243601-243612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243601-243612.nc", - "06cbc2a73e3c402705035a16bc99af67aa2b99b0f3f4e2bb935fd8699af5f307", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243701-243712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243701-243712.nc", - "2abce6f49b5f60d0a8764e8e32da2edbfb40e5d5a07fb9aa2b1f95729ea2aec8", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243801-243812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243801-243812.nc", - "7c025c08e4b1f9984fbc31ca08b5087a22724e4bf38618fe7145074a0feb619a", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243901-243912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_243901-243912.nc", - "48b8cbeab4c3b81925aec544c77dbc7c2756cf653c7901c71dce5e2f3e8aadf9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244001-244012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244001-244012.nc", - "074ebaec354ee395507d8f135e5ee79981c5c5ec2a51bdcb175330cc57a52b93", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244101-244112.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244101-244112.nc", - "804610a7a5ceb036881e2c951ea05efaaa2e59834acaed69e494324d14cfe8ac", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244201-244212.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244201-244212.nc", - "6d74544b4ee1cc5755d5757e8ac8a99371baf6fd346f5423cc0b0b73f2d65575", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244301-244312.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244301-244312.nc", - "753e591678a405cd37777f069ad81818ff4b2419b99d3db08416c15728732b17", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244401-244412.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244401-244412.nc", - "94da4def1c8e220afa4ca8ca736cabe75b78b945b72bc185bb789c69f4e692b9", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244501-244512.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244501-244512.nc", - "8220505027930951ac717c94c1917baecd21eda21096a4ef696fa4008dab4788", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244601-244612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244601-244612.nc", - "56b2b1c08f0f69989b5b7c098edc2cc6d6df07c485e45a73bdbcdc7d8d828a10", - ), - ( - "tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244701-244712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20200409/tas_Amon_EC-Earth3-LR_midHolocene_r1i1p1f1_gr_244701-244712.nc", - "cb124d278c4f91a507f90069bec61ac1059202305c2ef88fa0bb353cbffc99d9", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322901-322912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322901-322912.nc", - "f97d3488854f211b981ce6e90742c184224b62a2bc09312a38ddd027d6dd5696", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324201-324212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324201-324212.nc", - "a4150fc0bfdee553648f9c579853dbf55074027d61c7e6996185f58ae9222973", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328601-328612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328601-328612.nc", - "dd0d8496695e310e1fc585fd23fa89ec06df2c1d9049e237463634b8ea814beb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331401-331412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331401-331412.nc", - "9845094194c04c3ad30f8b79d4ea1635fc5812b5896fdad24d89b2589e2e9c4f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332501-332512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332501-332512.nc", - "bd8c435c33c9c675216d93f273456a3c0c45cd20854dbe72e89e30415f6c4453", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334701-334712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334701-334712.nc", - "5cc2c09e892f932682ef367853367a3df22d6491f52b6a68ef6ba776793b20f0", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335001-335012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335001-335012.nc", - "a71e719d6e49c9d0a95e95c3183be70d1b2b56a3e47536c2ed291510f96ab49b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340101-340112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340101-340112.nc", - "61f9a619a7226234f4fbf49aec23116951eecd206da095dddf8bf697fc01f4f0", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320801-320812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320801-320812.nc", - "70c0111095c2d4f8907421cf3113b550d69ad06a22da7aa4ebbc60538ef9f616", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321401-321412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321401-321412.nc", - "379f355cd783e0c81506bee0514f03ba40ac6f5004ed6f56990d4ef1d4b2d162", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322201-322212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322201-322212.nc", - "d0a3d67853aaaddfc7643eb4599ba77dd4b883c45ead7e1fd31573d40868de23", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322701-322712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322701-322712.nc", - "3d4a8c2ae9939dcceb8198b99052cf8dd112959c7168eb007e8dbdfc477f93f5", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323101-323112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323101-323112.nc", - "4bd0a6ca8b7d9682cba3f5cce78c505e7556a301b5fd6ac8110aaa9298786363", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324101-324112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324101-324112.nc", - "c1775ab29d437f08d49c037e9aa6a25977ec193865286025a0afc5f6bc941c82", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327701-327712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327701-327712.nc", - "f907bc9898ae4d039a28802c5013e44e20543c23010147f0843170453bf1e92d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329401-329412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329401-329412.nc", - "b9c2280655ef0cf32a06889e3751fa44cfa6bd06c0bf1a0303987852c7db6204", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333801-333812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333801-333812.nc", - "398846597ba4a084200b0b4af5df04fa26acd2ef933a1920c9c302d7c31971ac", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334101-334112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334101-334112.nc", - "4f4e3d66b5d08bd1b187f80205ffaa6a416803df503f25d85329cd7ab5c98ca7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336301-336312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336301-336312.nc", - "6abc9f3c14551d37ebe7ce3e478a561c081a21e27663a26a2e5ad70979687cb5", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336501-336512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336501-336512.nc", - "74326fc18b35dad0830184fbd02e541920c56f776c231265b5961b72990c9d7e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339201-339212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339201-339212.nc", - "39d718603e8b056948a9e32cdd4943454d1eb3097acc354eb47b01abbadb209c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339701-339712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339701-339712.nc", - "16966415e759d07705ccbda102bb11830750061444f22fe3abdf542a68c4ee8d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340001-340012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340001-340012.nc", - "a0cec37a33618a210fae273b8ae142958f976a4e380aee727647af3206b46e47", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322301-322312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322301-322312.nc", - "bc953c3aaeee015d0e481626b40cba522d69df36e0739010b6e76fcd934bdf2a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322601-322612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322601-322612.nc", - "2256fc14e8b783f2e4a8967f254f8edd3c261ed093a470ad9c7a5c7fd7d16512", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326001-326012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326001-326012.nc", - "1c90d0d2c65a7904e91b82c274eb24e88f10ad7215c963d43becb82af5d4ba06", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326301-326312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326301-326312.nc", - "bb911829b6d3fae8f6f8306fe4b7dba9faa56e99a2df64809ac77cb4bdc58f55", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329601-329612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329601-329612.nc", - "2d95834e37678ca0072f4e302d94fd5c8c559061816e91bef097542567dbc173", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329901-329912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329901-329912.nc", - "6f43abaa718a9196392719c0b956d379c0f1fff7017a47c9f0c3d62b9f1ca3fb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330401-330412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330401-330412.nc", - "df593e3d65bd173ae88cb1f99becacb51f866e9b208f28383c297f575169b593", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332901-332912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332901-332912.nc", - "6b533695af4a1237a8156d6fa0ac021026eb8f364a0e94eeabb9fb9fa096aa37", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334301-334312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334301-334312.nc", - "9c739d4afc061bf03aa5b1514056a2c1132182379287be8a83ac31554549ba0e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335901-335912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335901-335912.nc", - "48396970d56dd226de7c7df9296610e94d38040a1cdb8211aeb075f6176a351a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336601-336612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336601-336612.nc", - "7700a6fcca16def8e161dfee191db5dd7bc7e89d66925a888a59f9f5f925a4b9", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336701-336712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336701-336712.nc", - "c4de06dc08a5cb391e6f2106775df7f8a67e6edd9c1dd4760454034d20bfa54e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321701-321712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321701-321712.nc", - "8bb1385ab4c543ffc6b4bfa484547afc98198597b4ab33f44c1c764cbef36826", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322801-322812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322801-322812.nc", - "eb2c072696f1c95ab47956935d607ec71eb949d107c292d1c6190e6fdcc061f7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324901-324912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324901-324912.nc", - "ce3d6f556021ea454bf1e7d0ffa604943b666dc379d0fed955467dd484bf8414", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328001-328012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328001-328012.nc", - "771b73ce3201953540ca64865052a960b79c8f5064ef87b0d2ad67ecc0b850d1", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333901-333912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333901-333912.nc", - "807fbb70cf0811cc30745982e90f83bb8b8a4586e50a79a4dfbc07bc882a6f88", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334901-334912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334901-334912.nc", - "4c52723eef28b9563ef5e994f4f645be7754a7db8f3d6a1a5a26b0826ce75489", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335201-335212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335201-335212.nc", - "b2dd563440b36baef12e6537fac8bc837e0e3c3081cfd523a6f2ddbb31bd9037", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335801-335812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335801-335812.nc", - "3efe04ac5fd9410eaf28c579cb9539e8f159679c8969be83ebc69a1f376960e6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336401-336412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336401-336412.nc", - "8a2f31ff22572dc2af574013fe2ab9431c43eceb22eb31622ab23ad5e351d825", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336901-336912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336901-336912.nc", - "9924bee166d47b2bc076d82b0e1c9e3a42cf22df3277582cff14817afc48c1bc", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338101-338112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338101-338112.nc", - "c49949b9b23ee8068150fab5426db8e9dd203bdb781a26b58b62443a48630458", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338201-338212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338201-338212.nc", - "75dff4e38e5c52e310fea5ef3775c9f8d4171e0004ac4e6382093cbb44c1665d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322101-322112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322101-322112.nc", - "80b380650bbfc7c5eafc1ba6c0c7837598dafa90e11cc7aaa756f0f0dfa18757", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323001-323012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323001-323012.nc", - "7cf2cd8517637641c21674dbbf95db95460d3ffcf1d6d306b5c92a861877b34e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325501-325512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325501-325512.nc", - "eacd5f630dc3635ee98c247cab7f6627f0c24e000490c8c6ac0c549fbd12dbb3", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325701-325712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325701-325712.nc", - "1886c8e649fa2ce0c203360bbb721bdc4af9fb48f206748097e0b5e99f5425a9", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326701-326712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326701-326712.nc", - "59ba2442e9fd7ba264732037c0c86531b2d4a91a732fd5277beb7f83f35033c3", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327901-327912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327901-327912.nc", - "659cd5c1ee1d9de80a12bb1e4f583bc8d4a0e3df397f3688fe5945938880086f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330801-330812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330801-330812.nc", - "cfdb71aae37f68a88c6e48a20fc7eda5c20a92a177d7648ea0b436df3ee657db", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332001-332012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332001-332012.nc", - "c79c5478f58062f73ad2affa0e3397a2d2d4456a2b885430e1ba80ae7fdedf84", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332101-332112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332101-332112.nc", - "d2429d6b5aa1fe069d396ef557590dbb13c30688e25f72c6279b98a11ce7ec45", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333101-333112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333101-333112.nc", - "a05b8ab1fd53ecd56c654b4f5d0df7c6e2763fc260e8a76a317e36299b8989c6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333701-333712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333701-333712.nc", - "c58400d601c537ca0829976156497948b47092d79d44a112c1e4035dcf156b7d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338001-338012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338001-338012.nc", - "85cc37ec74605367ce6fb4cc30eda4eb624a2597fecc37284222cff416ac8a35", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338501-338512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338501-338512.nc", - "b11a59e55a00066ea46f65242192353d50d6c784083210cf1c7d8bb5ec2aaf46", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321101-321112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321101-321112.nc", - "7f5a5db2feb2f48d1130b9d7dcd061dcdf934bf548e6fe0e6675090f85925c65", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321201-321212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321201-321212.nc", - "a60347bba5b0130e55b8ad1b6a277729eeed1036f9e96db6d7faf80d9efe0164", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321901-321912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321901-321912.nc", - "91071a545ff7af1da212fb6b5c770e4e68cddd9f22727919c68f400c513859d7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323201-323212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323201-323212.nc", - "d05cd38daa4a80c8d3a3c4ee17c5f46a515d5bb15e05253eba8365d9b4fbb384", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324301-324312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324301-324312.nc", - "ca472c3bc745ee4f1099674eb373b6e623c64ead60131b09f4d1ef5815294a11", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324401-324412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324401-324412.nc", - "858ff3d80a81addc919b84bfb7c2f6115f7b28d6435220ae67bf98f8114220bb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324601-324612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324601-324612.nc", - "f43836c72a96e3772e438f890c43d34d68097fc5196ceda710ba52b453ab23ba", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324701-324712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324701-324712.nc", - "1c90222475fd1c546a8dc821148c43e3e3a0ccb658db4e424cae4eeb073e5c2b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327401-327412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327401-327412.nc", - "97b6c268b303fd1220d153a59c7bcf99c073bc3fe4bcf59c77a5f050c0f5e2ca", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328201-328212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328201-328212.nc", - "ce7de0fc4c2a0153e4b14a46617725d172c9852969435ae8c9ef93c03f7f9f3d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328701-328712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328701-328712.nc", - "9a0d036271e182999ed8e8f8d1b12a910187a0fd1273ac0a46b1b34b2247ef3b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328801-328812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328801-328812.nc", - "7dcfbc4b2db7d0d632387144ae1f2a3eb435c3cf2904b88824d4b3c5ff7c2ce5", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328901-328912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328901-328912.nc", - "4b554cf8bb5dc82352df6ecd75d3beb5be7ea438d1367ce0e28c4f942a8e2c5f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331601-331612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331601-331612.nc", - "6404c9cdf55d6b141f9b4caf24054e158ff675bc29ccafa7d2dfd1e993ba94d8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331701-331712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331701-331712.nc", - "ab532d596cba36b44b2a0ae8fc11998287c1599bf43218ffe04cc87f2e8c25b7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332801-332812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332801-332812.nc", - "133395553e89a715eb1f68a60537c54dc4e55090d1204ee1bf0562214def98eb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333501-333512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333501-333512.nc", - "3a773040c9682c56ce54f63ad143222a1ee02664a05de7e43d4ca248e8f8360a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334201-334212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334201-334212.nc", - "515a1be4fdc1ba7dd617a9b3abad0259bacb4ad74aa5f411b274152e9a2240eb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335701-335712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335701-335712.nc", - "654cc017a26b37abcfd427b7c44efb084f2ee156634082ea4cbed6b84b341d20", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338601-338612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338601-338612.nc", - "0dca5fee016776e0099c3754e0092b844a73d94b578962a2bfaa127acfe86197", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338801-338812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338801-338812.nc", - "1aa29bb742c6a271ae5f17c88652908a5531419cb96db602635af1bb07ab918f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321601-321612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321601-321612.nc", - "198aa1c63890075646f246f3529d08584ea9727a0f59a73b246c2d0a3b60a002", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323301-323312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323301-323312.nc", - "a71616e0b706c27aacb470a07971afc47375267b33621bda59ec9ae4ea773e17", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323701-323712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323701-323712.nc", - "c3682e1cbb159b683933306c2ca8664ac21e89dc965ae3a3058edbd5f41a9041", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325001-325012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325001-325012.nc", - "2c5d9ad83ee89b937289bcf83d288b45d9e2bc29e88af9f1599309ca8b9bcf22", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328401-328412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328401-328412.nc", - "d1a3dd7368998725040dc51cf0191e64bcd171354b7cc6bb2d0102188cdb892e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333001-333012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333001-333012.nc", - "9347a68b5ff4e6aa9ceab31ce1a7b6c05f7d9a921667fe94100bcfa9e8019bd9", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334801-334812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334801-334812.nc", - "294bc8e1ffd61a05e107975ebe750aa443f9f1b744adc490e3296e6f4e790b4b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335501-335512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335501-335512.nc", - "b7063cc8dee0cd76c0b4aca31d7d6493af0d24caedc29d2a118aab7de54ab7c3", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337201-337212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337201-337212.nc", - "a0f43553ec4739099a515b1f73b9ede62641dfea36aef9596391dc578013b9cb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337701-337712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337701-337712.nc", - "8f3171fd7f4b6ee65d55dd2b893389d659b42992ed9d85a9d23a3b4c6d84d985", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339401-339412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339401-339412.nc", - "0e7d78b14b5aec0052abbde6bab17b277c3f0a5fa56943f985f8b1d6a4f5fb78", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339601-339612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339601-339612.nc", - "253e65cf3c088ebf297646627534f0a8e3f4331225de85def0030594cd2a6a13", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320701-320712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320701-320712.nc", - "43d5c6ebdcdbce5d87b57e3a869283bd7fb7920fd276b04eba38cfb2609456dc", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320901-320912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_320901-320912.nc", - "81c879dcf9efef3414123b66128dc0ae478dba4454a079e55d802efc020e831c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321801-321812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321801-321812.nc", - "35fa68e7b8268856f5f44496a23609b578638608fc1cf72f98f7ee31bdf757a9", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322001-322012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322001-322012.nc", - "2f0ace05b0804e074cd78666fde78d0de424e44cab78b1f5dae036e1956c81a4", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322501-322512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322501-322512.nc", - "d1be746f0f6ce683c5b611c6582f0ef26b1c394210a1b891c6604dc116f5987f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325401-325412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325401-325412.nc", - "72c126dcec7a3fe73233cb897f17634c3f92c28d0b25480c320b6724505b6e41", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329001-329012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329001-329012.nc", - "2e1adc68ed3b048a2fbcdfa6fac5701e15518dccff07a84ac89aa5dd0334adc7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331201-331212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331201-331212.nc", - "abb7747bcc728464c61eac3ba269489e5ea7e6ed07be4ad5d25cc9af84dc132a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337601-337612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337601-337612.nc", - "9bf1b62b773caca122c53f2a13ed963106a80601f0a0593291e715bed70403e8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339001-339012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339001-339012.nc", - "0b5e93e8f9e933381054e9ea9d97a8b633ad4e4c18c09b9b3d0b641070b3b21c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323801-323812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323801-323812.nc", - "77328eb66f583ff52077f5c9ece2f7c4ec952978104de699e2a1854620c00711", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324501-324512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324501-324512.nc", - "a2487f67adab3c73bbef5a21e5aaf2261a8148381318c3491b2931501b8460d3", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326501-326512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326501-326512.nc", - "f2de75b2f02ea259afad473e8a7161acf605da62fe242d1c4c81f73961629406", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326601-326612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326601-326612.nc", - "d43200c600f929c2d0a47ff3bc7bbbca6e023c14da219a4d304265eee21466be", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327501-327512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327501-327512.nc", - "849966dc59b4dd970c7497793e552120ff11426484f6ab0e1a7aa45df5cac097", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327801-327812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327801-327812.nc", - "b7cfb50e93fcf0e5ff9eb119efbdc4757b1db60b281a30cadc239f0db7eefe6b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328501-328512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328501-328512.nc", - "1637d52e254f292c018ef0e36ca6f4a4db4cdb2b52ddc89e5736263044b91ac6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329501-329512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329501-329512.nc", - "19bca5cbbd0e9e177842e9394599696b1f0c2a261db83e280e5f4357851925d7", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331301-331312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331301-331312.nc", - "b28fc0563cb9a597d94f81ac3fe66e6109873510650f01b1f57f4ef4ea74c803", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332701-332712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332701-332712.nc", - "46d959defce4e437ac469c1bb47c3114c63f2bed1348f2e35ef0530fbf998e28", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335301-335312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335301-335312.nc", - "ac6347ee845ad8137fd4ba9111fafade97d2ad72d2e53a3d6087a65d5a6b22cb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335601-335612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335601-335612.nc", - "b3573fe7dd1b9bf8202fead435a8cb2bfcfb1a5131314aeb319f2b2044140194", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337401-337412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337401-337412.nc", - "199944f5a46e8962a1d0938913ef479ec62aa7a839b8c2bac8612d4325c068a2", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323901-323912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323901-323912.nc", - "811c63d3aa20717c9ce467c3d35ca19ab3f3fc7622cc32bf7d6952988bce0dd1", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325601-325612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325601-325612.nc", - "5575490622db7cba3a054d61bedf0e8cd9b56115d359dff77255f293069fab61", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325901-325912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325901-325912.nc", - "e472a45a78f1654d38540a1f391c6d2c52ef985ce8119c251e160be914d3ffe4", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326901-326912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326901-326912.nc", - "c4e186f3b22e4f6bf409937fa2a4e0615e264b19a3c54a855fbce5995bb27ec5", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327301-327312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327301-327312.nc", - "0d2630df87bfa62ceb0973c5e2e5a955efbbfd12ed8bc9a80759b98780a6684f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327601-327612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327601-327612.nc", - "ba22c222d80b34556a810bcae4564f0724b6ca8ff4732bc452d3edb300c77f74", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329101-329112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329101-329112.nc", - "b05244c9249b3b8c613ef5008fb7325e1f784cc63e456e30e7eed6caf7629e18", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329301-329312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329301-329312.nc", - "32afffe7f35ec720a2751645e4c9f7b99a13a6cbc395acc83ca99d0048ba1162", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331001-331012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331001-331012.nc", - "46e2a63ffe03522cf27563e3c006a080d4167bf252dc7034ee302b58cbc7d010", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332301-332312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332301-332312.nc", - "ed56d98cd1ab50d104157aaaccbec39d1c8893949cb5a29b2201172fa8e42eb1", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333301-333312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333301-333312.nc", - "69240d909b51a22f5838d99fd7f83ade3fc489cccb72f1ba0021d5fc77d6fbf6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333601-333612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333601-333612.nc", - "9c36c6826cd00ecab4320fc1c536f5d136e16676dbbb36dc1eac68d4831bf40d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336801-336812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336801-336812.nc", - "f2757080ba71fb509a1a2f12deed07f2758882d82ed421f229d08ae01547729a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338401-338412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338401-338412.nc", - "a205ce88a8080fc1bde0cc4195c23fb8127e5af11dce6622159263d59ba2699c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339101-339112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339101-339112.nc", - "81c3a8b36b2eb277c788e6e9448c1faa0c9ccf39b80df37eef1552eddd960042", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339301-339312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339301-339312.nc", - "2bc96071f9c7e7d5b7072254cc887953db505de4bfab77f40e2dd7fe19d26699", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339901-339912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339901-339912.nc", - "b0093863581e13e2364bd98fabb4b6c420a664550b424d7fa983e0243d476800", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340201-340212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340201-340212.nc", - "46c5bbb6224747e054eabfe2bddd4170458b35e0f29683d7b63783a6e7c44788", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324801-324812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324801-324812.nc", - "64088c8719d271c93a92a18ad8afd35363219d2932aea581b9cb98adb198d452", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325101-325112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325101-325112.nc", - "947ff9ed919a653212735c88adf118e8137fe251b630a139767e24958d4ef46d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326101-326112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326101-326112.nc", - "33293d2e7b0ca842a8b4c4eff990c3e368cca75510030cccf0884ccb55b3342a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327201-327212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327201-327212.nc", - "245cf1f2e5efd1267e421570f4bdbd97509931615ae2fa4e9a0340c46cf6237e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329801-329812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329801-329812.nc", - "ac35d4aa1033836cdb9d1bfe55382913259c2722be9b55d56a0e84aa7d1e39b8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330201-330212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330201-330212.nc", - "4a7d36bafb66a5b885adfaf7cedddc97a6b884ef689d63286144922fec76ac36", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337101-337112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337101-337112.nc", - "337b03c35806013ffc7d2c2c57191b7aa42cfe6c15247188ef68ed3905fc57e6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337301-337312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337301-337312.nc", - "653c7786ce24f17bc0e10fce0c54398b0af1720a4d581c6dce208fe84367f41b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337501-337512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337501-337512.nc", - "e406d6c095b19d2b9a3748036263c76a953e4e1f30c2440a202b8c09c728c93c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338701-338712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338701-338712.nc", - "161deab94b5a627059b616c11779b6c7548e35b8ded6eaef5298d603c800b19a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338901-338912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338901-338912.nc", - "4c7ebd5ad6e1517a552f7531b53df929a1a8eff6d5b97b2bd60e8597785c6d7b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340501-340512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340501-340512.nc", - "4e69dc3631c6ba6645c6ad4f8380f75bfb7787d19bab92dfab81b498731757f4", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340601-340612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340601-340612.nc", - "64156507e19bbb306ce809b52b4f00511bbbadcb1766c885ff98c8c710d3490a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323601-323612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323601-323612.nc", - "81e0651d08a883d5eaae7a4025f224b46d42523e9d43fe13ee116d507a6acb5d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325801-325812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325801-325812.nc", - "0c2c5f4195a09e7e5bf4816c3a65fc01b02e4d277a8ea6adf59353a7a9788a2b", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327001-327012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327001-327012.nc", - "4921f0c6b9ef3e0dd2a6e356fc7d9e171075cafb55a26e1d863e3cffcf974326", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328101-328112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328101-328112.nc", - "cb7307d2e18a4ec96c2d7a4e0af6d580ecd1b19f35f9931442359c7f7a19b6d6", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330601-330612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330601-330612.nc", - "04e3d1de6f3feffeabf004e0714b355db701e35f105cae2412bba41d0172008a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332201-332212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332201-332212.nc", - "7ab0791df7a1e9ae20c1d86cc70bcc061034452158d6536d2f47195aa2d034fc", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334601-334612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334601-334612.nc", - "e3735a860b2710c8b5d40b99278450134cf47be39a77a2661b3e25c5a1a2e237", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336001-336012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336001-336012.nc", - "c263beb12498a24f590b912c5bab1839753c7916b23f673f75fbe26956b81fed", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321001-321012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321001-321012.nc", - "cd9ff0970561bf087e584338cbf389860e1d1fcd86c4cc0ee2527251462f42a8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321301-321312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321301-321312.nc", - "2a57f8d3a59151e4a523eaa009d860f91fb67c27780100c345a0047e8d15a127", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322401-322412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_322401-322412.nc", - "613e2aa25c8a0de611b37ecbffdb4a3600c382dc47b7eec8cbb2e056fd140c52", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323401-323412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323401-323412.nc", - "6bef766026b2a4a0f56ccb88b3d20b3ce75287a8eddf0fc4468e8f6fcd133adb", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323501-323512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_323501-323512.nc", - "d478bc0be4ef11684c34c96df3c0db8deec99c22d8b91b900ef29f65a6a0268e", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326801-326812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326801-326812.nc", - "3d8c411012f3a6cd6bf07c92eb36a1b5bbd8879be4a030b3dfb73be7db66040a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330501-330512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330501-330512.nc", - "6473c5e17edfd2a3b972bb0eb963deb75485a8e62dcf18695e7fefa4de31e90c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330701-330712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330701-330712.nc", - "b3f4292e451425c32658e2ab69dc3166494225bec4a82bd15792fc74f14aa840", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331801-331812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331801-331812.nc", - "8a81a83f723b0b641843dbb8729b72f61a36e3430d9f8dfa21efed4b933cc74a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333401-333412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333401-333412.nc", - "3cdb205225aae14b37adb32cc6443d8ba1185c7f09e3ca791fcd539890e870c8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334401-334412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334401-334412.nc", - "0fe75e8ba9be2dc7ad0785a918a2132d89cf15557a5ed7371904447499e05bbd", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336201-336212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336201-336212.nc", - "57090a27268be96698b34838c08bbc16368f7b31bd5fa86aa1c75e85b0d2403f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338301-338312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_338301-338312.nc", - "f316b7a9d3ddd2017c221c4087b32b24287f43ac2e7343bf56d41b33c52646bc", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321501-321512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_321501-321512.nc", - "b951f305ce7dedfb432fd30465358a38f20aba0c49a9a18a435126673300d282", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325201-325212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325201-325212.nc", - "b3bd86ec2cd71a9262f8e6eaf485ed6e45e0c73b1c936daf29d4ed433eb3925f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325301-325312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_325301-325312.nc", - "e3a4618075d12c30ddb48156d8fc13f37065dd6daf544b21790a39de1f2a2340", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326201-326212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326201-326212.nc", - "f91a0db387a6024b19743af796e2773e4111b1bca504e8426a604a64fae303da", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328301-328312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_328301-328312.nc", - "6336e8d0fa6e6fc0b249306cdee3fe3fda6d763f7be9dd54b91c1049844895f4", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329201-329212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329201-329212.nc", - "36b38bb0dc79fd07d56afbddce523054ba6d08c6fed9da39344e9f1039cc2896", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329701-329712.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_329701-329712.nc", - "bb9eddbae4bbde6402e792879859a9962b6777424e43fbf02780c51fe0f00819", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330901-330912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330901-330912.nc", - "e5728370a1f2d6939656b94e878ae16644f99cebe2c3830608b460790ea501bd", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332601-332612.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332601-332612.nc", - "3481beb5b6203a458fccfac4299b012b44da90df9a2b57b6fff14a0f5fa64b1d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334001-334012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334001-334012.nc", - "c3bc68b0f2f3948d73cec88987f6746508e479ee1e711ca3e1ead6a48161689c", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334501-334512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_334501-334512.nc", - "06b64f4da6b1e16fcdc9c7a1f58b76361bd2549b884dc9523173d47ffd4f44d1", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337001-337012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337001-337012.nc", - "74dda9f5735ed04ef699a7dc02c3290a8e6392077ed474a5cdeb883055a12d33", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337901-337912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337901-337912.nc", - "942189e2f77115b61ce71e9e0b6a97bc535a0e8de2d662362beee0c204ba5423", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339501-339512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339501-339512.nc", - "afa8800bc810a6567036404eca024ebbd3749d8f7a602cca97b631af384fd1e8", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339801-339812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_339801-339812.nc", - "2f6414185b739879d6300198938f0e72b6499f5602aadea317e199f2dac7be07", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340301-340312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340301-340312.nc", - "0d8f395f30965357469720189ea9b08c6b5ebcef7152b66dfbc515d2cc4d1679", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340401-340412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_340401-340412.nc", - "b297016f83deaffb590ee534d8d7a4edf4f0e9925f26c527846abb1eefd7579d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324001-324012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_324001-324012.nc", - "345d9b594dba9bdbb6980bccab5b18f48ec282bc601a40d5b0754d8e510c0edd", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326401-326412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_326401-326412.nc", - "f384814352052e5b6969b360757a7a4c9f37af88b423bfffc4a098f79a14877a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327101-327112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_327101-327112.nc", - "02568439c3e868fab20f553b708192d94469108b9a28ff7031117179e0e222bf", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330001-330012.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330001-330012.nc", - "86c5cbc4aa917613927d839650472e595cbbb4b568d7a33f516375d5c3e31d20", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330101-330112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330101-330112.nc", - "6170eac5fd3ff6960bc944a7a22eb73ad5f1fffe44687ad596756fdeb6d58930", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330301-330312.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_330301-330312.nc", - "80ff024d6ec393ad92ef35a9f16d55157fe4daca61d2a869006abf4de5a1c282", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331101-331112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331101-331112.nc", - "488032708d55d0b8481079d259258c6cd9e38f44b0fcedc261cf71cd65224e63", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331501-331512.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331501-331512.nc", - "0910c28bf0a146469bd7a7704699f3bc86c19c9511d56107c6b4dac9033c2538", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331901-331912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_331901-331912.nc", - "48398069d425a510ce34b5853ff762c0195ae0aa86bc2899bff0dd74abd4ef9d", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332401-332412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_332401-332412.nc", - "79e3567e185d01022d8065ac21a831fd855a2d87e5997818c5a94a1308fe77c1", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333201-333212.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_333201-333212.nc", - "2a1165e4842748295af8f62348c1e33bff433f3087f9a2b59f88070a1de21d80", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335101-335112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335101-335112.nc", - "6b927aa111b37aa2be3307d7ad65667453d317a0f48747abd0c7d82327e4a99f", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335401-335412.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_335401-335412.nc", - "9b12e95614365967b2caef65539044382eeebbd1601a2b5d12de9f3248a84229", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336101-336112.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_336101-336112.nc", - "bf706657eb75710df95e9d89ca6363ce293ee4263c54eb168aadd311d992035a", - ), - ( - "tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337801-337812.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/EC-Earth-Consortium/EC-Earth3-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20200322/tas_Amon_EC-Earth3-LR_midPliocene-eoi400_r1i1p1f1_gr_337801-337812.nc", - "dc91dc88d5637c1dae5a3b883bf9491658513b88d85658222d67a16ffb48e8e9", - ), - ], - }, - "FGOALS-f3-L": { - "lig127k": [ - ( - "tas_Amon_FGOALS-f3-L_lig127k_r1i1p1f1_gr_070001-119912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/CAS/FGOALS-f3-L/lig127k/r1i1p1f1/Amon/tas/gr/v20191025/tas_Amon_FGOALS-f3-L_lig127k_r1i1p1f1_gr_070001-119912.nc", - "714198c7c21fed3fe7d078c5a2c069707e325442e1b3a4ef6c5dab307def75e9", - ), - ], - "midHolocene": [ - ( - "tas_Amon_FGOALS-f3-L_midHolocene_r1i1p1f1_gr_072001-121912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-f3-L/midHolocene/r1i1p1f1/Amon/tas/gr/v20191025/tas_Amon_FGOALS-f3-L_midHolocene_r1i1p1f1_gr_072001-121912.nc", - "424d0fdc8df77bc7734a2d168429fa8bdbba00e963a7d05844e45f441f7ef273", - ), - ], - }, - "FGOALS-g3": { - "lig127k": [ - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_090001-090912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_090001-090912.nc", - "0e270bde4030b08dbda78087ddf46a7760d17dcd4eefdbf6b2e1b32281dc4be2", - ), - ( - "as_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_104001-104912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_104001-104912.nc", - "21698fb3c7c3f9e5930972f3df62231267f61bd746b30c8144d2afbbbe38edc5", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_115001-115912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_115001-115912.nc", - "58ee918529a2a54862b46921849c8d7051a7dc8b1e87d1224f489bfe6126344b", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_080001-080912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_080001-080912.nc", - "7cae976c33392eea2ab11fec9b6448ccf65214a2918257924b533949d4a512ec", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_093001-093912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_093001-093912.nc", - "fe382392442af0f1d5d5c968260f2d17e64d9f73eea280bbc836d9d37f2bba50", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_110001-110912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_110001-110912.nc", - "a6286f9484f9dfc8788d0e140a063fb8ff01384bb2f1a18bc27f77fd6ce4e8c5", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_117001-117912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_117001-117912.nc", - "5689f4b1ad0c60dc595577a705438947f8dd1b2d4852b2985c8db56ec494b37d", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_122001-122912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_122001-122912.nc", - "b64c511d2f5decd0b245795c5af50f1df2470f83b57bd9d4eacf4c39e766264f", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_094001-094912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_094001-094912.nc", - "b96dd6e9bc3075e2ae9e2822c650fede2f2a116ee23cdc131c79519e4e2f2ad4", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_119001-119912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_119001-119912.nc", - "b64fb5e36d9debe04c27003639f18054aa406cdcdf2df03d81e1863ee8415caa", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_097001-097912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_097001-097912.nc", - "f10475c50e49f89f5aa7eef508ffce41b4e8f50412d4409ecd584e0bfcb77bc2", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_101001-101912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_101001-101912.nc", - "0a5dc12f28bb8c20a35d3afe71ec5dbb32caaf91cd45f9baaab4b8f385882300", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_105001-105912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_105001-105912.nc", - "431da63d7e3e7aacd13f2aeebf7d49161490c099e3be34ee435ec419e4189e5a", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_120001-120912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_120001-120912.nc", - "bc35e521b22b11883968f36198bf5d8f08151dc8c90e01ef0af0f1d15200967a", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_075001-075912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_075001-075912.nc", - "d101b111f3a444c6bed0417d0e2b617b1ed38faf7547277680e51bc45e50020a", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_079001-079912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_079001-079912.nc", - "729b96faafdd940d514bf4c62b74cb8d12e292df438b63d7f1135fb6146230a9", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_088001-088912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_088001-088912.nc", - "0eeb51354d2ec8721d06b0bf89c6422d6c4938209548cd3c29a2490da78a7071", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_113001-113912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_113001-113912.nc", - "b55b073ae0ef1ad37b190d88d08be46214b29028f3cc62c1f1e543b6e7de453e", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_091001-091912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_091001-091912.nc", - "e73294f914d0cb89a5b9338c13d2a88c466806720d5a8a29e02a8c17af6e1936", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_116001-116912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_116001-116912.nc", - "ddd305c2fdcc00b2fe2b9c834be9e0509c97b1348e0c90e6cb488ddae1f48bcc", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_076001-076912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_076001-076912.nc", - "011342124995f2e623f72c080b5f2a354e90d8b3ce836511ea528727a248ac4d", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_092001-092912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_092001-092912.nc", - "65f8da6716237a2e1c56acfc49955865fbf4a9fbabc43fa6f9d571de2f03b44a", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_100001-100912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_100001-100912.nc", - "11e1d6065684bf2fd962f97d45dde7cc96e2c37dcf3234e600ecce52197d6469", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_103001-103912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_103001-103912.nc", - "07a71cf98995a2c2afdca0485699f86d02a13771e37ed0d22fe90dac08cb1e99", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_108001-108912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_108001-108912.nc", - "478a2ee39a6a6a4f22a84537b379960152854e2f5aa78384760e252edc784426", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_098001-098912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_098001-098912.nc", - "833d0eebd2803eee9d1e1a5578fe46349c5f1b359ad98bb3cb4ae5b2453d36a2", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_106001-106912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_106001-106912.nc", - "d19fac4d95be604b86c1f3e2dd98ab3a2dd514195a2845ec431ba69c754cc5db", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_111001-111912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_111001-111912.nc", - "9d7845917a647ace93afca2caa8c2f9d9ca85d3e1e4489b60ce83bf95aa850a5", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_083001-083912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_083001-083912.nc", - "61a0fff7d1db6a637e33c5510961d3b21ce06483e8408b14803e3d90ca70d007", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_099001-099912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_099001-099912.nc", - "295112ca84b919191a1ac0907711247e4aa5a9e86e0f8ea591c6a3aaa38d53a0", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_102001-102912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_102001-102912.nc", - "76d5d7d6fb5c6229220e56e33e177529f6540d20eb389d7729b9071e46da09e1", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_089001-089912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_089001-089912.nc", - "e76d0bb1bfb00675dacbf9d092a87ae59d41992b781b41d2b2ba47bbfc878a51", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_107001-107912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_107001-107912.nc", - "b13489a84c77a648400d399925c35cae55fdc8044e081edeb035f710939c7df8", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_114001-114912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_114001-114912.nc", - "f160aa61323a2b1c4927aad396c0ea90c3390b89f7a5bca26e011ebfb416acad", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_123001-123912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_123001-123912.nc", - "3cdea5815d00069d9ac7c42e933980b2b5540e4f12624469a2a4732dfae9b111", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_124001-124912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_124001-124912.nc", - "69eb2ebfb339b59dd5fa5c9cce53cf42d649403a804ddfde40a373274bad6144", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_109001-109912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_109001-109912.nc", - "5799dc1b24b444b47e0a40e67c7a80928ef8624f05d2b069325169cb78f36f10", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_112001-112912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_112001-112912.nc", - "cfdd186b14f97f8c9734d390871f8d09b04dc24528662c6cb25336514264758e", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_121001-121912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_121001-121912.nc", - "9f8c5e397f1411bc163750be46be5a66261996ad068cb7cd818a9e7fbbbf3e43", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_081001-081912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_081001-081912.nc", - "6051df39900c789dc022dfc0c11afc1abaebeddb62cebc5e176514e73bfbddc7", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_085001-085912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_085001-085912.nc", - "baf86d5a4e6c8fee5d7380889ce0571654586d007989d6fa753412827a01469d", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_077001-077912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_077001-077912.nc", - "b8bccec643a3ce749fbe9261513f7dbb69ff44b82f6a0a4dd1958c6af17ea068", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_078001-078912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_078001-078912.nc", - "c8b3a7f5003a701191358b8ad0d674cb13cadb24d6ad7a25777bd745e5e94d2b", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_087001-087912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_087001-087912.nc", - "c4ec8e2c50b247e421586d7fe94c51def840b7178c1799431959f576b9abdb36", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_096001-096912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_096001-096912.nc", - "c4b75a48e134e8b1c03d354dbc565005b67afb179daca38c617855acbb5b3c3f", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_086001-086912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_086001-086912.nc", - "375acb92f0e0b4ae876430171cbf9b7dede30983da79208ae7e9280de13c9802", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_095001-095912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_095001-095912.nc", - "ea274d36ddc16e67d274e54cf20fa339019dab237c8674aace478281c81bdea1", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_118001-118912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_118001-118912.nc", - "4c08a0a4912052a0a2b5f6c2fa73ebe68e837ead8349655401ad46a61e697d70", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_082001-082912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_082001-082912.nc", - "7beb4a87619cb2909c0563ccb459456c6cbc5ed21ae3649aedc086b60db422f7", - ), - ( - "tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_084001-084912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/CAS/FGOALS-g3/lig127k/r1i1p1f1/Amon/tas/gn/v20191030/tas_Amon_FGOALS-g3_lig127k_r1i1p1f1_gn_084001-084912.nc", - "bff522dd69a9c92eccd95909d4a1173f67afb43194ab92fbe4be97356a9c3385", - ), - ], - "midHolocene": [ - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_062701-063612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_062701-063612.nc", - "4fd29fe693d54759de22b822ee62cb8f15335ac806380134fe91feec966dc1fd", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_063701-064612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_063701-064612.nc", - "c42da9446bcce358bbfe8759f56f57a874f906065fed8d6b9016cc8ea8437c42", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_064701-065612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_064701-065612.nc", - "9b9f200e1cac95c38f1d5d030ef192cc3cb1c19b1b4cfd843378cd936c06f177", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_065701-066612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_065701-066612.nc", - "24befa3141e117496e15a167b71e33104b53bbc8f0dcf6c69db5c0604931c689", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_066701-067612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_066701-067612.nc", - "4b0bfcb8cce9b8a0445edc551d76f6c1ac2a2b15fa8b484589e977c2491fe1c7", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_067701-068612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_067701-068612.nc", - "6deb2ea0d27a0e671cbd2077005f562c1b2681330e7fe0b8adcf2efe70769548", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_068701-069612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_068701-069612.nc", - "2786f66429ac029e34264099076b429e27c3625f12acc44bcb3460bf65350722", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_069701-070612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_069701-070612.nc", - "6601193d52abeaa9f9ee2592bae2dc81e4261589c1cdf15fc116c32a8b4f692d", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_070701-071612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_070701-071612.nc", - "207207520f76ab4c3f95902125851732bad1fd1248f4e2c4717c2a78d8b60b5c", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_071701-072612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_071701-072612.nc", - "65fa1a557738ec2034cd0ddcefcdb86408a89869eed61f49aa4c3642ebedf4d7", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_072701-073612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_072701-073612.nc", - "3cbf08889a78ebcfe6d8b7f1bf1261db84a403d17fb9e8282a728e6123e6cbb0", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_073701-074612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_073701-074612.nc", - "e9639653f514b4b5171d34865ab169f44cca64d427e9c7f7e40e1c8696452a65", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_074701-075612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_074701-075612.nc", - "87ccf438e2d0e8cf8383aff2824df92778c547d881430f3304d094b18813058f", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_075701-076612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_075701-076612.nc", - "31b99e20ecf609585b3e3141444257cd3d9478c1d20ff7875eb14ad9e1cc906f", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_076701-077612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_076701-077612.nc", - "53ca91d7bc5adfcb62c1b5852fd3fb3c03d35df41a28015e76588e31c4406ce6", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_077701-078612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_077701-078612.nc", - "0bc959e13700f85bc863e84edbb30eb32118bf47f4810018e82b4ed2ba557edd", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_078701-079612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_078701-079612.nc", - "587ffc5d41d83813d4520c4b89c0d46f2699416ffbcf22f4e79987dd22a4ea1e", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_079701-080612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_079701-080612.nc", - "9667591a4d0aa007885dc140ee076a85ce22ac27fc299ba1815ea382fbd84baa", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_080701-081612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_080701-081612.nc", - "45436d7c1fdea4a172059696f4b6373c19aa119829167927335ef4ae8fb7b69a", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_081701-082612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_081701-082612.nc", - "d43e92450ace64f4859c3613f3fb213c1380f982dde6a8ac06256e0917f416d3", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_082701-083612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_082701-083612.nc", - "85fa224c3fef51392cb98e803e7cca997ae3050429639538e18ec284d6148681", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_083701-084612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_083701-084612.nc", - "9f88d813302df429954852239f64277a1794ba120f56c3185a5bbb2ed79b735c", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_084701-085612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_084701-085612.nc", - "db0ca85147f5df4ccebc61bb1d4a2c20a0c193ddb7a174d7b5df3bfa89328a1e", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_085701-086612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_085701-086612.nc", - "dc80cb8cc2e56cfd016ee30462f7796e45e2e0b97c60bdce990ea09fd57b47a1", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_086701-087612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_086701-087612.nc", - "2cb7786a2e1afbc7513aa20941e52a2932261378a7f4649ee1083c33be29f3ee", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_087701-088612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_087701-088612.nc", - "18558540a083acfb8c1caa18b3d06b4b1c05b32cf91d3e1e4fe0090876cb7bbb", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_088701-089612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_088701-089612.nc", - "1412ad8125acfb63e567bb18a43e1ba1b13aaa4aff9ba054d8ab08c2c28f424d", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_089701-090612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_089701-090612.nc", - "eed6c105610c9db287e48213c53e842a9837746c5a06228e89c6cb396c648603", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_090701-091612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_090701-091612.nc", - "a29d926e6d19112da34e93ae99c881b66c5696a59ce1ec9fa84a4ac1cda61182", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_091701-092612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_091701-092612.nc", - "24755f2fa0029fb3926d8ff8dafa8271491414594b6f16b773aeb9b86fd3245f", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_092701-093612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_092701-093612.nc", - "caa7448296d27fa10e33f92388080782dfccb0806fa48b7c4d488cf99f065714", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_093701-094612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_093701-094612.nc", - "cf4b5fb3203a59bccd6e2403d4a66f8124182ec5e006a3aeef2f31d5aa3ce739", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_094701-095612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_094701-095612.nc", - "a92ae7190148c4184dcdeb1b6d86b81cae82898b2e12b95601f5e5de1ad305aa", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_095701-096612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_095701-096612.nc", - "6d5e6a273c2776ed1f66a78ce53b1f05ab1c110a602f16d83bb5c5bed435fe11", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_096701-097612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_096701-097612.nc", - "8eb5f3b9957767d8eb32202aa488968d72903f78c99b7987ff3f683ff959efc5", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_097701-098612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_097701-098612.nc", - "6420b03b3859d7d8b8d7d2ad12dfd70fa05a34e26a5a700e905a998846d9c6e2", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_098701-099612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_098701-099612.nc", - "ee634e506f7520dd007231c4aaa0957e6f0b802b2adbeec7d886ec4930b03307", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_099701-100612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_099701-100612.nc", - "2fa4577a43e63363fafcc1cae6e5bf32d057935c9a3c5e25cf679792476757fb", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_100701-101612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_100701-101612.nc", - "8c9bcbc77c56af2ceff425a653b58a5ea33870d4acf3e297d1c2cb00a35d38e6", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_101701-102612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_101701-102612.nc", - "9ebf8fd5801f62996c5ce5e6f73dcc058563900e0346d8fe24d7fdc869dacded", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_102701-103612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_102701-103612.nc", - "48daaef94dfbe3e2577ffd8557a4d425e4bb71b012a6ee6096096fccc66b587d", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_103701-104612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_103701-104612.nc", - "a283d4708c1cf5ea95aa0495907b19ab2354e8d15c210ece791b1f3dfd75b165", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_104701-105612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_104701-105612.nc", - "a4aa27e433246a8c423e636228c38bdff49a9f5b12449974a91922ce1caf94a8", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_105701-106612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_105701-106612.nc", - "650423f62f7bfc840b0c27c983226900d646ef399696b477df0f792f934139d7", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_106701-107612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_106701-107612.nc", - "edb7a56654d6cb14d433125925bb4f7d314d3e5a08d68591e4baf6d692ffd43b", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_107701-108612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_107701-108612.nc", - "6fae5b1f3751f7f694523509ed2158356d4e722695f6dac2bf52899b5bbbae4f", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_108701-109612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_108701-109612.nc", - "65001c916cf357e0de5f8a8afffffaabeeed2102ac13b1f69599a6b4368159e8", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_109701-110612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_109701-110612.nc", - "bbf7ea61da5ac3733c427754214d2a2dd7f1b2ed8d24e77d71430ff1bed01af0", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_110701-111612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_110701-111612.nc", - "d67b5a665b988ae70d06850e27e5236b61523ae985d7edef17a7dc8a94d920b9", - ), - ( - "tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_111701-112612.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/CAS/FGOALS-g3/midHolocene/r1i1p1f1/Amon/tas/gn/v20191024/tas_Amon_FGOALS-g3_midHolocene_r1i1p1f1_gn_111701-112612.nc", - "1913b4708b53900f7b56a3c40cd091d06c3fa48b29304f8eb4383039a7131654", - ), - ], - }, - "GISS-E2-1-G": { - "lig127k": [ - ( - "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_295001-299912.nc", - "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_295001-299912.nc", - "a07551dc07730b797a387b2d6f73db3046b76776b12a62c3bceaed2b3d6a02f9", - ), - ( - "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_315001-319912.nc", - "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_315001-319912.nc", - "50fc220c4c8b30395a688eeb7313622a89b7f9d71dc795bc5022a85b5abcd034", - ), - ( - "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_290001-294912.nc", - "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_290001-294912.nc", - "e181091e8431eb9db8a1c97efb38ded2beb93f7cdb54f68ea79af6696918aea3", - ), - ( - "tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_310001-314912.nc", - "https://dpesgf03.nccs.nasa.gov/thredds/fileServer/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/lig127k/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_lig127k_r1i1p1f1_gn_310001-314912.nc", - "2e5494d23dd66ed54915c7e90c355c8afad5480f9c3ec20008b2f75102fe5407", - ), - ], - "midHolocene": [ - ( - "tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_290001-294912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midHolocene/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_290001-294912.nc", - "102338b8428997db72348de9ce7cb0cda99ba6db56bee182c331b35bab904a60", - ), - ( - "tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_295001-299912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midHolocene/r1i1p1f1/Amon/tas/gn/v20190916/tas_Amon_GISS-E2-1-G_midHolocene_r1i1p1f1_gn_295001-299912.nc", - "577f4dcd3ecc194ea568b3a16aab524c4998f0bfb74b552c4293bc35c83f40ca", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_310101-315012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190626/tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_310101-315012.nc", - "2d6667cfab220b22dcb739650d799a2786070681cdeb6c74d6e37b9753e42c37", - ), - ( - "tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_305101-310012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NASA-GISS/GISS-E2-1-G/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190626/tas_Amon_GISS-E2-1-G_midPliocene-eoi400_r1i1p1f1_gn_305101-310012.nc", - "367845352ae29104b6578658b456b5a1485b038dd572997bbe5638fae99bb50d", - ), - ], - }, - "HadGEM3-GC31-LL": { - "lig127k": [ - ( - "tas_Amon_HadGEM3-GC31-LL_lig127k_r1i1p1f1_gn_185001-204912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/lig127k/r1i1p1f1/Amon/tas/gn/v20210114/tas_Amon_HadGEM3-GC31-LL_lig127k_r1i1p1f1_gn_185001-204912.nc", - "406331de7f84f4b656cc73b0a47ced3ba142650f179674aa5795e6c34fc36138", - ), - ], - "midHolocene": [ - ( - "tas_Amon_HadGEM3-GC31-LL_midHolocene_r1i1p1f1_gn_225001-234912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midHolocene/r1i1p1f1/Amon/tas/gn/v20210111/tas_Amon_HadGEM3-GC31-LL_midHolocene_r1i1p1f1_gn_225001-234912.nc", - "cbdb344e8ffff205ffb56f79e8058ddb9c8f5c45612a4bec8f492c499885bae3", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_239401-243312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20201222/tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_239401-243312.nc", - "9e5068df9aeb99d84848f77fe3bcca39fa5620665de96bb7fe792b3621c6afbe", - ), - ( - "tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_233401-239312.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NERC/HadGEM3-GC31-LL/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20201222/tas_Amon_HadGEM3-GC31-LL_midPliocene-eoi400_r1i1p1f1_gn_233401-239312.nc", - "55950b87ce68a7f4973557cbcba2f07be2ab93bdf68a809bd6b4b4343934df54", - ), - ], - }, - "INM-CM4-8": { - "lgm": [ - ( - "tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_190001-199912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/INM/INM-CM4-8/lgm/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_190001-199912.nc", - "9f1d3904db25d350d0d21bd75a989f78d8c6f7a33a1d6189cd22e8fb3ef90716", - ), - ( - "tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_200001-209912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/INM/INM-CM4-8/lgm/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lgm_r1i1p1f1_gr1_200001-209912.nc", - "1c6131c17b8b1857f8cf6dbd55339708ed4a70c98740b1b35d9b11bf4d730529", - ), - ], - "lig127k": [ - ( - "tas_Amon_INM-CM4-8_lig127k_r1i1p1f1_gr1_190001-199912.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/INM/INM-CM4-8/lig127k/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_lig127k_r1i1p1f1_gr1_190001-199912.nc", - "eed0fc06aac4d3ce5aa809523ea66b0c0f8008704b38aa866510fbc3420f7c8f", - ), - ], - "midHolocene": [ - ( - "tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_188001-197912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/INM/INM-CM4-8/midHolocene/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_188001-197912.nc", - "20bfc2903ff9abbd3067652ed99aa0d52d4b255138f4bf9a6605e7b48888810b", - ), - ( - "tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_198001-207912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/INM/INM-CM4-8/midHolocene/r1i1p1f1/Amon/tas/gr1/v20190802/tas_Amon_INM-CM4-8_midHolocene_r1i1p1f1_gr1_198001-207912.nc", - "5444242398a0cb4a5dbe0f87d284a3cebb09828f52d001fb3f94f054d7c04138", - ), - ], - }, - "IPSL-CM6A-LR": { - "lig127k": [ - ( - "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_195001-234812.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_195001-234812.nc", - "f979ee76cbedb20252c1412f70daa31f19ff4f0ff8572abd43250231d4d9dfb9", - ), - ( - "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_235001-239912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_235001-239912.nc", - "664a3d92554e39be17f534294dad2aa90319db36806441f8aaf482a5bf4ae472", - ), - ( - "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_234901-234912.nc", - "b983aac14573d2a25deab2f611dbad4aebb406fe904500fdbee0def8e6624dcb", - ), - ( - "tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_185001-194912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/lig127k/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_lig127k_r1i1p1f1_gr_185001-194912.nc", - "d9b7f7970dd1de6babe6100dde7765b66a289edfecc4f3d823f8d6e9713b0c10", - ), - ], - "midHolocene": [ - ( - "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_185001-204912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_185001-204912.nc", - "03e154f96f1b082184e0cdf8e2b9bde33edb5771eed68602c6c9b84b476d35ff", - ), - ( - "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_205001-234812.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_205001-234812.nc", - "ac3a88d376fbb08da70ed91e0aa80dd7ec8ccda2913541999f6b6b44c9cf966b", - ), - ( - "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_234901-234912.nc", - "1596a2acd87c460ee39c309845d24d04a8fefe50f9527718132df9d5dcd33e8e", - ), - ( - "tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_235001-239912.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f1/Amon/tas/gr/v20180926/tas_Amon_IPSL-CM6A-LR_midHolocene_r1i1p1f1_gr_235001-239912.nc", - "bd38488ddb851772a4f58a20d96b0ee0897952e042166e741bae9a9cbcfd15b2", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_IPSL-CM6A-LR_midPliocene-eoi400_r1i1p1f1_gr_185001-204912.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midPliocene-eoi400/r1i1p1f1/Amon/tas/gr/v20190118/tas_Amon_IPSL-CM6A-LR_midPliocene-eoi400_r1i1p1f1_gr_185001-204912.nc", - "6d894b8eac6e4a714e6e3452d7bc91a7209fb7a89c7d5bd22a09cfcb2831b48b", - ), - ], - }, - "MIROC-ES2L": { - "lgm": [ - ( - "tas_Amon_MIROC-ES2L_lgm_r1i1p1f2_gn_320001-329912.nc", - "http://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MIROC/MIROC-ES2L/lgm/r1i1p1f2/Amon/tas/gn/v20191002/tas_Amon_MIROC-ES2L_lgm_r1i1p1f2_gn_320001-329912.nc", - "52832665fa04026426de2c7c93b4fc1b738f8cd5a2edfda8519a6c7df942c118", - ), - ], - }, - "MPI-ESM1-2-LR": { - "lgm": [ - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_223001-224912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_223001-224912.nc", - "af5d2b47b44160ed5ccb0a7db8a81694456c7c321dbd8b719be56aafc490ac0a", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_203001-204912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_203001-204912.nc", - "06478b12ccaa7f4cf411c388612c1e6613becdab98c5ca55ec997926f49cb37e", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_219001-220912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_219001-220912.nc", - "46df9a60a6fccba119493a105eb89d269241f2f03e984c230f5204b3cd800984", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_233001-234912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_233001-234912.nc", - "7d72da6af20f47cf2d44250383c03ad4289776a43b52408d4bf82b1af64048cc", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_191001-192912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_191001-192912.nc", - "cb77dcb6fed865f3e72127eb66e3f924fd47307a5acf58e6ad9696570cc9902f", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_195001-196912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_195001-196912.nc", - "7201cf1112fd4955d6773debfd861a0655766b059ec583dea7f06d85a72ece99", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_227001-228912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_227001-228912.nc", - "2de0c1cf1aa88f55e2afc41535a299a6f85d9e0f5a6a49baf00d62f6ff35317c", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_207001-208912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_207001-208912.nc", - "2eb31836dc913c6c15bfb2db97f13e1c1635832d5e363d46e29b7a4e4212d9f5", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_213001-214912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_213001-214912.nc", - "6c63848ec32997a82e49323aa61182049552a9ad1b4e946d882a4180204bf77e", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_201001-202912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_201001-202912.nc", - "605114d0ba6c5c8dd611fc775cabb4f9ce236c9466defa8a19dfdf3de546f457", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_215001-216912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_215001-216912.nc", - "b6628c5f6febfc297e9ddda549fb926337d75d084f9ae294a3d73dc46433e3b3", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_193001-194912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_193001-194912.nc", - "c2c4d8ab5ed60d0acc6bfdd0e0de47b45e1bb1197bbc8affd38bb2e689903521", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_205001-206912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_205001-206912.nc", - "d3b9eb7b20b14fc16e62fc7e60adb83319bed5bda794e847ac8e8834b3546a87", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_189001-190912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_189001-190912.nc", - "a0fbdba0c2837e079158501ad2f68ce793fcc38ed04362e708c4ee2dfb45ed5a", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_187001-188912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_187001-188912.nc", - "be4efa16221c09137e82ea22ad3829769b6cce37ec7a8988509ac231219154e4", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_221001-222912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_221001-222912.nc", - "bb099587148b6cb98569abdf7616648f7e5d1de55a59914591e9172fe32b4bdf", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_229001-230912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_229001-230912.nc", - "ac2db21b7da4b6374dd7c7974741ec8b9f2b576892f80bcfdf20047afd3ed40f", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_199001-200912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_199001-200912.nc", - "3493470f0105d059b24ee7f2afbb3dd0ca9c1eb037a17f8c4c6d6b785066e51d", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_185001-186912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_185001-186912.nc", - "0b42b99bbef08c521b74b5d96003e7001cc7347b891319da65574f76cecd8f1b", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_211001-212912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_211001-212912.nc", - "40e9f246ab03721fb6865945be41b492dc047ce225841a51ce51475aa1b0d2a5", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_225001-226912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_225001-226912.nc", - "4d431145208c86e942b35a28f4b84b270b4899b2d6b54abc799aa1ae7a6737d4", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_231001-232912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_231001-232912.nc", - "1f67700673c4cfca73a6c6c442c65683aa1b82009f3eab5cbba510d95a4033c4", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_197001-198912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_197001-198912.nc", - "990f2c28bc486b699d19b13232a9dd7bc2f50c6f7f66e70b3df5fb38ad1824a2", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_209001-210912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_209001-210912.nc", - "235a0536897fca72cb4b682eeb54e4606fd66b79fed45e328e053bda77a3479f", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_217001-218912.nc", - "https://esgf-node.ornl.gov/thredds/fileServer/css03_data/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/lgm/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_lgm_r1i1p1f1_gn_217001-218912.nc", - "710ef3b26960a0a7030faad907e3a45dc3caccc3504dae43f25c709b8101d7cf", - ), - ], - "midHolocene": [ - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_100101-102012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_100101-102012.nc", - "058612d852cd64df6dc18df7c6714eb33c607c8428304cbe5ab87a76ce8dd4af", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_102101-104012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_102101-104012.nc", - "eba6aec05dd309a0a1101df2ddf5f3087adf31a40bc2b0a55b65924e95be0f46", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_104101-106012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_104101-106012.nc", - "93ad3029c2e05c65cb36e3cd93ab4cb57ebca50144568cf7703ffaaebfb701e6", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_106101-108012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_106101-108012.nc", - "10f72ae88f0fc6ab48450960a938c3bbf6f8839a22c269aa23ca92bf2995cc73", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_108101-110012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_108101-110012.nc", - "489a91feff8fe353b5102a4a2fe044bab8abd02f16a2c6aa3522c5126e3ed7cb", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_110101-112012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_110101-112012.nc", - "52cebf9794ef3c8594c95badcb6c6183785a873c0c07158e798f927c0e29908c", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_112101-114012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_112101-114012.nc", - "1860d2e5749344eb9d78806f7d297d7702ca00e6326cee41c62c12fb6c14ff6c", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_114101-116012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_114101-116012.nc", - "09e4fc82a86bf8b47db46089ac979dae6b4663eb113ef67074d7bfabd9baf1ee", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_116101-118012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_116101-118012.nc", - "de1b1e0552fe116bd8232b970a16e389badb5f87539f8a1f1ea5662ea4f27f91", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_118101-120012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_118101-120012.nc", - "92a47aed6ce68c17f02a1867a03ac5b169299e7a517d5a50ed28f75b17ecf788", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_120101-122012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_120101-122012.nc", - "1157a7a792bdf459214f72d1a89666024c29b6ea1c1105df52422707e309ab17", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_122101-124012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_122101-124012.nc", - "ed852e49cf87af45c8cf7ae98ae4ea019014934e724b4515f3280f236b1fc328", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_124101-126012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_124101-126012.nc", - "5db6bb738349206a79060384555f537be9ba1189be5574ad9c20ba66f20fd868", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_126101-128012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_126101-128012.nc", - "4687007a5d995078ff94a137f63005c81150899f6cf118572efc4793fd3badf5", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_128101-130012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_128101-130012.nc", - "a42da2340da4a65698df7f9e362056898c94a9af41dd475ae221510df47ffa5b", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_130101-132012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_130101-132012.nc", - "11306c379182548d647b1af1b0345e59fcbd0b589a6f5001fc40a6d4dd5c50e3", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_132101-134012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_132101-134012.nc", - "d7968c47ab84f99ee6a1ded8963b29cc007172c50aa5513bbe916262a00b43e0", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_134101-136012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_134101-136012.nc", - "aab3741881721d56fe0ce9d2dd0081d9beaa0ca2dabc2472d614e77655d2f213", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_136101-138012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_136101-138012.nc", - "7ffd48adba83bbb1cead00d05f219f54d6e8724b949953c3e8e909951be84dc8", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_138101-140012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_138101-140012.nc", - "871f4e8bf8257d7aab85c2530d2166bb5fb005cb6146c84a31ca93ad76d1a145", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_140101-142012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_140101-142012.nc", - "c92294625b8bd395efbb6842a69d954041a8172181782377b45e559798a7a6d2", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_142101-144012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_142101-144012.nc", - "7fe257824fb98e125e73910eb4a7e289539183d2631dde59d8e2fafb91ffb6c7", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_144101-146012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_144101-146012.nc", - "83c419131470cfff783214cfbec93a9a13d510801f9bb396f4365a32ebc96c6c", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_146101-148012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_146101-148012.nc", - "4b0f98ad810f29723c115ea670a7dd2fd356164c5462d780df3547ac2bf34287", - ), - ( - "tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_148101-150012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MPI-M/MPI-ESM1-2-LR/midHolocene/r1i1p1f1/Amon/tas/gn/v20190710/tas_Amon_MPI-ESM1-2-LR_midHolocene_r1i1p1f1_gn_148101-150012.nc", - "cbf40efdfb06984510b42a88d8a5ea668d078919b5db435c535ccaeb545acfa7", - ), - ], - }, - "MRI-ESM2-0": { - "midHolocene": [ - ( - "tas_Amon_MRI-ESM2-0_midHolocene_r1i1p1f1_gn_195101-215012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/MRI/MRI-ESM2-0/midHolocene/r1i1p1f1/Amon/tas/gn/v20190919/tas_Amon_MRI-ESM2-0_midHolocene_r1i1p1f1_gn_195101-215012.nc", - "c641f080d52a0595f8bfe412dac00616e2acd59cc1d739f06988abc7425ff5a9", - ), - ], - }, - "NESM3": { - "lig127k": [ - ( - "tas_Amon_NESM3_lig127k_r1i1p1f1_gn_160001-169912.nc", - "http://esg.lasg.ac.cn/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NUIST/NESM3/lig127k/r1i1p1f1/Amon/tas/gn/v20190909/tas_Amon_NESM3_lig127k_r1i1p1f1_gn_160001-169912.nc", - "a79e92b36d83beb7de1387fbb26711b9872bfc90954e06b6a51ee1b8f9338586", - ), - ], - "midHolocene": [ - ( - "tas_Amon_NESM3_midHolocene_r1i1p1f1_gn_179801-189712.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NUIST/NESM3/midHolocene/r1i1p1f1/Amon/tas/gn/v20190813/tas_Amon_NESM3_midHolocene_r1i1p1f1_gn_179801-189712.nc", - "d9e3f2729829136051f943e5efe0b0d8b0ca610542ed27ddc2ca7c270eaffde6", - ), - ], - }, - "NorESM1-F": { - "lig127k": [ - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_154101-155012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_154101-155012.nc", - "77f5f6b112d0b137afbcc07620388bf523d45c06f7209c3eb2e33f2ebe4679cd", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_155101-156012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_155101-156012.nc", - "8ea5c7e662979f33787d31feb8f1ea7f5804504082abb59722dcbe93af608b86", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_156101-157012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_156101-157012.nc", - "2db41e376907f4e95d6d9d997ea22fdb050cff047d9a78c16c0f111a3900daa2", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_160101-161012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_160101-161012.nc", - "e4d32f22a2432e58fa0dbf618bcdd099d0a1999a01605c2b6ef69e81951abd7f", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_169101-170012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_169101-170012.nc", - "a65ca0079a289c35f18627dc823c0c630a7cd53d1427acb0e5bdcfbd5320f8cc", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_158101-159012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_158101-159012.nc", - "fc3e3104fcc008527ebafbdc7c6926672dab5b01bf22a7ae277d2b6938614770", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_157101-158012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_157101-158012.nc", - "651f40868d4c541b030e4c1ab72b43cd38a62dda742c66de43df2488e08d4655", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_159101-160012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_159101-160012.nc", - "7ac9d0655bc6a9dd4830fc0b5c93b44dadf095d5a0d62b5e5f3c8f5827c5a6de", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_163101-164012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_163101-164012.nc", - "716e9fa460790ecef97f760207b204afd83c15bf191787d8a81a1aa7546e34d4", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_165101-166012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_165101-166012.nc", - "0ddd4481da264dfb6e89a9639fab689fe68b11e1de958ab3a996c5921030086d", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_166101-167012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_166101-167012.nc", - "6c2dd03751ba30fb4f0831055c61ac4e8a3929c14ad22f19d3bf4260e9455aee", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_153101-154012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_153101-154012.nc", - "27eee2b4da71eb9a8bb3430116e528cf7b1cd522fefdfc952fc4d88842902db2", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_162101-163012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_162101-163012.nc", - "8a80fa63d1ef87e0598082445935a4e3f004b13e7ede4a59c8371312e18c0c66", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_167101-168012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_167101-168012.nc", - "63df21b15dc803ccc064e82df8c63f5a11de20b1ac95da64d6d7ea3833750ac7", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_151101-152012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_151101-152012.nc", - "1fa62ec334d8441a32062a54106bd3885d8b7d42aefd40b5c0614d0a2d90a467", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_152101-153012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_152101-153012.nc", - "099c2d94b78130d86a77e7e2e62cf15ee11cb0f7c46785af1a22c60b44c07dc7", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_150101-151012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_150101-151012.nc", - "31777c4194e86ab5639a23768b9a511bdfa18ebc9639558664f12e035ed76327", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_161101-162012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_161101-162012.nc", - "8b9d3c01c934da5f1017036516cce0c3bcdfdad147c27adb086a01a3cada95dc", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_164101-165012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_164101-165012.nc", - "f93c9fd3b0c223f04c09d5b32084a65d7430dda656b4e5343a8befad00890c86", - ), - ( - "tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_168101-169012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM1-F/lig127k/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_lig127k_r1i1p1f1_gn_168101-169012.nc", - "a2a2edd6e9e859db4b1b4739db05028b22682ac3bae1001ff3c435f2a6fd4f9d", - ), - ], - "midHolocene": [ - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_150101-151012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_150101-151012.nc", - "31614cbe650d200291b4afdc898f8edd6f5f7fb75fbcd4ec481918603cd2bb73", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_151101-152012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_151101-152012.nc", - "65db10fa1ef3dbfb02032818c919dac0bd3022fecf0643b2ee9b4f62ec6fe27b", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_152101-153012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_152101-153012.nc", - "54570dab6598d095420e105553d3990c051b6c19f16f723a09f642c21db7a618", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_153101-154012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_153101-154012.nc", - "cc7407f53496553e88090bf456104a98b4d593b728f62b31e9ca5150fe18ba18", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_154101-155012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_154101-155012.nc", - "282bfcc9e0accd01a61f57a99fc2138c237536fbe2c19cf85d544b3912b581ed", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_155101-156012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_155101-156012.nc", - "c8910c20b34cbd2885520f8bbddb91651261e11b507084494f725037d1f1d0fb", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_156101-157012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_156101-157012.nc", - "b2df08ab191482042e80e3f07b90da159cc7c08ff77ff4cd36dc451eb9322388", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_157101-158012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_157101-158012.nc", - "c54533bc46c09f11cd45ad9091826461e25d8a1d374117118ce1983d03d9e9db", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_158101-159012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_158101-159012.nc", - "c3518096b5174fbf9bb006153233c5ed8d68be4a64ab46b0038577a597f322c6", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_159101-160012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_159101-160012.nc", - "16a2870dd2131f80076e0f753f6a3f87cb1ed1efb58cc0d4ee9e78a8f545af23", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_160101-161012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_160101-161012.nc", - "d8b8c39578194b988e9804490466bda3abc6539195e9387b5a412c9ad1131b6b", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_161101-162012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_161101-162012.nc", - "bdfd8486f649caaced7a30f7d876ce4a13ca010db3f15d25fc92ddfef59deed8", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_162101-163012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_162101-163012.nc", - "7a8fd6aadebe062b71170dfe36ddfc31ba1683203b7736d6cc5dff12313ec057", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_163101-164012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_163101-164012.nc", - "8235ad839a79fd3c7e35f114e481cb354e3ee0b87f304e531153a7b5bce05367", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_164101-165012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_164101-165012.nc", - "99c4121756418d4bae16f91102677deaea2a8ba3cd1172fa4676d21bfac9c7f1", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_165101-166012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_165101-166012.nc", - "61109533cdad1c33761c9c5b899f80e5c941e380cb26064d5d63283fcb2bd82d", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_166101-167012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_166101-167012.nc", - "ae9781449fb1e35cddad53ccba19aa8e3de58d344c0c7b2cf780044b39d4e361", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_167101-168012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_167101-168012.nc", - "768ba193c7a081697953ece773816a3b23e3954339f4f3493155e68cdb8a146d", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_168101-169012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_168101-169012.nc", - "d637554903860088537c725becf32cd78bc6e5cf2446005fc5363b4b7a3ab222", - ), - ( - "tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_169101-170012.nc", - "http://esgf3.dkrz.de/thredds/fileServer/cmip6/PMIP/NCC/NorESM1-F/midHolocene/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midHolocene_r1i1p1f1_gn_169101-170012.nc", - "43cc513019a9db7861c940921cfa58d0f883aae91f148272d089d81a8e62f499", - ), - ], - "midPliocene-eoi400": [ - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_242101-243012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_242101-243012.nc", - "da191151a818a9e00ab948f7277c06afcce60c9731044ae7e8fc0e45b30d5bb7", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_231101-232012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_231101-232012.nc", - "2fa67ee816d215c7a6d870c1fdf030b8549ac6fbc71c143a03d8323a711fbd21", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_243101-244012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_243101-244012.nc", - "6816fe7eaf40f14c2ffa41af37dd18c72b733e550dda8c1135a0365c91522f9e", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_234101-235012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_234101-235012.nc", - "0dd0a840aaff57f530876cbfb4ced868e91e8b3732999be7c555a991b280f0f3", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_245101-246012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_245101-246012.nc", - "f4db34a8dbf985e31042e4d5bcadc6ff0f7e8df4d4e653fb815904297a754f54", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_232101-233012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_232101-233012.nc", - "d89b91a50a4baeaa741985aa87f778d947c40a310c4cd664490b9ba428763091", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_236101-237012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_236101-237012.nc", - "cd5977ad887bc4e3207c734d9d2bc1167ab4520225e3f2d8dacd2f6ea4f17108", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_240101-241012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_240101-241012.nc", - "d75d912e362817301bf1d484e88f52739d71a295a81fc2c209463d624a98a0bc", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_248101-249012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_248101-249012.nc", - "3b32fc1156b51e3a92fc66884b6059aa495d359acbfa38f8bf839cf5df83444c", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_235101-236012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_235101-236012.nc", - "242cee1b225b04138fe396da3898cb561bc0c0d46d02ae65eb6f960eab8dc2f1", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_238101-239012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_238101-239012.nc", - "02176e7cb937c61f9a135737053c20842c79a6725ff4a74a0eb91d7c94ce7817", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_241101-242012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_241101-242012.nc", - "72509f5b0193978df6279d8f7ad0744a6860245c4646f817314d80f3adecf1fa", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_246101-247012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_246101-247012.nc", - "3d7be1a874a52bf1e6a34dc116b4e022bdf165f4b7a9783988597a9cff34d728", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_239101-240012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_239101-240012.nc", - "b3bac58f54bfcf464d0cc5185e99db39fc7b1cb83ff30746d47cd2fe0559f5af", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_247101-248012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_247101-248012.nc", - "fb123ccf2cd324d8afe5919ca5a1c3f434480b1041270473ea986daa88659ecc", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_233101-234012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_233101-234012.nc", - "1b748905b2edc45a21a8ad9fb9ddae4684a0513327139e1a1fe58793d29444c3", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_249101-250012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_249101-250012.nc", - "9cc7f85e8a63e42f89d9778ba5d12c1cbff0290a7f7adbd34ea8250f7a287b55", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_237101-238012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_237101-238012.nc", - "208cba41538b587178e6cf54425370058ccfe16df2b2c8222af10e1fda86da11", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_244101-245012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_244101-245012.nc", - "b68830d6837d3474bdf8fc17b129fe9407e86e2b9f468c2d9455b639baf08520", - ), - ( - "tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_230101-231012.nc", - "https://g-52ba3.fd635.8443.data.globus.org/css03_data/CMIP6/PMIP/NCC/NorESM1-F/midPliocene-eoi400/r1i1p1f1/Amon/tas/gn/v20190920/tas_Amon_NorESM1-F_midPliocene-eoi400_r1i1p1f1_gn_230101-231012.nc", - "1aa1b55867c2e0a370bf9d101efe8ad49ff9b662b46387129b0dd612aba5307f", - ), - ], - }, - "NorESM2-LM": { - "lig127k": [ - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_211101-212012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_211101-212012.nc", - "5f35e7d7b9abb66aaab9e8598b8ac910b20b9737313ed5fdd74d93d0299a281e", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_213101-214012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_213101-214012.nc", - "ca15107d32596ddb7ba8d59d5dd56580f687453e45fb6928ce853a449ce2610d", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_216101-217012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_216101-217012.nc", - "a1db790c42145daf48e5850bfe99649a98ce62f8ceb17b2e9b4fb068aabe8db2", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_219101-220012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_219101-220012.nc", - "08581eba518098a4749daed4228570810ce2eae136fec9641793a170dd1a2189", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_217101-218012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_217101-218012.nc", - "b61ffddbcc636e030b6a756412187da9c6e1e10c375c028b622c5484744f82ec", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_212101-213012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_212101-213012.nc", - "710e45827ed86cd36a293a685b7dc4176dea7b4a82ff4b18bb2d6b19da7b6974", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_210101-211012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_210101-211012.nc", - "278c60640402db1d65a481cc7029818356eefa54cd11d55db93fca6d5aac06b8", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_215101-216012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_215101-216012.nc", - "99869afb0fcc717d594b49fec9ce6747aad833f2f5b9af49230294346e103931", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_218101-219012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_218101-219012.nc", - "560dd87a42e4c86a4f28ea7734ef494da0408015c7c5b7958a1c109866c450e7", - ), - ( - "tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_214101-215012.nc", - "http://esgf-data04.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/PMIP/NCC/NorESM2-LM/lig127k/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_lig127k_r1i1p1f1_gn_214101-215012.nc", - "be5dbc7cea06ece2990917063c7f7483be455a5f866e1533c5d5e9035ca0b328", - ), - ], - "midHolocene": [ - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_210101-211012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_210101-211012.nc", - "ea41920beb357339a3b544740e44ed3a3b6d328308e8b21bd6d42b9199750f38", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_211101-212012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_211101-212012.nc", - "e522766186efd3c603eaeda814811e2996cbc71ae825d1d1a47f11f315d5962d", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_212101-213012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_212101-213012.nc", - "73887f1c72f74ac3744d5b77532e042fa77a2f0f1f1520c69ad205c864e18692", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_213101-214012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_213101-214012.nc", - "413eb12fa2c7a6c0dba7c0debb64bef62cf5d1e3865448815b2e2761b7d4b38b", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_214101-215012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_214101-215012.nc", - "d6d7cab7acd1cc2ed7a5621142b649242b05f0929d8ec32b70371970a95b4af0", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_215101-216012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_215101-216012.nc", - "6f9d26c2002f37030f52f83114329d47a40f3858253848ac1204099796c87adb", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_216101-217012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_216101-217012.nc", - "b9bedb69cf7f744d149c73f37b7ed8d060c4e322dbf7cb2e0514e0f71088f6a1", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_217101-218012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_217101-218012.nc", - "e7be813954761ab14503eeca93ba8833752aac6262b1b68a0857b24e9f59f778", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_218101-219012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_218101-219012.nc", - "bbe0272a18d11c249079ba5d55b8e94964bbdcced145ae8aa195d0e683c25854", - ), - ( - "tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_219101-220012.nc", - "https://esgf.ceda.ac.uk/thredds/fileServer/esg_cmip6/CMIP6/PMIP/NCC/NorESM2-LM/midHolocene/r1i1p1f1/Amon/tas/gn/v20191108/tas_Amon_NorESM2-LM_midHolocene_r1i1p1f1_gn_219101-220012.nc", - "8b597479de552826a486adae4d6b44e64ae3e60a268650b0fd1898d93e2c8a2f", - ), - ], - }, -} From 0c5e5d53e7614e0aa0db5d55986f23e1cab3d612 Mon Sep 17 00:00:00 2001 From: Willa Tobin Date: Fri, 15 May 2026 11:10:38 -0700 Subject: [PATCH 5/5] minor bug --- paleo_scripts/process_paleo_models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/paleo_scripts/process_paleo_models.py b/paleo_scripts/process_paleo_models.py index e807185..3c67cd5 100644 --- a/paleo_scripts/process_paleo_models.py +++ b/paleo_scripts/process_paleo_models.py @@ -83,12 +83,15 @@ def _process_one( ds = xr.open_mfdataset( files, - combine="by_coords", + combine="nested", + concat_dim="time", use_cftime=True, data_vars="minimal", coords="minimal", compat="override", ) + ds = ds.sortby("time") + ds = ds.sel(time=~ds.indexes["time"].duplicated()) ds = standardize_dims(ds) climo = ds[[variable]].groupby("time.month").mean("time")