Source code for compass.ocean.tests.global_ocean.files_for_e3sm.e3sm_to_cmip_maps

import os

from mpas_tools.logging import check_call

from import symlink
from compass.ocean.tests.global_ocean.files_for_e3sm.files_for_e3sm_step import (  # noqa: E501

[docs] class E3smToCmipMaps(FilesForE3SMStep): """ A step for creating mapping files from the MPAS-Ocean mesh to a standard CMIP6 mesh Attributes ---------- map_types : list A list of map types to generate """
[docs] def __init__(self, test_case): """ Create a new step Parameters ---------- test_case : compass.ocean.tests.global_ocean.files_for_e3sm.FilesForE3SM The test case this step belongs to """ # noqa: E501 super().__init__(test_case, name='e3sm_to_cmip_maps', ntasks=36, min_tasks=1) self.add_input_file(filename='', target='../scrip/') # add both scrip files, since we don't know in advance which to use self.add_input_file( filename='', target='', database='map_database') self.add_input_file( filename='', target='', database='map_database') self.map_types = ['esmfaave', 'ncoaave', 'traave', 'trfv2', 'esmfbilin', 'ncoidw', 'trbilin', 'trintbilin'] for map_type in self.map_types: filename = f'map_mpas_to_cmip6_{map_type}.nc' self.add_output_file(filename=filename)
[docs] def run(self): """ Run this step of the testcase """ super().run() creation_date = self.creation_date make_e3sm_to_cmip_maps(self.config, self.logger, self.mesh_short_name, creation_date, self.ntasks, self.map_types)
def make_e3sm_to_cmip_maps(config, logger, mesh_short_name, creation_date, ntasks, map_types): """ Make mapping file from the MPAS-Ocean mesh to the CMIP6 grid Parameters ---------- config : compass.config.CompassConfigParser Configuration options for this test case logger : logging.Logger A logger for output from the step mesh_short_name : str The E3SM short name of the mesh creation_date : str The date to append to the mapping files ntasks : int The number of parallel tasks to use for remapping map_types : list A list of one or more of the available map types: 'esmfaave', 'ncoaave', 'traave', 'trfv2', 'esmfbilin', 'ncoidw', 'trbilin', 'trintbilin' """ link_dir = '../assembled_files/diagnostics/maps' try: os.makedirs(link_dir) except FileExistsError: pass src_scrip_filename = '' cmip6_grid_res = config.get('files_for_e3sm', 'cmip6_grid_res') if cmip6_grid_res == '180x360': dst_scrip_filename = '' elif cmip6_grid_res == '720x1440': dst_scrip_filename = '' else: raise ValueError(f'Unexpected cmip6_grid_res: {cmip6_grid_res}') parallel_executable = config.get('parallel', 'parallel_executable') # split the parallel executable into constituents in case it includes flags parallel_command = parallel_executable.split(' ') parallel_system = config.get('parallel', 'system') if parallel_system == 'slurm': parallel_command.extend(['-n', f'{ntasks}']) elif parallel_system == 'single_node': if ntasks > 1: parallel_command.extend(['-n', f'{ntasks}']) else: raise ValueError(f'Unexpected parallel system: {parallel_system}') parallel_command = ' '.join(parallel_command) for map_type in map_types: local_map_filename = f'map_mpas_to_cmip6_{map_type}.nc' args = ['ncremap', f'--mpi_pfx={parallel_command}', f'--alg_typ={map_type}', f'--grd_src={src_scrip_filename}', f'--grd_dst={dst_scrip_filename}', f'--map={local_map_filename}'] check_call(args, logger=logger) map_filename = \ f'map_{mesh_short_name}_to_cmip6_{cmip6_grid_res}_{map_type}.' \ f'{creation_date}.nc' symlink(os.path.abspath(local_map_filename), f'{link_dir}/{map_filename}')