diff --git a/.gitignore b/.gitignore index f33a818cf..323e964af 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,53 @@ ENV/ .ropeproject test/ +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/pr.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/pr.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/prw.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/prw.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/psl.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/psl.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlds.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlds.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rltcre.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rltcre.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlus.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlus.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlut.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlut.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlutcs.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rlutcs.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsds.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsds.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsdscs.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsdscs.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsdt.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsdt.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rstcre.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rstcre.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsut.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsut.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsutcs.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/rsutcs.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/sfcWind.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/sfcWind.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ta-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ta-200.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ta-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ta-850.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/tas.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/tas.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/tauu.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/tauu.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ts.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ts.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ua-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ua-200.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ua-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/ua-850.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/va-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/va-200.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/va-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/va-850.cmip6.historical.regrid2.2p5x2p5.v20230823.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/zg-500.cmip6.historical.regrid2.2p5x2p5.v20220928.json +pcmdi_metrics/viewer/pov_cmip6_mean_clim_json_files/zg-500.cmip6.historical.regrid2.2p5x2p5.v20230823.json diff --git a/pcmdi_metrics/graphics/portrait_plot/portrait_plot_mean_clim_multiple_CMIPs.ipynb b/pcmdi_metrics/graphics/portrait_plot/portrait_plot_mean_clim_multiple_CMIPs.ipynb index 75ea6470f..985cec0ff 100644 --- a/pcmdi_metrics/graphics/portrait_plot/portrait_plot_mean_clim_multiple_CMIPs.ipynb +++ b/pcmdi_metrics/graphics/portrait_plot/portrait_plot_mean_clim_multiple_CMIPs.ipynb @@ -66,7 +66,7 @@ "metadata": {}, "outputs": [], "source": [ - "json_dir = './json_files'" + "json_dir = '/Users/chang61/Documents/PCMDI/pmp_local/pcmdi_metrics/viewer/cmip6_mean_clim_json_files'" ] }, { @@ -82,9 +82,8 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 45, "metadata": {}, - "outputs": [], "source": [ "for var in vars:\n", " path = \"metrics_results/mean_climate/\"+mip+\"/\"+exp+\"/\"+data_version+\"/\"+var+\".\"+mip+\".\"+exp+\".regrid2.2p5x2p5.\"+data_version+\".json\"\n", @@ -93,13 +92,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "mip = \"cmip6\"\n", "exp = \"historical\"\n", - "data_version = \"v20220928\"" + "data_version = \"v20241029\"" ] }, { @@ -122,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -132,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -140,57 +139,7 @@ "output_type": "stream", "text": [ "CMIP5 JSON files:\n", - "1 pr.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "2 prw.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "3 psl.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "4 rlds.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "5 rltcre.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "6 rlus.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "7 rlut.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "8 rlutcs.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "9 rsds.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "10 rsdscs.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "11 rsdt.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "12 rstcre.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "13 rsut.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "14 rsutcs.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "15 sfcWind.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "16 ta-200.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "17 ta-850.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "18 tas.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "19 tauu.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "20 ts.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "21 ua-200.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "22 ua-850.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "23 va-200.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "24 va-850.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "25 zg-500.cmip5.historical.regrid2.2p5x2p5.v20220928.json\n", - "CMIP6 JSON files:\n", - "1 pr.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "2 prw.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "3 psl.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "4 rlds.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "5 rltcre.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "6 rlus.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "7 rlut.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "8 rlutcs.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "9 rsds.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "10 rsdscs.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "11 rsdt.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "12 rstcre.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "13 rsut.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "14 rsutcs.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "15 sfcWind.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "16 ta-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "17 ta-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "18 tas.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "19 tauu.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "20 ts.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "21 ua-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "22 ua-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "23 va-200.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "24 va-850.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n", - "25 zg-500.cmip6.historical.regrid2.2p5x2p5.v20220928.json\n" + "CMIP6 JSON files:\n" ] } ], @@ -226,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -266,20 +215,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Warning: The provided level value 20000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 85000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 20000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 85000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 20000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 85000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n", - "Warning: The provided level value 50000 appears to be in Pa. It will be automatically converted to hPa by dividing by 100.\n" ] } ], @@ -287,6 +226,1835 @@ "library_cmip6 = Metrics(json_list_2, mip=\"cmip6\")" ] }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "region_df = library_cmip6.df_dict['bias_xy']['djf']" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mipmodelrunmodel_runprprwpslrldsrltcrerlus...ta-200ta-850tastauutsua-200ua-850va-200va-850zg-500
0cmip6ACCESS-CM2r1i1p1ACCESS-CM2_r1i1p10.37743.75061.997-4.017-3.361-0.002...-1.129-0.558-0.314-0.007-0.0250.948-0.3350.100-0.087-5.824
1cmip6ACCESS-ESM1-5r1i1p1ACCESS-ESM1-5_r1i1p10.45344.11444.658-0.920-0.5123.126...0.1660.5440.421-0.0080.5130.890-0.3780.067-0.12418.872
2cmip6AWI-CM-1-1-MRr1i1p1AWI-CM-1-1-MR_r1i1p10.16343.461-3.772-3.218-3.620-1.533...-1.387-0.514-0.0640.001-0.1750.7270.1260.022-0.0100.667
3cmip6AWI-ESM-1-1-LRr1i1p1AWI-ESM-1-1-LR_r1i1p10.08041.729-53.075-6.398-2.660-5.758...-3.276-1.648-0.944-0.003-0.970-0.295-0.0670.058-0.061NaN
4cmip6BCC-CSM2-MRr1i1p1BCC-CSM2-MR_r1i1p10.23344.518-85.743-3.898-0.7121.062...NaNNaN0.699-0.0030.042NaNNaNNaNNaNNaN
..................................................................
57cmip6NorESM2-MMr1i1p1NorESM2-MM_r1i1p10.10543.609-11.964-2.324-2.6860.597...NaNNaN-0.416-0.0050.0280.666-0.082NaN-0.0411.626
58cmip6SAM0-UNICONr1i1p1SAM0-UNICON_r1i1p10.28842.830-22.952-7.042-4.130-4.812...-2.934-1.019-1.075-0.006-1.0830.056-0.1610.107-0.0262.652
59cmip6TaiESM1r1i1p1TaiESM1_r1i1p10.34144.457-15.012-2.215-4.858-1.616...NaNNaN-0.575-0.006-0.499NaN-0.104NaN0.032NaN
60cmip6UKESM1-0-LLr1i1p1UKESM1-0-LL_r1i1p10.31742.97658.681-7.118-3.793-4.377...NaN-92.843-1.109-0.007-0.7960.458-0.3950.085-0.076NaN
61cmip6UKESM1-1-LLr1i1p1UKESM1-1-LL_r1i1p10.37243.98257.989-2.839-3.878-0.233...-0.631-0.319-0.250-0.0070.0660.565-0.3960.051-0.065NaN
\n", + "

62 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " mip model run model_run pr prw \\\n", + "0 cmip6 ACCESS-CM2 r1i1p1 ACCESS-CM2_r1i1p1 0.377 43.750 \n", + "1 cmip6 ACCESS-ESM1-5 r1i1p1 ACCESS-ESM1-5_r1i1p1 0.453 44.114 \n", + "2 cmip6 AWI-CM-1-1-MR r1i1p1 AWI-CM-1-1-MR_r1i1p1 0.163 43.461 \n", + "3 cmip6 AWI-ESM-1-1-LR r1i1p1 AWI-ESM-1-1-LR_r1i1p1 0.080 41.729 \n", + "4 cmip6 BCC-CSM2-MR r1i1p1 BCC-CSM2-MR_r1i1p1 0.233 44.518 \n", + ".. ... ... ... ... ... ... \n", + "57 cmip6 NorESM2-MM r1i1p1 NorESM2-MM_r1i1p1 0.105 43.609 \n", + "58 cmip6 SAM0-UNICON r1i1p1 SAM0-UNICON_r1i1p1 0.288 42.830 \n", + "59 cmip6 TaiESM1 r1i1p1 TaiESM1_r1i1p1 0.341 44.457 \n", + "60 cmip6 UKESM1-0-LL r1i1p1 UKESM1-0-LL_r1i1p1 0.317 42.976 \n", + "61 cmip6 UKESM1-1-LL r1i1p1 UKESM1-1-LL_r1i1p1 0.372 43.982 \n", + "\n", + " psl rlds rltcre rlus ... ta-200 ta-850 tas tauu ts \\\n", + "0 61.997 -4.017 -3.361 -0.002 ... -1.129 -0.558 -0.314 -0.007 -0.025 \n", + "1 44.658 -0.920 -0.512 3.126 ... 0.166 0.544 0.421 -0.008 0.513 \n", + "2 -3.772 -3.218 -3.620 -1.533 ... -1.387 -0.514 -0.064 0.001 -0.175 \n", + "3 -53.075 -6.398 -2.660 -5.758 ... -3.276 -1.648 -0.944 -0.003 -0.970 \n", + "4 -85.743 -3.898 -0.712 1.062 ... NaN NaN 0.699 -0.003 0.042 \n", + ".. ... ... ... ... ... ... ... ... ... ... \n", + "57 -11.964 -2.324 -2.686 0.597 ... NaN NaN -0.416 -0.005 0.028 \n", + "58 -22.952 -7.042 -4.130 -4.812 ... -2.934 -1.019 -1.075 -0.006 -1.083 \n", + "59 -15.012 -2.215 -4.858 -1.616 ... NaN NaN -0.575 -0.006 -0.499 \n", + "60 58.681 -7.118 -3.793 -4.377 ... NaN -92.843 -1.109 -0.007 -0.796 \n", + "61 57.989 -2.839 -3.878 -0.233 ... -0.631 -0.319 -0.250 -0.007 0.066 \n", + "\n", + " ua-200 ua-850 va-200 va-850 zg-500 \n", + "0 0.948 -0.335 0.100 -0.087 -5.824 \n", + "1 0.890 -0.378 0.067 -0.124 18.872 \n", + "2 0.727 0.126 0.022 -0.010 0.667 \n", + "3 -0.295 -0.067 0.058 -0.061 NaN \n", + "4 NaN NaN NaN NaN NaN \n", + ".. ... ... ... ... ... \n", + "57 0.666 -0.082 NaN -0.041 1.626 \n", + "58 0.056 -0.161 0.107 -0.026 2.652 \n", + "59 NaN -0.104 NaN 0.032 NaN \n", + "60 0.458 -0.395 0.085 -0.076 NaN \n", + "61 0.565 -0.396 0.051 -0.065 NaN \n", + "\n", + "[62 rows x 29 columns]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "region_df['global']" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modelVariableRegionDJFANN
0ACCESS-CM2prSHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
1ACCESS-ESM1-5prSHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
2AWI-CM-1-1-MRprSHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
3AWI-ESM-1-1-LRprSHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
4BCC-CSM2-MRprSHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
..................
1545NorESM2-MMzg-500SHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
1546SAM0-UNICONzg-500SHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
1547TaiESM1zg-500SHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
1548UKESM1-0-LLzg-500SHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
1549UKESM1-1-LLzg-500SHEXhttps://pcmdi.llnl.gov/pmp-preliminary-results...https://pcmdi.llnl.gov/pmp-preliminary-results...
\n", + "

1550 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " model Variable Region \\\n", + "0 ACCESS-CM2 pr SHEX \n", + "1 ACCESS-ESM1-5 pr SHEX \n", + "2 AWI-CM-1-1-MR pr SHEX \n", + "3 AWI-ESM-1-1-LR pr SHEX \n", + "4 BCC-CSM2-MR pr SHEX \n", + "... ... ... ... \n", + "1545 NorESM2-MM zg-500 SHEX \n", + "1546 SAM0-UNICON zg-500 SHEX \n", + "1547 TaiESM1 zg-500 SHEX \n", + "1548 UKESM1-0-LL zg-500 SHEX \n", + "1549 UKESM1-1-LL zg-500 SHEX \n", + "\n", + " DJF \\\n", + "0 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "2 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "3 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "4 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "... ... \n", + "1545 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1546 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1547 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1548 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1549 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "\n", + " ANN \n", + "0 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "2 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "3 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "4 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "... ... \n", + "1545 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1546 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1547 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1548 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "1549 https://pcmdi.llnl.gov/pmp-preliminary-results... \n", + "\n", + "[1550 rows x 5 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "djf_df = library_cmip6.df_dict['bias_xy']['djf']['SHEX']\n", + "djf_df = djf_df.drop(columns=['mip', 'model_run'])\n", + "id_vars = ['model', 'run']\n", + "value_vars = [col for col in djf_df.columns if col not in id_vars]\n", + "djf_df = pd.melt(djf_df, id_vars = id_vars, value_vars = value_vars, var_name = \"Variable\", value_name='value').drop(columns=['value'])\n", + "djf_df['Region'] = 'SHEX'\n", + "\n", + "file_name = f\"{djf_df['Variable']}_{djf_df['model']}_{djf_df['run']}_interpolated_regrid_SHEX_DJF_v20241029.png\"\n", + "img_url = f\"https://pcmdi.llnl.gov/pmp-preliminary-results/graphics/mean_climate/cmip6/amip/clim/v20241029/{djf_df['Variable']}/{file_name}\"\n", + "ac_file_name = f\"{djf_df['Variable']}_{djf_df['model']}_{djf_df['run']}_interpolated_regrid_AC_DJF_v20241029.png\"\n", + "ac_img_url = img_url = f\"https://pcmdi.llnl.gov/pmp-preliminary-results/graphics/mean_climate/cmip6/amip/clim/v20241029/{djf_df['Variable']}/{ac_file_name}\"\n", + "\n", + "djf_df['DJF'] = img_url\n", + "djf_df['ANN'] = ac_img_url\n", + "djf_df = djf_df.drop(columns=['run'])\n", + "djf_df" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Header': {'data_specs_version': '01.00.33',\n", + " 'cmor_version': '3.5',\n", + " 'table_id': 'Table Amon',\n", + " 'realm': 'atmos atmosChem',\n", + " 'table_date': '18 November 2020',\n", + " 'missing_value': '1e20',\n", + " 'int_missing_value': '-999',\n", + " 'product': 'model-output',\n", + " 'approx_interval': '30.00000',\n", + " 'generic_levels': 'alevel alevhalf',\n", + " 'mip_era': 'CMIP6',\n", + " 'Conventions': 'CF-1.7 CMIP-6.2'},\n", + " 'variable_entry': {'ccb': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_pressure_at_convective_cloud_base',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Air Pressure at Convective Cloud Base',\n", + " 'comment': 'Where convective cloud is present in the grid cell, the instantaneous cloud base altitude should be that of the bottom of the lowest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'ccb',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cct': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_pressure_at_convective_cloud_top',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Air Pressure at Convective Cloud Top',\n", + " 'comment': 'Where convective cloud is present in the grid cell, the instantaneous cloud top altitude should be that of the top of the highest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'cct',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cfc113global': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_cfc113_in_air',\n", + " 'units': '1e-12',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of CFC113',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC113 is CCl2FCClF2. The IUPAC name for CFC113 is 1,1,2-trichloro-1,2,2-trifluoro-ethane.',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'cfc113global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cfc11global': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_cfc11_in_air',\n", + " 'units': '1e-12',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of CFC11',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC11 is CFCl3. The IUPAC name for CFC11 is trichloro-fluoro-methane.',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'cfc11global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cfc12global': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_cfc12_in_air',\n", + " 'units': '1e-12',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of CFC12',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC12 is CF2Cl2. The IUPAC name for CFC12 is dichloro-difluoro-methane.',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'cfc12global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ch4': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_methane_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of CH4',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'ch4',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ch4Clim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_methane_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of CH4',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time2',\n", + " 'out_name': 'ch4',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ch4global': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_methane_in_air',\n", + " 'units': '1e-09',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of CH4',\n", + " 'comment': 'Global Mean Mole Fraction of CH4',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'ch4global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ch4globalClim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_methane_in_air',\n", + " 'units': '1e-09',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of CH4',\n", + " 'comment': 'Global Mean Mole Fraction of CH4',\n", + " 'dimensions': 'time2',\n", + " 'out_name': 'ch4global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ci': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'convection_time_fraction',\n", + " 'units': '1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Fraction of Time Convection Occurs in Cell',\n", + " 'comment': 'Fraction of time that convection occurs in the grid cell.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'ci',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cl': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'cloud_area_fraction_in_atmosphere_layer',\n", + " 'units': '%',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Percentage Cloud Cover',\n", + " 'comment': 'Percentage cloud cover, including both large-scale and convective cloud.',\n", + " 'dimensions': 'longitude latitude alevel time',\n", + " 'out_name': 'cl',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'cli': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'mass_fraction_of_cloud_ice_in_air',\n", + " 'units': 'kg kg-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mass Fraction of Cloud Ice',\n", + " 'comment': 'Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.',\n", + " 'dimensions': 'longitude latitude alevel time',\n", + " 'out_name': 'cli',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'clivi': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_mass_content_of_cloud_ice',\n", + " 'units': 'kg m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Ice Water Path',\n", + " 'comment': 'mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'clivi',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'clt': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'cloud_area_fraction',\n", + " 'units': '%',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Total Cloud Cover Percentage',\n", + " 'comment': 'Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'clt',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'clw': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'mass_fraction_of_cloud_liquid_water_in_air',\n", + " 'units': 'kg kg-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mass Fraction of Cloud Liquid Water',\n", + " 'comment': 'Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.',\n", + " 'dimensions': 'longitude latitude alevel time',\n", + " 'out_name': 'clw',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'clwvi': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_mass_content_of_cloud_condensed_water',\n", + " 'units': 'kg m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Condensed Water Path',\n", + " 'comment': 'Mass of condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'clwvi',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'co2': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'mole_fraction_of_carbon_dioxide_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of CO2',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'co2',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'co2Clim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'mole_fraction_of_carbon_dioxide_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of CO2',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time2',\n", + " 'out_name': 'co2',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'co2mass': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_mass_of_carbon_dioxide',\n", + " 'units': 'kg',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Total Atmospheric Mass of CO2',\n", + " 'comment': 'Total atmospheric mass of Carbon Dioxide',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'co2mass',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'co2massClim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_mass_of_carbon_dioxide',\n", + " 'units': 'kg',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Total Atmospheric Mass of CO2',\n", + " 'comment': 'Total atmospheric mass of Carbon Dioxide',\n", + " 'dimensions': 'time2',\n", + " 'out_name': 'co2mass',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'evspsbl': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'water_evapotranspiration_flux',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Evaporation Including Sublimation and Transpiration',\n", + " 'comment': 'Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'evspsbl',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'fco2antt': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_anthropogenic_emission',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Carbon Mass Flux into Atmosphere Due to All Anthropogenic Emissions of CO2 [kgC m-2 s-1]',\n", + " 'comment': 'This is requested only for the emission-driven coupled carbon climate model runs. Does not include natural fire sources but, includes all anthropogenic sources, including fossil fuel use, cement production, agricultural burning, and sources associated with anthropogenic land use change excluding forest regrowth.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'fco2antt',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'fco2fos': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_fossil_fuel_combustion',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Carbon Mass Flux into Atmosphere Due to Fossil Fuel Emissions of CO2 [kgC m-2 s-1]',\n", + " 'comment': 'This is the prescribed anthropogenic CO2 flux from fossil fuel use, including cement production, and flaring (but not from land-use changes, agricultural burning, forest regrowth, etc.)',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'fco2fos',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'fco2nat': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_natural_sources',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Carbon Mass Flux into the Atmosphere Due to Natural Sources [kgC m-2 s-1]',\n", + " 'comment': 'This is what the atmosphere sees (on its own grid). This field should be equivalent to the combined natural fluxes of carbon that account for natural exchanges between the atmosphere and land (nep) or ocean (fgco2) reservoirs.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'fco2nat',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hcfc22global': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_hcfc22_in_air',\n", + " 'units': '1e-12',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of HCFC22',\n", + " 'comment': \"Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for HCFC22 is CHClF2. The IUPAC name for HCFC22 is chloro-difluoro-methane.\",\n", + " 'dimensions': 'time',\n", + " 'out_name': 'hcfc22global',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hfls': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upward_latent_heat_flux',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Upward Latent Heat Flux',\n", + " 'comment': \"The surface called 'surface' means the lower boundary of the atmosphere. 'Upward' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.\",\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'hfls',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hfss': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upward_sensible_heat_flux',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Upward Sensible Heat Flux',\n", + " 'comment': 'The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'hfss',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hur': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'relative_humidity',\n", + " 'units': '%',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Relative Humidity',\n", + " 'comment': 'The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'hur',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hurs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'relative_humidity',\n", + " 'units': '%',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Near-Surface Relative Humidity',\n", + " 'comment': 'The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.',\n", + " 'dimensions': 'longitude latitude time height2m',\n", + " 'out_name': 'hurs',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'hus': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'specific_humidity',\n", + " 'units': '1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Specific Humidity',\n", + " 'comment': 'Specific humidity is the mass fraction of water vapor in (moist) air.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'hus',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'huss': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'specific_humidity',\n", + " 'units': '1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Near-Surface Specific Humidity',\n", + " 'comment': 'Near-surface (usually, 2 meter) specific humidity.',\n", + " 'dimensions': 'longitude latitude time height2m',\n", + " 'out_name': 'huss',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'mc': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_net_upward_convective_mass_flux',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Convective Mass Flux',\n", + " 'comment': 'The net mass flux should represent the difference between the updraft and downdraft components. The flux is computed as the mass divided by the area of the grid cell.',\n", + " 'dimensions': 'longitude latitude alevhalf time',\n", + " 'out_name': 'mc',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'n2o': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_nitrous_oxide_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of N2O',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'n2o',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'n2oClim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_nitrous_oxide_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of N2O',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.',\n", + " 'dimensions': 'longitude latitude plev19 time2',\n", + " 'out_name': 'n2o',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'n2oglobal': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_nitrous_oxide_in_air',\n", + " 'units': '1e-09',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of N2O',\n", + " 'comment': 'Global mean Nitrous Oxide (N2O)',\n", + " 'dimensions': 'time',\n", + " 'out_name': 'n2oglobal',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'n2oglobalClim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_nitrous_oxide_in_air',\n", + " 'units': '1e-09',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': '',\n", + " 'long_name': 'Global Mean Mole Fraction of N2O',\n", + " 'comment': 'Global mean Nitrous Oxide (N2O)',\n", + " 'dimensions': 'time2',\n", + " 'out_name': 'n2oglobal',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'o3': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_ozone_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of O3',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'o3',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'o3Clim': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos atmosChem',\n", + " 'standard_name': 'mole_fraction_of_ozone_in_air',\n", + " 'units': 'mol mol-1',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Mole Fraction of O3',\n", + " 'comment': 'Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.',\n", + " 'dimensions': 'longitude latitude plev19 time2',\n", + " 'out_name': 'o3',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'pfull': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_pressure',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Pressure at Model Full-Levels',\n", + " 'comment': 'Air pressure on model levels',\n", + " 'dimensions': 'longitude latitude alevel time2',\n", + " 'out_name': 'pfull',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'phalf': {'frequency': 'monC',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_pressure',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: mean time: mean within years time: mean over years',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Pressure on Model Half-Levels',\n", + " 'comment': 'Air pressure on model half-levels',\n", + " 'dimensions': 'longitude latitude alevhalf time2',\n", + " 'out_name': 'phalf',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'pr': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'precipitation_flux',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Precipitation',\n", + " 'comment': 'includes both liquid and solid phases',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'pr',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'prc': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'convective_precipitation_flux',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Convective Precipitation',\n", + " 'comment': 'Convective precipitation at surface; includes both liquid and solid phases.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'prc',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'prsn': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'snowfall_flux',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Snowfall Flux',\n", + " 'comment': 'At surface; includes precipitation of all forms of water in the solid phase',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'prsn',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'prw': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'atmosphere_mass_content_of_water_vapor',\n", + " 'units': 'kg m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Water Vapor Path',\n", + " 'comment': 'vertically integrated through the atmospheric column',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'prw',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ps': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_air_pressure',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Air Pressure',\n", + " 'comment': 'surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'ps',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'psl': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_pressure_at_mean_sea_level',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Sea Level Pressure',\n", + " 'comment': 'Sea Level Pressure',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'psl',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rlds': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downwelling_longwave_flux_in_air',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downwelling Longwave Radiation',\n", + " 'comment': \"The surface called 'surface' means the lower boundary of the atmosphere. 'longwave' means longwave radiation. Downwelling radiation is radiation from above. It does not mean 'net downward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.\",\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rlds',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rldscs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downwelling_longwave_flux_in_air_assuming_clear_sky',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downwelling Clear-Sky Longwave Radiation',\n", + " 'comment': 'Surface downwelling clear-sky longwave radiation',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rldscs',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rlus': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upwelling_longwave_flux_in_air',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Upwelling Longwave Radiation',\n", + " 'comment': \"The surface called 'surface' means the lower boundary of the atmosphere. 'longwave' means longwave radiation. Upwelling radiation is radiation from below. It does not mean 'net upward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.\",\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rlus',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rlut': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'toa_outgoing_longwave_flux',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'TOA Outgoing Longwave Radiation',\n", + " 'comment': 'at the top of the atmosphere (to be compared with satellite measurements)',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rlut',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rlutcs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'toa_outgoing_longwave_flux_assuming_clear_sky',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'TOA Outgoing Clear-Sky Longwave Radiation',\n", + " 'comment': 'Upwelling clear-sky longwave radiation at top of atmosphere',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rlutcs',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsds': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downwelling_shortwave_flux_in_air',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downwelling Shortwave Radiation',\n", + " 'comment': 'Surface solar irradiance for UV calculations.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsds',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsdscs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downwelling_shortwave_flux_in_air_assuming_clear_sky',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downwelling Clear-Sky Shortwave Radiation',\n", + " 'comment': 'Surface solar irradiance clear sky for UV calculations',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsdscs',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsdt': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'toa_incoming_shortwave_flux',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'TOA Incident Shortwave Radiation',\n", + " 'comment': 'Shortwave radiation incident at the top of the atmosphere',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsdt',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsus': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upwelling_shortwave_flux_in_air',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Upwelling Shortwave Radiation',\n", + " 'comment': \"The surface called 'surface' means the lower boundary of the atmosphere. 'shortwave' means shortwave radiation. Upwelling radiation is radiation from below. It does not mean 'net upward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.\",\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsus',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsuscs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_upwelling_shortwave_flux_in_air_assuming_clear_sky',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Upwelling Clear-Sky Shortwave Radiation',\n", + " 'comment': 'Surface Upwelling Clear-sky Shortwave Radiation',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsuscs',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsut': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'toa_outgoing_shortwave_flux',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'TOA Outgoing Shortwave Radiation',\n", + " 'comment': 'at the top of the atmosphere',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsut',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rsutcs': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'toa_outgoing_shortwave_flux_assuming_clear_sky',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'TOA Outgoing Clear-Sky Shortwave Radiation',\n", + " 'comment': 'Calculated in the absence of clouds.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rsutcs',\n", + " 'type': 'real',\n", + " 'positive': 'up',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'rtmt': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'net_downward_radiative_flux_at_top_of_atmosphere_model',\n", + " 'units': 'W m-2',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Net Downward Radiative Flux at Top of Model',\n", + " 'comment': 'Net Downward Radiative Flux at Top of Model : I.e., at the top of that portion of the atmosphere where dynamics are explicitly treated by the model. This is reported only if it differs from the net downward radiative flux at the top of the atmosphere.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'rtmt',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'sbl': {'frequency': 'mon',\n", + " 'modeling_realm': 'landIce',\n", + " 'standard_name': 'tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice',\n", + " 'units': 'kg m-2 s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Snow and Ice Sublimation Flux',\n", + " 'comment': 'The snow and ice sublimation flux is the loss of snow and ice mass per unit area from the surface resulting from their direct conversion to water vapor that enters the atmosphere.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'sbl',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'sci': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'shallow_convection_time_fraction',\n", + " 'units': '1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Fraction of Time Shallow Convection Occurs',\n", + " 'comment': 'Fraction of time that shallow convection occurs in the grid cell.',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'sci',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'sfcWind': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'wind_speed',\n", + " 'units': 'm s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Near-Surface Wind Speed',\n", + " 'comment': 'near-surface (usually, 10 meters) wind speed.',\n", + " 'dimensions': 'longitude latitude time height10m',\n", + " 'out_name': 'sfcWind',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ta': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_temperature',\n", + " 'units': 'K',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Air Temperature',\n", + " 'comment': 'Air Temperature',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'ta',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'tas': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_temperature',\n", + " 'units': 'K',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Near-Surface Air Temperature',\n", + " 'comment': 'near-surface (usually, 2 meter) air temperature',\n", + " 'dimensions': 'longitude latitude time height2m',\n", + " 'out_name': 'tas',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'tasmax': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_temperature',\n", + " 'units': 'K',\n", + " 'cell_methods': 'area: mean time: maximum within days time: mean over days',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Daily Maximum Near-Surface Air Temperature',\n", + " 'comment': \"maximum near-surface (usually, 2 meter) air temperature (add cell_method attribute 'time: max')\",\n", + " 'dimensions': 'longitude latitude time height2m',\n", + " 'out_name': 'tasmax',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'tasmin': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'air_temperature',\n", + " 'units': 'K',\n", + " 'cell_methods': 'area: mean time: minimum within days time: mean over days',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Daily Minimum Near-Surface Air Temperature',\n", + " 'comment': \"minimum near-surface (usually, 2 meter) air temperature (add cell_method attribute 'time: min')\",\n", + " 'dimensions': 'longitude latitude time height2m',\n", + " 'out_name': 'tasmin',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'tauu': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downward_eastward_stress',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downward Eastward Wind Stress',\n", + " 'comment': 'Downward eastward wind stress at the surface',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'tauu',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'tauv': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_downward_northward_stress',\n", + " 'units': 'Pa',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Downward Northward Wind Stress',\n", + " 'comment': 'Downward northward wind stress at the surface',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'tauv',\n", + " 'type': 'real',\n", + " 'positive': 'down',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ts': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'surface_temperature',\n", + " 'units': 'K',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Surface Temperature',\n", + " 'comment': 'Temperature of the lower boundary of the atmosphere',\n", + " 'dimensions': 'longitude latitude time',\n", + " 'out_name': 'ts',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'ua': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'eastward_wind',\n", + " 'units': 'm s-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Eastward Wind',\n", + " 'comment': 'Zonal wind (positive in a eastward direction).',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'ua',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'uas': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'eastward_wind',\n", + " 'units': 'm s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Eastward Near-Surface Wind',\n", + " 'comment': 'Eastward component of the near-surface (usually, 10 meters) wind',\n", + " 'dimensions': 'longitude latitude time height10m',\n", + " 'out_name': 'uas',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'va': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'northward_wind',\n", + " 'units': 'm s-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Northward Wind',\n", + " 'comment': 'Meridional wind (positive in a northward direction).',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'va',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'vas': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'northward_wind',\n", + " 'units': 'm s-1',\n", + " 'cell_methods': 'area: time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Northward Near-Surface Wind',\n", + " 'comment': 'Northward component of the near surface wind',\n", + " 'dimensions': 'longitude latitude time height10m',\n", + " 'out_name': 'vas',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'wap': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'lagrangian_tendency_of_air_pressure',\n", + " 'units': 'Pa s-1',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Omega (=dp/dt)',\n", + " 'comment': 'Omega (vertical velocity in pressure coordinates, positive downwards)',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'wap',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''},\n", + " 'zg': {'frequency': 'mon',\n", + " 'modeling_realm': 'atmos',\n", + " 'standard_name': 'geopotential_height',\n", + " 'units': 'm',\n", + " 'cell_methods': 'time: mean',\n", + " 'cell_measures': 'area: areacella',\n", + " 'long_name': 'Geopotential Height',\n", + " 'comment': 'Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.',\n", + " 'dimensions': 'longitude latitude plev19 time',\n", + " 'out_name': 'zg',\n", + " 'type': 'real',\n", + " 'positive': '',\n", + " 'valid_min': '',\n", + " 'valid_max': '',\n", + " 'ok_min_mean_abs': '',\n", + " 'ok_max_mean_abs': ''}}}" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "with open('/Users/chang61/Documents/PCMDI/pmp_local/pcmdi_metrics/viewer/CMIP6_Amon.json', 'r') as file:\n", + " data = json.load(file)\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Precipitation'" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['variable_entry'][djf_df['Variable'][0]]['long_name']" + ] + }, { "cell_type": "code", "execution_count": 13, @@ -719,7 +2487,6 @@ ], "metadata": { "kernelspec": { - "display_name": "pmp_devel_20240425", "language": "python", "name": "python3" }, diff --git a/pcmdi_metrics/viewer/CMIP6_Amon.json b/pcmdi_metrics/viewer/CMIP6_Amon.json new file mode 100644 index 000000000..8a6425dcc --- /dev/null +++ b/pcmdi_metrics/viewer/CMIP6_Amon.json @@ -0,0 +1,1368 @@ +{ + "Header": { + "data_specs_version": "01.00.33", + "cmor_version": "3.5", + "table_id": "Table Amon", + "realm": "atmos atmosChem", + "table_date": "18 November 2020", + "missing_value": "1e20", + "int_missing_value": "-999", + "product": "model-output", + "approx_interval": "30.00000", + "generic_levels": "alevel alevhalf", + "mip_era": "CMIP6", + "Conventions": "CF-1.7 CMIP-6.2" + }, + "variable_entry": { + "ccb": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_pressure_at_convective_cloud_base", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Air Pressure at Convective Cloud Base", + "comment": "Where convective cloud is present in the grid cell, the instantaneous cloud base altitude should be that of the bottom of the lowest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.", + "dimensions": "longitude latitude time", + "out_name": "ccb", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cct": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_pressure_at_convective_cloud_top", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Air Pressure at Convective Cloud Top", + "comment": "Where convective cloud is present in the grid cell, the instantaneous cloud top altitude should be that of the top of the highest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.", + "dimensions": "longitude latitude time", + "out_name": "cct", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cfc113global": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_cfc113_in_air", + "units": "1e-12", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of CFC113", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC113 is CCl2FCClF2. The IUPAC name for CFC113 is 1,1,2-trichloro-1,2,2-trifluoro-ethane.", + "dimensions": "time", + "out_name": "cfc113global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cfc11global": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_cfc11_in_air", + "units": "1e-12", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of CFC11", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC11 is CFCl3. The IUPAC name for CFC11 is trichloro-fluoro-methane.", + "dimensions": "time", + "out_name": "cfc11global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cfc12global": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_cfc12_in_air", + "units": "1e-12", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of CFC12", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of CFC12 is CF2Cl2. The IUPAC name for CFC12 is dichloro-difluoro-methane.", + "dimensions": "time", + "out_name": "cfc12global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ch4": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_methane_in_air", + "units": "mol mol-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of CH4", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time", + "out_name": "ch4", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ch4Clim": { + "frequency": "monC", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_methane_in_air", + "units": "mol mol-1", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of CH4", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time2", + "out_name": "ch4", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ch4global": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_methane_in_air", + "units": "1e-09", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of CH4", + "comment": "Global Mean Mole Fraction of CH4", + "dimensions": "time", + "out_name": "ch4global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ch4globalClim": { + "frequency": "monC", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_methane_in_air", + "units": "1e-09", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of CH4", + "comment": "Global Mean Mole Fraction of CH4", + "dimensions": "time2", + "out_name": "ch4global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ci": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "convection_time_fraction", + "units": "1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Fraction of Time Convection Occurs in Cell", + "comment": "Fraction of time that convection occurs in the grid cell.", + "dimensions": "longitude latitude time", + "out_name": "ci", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cl": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "cloud_area_fraction_in_atmosphere_layer", + "units": "%", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Percentage Cloud Cover", + "comment": "Percentage cloud cover, including both large-scale and convective cloud.", + "dimensions": "longitude latitude alevel time", + "out_name": "cl", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "cli": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "mass_fraction_of_cloud_ice_in_air", + "units": "kg kg-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Mass Fraction of Cloud Ice", + "comment": "Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.", + "dimensions": "longitude latitude alevel time", + "out_name": "cli", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "clivi": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "atmosphere_mass_content_of_cloud_ice", + "units": "kg m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Ice Water Path", + "comment": "mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.", + "dimensions": "longitude latitude time", + "out_name": "clivi", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "clt": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "cloud_area_fraction", + "units": "%", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Total Cloud Cover Percentage", + "comment": "Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.", + "dimensions": "longitude latitude time", + "out_name": "clt", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "clw": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "mass_fraction_of_cloud_liquid_water_in_air", + "units": "kg kg-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Mass Fraction of Cloud Liquid Water", + "comment": "Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.", + "dimensions": "longitude latitude alevel time", + "out_name": "clw", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "clwvi": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "atmosphere_mass_content_of_cloud_condensed_water", + "units": "kg m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Condensed Water Path", + "comment": "Mass of condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.", + "dimensions": "longitude latitude time", + "out_name": "clwvi", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "co2": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "mole_fraction_of_carbon_dioxide_in_air", + "units": "mol mol-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of CO2", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time", + "out_name": "co2", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "co2Clim": { + "frequency": "monC", + "modeling_realm": "atmos", + "standard_name": "mole_fraction_of_carbon_dioxide_in_air", + "units": "mol mol-1", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of CO2", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time2", + "out_name": "co2", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "co2mass": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "atmosphere_mass_of_carbon_dioxide", + "units": "kg", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Total Atmospheric Mass of CO2", + "comment": "Total atmospheric mass of Carbon Dioxide", + "dimensions": "time", + "out_name": "co2mass", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "co2massClim": { + "frequency": "monC", + "modeling_realm": "atmos", + "standard_name": "atmosphere_mass_of_carbon_dioxide", + "units": "kg", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "", + "long_name": "Total Atmospheric Mass of CO2", + "comment": "Total atmospheric mass of Carbon Dioxide", + "dimensions": "time2", + "out_name": "co2mass", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "evspsbl": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "water_evapotranspiration_flux", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Evaporation Including Sublimation and Transpiration", + "comment": "Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation)", + "dimensions": "longitude latitude time", + "out_name": "evspsbl", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "fco2antt": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_anthropogenic_emission", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Carbon Mass Flux into Atmosphere Due to All Anthropogenic Emissions of CO2 [kgC m-2 s-1]", + "comment": "This is requested only for the emission-driven coupled carbon climate model runs. Does not include natural fire sources but, includes all anthropogenic sources, including fossil fuel use, cement production, agricultural burning, and sources associated with anthropogenic land use change excluding forest regrowth.", + "dimensions": "longitude latitude time", + "out_name": "fco2antt", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "fco2fos": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_fossil_fuel_combustion", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Carbon Mass Flux into Atmosphere Due to Fossil Fuel Emissions of CO2 [kgC m-2 s-1]", + "comment": "This is the prescribed anthropogenic CO2 flux from fossil fuel use, including cement production, and flaring (but not from land-use changes, agricultural burning, forest regrowth, etc.)", + "dimensions": "longitude latitude time", + "out_name": "fco2fos", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "fco2nat": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_natural_sources", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Carbon Mass Flux into the Atmosphere Due to Natural Sources [kgC m-2 s-1]", + "comment": "This is what the atmosphere sees (on its own grid). This field should be equivalent to the combined natural fluxes of carbon that account for natural exchanges between the atmosphere and land (nep) or ocean (fgco2) reservoirs.", + "dimensions": "longitude latitude time", + "out_name": "fco2nat", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hcfc22global": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_hcfc22_in_air", + "units": "1e-12", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of HCFC22", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for HCFC22 is CHClF2. The IUPAC name for HCFC22 is chloro-difluoro-methane.", + "dimensions": "time", + "out_name": "hcfc22global", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hfls": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upward_latent_heat_flux", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Upward Latent Heat Flux", + "comment": "The surface called 'surface' means the lower boundary of the atmosphere. 'Upward' indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.", + "dimensions": "longitude latitude time", + "out_name": "hfls", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hfss": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upward_sensible_heat_flux", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Upward Sensible Heat Flux", + "comment": "The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.", + "dimensions": "longitude latitude time", + "out_name": "hfss", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hur": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "relative_humidity", + "units": "%", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Relative Humidity", + "comment": "The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.", + "dimensions": "longitude latitude plev19 time", + "out_name": "hur", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hurs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "relative_humidity", + "units": "%", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Near-Surface Relative Humidity", + "comment": "The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.", + "dimensions": "longitude latitude time height2m", + "out_name": "hurs", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "hus": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "specific_humidity", + "units": "1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Specific Humidity", + "comment": "Specific humidity is the mass fraction of water vapor in (moist) air.", + "dimensions": "longitude latitude plev19 time", + "out_name": "hus", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "huss": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "specific_humidity", + "units": "1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Near-Surface Specific Humidity", + "comment": "Near-surface (usually, 2 meter) specific humidity.", + "dimensions": "longitude latitude time height2m", + "out_name": "huss", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "mc": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "atmosphere_net_upward_convective_mass_flux", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Convective Mass Flux", + "comment": "The net mass flux should represent the difference between the updraft and downdraft components. The flux is computed as the mass divided by the area of the grid cell.", + "dimensions": "longitude latitude alevhalf time", + "out_name": "mc", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "n2o": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_nitrous_oxide_in_air", + "units": "mol mol-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of N2O", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.", + "dimensions": "longitude latitude plev19 time", + "out_name": "n2o", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "n2oClim": { + "frequency": "monC", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_nitrous_oxide_in_air", + "units": "mol mol-1", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of N2O", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of nitrous oxide is N2O.", + "dimensions": "longitude latitude plev19 time2", + "out_name": "n2o", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "n2oglobal": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_nitrous_oxide_in_air", + "units": "1e-09", + "cell_methods": "area: time: mean", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of N2O", + "comment": "Global mean Nitrous Oxide (N2O)", + "dimensions": "time", + "out_name": "n2oglobal", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "n2oglobalClim": { + "frequency": "monC", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_nitrous_oxide_in_air", + "units": "1e-09", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "", + "long_name": "Global Mean Mole Fraction of N2O", + "comment": "Global mean Nitrous Oxide (N2O)", + "dimensions": "time2", + "out_name": "n2oglobal", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "o3": { + "frequency": "mon", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_ozone_in_air", + "units": "mol mol-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of O3", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time", + "out_name": "o3", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "o3Clim": { + "frequency": "monC", + "modeling_realm": "atmos atmosChem", + "standard_name": "mole_fraction_of_ozone_in_air", + "units": "mol mol-1", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Mole Fraction of O3", + "comment": "Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.", + "dimensions": "longitude latitude plev19 time2", + "out_name": "o3", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "pfull": { + "frequency": "monC", + "modeling_realm": "atmos", + "standard_name": "air_pressure", + "units": "Pa", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Pressure at Model Full-Levels", + "comment": "Air pressure on model levels", + "dimensions": "longitude latitude alevel time2", + "out_name": "pfull", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "phalf": { + "frequency": "monC", + "modeling_realm": "atmos", + "standard_name": "air_pressure", + "units": "Pa", + "cell_methods": "area: mean time: mean within years time: mean over years", + "cell_measures": "area: areacella", + "long_name": "Pressure on Model Half-Levels", + "comment": "Air pressure on model half-levels", + "dimensions": "longitude latitude alevhalf time2", + "out_name": "phalf", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "pr": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "precipitation_flux", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Precipitation", + "comment": "includes both liquid and solid phases", + "dimensions": "longitude latitude time", + "out_name": "pr", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "prc": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "convective_precipitation_flux", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Convective Precipitation", + "comment": "Convective precipitation at surface; includes both liquid and solid phases.", + "dimensions": "longitude latitude time", + "out_name": "prc", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "prsn": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "snowfall_flux", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Snowfall Flux", + "comment": "At surface; includes precipitation of all forms of water in the solid phase", + "dimensions": "longitude latitude time", + "out_name": "prsn", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "prw": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "atmosphere_mass_content_of_water_vapor", + "units": "kg m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Water Vapor Path", + "comment": "vertically integrated through the atmospheric column", + "dimensions": "longitude latitude time", + "out_name": "prw", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ps": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_air_pressure", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Air Pressure", + "comment": "surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates", + "dimensions": "longitude latitude time", + "out_name": "ps", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "psl": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_pressure_at_mean_sea_level", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Sea Level Pressure", + "comment": "Sea Level Pressure", + "dimensions": "longitude latitude time", + "out_name": "psl", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rlds": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downwelling_longwave_flux_in_air", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downwelling Longwave Radiation", + "comment": "The surface called 'surface' means the lower boundary of the atmosphere. 'longwave' means longwave radiation. Downwelling radiation is radiation from above. It does not mean 'net downward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.", + "dimensions": "longitude latitude time", + "out_name": "rlds", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rldscs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downwelling_longwave_flux_in_air_assuming_clear_sky", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downwelling Clear-Sky Longwave Radiation", + "comment": "Surface downwelling clear-sky longwave radiation", + "dimensions": "longitude latitude time", + "out_name": "rldscs", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rlus": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upwelling_longwave_flux_in_air", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Upwelling Longwave Radiation", + "comment": "The surface called 'surface' means the lower boundary of the atmosphere. 'longwave' means longwave radiation. Upwelling radiation is radiation from below. It does not mean 'net upward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.", + "dimensions": "longitude latitude time", + "out_name": "rlus", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rlut": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "toa_outgoing_longwave_flux", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "TOA Outgoing Longwave Radiation", + "comment": "at the top of the atmosphere (to be compared with satellite measurements)", + "dimensions": "longitude latitude time", + "out_name": "rlut", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rlutcs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "toa_outgoing_longwave_flux_assuming_clear_sky", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "TOA Outgoing Clear-Sky Longwave Radiation", + "comment": "Upwelling clear-sky longwave radiation at top of atmosphere", + "dimensions": "longitude latitude time", + "out_name": "rlutcs", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsds": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downwelling_shortwave_flux_in_air", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downwelling Shortwave Radiation", + "comment": "Surface solar irradiance for UV calculations.", + "dimensions": "longitude latitude time", + "out_name": "rsds", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsdscs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downwelling_shortwave_flux_in_air_assuming_clear_sky", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downwelling Clear-Sky Shortwave Radiation", + "comment": "Surface solar irradiance clear sky for UV calculations", + "dimensions": "longitude latitude time", + "out_name": "rsdscs", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsdt": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "toa_incoming_shortwave_flux", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "TOA Incident Shortwave Radiation", + "comment": "Shortwave radiation incident at the top of the atmosphere", + "dimensions": "longitude latitude time", + "out_name": "rsdt", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsus": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upwelling_shortwave_flux_in_air", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Upwelling Shortwave Radiation", + "comment": "The surface called 'surface' means the lower boundary of the atmosphere. 'shortwave' means shortwave radiation. Upwelling radiation is radiation from below. It does not mean 'net upward'. When thought of as being incident on a surface, a radiative flux is sometimes called 'irradiance'. In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called 'vector irradiance'. In accordance with common usage in geophysical disciplines, 'flux' implies per unit area, called 'flux density' in physics.", + "dimensions": "longitude latitude time", + "out_name": "rsus", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsuscs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_upwelling_shortwave_flux_in_air_assuming_clear_sky", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Upwelling Clear-Sky Shortwave Radiation", + "comment": "Surface Upwelling Clear-sky Shortwave Radiation", + "dimensions": "longitude latitude time", + "out_name": "rsuscs", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsut": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "toa_outgoing_shortwave_flux", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "TOA Outgoing Shortwave Radiation", + "comment": "at the top of the atmosphere", + "dimensions": "longitude latitude time", + "out_name": "rsut", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rsutcs": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "toa_outgoing_shortwave_flux_assuming_clear_sky", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "TOA Outgoing Clear-Sky Shortwave Radiation", + "comment": "Calculated in the absence of clouds.", + "dimensions": "longitude latitude time", + "out_name": "rsutcs", + "type": "real", + "positive": "up", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "rtmt": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "net_downward_radiative_flux_at_top_of_atmosphere_model", + "units": "W m-2", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Net Downward Radiative Flux at Top of Model", + "comment": "Net Downward Radiative Flux at Top of Model : I.e., at the top of that portion of the atmosphere where dynamics are explicitly treated by the model. This is reported only if it differs from the net downward radiative flux at the top of the atmosphere.", + "dimensions": "longitude latitude time", + "out_name": "rtmt", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "sbl": { + "frequency": "mon", + "modeling_realm": "landIce", + "standard_name": "tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice", + "units": "kg m-2 s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Snow and Ice Sublimation Flux", + "comment": "The snow and ice sublimation flux is the loss of snow and ice mass per unit area from the surface resulting from their direct conversion to water vapor that enters the atmosphere.", + "dimensions": "longitude latitude time", + "out_name": "sbl", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "sci": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "shallow_convection_time_fraction", + "units": "1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Fraction of Time Shallow Convection Occurs", + "comment": "Fraction of time that shallow convection occurs in the grid cell.", + "dimensions": "longitude latitude time", + "out_name": "sci", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "sfcWind": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "wind_speed", + "units": "m s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Near-Surface Wind Speed", + "comment": "near-surface (usually, 10 meters) wind speed.", + "dimensions": "longitude latitude time height10m", + "out_name": "sfcWind", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ta": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_temperature", + "units": "K", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Air Temperature", + "comment": "Air Temperature", + "dimensions": "longitude latitude plev19 time", + "out_name": "ta", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "tas": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_temperature", + "units": "K", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Near-Surface Air Temperature", + "comment": "near-surface (usually, 2 meter) air temperature", + "dimensions": "longitude latitude time height2m", + "out_name": "tas", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "tasmax": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_temperature", + "units": "K", + "cell_methods": "area: mean time: maximum within days time: mean over days", + "cell_measures": "area: areacella", + "long_name": "Daily Maximum Near-Surface Air Temperature", + "comment": "maximum near-surface (usually, 2 meter) air temperature (add cell_method attribute 'time: max')", + "dimensions": "longitude latitude time height2m", + "out_name": "tasmax", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "tasmin": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "air_temperature", + "units": "K", + "cell_methods": "area: mean time: minimum within days time: mean over days", + "cell_measures": "area: areacella", + "long_name": "Daily Minimum Near-Surface Air Temperature", + "comment": "minimum near-surface (usually, 2 meter) air temperature (add cell_method attribute 'time: min')", + "dimensions": "longitude latitude time height2m", + "out_name": "tasmin", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "tauu": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downward_eastward_stress", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downward Eastward Wind Stress", + "comment": "Downward eastward wind stress at the surface", + "dimensions": "longitude latitude time", + "out_name": "tauu", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "tauv": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_downward_northward_stress", + "units": "Pa", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Downward Northward Wind Stress", + "comment": "Downward northward wind stress at the surface", + "dimensions": "longitude latitude time", + "out_name": "tauv", + "type": "real", + "positive": "down", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ts": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "surface_temperature", + "units": "K", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Surface Temperature", + "comment": "Temperature of the lower boundary of the atmosphere", + "dimensions": "longitude latitude time", + "out_name": "ts", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "ua": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "eastward_wind", + "units": "m s-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Eastward Wind", + "comment": "Zonal wind (positive in a eastward direction).", + "dimensions": "longitude latitude plev19 time", + "out_name": "ua", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "uas": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "eastward_wind", + "units": "m s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Eastward Near-Surface Wind", + "comment": "Eastward component of the near-surface (usually, 10 meters) wind", + "dimensions": "longitude latitude time height10m", + "out_name": "uas", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "va": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "northward_wind", + "units": "m s-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Northward Wind", + "comment": "Meridional wind (positive in a northward direction).", + "dimensions": "longitude latitude plev19 time", + "out_name": "va", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "vas": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "northward_wind", + "units": "m s-1", + "cell_methods": "area: time: mean", + "cell_measures": "area: areacella", + "long_name": "Northward Near-Surface Wind", + "comment": "Northward component of the near surface wind", + "dimensions": "longitude latitude time height10m", + "out_name": "vas", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "wap": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "lagrangian_tendency_of_air_pressure", + "units": "Pa s-1", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Omega (=dp/dt)", + "comment": "Omega (vertical velocity in pressure coordinates, positive downwards)", + "dimensions": "longitude latitude plev19 time", + "out_name": "wap", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + }, + "zg": { + "frequency": "mon", + "modeling_realm": "atmos", + "standard_name": "geopotential_height", + "units": "m", + "cell_methods": "time: mean", + "cell_measures": "area: areacella", + "long_name": "Geopotential Height", + "comment": "Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.", + "dimensions": "longitude latitude plev19 time", + "out_name": "zg", + "type": "real", + "positive": "", + "valid_min": "", + "valid_max": "", + "ok_min_mean_abs": "", + "ok_max_mean_abs": "" + } + } +} diff --git a/pcmdi_metrics/viewer/PCMDILogoText_1365x520px_300dpi.png b/pcmdi_metrics/viewer/PCMDILogoText_1365x520px_300dpi.png new file mode 100644 index 000000000..4c5623dbe Binary files /dev/null and b/pcmdi_metrics/viewer/PCMDILogoText_1365x520px_300dpi.png differ diff --git a/pcmdi_metrics/viewer/PMPLogo_500x421px_72dpi.png b/pcmdi_metrics/viewer/PMPLogo_500x421px_72dpi.png new file mode 100644 index 000000000..760396e36 Binary files /dev/null and b/pcmdi_metrics/viewer/PMPLogo_500x421px_72dpi.png differ diff --git a/pcmdi_metrics/viewer/archive/bokeh_test.py b/pcmdi_metrics/viewer/archive/bokeh_test.py new file mode 100644 index 000000000..31758c7ab --- /dev/null +++ b/pcmdi_metrics/viewer/archive/bokeh_test.py @@ -0,0 +1,87 @@ +from bokeh.models import ColumnDataSource, DataTable, TableColumn, MultiChoice, CustomJS +from bokeh.layouts import column +from bokeh.io import curdoc, output_file, save +import pandas as pd + +# Sample data +data = { + 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], + 'Age': [24, 30, 35, 40, 29], + 'Department': ['HR', 'IT', 'Finance', 'IT', 'HR'], + 'Location': ['New York', 'San Francisco', 'Chicago', 'New York', 'Chicago'], +} + +# Create a DataFrame +df = pd.DataFrame(data) + +# Function to create the layout +def create_layout(): + # Create a ColumnDataSource + source = ColumnDataSource(df) + + # Create a filtered ColumnDataSource + filtered_source = ColumnDataSource(data=dict(df)) + + # DataTable setup + columns = [ + TableColumn(field="Name", title="Name"), + TableColumn(field="Age", title="Age"), + TableColumn(field="Department", title="Department"), + TableColumn(field="Location", title="Location"), + ] + + data_table = DataTable(source=filtered_source, columns=columns, width=800, height=300) + + # Filter widgets + department_filter = MultiChoice( + options=list(df['Department'].unique()), + title="Filter by Department", + value=[], + ) + + location_filter = MultiChoice( + options=list(df['Location'].unique()), + title="Filter by Location", + value=[], + ) + + # Callback to filter the data + filter_callback = CustomJS( + args=dict(source=source, filtered_source=filtered_source, + department_filter=department_filter, location_filter=location_filter), + code=""" + const original_data = source.data; + const filtered_data = { Name: [], Age: [], Department: [], Location: [] }; + + const selected_departments = department_filter.value; + const selected_locations = location_filter.value; + + for (let i = 0; i < original_data.Name.length; i++) { + const in_department = selected_departments.length === 0 || selected_departments.includes(original_data.Department[i]); + const in_location = selected_locations.length === 0 || selected_locations.includes(original_data.Location[i]); + + if (in_department && in_location) { + filtered_data.Name.push(original_data.Name[i]); + filtered_data.Age.push(original_data.Age[i]); + filtered_data.Department.push(original_data.Department[i]); + filtered_data.Location.push(original_data.Location[i]); + } + } + + filtered_source.data = filtered_data; + filtered_source.change.emit(); + """ + ) + + department_filter.js_on_change("value", filter_callback) + location_filter.js_on_change("value", filter_callback) + + # Layout + return column(department_filter, location_filter, data_table) + +# Create layout for the HTML file +layout = create_layout() + +# Save as HTML file +output_file("interactive_multi_filter_table.html") # Specify the output HTML file name +save(layout) # Save the layout to the HTML file diff --git a/pcmdi_metrics/viewer/archive/create_user_df_v1.py b/pcmdi_metrics/viewer/archive/create_user_df_v1.py new file mode 100644 index 000000000..e590ff575 --- /dev/null +++ b/pcmdi_metrics/viewer/archive/create_user_df_v1.py @@ -0,0 +1,57 @@ +def create_user_df(dir_path): + # Create df from directory structure + data = [] + model_pattern = r"^[^_]+_([^_]+)_.*\.png$" #regex pattern to extract model name between first and second underscores + region_pattern = r"^(?:.*?_){5}(.*?)_.*\.png$" # regex pattern to extract region name, after the fifth underscore + var_folders = [f.name for f in os.scandir(dir_path) if f.is_dir()] + seasons = { + "ANN": "_AC_", + "DJF": "_DJF_", + "JJA": "_JJA_", + "MAM": "_MAM_", + "SON": "_SON_" + } + regions = { + "global": "_global_", + "NHEX": "_NHEX_", + "SHEX": "_SHEX_", + "TROPICS": "_TROPICS_" + } + + for var_folder in var_folders: + var_folder_path = os.path.join(dir_path, var_folder) + data_dict = {} #dictionary for images stored by model + + for file in os.scandir(var_folder_path): + if file.is_file(): + model_match = re.match(model_pattern, file.name) + region_match = re.match(region_pattern, file.name) + if model_match: + model = model_match.group(1) + if region_match: + region = region_match.group(1) + + if model not in data_dict: #initialize model entry if it doesn't exist + data_dict[model] = {"Variable": var_folder, "Region": region, "ANN": None, "DJF": None, "JJA": None, "MAM": None, "SON": None,} + + for season_key, season in seasons.items(): + for region_key, r in regions.items(): + if season in file.name and r in file.name: + data_dict[model] = f"https://pcmdi.llnl.gov/pmp-preliminary-results/graphics/mean_climate/cmip6/amip/clim/v20241029/{var_folder}/{file.name}" + break #to stop checking other key strings for this file + + # Add model images to data + for model, model_data in data_dict.items(): + data.append({ + "Model": model, + "Variable": model_data["Variable"], + "Region": model_data["Region"], + "ANN": model_data["ANN"], + "DJF": model_data["DJF"], + "JJA": model_data["JJA"], + "MAM": model_data["MAM"], + "SON": model_data["SON"] + }) + + user_df = pd.DataFrame(data) + return user_df \ No newline at end of file diff --git a/pcmdi_metrics/viewer/archive/mean_clim_results_my-model.html b/pcmdi_metrics/viewer/archive/mean_clim_results_my-model.html new file mode 100644 index 000000000..246ad5e7f --- /dev/null +++ b/pcmdi_metrics/viewer/archive/mean_clim_results_my-model.html @@ -0,0 +1,63 @@ + + + + + Bokeh Plot + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/pcmdi_metrics/viewer/archive/mean_clim_results_test.html b/pcmdi_metrics/viewer/archive/mean_clim_results_test.html new file mode 100644 index 000000000..24698035b --- /dev/null +++ b/pcmdi_metrics/viewer/archive/mean_clim_results_test.html @@ -0,0 +1,63 @@ + + + + + Bokeh Plot + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/pcmdi_metrics/viewer/mean_clim_results.html b/pcmdi_metrics/viewer/mean_clim_results.html new file mode 100644 index 000000000..a1ece11e2 --- /dev/null +++ b/pcmdi_metrics/viewer/mean_clim_results.html @@ -0,0 +1,63 @@ + + + + + Bokeh Plot + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/pcmdi_metrics/viewer/pmp_output_viewer.html b/pcmdi_metrics/viewer/pmp_output_viewer.html new file mode 100644 index 000000000..936b44a1d --- /dev/null +++ b/pcmdi_metrics/viewer/pmp_output_viewer.html @@ -0,0 +1,18 @@ + + + + + PMP Output Viewer PROTOTYPE + + +

Welcome to the POV PROTOTYPE page

+

Goal: Generate a PMP output viewer that offers a HTML page showing PMP output image files in an organized way.

+


+

Mean Climate:

+ Dive Down Plots
+ Portrait Plots
+ Parallel Coordinate Plots
+

Modes of Variability:

+

Dive Down Plots

+ + diff --git a/pcmdi_metrics/viewer/pmp_output_viewer.py b/pcmdi_metrics/viewer/pmp_output_viewer.py new file mode 100644 index 000000000..7b55948ff --- /dev/null +++ b/pcmdi_metrics/viewer/pmp_output_viewer.py @@ -0,0 +1,1115 @@ +# - Generate an html file of compiled PMP graphics using Bokeh. +# - Author: Kristin Chang (2024.12) +# - Last Update: 2024.12 + +import os +import shutil +from typing import Optional, Dict, Union + +from bokeh.models import ColumnDataSource, DataTable, TableColumn, MultiChoice, CustomJS, HTMLTemplateFormatter, Tooltip +from bokeh.models.dom import HTML +from bokeh.models import Div +from bokeh import events +from bokeh.layouts import column, row +from bokeh.io import output_file, save +import pandas as pd +import numpy as np +import glob +import json + +from pcmdi_metrics.graphics import download_archived_results +from pcmdi_metrics.graphics import Metrics + +def view_pmp_output( + mean_clim_divedown_path: Optional[str] = None, + mean_clim_divedown_thumbnail: Optional[str] = None, + mean_clim_portrait_path: Optional[str] = None, + mean_clim_portrait_thumbnail: Optional[str] = None, + mov_path: Optional[str] = None, + mov_thumbnail: Optional[str] = None, + enso_path: Optional[str] = None, + enso_thumbnail: Optional[str] = None, + version: str = "v20241101", + season_map: Dict[str, Dict[str, Union[int, float, str]]] = {'AC':'ANN'}, + compare_cmip6: bool = False +): + """ + Generates an html file of compiled PMP graphics using Bokeh. + + Parameters + ---------- + graphics_path : str, optional + A string for the directory path where graphics are saved. Default is None. + version : str + A string for the version number of the images. # NEED TO CONFIRM + season_map : dict + A dictionary to map different season abbreviations. Default maps PMP acronym for Annual Climatology to E3SM acronym: {'AC':'ANN'}. + compare_cmip6 : bool, optional + If True, the viewer will include cmip6 results. Default is False. + + Returns + ---------- + webpage : html files + Multiple html files with pmp_output_viewer.html as the home page. One html file is generated per plot subfolder in graphics_path with valid png images. + Example directory path: graphics > mean_climate > e3sm > amip > v20241101 >portrait_plot + Example return: Two html files; pmp_output_viewer.html and mean_climate_portrait_plot_results.html + + Example + ---------- + >>>from pmp_output_viewer import view_pmp_output + + Notes + ---------- + - Function(s) support limited variations of names for each summary: + - Mean Climate : ['mean_climate', 'mean_clim', 'climate_mean', 'clim_mean'] + - Modes of Variability: ['modes_of_variability', 'variability_modes', 'modes_of_var', 'var_modes', 'mov', 'MOV'] + + """ + viewer_dir = os.getcwd() + # ---------- + # Check if directory path provided is a valid directory + # ---------- + if not os.path.isdir(mean_clim_divedown_path): + raise ValueError(f"The provided path '{mean_clim_divedown_path}' is not a valid directory.") + + if not os.path.isdir(mov_path): + raise ValueError(f"The provided path '{mov_path}' is not a valid directory.") + + # ---------- + # Create home page + # ---------- + + # CSS styles + css_styles = """ + body { + font-family: "Roboto", sans-serif; + display: block; + align-items: center; + margin: 0; + text-align: center; + } + .container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + margin: 0 auto; + } + .header { + text-align: center; + font-size: 48px; + font-weight: black; + margin-bottom: 20px; + width: 100%; + } + .subtitle { + text-align: center; + font-size: 22px; + font-weight: normal; + margin-bottom: 20px; + } + table { + width: 1200px; + table-layout: fixed; + border-collapse: collapse; + margin: 20px auto; + } + table th, td { + border: 1px solid #ddd; + padding: 10px; + } + td:first-child { + width: 25%; + } + table a { + font-size: 22px; + } + + preview img { + height: 400px; + width: auto; + } + + a { + font-size: 16px; + } + + /* Style table cells */ + .data-table table { + font-size: 16px !important; + } + + /* Style table headers */ + .data-table .slick-header-columns { + font-size: 16px !important; + font-weight: bold; + } + + /* Adjust header spacing */ + .data-table .slick-header-column { + padding: 5px; + } + + """ + home_content = f""" + + + + + + PMP Output Viewer +
+ PCMDI_logo + PMP_logo +
+
PMP Output Viewer
+
(Prototype)
+ + + + + """ + # Run corresponding functions to generate individual plot pages + mean_clim_divedown_summaries, mean_clim_divedown_version_path, mean_clim_divedown_plot_paths = navigate_graphics_dir(dir_path=mean_clim_divedown_path, version=version) + + for mean_clim_divedown_plot_path in mean_clim_divedown_plot_paths: + if check_png_files(mean_clim_divedown_plot_path): + mean_clim_divedown_summary_name = mean_clim_divedown_plot_path.split('/')[-5] + mean_clim_divedown_plot_name = os.path.basename(mean_clim_divedown_plot_path) + layout = create_mean_clim_divedown_layout(plot_path=mean_clim_divedown_plot_path, season_map=season_map, compare_cmip6=compare_cmip6) + output_file(f"./{mean_clim_divedown_summary_name}_{mean_clim_divedown_plot_name}_results.html") + save(layout) + + if mean_clim_portrait_path: + mean_clim_portrait_summaries, mean_clim_portrait_version_path, mean_clim_portrait_plot_paths = navigate_graphics_dir(dir_path=mean_clim_portrait_path, version=version) + + for mean_clim_portrait_plot_path in mean_clim_portrait_plot_paths: + if check_png_files(mean_clim_portrait_plot_path): + mean_clim_portrait_summary_name = mean_clim_portrait_plot_path.split('/')[-5] + mean_clim_portrait_plot_name = os.path.basename(mean_clim_portrait_plot_path) + layout = create_mean_clim_portrait_layout(plot_path=mean_clim_portrait_plot_path) + output_file(f"./{mean_clim_portrait_summary_name}_{mean_clim_portrait_plot_name}_results.html") + save(layout) + + # Adding MOV + if mov_path: + mov_summaries, mov_version_path, mov_plot_paths = navigate_graphics_dir(dir_path=mov_path, version=version) + + source_dir = mov_version_path[0] + destination_dir = os.path.join(mov_version_path[0], 'pmp_viewer_all_modes') + os.makedirs(destination_dir, exist_ok=True) + + for mov_plot_path in mov_plot_paths: + if check_png_files(mov_plot_path): + mov_summary_name = mov_plot_path.split('/')[-5] + mov_plot_name = os.path.basename(mov_plot_path) + # walk through source directory + for root, _, files in os.walk(mov_plot_path): + for file in files: + source_path = os.path.join(root, file) # full path of the file + destination_path = os.path.join(destination_dir, file) + # copy to new directory + shutil.copy2(source_path, destination_path) + + layout = create_mov_layout(destination_dir) + output_file(f"./{mov_summaries[0]}_results.html") + save(layout) + + # Adding ENSO + if enso_path: + enso_summaries, enso_version_path, enso_plot_paths = navigate_graphics_dir(dir_path=enso_path, version=version) + + source_dir = enso_version_path[0] + destination_dir = os.path.join(enso_version_path[0], 'pmp_viewer_all_enso') + os.makedirs(destination_dir, exist_ok=True) + + for enso_plot_path in enso_plot_paths: + if check_png_files(enso_plot_path): + for root, _, files in os.walk(enso_plot_path): + collection_name = os.path.basename(root) # add the collection name to each file name + for file in files: + source_path = os.path.join(root, file) + #new_filename = f"{collection_name}_{file}" + #destination_path = os.path.join(destination_dir, new_filename) + shutil.copy2(source_path, destination_dir) + + layout = create_enso_layout(destination_dir) + output_file(f"./{enso_summaries[0]}_results.html") + save(layout) + + # Construct Main page + home_content += f'\n' + if mean_clim_divedown_thumbnail: + home_content += f'\n' + else: + plot_path = mean_clim_divedown_plot_paths[0] + files = glob.glob(plot_path + '/*.png') + first_image = files[0] + home_content += f'\n' + + if mean_clim_portrait_path: + home_content += f'\n' + if mean_clim_portrait_thumbnail: + home_content += f'\n' + else: + plot_path = mean_clim_portrait_plot_paths[0] + files = glob.glob(plot_path + '/*.png') + first_image = files[0] + home_content += f'\n' + + if mov_path: + home_content += f'\n' + if mov_thumbnail: + home_content += f'\n' + else: + plot_path = mov_plot_paths[0] + files = glob.glob(plot_path + '/*.png') + first_image = files[0] + home_content += f'\n' + + if enso_path: + home_content += f'\n' + if enso_thumbnail: + home_content += f'\n' + else: + plot_path = enso_plot_paths[0] + files = glob.glob(plot_path + '/*.png') + first_image = files[0] + home_content += f'\n' + + # close html tags + home_content += """ + +
Mean Climate Dive Downplot_preview
plot_preview
Mean Climate Portrait Plotplot_preview
plot_preview
Modes of Variabilityplot_preview
plot_preview
ENSOplot_preview
plot_preview
+ + + + """ + + # save home page as html + with open("pmp_output_viewer.html", "w") as pov_file: + pov_file.write(home_content) + + cwd = os.getcwd() + return print(f"POV created in {cwd}") + +# ---------- +# Support functions +# ---------- + +def navigate_graphics_dir(dir_path, version): + """ + Navigates summary folder to png files. + + Parameters + ---------- + graphics_path : str, optional + A string for the directory path where graphics are saved. Default is None. + version : str + A string for the version number of the images. # NEED TO CONFIRM + + Returns + ---------- + Two arrays + One contains the names of summary folders. One contains the paths to the folder containing png files. + + Example + ---------- + summary folder > e3sm > amip > version > plot type > png files + plot_path: summary/e3sm/amip/version/dive_down + """ + + summaries = [name for name in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, name))] + summary_paths = [] + e3sm_paths = [] + amip_paths = [] + version_paths = [] + plot_paths = [] + + for summary in summaries: + summary_path = os.path.join(dir_path, summary) + summary_paths.append(summary_path) + + for summary_path in summary_paths: + e3sm_path = os.path.join(summary_path, 'e3sm') + e3sm_paths.append(e3sm_path) + + for e3sm_path in e3sm_paths: + amip_path = os.path.join(e3sm_path, 'amip') + amip_paths.append(amip_path) + + for amip_path in amip_paths: + version_path = os.path.join(amip_path, version) + version_paths.append(version_path) + + for version_path in version_paths: + plot_dirs = [os.path.join(version_path, plot_folder) + for plot_folder in os.listdir(version_path) + if os.path.isdir(os.path.join(version_path, plot_folder))] + plot_paths.extend(plot_dirs) + + return summaries, version_paths, plot_paths + +# checks if png files are available +def check_png_files(path): + # check if the folder contains png files + for filename in os.listdir(path): + if filename.lower().endswith('.png'): + return True + return False + +def add_var_long_name(df): + """ + Uses 'long_name' column in the CMIP6 Amon table to add a variable description to the table. + + Parameters + ---------- + df : pandas dataframe + dataframe to add the description field to. + """ + with open('./CMIP6_Amon.json', 'r') as file: + cmor_table = json.load(file) + + var_to_long_name = { + var: details.get('long_name', 'Unknown') + for var, details in cmor_table.get('variable_entry', {}).items() + } + + df['Description'] = df['Variable'].apply(lambda var: var_to_long_name.get(extract_base_var(var), 'NaN')) + return df + +def extract_base_var(var_name): + """ + Extracts the base name of the variable. + + Example + ---------- + For variables with different layers, use the base name to match to a name in the AMON table. (e.g., For ua-200 use ua) + + Returns + ---------- + Pandas dataframe with a new column 'Description'. + """ + return var_name.split('-')[0] + +def create_mean_clim_divedown_user_df(plot_path, season_map={'AC':'ANN'}): + """ + Create a dataframe from the provided directory path. (User model) + + Parameters + ---------- + plot_path : str, optional + A string for the directory path where graphics are saved. Default is None. + season_map : dict + A dictionary to map different season abbreviations. Default maps pmp acronym for Annual Climatology to E3SM acronym: {'AC':'ANN'}. + + Returns + ---------- + pandas dataframe + A table with columns: mip, model, variable, description, region, ANN, DJF, JJA, MAM, SON + """ + data = {} + season_map = season_map or {} # Default to empty dict if none + + for this_path, this_dir, files in os.walk(plot_path): + for file in files: + if file.endswith(('png')): + # extract file components based on underscores + parts = file.split('_') + if len(parts) >= 8: + variable = parts[0] + model = parts[1] + region = parts[5] + season = parts[6] + mip = 'cmip6' # FIX LATER + + # rename season if mapping provided + season = season_map.get(season, season) + else: + model, region, season = None, None, None + + # construct image file path + file_path = os.path.join(plot_path, file) + + # use unique key to group data + key = (variable, model, region) + + # initialize row if not already present + if key not in data: + data[key] = { + 'MIP': mip, + 'Model': model, + 'Variable': variable, + 'Region': region, + } + + # Add each season column with the image path + data[key][season] = file_path + + df = pd.DataFrame.from_dict(data, orient='index') + df.reset_index(drop=True, inplace=True) + df = add_var_long_name(df) + + return df + +def create_cmip6_df(mip='cmip6', exp='historical', data_version='v20230823'): + """ + Create results using cmip6 data. + + Parameters + ---------- + mip : str, optional + String for MIP. Default is cmip6. + exp : str, optional + String for experiment (?). Default is historical. + data_version : str, optional + String for data version. Default is most recent available v20230823. + + Returns + ---------- + pandas dataframe + A table with columns: mip, model, variable, description, region, ANN, DJF, JJA, MAM, SON + """ + # download cmip6 data using pmp + cmip6_dir = './pov_cmip6_mean_clim_json_files' + os.makedirs(cmip6_dir, exist_ok=True) + #try: + # os.mkdir(cmip6_dir) + #except FileExistsError: + # raise FileExistsError(f"Error: The directory '{cmip6_dir}' already exists!") + + vars = ['pr', 'prw', 'psl', 'rlds', 'rltcre', 'rlus', 'rlut', 'rlutcs', 'rsds', 'rsdscs', 'rsdt', 'rstcre', 'rsut', 'rsutcs', 'sfcWind', + 'ta-200', 'ta-850', 'tas', 'tauu', 'ts', 'ua-200', 'ua-850', 'va-200', 'va-850', 'zg-500'] + mip = mip + exp = exp + data_version = data_version + for var in vars: + path = "metrics_results/mean_climate/"+mip+"/"+exp+"/"+data_version+"/"+var+"."+mip+"."+exp+".regrid2.2p5x2p5."+data_version+".json" + download_archived_results(path, cmip6_dir) + + json_list = sorted(glob.glob(os.path.join(cmip6_dir, '*.' + mip + '.' + exp + '*' + data_version + '.json'))) + library_cmip6 = Metrics(json_list, mip=mip) + + # construct df from json data + seasons = ['djf', 'jja', 'mam', 'son'] + regions = ['global', 'NHEX', 'SHEX', 'TROPICS'] + region_dfs = [] + for r in regions: + region_df = library_cmip6.df_dict['bias_xy']['djf'][r] + region_df = region_df.drop(columns=['mip', 'model_run']) + id_vars = ['model', 'run'] + value_vars = [col for col in region_df.columns if col not in id_vars] + region_df = pd.melt(region_df, id_vars = id_vars, value_vars = value_vars, var_name = "Variable", value_name='value').drop(columns=['value']) + region_df['Region'] = r + + region_dfs.append(region_df) + + season_df = pd.concat(region_dfs).drop_duplicates() + img_url = "https://pcmdi.llnl.gov/pmp-preliminary-results/graphics/mean_climate/cmip6/amip/clim/v20241029" + for s in seasons: + season_df[s.upper()] = season_df.apply(lambda row: f"{img_url}/{row['Variable']}/{row['Variable']}_{row['model']}_{row['run']}_interpolated_regrid2_{row['Region']}_{s.upper()}_v20241029.png", axis=1) + + season_df['ANN'] = season_df.apply(lambda row: f"{img_url}/{row['Variable']}/{row['Variable']}_{row['model']}_{row['run']}_interpolated_regrid2_{row['Region']}_AC_v20241029.png", axis=1) + season_df = season_df.drop(columns = ['run']) + season_df = season_df.rename(columns={'model': 'Model'}) + season_df['MIP'] = mip + + cmip6_df = season_df + + return cmip6_df + +def create_mean_clim_divedown_layout(plot_path, season_map={'AC':'ANN'}, compare_cmip6=False): + """ + Creates results page with bokeh filters and table. + + Parameters + ---------- + plot_path : str, optional + A string for the directory path where graphics are saved. Default is None. + season_map : dict + A dictionary to map different season abbreviations. Default maps pmp acronym for Annual Climatology to E3SM acronym: {'AC':'ANN'}. + compare_cmip6 : bool, optional + If True, the viewer will include cmip6 results. Default is False. + + Returns + ---------- + bokeh layout object + + """ + if plot_path: + user_df = create_mean_clim_divedown_user_df(plot_path=plot_path, season_map=season_map).sort_values(['MIP', 'Model', 'Variable', 'Region']) + else: + user_df = pd.DataFrame() + + if compare_cmip6: + cmip6_df = create_cmip6_df().sort_values(['MIP', 'Model', 'Variable', 'Region']) + cmip6_df = add_var_long_name(cmip6_df) + df = pd.concat([user_df, cmip6_df]) + else: + df = user_df + + source = ColumnDataSource(data=dict(df)) + filtered_data = df.loc[df['Region']=='global'] + filtered_source = ColumnDataSource(data=filtered_data.to_dict(orient="list")) + + # HTML Template for image links + image_templates = {} + image_formatters = {} + seasons = ['ANN', 'DJF', 'JJA', 'MAM', 'SON'] + for s in seasons: + image_templates[f"{s}_template"] = f""" +
+ {s} +
+ """ + # {s} + image_formatters[f"{s}_formatter"] = HTMLTemplateFormatter(template=image_templates[f"{s}_template"]) + + # hover_preview = Tooltip(content=HTML("
"" style=""width: 150px; height: auto;""/>
")) + + # Custom JS for hover tooltip + tooltip_callback = CustomJS( + args=dict(source=source), + code=""" + const element = this.parentElement; + const tooltip = element.querySelector('.tooltip); + element.addEventListener('mouseover', function() { + tooltip.style.visibility = 'visible'; + }); + element.addEventListener('mouseout', function () { + tooltip.style.visibility = 'hidden'; + }); + """ + ) + + # hover_preview.js_on_event(events.MouseEnter, hover_preview, tooltip_callback) + + text_only_formatter = HTMLTemplateFormatter(template=' <%= value %> ') + + # Table setup + columns = [ + TableColumn(field="MIP", title="MIP", formatter=text_only_formatter), + TableColumn(field="Model", title="Model", formatter=text_only_formatter), + TableColumn(field="Variable", title="Variable", formatter=text_only_formatter), + TableColumn(field="Description", title="Description", formatter=text_only_formatter), + TableColumn(field="Region", title="Region", formatter=text_only_formatter), + TableColumn(field="ANN", title="ANN", formatter=image_formatters["ANN_formatter"]), + TableColumn(field="DJF", title="DJF", formatter=image_formatters["DJF_formatter"]), + TableColumn(field="JJA", title="JJA", formatter=image_formatters["JJA_formatter"]), + TableColumn(field="MAM", title="MAM", formatter=image_formatters["MAM_formatter"]), + TableColumn(field="SON", title="SON", formatter=image_formatters["SON_formatter"]) + ] + + dtable = DataTable(source=filtered_source, columns=columns, width=1600, height=1200, row_height=30) + + # Filter widgets + mip_dropdown = MultiChoice( + options=list(df['MIP'].unique()), + title="Select MIP", + value=[] + ) + + model_dropdown = MultiChoice( + options=list(df['Model'].unique()), + title="Select Model", + value=[] + ) + + var_dropdown = MultiChoice( + options=list(df['Variable'].unique()), + title="Select Variable", + value=[] + ) + + region_dropdown = MultiChoice( + options=list(df['Region'].unique()), + title="Select Region", + value=['global'] + ) + + # JS Callback to filter df + dropdown_callback = CustomJS( + args=dict(source=source, filtered_source=filtered_source, mip_dropdown=mip_dropdown, model_dropdown=model_dropdown, var_dropdown=var_dropdown, region_dropdown=region_dropdown), + code=""" + const original_data = source.data; + const filtered_data = { MIP: [], Model: [], Variable: [], Description: [], Region: [], ANN: [], DJF: [], JJA: [], MAM: [], SON: [] }; + + const selected_mips = mip_dropdown.value; + const selected_models = model_dropdown.value; + const selected_vars = var_dropdown.value; + const selected_regions = region_dropdown.value; + + for (let i = 0; i < original_data.Model.length; i++) { + const in_mip = selected_mips.length === 0 || selected_mips.includes(original_data.MIP[i]); + const in_model = selected_models.length === 0 || selected_models.includes(original_data.Model[i]); + const in_var = selected_vars.length === 0 || selected_vars.includes(original_data.Variable[i]); + const in_region = selected_regions.length === 0 || selected_regions.includes(original_data.Region[i]); + + if (in_mip && in_model && in_var && in_region) { + filtered_data.MIP.push(original_data.MIP[i]); + filtered_data.Model.push(original_data.Model[i]); + filtered_data.Variable.push(original_data.Variable[i]); + filtered_data.Description.push(original_data.Description[i]); + filtered_data.Region.push(original_data.Region[i]); + filtered_data.ANN.push(original_data.ANN[i]); + filtered_data.DJF.push(original_data.DJF[i]); + filtered_data.JJA.push(original_data.JJA[i]); + filtered_data.MAM.push(original_data.MAM[i]); + filtered_data.SON.push(original_data.SON[i]); + } + } + + filtered_source.data = Object.assign({}, filtered_data); + filtered_source.change.emit(); + """ + ) + title_text = Div(text=""" +
+

PMP Mean Climate Dive Down Plots

+
+

Filters

+ """) + + mip_dropdown.js_on_change('value', dropdown_callback) + model_dropdown.js_on_change('value', dropdown_callback) + var_dropdown.js_on_change('value', dropdown_callback) + region_dropdown.js_on_change('value', dropdown_callback) + + layout = column(title_text, row(mip_dropdown, model_dropdown, var_dropdown, region_dropdown), dtable) + return layout + +def create_mean_clim_portrait_df(plot_path): + data = {} + + for this_path, this_dir, files in os.walk(plot_path): + for file in files: + if file.endswith(('png')): + parts = file.split('_') + if len(parts) >= 8: + variable = parts[0] + model = parts[1] + region = parts[5] + else: + variable, model, region = None, None, None + + file_path = os.path.join(plot_path, file) + + key = (variable, model, region) + + if key not in data: + data[key] = { + 'Model': model, + 'Variable': variable, + 'Region': region, + 'Preview': file_path + } + df = pd.DataFrame.from_dict(data, orient='index') + df.reset_index(drop=True, inplace=True) + + return df + +def create_mean_clim_portrait_layout(plot_path): + if plot_path: + user_df = create_mean_clim_portrait_df(plot_path=plot_path) + else: + user_df = pd.DataFrame() + + df = user_df + + source = ColumnDataSource(data=dict(df)) + filtered_data = df + filtered_source = ColumnDataSource(data=filtered_data.to_dict(orient='list')) + + image_template = f""" +
+ preview +
+ """ + image_formatter = HTMLTemplateFormatter(template=image_template) + text_only_formatter = HTMLTemplateFormatter(template=' <%= value %> ') + + + columns=[ + TableColumn(field="Model", title="Model", formatter=text_only_formatter), + TableColumn(field="Variable", title="Variable", formatter=text_only_formatter), + TableColumn(field="Region", title="Region", formatter=text_only_formatter), + TableColumn(field="Preview", title="Preview", formatter=image_formatter, width=700) + ] + + dtable = DataTable(source=filtered_source, columns=columns, width=1600, height=1200, row_height=320) + + model_dropdown = MultiChoice( + options=list(df['Model'].unique()), + title="Select Model", + value=[] + ) + + var_dropdown = MultiChoice( + options=list(df['Variable'].unique()), + title="Select Variable", + value=[] + ) + + region_dropdown = MultiChoice( + options=list(df['Region'].unique()), + title="Select Region", + value=[] + ) + + portrait_dropdown_callback = CustomJS( + args=dict(source=source, filtered_source=filtered_source, model_dropdown=model_dropdown, var_dropdown=var_dropdown, region_dropdown=region_dropdown), + code=""" + const original_data = source.data; + const filtered_data = { Model: [], Variable: [], Region: [], Preview: []}; + + const selected_models = model_dropdown.value; + const selected_vars = var_dropdown.value; + const selected_regions = region_dropdown.value; + + for (let i = 0; i < original_data.Model.length; i++) { + const in_model = selected_models.length === 0 || selected_models.includes(original_data.Model[i]); + const in_var = selected_vars.length === 0 || selected_vars.includes(original_data.Variable[i]); + const in_region = selected_regions.length === 0 || selected_regions.includes(original_data.Region[i]); + + if (in_model && in_var && in_region) { + filtered_data.Model.push(original_data.Model[i]); + filtered_data.Variable.push(original_data.Variable[i]); + filtered_data.Region.push(original_data.Region[i]); + filtered_data.Preview.push(original_data.Preview[i]); + } + } + + filtered_source.data = Object.assign({}, filtered_data); + filtered_source.change.emit(); + """ + ) + + title_text = Div(text=""" +
+

PMP Mean Climate Portrait Plots

+
+

Filters

+ """) + + model_dropdown.js_on_change('value', portrait_dropdown_callback) + var_dropdown.js_on_change('value', portrait_dropdown_callback) + region_dropdown.js_on_change('value', portrait_dropdown_callback) + + layout = column(title_text,row(model_dropdown, var_dropdown, region_dropdown), dtable) + return layout + +def create_mov_df(mov_all_modes_path): + + data = {} + + for this_path, this_dir, files in os.walk(mov_all_modes_path): + for file in files: + if file.endswith(('png')): + parts = file.split('_') + if len(parts) >= 8: + mode = parts[0] + variable = parts[1] + season = parts[3] + method = parts[11] + else: + mode, variable, season, method = None, None, None, None + + file_path = os.path.join(mov_all_modes_path, file) + + key = (mode, variable, season, method) + + if key not in data: + data[key] = { + 'Mode': mode, + 'Variable': variable, + 'Season': season, + 'Method': method + } + + data[key]['Preview'] = file_path + + df = pd.DataFrame.from_dict(data, orient='index') + df.reset_index(drop=True, inplace=True) + df = add_var_long_name(df) + + return df + +def create_mov_layout(mov_all_modes_path): + if mov_all_modes_path: + user_df = create_mov_df(mov_all_modes_path=mov_all_modes_path).sort_values(['Mode', 'Variable', 'Season', 'Method']) + else: + user_df = pd.DataFrame() + + df = user_df + + source = ColumnDataSource(data=dict(df)) + filtered_data = df + filtered_source = ColumnDataSource(data=filtered_data.to_dict(orient='list')) + + image_template = f""" +
+ preview +
+ """ + image_formatter = HTMLTemplateFormatter(template=image_template) + + text_only_formatter = HTMLTemplateFormatter(template=' <%= value %> ') + + columns = [ + TableColumn(field="Mode", title="Mode", formatter=text_only_formatter), + TableColumn(field="Variable", title="Variable", formatter=text_only_formatter), + TableColumn(field="Description", title="Description", formatter=text_only_formatter), + TableColumn(field="Season", title="Season", formatter=text_only_formatter), + TableColumn(field="Method", title="Method", formatter=text_only_formatter), + TableColumn(field="Preview", title="Preview", formatter=image_formatter, width=450) + ] + + dtable = DataTable(source=filtered_source, columns=columns, width=1600, height=1200, row_height=320) + + mode_dropdown = MultiChoice( + options=list(df['Mode'].unique()), + title="Select Mode", + value=[] + ) + + var_dropdown = MultiChoice( + options=list(df['Variable'].unique()), + title="Select Variable", + value=[] + ) + + season_dropdown = MultiChoice( + options=list(df['Season'].unique()), + title="Select Season", + value=[] + ) + + method_dropdown = MultiChoice( + options=list(df['Method'].unique()), + title="Select Method", + value=[] + ) + + mov_dropdown_callback = CustomJS( + args=dict(source=source, filtered_source=filtered_source, mode_dropdown=mode_dropdown, var_dropdown=var_dropdown, season_dropdown=season_dropdown, method_dropdown=method_dropdown), + code=""" + const original_data = source.data; + const filtered_data = { Mode: [], Variable: [], Description: [], Season: [], Method: [], Preview: []}; + + const selected_modes = mode_dropdown.value; + const selected_vars = var_dropdown.value; + const selected_seasons = season_dropdown.value; + const selected_methods = method_dropdown.value; + + for (let i = 0; i < original_data.Season.length; i++) { + const in_mode = selected_modes.length === 0 || selected_modes.includes(original_data.Mode[i]); + const in_var = selected_vars.length === 0 || selected_vars.includes(original_data.Variable[i]); + const in_season = selected_seasons.length === 0 || selected_seasons.includes(original_data.Season[i]); + const in_method = selected_methods.length === 0 || selected_methods.includes(original_data.Method[i]); + + if (in_mode && in_var && in_season && in_method) { + filtered_data.Mode.push(original_data.Mode[i]); + filtered_data.Variable.push(original_data.Variable[i]); + filtered_data.Description.push(original_data.Description[i]); + filtered_data.Season.push(original_data.Season[i]); + filtered_data.Method.push(original_data.Method[i]); + filtered_data.Preview.push(original_data.Preview[i]); + } + } + + filtered_source.data = Object.assign({}, filtered_data); + filtered_source.change.emit(); + """ + ) + + title_text = Div(text=""" +
+

PMP Modes of Variability Metrics

+
+

Filters

+ """) + + mode_dropdown.js_on_change('value', mov_dropdown_callback) + var_dropdown.js_on_change('value', mov_dropdown_callback) + season_dropdown.js_on_change('value', mov_dropdown_callback) + method_dropdown.js_on_change('value', mov_dropdown_callback) + + layout = column(title_text, row(mode_dropdown, var_dropdown, season_dropdown, method_dropdown), dtable) + return layout + +def create_enso_df(all_enso_path): + + data = {} + + for this_path, this_dir, files in os.walk(all_enso_path): + for file in files: + if file.endswith(('png')): + parts = file.split('_') + # e3sm_historical_ENSO_perf_v3-LR_0051_BiasPrLatRmse_diagnostic_divedown01.png + if len(parts) >= 8: + collection = parts[2] + '_' + parts[3] + metric = parts[6] + model = parts[4] + plot = parts[8].split('.')[0] + else: + collection, metric, model = None, None, None + + file_path = os.path.join(all_enso_path, file) + + key = (collection, metric, model) + + if key not in data: + data[key] = { + 'Collection': collection, + 'Metric' : metric, + 'Model' : model + } + + data[key][plot] = file_path + + df = pd.DataFrame.from_dict(data, orient='index') + df.reset_index(drop=True, inplace=True) + + return df + +def create_enso_layout(all_enso_path): + if all_enso_path: + user_df = create_enso_df(all_enso_path=all_enso_path).sort_values(['Collection', 'Metric']) + else: + user_df = pd.DataFrame() + + df = user_df + + source = ColumnDataSource(data=dict(df)) + filtered_data = df + filtered_source = ColumnDataSource(data=filtered_data.to_dict(orient='list')) + + image_templates={} + image_formatters={} + plots = ['divedown01', 'divedown02', 'divedown03', 'divedown04', 'divedown05'] + #for p in plots: + # image_templates[f"{p}_template"] = f""" + #
+ # {p} + #
+ # """ + # image_formatters[f"{p}_formatter"] = HTMLTemplateFormatter(template=image_templates[f"{p}_template"]) + + #no_image_template = """ + #No image available + #""" + #valid_link_template = """ + #View Plot + #""" + + #no_image_formatter = HTMLTemplateFormatter(template=no_image_template) + #valid_link_formatter = HTMLTemplateFormatter(template=valid_link_template) + + # Assign the correct formatter for each column + #for p in plots: + # Replace NaN values with 'No image available' + # df[p] = df[p].fillna("No plot available") + + # Apply formatter based on each cell's value + #image_formatters[f'{p}_formatter'] = image_formatters[f"{p}_formatter"] = valid_link_formatter if df[p].iloc[0] != "No plot available" else no_image_formatter + + image_or_text_formatter = HTMLTemplateFormatter(template=""" + <% if (value && value !== "No plot available") { %> + + View plot + + <% } else { %> + -- + <% } %> + """) + text_only_formatter = HTMLTemplateFormatter(template=' <%= value %> ') + + columns = [ + TableColumn(field="Collection", title="Collection", formatter=text_only_formatter), + TableColumn(field="Metric", title="Metric", formatter=text_only_formatter), + TableColumn(field="Model", title="Model", formatter=text_only_formatter), + TableColumn(field="divedown01", title="diagnostic01", formatter=image_or_text_formatter), + TableColumn(field="divedown02", title="diagnostic02", formatter=image_or_text_formatter), + TableColumn(field="divedown03", title="diagnostic03", formatter=image_or_text_formatter), + TableColumn(field="divedown04", title="diagnostic04", formatter=image_or_text_formatter), + TableColumn(field="divedown05", title="diagnostic05", formatter=image_or_text_formatter) + ] + + dtable = DataTable(source=filtered_source, columns=columns, width=1600, height=1200, row_height=30) + + # Page text + title = Div(text=""" +
+

PMP ENSO Diagnostics and Metrics

+
+

Filters

+ """) + # Filters + collection_dropdown = MultiChoice( + options=list(df['Collection'].unique()), + title="Select Collection", + value=[], + css_classes=["multichoice"] + ) + + metric_dropdown = MultiChoice( + options=list(df['Metric'].unique()), + title="Select Metric", + value=[] + ) + + model_dropdown = MultiChoice( + options=list(df['Model'].unique()), + title="Select Model", + value=[] + ) + css = """ + + """ + css_div = Div(text=css) + # JS Callback + enso_callback = CustomJS( + args=dict(source=source, filtered_source=filtered_source, collection_dropdown=collection_dropdown, metric_dropdown=metric_dropdown, model_dropdown=model_dropdown), + code=""" + const original_data = source.data; + const filtered_data = { Collection: [], Metric: [], Model: [], divedown01: [], divedown02: [], divedown03: [], divedown04: [], divedown05: []} + + const selected_collections = collection_dropdown.value; + const selected_metrics = metric_dropdown.value; + const selected_models = model_dropdown.value; + + for (let i = 0; i < original_data.Model.length; i++) { + const in_collection = selected_collections.length === 0 || selected_collections.includes(original_data.Collection[i]); + const in_metric = selected_metrics.length === 0 || selected_metrics.includes(original_data.Metric[i]); + const in_model = selected_models.length === 0 || selected_models.includes(original_data.Model[i]); + + if (in_collection && in_metric && in_model) { + filtered_data.Collection.push(original_data.Collection[i]); + filtered_data.Metric.push(original_data.Metric[i]); + filtered_data.Model.push(original_data.Model[i]); + filtered_data.divedown01.push(original_data.divedown01[i]); + filtered_data.divedown02.push(original_data.divedown02[i]); + filtered_data.divedown03.push(original_data.divedown03[i]); + filtered_data.divedown04.push(original_data.divedown04[i]); + filtered_data.divedown05.push(original_data.divedown05[i]); + } + } + + filtered_source.data = Object.assign({}, filtered_data); + filtered_source.change.emit(); + """ + ) + + collection_dropdown.js_on_change('value', enso_callback) + metric_dropdown.js_on_change('value', enso_callback) + model_dropdown.js_on_change('value', enso_callback) + + layout = column(css_div, title, row(collection_dropdown, metric_dropdown, model_dropdown), dtable) + return layout \ No newline at end of file