def _extrap_model(config, modelFolder): resExtrap = get_res(config, extrap=True) resFinal = get_res(config, extrap=False) hres = get_horiz_res(config) modelName = config.get('model', 'name') inFileName = '{}/{}_temperature_{}.nc'.format(modelFolder, modelName, resExtrap) bedMaskFileName = '{}/bed_mask_{}.nc'.format(modelFolder, resExtrap) bedFileName = 'bedmap2/bedmap2_{}.nc'.format(hres) basinNumberFileName = 'imbie/basinNumbers_{}.nc'.format(hres) make_3D_bed_mask(inFileName, bedMaskFileName, bedFileName) for fieldName in ['temperature', 'salinity']: inFileName = '{}/{}_{}_{}.nc'.format(modelFolder, modelName, fieldName, resExtrap) outFileName = '{}/{}_{}_{}_extrap_horiz.nc'.format( modelFolder, modelName, fieldName, resExtrap) progressDir = '{}/progress_{}'.format(modelFolder, fieldName) matrixDir = '{}/matrices'.format(modelName.lower()) extrap_horiz(config, inFileName, outFileName, fieldName, bedFileName, basinNumberFileName, bedMaskFileName, progressDir, matrixDir) for fieldName in ['temperature', 'salinity']: inFileName = '{}/{}_{}_{}_extrap_horiz.nc'.format( modelFolder, modelName, fieldName, resExtrap) outFileName = '{}/{}_{}_{}_extrap_vert.nc'.format( modelFolder, modelName, fieldName, resExtrap) extrap_vert(config, inFileName, outFileName, fieldName) inFileNames = {} outFileNames = {} for fieldName in ['temperature', 'salinity']: inFileNames[fieldName] = '{}/{}_{}_{}_extrap_vert.nc'.format( modelFolder, modelName, fieldName, resExtrap) outFileNames[fieldName] = '{}/{}_{}_{}_extrap_vert.nc'.format( modelFolder, modelName, fieldName, resFinal) remap_vertical(config, inFileNames, outFileNames, extrap=False) for fieldName in ['temperature', 'salinity']: inFileName = '{}/{}_{}_{}_extrap_vert.nc'.format( modelFolder, modelName, fieldName, resFinal) outFileName = '{}/{}_{}_{}.nc'.format(modelFolder, modelName, fieldName, resFinal) progressDir = '{}/progress_{}'.format(modelFolder, fieldName) matrixDir = '{}/matrices'.format(modelName.lower()) extrap_grounded_above_sea_level(config, inFileName, outFileName, fieldName, progressDir, matrixDir)
def make_imbie_masks(config): ''' Download geojson files defining IMBIE basins and create masks that extend these basins into the open ocean ''' res = get_horiz_res(config) try: os.makedirs('imbie') except OSError: pass if os.path.exists('imbie/basinNumbers_{}.nc'.format(res)): # we're already done return print('Building IMBIE basin masks...') basins = { 'A-Ap': ['A-Ap'], 'Ap-B': ['Ap-B'], 'B-C': ['B-C'], 'C-Cp': ['C-Cp'], 'Cp-D': ['Cp-D'], 'D-Dp': ['D-Dp'], 'Dp-E': ['Dp-E'], 'E-F': ['E-Ep', 'Ep-F'], 'F-G': ['F-G'], 'G-H': ['G-H'], 'H-Hp': ['H-Hp'], 'Hp-I': ['Hp-I'], 'I-Ipp': ['I-Ipp'], 'Ipp-J': ['Ipp-J'], 'J-K': ['J-Jpp', 'Jpp-K'], 'K-A': ['K-A'] } bedFileName = 'bedmap2/bedmap2_{}.nc'.format(res) _download_imbie() images.write_basin_images(res, bedFileName, basins) extend.extend_imbie_masks(res, basins, bedFileName) print(' Done.')
def _remap(config, decades): res = get_res(config) hres = get_horiz_res(config) bothExist = True for fieldName in ['temperature', 'salinity']: outFileName = 'woa/woa_{}_{}_{}.nc'.format(fieldName, decades, res) if not os.path.exists(outFileName): bothExist = False break if bothExist: return print(' Remapping to {} grid...'.format(res)) for fieldName in ['temperature', 'salinity']: inFileName = 'woa/woa18_{}_{}_interp_z.nc'.format(decades, fieldName) outGridFileName = 'ismip6/{}_grid.nc'.format(hres) outFileName = 'woa/woa_{}_{}_{}.nc'.format(fieldName, decades, res) if os.path.exists(outFileName): continue print(' {}'.format(outFileName)) varName = fieldName inDescriptor = get_lat_lon_descriptor(inFileName) outDescriptor = get_antarctic_descriptor(outGridFileName) mappingFileName = 'woa/map_{}_to_{}.nc'.format(inDescriptor.meshName, outDescriptor.meshName) remapper = Remapper(inDescriptor, outDescriptor, mappingFileName) remapper.build_mapping_file(method='bilinear') ds = xarray.open_dataset(inFileName) ds = ds.rename({varName: fieldName}) dsOut = remapper.remap(ds, renormalizationThreshold=0.1) for attrName in ['units', 'standard_name', 'long_name']: dsOut[fieldName].attrs[attrName] = ds[fieldName].attrs[attrName] dsOut.z.attrs = ds.z.attrs dsOut.to_netcdf(outFileName)
def bedmap2_to_ismip6_grid(config): try: os.makedirs('bedmap2') except OSError: pass try: os.makedirs('ismip6') except OSError: pass res = get_horiz_res(config) inFileName = 'bedmap2/bedmap2.nc' outGridFileName = 'ismip6/{}_grid.nc'.format(res) outFileName = 'bedmap2/bedmap2_{}.nc'.format(res) _bedmap2_bin_to_netcdf(inFileName) _write_ismip6_grid(config, outGridFileName) _remap(inFileName, outGridFileName, outFileName, res)
def extrap_obs(config, decades): resExtrap = get_res(config, extrap=True) resFinal = get_res(config, extrap=False) hres = get_horiz_res(config) inFileName = f'obs/obs_temperature_{decades}_{resExtrap}.nc' bedMaskFileName = f'obs/bed_mask_{resExtrap}.nc' bedFileName = f'bedmap2/bedmap2_{hres}.nc' basinNumberFileName = f'imbie/basinNumbers_{hres}.nc' make_3D_bed_mask(inFileName, bedMaskFileName, bedFileName) matrixDirs = dict() progressDirs = dict() for fieldName in ['temperature', 'salinity']: progressDirs[fieldName] = f'obs/progress_{fieldName}' matrixDirs[fieldName] = f'obs/matrices_{fieldName}' for fieldName in ['temperature', 'salinity']: progressDir = progressDirs[fieldName] matrixDir = matrixDirs[fieldName] inFileName = f'{progressDir}/obs_{fieldName}_{decades}_{resExtrap}.nc' outFileName = f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resExtrap}_extrap_horiz.nc' extrap_horiz(config, inFileName, outFileName, fieldName, bedFileName, basinNumberFileName, bedMaskFileName, progressDir, matrixDir) for fieldName in ['temperature', 'salinity']: progressDir = progressDirs[fieldName] inFileName = f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resExtrap}_extrap_horiz.nc' outFileName = f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resExtrap}_extrap_vert.nc' extrap_vert(config, inFileName, outFileName, fieldName) tempFileName = \ f'{progressDir}/obs_temperature_{decades}_{resExtrap}_extrap_vert.nc' salinFileName = \ f'{progressDir}/obs_salinity_{decades}_{resExtrap}_extrap_vert.nc' outFileName = \ f'{progressDir}/' \ f'obs_thermal_forcing_{decades}_{resExtrap}_extrap_vert.nc' compute_thermal_forcing(tempFileName, salinFileName, outFileName) inFileNames = {} outFileNames = {} for fieldName in ['temperature', 'salinity']: progressDir = progressDirs[fieldName] inFileNames[fieldName] = \ f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resExtrap}_extrap_vert.nc' outFileNames[fieldName] = \ f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resFinal}_extrap_vert.nc' remap_vertical(config, inFileNames, outFileNames, extrap=False) for fieldName in ['temperature', 'salinity']: progressDir = progressDirs[fieldName] matrixDir = matrixDirs[fieldName] inFileName = f'{progressDir}/' \ f'obs_{fieldName}_{decades}_{resFinal}_extrap_vert.nc' outFileName = f'obs/obs_{fieldName}_{decades}_{resFinal}.nc' extrap_grounded_above_sea_level(config, inFileName, outFileName, fieldName, progressDir, matrixDir)
def _bin_en4(config, inVarName, outVarName, startYear, endYear): hres = get_horiz_res(config) dz = config.getfloat('grid', 'dzExtrap') nz = config.getint('grid', 'nzExtrap') zOut = dz*numpy.arange(nz+1) z = 0.5*(zOut[0:-1] + zOut[1:]) z_bnds = numpy.zeros((len(z), 2)) z_bnds[:, 0] = zOut[0:-1] z_bnds[:, 1] = zOut[1:] ds = xarray.open_dataset('ismip6/{}_grid.nc'.format(hres)) ds['z'] = (('z',), z) ds.z.attrs['units'] = 'meters' ds.z.attrs['bounds'] = 'z_bnds' ds.z.attrs['standard_name'] = 'depth' ds.z.attrs['positive'] = 'up' ds.z.attrs['axis'] = 'Z' ds['z_bnds'] = (('z', 'nbounds'), z_bnds) ds.z_bnds.attrs['comment'] = 'depth bounds' xMin = ds.x[0].values yMin = ds.y[0].values zMin = z[0] dx = ds.x[1].values - ds.x[0].values nx = ds.sizes['x'] ny = ds.sizes['y'] nz = ds.sizes['z'] outField = numpy.zeros((nz, ny, nx)) entryCount = numpy.zeros((nz, ny, nx), dtype=int) attrs = None proj = get_antarctic_stereographic_projection() X, Y = numpy.meshgrid(ds.x.values, ds.y.values) Lon, Lat = proj(X, Y, inverse=True) ds['lon'] = (('y', 'x'), Lon) ds.lon.attrs['units'] = 'degrees' ds['lat'] = (('y', 'x'), Lat) ds.lat.attrs['units'] = 'degrees' fileList = sorted(glob.glob('en4/profiles/*.nc')) print(' Binning EN4 {} profiles...'.format(outVarName)) widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA()] bar = progressbar.ProgressBar(widgets=widgets, maxval=len(fileList)).start() for index, fileName in enumerate(fileList): dsProfile = xarray.open_dataset(fileName) lat = dsProfile.LATITUDE.values lon = dsProfile.LONGITUDE.values inField = dsProfile['{}_CORRECTED'.format(inVarName)].values quality = dsProfile['{}_CORRECTED_QC'.format(inVarName)].values if attrs is None: attrs = dsProfile['{}_CORRECTED'.format(inVarName)].attrs x, y = proj(lon, lat) depths = dsProfile.DEPH_CORRECTED.values lat = numpy.maximum(lat, -75.) for profile in range(depths.shape[0]): xBin = int((x[profile]-xMin)/dx) yBin = int((y[profile]-yMin)/dx) if xBin < 0 or xBin >= nx: continue if yBin < 0 or yBin >= ny: continue for level in range(depths.shape[1]): if quality[profile, level] != b'1': continue depth = depths[profile, level] if numpy.isnan(depth): continue zBin = int((depth-zMin)/dz) if zBin < 0 or zBin >= nz: continue outField[zBin, yBin, xBin] += inField[profile, level] entryCount[zBin, yBin, xBin] += 1 bar.update(index+1) bar.finish() mask = entryCount > 0 outField[mask] /= entryCount[mask] outField[numpy.logical_not(mask)] = numpy.nan ds[outVarName] = (('z', 'y', 'x'), outField) for attr in ['units', 'long_name', 'comment']: ds[outVarName].attrs[attr] = attrs[attr] return ds
def _remap(config, modelFolder): res = get_res(config) hres = get_horiz_res(config) modelName = config.get('model', 'name') inFileNames = {} outFileNames = {} bothExist = True for fieldName in ['temperature', 'salinity']: inFileNames[fieldName] = \ '{}/{}_{}_interp_z.nc'.format(modelFolder, modelName, fieldName) outFileNames[fieldName] = \ '{}/{}_{}_{}.nc'.format(modelFolder, modelName, fieldName, res) if not os.path.exists(outFileNames[fieldName]): bothExist = False if bothExist: return print(' Remapping to {} grid...'.format(res)) for fieldName in inFileNames: inFileName = inFileNames[fieldName] outFileName = outFileNames[fieldName] if os.path.exists(outFileName): continue outGridFileName = 'ismip6/{}_grid.nc'.format(hres) print(' {}'.format(outFileName)) progressDir = '{}/progress_remap_{}'.format(modelFolder, fieldName) try: os.makedirs(progressDir) except OSError: pass ds = xarray.open_dataset(inFileName) if len(ds.lon.dims) == 1: inDescriptor = LatLonGridDescriptor.read( inFileName, latVarName='lat', lonVarName='lon') else: assert(len(ds.lon.dims) == 2) inDescriptor = LatLon2DGridDescriptor.read( inFileName, latVarName='lat', lonVarName='lon') inDescriptor.regional = True outDescriptor = get_antarctic_descriptor(outGridFileName) mappingFileName = '{}/map_{}_to_{}.nc'.format( modelName.lower(), inDescriptor.meshName, outDescriptor.meshName) remapper = Remapper(inDescriptor, outDescriptor, mappingFileName) remapper.build_mapping_file(method='bilinear') ds = ds.drop(['lat', 'lon']) nt = ds.sizes['time'] widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA()] bar = progressbar.ProgressBar(widgets=widgets, maxval=nt).start() for tIndex in range(nt): progressFileName = '{}/{}_t_{}.nc'.format( progressDir, modelName, tIndex) if os.path.exists(progressFileName): bar.update(tIndex+1) continue dsIn = ds.isel(time=tIndex) dsOut = remapper.remap(dsIn, renormalizationThreshold=0.1) dsOut = dsOut.transpose('z', 'y', 'x') for attrName in ['units', 'standard_name', 'long_name']: if attrName in ds[fieldName].attrs: dsOut[fieldName].attrs[attrName] = \ ds[fieldName].attrs[attrName] dsOut.z.attrs = ds.z.attrs dsOut.to_netcdf(progressFileName) bar.update(tIndex+1) bar.finish() dsOut = xarray.open_mfdataset( '{}/{}_t_*.nc'.format(progressDir, modelName), concat_dim='time') dsOut['z_bnds'] = ds.z_bnds dsOut.to_netcdf(outFileName)
def _extrap_model(config, modelFolder): resExtrap = get_res(config, extrap=True) resFinal = get_res(config, extrap=False) hres = get_horiz_res(config) modelName = config.get('model', 'name') fields = config.get('model', 'fields') fields = fields.replace(',', ' ').split() basin = config.get('model', 'basin') combineBasins = config.getboolean('model', 'combineBasins') inFileName = f'{modelFolder}/remap/{modelName}_temperature_{resExtrap}.nc' bedMaskFileName = f'{modelFolder}/bed_mask_{resExtrap}.nc' bedFileName = f'bedmap2/bedmap2_{hres}.nc' basinNumberFileName = f'imbie/basinNumbers_{hres}.nc' make_3D_bed_mask(inFileName, bedMaskFileName, bedFileName) matrixDir = os.path.join(modelName.lower(), 'matrices') progressDirs = dict() for fieldName in fields: progressDirs[fieldName] = f'{modelFolder}/progress_{fieldName}' for fieldName in fields: progressDir = progressDirs[fieldName] inFileName = f'{modelFolder}/remap/' \ f'{modelName}_{fieldName}_{resExtrap}.nc' outFileName = f'{progressDir}/' \ f'{modelName}_{fieldName}_{resExtrap}_extrap_horiz.nc' extrap_horiz(config, inFileName, outFileName, fieldName, bedFileName, basinNumberFileName, bedMaskFileName, progressDir, matrixDir, basin=basin, combine=combineBasins) if not combineBasins: return for fieldName in fields: progressDir = progressDirs[fieldName] inFileName = f'{progressDir}/' \ f'{modelName}_{fieldName}_{resExtrap}_extrap_horiz.nc' outFileName = f'{progressDir}/' \ f'{modelName}_{fieldName}_{resExtrap}_extrap_vert.nc' extrap_vert(config, inFileName, outFileName, fieldName) inFileNames = {} outFileNames = {} for fieldName in fields: progressDir = progressDirs[fieldName] inFileNames[fieldName] = \ f'{progressDir}/' \ f'{modelName}_{fieldName}_{resExtrap}_extrap_vert.nc' outFileNames[fieldName] = \ f'{progressDir}/' \ f'{modelName}_{fieldName}_{resFinal}_extrap_vert.nc' remap_vertical(config, inFileNames, outFileNames, extrap=False) for fieldName in fields: progressDir = progressDirs[fieldName] inFileName = f'{progressDir}/' \ f'{modelName}_{fieldName}_{resFinal}_extrap_vert.nc' outFileName = f'{modelFolder}/{modelName}_{fieldName}_{resFinal}.nc' extrap_grounded_above_sea_level(config, inFileName, outFileName, fieldName, progressDir, matrixDir)
def extrap_obs(config, decades): resExtrap = get_res(config, extrap=True) resFinal = get_res(config, extrap=False) hres = get_horiz_res(config) inFileName = 'obs/obs_temperature_{}_{}.nc'.format(decades, resExtrap) bedMaskFileName = 'obs/bed_mask_{}.nc'.format(resExtrap) bedFileName = 'bedmap2/bedmap2_{}.nc'.format(hres) basinNumberFileName = 'imbie/basinNumbers_{}.nc'.format(hres) make_3D_bed_mask(inFileName, bedMaskFileName, bedFileName) for fieldName in ['temperature', 'salinity']: inFileName = 'obs/obs_{}_{}_{}.nc'.format(fieldName, decades, resExtrap) outFileName = 'obs/obs_{}_{}_{}_extrap_horiz.nc'.format( fieldName, decades, resExtrap) progressDir = 'obs/progress_{}'.format(fieldName) matrixDir = 'obs/matrices_{}'.format(fieldName) extrap_horiz(config, inFileName, outFileName, fieldName, bedFileName, basinNumberFileName, bedMaskFileName, progressDir, matrixDir) for fieldName in ['temperature', 'salinity']: inFileName = 'obs/obs_{}_{}_{}_extrap_horiz.nc'.format( fieldName, decades, resExtrap) outFileName = 'obs/obs_{}_{}_{}_extrap_vert.nc'.format( fieldName, decades, resExtrap) extrap_vert(config, inFileName, outFileName, fieldName) tempFileName = \ 'obs/obs_temperature_{}_{}_extrap_vert.nc'.format(decades, resExtrap) salinFileName = \ 'obs/obs_salinity_{}_{}_extrap_vert.nc'.format(decades, resExtrap) outFileName = \ 'obs/obs_thermal_forcing_{}_{}_extrap_vert.nc'.format(decades, resExtrap) compute_thermal_forcing(tempFileName, salinFileName, outFileName) inFileNames = {} outFileNames = {} for fieldName in ['temperature', 'salinity']: inFileNames[fieldName] = \ 'obs/obs_{}_{}_{}_extrap_vert.nc'.format( fieldName, decades, resExtrap) outFileNames[fieldName] = \ 'obs/obs_{}_{}_{}_extrap_vert.nc'.format( fieldName, decades, resFinal) remap_vertical(config, inFileNames, outFileNames, extrap=False) for fieldName in ['temperature', 'salinity']: inFileName = 'obs/obs_{}_{}_{}_extrap_vert.nc'.format( fieldName, decades, resFinal) outFileName = 'obs/obs_{}_{}_{}.nc'.format(fieldName, decades, resFinal) progressDir = 'obs/progress_{}'.format(fieldName) matrixDir = 'obs/matrices_{}'.format(fieldName) extrap_grounded_above_sea_level(config, inFileName, outFileName, fieldName, progressDir, matrixDir)
def _bin_meop(config, inVarName, outVarName): res = get_res(config) outFileName = 'meop/meop_{}_{}.nc'.format(outVarName, res) if os.path.exists(outFileName): return hres = get_horiz_res(config) dz = config.getfloat('grid', 'dzExtrap') nz = config.getint('grid', 'nzExtrap') zOut = dz*numpy.arange(nz+1) z = 0.5*(zOut[0:-1] + zOut[1:]) z_bnds = numpy.zeros((len(z), 2)) z_bnds[:, 0] = zOut[0:-1] z_bnds[:, 1] = zOut[1:] ds = xarray.open_dataset('ismip6/{}_grid.nc'.format(hres)) ds['z'] = (('z',), z) ds.z.attrs['units'] = 'meters' ds.z.attrs['bounds'] = 'z_bnds' ds.z.attrs['standard_name'] = 'depth' ds.z.attrs['positive'] = 'up' ds.z.attrs['axis'] = 'Z' ds['z_bnds'] = (('z', 'nbounds'), z_bnds) ds.z_bnds.attrs['comment'] = 'depth bounds' xMin = ds.x[0].values yMin = ds.y[0].values zMin = z[0] dx = ds.x[1].values - ds.x[0].values nx = ds.sizes['x'] ny = ds.sizes['y'] nz = ds.sizes['z'] outField = numpy.zeros((nz, ny, nx)) entryCount = numpy.zeros((nz, ny, nx), dtype=int) attrs = None proj = get_antarctic_stereographic_projection() fileList = sorted(glob.glob('meop/MEOP-CTD_2018-04-10/*/DATA_ncARGO/*.nc')) print(' Binning MEOP {} profiles...'.format(outVarName)) widgets = [' ', progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA()] bar = progressbar.ProgressBar(widgets=widgets, maxval=len(fileList)).start() for index, fileName in enumerate(fileList): dsProfile = xarray.open_dataset(fileName) lat = dsProfile.LATITUDE.values lon = dsProfile.LONGITUDE.values inField = dsProfile['{}_ADJUSTED'.format(inVarName)].values quality = dsProfile['{}_ADJUSTED_QC'.format(inVarName)].values if attrs is None: attrs = dsProfile[inVarName].attrs x, y = proj(lon, lat) pressure = dsProfile.PRES.values lat = numpy.maximum(lat, -75.) for profile in range(pressure.shape[0]): xBin = int((x[profile]-xMin)/dx) yBin = int((y[profile]-yMin)/dx) if xBin < 0 or xBin >= nx: continue if yBin < 0 or yBin >= ny: continue for level in range(pressure.shape[1]): if quality[profile, level] != b'1': continue press = pressure[profile, level] if numpy.isnan(press): continue depth = gsw.z_from_p(pressure[profile, level], lat[profile]) zBin = int((depth-zMin)/dz) if zBin < 0 or zBin >= nz: continue outField[zBin, yBin, xBin] += inField[profile, level] entryCount[zBin, yBin, xBin] += 1 bar.update(index+1) bar.finish() mask = entryCount > 0 outField[mask] /= entryCount[mask] outField[numpy.logical_not(mask)] = numpy.nan ds[outVarName] = (('z', 'y', 'x'), outField) for attr in ['units', 'long_name', 'comment']: ds[outVarName].attrs[attr] = attrs[attr] ds.to_netcdf(outFileName)