def main():

    # Define data directory
    datadir = os.environ.get('UFSOUTPUT_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    #flist = get_filelist(datadir,"*cice*nc")
    flist = get_filelist(
        datadir,
        "ufs.s2s.C384_t025.20120701.cmeps_v0.5.1.cice.h2_06h.2012-07-01-21600_regrid_0p25x0p25.nc"
    )
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist, __file__)
    uname = 'uvel_h'
    vname = 'vvel_h'
    vlist = ['uvel_h', 'vvel_h']

    # Get target grid
    ds_out = xr.open_dataset(os.environ.get('CICE_TARGET_GRID'))
    dsin = dsets[0]
    # Create target tripolar grids
    txy = {'lon': ds_out['TLON'], 'lat': ds_out['TLAT']}
    uxy = {'lon': ds_out['ULON'], 'lat': ds_out['ULAT']}

    # Create input latlon grid
    llxy = {'lon': dsets[0]['lon'], 'lat': dsets[0]['lat']}

    # Create regridders
    tregrid = create_regridder(llxy, txy, '0p25x0p25.to.TGRID')
    uregrid = create_regridder(llxy, uxy, '0p25x0p25.to.UGRID')

    # Get angle between tripole and N-S grids
    angle = ds_out['ANGLE']

    # Regrid from LL to tripole grid
    ureg = uregrid(dsin[uname])
    vreg = uregrid(dsin[vname])

    # Rotate vector pairs
    xrot, yrot = rotate_vector_cice5(ureg, vreg, "latlon", angle)
    xrot.name = uname
    yrot.name = vname

    # Merge variables in single xarray object
    dout = xrot.to_dataset(name=uname)
    dout[vname] = yrot

    dout.attrs['Conventions'] = "CF-1.7"

    # Set data and metadata for output grid
    x = dout['ULON']
    y = dout['ULAT']

    dout['y'] = y
    dout['y'].attrs['long_name'] = "latitude"
    dout['y'].attrs['units'] = "degrees_N"
    dout['y'].attrs['cartesian_axis'] = "Y"
    dout['x'] = x
    dout['x'].attrs['long_name'] = "longitude"
    dout['x'].attrs['units'] = "degrees_E"
    dout['x'].attrs['cartesian_axis'] = "X"

    # Copy over variable attributes

    dout = copyattrs(dsin, dout, vlist)

    # Fix NaN value for temperature
    #dout['tmp'].attrs['_FillValue']=0.
    # Write output
    if not os.path.exists(postdir):
        os.makedirs(postdir)
    dout.to_netcdf(postdir + "/" + uname + "_" + vname + "_regrid_tripolar.nc")

    # Delete xarray objects to avoid memory leak?
    del dout
def main():

    proc = psutil.Process()

# Define data directory
    datadir = os.environ.get('UFSOUTPUT_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    gridfile = os.environ.get('MOM6_GRID_INFO')
    flist = get_filelist(datadir,"*mom6.hmz*")
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist,__file__)
    print(flist)

# Get target grid
    ds_out=xr.open_dataset(os.environ.get('MOM6_TARGET_GRID'))

# Get various coordinate combinations
    xhyh,xhyq,xqyh,xqyq = parse_mom6static(dsmgrid)
    print(xhyh,xhyq,xqyh,xqyq)

# Create regridders
    xhyhregridder = create_regridder(xhyh,ds_out, "xhyh")
    xhyqregridder = create_regridder(xhyq,ds_out, "xhyq")
    xqyhregridder = create_regridder(xqyh,ds_out, "xqyh")
    xqyqregridder = create_regridder(xqyq,ds_out, "xqyq")
# Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])
#        print(rlist[i])
        vlist = list(dsin.data_vars.keys())
        print(vlist)
        glist = {vname:parse_mom6grid(dsin,vname) for vname in vlist}
        print(glist)

# Create list of different variable types
        xhyhlist = [vname for vname in vlist if "xh" in glist[vname] and "yh" in glist[vname]]
        xqyhlist = [vname for vname in vlist if "xq" in glist[vname] and "yh" in glist[vname]]
        xhyqlist = [vname for vname in vlist if "xh" in glist[vname] and "yq" in glist[vname]]
        xqyqlist = [vname for vname in vlist if "xq" in glist[vname] and "yq" in glist[vname]]
        olist = [vname for vname in vlist if "NA" in  glist[vname]]
        print("xhyh list is:",xhyhlist)
        print("xhyq list is:",xhyqlist)
        print("xqyh list is:",xqyhlist)
        print("xqyq list is:",xqyqlist)
        print("Non-grid vars:",olist)

# Regrid each variable type separately
        rgflag = True
        xhyhreg = [xhyhregridder(dsin[vname]) for vname in xhyhlist]
        xhyqreg = [xhyqregridder(dsin[vname]) for vname in xhyqlist]
        xqyhreg = [xqyhregridder(dsin[vname]) for vname in xqyhlist]
        xqyqreg = [xqyqregridder(dsin[vname]) for vname in xqyqlist]
        ngvars = [dsin[vname] for vname in olist]

# Merge variables in single xarray object
        dout = xr.merge(xhyhreg+xhyqreg+xqyhreg+xqyqreg+ngvars)

        dout.attrs['Conventions']="CF-1.7"

# Set data and metadata for output grid
        x=dout['lon'][0,:]
        y=dout['lat'][:,0]

        dout['y']=y
        dout['y'].attrs['long_name']="latitude"
        dout['y'].attrs['units']="degrees_N"
        dout['y'].attrs['cartesian_axis']="Y"
        dout['x']=x
        dout['x'].attrs['long_name']="longitude"
        dout['x'].attrs['units']="degrees_E"
        dout['x'].attrs['cartesian_axis']="X"

# Copy over variable attributes

        dout = copyattrs(dsin, dout, xhyhlist)
        dout = copyattrs(dsin, dout, xhyqlist)
        dout = copyattrs(dsin, dout, xqyhlist)
        dout = copyattrs(dsin, dout, xqyqlist)
        dout = copyattrs(dsin, dout, olist)

# Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir+"/"+rlist[i]+"_regrid_0p25x0p25.nc")

# Delete xarray objects to avoid memory leak?
        print('memory=',proc.memory_info().rss)
        del dout
        print('memory=',proc.memory_info().rss)
Exemple #3
0
def main():

    # Define data directory
    datadir = os.environ.get('UFSOUTPUT_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    regriddir = os.environ.get('REGRID_DIR')
    gspec = os.environ.get('MOM6_TARGET_GRID')
    flist = get_filelist(
        datadir,
        "ufs.s2s.C384_t025.20120701.cmeps_v0.5.1.mom6.sfc._2012_07_01_03600_regrid_0p25x0p25.nc"
    )
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist, __file__)
    dsin = dsets[0]
    uname = 'SSU'
    vname = 'SSV'
    vlist = ['SSU', 'SSV']

    # Get target grid
    ds_stat = xr.open_dataset(regriddir + gspec)

    # Get various coordinate combinations
    xhyh, xhyq, xqyh, xqyq = parse_mom6static(ds_stat)
    print(xhyh, xhyq, xqyh, xqyq)

    # Create input latlon grid
    llxy = {'lon': dsin['lon'], 'lat': dsin['lat']}

    # Create regridders
    xhyhregrid = create_regridder(llxy, xhyh, "0p25x0p25.to.xhyh", regriddir)
    xhyqregrid = create_regridder(llxy, xhyq, "0p25x0p25.to.xhyq", regriddir)
    xqyhregrid = create_regridder(llxy, xqyh, "0p25x0p25.to.xqyh", regriddir)
    xqyqregrid = create_regridder(llxy, xqyq, "0p25x0p25.to.xqyq", regriddir)
    xhyh_to_xqyh = create_regridder(xhyh, xqyh, "xhyh.to.xqyh", regriddir)
    xhyh_to_xhyq = create_regridder(xhyh, xhyq, "xhyh.to.xhyq", regriddir)

    # Get angles between tripole and N-S grids
    sin_rot = ds_stat['sin_rot']
    cos_rot = ds_stat['cos_rot']

    # Regrid from LL to xhyh grid where rotation angle is defined
    uct = xhyhregrid(dsin[uname])
    vct = xhyhregrid(dsin[vname])
    plt.contourf(dsin[uname][0, :, :])
    plt.colorbar()
    plt.show()
    # Rotate vector pairs
    xrot, yrot = rotate_vector_mom6(uct, vct, "latlon", sin_rot, cos_rot)
    xrot.name = uname
    yrot.name = vname

    #Restagger
    xout = xhyh_to_xqyh(xrot)
    yout = xhyh_to_xhyq(yrot)

    # Merge variables in single xarray object
    dout = xout.to_dataset(name=uname)
    dout[vname] = yout

    dout.attrs['Conventions'] = "CF-1.7"

    # Set data and metadata for output grid
    x = ds_stat['geolon']
    y = ds_stat['geolat']

    dout['y'] = y
    dout['y'].attrs['long_name'] = "latitude"
    dout['y'].attrs['units'] = "degrees_N"
    dout['y'].attrs['cartesian_axis'] = "Y"
    dout['x'] = x
    dout['x'].attrs['long_name'] = "longitude"
    dout['x'].attrs['units'] = "degrees_E"
    dout['x'].attrs['cartesian_axis'] = "X"

    # Copy over variable attributes

    dout = copyattrs(dsin, dout, vlist)

    # Fix NaN value for temperature
    #dout['tmp'].attrs['_FillValue']=0.
    # Write output
    if not os.path.exists(postdir):
        os.makedirs(postdir)
    dout.to_netcdf(postdir + "/" + uname + "_" + vname + "_regrid_tripolar.nc")

    # Delete xarray objects to avoid memory leak?
    del dout
def main():

# Define data directory
    datadir = os.environ.get('UFSOUTPUT_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    flist = get_filelist(datadir,"*cice*nc")
    #flist = get_filelist(datadir,"ufs.s2s.C384_t025.20120701.cmeps_v0.5.1.cice.h2_06h.2012-07-01-21600_regrid_0p25x0p25.nc")
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist,__file__)

# Get target grid
    regriddir = os.environ.get('REGRID_DIR')
    target_grid = os.environ.get('CICE_TARGET_GRID')
    ds_out=xr.open_dataset(regriddier+target_grid)

# Create target tripolar grids
    txy = {'lon':dsets[0]['TLON'], 'lat':dsets[0]['TLAT']}
    uxy = {'lon':dsets[0]['ULON'], 'lat':dsets[0]['ULAT']}

# Create input latlon grid
    llxy = {'lon':ds_out[0]['lon'], 'lat':ds_out['lat']}

# Create regridders
    tregrid = create_regridder(txy, llxy, 'TGRID.to.'+target_grid)
    uregrid = create_regridder(uxy, llxy, 'UGRID.to.'target_grid)

# Get angle between tripole and N-S grids
    angle = ds_out['ANGLE']

# Define pole types
#    poles = {}
#    poles['ds_in'] = np.array([ESMF.PoleKind.MONOPOLE, ESMF.PoleKind.MONOPOLE], np.int32)
#    poles['ds_out'] = np.array([ESMF.PoleKind.MONOPOLE, ESMF.PoleKind.MONOPOLE], np.int32)
 
# Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])
        vlist = list(dsin.data_vars.keys())
        glist = {vname:parse_utgrid(dsin,vname) for vname in vlist}

# Create list of different variable types
        tlist = [vname for vname in vlist if "TLAT" in glist[vname]]
        ulist = [vname for vname in vlist if "ULAT" in glist[vname]]
        olist = [vname for vname in vlist if "NA" in  glist[vname]]
        print(ulist)

# Check ugrid variables for vector pairs
        xlist = [vname for vname in ulist if "(x)" in dsin[vname].attrs['long_name']]
        ylist = [vname for vname in ulist if "(y)" in dsin[vname].attrs['long_name']]
        slist = [vname for vname in ulist if "(y)" not in dsin[vname].attrs['long_name'] and "(x)" not in dsin[vname].attrs['long_name']]

# Create list of vector pairs
# NOTE NOTE NOTE this relies on the vector pairs being written out in the propoer order!        
        vpairs = list(zip(xlist,ylist))

# Rotate vector pairs
        xrot={}
        yrot={}
        for vpair in vpairs:
           print(vpair)
           print(dsin[vpair[0]], dsin[vpair[0]])
           xrot[vpair[0]],yrot[vpair[1]] = rotate_vector_cice5(dsin[vpair[0]],dsin[str(vpair[1])], "tripole", angle)
           xrot[vpair[0]].name=vpair[0]
           yrot[vpair[1]].name=vpair[1]

# Regrid each variable type separately
        tvars = [tregrid(dsin[vname]) for vname in tlist]
        uvars = [uregrid(xrot[vname]) for vname in xlist]
        vvars = [uregrid(yrot[vname]) for vname in ylist]
        svars = [uregrid(dsin[vname]) for vname in slist]
        ngvars = [dsin[vname] for vname in olist]

# Merge variables in single xarray object
        dout = xr.merge(tvars+uvars+vvars+svars+ngvars)

        dout.attrs['Conventions']="CF-1.7"

# Set data and metadata for output grid
        x=dout['lon'][0,:]
        y=dout['lat'][:,0]

        dout['y']=y
        dout['y'].attrs['long_name']="latitude"
        dout['y'].attrs['units']="degrees_N"
        dout['y'].attrs['cartesian_axis']="Y"
        dout['x']=x
        dout['x'].attrs['long_name']="longitude"
        dout['x'].attrs['units']="degrees_E"
        dout['x'].attrs['cartesian_axis']="X"

# Copy over variable attributes

        dout = copyattrs(dsin, dout, tlist)
        dout = copyattrs(dsin, dout, ulist)
        dout = copyattrs(dsin, dout, olist)

# Fix NaN value for temperature
#dout['tmp'].attrs['_FillValue']=0.
# Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir+"/"+rlist[i]+"_regrid_0p25x0p25..nc")

# Delete xarray objects to avoid memory leak?
        del dout
def main():

    # Define data directory
    print("Get environment variables.")
    datadir = os.environ.get('UFSDATA_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    regriddir = os.environ.get('REGRID_DIR')
    cice_grid = os.environ.get('CICE5_GRID')
    ora_grid = os.environ.get('ORAS5_GRID')
    print("End get environment variables.")

    # Get grid information
    print("Begin open files.")
    flist = get_filelist(datadir, "*restart_ice.nc")
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist, __file__)
    dscice = xr.open_dataset(regriddir + cice_grid + ".nc")
    dsora = xr.open_dataset(regriddir + ora_grid + ".nc")
    print("End open files.")

    # Define ORAS5 grid
    print("Begin define grids.")
    txy = {
        'lat': dsora['nav_lat'].squeeze(),
        'lon': dsora['nav_lon'].squeeze()
    }

    # Define MOM6 tracer grid
    cicexy = {'lon': dscice['TLON'], 'lat': dscice['TLAT']}
    print("End define grids.")

    # Create regridders
    print("Begin regridder creation.")
    tregrid = create_regridder(txy, cicexy, 'ORAS5ice.to.' + cice_grid,
                               regriddir)
    print("End regridder creation.")

    # Set variable list
    tlist = ['frld', 'hicif', 'hsnif', 'sist', 'tbif1', 'tbif2', 'tbif3']

    # Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])

        # Regrid each variable type separately to the latlon grid
        print("Begin regridding.")
        tvars = [tregrid(dsin[vname]) for vname in tlist]
        print("End regridding.")

        # Merge variables in single xarray object
        dout = xr.merge(tvars)

        # Add CF convention information
        dout.attrs['Conventions'] = "CF-1.7"

        # Fix NaN value for temperature
        #dout['tmp'].attrs['_FillValue']=0.
        # Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir + "/" + rlist[i] + "_regrid_" + cice_grid +
                       ".nc")

        # Delete xarray objects to avoid memory leak?
        del dout
def main():

    # Define data directory
    print("Get environment variables.")
    datadir = os.environ.get('UFSDATA_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    regriddir = os.environ.get('REGRID_DIR')
    mom_grid = os.environ.get('MOM6_GRID')
    ora_grid = os.environ.get('ORAS5_GRID')
    print("End get environment variables.")

    # Get grid information
    print("Begin open files.")
    flist = get_filelist(datadir, "*restart.nc")
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist, __file__)
    dsmom = xr.open_dataset(regriddir + mom_grid + ".nc")
    dsora = xr.open_dataset(regriddir + ora_grid + ".nc")
    print("End open files.")

    # Define ORAS5 grid
    print("Begin define grids.")
    txy = {'lat': dsora['gphit'].squeeze(), 'lon': dsora['glamt'].squeeze()}

    # Define MOM6 tracer grid
    momxy = {'lon': dsmom['geolon'], 'lat': dsmom['geolat']}
    print("End define grids.")

    # Create regridders
    print("Begin regridder creation.")
    tregrid = create_regridder(txy, momxy, 'ORAS5T.to.' + mom_grid, regriddir)
    print("End regridder creation.")

    # Set variable list
    tlist = ['tn', 'sn']

    # Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])

        # Regrid each variable type separately to the latlon grid
        print("Begin regridding.")
        tvars = [tregrid(dsin[vname]) for vname in tlist]
        print("End regridding.")

        # Merge variables in single xarray object
        dout = xr.merge(tvars)

        dout.attrs['Conventions'] = "CF-1.7"

        # Set data and metadata for output grid

        dout['geolat'] = dsmom['geolat']
        dout['geolon'] = dsmom['geolon']

        # Fix NaN value for temperature
        #dout['tmp'].attrs['_FillValue']=0.
        # Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir + "/" + rlist[i] + "_regrid_0p25x0p25.nc")

        # Delete xarray objects to avoid memory leak?
        del dout
def main():

# Define data directory
    print("Get environment variables.")
    datadir = os.environ.get('UFSDATA_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    regriddir = os.environ.get('REGRID_DIR')
    ll_grid = os.environ.get('LL_GRID')
    ora_grid = os.environ.get('ORAS5_GRID')
    print("End get environment variables.")

# Get grid information
    print("Begin open files.")
    flist = get_filelist(datadir,"*restart.nc")
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist,__file__)
    dsll=xr.open_dataset(regriddir+ll_grid+".nc")
    dsora =  xr.open_dataset(regriddir+ora_grid)
    print("End open files.")

# Define ORAS5 grid
    print("Begin define grids.")
    txy = {'lat':dsora['gphit'].squeeze(), 'lon':dsora['glamt'].squeeze()}
    uxy = {'lat':dsora['gphiu'].squeeze(), 'lon':dsora['glamu'].squeeze()}
    vxy = {'lat':dsora['gphiv'].squeeze(), 'lon':dsora['glamv'].squeeze()}
    fxy = {'lat':dsora['gphif'].squeeze(), 'lon':dsora['glamf'].squeeze()}

# Define latlon grid
    llxy = {'lon':dsll['lon'], 'lat':dsll['lat']}
    print("End define grids.")

# Create regridders
    print("Begin regridder creation.")
    tregrid = create_regridder(txy, llxy, 'ORAS5T.to.'+ll_grid,regriddir)
    uregrid = create_regridder(uxy, llxy, 'ORAS5U.to.'+ll_grid,regriddir)
    vregrid = create_regridder(vxy, llxy, 'ORAS5V.to.'+ll_grid,regriddir)
    fregrid = create_regridder(fxy, llxy, 'ORAS5F.to.'+ll_grid,regriddir) 
    print("End regridder creation.")

# Get angles between tripole and N-S grids
    print("Begin read grid angles.")
    cosu = dsora['cosu']
    sinu = dsora['sinu']
    cost = dsora['cost']
    sint = dsora['sint']
    cosv = dsora['cosv']
    sinv = dsora['sinv']
    cosf = dsora['cosf']
    sinf = dsora['sinf']
    print("End read grid angles.")

# Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])

# Create list of variables pairs
        vpair = ['un','vn']
        tlist = ['tn','sn']

# Rotate vector pairs
        print("Begin vector rotation.")
        print(dsin[vpair[0]], dsin[vpair[1]])
        xrot,yrot = rotate_vector_oras5(dsin[vpair[0]],dsin[str(vpair[1])], "tripole", sinu, cosu)
        xrot.name=vpair[0]
        yrot.name=vpair[1]
        print("End vector rotation.")

# Regrid each variable type separately to the latlon grid
        print("Begin regridding.")
        tvars = [tregrid(dsin[vname]) for vname in tlist]
        uvars = uregrid(xrot)
        vvars = uregrid(yrot)
        print("End regridding.")

# Merge variables in single xarray object
        dout = xr.merge(tvars+uvars+vvars)

        dout.attrs['Conventions']="CF-1.7"

# Set data and metadata for output grid
        x=llxy['lon'][0,:]
        y=llxy['lat'][:,0]

        dout['y']=y
        dout['y'].attrs['long_name']="latitude"
        dout['y'].attrs['units']="degrees_N"
        dout['y'].attrs['cartesian_axis']="Y"
        dout['x']=x
        dout['x'].attrs['long_name']="longitude"
        dout['x'].attrs['units']="degrees_E"
        dout['x'].attrs['cartesian_axis']="X"

# Fix NaN value for temperature
#dout['tmp'].attrs['_FillValue']=0.
# Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir+"/"+rlist[i]+"_regrid_0p25x0p25.nc")

# Delete xarray objects to avoid memory leak?
        del dout
def main():

# Define data directory
    datadir = os.environ.get('INPUT_DIR')
    postdir = os.environ.get('INPUT_DIR')
    regriddir = os.environ.get('REGRID_DIR')
    gspec = os.environ.get('MOM6_TARGET_GRID')
    flist = get_filelist(datadir,"oras5_MOM6_IC_UV_v1.nc")
    dsets = open_filelist(flist,__file__)
    uname = 'u'
    vname = 'v'
    vlist = ['u','v']

# Get target grid
    ds_stat=xr.open_dataset(regriddir+gspec)

# Get various coordinate combinations
    xhyh,xhyq,xqyh,xqyq = parse_mom6static(ds_stat)
    print(xhyh,xhyq,xqyh,xqyq)

# Create input latlon grid
    llxy = {'lon':dsets[0]['xt_ocean'], 'lat':dsets[0]['yt_ocean']}

# Create regridders
# ORAS5 latlon to MOM6 Ct grid
    xhyhregrid = create_regridder(llxy, xhyh, "0p25x0p25.to.xhyh", regriddir)

#MOM6 Ct grid to U    
    xhyh_to_xqyh = create_regridder(xhyh, xqyh, "xhyh.to.xqyh", regriddir)

# MOM6 Ct grid to V
    xhyh_to_xhyq = create_regridder(xhyh, xhyq, "xhyh.to.xhyq", regriddir)

# Get angles between MOM6 tripole and N-S grids
    sin_rot = ds_stat['sin_rot']
    cos_rot = ds_stat['cos_rot']

# Regrid from LL to xhyh grid where rotation angle is defined
    #plt.contourf(usets[0][uname][0,0,:,:])
    #plt.colorbar()
    #plt.show()

    uct = xhyhregrid(dsets[0][uname])
    vct = xhyhregrid(dsets[0][vname])
    #plt.contourf(uct[0,0,:,:])
    #plt.colorbar()
    #plt.show()

# Rotate vector pairs
    xrot,yrot = rotate_vector_mom6(uct, vct, "latlon", sin_rot, cos_rot)
    xrot.name=uname
    yrot.name=vname

# Regrid from Ct to staggered U and V 
    xout = xhyh_to_xqyh(xrot)
    yout = xhyh_to_xhyq(yrot)    

# Merge variables in single xarray object
    dout = xout.to_dataset(name=uname)
    dout[vname]=yout 

    dout.attrs['Conventions']="CF-1.7"

# Set data and metadata for output grid
    x=ds_stat['geolon']
    y=ds_stat['geolat']

    dout['y']=y
    dout['y'].attrs['long_name']="latitude"
    dout['y'].attrs['units']="degrees_N"
    dout['y'].attrs['cartesian_axis']="Y"
    dout['x']=x
    dout['x'].attrs['long_name']="longitude"
    dout['x'].attrs['units']="degrees_E"
    dout['x'].attrs['cartesian_axis']="X"

# Copy over variable attributes

    #dout = copyattrs(usets[0], dout, ulist)
    #dout = copyattrs(vsets[0], dout, vlist)

# Write output
    if not os.path.exists(postdir):
        os.makedirs(postdir)
    dout.to_netcdf(postdir+"/ORAS5_"+uname+"_"+vname+"_to_MOM6_tripolar.nc")

# Delete xarray objects to avoid memory leak?
    del dout
def main():

    # Define data directory
    datadir = os.environ.get('UFSOUTPUT_DIR')
    postdir = os.environ.get('UFSPOST_DIR')
    #flist = get_filelist(datadir,"*cice*nc")
    flist = get_filelist(
        datadir,
        "ufs.s2s.C384_t025.20120701.cmeps_v0.5.1.cice.h2_06h.2012-07-01-21600.nc"
    )
    rlist = get_fileroot(flist)
    dsets = open_filelist(flist, __file__)

    # Get target grid
    ds_out = xr.open_dataset(os.environ.get('CICE_TARGET_GRID'))

    # Create tgrid
    txy = {'lon': dsets[0]['TLON'], 'lat': dsets[0]['TLAT']}
    uxy = {'lon': dsets[0]['ULON'], 'lat': dsets[0]['ULAT']}

    # Create regridders
    tregrid = create_regridder(txy, ds_out, 'TGRID')
    uregrid = create_regridder(uxy, ds_out, 'UGRID')

    # Get angle between tripole and N-S grids
    angle = dsets[0]['ANGLE']
    anglet = dsets[0]['ANGLET']

    # Define pole types
    #    poles = {}
    #    poles['ds_in'] = np.array([ESMF.PoleKind.MONOPOLE, ESMF.PoleKind.MONOPOLE], np.int32)
    #    poles['ds_out'] = np.array([ESMF.PoleKind.MONOPOLE, ESMF.PoleKind.MONOPOLE], np.int32)

    # Iterate over open files
    for i, dsin in enumerate(dsets):
        print(flist[i])
        vlist = list(dsin.data_vars.keys())
        glist = {vname: parse_utgrid(dsin, vname) for vname in vlist}

        # Create list of different variable types
        tlist = [vname for vname in vlist if "TLAT" in glist[vname]]
        ulist = [vname for vname in vlist if "ULAT" in glist[vname]]
        olist = [vname for vname in vlist if "NA" in glist[vname]]
        print(ulist)

        # Test rotation
        uvel_h_rot, vvel_h_rot = rotate_vector_cice5(dsin['uvel_h'],
                                                     dsin['vvel_h'], "tripole",
                                                     angle)
        utest = uregrid(uvel_h_rot)
        vtest = uregrid(vvel_h_rot)
        print(utest.shape)
        #plt.contourf(utest[0,:,:])
        #plt.show()
        # Regrid each variable type separately
        #tvars = [esmf_regrid(dsin[vname],txy,ds_out,poles,vname) for vname in tlist]
        #uvars = [esmf_regrid(dsin[vname],uxy,ds_out,poles,vname) for vname in ulist]
        tvars = [tregrid(dsin[vname]) for vname in tlist]
        uvars = [uregrid(dsin[vname]) for vname in ulist]
        ngvars = [dsin[vname] for vname in olist]

        # Merge variables in single xarray object
        dout = xr.merge(tvars + uvars + ngvars + utest + vtest)

        dout.attrs['Conventions'] = "CF-1.7"

        # Set data and metadata for output grid
        x = dout['lon'][0, :]
        y = dout['lat'][:, 0]

        dout['y'] = y
        dout['y'].attrs['long_name'] = "latitude"
        dout['y'].attrs['units'] = "degrees_N"
        dout['y'].attrs['cartesian_axis'] = "Y"
        dout['x'] = x
        dout['x'].attrs['long_name'] = "longitude"
        dout['x'].attrs['units'] = "degrees_E"
        dout['x'].attrs['cartesian_axis'] = "X"

        # Copy over variable attributes

        dout = copyattrs(dsin, dout, tlist)
        dout = copyattrs(dsin, dout, ulist)
        dout = copyattrs(dsin, dout, olist)

        # Fix NaN value for temperature
        #dout['tmp'].attrs['_FillValue']=0.
        # Write output
        if not os.path.exists(postdir):
            os.makedirs(postdir)
        dout.to_netcdf(postdir + "/" + rlist[i] + "_regrid_0p25x0p25.nc")

        # Delete xarray objects to avoid memory leak?
        del dout