예제 #1
0
def main(gliders, save_dir, bathymetry, landcolor, glider_t0, glider_t1,
         current_glider_location):
    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = glider_t0
    gargs['time_end'] = glider_t1

    # initialize keyword arguments for map plot
    kwargs = dict()
    kwargs['landcolor'] = landcolor
    kwargs['current_glider_loc'] = current_glider_location

    if bathymetry:
        bath = xr.open_dataset(bathymetry)
    else:
        bath = False

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider)
        os.makedirs(sdir_glider, exist_ok=True)
        kwargs['save_dir'] = sdir_glider

        glider_ds = gld.glider_dataset(glider, **gargs)
        glider_region = gld.glider_region(
            glider_ds)  # define the glider region

        # Loop through regions
        for region in glider_region.items():
            if region[0] == 'zoomed':
                extent = region[1]['lonlat']
                if bath:
                    kwargs['bathy'] = bath.sel(
                        lon=slice(extent[0] - .1, extent[1] + .1),
                        lat=slice(extent[2] - .1, extent[3] + .1))

                glider_track(glider_ds, region, **kwargs)
예제 #2
0
def main(gliders, save_dir, profile_t0, ylims, x_lims, gwh):
    gofsurl = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0'
    rtofsurl = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/'
    # rtofsurl = '/home/hurricaneadm/data/rtofs'  # on server

    xlabels = {'temperature': 'Temperature ($^oC$)', 'salinity': 'Salinity'}

    for pt0 in profile_t0:
        print('\nPlotting profile at {}'.format(pt0))
        pt0_str = pt0.strftime('%Y-%m-%dT%H:%M')
        pt0_str_save = pt0.strftime('%Y%m%dT%H%M')

        # initialize keyword arguments for glider functions.
        gargs = dict()
        gargs['time_start'] = pt0 - dt.timedelta(hours=gwh)
        gargs['time_end'] = pt0 + dt.timedelta(hours=gwh)
        gargs['filetype'] = 'dataframe'

        for glider in gliders:
            glider_name = glider.split('-')[0]
            sdir_glider = os.path.join(save_dir, glider, 'profiles')
            os.makedirs(sdir_glider, exist_ok=True)
            glider_ds = gld.glider_dataset(glider, **gargs)
            gl_t0 = pd.to_datetime(np.nanmin(
                glider_ds['time'])).strftime('%Y-%m-%dT%H:%M')
            gl_t1 = pd.to_datetime(np.nanmax(
                glider_ds['time'])).strftime('%Y-%m-%dT%H:%M')

            # average glider profile location
            gl_pl = [
                np.round(np.nanmean(glider_ds.longitude.values), 2),
                np.round(np.nanmean(glider_ds.latitude.values), 2)
            ]

            # separate glider profiles
            profiletimes, idx = np.unique(glider_ds.time.values,
                                          return_index=True)

            targetlon = np.unique(glider_ds.longitude.values)
            targetlat = np.unique(glider_ds.latitude.values)

            targetlon_GOFS = storms.convert_target_gofs_lon(targetlon)

            # get GOFS data
            with xr.open_dataset(gofsurl, drop_variables='tau') as gofs:
                gofs = gofs.rename({
                    'surf_el': 'sea_surface_height',
                    'water_temp': 'temperature',
                    'water_u': 'u',
                    'water_v': 'v'
                })
                gofs_ds = gofs.sel(time=pt0, depth=slice(0, 1000))

                oklonGOFS = np.unique(
                    np.round(
                        np.interp(targetlon_GOFS, gofs_ds.lon,
                                  np.arange(0, len(gofs_ds.lon)))).astype(int))
                oklatGOFS = np.unique(
                    np.round(
                        np.interp(targetlat, gofs_ds.lat,
                                  np.arange(0, len(gofs_ds.lat)))).astype(int))

                # check that the glider doesn't cross more than one GOFS grid point
                if np.logical_or(len(oklonGOFS) > 1, len(oklatGOFS) > 1):
                    raise ValueError(
                        'Glider crosses >1 GOFS grid point. Choose different time range.'
                    )

                # get RTOFS data
                if pt0.hour == 0:
                    hr = '{:03d}'.format(24)
                    rtofst0 = pt0 - dt.timedelta(days=1)
                else:
                    hr = '{:03d}'.format(pt0.hour)
                    rtofst0 = pt0
                rfile = f"{rtofsurl}{rtofst0.strftime('rtofs.%Y%m%d')}/rtofs_glo_3dz_f{hr}_6hrly_hvr_US_east.nc"
                rtofs_ds = xr.open_dataset(rfile)
                rtofs_ds = rtofs_ds.rename({
                    'Longitude': 'lon',
                    'Latitude': 'lat',
                    'MT': 'time',
                    'Depth': 'depth'
                })
                rtofs_ds = rtofs_ds.sel(depth=slice(0, 1000))

                oklonRTOFS = np.unique(
                    np.round(
                        np.interp(targetlon, rtofs_ds.lon[0, :],
                                  np.arange(0, len(
                                      rtofs_ds.lon[0, :])))).astype(int))
                oklatRTOFS = np.unique(
                    np.round(
                        np.interp(targetlat, rtofs_ds.lat[:, 0],
                                  np.arange(0, len(
                                      rtofs_ds.lat[:, 0])))).astype(int))

                # check that the glider doesn't cross more than one RTOFS grid point
                if np.logical_or(len(oklonRTOFS) > 1, len(oklatRTOFS) > 1):
                    raise ValueError(
                        'Glider crosses >1 RTOFS grid point. Choose different time range: {}'
                        .format(pt0))

                lon_RTOFS = rtofs_ds.lon.values[0, oklonRTOFS]
                lat_RTOFS = rtofs_ds.lat.values[oklatRTOFS, 0]
                RTOFS_pl = [
                    np.round(lon_RTOFS[0], 2),
                    np.round(lat_RTOFS[0], 2)
                ]

                for pv, xl in x_lims.items():
                    fig, ax = plt.subplots(figsize=(8, 9))
                    plt.subplots_adjust(right=0.88, left=0.15)
                    plt.grid()

                    # plot glider profiles
                    for pt in profiletimes:
                        # pt_idx = np.squeeze(np.argwhere(glider_ds.time.values == pt))
                        pt_gl = glider_ds[glider_ds['time'] == pt]
                        # pt_gl = pt_gl[pt_gl.pressure != 0.00]  # get rid of zeros
                        x = pt_gl[pv]
                        y = pt_gl['depth']
                        xmask = ~np.isnan(
                            x)  # get rid of nans so the lines are continuous
                        # ax.plot(x[xmask], y[xmask], lw=3, c='k', label=glider_name)
                        ax.plot(x[xmask],
                                y[xmask],
                                lw=3,
                                c='blue',
                                label=glider_name)

                    # plot GOFS
                    GOFS_targetvar = np.squeeze(gofs_ds[pv][:, oklatGOFS,
                                                            oklonGOFS])
                    GOFS_lon = storms.convert_gofs_target_lon(
                        GOFS_targetvar.lon.values.tolist())
                    GOFS_pl = [
                        np.round(GOFS_lon[0], 2),
                        np.round(GOFS_targetvar.lat.values, 2)
                    ]
                    #ax.plot(GOFS_targetvar.values, GOFS_targetvar.depth.values, lw=3, c='tab:blue', label='GOFS')
                    ax.plot(GOFS_targetvar.values,
                            GOFS_targetvar.depth.values,
                            lw=3,
                            c='red',
                            label='GOFS')

                    # plot RTOFS
                    RTOFS_targetvar = np.squeeze(rtofs_ds[pv][0, :, oklatRTOFS,
                                                              oklonRTOFS])
                    #ax.plot(RTOFS_targetvar.values, RTOFS_targetvar.depth.values, lw=3, c='tab:orange', label='RTOFS')
                    ax.plot(RTOFS_targetvar.values,
                            RTOFS_targetvar.depth.values,
                            lw=3,
                            c='green',
                            label='RTOFS')

                    if ylims:
                        ax.set_ylim(ylims)
                    else:  # set y limits to glider max depth
                        rounded_depth = np.ceil(
                            np.nanmax(glider_ds['depth']) / 10) * 10
                        ax.set_ylim([0, rounded_depth])
                    if xl:
                        ax.set_xticks(xl)
                    ax.set_xlabel(xlabels[pv])
                    ax.set_ylabel('Depth (m)')

                    ax.invert_yaxis()

                    # get legend handles and only show one set
                    handles, labels = plt.gca().get_legend_handles_labels()
                    by_label = dict(zip(labels, handles))
                    # fig.legend(by_label.values(), by_label.keys(), framealpha=0.5, ncol=3, bbox_to_anchor=(0.89, 0.84), fontsize=12)
                    ax.legend(by_label.values(), by_label.keys(), fontsize=12)

                    ttl = f"GOFS: {pt0_str}, {GOFS_pl}\nRTOFS: {pt0_str}, {RTOFS_pl}\n" \
                          f"Glider: {gl_t0} to {gl_t1}, {gl_pl}"

                    ax.set_title(ttl)

                    savefile = os.path.join(
                        sdir_glider,
                        f'{glider_name}_models_profiles_{pv}-{pt0_str_save}.png'
                    )
                    plt.savefig(savefile, dpi=300)
                    plt.close()
def main(gliders, save_dir, bathymetry, m_t0, m_t1, g_t0, g_t1, lt, cgl):
    url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/'
    # url = '/home/hurricaneadm/data/rtofs'  # on server

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1

    # initialize keyword arguments for map plot
    kwargs = dict()
    kwargs['model'] = 'rtofs'
    kwargs['transform'] = ccrs.PlateCarree()
    kwargs['current_glider_loc'] = cgl

    if bathymetry:
        bath = xr.open_dataset(bathymetry)
    else:
        bath = False

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider)
        os.makedirs(sdir_glider, exist_ok=True)
        kwargs['save_dir'] = sdir_glider

        glider_ds = gld.glider_dataset(glider, **gargs)
        kwargs['gliders'] = glider_ds
        glider_region = gld.glider_region(
            glider_ds)  # define the glider region

        gl_t0 = pd.to_datetime(np.nanmin(glider_ds.time.values))
        gl_t1 = pd.to_datetime(np.nanmax(glider_ds.time.values))

        if len(glider_region) < 1:
            raise ValueError('No region found for glider: {}'.format(glider))

        if lt:
            lt = gld.custom_gliderline_transects()
            kwargs['custom_transect'] = dict(
                lon=[lt[glider]['extent'][0], lt[glider]['extent'][2]],
                lat=[lt[glider]['extent'][1], lt[glider]['extent'][3]])

        # get RTOFS files
        if m_t0:
            mt0 = m_t0
        else:
            mt0 = gl_t0 - dt.timedelta(hours=6)
        if m_t1:
            mt1 = m_t1
        else:
            mt1 = gl_t1 + dt.timedelta(days=1)

        model_dates = [
            x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1)
        ]
        rtofs_files = [
            glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates
        ]
        rtofs_files = sorted(
            [inner for outer in rtofs_files for inner in outer])

        # Loop through regions
        for region in glider_region.items():
            extent = region[1]['lonlat']
            if bath:
                kwargs['bathy'] = bath.sel(lon=slice(extent[0] - .1,
                                                     extent[1] + .1),
                                           lat=slice(extent[2] - .1,
                                                     extent[3] + .1))

            for f in rtofs_files:
                print(f)
                try:
                    with xr.open_dataset(f) as ds:
                        ds = ds.rename({
                            'Longitude': 'lon',
                            'Latitude': 'lat',
                            'MT': 'time',
                            'Depth': 'depth'
                        })
                        lat = ds.lat.data
                        lon = ds.lon.data

                        # subset the RTOFS grid
                        lonidx = [extent[0] - 1, extent[1] + 1]
                        latidx = [extent[2] - 1, extent[3] + 1]
                        lonIndex = np.round(
                            np.interp(lonidx, lon[0, :],
                                      np.arange(0,
                                                len(lon[0, :])))).astype(int)
                        latIndex = np.round(
                            np.interp(latidx, lat[:, 0],
                                      np.arange(0, len(lat[:,
                                                           0])))).astype(int)
                        sub = ds.sel(X=slice(lonIndex[0], lonIndex[1]),
                                     Y=slice(latIndex[0], latIndex[1]))
                        surface_map_glider_track(sub, region, **kwargs)
                except OSError:
                    continue
예제 #4
0
def main(gliders, save_dir, g_t0, g_t1):
    url = '/Users/mikesmith/Documents/github/rucool/hurricanes/data/rtofs/'

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects',
                                   'transect-ribbons')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)

        # Profile plotting
        # grouped = list(glider_df.groupby([pd.Grouper(freq='1D', key='time')]))
        grouped = list(
            glider_df.groupby([pd.Grouper(freq='24H', key='time', base=3)]))

        fig, ax = plt.subplots(1,
                               len(grouped),
                               figsize=(16, 9),
                               constrained_layout=True)
        # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24))))

        for i in range(len(grouped)):
            newgroup = list(grouped[i][1].groupby('time'))
            ax[i].set_prop_cycle(
                plt.cycler('color',
                           plt.cm.Reds(np.linspace(0, 1, len(newgroup)))))
            for group in newgroup:
                # temperature profile... y axis - depth, x axis. - temperature. color- time
                h = ax[i].scatter(group[1]['temperature'],
                                  group[1]['depth'],
                                  label=group[0].strftime('%H:%M:%S'),
                                  edgecolor='black')

            ax[i].legend()
            ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'),
                            fontsize=18,
                            fontweight='bold')

        for axs in ax.flat:
            axs.set_ylim([60, 1])
            axs.set_xlim([21, 30.5])
            axs.grid(True, linestyle='--', linewidth=0.5)
            axs.tick_params(axis='x', labelsize=14)
            axs.tick_params(axis='y', labelsize=14)
            axs.set_xlabel('Temperature (°C)', fontsize=16, fontweight='bold')
            axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold')

        plt.suptitle(
            'Temperature Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31',
            fontsize=20,
            fontweight='bold')

        plt.savefig(
            '/Users/mikesmith/Documents/ng645-daily_temperature-profile-ida',
            bbox_inches='tight',
            pad_inches=0.1,
            dpi=150)
        plt.close()

        fig, ax = plt.subplots(1,
                               len(grouped),
                               figsize=(16, 9),
                               constrained_layout=True)
        # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24))))

        for i in range(len(grouped)):
            newgroup = list(grouped[i][1].groupby('time'))
            ax[i].set_prop_cycle(
                plt.cycler('color',
                           plt.cm.Greens(np.linspace(0, 1, len(newgroup)))))
            for group in newgroup:
                # temperature profile... y axis - depth, x axis. - temperature. color- time
                h = ax[i].scatter(
                    group[1]['salinity'],
                    group[1]['depth'],
                    label=group[0].strftime('%H:%M:%S'),
                    edgecolor='black',
                )

            ax[i].legend()
            ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'),
                            fontsize=18,
                            fontweight='bold')

        for axs in ax.flat:
            axs.set_ylim([60, 1])
            axs.set_xlim([34.5, 37])
            axs.grid(True, linestyle='--', linewidth=0.5)
            axs.tick_params(axis='x', labelsize=14)
            axs.tick_params(axis='y', labelsize=14)
            axs.set_xlabel('Salinity (1)', fontsize=16, fontweight='bold')
            axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold')

        plt.suptitle(
            'Salinity Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31',
            fontsize=20,
            fontweight='bold')

        plt.savefig(
            '/Users/mikesmith/Documents/ng645-daily_salinity-profile-ida',
            bbox_inches='tight',
            pad_inches=0.1,
            dpi=150)
        plt.close()

        fig, ax = plt.subplots(1,
                               len(grouped),
                               figsize=(16, 9),
                               constrained_layout=True)
        # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24))))
        for i in range(len(grouped)):
            newgroup = list(grouped[i][1].groupby('time'))

            # cmap = mpl.cm.Blues(np.linspace(0, 1, len(newgroup)))
            # cmap = mpl.colors.ListedColormap(cmap[0:10])
            cmap = plt.cm.Blues(np.linspace(0, 1, len(newgroup)))

            ax[i].set_prop_cycle(plt.cycler('color', cmap))
            for group in newgroup:
                # temperature profile... y axis - depth, x axis. - temperature. color- time
                h = ax[i].scatter(group[1]['density'],
                                  group[1]['depth'],
                                  label=group[0].strftime('%H:%M:%S'),
                                  edgecolor='black')

            ax[i].legend()
            ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'),
                            fontsize=18,
                            fontweight='bold')

        for axs in ax.flat:
            axs.set_ylim([60, 1])
            axs.set_xlim([1021, 1026])
            axs.grid(True, linestyle='--', linewidth=0.5)
            axs.tick_params(axis='x', labelsize=14)
            axs.tick_params(axis='y', labelsize=14)
            axs.set_xlabel('density (kg m-3)', fontsize=16, fontweight='bold')
            axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold')

        plt.suptitle(
            'Density Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31',
            fontsize=20,
            fontweight='bold')

        plt.savefig(
            '/Users/mikesmith/Documents/ng645-daily_density-profile-ida',
            bbox_inches='tight',
            pad_inches=0.1,
            dpi=150)
        plt.close()
예제 #5
0
def main(gliders, save_dir, m_t0, m_t1, g_t0, g_t1, lt, ylims, color_lims):
    url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0'

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects', 'gofs')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        gl_t0 = pd.to_datetime(np.nanmin(glider_df['time']))
        gl_t1 = pd.to_datetime(np.nanmax(glider_df['time']))

        if lt:  # get the straight line transect
            lt = gld.custom_gliderline_transects()
            x1 = lt[glider]['extent'][0]
            y1 = lt[glider]['extent'][1]
            x2 = lt[glider]['extent'][2]
            y2 = lt[glider]['extent'][3]

            # calculate longitude and latitude of transect lines
            targetlon, targetlat, _ = calculate_transect(x1, y1, x2, y2)

        else:  # get the temperature transect along the glider track
            print('Getting GOFS custom temperature transect')
            targetlon = np.array(glider_df['longitude'])
            targetlat = np.array(glider_df['latitude'])

        targetlon_GOFS = storms.convert_target_gofs_lon(targetlon)

        with xr.open_dataset(url, drop_variables='tau') as gofs:
            gofs = gofs.rename({
                'surf_el': 'sea_surface_height',
                'water_temp': 'temperature',
                'water_u': 'u',
                'water_v': 'v'
            })

            # Subset time range
            if m_t0:
                mt0 = m_t0
            else:
                mt0 = gl_t0 - dt.timedelta(hours=6)
            if m_t1:
                mt1 = m_t1
            else:
                mt1 = gl_t1 + dt.timedelta(days=1)

            ds = gofs.sel(time=slice(mt0, mt1), depth=slice(0, 500))

            for t in ds.time:
                tds = ds.sel(time=t)
                date_str = pd.to_datetime(
                    t.values).strftime('%Y-%m-%d %H:%M:%S')
                date_save = pd.to_datetime(
                    t.values).strftime('%Y-%m-%dT%H%M%SZ')

                # get the temperature transect from the model and glider
                mtemp, mdepth, lon_sub, lat_sub = storms.custom_transect(
                    tds, 'temperature', targetlon_GOFS, targetlat, 'gofs')
                gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(
                    glider_df, 'temperature', 0.5)

                # plot temperature by longitude - model only
                targs = {}
                targs['cmap'] = cmocean.cm.thermal
                targs['clab'] = 'Temperature ($^oC$)'
                targs[
                    'title'] = f'GOFS Temperature at {date_str} UTC\n{glider} glider track'
                targs['save_file'] = os.path.join(
                    sdir_glider,
                    f'{glider.split("-")[0]}_gofs_transect_temp-{date_save}.png'
                )
                targs['levels'] = color_lims['temp']
                targs['ylims'] = ylims
                print('plotting temperature by longitude')
                plot_transect(lon_sub, -mdepth, mtemp, **targs)

                # plot temperature by longitude - model and glider
                del targs['title']
                targs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to '\
                                  f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}'
                targs['title1'] = f'GOFS Temperature at {date_str} UTC'
                targs['save_file'] = os.path.join(
                    sdir_glider,
                    f'{glider.split("-")[0]}_gofs_glider_transect_temp-{date_save}.png'
                )
                plot_transects(gl_lon, -gl_depth, gl_temp, lon_sub, -mdepth,
                               mtemp, **targs)

                # get the salinity transect from the model and glider
                print('Getting GOFS custom salinity transect')
                msalt, mdepth, lon_sub, lat_sub = storms.custom_transect(
                    tds, 'salinity', targetlon_GOFS, targetlat, 'gofs')
                gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(
                    glider_df, 'salinity', 0.5)

                # plot salinity by longitude
                sargs = {}
                sargs['cmap'] = cmocean.cm.haline
                sargs['clab'] = 'Salinity'
                sargs[
                    'title'] = f'GOFS Salinity at {date_str} UTC\n{glider} glider track'
                sargs['save_file'] = os.path.join(
                    sdir_glider,
                    f'{glider.split("-")[0]}_gofs_transect_salt-{date_save}.png'
                )
                sargs['levels'] = color_lims['salt']
                sargs['ylims'] = ylims
                print('plotting salinity by longitude')
                plot_transect(lon_sub, -mdepth, msalt, **sargs)

                # plot salinity by longitude - model and glider
                del sargs['title']
                sargs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \
                                  f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}'
                sargs['title1'] = f'GOFS Salinity at {date_str} UTC'
                sargs['save_file'] = os.path.join(
                    sdir_glider,
                    f'{glider.split("-")[0]}_gofs_glider_transect_salt-{date_save}.png'
                )
                plot_transects(gl_lon, -gl_depth, gl_salt, lon_sub, -mdepth,
                               msalt, **sargs)
예제 #6
0
def main(gliders, save_dir, g_t0, g_t1, xlims, ylims):
    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'
    t0 = g_t0.strftime('%Y-%m-%d')
    t1 = g_t1.strftime('%Y-%m-%d')

    t = np.arange(xlims['temperature'][0], xlims['temperature'][1], xlims['temperature'][2])
    t = np.append(t, xlims['temperature'][1])

    s = np.arange(xlims['salinity'][0], xlims['salinity'][1], xlims['salinity'][2])
    s = np.append(s, xlims['salinity'][1])

    d = np.arange(xlims['density'][0], xlims['density'][1], xlims['density'][2])
    d = np.append(d, xlims['density'][1])

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        # cm = plt.get_cmap('RdYlBu', 10)
        # cmap = cmocean.tools.cmap(cmocean.cm.thermal, N=10)

        cmdict = cmocean.tools.get_dict(cmocean.cm.thermal, N=t.shape[0]-1)
        thermal = LinearSegmentedColormap(cmocean.cm.thermal, segmentdata=cmdict, N=t.shape[0]-1)

        cmdict = cmocean.tools.get_dict(cmocean.cm.haline, N=s.shape[0]-1)
        haline = LinearSegmentedColormap(cmocean.cm.haline, segmentdata=cmdict, N=s.shape[0]-1)

        cmdict = cmocean.tools.get_dict(cmocean.cm.dense, N=d.shape[0]-1)
        dense = LinearSegmentedColormap(cmocean.cm.dense, segmentdata=cmdict, N=d.shape[0]-1)

        # temperature section... time on x axis.. depth on y axis... color-  temperature
        fig, ax = plt.subplots(figsize=(16, 8))
        plt.scatter(glider_df['time'],
                    glider_df['depth'],
                    20,
                    glider_df['temperature'],
                    cmap=thermal.reversed(thermal),
                    vmin=t[0],
                    vmax=t[-1]
                    )
        plt.ylim(ylims)
        cb = plt.colorbar()
        cb.ax.tick_params(labelsize=14)
        cb.set_label('Temperature (°C)', fontsize=16)

        # Add the grid
        plt.grid()
        plt.xticks(rotation=45, fontsize=16)
        plt.yticks(fontsize=16)
        xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S')
        ax.xaxis.set_major_formatter(xfmt)
        plt.title(f'Temperature Section for Glider: {glider}\nStart: {t0}, End: {t1}',
                  fontsize=20, fontweight='bold')
        plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')
        plt.savefig(f'/Users/mikesmith/Documents/{glider}-temperature-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300)
        plt.close()

        fig, ax = plt.subplots(figsize=(16, 8))
        plt.scatter(glider_df['time'],
                    glider_df['depth'],
                    20,
                    glider_df['salinity'],
                    cmap=haline.reversed(haline),
                    vmin=s[0],
                    vmax=s[-1]
                    )
        plt.ylim(ylims)
        cb = plt.colorbar()
        cb.ax.tick_params(labelsize=14)
        cb.set_label('Salinity (1)', fontsize=16)
        plt.grid()
        plt.xticks(rotation=45, fontsize=16)
        plt.yticks(fontsize=16)
        xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S')
        ax.xaxis.set_major_formatter(xfmt)
        plt.title(f'Salinity Section for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20,
                  fontweight='bold')
        plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')
        plt.savefig(f'/Users/mikesmith/Documents/{glider}-salinity-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300)
        plt.close()

        # Density profile cross section
        fig, ax = plt.subplots(figsize=(16, 8))
        plt.scatter(glider_df['time'],
                    glider_df['depth'],
                    20,
                    glider_df['density'],
                    cmap=dense.reversed(dense),
                    vmin=d[0],
                    vmax=d[-1]
                    )
        plt.ylim(ylims)
        cb = plt.colorbar()
        cb.ax.tick_params(labelsize=14)
        cb.set_label('Density (kg m-3)', fontsize=16)
        plt.grid()
        plt.xticks(rotation=45, fontsize=16)
        plt.yticks(fontsize=16)
        xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S')
        ax.xaxis.set_major_formatter(xfmt)
        plt.title(f'Density Section for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20,
                  fontweight='bold')
        plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')
        plt.savefig(f'/Users/mikesmith/Documents/{glider}-density-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300)
        plt.close()

        # Profile plotting
        grouped = glider_df.groupby([pd.Grouper(freq='1D', key='time')])
        cmap = get_cmap(len(grouped))

        fig, ax = plt.subplots(figsize=(10, 12))
        grouped = list(grouped)

        for i in range(len(grouped)):
            # temperature profile... y axis - depth, x axis. - temperature. color- time
            plt.scatter(grouped[i][1]['temperature'],
                        grouped[i][1]['depth'],
                        12,
                        cmap=cmap(i),
                        label=grouped[i][0].strftime('%Y-%m-%d'))
        plt.ylim(ylims)
        # plt.xlim([t[0], t[-1]])
        plt.xlim([11, 23])


        plt.legend(fontsize=14)

        # Add the grid
        plt.grid()
        plt.xticks(fontsize=16)
        plt.yticks(fontsize=16)

        plt.title(f'Temperature Profile for Glider: {glider}\nStart: {t0}, End: {t1}',
                  fontsize=20, fontweight='bold')
        plt.xlabel('Temperature (°C)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')

        plt.savefig(f'/Users/mikesmith/Documents/{glider}-temperature-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1,
                    dpi=300)
        plt.close()

        fig, ax = plt.subplots(figsize=(10, 12))
        for i in range(len(grouped)):
            plt.scatter(grouped[i][1]['salinity'],
                        grouped[i][1]['depth'],
                        12,
                        cmap=i,
                        label=grouped[i][0].strftime('%Y-%m-%d'))
        plt.ylim(ylims)
        # plt.xlim([s[0], s[-1]])
        plt.xlim([31, 35])
        plt.legend(fontsize=14)

        # Add the grid
        plt.grid()
        plt.xticks(fontsize=16)
        plt.yticks(fontsize=16)
        plt.title(f'Salinity Profile for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20,
                  fontweight='bold')
        plt.xlabel('Salinity (1)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')
        # plt.show()
        plt.savefig(f'/Users/mikesmith/Documents/{glider}-salinity-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1,
                    dpi=300)
        plt.close()

        fig, ax = plt.subplots(figsize=(10, 12))
        for i in range(len(grouped)):
            plt.scatter(grouped[i][1]['density'],
                        grouped[i][1]['depth'],
                        12,
                        cmap=i,
                        label=grouped[i][0].strftime('%Y-%m-%d'))
        plt.ylim(ylims)
        plt.xlim([d[0], d[-1]])
        plt.legend(fontsize=14)

        # Add the grid
        plt.grid()
        plt.xticks(fontsize=16)
        plt.yticks(fontsize=16)
        plt.title(f'Density Profile for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20,
                  fontweight='bold')
        plt.xlabel('Density (kg m-3)', fontsize=18, fontweight='bold')
        plt.ylabel('Depth (m)', fontsize=18, fontweight='bold')
        # plt.show()
        plt.savefig(f'/Users/mikesmith/Documents/{glider}-density-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1,
                    dpi=300)
        plt.close()
예제 #7
0
# initialize keyword arguments for glider functions
gargs = dict()
gargs['time_start'] = dt.datetime(2021, 8, 28, 0, 0)  # False
gargs['time_end'] = dt.datetime(2021, 8, 30, 0, 0)
# gargs['time_start'] = dt.datetime(2021, 6, 17, 3, 0)  # False
# gargs['time_end'] = dt.datetime(2021, 6, 24, 9, 0)
gargs['filetype'] = 'dataframe'

y_limits = [-20, 0]  # None
c_limits = dict(temp=dict(shallow=np.arange(25, 30, .25)),
                salt=dict(shallow=np.arange(34, 37, .25)))

sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons')
os.makedirs(sdir_glider, exist_ok=True)
glider_df = gld.glider_dataset(glider, **gargs)

glider_df = glider_df[glider_df.depth < 150]

tdf = glider_df.sort_values('temperature', ascending=True)

grouped = tdf.groupby('time')

for group in grouped:
    mint = np.min(group[1]['temperature'])
    maxt = np.max(group[1]['temperature'])
    mins = np.min(group[1]['salinity'])
    maxs = np.max(group[1]['salinity'])
    tempL = np.linspace(mint-1, maxt+1, 156)
    salL = np.linspace(mins-1, maxs+1, 156)
    Tg, Sg = np.meshgrid(tempL, salL)
예제 #8
0
def main(gliders, save_dir, m_t0, m_t1, g_t0, g_t1, lt, ylims, color_lims):
    url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/'
    # url = '/home/hurricaneadm/data/rtofs'  # on server

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects', 'rtofs')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        gl_t0 = pd.to_datetime(np.nanmin(glider_df['time']))
        gl_t1 = pd.to_datetime(np.nanmax(glider_df['time']))

        if lt:  # get the straight line transect
            lt = gld.custom_gliderline_transects()
            x1 = lt[glider]['extent'][0]
            y1 = lt[glider]['extent'][1]
            x2 = lt[glider]['extent'][2]
            y2 = lt[glider]['extent'][3]

            # calculate longitude and latitude of transect lines
            targetlon, targetlat, _ = calculate_transect(x1, y1, x2, y2)

        else:  # get the temperature transect along the glider track
            print('Getting RTOFS custom temperature transect')
            targetlon = np.array(glider_df['longitude'])
            targetlat = np.array(glider_df['latitude'])

        # Subset time range
        if m_t0:
            mt0 = m_t0
        else:
            mt0 = gl_t0 - dt.timedelta(hours=6)
        if m_t1:
            mt1 = m_t1
        else:
            mt1 = gl_t1 + dt.timedelta(days=1)

        model_dates = [
            x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1)
        ]
        rtofs_files = [
            glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates
        ]
        rtofs_files = sorted(
            [inner for outer in rtofs_files for inner in outer])

        for f in rtofs_files:
            print(f)
            try:
                with xr.open_dataset(f) as ds:
                    ds = ds.rename({
                        'Longitude': 'lon',
                        'Latitude': 'lat',
                        'MT': 'time',
                        'Depth': 'depth'
                    })
                    ds = ds.sel(depth=slice(0, 500))

                    date_str = pd.to_datetime(
                        ds.time.values[0]).strftime('%Y-%m-%d %H:%M:%S')
                    date_save = pd.to_datetime(
                        ds.time.values[0]).strftime('%Y-%m-%dT%H%M%SZ')

                    mtemp, mdepth, lon_sub, lat_sub = storms.custom_transect(
                        ds, 'temperature', targetlon, targetlat, 'rtofs')
                    gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(
                        glider_df, 'temperature', 0.5)

                    # plot temperature by longitude - model only
                    targs = {}
                    targs['cmap'] = cmocean.cm.thermal
                    targs['clab'] = 'Temperature ($^oC$)'
                    targs[
                        'title'] = f'RTOFS Temperature at {date_str} UTC\n{glider} glider track'
                    targs['save_file'] = os.path.join(
                        sdir_glider,
                        f'{glider.split("-")[0]}_rtofs_transect_temp-{date_save}.png'
                    )
                    targs['levels'] = color_lims['temp']
                    targs['ylims'] = ylims
                    print('plotting temperature by longitude')
                    plot_transect(lon_sub, -mdepth, mtemp, **targs)

                    # plot temperature by longitude - model and glider
                    del targs['title']
                    targs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \
                                      f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}'
                    targs['title1'] = f'RTOFS Temperature at {date_str} UTC'
                    targs['save_file'] = os.path.join(
                        sdir_glider,
                        f'{glider.split("-")[0]}_rtofs_glider_transect_temp-{date_save}.png'
                    )
                    plot_transects(gl_lon, -gl_depth, gl_temp, lon_sub,
                                   -mdepth, mtemp, **targs)

                    # get the salinity transect
                    print('Getting GOFS custom salinity transect')
                    msalt, mdepth, lon_sub, lat_sub = storms.custom_transect(
                        ds, 'salinity', targetlon, targetlat, 'rtofs')
                    gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(
                        glider_df, 'salinity', 0.5)

                    # plot salinity by longitude
                    sargs = {}
                    sargs['cmap'] = cmocean.cm.haline
                    sargs['clab'] = 'Salinity'
                    sargs[
                        'title'] = f'RTOFS Salinity at {date_str} UTC\n{glider} glider track'
                    sargs['save_file'] = os.path.join(
                        sdir_glider,
                        f'{glider.split("-")[0]}_rtofs_transect_salt-{date_save}.png'
                    )
                    sargs['levels'] = color_lims['salt']
                    sargs['ylims'] = ylims
                    print('plotting salinity by longitude')
                    plot_transect(lon_sub, -mdepth, msalt, **sargs)

                    # plot salinity by longitude - model and glider
                    del sargs['title']
                    sargs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \
                                      f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}'
                    sargs['title1'] = f'RTOFS Salinity at {date_str} UTC'
                    sargs['save_file'] = os.path.join(
                        sdir_glider,
                        f'{glider.split("-")[0]}_rtofs_glider_transect_salt-{date_save}.png'
                    )
                    plot_transects(gl_lon, -gl_depth, gl_salt, lon_sub,
                                   -mdepth, msalt, **sargs)

            except OSError:
                continue
예제 #9
0
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims):
    # url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/'
    # url = '/home/hurricaneadm/data/rtofs'  # on server
    url = '/Users/mikesmith/Documents/github/rucool/hurricanes/data/rtofs/'

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects',
                                   'transect-ribbons')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        gl_t0 = pd.to_datetime(np.nanmin(glider_df['time']))
        gl_t1 = pd.to_datetime(np.nanmax(glider_df['time']))
        gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M')
        gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M')
        gl_t0save = gl_t0.strftime('%Y%m%dT%H%M')
        glider_name = glider.split('-')[0]

        # Subset time range (add a little extra to the glider time range)
        mt0 = gl_t0 - dt.timedelta(hours=2)
        mt1 = gl_t1 + dt.timedelta(hours=12)

        model_dates = [
            x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1)
        ]
        rtofs_files = [
            glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates
        ]
        rtofs_files = sorted(
            [inner for outer in rtofs_files for inner in outer])
        # make sure the file times are within the specified times
        model_time = np.array([], dtype='datetime64[ns]')
        rfiles = []
        for rf in rtofs_files:
            splitter = rf.split('/')
            ymd = splitter[-2].split('.')[-1]
            hr = splitter[-1].split('_')[3][-2:]
            if hr == '24':
                hr = '00'
                td = 1
            else:
                td = 0
            mt = dt.datetime.strptime('T'.join(
                (ymd, hr)), '%Y%m%dT%H') + dt.timedelta(days=td)
            if np.logical_and(mt >= mt0, mt <= gl_t1 + dt.timedelta(hours=1)):
                rfiles.append(rf)
                model_time = np.append(model_time, pd.to_datetime(mt))

        model_t0str = pd.to_datetime(
            np.nanmin(model_time)).strftime('%Y-%m-%dT%H:%M')
        model_t1str = pd.to_datetime(
            np.nanmax(model_time)).strftime('%Y-%m-%dT%H:%M')

        # open the first file to get some of the model information
        ds = xr.open_dataset(rfiles[0])
        ds = ds.rename({
            'Longitude': 'lon',
            'Latitude': 'lat',
            'MT': 'time',
            'Depth': 'depth'
        })
        ds = ds.sel(depth=slice(0, 1000))
        mlon = ds.lon.values
        mlat = ds.lat.values

        # interpolate glider lat/lon to lat/lon on model time
        sublonm = np.interp(pd.to_datetime(model_time),
                            pd.to_datetime(glider_df.time),
                            glider_df.longitude)
        sublatm = np.interp(pd.to_datetime(model_time),
                            pd.to_datetime(glider_df.time), glider_df.latitude)

        # interpolating transect X and Y to lat and lon
        lonIndex = np.round(
            np.interp(sublonm, mlon[0, :],
                      np.arange(0, len(mlon[0, :])))).astype(int)
        latIndex = np.round(
            np.interp(sublatm, mlat[:, 0],
                      np.arange(0, len(mlat[:, 0])))).astype(int)

        # get temperature and salinity data along the glider track (space and time)
        mtemp = np.full([len(ds.depth), len(model_time)], np.nan)
        msalt = np.full([len(ds.depth), len(model_time)], np.nan)
        for i, f in enumerate(rfiles):
            print(f)
            with xr.open_dataset(f) as ds:
                ds = ds.rename({
                    'Longitude': 'lon',
                    'Latitude': 'lat',
                    'MT': 'time',
                    'Depth': 'depth'
                })
                ds = ds.sel(depth=slice(0, 1000))
                mtemp[:, i] = ds['temperature'][0, :, latIndex[i],
                                                lonIndex[i]].values
                msalt[:, i] = ds['salinity'][0, :, latIndex[i],
                                             lonIndex[i]].values

        # get the temperature transect from the glider
        gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(
            glider_df, 'temperature', 0.5)

        # plot temperature by time (glider time/location) - model only
        targs = {}
        targs['cmap'] = cmocean.cm.thermal
        targs['clab'] = 'Temperature ($^oC$)'
        targs['title'] = f'RTOFS Temperature along {glider} track\n'\
                         f'Model: {model_t0str} to {model_t1str}\n'\
                         f'Glider: {gl_t0str} to {gl_t1str}'
        targs['save_file'] = os.path.join(
            sdir_glider, f'{glider_name}_rtofs_transect_temp-{gl_t0save}.png')
        targs['levels'] = color_lims['temp']
        targs['ylims'] = ylims
        targs['xlab'] = 'Time'
        plot_transect(model_time, ds.depth.values, mtemp, **targs)

        # plot temperature by time (glider time/location) - model and glider
        del targs['title']
        targs['title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
        targs['title1'] = f'RTOFS Temperature: {model_t0str} to {model_t1str}'
        targs['save_file'] = os.path.join(
            sdir_glider,
            f'{glider_name}_rtofs_glider_transect_temp-{gl_t0save}.png')
        plot_transects(gl_tm, gl_depth, gl_temp, model_time, ds.depth.values,
                       mtemp, **targs)

        # get the salinity transect
        gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(
            glider_df, 'salinity', 0.5)

        # plot salinity by time - model only
        sargs = {}
        sargs['cmap'] = cmocean.cm.haline
        sargs['clab'] = 'Salinity'
        sargs['title'] = f'RTOFS Salinity along {glider} track\n' \
                         f'Model: {model_t0str} to {model_t1str}\n' \
                         f'Glider: {gl_t0str} to {gl_t1str}'
        sargs['save_file'] = os.path.join(
            sdir_glider, f'{glider_name}_rtofs_transect_salt-{gl_t0save}.png')
        sargs['levels'] = color_lims['salt']
        sargs['ylims'] = ylims
        sargs['xlab'] = 'Time'
        plot_transect(model_time, ds.depth.values, msalt, **sargs)

        # plot salinity by time (glider time/location) - model and glider
        del sargs['title']
        sargs['title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
        sargs['title1'] = f'RTOFS Salinity: {model_t0str} to {model_t1str}'
        sargs['save_file'] = os.path.join(
            sdir_glider,
            f'{glider_name}_rtofs_glider_transect_salt-{gl_t0save}.png')
        plot_transects(gl_tm, gl_depth, gl_salt, model_time, ds.depth.values,
                       msalt, **sargs)
예제 #10
0
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims):
    url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0'

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects',
                                   'transect-ribbons')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        gl_t0 = pd.to_datetime(np.nanmin(glider_df['time']))
        gl_t1 = pd.to_datetime(np.nanmax(glider_df['time']))
        gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M')
        gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M')
        gl_t0save = gl_t0.strftime('%Y%m%dT%H%M')
        glider_name = glider.split('-')[0]

        with xr.open_dataset(url, drop_variables='tau') as gofs:
            gofs = gofs.rename({
                'surf_el': 'sea_surface_height',
                'water_temp': 'temperature',
                'water_u': 'u',
                'water_v': 'v'
            })

            # Subset time range (add a little extra to the glider time range)
            mt0 = gl_t0 - dt.timedelta(hours=1)
            mt1 = gl_t1 + dt.timedelta(hours=1)

            ds = gofs.sel(time=slice(mt0, mt1), depth=slice(0, 1000))
            model_t0str = pd.to_datetime(np.nanmin(
                ds.time.values)).strftime('%Y-%m-%dT%H:%M')
            model_t1str = pd.to_datetime(np.nanmax(
                ds.time.values)).strftime('%Y-%m-%dT%H:%M')

            # interpolate glider lat/lon to lat/lon on model time
            sublonm = np.interp(pd.to_datetime(ds.time.values),
                                pd.to_datetime(glider_df.time),
                                glider_df.longitude)
            sublatm = np.interp(pd.to_datetime(ds.time.values),
                                pd.to_datetime(glider_df.time),
                                glider_df.latitude)
            sublonm_GOFS = storms.convert_target_gofs_lon(sublonm)

            # get temperature and salinity data along the glider track (space and time)
            mtemp = np.full([len(ds.depth), len(ds.time)], np.nan)
            msalt = np.full([len(ds.depth), len(ds.time)], np.nan)
            for i, t in enumerate(ds.time):
                tds = ds.sel(time=t,
                             lon=sublonm_GOFS[i],
                             lat=sublatm[i],
                             method='nearest')
                mtemp[:, i] = tds['temperature'].values
                msalt[:, i] = tds['salinity'].values

            # get the temperature transect from the glider
            gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(
                glider_df, 'temperature', 0.5)

            # plot temperature by time (glider time/location) - model only
            targs = {}
            targs['cmap'] = cmocean.cm.thermal
            targs['clab'] = 'Temperature ($^oC$)'
            targs['title'] = f'GOFS Temperature along {glider} track\nModel: {model_t0str} to {model_t1str}  ' \
                             f'Glider: {gl_t0str} to {gl_t1str}'
            targs['save_file'] = os.path.join(
                sdir_glider,
                f'{glider_name}_gofs_transect_temp-{gl_t0save}.png')
            targs['levels'] = color_lims['temp']
            targs['ylims'] = ylims
            targs['xlab'] = 'Time'
            plot_transect(ds.time.values, ds.depth.values, mtemp, **targs)

            # plot temperature by time (glider time/location) - model and glider
            del targs['title']
            targs[
                'title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
            targs[
                'title1'] = f'GOFS Temperature: {model_t0str} to {model_t1str}'
            targs['save_file'] = os.path.join(
                sdir_glider,
                f'{glider_name}_gofs_glider_transect_temp-{gl_t0save}.png')
            plot_transects(gl_tm, gl_depth, gl_temp, ds.time.values,
                           ds.depth.values, mtemp, **targs)

            # get the salinity transect from the glider
            gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(
                glider_df, 'salinity', 0.5)

            # plot salinity by time - model only
            sargs = {}
            sargs['cmap'] = cmocean.cm.haline
            sargs['clab'] = 'Salinity'
            sargs['title'] = f'GOFS Salinity along {glider} track\nModel: {model_t0str} to {model_t1str}  ' \
                             f'Glider: {gl_t0str} to {gl_t1str}'
            sargs['save_file'] = os.path.join(
                sdir_glider,
                f'{glider_name}_gofs_transect_salt-{gl_t0save}.png')
            sargs['levels'] = color_lims['salt']
            sargs['ylims'] = ylims
            sargs['xlab'] = 'Time'
            plot_transect(ds.time.values, ds.depth.values, msalt, **sargs)

            # plot salinity by time (glider time/location) - model and glider
            del sargs['title']
            sargs[
                'title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
            sargs['title1'] = f'GOFS Salinity: {model_t0str} to {model_t1str}'
            sargs['save_file'] = os.path.join(
                sdir_glider,
                f'{glider_name}_gofs_glider_transect_salt-{gl_t0save}.png')
            plot_transects(gl_tm, gl_depth, gl_salt, ds.time.values,
                           ds.depth.values, msalt, **sargs)
예제 #11
0
def main(gliders, save_dir, bathymetry, m_t0, m_t1, g_t0, g_t1, lt, current_glider_location):
    url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0'

    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1

    # initialize keyword arguments for map plot
    kwargs = dict()
    kwargs['model'] = 'gofs'
    kwargs['transform'] = ccrs.PlateCarree()
    kwargs['current_glider_loc'] = current_glider_location

    if bathymetry:
        bath = xr.open_dataset(bathymetry)
    else:
        bath = False

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider)
        os.makedirs(sdir_glider, exist_ok=True)
        kwargs['save_dir'] = sdir_glider

        glider_ds = gld.glider_dataset(glider, **gargs)
        kwargs['gliders'] = glider_ds
        glider_region = gld.glider_region(glider_ds)  # define the glider region

        gl_t0 = pd.to_datetime(np.nanmin(glider_ds.time.values))
        gl_t1 = pd.to_datetime(np.nanmax(glider_ds.time.values))

        if len(glider_region) < 1:
            raise ValueError('No region found for glider: {}'.format(glider))

        if lt:
            lt = gld.custom_gliderline_transects()
            kwargs['custom_transect'] = dict(lon=[lt[glider]['extent'][0], lt[glider]['extent'][2]],
                                             lat=[lt[glider]['extent'][1], lt[glider]['extent'][3]])

        # Loop through regions
        for region in glider_region.items():
            extent = region[1]['lonlat']
            if bath:
                kwargs['bathy'] = bath.sel(lon=slice(extent[0] - .1, extent[1] + .1),
                                           lat=slice(extent[2] - .1, extent[3] + .1))

            with xr.open_dataset(url, drop_variables='tau') as gofs:
                gofs = gofs.rename({'surf_el': 'sea_surface_height', 'water_temp': 'temperature', 'water_u': 'u', 'water_v': 'v'})

                # Subset time range
                if m_t0:
                    mt0 = m_t0
                else:
                    mt0 = gl_t0 - dt.timedelta(hours=6)
                if m_t1:
                    mt1 = m_t1
                else:
                    mt1 = gl_t1 + dt.timedelta(days=1)
                ds = gofs.sel(time=slice(mt0, mt1))
                for t in ds.time:
                    print(f'Accessing GOFS: {str(t.dt.strftime("%Y-%m-%d %H:%M:%S").data)}')
                    tds = ds.sel(time=t)  # Select the latest time

                    # subset dataset to the proper extents for each region
                    sub = tds.sel(lon=slice(extent[0] + 359, extent[1] + 361), lat=slice(extent[2] - 1, extent[3] + 1))
                    sub['lon'] = sub['lon'] - 360  # Convert model lon to glider lon
                    surface_map_glider_track(sub, region, **kwargs)
예제 #12
0
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims):
    # initialize keyword arguments for glider functions
    gargs = dict()
    gargs['time_start'] = g_t0
    gargs['time_end'] = g_t1
    gargs['filetype'] = 'dataframe'
    #gargs['filetype'] = 'nc'

    for glider in gliders:
        sdir_glider = os.path.join(save_dir, glider, 'transects')
        os.makedirs(sdir_glider, exist_ok=True)
        glider_df = gld.glider_dataset(glider, **gargs)
        gl_t0 = pd.to_datetime(np.nanmin(glider_df['time']))
        gl_t1 = pd.to_datetime(np.nanmax(glider_df['time']))
        gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M')
        gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M')
        gl_t0save = gl_t0.strftime('%Y%m%dT%H%M')
        glider_name = glider.split('-')[0]

        gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(glider_df, 'temperature', 0.5)

        # plot temperature by time
        targs = {}
        targs['cmap'] = cmocean.cm.thermal
        targs['clab'] = 'Temperature ($^oC$)'
        targs['title'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
        targs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_temp-{gl_t0save}.png')
        targs['xlab'] = 'Time'
        if ylims:
            targs['ylims'] = ylims
        if color_lims:
            targs['levels'] = color_lims['temp']
        print('plotting temperature by time')
        plot_transect(gl_tm, gl_depth, gl_temp, **targs)

        # plot temperature by longitude
        targs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_temp-lon-{gl_t0save}.png')
        targs['xlab'] = 'Longitude'
        print('plotting temperature by longitude')
        plot_transect(gl_lon, gl_depth, gl_temp, **targs)

        # grid salinity data
        gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(glider_df, 'salinity', 0.5)

        # plot salinity by time
        sargs = {}
        sargs['cmap'] = cmocean.cm.haline
        sargs['clab'] = 'Salinity'
        sargs['title'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}'
        sargs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_salt-{gl_t0save}.png')
        sargs['xlab'] = 'Time'
        if ylims:
            sargs['ylims'] = ylims
        if color_lims:
            sargs['levels'] = color_lims['salt']
        print('plotting salinity by time')
        plot_transect(gl_tm, gl_depth, gl_salt, **sargs)

        # plot salinity by longitude
        sargs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_salt-lon-{gl_t0save}.png')
        sargs['xlab'] = 'Longitude'
        print('plotting salinity by longitude')
        plot_transect(gl_lon, gl_depth, gl_salt, **sargs)