コード例 #1
0
def plot_cs(layer_data,hrz_grid=None,ax=None,crs_data=None,crs_plot=None,show_colorbar=True):

    n_cs, is_gmao = guess_cs_grid(layer_data.shape)    

    if is_gmao:
       # Use data as-is
       layer_data_3D = layer_data
    else:
       # Reshape data to be "GMAO-style" (3D)
       layer_data_3D = np.reshape(layer_data,(6,n_cs,n_cs))

    if hrz_grid is None:
       # Try to figure out the grid from the layer data
       hrz_grid = cubedsphere.csgrid_GMAO(n_cs)
    
    cs_threshold = 5.0
    masked_data = np.ma.masked_where(np.abs(hrz_grid['lon'] - 180.0) < cs_threshold, layer_data_3D)
 
    im_vec = []
    for i_face in range(6):
       im = ax.pcolormesh(hrz_grid['lon_b'][i_face,:,:],hrz_grid['lat_b'][i_face,:,:],masked_data[i_face,:,:],transform=crs_data)
       im_vec.append(im)

    c_lim = [np.min(layer_data),np.max(layer_data)]
    if (c_lim[0] == c_lim[1]):
       c_lim = [-1.0,1.0]

    for im in im_vec:
       im.set_clim(c_lim)

    return im_vec
コード例 #2
0
def gen_grid(n_cs):
    cs_temp = cubedsphere.csgrid_GMAO(n_cs)
    return xr.Dataset({'nf':     (['nf'],np.array(range(6))),
                       'Ydim':   (['Ydim'],np.array(range(n_cs))),
                       'Xdim':   (['Xdim'],np.array(range(n_cs))),
                       'Ydim_b': (['Ydim_b'],np.array(range(n_cs+1))),
                       'Xdim_b': (['Xdim_b'],np.array(range(n_cs+1))),
                       'lat':    (['nf','Ydim','Xdim'], cs_temp['lat']),
                       'lon':    (['nf','Ydim','Xdim'], cs_temp['lon']),
	     	  'lat_b':  (['nf','Ydim_b','Xdim_b'], cs_temp['lat_b']),
	     	  'lon_b':  (['nf','Ydim_b','Xdim_b'], cs_temp['lon_b']),
                       'area':   (['nf','Ydim','Xdim'], grid_area(cs_temp))})
コード例 #3
0
def regrid_cs(cs_data,new_grid,cs_grid=None,regridder_list=None):
    '''
    # regrid cs to ll
    ds_dev_cmp = np.zeros([nlev, cmpgrid['lat'].size, cmpgrid['lon'].size])
    for i in range(6):
        regridder = devregridder_list[i]
        ds_dev_cmp += regridder(ds_dev_reshaped[i])
    '''
    full_data = cs_data.copy()

    # Assume the CS data is 3D
    single_layer = len(full_data.shape) == 3
    if single_layer:
       layer_shape = full_data.shape
       full_data = np.reshape(full_data,layer_shape.insert(0,1))
    else:
       layer_shape = full_data.shape[1:]

    full_shape = full_data.shape
    n_lev = full_shape[0]

    # Figure out the grid size
    n_cs, is_gmao = guess_cs_grid(layer_shape)

    if cs_grid is None:
       # Try to figure out the grid from the layer data
       cs_grid = cubedsphere.csgrid_GMAO(n_cs)
  
    n_lon = len(new_grid['lon'])
    n_lat = len(new_grid['lat'])
    if regridder_list is None:
       regridder_list = []
       for i_face in range(6):
          sub_grid = {'lat':   cs_grid['lat'][i_face], 
                      'lon':   cs_grid['lon'][i_face],
                      'lat_b': cs_grid['lat_b'][i_face], 
                      'lon_b': cs_grid['lon_b'][i_face]}
          regridder_list.append(xesmf.Regridder(sub_grid,new_grid,method='conservative',reuse_weights=True,filename='conservative_c{:d}f{:d}_{:d}x{:d}'.format(n_cs,i_face,n_lat,n_lon)))

    ll_data = np.zeros((n_lev,n_lat,n_lon))
    for i_lev in range(n_lev):
       for i_face in range(6):
          ll_data[i_lev,:,:] += regridder_list[i_face](full_data[i_lev,i_face,:,:])

    if single_layer:
       ll_data = np.squeeze(ll_data) 

    return ll_data 
コード例 #4
0
def grid_area(cs_grid=None,cs_res=None):
    """Return area in m2 for each cell in a cubed-sphere grid
    Uses GMAO indexing convention (6xNxN)
    """
    # Calculate area on a cubed sphere
    if cs_res is None:
        cs_res = cs_grid['lon_b'].shape[-1] - 1
    elif cs_grid is None:
        cs_grid = cubedsphere.csgrid_GMAO(cs_res)
    elif cs_grid is not None and cs_res is not None:
        assert cs_res == cs_grid['lon_b'].shape[-1], 'Routine grid_area received inconsistent inputs' 
    cs_area = np.zeros((6,cs_res,cs_res))
    cs_area[0,:,:] = face_area(cs_grid['lon_b'][0,:,:],cs_grid['lat_b'][0,:,:])
    for i_face in range(1,6):
        cs_area[i_face,:,:] = cs_area[0,:,:].copy()
    return cs_area
コード例 #5
0
ファイル: test_grid.py プロジェクト: sdeastham/cubedsphere
def test_csgrid_gmap():

    # read reference data
    ds_FV3 = cs.open_FV3data("./example_notebooks/sample_data/FV3diag_C48/",
                             'atmos_daily')

    # calculate grid online
    grid = cs.csgrid_GMAO(48)

    # fix a single polar point before testing. should not have real effect
    index = (5, 24, 24)  # index of the pole point
    assert grid['lat_b'][index] == -90.0
    assert grid['lon_b'][index] == 35.0
    assert ds_FV3['lon_b'][index] == 350.0
    grid['lon_b'][index] = 350.0  # change to FV3 value

    for varname in ['lon', 'lon_b', 'lat', 'lat_b']:
        assert_almost_equal(grid[varname], ds_FV3[varname], decimal=4)
コード例 #6
0
ファイル: regrid_test.py プロジェクト: fritzt/gcgridobj
import numpy as np
import gcgridobj
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cubedsphere

# Generate test grids
# Cubed sphere grids (C24, C90)
c24 = cubedsphere.csgrid_GMAO(24)
c90 = cubedsphere.csgrid_GMAO(90)
# Lat-lon grids (Generic 2x2, standard 4x5)
ll2x2 = gcgridobj.latlontools.gen_hrz_grid(lon_stride=2,
                                           lat_stride=2,
                                           half_polar=False,
                                           center_180=False)
ll4x5 = gcgridobj.gc_horizontal.gmao_4x5_global

# Lat-lon grid data comes pre-packaged with areas in m2 ("ll2x2['area']), but for cubed sphere we must generate it ourselves
c24_area = gcgridobj.cstools.calc_cs_area(c24)
c90_area = gcgridobj.cstools.calc_cs_area(c90)

# Regridder objects, all generated through a single helper function
# Lat-lon (2x2) to cubed-sphere (c90)
ro_2x2_c90 = gcgridobj.regrid.gen_regridder(ll2x2, c90)
# Cubed-sphere (c90) to cubed-sphere (c24)
ro_c90_c24 = gcgridobj.regrid.gen_regridder(c90, c24)
# Cubed-sphere (c24) to lat-lon (2x2)
ro_c24_2x2 = gcgridobj.regrid.gen_regridder(c24, ll2x2)
# Lat-lon (2x2) to lat-lon (4x5)
ro_2x2_4x5 = gcgridobj.regrid.gen_regridder(ll2x2, ll4x5)