Пример #1
0
def get_seasonal_flows(data_dir="",
                       start_year=1980,
                       end_year=2010,
                       season_to_months=None,
                       level=0):
    """

    :param data_dir: 
    :param start_year: 
    :param end_year: 
    :param season_to_months: 
    :param level: 
    :return: (lons, lats, {season: (uu, vv, flow_speed)}) 
    """

    nemo_manager_U = NemoYearlyFilesManager(data_dir, suffix="grid_U.nc")
    nemo_manager_V = NemoYearlyFilesManager(data_dir, suffix="grid_V.nc")

    u_comp_name = "vozocrtx"
    v_comp_name = "vomecrty"

    dirpath = Path(data_dir)

    cache_file = Path("nemo_seasonal_wind_{}-{}_{}_{}_lev{}.bin".format(
        start_year, end_year, dirpath.name,
        "_".join([s for s in season_to_months]), level))

    if cache_file.exists():
        return pickle.load(cache_file.open("rb"))

    uu = nemo_manager_U.get_seasonal_clim_field(
        start_year=start_year,
        end_year=end_year,
        season_to_months=season_to_months,
        varname=u_comp_name,
        level_index=level)
    vv = nemo_manager_V.get_seasonal_clim_field(
        start_year=start_year,
        end_year=end_year,
        season_to_months=season_to_months,
        varname=v_comp_name,
        level_index=level)

    # Cache to reuse in future
    pickle.dump([
        nemo_manager_U.lons, nemo_manager_U.lats,
        {season: (uu[season], vv[season])
         for season in season_to_months}
    ], cache_file.open("wb"))

    return nemo_manager_U.lons, nemo_manager_U.lats, {
        season: (uu[season], vv[season])
        for season in season_to_months
    }
Пример #2
0
def get_seasonal_flows(data_dir="", start_year=1980, end_year=2010, season_to_months=None, level=0):


    """

    :param data_dir: 
    :param start_year: 
    :param end_year: 
    :param season_to_months: 
    :param level: 
    :return: (lons, lats, {season: (uu, vv, flow_speed)}) 
    """

    nemo_manager_U = NemoYearlyFilesManager(data_dir, suffix="grid_U.nc")
    nemo_manager_V = NemoYearlyFilesManager(data_dir, suffix="grid_V.nc")

    u_comp_name = "vozocrtx"
    v_comp_name = "vomecrty"


    dirpath = Path(data_dir)

    cache_file = Path("nemo_seasonal_wind_{}-{}_{}_{}_lev{}.bin".format(
        start_year, end_year, dirpath.name, "_".join([s for s in season_to_months]), level))


    if cache_file.exists():
        return pickle.load(cache_file.open("rb"))


    uu = nemo_manager_U.get_seasonal_clim_field(start_year=start_year, end_year=end_year, season_to_months=season_to_months, varname=u_comp_name, level_index=level)
    vv = nemo_manager_V.get_seasonal_clim_field(start_year=start_year, end_year=end_year, season_to_months=season_to_months, varname=v_comp_name, level_index=level)


    # Cache to reuse in future
    pickle.dump([nemo_manager_U.lons, nemo_manager_U.lats, {season: (uu[season], vv[season]) for season in season_to_months}], cache_file.open("wb"))

    return nemo_manager_U.lons, nemo_manager_U.lats, {season: (uu[season], vv[season]) for season in season_to_months}
Пример #3
0
def validate_seas_mean_lswt_from_hostetler_and_nemo_with_homa(
        hl_data_path="/home/huziy/skynet3_rech1/CRCM_GL_simulation/all_files",
        start_year=2003, end_year=2009):
    crcm5_model_manager = Crcm5ModelDataManager(samples_folder_path=hl_data_path, all_files_in_samples_folder=True)

    varname = "sohefldo"
    season = "Summer"

    season_to_months = {season: range(6, 9)}
    season_months = list(season_to_months[season])




    # Get Nemo manager here only for coordinates and mask
    nemo_offline_manager = NemoYearlyFilesManager(folder="/home/huziy/skynet3_rech1/offline_glk_output_daily_1979-2012",
                                                  suffix="grid_T.nc")

    nemo_crcm5_manager = NemoYearlyFilesManager(
        folder="/home/huziy/skynet3_rech1/one_way_coupled_nemo_outputs_1979_1985",
        suffix="grid_T.nc")

    lon2d, lat2d, bmp = nemo_offline_manager.get_coords_and_basemap()

    # Interpolate


    # get nemo sst
    nemo_offline_sst = nemo_offline_manager.get_seasonal_clim_field(start_year=start_year,
                                                                    end_year=end_year,
                                                                    season_to_months=season_to_months,
                                                                    varname=varname)

    nemo_crcm5_sst = nemo_crcm5_manager.get_seasonal_clim_field(start_year=start_year,
                                                                end_year=end_year,
                                                                season_to_months=season_to_months,
                                                                varname=varname)

    nemo_offline_sst = np.ma.masked_where(~nemo_offline_manager.lake_mask, nemo_offline_sst[season])
    nemo_crcm5_sst = np.ma.masked_where(~nemo_offline_manager.lake_mask, nemo_crcm5_sst[season])

    # plt.figure()
    xx, yy = bmp(lon2d.copy(), lat2d.copy())
    # im = bmp.pcolormesh(xx, yy, model_yearmax_ice_conc)
    # bmp.colorbar(im)

    vmin = min(nemo_offline_sst.min(), nemo_crcm5_sst.min())
    vmax = max(nemo_offline_sst.max(), nemo_crcm5_sst.max())

    # plt.figure()
    # b = Basemap()
    # xx, yy = b(lons_obs, lats_obs)
    # im = b.pcolormesh(xx, yy, obs_yearmax_ice_conc)
    # b.colorbar(im)
    # b.drawcoastlines()

    # Plot as usual: model, obs, model - obs
    img_folder = Path("nemo")
    if not img_folder.is_dir():
        img_folder.mkdir()
    img_file = img_folder.joinpath("{}_{}_nemo-offline_vs_nemo-crcm5_{}-{}.png".format(season.lower(),
                                                                                       varname, start_year, end_year))

    fig = plt.figure()
    gs = GridSpec(1, 3, width_ratios=[1, 1, 0.05])
    all_axes = []

    cmap = cm.get_cmap("jet", 10)
    locator = MaxNLocator(nbins=10)
    ticks = locator.tick_values(vmin=vmin, vmax=vmax)
    norm = BoundaryNorm(boundaries=ticks, ncolors=len(ticks) - 1)

    # Model, Hostetler
    ax = fig.add_subplot(gs[0, 0])
    ax.set_title("NEMO+CRCM5")
    bmp.pcolormesh(xx, yy, nemo_crcm5_sst, cmap=cmap, vmin=vmin, vmax=vmax, norm=norm)
    all_axes.append(ax)

    #
    ax = fig.add_subplot(gs[0, 1])
    ax.set_title("NEMO-offline")
    im = bmp.pcolormesh(xx, yy, nemo_offline_sst, cmap=cmap, vmin=vmin, vmax=vmax, norm=norm)
    all_axes.append(ax)


    # Obs: Homa
    # ax = fig.add_subplot(gs[0, 2])
    # ax.set_title("MODIS")
    # im = bmp.pcolormesh(xx, yy, obs_sst_clim, cmap=cmap, vmin=vmin, vmax=vmax, norm=norm)
    # all_axes.append(ax)

    plt.colorbar(im, cax=fig.add_subplot(gs[0, -1]), ticks=ticks)

    for the_ax in all_axes:
        bmp.drawcoastlines(ax=the_ax)

    fig.savefig(str(img_file), bbox_inches="tight")
    plt.close(fig)
def main():
    # path_to_folder = "/home/huziy/skynet3_rech1/offline_glk_output_daily_1979-2012"

    path_to_folder = "/home/huziy/skynet3_rech1/one_way_coupled_nemo_outputs_1979_1985"

    season_to_months = OrderedDict([
    #    ("Winter", (12, 1, 2)),
    #    ("Spring", (3, 4, 5)),
    #    ("Summer", (6, 7, 8)),
        ("Fall", (9, 10, 11))
    ])

    start_year = 1990
    end_year = 2010

    u_manager = NemoYearlyFilesManager(folder=path_to_folder, suffix="_U.nc")
    v_manager = NemoYearlyFilesManager(folder=path_to_folder, suffix="_V.nc")

    u_clim = u_manager.get_seasonal_clim_field(start_year=start_year, end_year=end_year,
                                               season_to_months=season_to_months, varname="vozocrtx")
    v_clim = v_manager.get_seasonal_clim_field(start_year=start_year, end_year=end_year,
                                               season_to_months=season_to_months, varname="vomecrty")

    lons, lats, bmp = u_manager.get_coords_and_basemap()
    lons, lats, rpole = u_manager.get_cartopy_proj_and_coords()

    img_folder = Path("nemo/circulation")
    if not img_folder.is_dir():
        img_folder.mkdir()

    fig = plt.figure()

    gs = GridSpec(len(season_to_months), 1, width_ratios=[1, 0.05])

    xx, yy = bmp(lons.copy(), lats.copy())
    lons_1d = lons.mean(axis=0)
    lats_1d = lats.mean(axis=1)

    import cartopy.crs as ccrs

    tr_xy = rpole.transform_points(ccrs.Geodetic(), lons, lats)

    xx = tr_xy[:, :, 0]
    yy = tr_xy[:, :, 1]

    for i, season in enumerate(season_to_months):
        ax = fig.add_subplot(gs[i, 0], projection=rpole)
        u = u_clim[season]
        v = v_clim[season]
        # im = bmp.contourf(xx, yy, (u ** 2 + v ** 2) ** 0.5)

        # bmp.colorbar(im)

        # bmp.quiver(xx, yy, u, v, ax=ax)

        # uproj, vproj, xx, yy = bmp.transform_vector(u, v, lons_1d, lats_1d, lons.shape[0], lons.shape[1],
        # returnxy=True, masked=True)

        # uproj, vproj = bmp.rotate_vector(u, v, lons.copy(), lats.copy())


        c = (u ** 2 + v ** 2) ** 0.5 * 100

        print(c.shape, u.shape, v.shape)

        # Convert to cm
        u *= 100
        v *= 100

        # u = np.ma.masked_where(u > 10, u)
        # v = np.ma.masked_where(v > 10, v)


        step = 2
        q = ax.quiver(xx[::step, ::step], yy[::step, ::step], u[::step, ::step], v[::step, ::step], width=0.001,
                      pivot="middle", headwidth=5, headlength=5, scale=100)

        qk = ax.quiverkey(q, 0.1, 0.1, 10, r'$10 \frac{cm}{s}$', fontproperties={'weight': 'bold'}, linewidth=1)

        # ax.streamplot(xx, yy, u, v, linewidth=2, density=5, color="k")
        # im = ax.pcolormesh(xx, yy, c)
        # plt.colorbar(im, ax=ax)
        ax.set_extent([xx[0, 0], xx[-1, -1], yy[0, 0], yy[-1, -1]], crs=rpole)
        ax.coastlines("10m")
        ax.add_feature(cfeature.NaturalEarthFeature('physical', 'lakes', '50m',
                                                    edgecolor='k',
                                                    facecolor="none"), linewidth=0.5)

        ax.add_feature(cfeature.RIVERS, edgecolor="k", facecolor="none", linewidth=0.5)

        ax.grid()
        ax.set_title(season)

    fig.savefig(str(img_folder.joinpath(
        "NEMO-CRCM5-seasonal_surf_circulation_{}_arrows.pdf".format("_".join(season_to_months.keys())))),
                bbox_inches="tight")