From 700def67e0fa4e06e7a84b64bb54d0a3c288f316 Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 11:17:00 -0700 Subject: [PATCH 01/10] improve level extraction based on plev --- .../mean_climate/lib/load_and_regrid.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py index 9428f569a..1333804ca 100644 --- a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py +++ b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py @@ -49,10 +49,22 @@ def load_and_regrid(data_path, varname, varname_in_file=None, level=None, t_grid # level - extract a specific level if needed if level is not None: - level = level * 100 # hPa to Pa - ds = ds.sel(plev=level) - if debug: - print('ds:', ds) + if isinstance(level, int) or isinstance(level, float): + pass + else: + level = float(level) + + # check vertical coordinate first + if 'plev' in list(ds.coords.keys()): + if ds.plev.units == 'Pa': + level = level * 100 # hPa to Pa + ds = ds.sel(plev=level) + if debug: + print('ds:', ds) + else: + print('ERROR: plev is not in the nc file. Check vertical coordinate.') + print('Coordinates keys in the nc file:', list(ds.coords.keys())) + return # regrid if regrid_tool == 'regrid2': From 51d301f9f90d466633b09a9a04f1a30a173e8657 Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 11:17:45 -0700 Subject: [PATCH 02/10] add option for realization selection: first only realization --- pcmdi_metrics/mean_climate/mean_climate_driver.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/mean_climate_driver.py b/pcmdi_metrics/mean_climate/mean_climate_driver.py index 5d41bca63..e784e9676 100755 --- a/pcmdi_metrics/mean_climate/mean_climate_driver.py +++ b/pcmdi_metrics/mean_climate/mean_climate_driver.py @@ -20,6 +20,7 @@ mean_climate_metrics_to_json, ) from pcmdi_metrics.variability_mode.lib import tree +from pcmdi_metrics.variability_mode.lib import sort_human parser = create_mean_climate_parser() @@ -59,6 +60,7 @@ diagnostics_output_path = diagnostics_output_path.replace('%(case_id)', case_id) find_all_realizations = False +first_realization_only = False if realization is None: realization = "" realizations = [realization] @@ -66,6 +68,8 @@ if realization.lower() in ["all", "*"]: find_all_realizations = True realizations = "Search for all realizations!!" + elif realization.lower() in ["first", "first_only"]: + first_realization_only = True else: realizations = [realization] @@ -206,7 +210,7 @@ result_dict["RESULTS"][model][ref]["source"] = ref_dataset_name - if find_all_realizations: + if find_all_realizations or first_realization_only: test_data_full_path = os.path.join( test_data_path, filename_template).replace('%(variable)', varname).replace('%(model)', model).replace('%(model_version)', model).replace('%(realization)', '*') @@ -215,6 +219,9 @@ realizations = [] for ncfile in ncfiles: realizations.append(ncfile.split('/')[-1].split('.')[3]) + realizations = sort_human(realizations) + if first_realization_only: + realizations == realizations[0:1] print('realizations (after search): ', realizations) for run in realizations: From 3381fe29d4b1d40f2710aee6dc26cc004488bd7c Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 11:33:16 -0700 Subject: [PATCH 03/10] test --- pcmdi_metrics/mean_climate/mean_climate_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/mean_climate_driver.py b/pcmdi_metrics/mean_climate/mean_climate_driver.py index e784e9676..e2002c3e6 100755 --- a/pcmdi_metrics/mean_climate/mean_climate_driver.py +++ b/pcmdi_metrics/mean_climate/mean_climate_driver.py @@ -60,7 +60,7 @@ diagnostics_output_path = diagnostics_output_path.replace('%(case_id)', case_id) find_all_realizations = False -first_realization_only = False +first_realization_only = False if realization is None: realization = "" realizations = [realization] From e15269dfc6359b7c52e4fa968d45b9f3df8a179e Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 11:33:45 -0700 Subject: [PATCH 04/10] clean up --- pcmdi_metrics/mean_climate/mean_climate_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/mean_climate_driver.py b/pcmdi_metrics/mean_climate/mean_climate_driver.py index e2002c3e6..e784e9676 100755 --- a/pcmdi_metrics/mean_climate/mean_climate_driver.py +++ b/pcmdi_metrics/mean_climate/mean_climate_driver.py @@ -60,7 +60,7 @@ diagnostics_output_path = diagnostics_output_path.replace('%(case_id)', case_id) find_all_realizations = False -first_realization_only = False +first_realization_only = False if realization is None: realization = "" realizations = [realization] From 7f4b42d3945a75deefc72aa9c2fc127ea88b35a3 Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 11:46:35 -0700 Subject: [PATCH 05/10] simplify logic --- pcmdi_metrics/mean_climate/mean_climate_driver.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pcmdi_metrics/mean_climate/mean_climate_driver.py b/pcmdi_metrics/mean_climate/mean_climate_driver.py index e784e9676..6dbfb74b0 100755 --- a/pcmdi_metrics/mean_climate/mean_climate_driver.py +++ b/pcmdi_metrics/mean_climate/mean_climate_driver.py @@ -63,15 +63,12 @@ first_realization_only = False if realization is None: realization = "" - realizations = [realization] elif isinstance(realization, str): if realization.lower() in ["all", "*"]: find_all_realizations = True - realizations = "Search for all realizations!!" elif realization.lower() in ["first", "first_only"]: first_realization_only = True - else: - realizations = [realization] +realizations = [realization] if debug: print('regions_specs (before loading internally defined):', regions_specs) From cb5cb43b2cb30a67497995ace11a3c4da6fcaa42 Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 22:07:35 -0700 Subject: [PATCH 06/10] fix typo --- pcmdi_metrics/mean_climate/mean_climate_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/mean_climate_driver.py b/pcmdi_metrics/mean_climate/mean_climate_driver.py index 6dbfb74b0..58d34cea3 100755 --- a/pcmdi_metrics/mean_climate/mean_climate_driver.py +++ b/pcmdi_metrics/mean_climate/mean_climate_driver.py @@ -218,7 +218,7 @@ realizations.append(ncfile.split('/')[-1].split('.')[3]) realizations = sort_human(realizations) if first_realization_only: - realizations == realizations[0:1] + realizations = realizations[0:1] print('realizations (after search): ', realizations) for run in realizations: From 2337f5cee516c4a78d7e35756fb0d1e9f045ceaa Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 22:08:24 -0700 Subject: [PATCH 07/10] consider difference in plev key value --- .../mean_climate/lib/load_and_regrid.py | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py index 1333804ca..594473e07 100644 --- a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py +++ b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py @@ -58,9 +58,27 @@ def load_and_regrid(data_path, varname, varname_in_file=None, level=None, t_grid if 'plev' in list(ds.coords.keys()): if ds.plev.units == 'Pa': level = level * 100 # hPa to Pa - ds = ds.sel(plev=level) + try: + ds = ds.sel(plev=level) + except Exception as ex: + print('WARNING: ', ex) + + nearest_level = find_nearest(ds.plev.values, level) + + print(' Given level', level) + print(' Selected nearest level from dataset:', nearest_level) + + diff_percentage = abs(nearest_level - level) / level * 100 + if diff_percentage < 0.1: # acceptable if differance is less than 0.1% + ds = ds.sel(plev=level, method='nearest') + print(' Difference is in acceptable range.') + pass + else: + print('ERROR: Difference between two levels are too big!') + return if debug: print('ds:', ds) + print('ds.plev.units:', ds.plev.units) else: print('ERROR: plev is not in the nc file. Check vertical coordinate.') print('Coordinates keys in the nc file:', list(ds.coords.keys())) @@ -90,3 +108,10 @@ def load_and_regrid(data_path, varname, varname_in_file=None, level=None, t_grid if debug: print('ds_regridded:', ds_regridded) return ds_regridded + + +def find_nearest(array, value): + array = np.asarray(array) + idx = (np.abs(array - value)).argmin() + return array[idx] + From cde0d135716556499d728013b34f955e5cc0dbbe Mon Sep 17 00:00:00 2001 From: lee1043 Date: Wed, 23 Aug 2023 22:10:39 -0700 Subject: [PATCH 08/10] improve error message --- pcmdi_metrics/mean_climate/lib/load_and_regrid.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py index 594473e07..b09c963c2 100644 --- a/pcmdi_metrics/mean_climate/lib/load_and_regrid.py +++ b/pcmdi_metrics/mean_climate/lib/load_and_regrid.py @@ -81,7 +81,8 @@ def load_and_regrid(data_path, varname, varname_in_file=None, level=None, t_grid print('ds.plev.units:', ds.plev.units) else: print('ERROR: plev is not in the nc file. Check vertical coordinate.') - print('Coordinates keys in the nc file:', list(ds.coords.keys())) + print(' Coordinates keys in the nc file:', list(ds.coords.keys())) + print('ERROR: load and regrid can not complete') return # regrid From 2fe0fda72b88648c9dbe24a7dd0b069e64bd280c Mon Sep 17 00:00:00 2001 From: lee1043 Date: Thu, 24 Aug 2023 10:55:18 -0700 Subject: [PATCH 09/10] add more regions for mean climate --- pcmdi_metrics/io/default_regions_define.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pcmdi_metrics/io/default_regions_define.py b/pcmdi_metrics/io/default_regions_define.py index 4511e2c43..a3654e6c2 100755 --- a/pcmdi_metrics/io/default_regions_define.py +++ b/pcmdi_metrics/io/default_regions_define.py @@ -5,25 +5,29 @@ def load_regions_specs(): regions_specs = { # Mean Climate + "global": {}, "NHEX": {"domain": {"latitude": (30.0, 90)}}, "SHEX": {"domain": {"latitude": (-90.0, -30)}}, "TROPICS": {"domain": {"latitude": (-30.0, 30)}}, - "global": {}, "90S50S": {"domain": {"latitude": (-90.0, -50)}}, "50S20S": {"domain": {"latitude": (-50.0, -20)}}, "20S20N": {"domain": {"latitude": (-20.0, 20)}}, "20N50N": {"domain": {"latitude": (20.0, 50)}}, "50N90N": {"domain": {"latitude": (50.0, 90)}}, + "CONUS": {"domain": {"latitude": (24.7, 49.4), "longitude": (-124.78, -66.92)}}, + "land": {"value": 100}, "land_NHEX": {"value": 100, "domain": {"latitude": (30.0, 90)}}, "land_SHEX": {"value": 100, "domain": {"latitude": (-90.0, -30)}}, "land_TROPICS": {"value": 100, "domain": {"latitude": (-30.0, 30)}}, - "land": {"value": 100}, + "land_CONUS": {"value": 100, "domain": {"latitude": (24.7, 49.4), "longitude": (-124.78, -66.92)}}, + "ocean": {"value": 0}, "ocean_NHEX": {"value": 0, "domain": {"latitude": (30.0, 90)}}, "ocean_SHEX": {"value": 0, "domain": {"latitude": (-90.0, -30)}}, "ocean_TROPICS": {"value": 0, "domain": {"latitude": (30.0, 30)}}, - "ocean": {"value": 0}, - "CONUS": {"domain": {"latitude": (24.7, 49.4), "longitude": (-124.78, -66.92)}}, - "land_CONUS": {"value": 100, "domain": {"latitude": (24.7, 49.4), "longitude": (-124.78, -66.92)}}, + "ocean_50S50N" : {"value":0.,'domain': {latitude=(-50.,50)}}, + "ocean_50S20S" : {"value":0.,'domain': {latitude=(-50.,-20)}}, + "ocean_20S20N": {"value":0.,'domain': {latitude=(-20.,20)}}, + "ocean_20N50N" : {"value":0.,'domain': {latitude=(20.,50)}}, # Modes of variability "NAM": {"domain": {"latitude": (20.0, 90), "longitude": (-180, 180)}}, "NAO": {"domain": {"latitude": (20.0, 80), "longitude": (-90, 40)}}, From b128ded8dd6476babfaa35e18c217ab9bad77f24 Mon Sep 17 00:00:00 2001 From: lee1043 Date: Mon, 18 Sep 2023 19:05:55 -0700 Subject: [PATCH 10/10] typo fix --- pcmdi_metrics/io/default_regions_define.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pcmdi_metrics/io/default_regions_define.py b/pcmdi_metrics/io/default_regions_define.py index a3654e6c2..b5362a2a7 100755 --- a/pcmdi_metrics/io/default_regions_define.py +++ b/pcmdi_metrics/io/default_regions_define.py @@ -24,10 +24,10 @@ def load_regions_specs(): "ocean_NHEX": {"value": 0, "domain": {"latitude": (30.0, 90)}}, "ocean_SHEX": {"value": 0, "domain": {"latitude": (-90.0, -30)}}, "ocean_TROPICS": {"value": 0, "domain": {"latitude": (30.0, 30)}}, - "ocean_50S50N" : {"value":0.,'domain': {latitude=(-50.,50)}}, - "ocean_50S20S" : {"value":0.,'domain': {latitude=(-50.,-20)}}, - "ocean_20S20N": {"value":0.,'domain': {latitude=(-20.,20)}}, - "ocean_20N50N" : {"value":0.,'domain': {latitude=(20.,50)}}, + "ocean_50S50N" : {"value":0.,'domain': {"latitude": (-50., 50)}}, + "ocean_50S20S" : {"value":0.,'domain': {"latitude": (-50., -20)}}, + "ocean_20S20N": {"value":0.,'domain': {"latitude": (-20., 20)}}, + "ocean_20N50N" : {"value":0.,'domain': {"latitude": (20., 50)}}, # Modes of variability "NAM": {"domain": {"latitude": (20.0, 90), "longitude": (-180, 180)}}, "NAO": {"domain": {"latitude": (20.0, 80), "longitude": (-90, 40)}},