示例#1
0
def main(cmdLineArgs,stream=None):
  if not os.path.exists(cmdLineArgs.gridspec): raise ValueError('Specified gridspec directory/tar file does not exist.')
  if os.path.isdir(cmdLineArgs.gridspec):
    xcenter = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_hgrid.nc').variables['x'][1::2,1::2]
    y = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_hgrid.nc').variables['y'][1::2,1::2].max(axis=-1)
    ycenter = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_hgrid.nc').variables['y'][1::2,1::2]
    msk = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_mask.nc').variables['mask'][:]
    area = msk*netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_hgrid.nc').variables['area'][:,:].reshape([msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
    depth = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_topog.nc').variables['depth'][:]
    try: basin = netCDF4.Dataset(cmdLineArgs.gridspec+'/basin_codes.nc').variables['basin'][:]
    except: basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
  elif os.path.isfile(cmdLineArgs.gridspec):
    xcenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_hgrid.nc','x')[1::2,1::2]
    y = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_hgrid.nc','y')[1::2,1::2].max(axis=-1)
    ycenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_hgrid.nc','y')[1::2,1::2]
    msk = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_mask.nc','mask')[:]
    area = msk*m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_hgrid.nc','area')[:,:].reshape([msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
    depth = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'ocean_topog.nc','depth')[:]
    try: basin = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,'basin_codes.nc','basin')[:]
    except: basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
  else:
    raise ValueError('Unable to extract grid information from gridspec directory/tar file.') 

  if stream != None:
    if len(stream) != 4:
      raise ValueError('If specifying output streams, exactly four (4) streams are needed for this analysis')

  Sobs = netCDF4.Dataset( cmdLineArgs.woa ).variables['salt']
  if len(Sobs.shape)==3: Sobs = Sobs[:]
  else: Sobs = Sobs[:].mean(axis=0)
  Zobs = netCDF4.Dataset( cmdLineArgs.woa ).variables['eta'][:]

  rootGroup = netCDF4.MFDataset( cmdLineArgs.annual_file )
  if 'salt' in rootGroup.variables: varName = 'salt'
  elif 'so' in rootGroup.variables: varName = 'so'
  else:raise Exception('Could not find "salt" or "so" in file "%s"'%(cmdLineArgs.annual_file))
  if len(rootGroup.variables[varName].shape)==4: Smod = rootGroup.variables[varName][:].mean(axis=0)
  else: Smod = rootGroup.variables[varName][:]
  if 'e' in rootGroup.variables: Zmod = rootGroup.variables['e'][0]
  else: Zmod = Zobs # Using model z-output
  
  def zonalAverage(S, eta, area, mask=1.):
    vols = ( mask * area ) * ( eta[:-1] - eta[1:] ) # mask * area * level thicknesses
    return numpy.sum( vols * S, axis=-1 ) / numpy.sum( vols, axis=-1 ), (mask*eta).min(axis=-1)
  
  ci=m6plot.pmCI(0.125,2.25,.25)

  if cmdLineArgs.suptitle != '':  suptitle = cmdLineArgs.suptitle + ' ' + cmdLineArgs.label
  else: suptitle = rootGroup.title + ' ' + cmdLineArgs.label
  
  # Global
  sPlot, z = zonalAverage(Smod, Zmod, area)
  sObsPlot, _ = zonalAverage(Sobs, Zobs, area)
  if stream != None: objOut = stream[0]
  else: objOut = cmdLineArgs.outdir+'/S_global_xave_bias_WOA05.png'
  m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle, title='''Global zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
        save=objOut)
  
  if stream is None:
    m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title1='Global zonal-average salinity [ppt]',
        title2='''WOA'05 salinity [ppt]''',
        clim=m6plot.linCI(20,30,10, 31,39,.5), colormap='dunneRainbow', extend='both',
        dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
        save=cmdLineArgs.outdir+'/S_global_xave_bias_WOA05.3_panel.png')
  
  # Atlantic + Arctic
  newMask = 1.*msk; newMask[ (basin!=2) & (basin!=4) ] = 0.
  sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
  sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
  if stream != None: objOut = stream[1]
  else: objOut = cmdLineArgs.outdir+'/S_Atlantic_xave_bias_WOA05.png'
  m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle, title='''Atlantic zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
        save=objOut)
  
  if stream is None:
    m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title1='Atlantic zonal-average salinity [ppt]',
        title2='''WOA'05 salinity [ppt]''',
        clim=m6plot.linCI(20,30,10, 31,39,.5), colormap='dunneRainbow', extend='both',
        dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
        save=cmdLineArgs.outdir+'/S_Atlantic_xave_bias_WOA05.3_panel.png')
  
  # Pacific
  newMask = 1.*msk; newMask[ (basin!=3) ] = 0.
  sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
  sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
  if stream != None: objOut = stream[2]
  else: objOut = cmdLineArgs.outdir+'/S_Pacific_xave_bias_WOA05.png'
  m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle, title='''Pacific zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
        save=objOut)
  
  if stream is None:
    m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title1='Pacific zonal-average salinity [ppt]',
        title2='''WOA'05 salinity [ppt]''',
        clim=m6plot.linCI(20,30,10, 31,39,.5), colormap='dunneRainbow', extend='both',
        dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
        save=cmdLineArgs.outdir+'/S_Pacific_xave_bias_WOA05.3_panel.png')
  
  # Indian
  newMask = 1.*msk; newMask[ (basin!=5) ] = 0.
  sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
  sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
  if stream != None: objOut = stream[3]
  else: objOut = cmdLineArgs.outdir+'/S_Indian_xave_bias_WOA05.png'
  m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle, title='''Indian zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
        save=objOut)
  
  if stream is None:
    m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title1='Indian zonal-average salinity [ppt]',
        title2='''WOA'05 salinity [ppt]''',
        clim=m6plot.linCI(20,30,10, 31,39,.5), colormap='dunneRainbow', extend='both',
        dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
        save=cmdLineArgs.outdir+'/S_Indian_xave_bias_WOA05.3_panel.png')
  return numpy.sum( vols * S, axis=-1 ) / numpy.sum( vols, axis=-1 ), (mask*eta).min(axis=-1)

ci=m6plot.pmCI(0.125,2.25,.25)

# Global
sPlot, z = zonalAverage(Smod, Zmod, area)
sObsPlot, _ = zonalAverage(Sobs, Zobs, area)
m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title='''Global zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
      save=cmdLineArgs.outdir+'/S_global_xave_bias_WOA05.png')

m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label,
      title1='Global zonal-average salinity [ppt]',
      title2='''WOA'05 salinity [ppt]''',
      clim=m6plot.linCI(20,30,10, 31,39,.5), colormap='dunneRainbow', extend='both',
      dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
      save=cmdLineArgs.outdir+'/S_global_xave_bias_WOA05.3_panel.png')

# Atlantic + Arctic
newMask = 1.*msk; newMask[ (basin!=2) & (basin!=4) ] = 0.
sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
m6plot.yzplot( sPlot - sObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title='''Atlantic zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
      save=cmdLineArgs.outdir+'/S_Atlantic_xave_bias_WOA05.png')

m6plot.yzcompare( sPlot, sObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label,
  return numpy.sum( vols * T, axis=-1 ) / numpy.sum( vols, axis=-1 ), (mask*eta).min(axis=-1)

ci=m6plot.pmCI(0.25,4.5,.5)

# Global
tPlot, z = zonalAverage(Tmod, Zmod, area)
tObsPlot, _ = zonalAverage(Tobs, Zobs, area)
m6plot.yzplot( tPlot - tObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title=r'''Global zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
      save=cmdLineArgs.outdir+'/T_global_xave_bias_WOA05.png')

m6plot.yzcompare( tPlot, tObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label,
      title1=r'Global zonal-average $\theta$ [$\degree$C]',
      title2=r'''WOA'05 $\theta$ [$\degree$C]''',
      clim=m6plot.linCI(-2,29,.5), colormap='dunneRainbow', extend='max',
      dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
      save=cmdLineArgs.outdir+'/T_global_xave_bias_WOA05.3_panel.png')

# Atlantic + Arctic
newMask = 1.*msk; newMask[ (basin!=2) & (basin!=4) ] = 0.
tPlot, z = zonalAverage(Tmod, Zmod, area, mask=newMask)
tObsPlot, _ = zonalAverage(Tobs, Zobs, area, mask=newMask)
m6plot.yzplot( tPlot - tObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title=r'''Atlantic zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both',
      save=cmdLineArgs.outdir+'/T_Atlantic_xave_bias_WOA05.png')

m6plot.yzcompare( tPlot, tObsPlot , y, z, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label,
示例#4
0
              cmdLineArgs.label,
              clim=ci,
              colormap='dunnePM',
              centerlabels=True,
              extend='both',
              save=cmdLineArgs.outdir + '/S_global_xave_response.png')

m6plot.yzcompare(
    sPlot,
    sRefPlot,
    y,
    z,
    splitscale=[0., -1000., -6500.],
    suptitle='Global zonal-average salinity [ppt] ' + cmdLineArgs.label,
    title1=title1,
    title2=title2,
    clim=m6plot.linCI(20, 30, 10, 31, 39, .5),
    colormap='dunneRainbow',
    extend='both',
    dlim=ci,
    dcolormap='dunnePM',
    dextend='both',
    centerdlabels=True,
    save=cmdLineArgs.outdir + '/S_global_xave_response.3_panel.png')

# Atlantic + Arctic
newMask = 1. * msk
newMask[(basin != 2) & (basin != 4)] = 0.
sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
sRefPlot, _ = zonalAverage(Sref, Zref, area, mask=newMask)
m6plot.yzplot(sPlot - sRefPlot,
tPlot = rootGroup.variables[varName][0,:,j,i0:i1]
tObsPlot = obsRootGroup.variables[OTvar][0,:,j,i0:i1]
zi = Zobs[:,j,i0:i1]; z = 0.5 * ( zi[:-1] + zi[1:] )
m6plot.yzplot( tPlot - tObsPlot , x[j,i0:i1][:], zi,
      ylabel='Longitude',
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title=r'''Pacific equator $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both')
cs1 = plt.contour( x[j,i0:i1][:] + 0*z, z, tObsPlot, levels=numpy.arange(0.,45,2.), colors='k' ); plt.clabel(cs1,fmt='%.0f')
cs2 = plt.contour( x[j,i0:i1][:] + 0*z, z, tPlot, levels=numpy.arange(0.,45,2.), colors='g' ); plt.clabel(cs2,fmt='%.0f')
plt.ylim(-1200,0)
plt.savefig(cmdLineArgs.outdir+'/T_Pacific_equator_bias_WOA05.png')

m6plot.yzcompare( tPlot, tObsPlot , x[j,i0:i1], zi, splitscale=[0., -1000., -6500.],
      suptitle=rootGroup.title+' '+cmdLineArgs.label,
      ylabel='Longitude',
      title1=r'Pacific equator $\theta$ [$\degree$C]',
      title2=r'''WOA'05 $\theta$ [$\degree$C]''',
      clim=m6plot.linCI(-2,29,.5), colormap='dunneRainbow', extend='max',
      dlim=ci, dcolormap='dunnePM', dextend='both', centerdlabels=True,
      save=cmdLineArgs.outdir+'/T_Pacific_equator_bias_WOA05.3_panel.png')

# Atlantic equator
j = numpy.abs( y[:,0] - 0. ).argmin()
i0 = numpy.abs( numpy.mod( x[j,:] + 52. + 360., 360. ) ).argmin()
i1 = numpy.abs( numpy.mod( x[j,:] - 10.5 + 360., 360. ) ).argmin()
tPlot = rootGroup.variables[varName][0,:,j,i0:i1]
tObsPlot = obsRootGroup.variables[OTvar][0,:,j,i0:i1]
zi = Zobs[:,j,i0:i1]; z = 0.5 * ( zi[:-1] + zi[1:] )
m6plot.yzplot( tPlot - tObsPlot , x[j,i0:i1][:], zi,
      ylabel='Longitude',
      suptitle=rootGroup.title+' '+cmdLineArgs.label, title=r'''Atlantic equator $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
      clim=ci, colormap='dunnePM', centerlabels=True, extend='both')
示例#6
0
def main(cmdLineArgs, stream=False):
    if not os.path.exists(cmdLineArgs.gridspec):
        raise ValueError(
            'Specified gridspec directory/tar file does not exist.')
    if os.path.isdir(cmdLineArgs.gridspec):
        xcenter = netCDF4.Dataset(cmdLineArgs.gridspec +
                                  '/ocean_hgrid.nc').variables['x'][1::2, 1::2]
        y = netCDF4.Dataset(cmdLineArgs.gridspec +
                            '/ocean_hgrid.nc').variables['y'][1::2, 1::2].max(
                                axis=-1)
        ycenter = netCDF4.Dataset(cmdLineArgs.gridspec +
                                  '/ocean_hgrid.nc').variables['y'][1::2, 1::2]
        msk = netCDF4.Dataset(cmdLineArgs.gridspec +
                              '/ocean_mask.nc').variables['mask'][:]
        area = msk * netCDF4.Dataset(
            cmdLineArgs.gridspec +
            '/ocean_hgrid.nc').variables['area'][:, :].reshape(
                [msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
        depth = netCDF4.Dataset(cmdLineArgs.gridspec +
                                '/ocean_topog.nc').variables['depth'][:]
        try:
            basin = netCDF4.Dataset(cmdLineArgs.gridspec +
                                    '/basin_codes.nc').variables['basin'][:]
        except:
            basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
    elif os.path.isfile(cmdLineArgs.gridspec):
        xcenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                          'ocean_hgrid.nc', 'x')[1::2, 1::2]
        y = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_hgrid.nc',
                                    'y')[1::2, 1::2].max(axis=-1)
        ycenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                          'ocean_hgrid.nc', 'y')[1::2, 1::2]
        msk = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_mask.nc',
                                      'mask')[:]
        area = msk * m6toolbox.readNCFromTar(
            cmdLineArgs.gridspec, 'ocean_hgrid.nc', 'area')[:, :].reshape(
                [msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
        depth = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_topog.nc',
                                        'depth')[:]
        try:
            basin = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                            'basin_codes.nc', 'basin')[:]
        except:
            basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
    else:
        raise ValueError(
            'Unable to extract grid information from gridspec directory/tar file.'
        )

    Sobs = netCDF4.Dataset(cmdLineArgs.woa).variables['salt']
    if len(Sobs.shape) == 3: Sobs = Sobs[:]
    else: Sobs = Sobs[:].mean(axis=0)
    Zobs = netCDF4.Dataset(cmdLineArgs.woa).variables['eta'][:]

    rootGroup = netCDF4.MFDataset(cmdLineArgs.infile)
    if 'salt' in rootGroup.variables: varName = 'salt'
    elif 'so' in rootGroup.variables: varName = 'so'
    else:
        raise Exception('Could not find "salt" or "so" in file "%s"' %
                        (cmdLineArgs.infile))
    if len(rootGroup.variables[varName].shape) == 4:
        Smod = rootGroup.variables[varName][:].mean(axis=0)
    else:
        Smod = rootGroup.variables[varName][:]
    if 'e' in rootGroup.variables: Zmod = rootGroup.variables['e'][0]
    else: Zmod = Zobs  # Using model z-output

    def zonalAverage(S, eta, area, mask=1.):
        vols = (mask * area) * (eta[:-1] - eta[1:]
                                )  # mask * area * level thicknesses
        return numpy.sum(vols * S, axis=-1) / numpy.sum(vols, axis=-1), (
            mask * eta).min(axis=-1)

    ci = m6plot.pmCI(0.125, 2.25, .25)

    if cmdLineArgs.suptitle != '':
        suptitle = cmdLineArgs.suptitle + ' ' + cmdLineArgs.label
    else:
        suptitle = rootGroup.title + ' ' + cmdLineArgs.label

    imgbufs = []

    # Global
    sPlot, z = zonalAverage(Smod, Zmod, area)
    sObsPlot, _ = zonalAverage(Sobs, Zobs, area)
    if stream is True: objOut = io.BytesIO()
    else: objOut = cmdLineArgs.outdir + '/S_global_xave_bias_WOA05.png'
    m6plot.yzplot(
        sPlot - sObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title='''Global zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)
    if stream is True: imgbufs.append(objOut)

    if stream is None:
        m6plot.yzcompare(sPlot,
                         sObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1='Global zonal-average salinity [ppt]',
                         title2='''WOA'05 salinity [ppt]''',
                         clim=m6plot.linCI(20, 30, 10, 31, 39, .5),
                         colormap='dunneRainbow',
                         extend='both',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/S_global_xave_bias_WOA05.3_panel.png')

    # Atlantic + Arctic
    newMask = 1. * msk
    newMask[(basin != 2) & (basin != 4)] = 0.
    sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
    sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
    if stream is True: objOut = io.BytesIO()
    else: objOut = cmdLineArgs.outdir + '/S_Atlantic_xave_bias_WOA05.png'
    m6plot.yzplot(
        sPlot - sObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title='''Atlantic zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)
    if stream is True: imgbufs.append(objOut)

    if stream is None:
        m6plot.yzcompare(sPlot,
                         sObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1='Atlantic zonal-average salinity [ppt]',
                         title2='''WOA'05 salinity [ppt]''',
                         clim=m6plot.linCI(20, 30, 10, 31, 39, .5),
                         colormap='dunneRainbow',
                         extend='both',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/S_Atlantic_xave_bias_WOA05.3_panel.png')

    # Pacific
    newMask = 1. * msk
    newMask[(basin != 3)] = 0.
    sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
    sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
    if stream is True: objOut = io.BytesIO()
    else: objOut = cmdLineArgs.outdir + '/S_Pacific_xave_bias_WOA05.png'
    m6plot.yzplot(
        sPlot - sObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title='''Pacific zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)
    if stream is True: imgbufs.append(objOut)

    if stream is None:
        m6plot.yzcompare(sPlot,
                         sObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1='Pacific zonal-average salinity [ppt]',
                         title2='''WOA'05 salinity [ppt]''',
                         clim=m6plot.linCI(20, 30, 10, 31, 39, .5),
                         colormap='dunneRainbow',
                         extend='both',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/S_Pacific_xave_bias_WOA05.3_panel.png')

    # Indian
    newMask = 1. * msk
    newMask[(basin != 5)] = 0.
    sPlot, z = zonalAverage(Smod, Zmod, area, mask=newMask)
    sObsPlot, _ = zonalAverage(Sobs, Zobs, area, mask=newMask)
    if stream is True: objOut = io.BytesIO()
    else: objOut = cmdLineArgs.outdir + '/S_Indian_xave_bias_WOA05.png'
    m6plot.yzplot(
        sPlot - sObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title='''Indian zonal-average salinity bias (w.r.t. WOA'05) [ppt]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)
    if stream is True: imgbufs.append(objOut)

    if stream is None:
        m6plot.yzcompare(sPlot,
                         sObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1='Indian zonal-average salinity [ppt]',
                         title2='''WOA'05 salinity [ppt]''',
                         clim=m6plot.linCI(20, 30, 10, 31, 39, .5),
                         colormap='dunneRainbow',
                         extend='both',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/S_Indian_xave_bias_WOA05.3_panel.png')

    if stream is True:
        return imgbufs
    cmdLineArgs.label,
    clim=ci,
    colormap='dunnePM',
    centerlabels=True,
    extend='both',
    save=cmdLineArgs.outdir + '/T_global_xave_response.png')

m6plot.yzcompare(tPlot,
                 tRefPlot,
                 y,
                 z,
                 splitscale=[0., -1000., -6500.],
                 suptitle=r'Global zonal-average $\theta$ [$\degree$C] ' +
                 cmdLineArgs.label,
                 title1=title1,
                 title2=title2,
                 clim=m6plot.linCI(-2, 29, .5),
                 colormap='dunneRainbow',
                 extend='max',
                 dlim=ci,
                 dcolormap='dunnePM',
                 dextend='both',
                 centerdlabels=True,
                 save=cmdLineArgs.outdir +
                 '/T_global_xave_response.3_panel.png')

# Atlantic + Arctic
newMask = 1. * msk
newMask[(basin != 2) & (basin != 4)] = 0.
tPlot, z = zonalAverage(Tmod, Zmod, area, mask=newMask)
tRefPlot, _ = zonalAverage(Tref, Zref, area, mask=newMask)
m6plot.yzplot(
示例#8
0
def main(cmdLineArgs, stream=None):
    if not os.path.exists(cmdLineArgs.gridspec):
        raise ValueError(
            'Specified gridspec directory/tar file does not exist.')
    if os.path.isdir(cmdLineArgs.gridspec):
        xcenter = netCDF4.Dataset(cmdLineArgs.gridspec +
                                  '/ocean_hgrid.nc').variables['x'][1::2, 1::2]
        y = netCDF4.Dataset(cmdLineArgs.gridspec +
                            '/ocean_hgrid.nc').variables['y'][1::2, 1::2].max(
                                axis=-1)
        ycenter = netCDF4.Dataset(cmdLineArgs.gridspec +
                                  '/ocean_hgrid.nc').variables['y'][1::2, 1::2]
        msk = netCDF4.Dataset(cmdLineArgs.gridspec +
                              '/ocean_mask.nc').variables['mask'][:]
        area = msk * netCDF4.Dataset(
            cmdLineArgs.gridspec +
            '/ocean_hgrid.nc').variables['area'][:, :].reshape(
                [msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
        depth = netCDF4.Dataset(cmdLineArgs.gridspec +
                                '/ocean_topog.nc').variables['depth'][:]
        try:
            basin = netCDF4.Dataset(cmdLineArgs.gridspec +
                                    '/basin_codes.nc').variables['basin'][:]
        except:
            basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
    elif os.path.isfile(cmdLineArgs.gridspec):
        xcenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                          'ocean_hgrid.nc', 'x')[1::2, 1::2]
        y = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_hgrid.nc',
                                    'y')[1::2, 1::2].max(axis=-1)
        ycenter = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                          'ocean_hgrid.nc', 'y')[1::2, 1::2]
        msk = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_mask.nc',
                                      'mask')[:]
        area = msk * m6toolbox.readNCFromTar(
            cmdLineArgs.gridspec, 'ocean_hgrid.nc', 'area')[:, :].reshape(
                [msk.shape[0], 2, msk.shape[1], 2]).sum(axis=-3).sum(axis=-1)
        depth = m6toolbox.readNCFromTar(cmdLineArgs.gridspec, 'ocean_topog.nc',
                                        'depth')[:]
        try:
            basin = m6toolbox.readNCFromTar(cmdLineArgs.gridspec,
                                            'basin_codes.nc', 'basin')[:]
        except:
            basin = m6toolbox.genBasinMasks(xcenter, ycenter, depth)
    else:
        raise ValueError(
            'Unable to extract grid information from gridspec directory/tar file.'
        )

    if stream != None:
        if len(stream) != 4:
            raise ValueError(
                'If specifying output streams, exactly four (4) streams are needed for this analysis'
            )

    Tobs = netCDF4.Dataset(cmdLineArgs.woa)
    if 'temp' in Tobs.variables: Tobs = Tobs.variables['temp']
    else: Tobs = Tobs.variables['ptemp']
    if len(Tobs.shape) == 3: Tobs = Tobs[:]
    else: Tobs = Tobs[:].mean(axis=0)
    Zobs = netCDF4.Dataset(cmdLineArgs.woa).variables['eta'][:]

    rootGroup = netCDF4.MFDataset(cmdLineArgs.annual_file)
    if 'temp' in rootGroup.variables: varName = 'temp'
    elif 'ptemp' in rootGroup.variables: varName = 'ptemp'
    elif 'thetao' in rootGroup.variables: varName = 'thetao'
    else:
        raise Exception(
            'Could not find "temp", "ptemp" or "thetao" in file "%s"' %
            (cmdLineArgs.annual_file))
    if len(rootGroup.variables[varName].shape) == 4:
        Tmod = rootGroup.variables[varName][:].mean(axis=0)
    else:
        Tmod = rootGroup.variables[varName][:]
    if 'e' in rootGroup.variables: Zmod = rootGroup.variables['e'][0]
    else: Zmod = Zobs  # Using model z-ou:put

    def zonalAverage(T, eta, area, mask=1.):
        vols = (mask * area) * (eta[:-1] - eta[1:]
                                )  # mask * area * level thicknesses
        return numpy.sum(vols * T, axis=-1) / numpy.sum(vols, axis=-1), (
            mask * eta).min(axis=-1)

    ci = m6plot.pmCI(0.25, 4.5, .5)

    if cmdLineArgs.suptitle != '':
        suptitle = cmdLineArgs.suptitle + ' ' + cmdLineArgs.label
    else:
        suptitle = rootGroup.title + ' ' + cmdLineArgs.label

    # Global
    tPlot, z = zonalAverage(Tmod, Zmod, area)
    tObsPlot, _ = zonalAverage(Tobs, Zobs, area)
    if stream != None: objOut = stream[0]
    else: objOut = cmdLineArgs.outdir + '/T_global_xave_bias_WOA05.png'
    m6plot.yzplot(
        tPlot - tObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title=
        r'''Global zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)

    if stream is None:
        m6plot.yzcompare(tPlot,
                         tObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1=r'Global zonal-average $\theta$ [$\degree$C]',
                         title2=r'''WOA'05 $\theta$ [$\degree$C]''',
                         clim=m6plot.linCI(-2, 29, .5),
                         colormap='dunneRainbow',
                         extend='max',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/T_global_xave_bias_WOA05.3_panel.png')

    # Atlantic + Arctic
    newMask = 1. * msk
    newMask[(basin != 2) & (basin != 4)] = 0.
    tPlot, z = zonalAverage(Tmod, Zmod, area, mask=newMask)
    tObsPlot, _ = zonalAverage(Tobs, Zobs, area, mask=newMask)
    if stream != None: objOut = stream[1]
    else: objOut = cmdLineArgs.outdir + '/T_Atlantic_xave_bias_WOA05.png'
    m6plot.yzplot(
        tPlot - tObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title=
        r'''Atlantic zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)

    if stream is None:
        m6plot.yzcompare(
            tPlot,
            tObsPlot,
            y,
            z,
            splitscale=[0., -1000., -6500.],
            suptitle=suptitle,
            title1=r'Atlantic zonal-average $\theta$ [$\degree$C]',
            title2=r'''WOA'05 $\theta$ [$\degree$C]''',
            clim=m6plot.linCI(-2, 29, .5),
            colormap='dunneRainbow',
            extend='max',
            dlim=ci,
            dcolormap='dunnePM',
            dextend='both',
            centerdlabels=True,
            save=cmdLineArgs.outdir +
            '/T_Atlantic_xave_bias_WOA05.3_panel.png')

    # Pacific
    newMask = 1. * msk
    newMask[(basin != 3)] = 0.
    tPlot, z = zonalAverage(Tmod, Zmod, area, mask=newMask)
    tObsPlot, _ = zonalAverage(Tobs, Zobs, area, mask=newMask)
    if stream != None: objOut = stream[2]
    else: objOut = cmdLineArgs.outdir + '/T_Pacific_xave_bias_WOA05.png'
    m6plot.yzplot(
        tPlot - tObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title=
        r'''Pacific zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)

    if stream is None:
        m6plot.yzcompare(tPlot,
                         tObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1=r'Pacific zonal-average $\theta$ [$\degree$C]',
                         title2=r'''WOA'05 $\theta$ [$\degree$C]''',
                         clim=m6plot.linCI(-2, 29, .5),
                         colormap='dunneRainbow',
                         extend='max',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/T_Pacific_xave_bias_WOA05.3_panel.png')

    # Indian
    newMask = 1. * msk
    newMask[(basin != 5)] = 0.
    tPlot, z = zonalAverage(Tmod, Zmod, area, mask=newMask)
    tObsPlot, _ = zonalAverage(Tobs, Zobs, area, mask=newMask)
    if stream != None: objOut = stream[3]
    else: objOut = cmdLineArgs.outdir + '/T_Indian_xave_bias_WOA05.png'
    m6plot.yzplot(
        tPlot - tObsPlot,
        y,
        z,
        splitscale=[0., -1000., -6500.],
        suptitle=suptitle,
        title=
        r'''Indian zonal-average $\theta$ bias (w.r.t. WOA'05) [$\degree$C]''',
        clim=ci,
        colormap='dunnePM',
        centerlabels=True,
        extend='both',
        save=objOut)

    if stream is None:
        m6plot.yzcompare(tPlot,
                         tObsPlot,
                         y,
                         z,
                         splitscale=[0., -1000., -6500.],
                         suptitle=suptitle,
                         title1=r'Indian zonal-average $\theta$ [$\degree$C]',
                         title2=r'''WOA'05 $\theta$ [$\degree$C]''',
                         clim=m6plot.linCI(-2, 29, .5),
                         colormap='dunneRainbow',
                         extend='max',
                         dlim=ci,
                         dcolormap='dunnePM',
                         dextend='both',
                         centerdlabels=True,
                         save=cmdLineArgs.outdir +
                         '/T_Indian_xave_bias_WOA05.3_panel.png')