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)
Esempio n. 2
0
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)
Esempio n. 4
0
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)
Esempio n. 8
0
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)
Esempio n. 10
0
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)