diff --git a/CHANGELOG.md b/CHANGELOG.md index ea0abd7..1312566 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added remapping for GEOS-IT restarts - Added new res C1120 - NOTE: If running on SLES15 remap tests will not be zero diff for GOCART RST but are zero diff for all other -- Add support for v13 BCs +- Add support for v14 BCs ### Changed diff --git a/pre/remap_restart/remap_command_line.py b/pre/remap_restart/remap_command_line.py index bfa6a7c..0de66ba 100755 --- a/pre/remap_restart/remap_command_line.py +++ b/pre/remap_restart/remap_command_line.py @@ -102,14 +102,14 @@ def get_answers_from_command_line(cml): init_merra2(answers) elif cml.geosit: init_geosit(answers) - else: + else: answers["input:shared:bc_base"] = cml.in_bc_base answers["input:shared:omodel"] = cml.ocnmdlin answers["input:shared:bc_version"] = cml.bcvin answers["input:surface:catch_model"]= cml.catch_model answers["input:shared:stretch"] = cml.in_stretch answers["input:shared:rst_dir"] = os.path.abspath(os.path.expanduser(cml.rst_dir)) - fvcore_info(answers) + fvcore_info(answers) ogrid = cml.oceanin if ogrid == "CS": ogrid = answers["input:shared:agrid"] diff --git a/pre/remap_restart/remap_lake_landice_saltwater.py b/pre/remap_restart/remap_lake_landice_saltwater.py index a687132..c502b1c 100755 --- a/pre/remap_restart/remap_lake_landice_saltwater.py +++ b/pre/remap_restart/remap_lake_landice_saltwater.py @@ -138,7 +138,7 @@ def remap(self): zoom = config['input']['surface']['zoom'] if zoom is None : zoom = get_zoom(config) - + log_name = out_dir+'/remap_lake_landice_saltwater_log' if os.path.exists(log_name): os.remove(log_name) @@ -146,11 +146,11 @@ def remap(self): if (saltwater_internal): cmd = exe + out_til + ' ' + in_til + ' InData/'+ saltwater_internal + ' 0 ' + str(zoom) self.run_and_log(cmd, log_name) - + # split Saltwater Internal # NOTE: split_saltwater==True means that the input restarts are already split. # So we do not split them again. - if not config['output']['surface']['split_saltwater']: + if not config['input']['surface']['split_saltwater']: print("\nSplitting Saltwater Internal...\n") cmd = bindir+'/SaltIntSplitter.x ' + out_til + ' ' + 'OutData/' + saltwater_internal # subprocess.call(shlex.split(cmd)) @@ -158,6 +158,13 @@ def remap(self): seaice = '' self.run_and_log(cmd, log_name) + # We can now *remove* the unsplit saltwater internal restart to avoid confusion + unsplit_file = 'OutData/' + saltwater_internal + if os.path.exists(unsplit_file): + print('\n Removing unsplit saltwater internal restart: ' + unsplit_file + '\n') + os.remove(unsplit_file) + + if (saltwater_import): cmd = exe + out_til + ' ' + in_til + ' InData/'+ saltwater_import + ' 0 ' + str(zoom) self.run_and_log(cmd, log_name) @@ -165,7 +172,7 @@ def remap(self): # split Saltwater Import # NOTE: split_saltwater==True means that the input restarts are already split. # So we do not split them again. - if not config['output']['surface']['split_saltwater']: + if not config['input']['surface']['split_saltwater']: print("\nSplitting Saltwater Import...\n") cmd = bindir+'/SaltIntSplitter.x ' + out_til + ' ' + 'OutData/' + saltwater_import # subprocess.call(shlex.split(cmd)) @@ -173,6 +180,7 @@ def remap(self): seaice = '' self.run_and_log(cmd, log_name) + if (openwater): cmd = exe + out_til + ' ' + in_til + ' InData/' + openwater + ' 0 ' + str(zoom) self.run_and_log(cmd, log_name) diff --git a/pre/remap_restart/remap_questions.py b/pre/remap_restart/remap_questions.py index 10fff47..05ab180 100755 --- a/pre/remap_restart/remap_questions.py +++ b/pre/remap_restart/remap_questions.py @@ -292,7 +292,7 @@ def ask_questions(): "name": "output:shared:bc_version", "message": message_bc_ops_new, "choices": choices_bc_ops, - "default": "v13", + "default": "v12", "when": lambda x: x["input:shared:MERRA-2"] or x["input:shared:GEOS-IT"], }, @@ -301,7 +301,7 @@ def ask_questions(): "name": "output:shared:bc_version", "message": "Select BCs version for new restarts:\n", "choices": choices_bc_ops, - "default": "v13", + "default": "v12", "when": lambda x: not x["input:shared:MERRA-2"] and not x["input:shared:GEOS-IT"], }, @@ -310,7 +310,7 @@ def ask_questions(): "name": "output:shared:bc_version", "message": message_bc_other_new, "choices": choices_bc_other, - "when": lambda x: x["output:shared:bc_version"] == 'Other' and x["input:shared:bc_version"] not in ['v06','v11','v12','GM4'], + "when": lambda x: x["output:shared:bc_version"] == 'Other' and x["input:shared:bc_version"] not in ['v06','v11','v12','v14','GM4'], }, { @@ -318,7 +318,7 @@ def ask_questions(): "name": "output:shared:bc_version", "message": "\nSelect BCs version for new restarts:\n", "choices": choices_bc_other, - "when": lambda x: x["output:shared:bc_version"] == 'Other' and x["input:shared:bc_version"] in ['v06','v11','v12','GM4'], + "when": lambda x: x["output:shared:bc_version"] == 'Other' and x["input:shared:bc_version"] in ['v06','v11','v12','v14','GM4'], }, { @@ -453,7 +453,7 @@ def ask_questions(): "name": "slurm_pbs:reservation", "message": message_reservation, "default": "", - }, + }, { "type": "text", "name": "slurm_pbs:partition", diff --git a/pre/remap_restart/remap_utils.py b/pre/remap_restart/remap_utils.py index 67a7594..661e199 100755 --- a/pre/remap_restart/remap_utils.py +++ b/pre/remap_restart/remap_utils.py @@ -13,6 +13,7 @@ import shlex import netCDF4 as nc import linecache +import re # shared global variables @@ -29,11 +30,11 @@ # define "choices", "message" strings, and "validate" lists that are used multiple times # (and related definitions, even if they are used just once). -choices_bc_ops = ['v13', 'NL3', 'ICA', 'Other'] +choices_bc_ops = ['v12', 'NL3', 'ICA', 'Other'] -choices_bc_other = ['v06','v11','v12','GM4'] +choices_bc_other = ['v06','v11','v14','GM4'] -choices_bc_cmd = ['NL3', 'ICA', 'GM4', 'v06', 'v11','v12', 'v13'] +choices_bc_cmd = ['NL3', 'ICA', 'GM4', 'v06', 'v11','v12', 'v14'] choices_omodel = ['data', 'MOM5', 'MOM6'] @@ -79,7 +80,7 @@ message_bc_ops = f'''\n BCs version | ADAS tags | GCM tags typically used with BCs version -----------------|----------------------|----------------------------------------- - v13: v13 | future | 12.0 ... present + v12: v12 | future | 12.0 ... present NL3: Icarus-NLv3 | 5_25_1 ... present | Icarus_NL, 10.19 ... 11.7 ICA: Icarus | 5_17_0 ... 5_24_0_p1 | Icarus, Jason ... 10.18 ---------------------------------------------------------------------------------- @@ -88,11 +89,16 @@ message_bc_ops_in = ("Select boundary conditions (BCs) version of input restarts:\n" + message_bc_ops) message_bc_ops_new = ("Select boundary conditions (BCs) version for new restarts:\n" + message_bc_ops) +# v12 used to be in the "other" section but is now the default, but we preserve this information +# in a comment since v14 will probably soon be the new default and we'll want to move v12 back to "other". +#v12: NL3 + JPL veg height + PEATMAP + MODIS snow alb v2 + Argentina peatland fix \n + message_bc_other = f'''\n - v06: NL3 + JPL veg height + PEATMAP + MODIS snow alb - v11: NL3 + JPL veg height + PEATMAP + MODIS snow alb v2 - v12: NL3 + JPL veg height + PEATMAP + MODIS snow alb v2 + Argentina peatland fix - GM4: Ganymed-4_0\n'''\ + + v06: NL3 + JPL veg height + PEATMAP + MODIS snow alb\n + v11: NL3 + JPL veg height + PEATMAP + MODIS snow alb v2\n + v14: v12 + Coupled MOM6/v2 ocean bathymetry (OM4) and v2 topography for atmosphere \n + GM4: Ganymed-4_0\n\n'''\ message_bc_other_in = ("Select BCs version of input restarts:\n" + message_bc_other) message_bc_other_new = ("Select BCs version for new restarts:\n" + message_bc_other) @@ -345,7 +351,7 @@ def show_wemin_default(x): return True def get_zoom(x): - # "zoom" approximates the (integer) number of grid cells per degree lat or lon (min=1, max=8); + # "zoom" approximates the (integer) number of grid cells per degree lat or lon (min=1, max=8); # for EASEv2 grid and lat/lon grid, always use the default value of 8. zoom_ = '8' if x.get('input:shared:MERRA-2') or x.get('input:shared:GEOS-IT'): @@ -581,9 +587,16 @@ def get_config_from_answers(answers, config_tpl = False): if len(keys) == 3: config[keys[0]][keys[1]][keys[2]] = value - bc_version = config['output']['shared'].get('bc_version') + # Do the inputs have a split saltwater? + input_bc_version = config['input']['shared'].get('bc_version') + config['input']['surface']['split_saltwater'] = True + if 'Ganymed' in input_bc_version or 'GM4' in input_bc_version: + config['input']['surface']['split_saltwater'] = False + + # Do the outputs need a split saltwater? + output_bc_version = config['output']['shared'].get('bc_version') config['output']['surface']['split_saltwater'] = True - if 'Ganymed' in bc_version : + if 'Ganymed' in output_bc_version or 'GM4' in output_bc_version: config['output']['surface']['split_saltwater'] = False return config @@ -628,16 +641,29 @@ def get_default_bc_base(): return choices_bc_base[0] return choices_bc_base[1] + def get_topodir(bc_base, bc_version, agrid=None, ogrid=None, omodel=None, stretch=None): - gridStr = get_resolutions(agrid=agrid, ogrid=ogrid, omodel=omodel,stretch=stretch) - agrid_name = gridStr.split('_')[0] - bc_topo = '' - if 'GM4' == bc_version: - bc_topo = bc_base + '/' + bc_version + '/TOPO/TOPO_' + agrid_name - else: - bc_topo = bc_base + '/' + bc_version + '/TOPO/TOPO_' + agrid_name + '/smoothed' + gridStr = get_resolutions(agrid=agrid, ogrid=ogrid, omodel=omodel, stretch=stretch) + agrid_name = gridStr.split('_')[0] + + v = str(bc_version).strip().upper() + + # GM4 stays on legacy tiles tree + if v.startswith('GM4'): + return os.path.join(str(bc_base), 'GM4', 'TOPO', f'TOPO_{agrid_name}') + + # v2 from v14+, else v1 + m = re.search(r'(\d+)', v) + ver_num = int(m.group(1)) if m else None + stream = 'v2' if (ver_num is not None and ver_num >= 14) else 'v1' + + # Derive new topo base from bc_base; fallback to default if pattern not found + bc_base_str = str(bc_base or '') + topo_base = re.sub(r'/fvInput/ExtData/esm/tiles/?$', '/make_bcs_inputs/atmosphere', bc_base_str) + if topo_base == bc_base_str or not topo_base: + topo_base = '/discover/nobackup/projects/gmao/bcs_shared/make_bcs_inputs/atmosphere' - return bc_topo + return os.path.join(topo_base, 'TOPO', stream, agrid_name, 'smoothed') def get_landdir(bc_base, bc_version, agrid=None, ogrid=None, omodel=None, stretch=None, grid=None): gridStr = get_resolutions(agrid=agrid, ogrid=ogrid, omodel=omodel,stretch=stretch, grid=grid)