Ejemplo n.º 1
0
def __get_lons_lats_basemap_from_rpn(path=DEFAULT_PATH_FOR_GEO_DATA,
                                     vname="STBM",
                                     region_of_interest_shp=None,
                                     **bmp_kwargs):
    """
    :param path:
    :param vname:
    :return: get basemap object for the variable in the given file
    """
    with RPN(str(path)) as r:
        _ = r.variables[vname][:]

        proj_params = r.get_proj_parameters_for_the_last_read_rec()
        lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()

        rll = RotatedLatLon(**proj_params)

    if region_of_interest_shp is not None:
        mask = get_mask(lons, lats, region_of_interest_shp)
        delta_points = 10
        i_arr, j_arr = np.where(mask >= 0.5)
        i_min, i_max = i_arr.min() - delta_points, i_arr.max() + delta_points
        j_min, j_max = j_arr.min() - delta_points, j_arr.max() + delta_points

        slices = (slice(i_min, i_max + 1), slice(j_min, j_max + 1))

        bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[slices],
                                                   lats2d=lats[slices],
                                                   **bmp_kwargs)
    else:
        bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons,
                                                   lats2d=lats,
                                                   **bmp_kwargs)

    return lons, lats, bmp
Ejemplo n.º 2
0
def __get_lons_lats_basemap_from_rpn(path=DEFAULT_PATH_FOR_GEO_DATA,
                           vname="STBM", region_of_interest_shp=None, **bmp_kwargs):

    """
    :param path:
    :param vname:
    :return: get basemap object for the variable in the given file
    """
    with RPN(str(path)) as r:
        _ = r.variables[vname][:]

        proj_params = r.get_proj_parameters_for_the_last_read_rec()
        lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()

        rll = RotatedLatLon(**proj_params)

    if region_of_interest_shp is not None:
        mask = get_mask(lons, lats, region_of_interest_shp)
        delta_points = 10
        i_arr, j_arr = np.where(mask >= 0.5)
        i_min, i_max = i_arr.min() - delta_points, i_arr.max() + delta_points
        j_min, j_max = j_arr.min() - delta_points, j_arr.max() + delta_points

        slices = (slice(i_min,i_max + 1), slice(j_min,j_max + 1))

        bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[slices], lats2d=lats[slices], **bmp_kwargs)
    else:
        bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, **bmp_kwargs)


    return lons, lats, bmp
def get_lons_lats_basemap(rpnfile_path="", varname=None, index_subset=None):
    """
    Get longitudes, latitudes and the basemap object corresponding to the rpn file
    :param rpnfile_path:
    :param varname:
    :return:
    """
    with RPN(rpnfile_path) as r:

        assert isinstance(r, RPN)

        if varname is None:
            varname = next(v for v in r.get_list_of_varnames()
                           if v not in [">>", "^^", "HY"])

        r.get_first_record_for_name(varname)

        lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()

        nx, ny = lons.shape

        if index_subset is None:
            index_subset = IndexSubspace(i_start=0,
                                         i_end=nx - 1,
                                         j_start=0,
                                         j_end=ny - 1)

        rll = RotatedLatLon(**r.get_proj_parameters_for_the_last_read_rec())
        bmp = rll.get_basemap_object_for_lons_lats(
            lons2d=lons[index_subset.get_islice(),
                        index_subset.get_jslice()],
            lats2d=lats[index_subset.get_islice(),
                        index_subset.get_jslice()])

        return lons, lats, bmp
Ejemplo n.º 4
0
def main(
    path="/skynet3_rech1/huziy/geof_lake_infl_exp/geophys_Quebec_0.1deg_260x260_with_dd_v6_with_ITFS"
):
    r = RPN(path)

    varnames = ["ITFS"]

    ncols = 3
    nrows = len(varnames) // 3

    fig = plt.figure()
    varname_to_field = {}
    for vname in varnames:

        data = r.get_first_record_for_name(vname)
        varname_to_field[vname] = data
        data = np.ma.masked_where(data < 0, data)
        lons2d, lats2d = r.get_longitudes_and_latitudes_for_the_last_read_rec()
        params = r.get_proj_parameters_for_the_last_read_rec()
        print(params)
        rll = RotatedLatLon(**params)
        b = rll.get_basemap_object_for_lons_lats(lons2d, lats2d)
        x, y = b(lons2d, lats2d)
        b.drawcoastlines()
        img = b.pcolormesh(x, y, data)
        b.colorbar()

    fig = plt.figure()
    itfs = varname_to_field["ITFS"]
    plt.hist(itfs[itfs >= 0], bins=100)

    plt.show()

    r.close()
    pass
Ejemplo n.º 5
0
def get_lons_lats_basemap(rpnfile_path="", varname=None, index_subset=None):


    """
    Get longitudes, latitudes and the basemap object corresponding to the rpn file
    :param rpnfile_path:
    :param varname:
    :return:
    """
    with RPN(rpnfile_path) as r:

        assert isinstance(r, RPN)

        if varname is None:
            varname = next(v for v in r.get_list_of_varnames() if v not in [">>", "^^", "HY"])

        r.get_first_record_for_name(varname)

        lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()

        nx, ny = lons.shape

        if index_subset is None:
            index_subset = IndexSubspace(i_start=0, i_end=nx - 1, j_start=0, j_end=ny - 1)






        rll = RotatedLatLon(**r.get_proj_parameters_for_the_last_read_rec())
        bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons[index_subset.get_islice(), index_subset.get_jslice()],
                                                   lats2d=lats[index_subset.get_islice(), index_subset.get_jslice()])

        return lons, lats, bmp
Ejemplo n.º 6
0
def get_basemap_and_coords_improved(
        file_path="data/CORDEX/NorthAmerica_0.44deg_CanHistoE1/Samples/NorthAmerica_0.44deg_CanHistoE1_198101/pm1950010100_00816912p",
        field_name="PR"):
    rpnobj = RPN(file_path)
    the_mask = rpnobj.get_first_record_for_name(field_name)

    # plt.figure()
    # plt.pcolormesh(the_mask.transpose())
    # plt.show()

    proj_params = rpnobj.get_proj_parameters_for_the_last_read_rec()
    rll = RotatedLatLon(**proj_params)

    lons2d, lats2d = rpnobj.get_longitudes_and_latitudes_for_the_last_read_rec()
    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d)
    rpnobj.close()
    return basemap, lons2d, lats2d
Ejemplo n.º 7
0
def main(path = "/skynet3_rech1/huziy/geof_lake_infl_exp/geophys_Quebec_0.1deg_260x260_with_dd_v6_with_ITFS"):
    r = RPN(path)

    varnames = ["ITFS"]


    ncols = 3
    nrows = len(varnames) // 3

    fig = plt.figure()
    varname_to_field = {}
    for vname in varnames:

        data = r.get_first_record_for_name(vname)
        varname_to_field[vname] = data
        data = np.ma.masked_where(data < 0, data)
        lons2d, lats2d = r.get_longitudes_and_latitudes_for_the_last_read_rec()
        params = r.get_proj_parameters_for_the_last_read_rec()
        print(params)
        rll = RotatedLatLon(**params)
        b = rll.get_basemap_object_for_lons_lats(lons2d, lats2d)
        x, y = b(lons2d, lats2d)
        b.drawcoastlines()
        img = b.pcolormesh(x, y, data)
        b.colorbar()



    fig = plt.figure()
    itfs = varname_to_field["ITFS"]
    plt.hist(itfs[itfs >= 0], bins = 100)


    plt.show()

    r.close()
    pass
Ejemplo n.º 8
0
    def get_coords_and_basemap(self):
        """
        :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml]
        """

        # Read longitudes and latitudes and create the basemap only if they are not initialized
        if self.lons is None:
            with Dataset(os.path.join(self.data_folder, self.bathymetry_file)) as ds:
                self.lons, self.lats = ds.variables["nav_lon"][:].transpose(), ds.variables["nav_lat"][:].transpose()

                import re

                lon1, lat1 = None, None
                lon2, lat2 = None, None
                with open(os.path.join(self.data_folder, self.proj_file)) as f:
                    for line in f:
                        if "Grd_xlat1" in line and "Grd_xlon1" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat1, lon1 = [float(s) for s in groups]

                        if "Grd_xlat2" in line and "Grd_xlon2" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat2, lon2 = [float(s) for s in groups]

                rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2)
                self.basemap = rll.get_basemap_object_for_lons_lats(lons2d=self.lons, lats2d=self.lats)
                print(lon1, lat1, lon2, lat2)


        # self.basemap.drawcoastlines()
        # xx, yy = self.basemap(self.lons, self.lats)
        # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose())
        # plt.show()

        self.lons[self.lons > 180] -= 360

        return self.lons, self.lats, self.basemap
Ejemplo n.º 9
0
def plot_lake_fraction_field():
    folder = "/home/huziy/skynet3_rech1/geof_lake_infl_exp"
    fName = "geophys_Quebec_0.1deg_260x260_with_dd_v6"
    path = os.path.join(folder, fName)

    rObj = RPN(path)

    lkf = rObj.get_first_record_for_name_and_level(
        varname="VF", level=3, level_kind=level_kinds.ARBITRARY)

    proj_params = rObj.get_proj_parameters_for_the_last_read_rec()
    lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    lons2d[lons2d >= 180] -= 360
    rObj.close()

    rll = RotatedLatLon(**proj_params)

    margin = 20
    lons2d = lons2d[margin:-margin, margin:-margin]
    lats2d = lats2d[margin:-margin, margin:-margin]
    lkf = lkf[margin:-margin, margin:-margin]

    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d,
                                                   lats2d=lats2d,
                                                   resolution="l")
    x, y = basemap(lons2d, lats2d)

    fig = plt.figure()
    gs = GridSpec(1, 2, width_ratios=[1, 1])

    ax = fig.add_subplot(gs[0, 0])
    df = 0.1
    levels = np.arange(0, 1.1, df)
    cMap = get_cmap("gist_ncar_r", len(levels) - 1)
    bn = BoundaryNorm(levels, cMap.N)

    basemap.drawmapboundary(fill_color="0.75")
    lkf_plot = maskoceans(lons2d, lats2d, lkf, inlands=False)
    print("Percentage of lakes in the sim domain: {}".format(lkf_plot.mean() *
                                                             100))

    img = basemap.pcolormesh(x, y, lkf_plot, norm=bn, cmap=cMap)
    basemap.drawcoastlines()

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("bottom", "5%", pad="3%")
    cb = fig.colorbar(img, cax=cax, ticks=levels, orientation="horizontal")

    ax = fig.add_subplot(gs[0, 1])
    df1 = df
    levels1 = np.arange(0, 1.1, df1)
    cell_numms = np.zeros((len(levels1) - 1, ))

    left = levels[0]
    right = levels[1]

    lefts = []
    rights = []
    lkf_land = lkf[lkf > 0.01]
    for i in range(len(cell_numms)):
        cell_numms[i] = ((lkf_land > left) &
                         (lkf_land <= right)).astype(int).sum()
        lefts.append(left)
        rights.append(right)
        left += df1
        right += df1

    assert isinstance(ax, Axes)
    ax.bar(lefts, cell_numms, width=df1)

    # ax.semilogy(rights, cell_numms)
    ax.xaxis.set_ticks(levels)
    ax.yaxis.set_ticks(np.arange(1000, 10000, 1000))
    sf = ScalarFormatter(useMathText=True)
    sf.set_powerlimits([-2, 1])
    ax.yaxis.set_major_formatter(sf)

    ax.grid("on")
    ax.set_xlabel("fraction")
    ax.set_ylabel("# gridcells")

    plt.show()
    fig.tight_layout()
    fig.savefig("lake_fractions_220x220_0.1deg.jpeg")
    plt.show()

    pass
Ejemplo n.º 10
0
    def get_coords_and_basemap(self,
                               subregion=None,
                               reload=True,
                               **basemap_kwargs):
        """
        :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml]
        if reload is True, do not use cached arrays even if they are available
        """

        # Read longitudes and latitudes and create the basemap only if they are not initialized
        if self.basemap is None or reload:
            with Dataset(os.path.join(self.data_folder,
                                      self.bathymetry_file)) as ds:

                if "nav_lon" in ds.variables:
                    self.lons, self.lats = ds.variables[
                        "nav_lon"][:].transpose(
                        ), ds.variables["nav_lat"][:].transpose()
                else:
                    for vname, v in ds.variables.items():
                        if "lon" in vname.lower():
                            self.lons = v[:].T
                            continue

                        if "lat" in vname.lower():
                            self.lats = v[:].T
                            continue

                        if self.lons is not None and self.lats is not None:
                            break

                import re

                lon1, lat1 = None, None
                lon2, lat2 = None, None
                with open(os.path.join(self.data_folder, self.proj_file)) as f:
                    for line in f:
                        if "Grd_xlat1" in line and "Grd_xlon1" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat1, lon1 = [float(s) for s in groups]

                        if "Grd_xlat2" in line and "Grd_xlon2" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat2, lon2 = [float(s) for s in groups]

                rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2)

                nx, ny = self.lons.shape
                if subregion is not None:
                    ill, iur, jll, jur = int(nx * subregion[0]), int(
                        nx * subregion[1]), int(ny * subregion[2]), int(
                            ny * subregion[3])
                else:
                    ill, iur, jll, jur = 0, self.lons.shape[
                        0], 0, self.lons.shape[1]

                self.basemap = rll.get_basemap_object_for_lons_lats(
                    lons2d=self.lons[ill:iur, jll:jur],
                    lats2d=self.lats[ill:iur, jll:jur],
                    **basemap_kwargs)
                print(lon1, lat1, lon2, lat2)

        # self.basemap.drawcoastlines()
        # xx, yy = self.basemap(self.lons, self.lats)
        # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose())
        # plt.show()

        self.lons[self.lons > 180] -= 360

        return self.lons, self.lats, self.basemap
Ejemplo n.º 11
0
def main():
    #path = "/RECH/data/Simulations/CRCM5/North_America/NorthAmerica_0.44deg_ERA40-Int_B1/Diagnostics/NorthAmerica_0.44deg_ERA40-Int_B1_2007{:02d}"
    path = "/RESCUE/skynet3_rech1/huziy/from_guillimin/new_outputs/current_climate_30_yr_sims/quebec_0.1_crcm5-hcd-rl-intfl_ITFS/Samples/quebec_crcm5-hcd-rl-intfl_1988{:02d}"

    months = [6, 7, 8]

    pm_list = []
    dm_list = []
    for m in months:
        print(path.format(m))

        month_folder = path.format(m)
        for fn in os.listdir(month_folder):

            # if not fn.endswith("moyenne"):
            #    continue

            if fn.startswith("pm"):
                pm_list.append(os.path.join(month_folder, fn))
            elif fn.startswith("dm"):
                dm_list.append(os.path.join(month_folder, fn))

    pm = MultiRPN(pm_list)
    dm = MultiRPN(dm_list)

    tsurf_mean = np.mean([
        field for field in pm.get_all_time_records_for_name_and_level(
            varname="J8").values()
    ],
                         axis=0)
    tair_mean = np.mean([
        field for field in dm.get_all_time_records_for_name_and_level(
            varname="TT", level=1, level_kind=level_kinds.HYBRID).values()
    ],
                        axis=0)

    lons, lats = pm.get_longitudes_and_latitudes_of_the_last_read_rec()

    projparams = pm.linked_robj_list[
        0].get_proj_parameters_for_the_last_read_rec()

    rll = RotatedLatLon(**projparams)
    bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats)

    xx, yy = bmp(lons, lats)

    plt.figure()
    cs = bmp.contourf(xx, yy, tsurf_mean - 273.15, 40)
    bmp.drawcoastlines()
    plt.title("Tsurf")
    plt.colorbar()

    plt.figure()
    bmp.contourf(xx,
                 yy,
                 tair_mean,
                 levels=cs.levels,
                 norm=cs.norm,
                 cmap=cs.cmap)
    bmp.drawcoastlines()
    plt.title("Tair")
    plt.colorbar()

    plt.figure()
    bmp.contourf(xx,
                 yy,
                 tsurf_mean - 273.15 - tair_mean,
                 levels=np.arange(-2, 2.2, 0.2),
                 cmap=cs.cmap)
    bmp.drawcoastlines()
    plt.title("Tsurf - Tair")
    plt.colorbar()

    pm.close()
    dm.close()

    plt.show()
Ejemplo n.º 12
0
def main():
    """

    """

    # s_lons = [-3.38, 3.40, -12.45, -11.04,-2.92, 0.1,32.55,30.48,23.6,31.27,15.31,23.91,17.51,21.08]
    # s_lats = [16.26,11.88,14.9,13.91,10.57,6.2,15.61,19.18,-14.02,-21.13,-4.26,4.97,-28.71,-28.69]

    # assert len(s_lons) == len(s_lats)
    #path = "data/directions_Africa_Bessam_0.44/infocell_Africa.nc"
    #path = "/home/huziy/skynet3_exec1/for_offline_routing/directions_africa_dx0.44deg_2.nc"
    path = "/skynet3_rech1/huziy/for_Arman_routing_data/infocell_na_0.44deg_arman.nc"
    ds = Dataset(path)

    dirs = ds.variables["flow_direction_value"][:]
    acc_area = ds.variables["accumulation_area"][:]

    lons2d = ds.variables["lon"][:]
    lats2d = ds.variables["lat"][:]

    lon_1, lat_1 = -97, 47.5
    lon_2, lat_2 = -7, 0

    lons2d[lons2d >= 180] -= 360

    #min_lon = lons2d[0,0]
    #max_lon = lons2d[-1,-1]
    #min_lat = lats2d[0, 0]
    #max_lat = lats2d[-1,-1]

    #plot_utils.apply_plot_params(width_pt=None, width_cm=80)
    #print max_lon

    fig = plt.figure(dpi=800)
    #TODO: change projection to rotpole (it will require params)
    #b = Basemap(projection="rotpole", llcrnrlon=min_lon,
    #    llcrnrlat=min_lat,
    #    urcrnrlon=max_lon, urcrnrlat=max_lat, resolution="i")
    myproj = RotatedLatLon(lon1=lon_1, lat1=lat_1, lon2=lon_2, lat2=lat_2)
    print(lons2d.shape)
    b = myproj.get_basemap_object_for_lons_lats(lons2d[100:150, 70:132], lats2d[100:150, 70:132])

    x, y = b(lons2d, lats2d)
    b.drawcoastlines(linewidth=0.2, color="0.5")


    #    b.pcolormesh(x, y, np.ma.masked_where(dirs <= 0, dirs ))
    #    plt.colorbar()


    di_list = np.array([1, 1, 0, -1, -1, -1, 0, 1])
    dj_list = np.array([0, -1, -1, -1, 0, 1, 1, 1])

    delta_indices = np.log2(dirs[dirs > 0])
    delta_indices = delta_indices.astype(int)

    di = di_list[delta_indices]
    dj = dj_list[delta_indices]

    acc_area = np.ma.masked_where(acc_area < 0, acc_area)
    #img = b.pcolormesh(x, y, np.ma.log(acc_area))

    ax = plt.gca()
    #divider = make_axes_locatable(ax)
    #cax = divider.append_axes("right", "5%", pad="3%")

    #plt.colorbar(img, cax = cax)



    i_indices_1d = list(range(dirs.shape[0]))
    j_indices_1d = list(range(dirs.shape[1]))

    j_indices_2d, i_indices_2d = np.meshgrid(j_indices_1d, i_indices_1d)

    i_indices_2d_next = np.zeros_like(i_indices_2d)
    j_indices_2d_next = np.zeros_like(i_indices_2d)

    i_indices_2d_next[dirs > 0] = i_indices_2d[dirs > 0] + di
    j_indices_2d_next[dirs > 0] = j_indices_2d[dirs > 0] + dj

    for i, j, i_next, j_next in zip(i_indices_2d[dirs > 0], j_indices_2d[dirs > 0],
                                    i_indices_2d_next[dirs > 0], j_indices_2d_next[dirs > 0]):
        # ax.add_line(Line2D([x[i,j], x[i_next, j_next]], [y[i,j], y[i_next, j_next]], linewidth=0.5))
        if i == i_next and j == j_next:
            continue
        p1 = [x[i, j], y[i, j]]
        p2 = [x[i_next, j_next], y[i_next, j_next]]
        dr = [p2[0] - p1[0], p2[1] - p1[1]]
        ax.add_patch(FancyArrow(p1[0], p1[1], dr[0], dr[1], linewidth=0.5,
                                fc="k", head_width=0.1,
                                length_includes_head=True))




    # x1, y1 = b(s_lons, s_lats)
    # b.scatter(x1, y1, c="r", linewidth=0, zorder = 7, ax = ax)
    # b.drawrivers(linewidth=0.5, color="#0cf5f8", zorder=8, ax=ax)
    # b.drawmeridians(np.arange(-10, 90,30))
    # b.drawparallels(np.arange(-50, 40, 5), labels=[1,1,1,1], linewidth=0.1)
    plt.tight_layout()
    # plt.show()

    #b.readshapefile("/home/huziy/skynet3_exec1/other_shape/af_major_basins/af_basins", "basin",
    #    linewidth=3, zorder=9, ax=ax
    #)
    plt.savefig("with_station_riv_af_dirs_basin_1.0.eps")

    pass
Ejemplo n.º 13
0
def plot_acc_area_with_glaciers():
    gmask_vname = "VF"
    gmask_level = 2
    # gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85"
    gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/geophys_CORDEX_NA_0.11deg_695x680_filled_grDes_barBor_Crop2Gras_peat"
    
    # stab reading of the glacier mask
    # r = RPN(gmask_path)
    # gmask = r.get_first_record_for_name_and_level(varname=gmask_vname,
    #                                              level=gmask_level)
    
    r = RPN("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p")
    r.get_first_record_for_name("PR") # Because I almost sure that PR is there
    proj_params = r.get_proj_parameters_for_the_last_read_rec()
    rll = RotatedLatLon(**proj_params)
    lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()
    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats, resolution="i")
    # gmask = np.ma.masked_where(gmask < 0.01, gmask)
    gmask = np.ma.masked_all(lons.shape)
    mask_value = 0.25
    gmask[~gmask.mask] = mask_value

    path = "/RESCUE/skynet3_rech1/huziy/Netbeans Projects/Java/DDM/directions_WestCaUs_dx0.11deg.nc"
    # path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/infocell_West_NA_0.25deg_104x75_GLNM_PRSF_CanHR85_104x75.nc"
    ds = Dataset(path)


    margin = 20

    var_name = "accumulation_area"
    data = ds.variables[var_name][margin:-margin, margin:-margin]

    data = np.ma.masked_where(data <= 0, data)

    # flow directions
    fldr = ds.variables["flow_direction_value"][:][margin:-margin, margin:-margin]

    i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr)



    x, y = basemap(lons, lats)
    fig = plt.figure(figsize=(15, 15))

    dx = (x[-1, -1] - x[0, 0]) / float(x.shape[0])
    dy = (y[-1, -1] - y[0, 0]) / float(y.shape[1])

    x1 = x - dx / 2.0
    y1 = y - dy / 2.0

    # im = basemap.pcolormesh(x1, y1, data, norm=LogNorm(vmin=1e3, vmax=1e7), cmap=cm.get_cmap("jet", 12))
    # cb = basemap.colorbar(im)
    # cb.ax.tick_params(labelsize=25)

    cmap = cm.get_cmap("gray_r", 10)

    basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.)

    nx, ny = x.shape
    inds_j, inds_i = np.meshgrid(range(ny), range(nx))
    inds_i_next = inds_i + i_shifts
    inds_j_next = inds_j + j_shifts

    inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1), inds_i_next)
    inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1), inds_j_next)


    u = np.ma.masked_all_like(x)
    v = np.ma.masked_all_like(x)

    good = (~inds_i_next.mask) & (~inds_j_next.mask)
    u[good] = x[inds_i_next[good], inds_j_next[good]] - x[inds_i[good], inds_j[good]]
    v[good] = y[inds_i_next[good], inds_j_next[good]] - y[inds_i[good], inds_j[good]]

    basemap.quiver(x, y, u, v,
                   pivot="tail", width=0.0005, scale_units="xy", headlength=20, headwidth=15, scale=1)

    basemap.drawcoastlines(linewidth=0.5)

    basemap.drawrivers(color="b")

    # plt.legend([Rectangle((0, 0), 5, 5, fc=cmap(mask_value)), ], ["Glaciers", ], loc=3)

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj",
    #                      "upsas",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers",
    #                      zorder=2, linewidth=0.5, color="b")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network",
    #                      zorder=2, linewidth=0.5, color="b")


    basemap.readshapefile("/skynet3_exec2/aganji/NE_can/bow_river/bow_projected", "basin", color="m", linewidth=2)

    # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions.png", bbox_inches="tight")
    plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png", bbox_inches="tight")
    
    plt.show()
Ejemplo n.º 14
0
    def get_coords_and_basemap(self, subregion=None, reload=True, **basemap_kwargs):
        """
        :return: lons2d, lats2d, basemap [based on the bathymetry file and gemclim_settings.nml]
        if reload is True, do not use cached arrays even if they are available
        """

        # Read longitudes and latitudes and create the basemap only if they are not initialized
        if self.basemap is None or reload:
            with Dataset(os.path.join(self.data_folder, self.bathymetry_file)) as ds:

                if "nav_lon" in ds.variables:
                    self.lons, self.lats = ds.variables["nav_lon"][:].transpose(), ds.variables["nav_lat"][:].transpose()
                else:
                    for vname, v in ds.variables.items():
                        if "lon" in vname.lower():
                            self.lons = v[:].T
                            continue

                        if "lat" in vname.lower():
                            self.lats = v[:].T
                            continue

                        if self.lons is not None and self.lats is not None:
                            break


                import re

                lon1, lat1 = None, None
                lon2, lat2 = None, None
                with open(os.path.join(self.data_folder, self.proj_file)) as f:
                    for line in f:
                        if "Grd_xlat1" in line and "Grd_xlon1" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat1, lon1 = [float(s) for s in groups]

                        if "Grd_xlat2" in line and "Grd_xlon2" in line:
                            groups = re.findall(r"-?\b\d+.?\d*\b", line)
                            lat2, lon2 = [float(s) for s in groups]

                rll = RotatedLatLon(lon1=lon1, lat1=lat1, lon2=lon2, lat2=lat2)


                nx, ny = self.lons.shape
                if subregion is not None:
                    ill, iur, jll, jur = int(nx * subregion[0]), int(nx * subregion[1]), int(ny * subregion[2]), int(ny * subregion[3])
                else:
                    ill, iur, jll, jur = 0, self.lons.shape[0], 0, self.lons.shape[1]

                self.basemap = rll.get_basemap_object_for_lons_lats(lons2d=self.lons[ill:iur, jll:jur], lats2d=self.lats[ill:iur, jll:jur],
                                                                    **basemap_kwargs)
                print(lon1, lat1, lon2, lat2)


        # self.basemap.drawcoastlines()
        # xx, yy = self.basemap(self.lons, self.lats)
        # self.basemap.pcolormesh(xx, yy, ds.variables["Bathymetry"][:].transpose())
        # plt.show()

        self.lons[self.lons > 180] -= 360

        return self.lons, self.lats, self.basemap
Ejemplo n.º 15
0
def main():
    # plot_utils.apply_plot_params(20)
    folder = "/home/huziy/skynet3_rech1/from_guillimin"
    fname = "geophys_Quebec_0.1deg_260x260_with_dd_v6"
    path = os.path.join(folder, fname)

    rObj = RPN(path)

    mg = rObj.get_first_record_for_name_and_level("MG", level=0, level_kind=level_kinds.PRESSURE)
    # j2 = rObj.get_first_record_for_name("J2")

    levs = [0, 100, 200, 300, 500, 700, 1000, 1500, 2000, 2800]
    norm = BoundaryNorm(levs, len(levs) - 1)

    me = rObj.get_first_record_for_name_and_level("ME", level=0, level_kind=level_kinds.ARBITRARY)

    proj_params = rObj.get_proj_parameters_for_the_last_read_rec()

    print(me.shape)
    lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    lons2d[lons2d > 180] -= 360

    # me_to_plot = np.ma.masked_where(mg < 0.4, me)
    me_to_plot = me
    # print me_to_plot.min(), me_to_plot.max()

    rll = RotatedLatLon(**proj_params)
    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d)
    rObj.close()

    x, y = basemap(lons2d, lats2d)

    plt.figure()
    ax = plt.gca()
    # the_cmap = cm.get_cmap(name = "gist_earth", lut=len(levs) -1)
    # the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(path="colormap_files/topo_15lev.rgb")
    the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(
        path="colormap_files/OceanLakeLandSnow.rgb", ncolors=len(levs) - 1
    )

    # new_cm = matplotlib.colors.LinearSegmentedColormap('colormap',new_dict,len(levs) - 1)

    me_to_plot = maskoceans(lons2d, lats2d, me_to_plot, resolution="l")
    basemap.contourf(x, y, me_to_plot, cmap=the_cmap, levels=levs, norm=norm)

    # basemap.fillcontinents(color = "none", lake_color="aqua")
    basemap.drawmapboundary(fill_color="#479BF9")
    basemap.drawcoastlines(linewidth=0.5)
    basemap.drawmeridians(np.arange(-180, 180, 20), labels=[1, 0, 0, 1])
    basemap.drawparallels(np.arange(45, 75, 15), labels=[1, 0, 0, 1])

    basemap.readshapefile("data/shape/contour_bv_MRCC/Bassins_MRCC_latlon", name="basin", linewidth=1)

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", "5%", pad="3%")
    plt.colorbar(ticks=levs, cax=cax)

    # basemap.scatter(x, y, color="k", s=1, linewidths=0, ax=ax, zorder=2)

    margin = 20
    x1 = x[margin, margin]
    x2 = x[-margin, margin]
    y1 = y[margin, margin]
    y2 = y[margin, -margin]
    pol_corners = ((x1, y1), (x2, y1), (x2, y2), (x1, y2))
    ax.add_patch(Polygon(xy=pol_corners, fc="none", ls="dashed", lw=3))

    # plt.tight_layout()
    # plt.show()
    plt.savefig("free_domain_260x260.png", dpi=cpp.FIG_SAVE_DPI)

    pass
def plot_acc_area_with_glaciers(
        gmask_vname: str = "VF",
        gmask_level=2,
        gmask_path="/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85",
        route_data_path="/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions_north_america_0.25deg_glaciers.nc",
        lons_target=None,
        lats_target=None,
        basin_shape_files=None):

    plot_scatter = False

    # stab reading of the glacier mask
    with RPN(gmask_path) as r:
        gmask = r.get_first_record_for_name_and_level(varname=gmask_vname,
                                                      level=gmask_level)

        # r = RPN("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p")
        r.get_first_record_for_name(
            "VF")  # Because I almost sure that PR is there
        proj_params = r.get_proj_parameters_for_the_last_read_rec()
        rll = RotatedLatLon(**proj_params)
        lons_gmask, lats_gmask = r.get_longitudes_and_latitudes_for_the_last_read_rec(
        )

        gl_fraction_limit = 0.01

        gmask = np.ma.masked_where(gmask < gl_fraction_limit, gmask)
        mask_value = 0.25
        gmask[~gmask.mask] = mask_value

    if str(route_data_path).endswith(".nc"):
        print("route_data_path ends with .nc => assuming netcdf format: {}".
              format(route_data_path))
        with Dataset(route_data_path) as ds:
            var_name = "accumulation_area"
            data = ds.variables[var_name][:]
            # flow directions
            fldr = ds.variables["flow_direction_value"][:]

            coord_names = ["lon", "lat"] if "lon" in ds.variables else [
                "longitudes", "latitudes"
            ]
            lons_route, lats_route = [ds.variables[k] for k in coord_names]

    else:
        print(
            "route_data_path does not end with .nc => assuming rpn format: {}".
            format(route_data_path))
        with RPN(route_data_path) as r:
            data = r.get_first_record_for_name("FACC")
            fldr = r.get_first_record_for_name("FLDR")

            lons_route, lats_route = r.get_longitudes_and_latitudes_for_the_last_read_rec(
            )

    # do the spatial interpolation if required
    xg, yg, zg = lat_lon.lon_lat_to_cartesian(lons_gmask.flatten(),
                                              lats_gmask.flatten())
    xr, yr, zr = lat_lon.lon_lat_to_cartesian(lons_route.flatten(),
                                              lats_route.flatten())

    if lons_target is None or lats_target is None:
        lons_target, lats_target = lons_route, lats_route
        xt, yt, zt = xr, yr, zr
    else:
        xt, yt, zt = lat_lon.lon_lat_to_cartesian(lons_target.flatten(),
                                                  lats_target.flatten())

    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons_target,
                                                   lats2d=lats_target,
                                                   resolution="i")

    ktree_route = KDTree(list(zip(xr, yr, zr)))
    dists_route, inds_route = ktree_route.query(list(zip(xt, yt, zt)))
    data = data.flatten()[inds_route].reshape(lons_target.shape)
    fldr = fldr.flatten()[inds_route].reshape(lons_target.shape)

    ktree_gmask = KDTree(list(zip(xg, yg, zg)))
    dists_gmask, inds_gmask = ktree_gmask.query(list(zip(xt, yt, zt)))
    gmask = gmask.flatten()[inds_gmask].reshape(lons_target.shape)

    data = np.ma.masked_where(data <= 0, data)

    i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr)

    xx, yy = basemap(lons_target, lats_target)
    fig = plt.figure(figsize=(15, 15))

    dx = (xx[-1, -1] - xx[0, 0]) / float(xx.shape[0])
    dy = (yy[-1, -1] - yy[0, 0]) / float(yy.shape[1])

    x1 = xx - dx / 2.0
    y1 = yy - dy / 2.0

    # Uncomment to plot the accumulation areas
    im = basemap.pcolormesh(x1,
                            y1,
                            data,
                            norm=LogNorm(vmin=1e3, vmax=1e7),
                            cmap=cm.get_cmap("jet", 12))
    cb = basemap.colorbar(im)

    cmap = cm.get_cmap("gray_r", 10)

    basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.)

    nx, ny = xx.shape
    inds_j, inds_i = np.meshgrid(range(ny), range(nx))
    inds_i_next = inds_i + i_shifts
    inds_j_next = inds_j + j_shifts

    inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1),
                                     inds_i_next)
    inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1),
                                     inds_j_next)

    u = np.ma.masked_all_like(xx)
    v = np.ma.masked_all_like(xx)

    good = (~inds_i_next.mask) & (~inds_j_next.mask)
    u[good] = xx[inds_i_next[good], inds_j_next[good]] - xx[inds_i[good],
                                                            inds_j[good]]
    v[good] = yy[inds_i_next[good], inds_j_next[good]] - yy[inds_i[good],
                                                            inds_j[good]]

    basemap.quiver(xx,
                   yy,
                   u,
                   v,
                   pivot="tail",
                   width=0.0005,
                   scale_units="xy",
                   headlength=20,
                   headwidth=15,
                   scale=1)

    basemap.drawcoastlines(linewidth=0.5, zorder=5)

    basemap.drawrivers(color="lightcoral", zorder=5, linewidth=3)

    plt.legend([
        Rectangle((0, 0), 5, 5, fc=cmap(mask_value)),
    ], [
        r"Glacier ($\geq {}\%$)".format(gl_fraction_limit * 100),
    ],
               loc=3)

    watershed_bndry_width = 4

    if basin_shape_files is not None:
        for i, the_shp in enumerate(basin_shape_files):
            basemap.readshapefile(the_shp[:-4],
                                  "basin_{}".format(i),
                                  zorder=2,
                                  color="m",
                                  linewidth=watershed_bndry_width)

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska",
    #                       zorder=2, linewidth=watershed_bndry_width, color="m")
    #
    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier",
    #                       zorder=2, linewidth=watershed_bndry_width, color="m")
    #
    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask",
    #                       zorder=2, linewidth=watershed_bndry_width, color="m")
    #
    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask",
    #                       zorder=2, linewidth=watershed_bndry_width, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj",
    #                      "upsas",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers",
    #                      zorder=2, linewidth=0.5, color="b")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network",
    #                      zorder=2, linewidth=0.5, color="b")

    if plot_scatter:
        points_lat = [51.54, 49.2476]
        points_lon = [-122.277, -122.784]

        point_x, point_y = basemap(points_lon, points_lat)
        basemap.scatter(point_x, point_y, c="g", s=20, zorder=3)

    plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions_only.png",
                bbox_inches="tight",
                dpi=300)
    # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png", bbox_inches="tight")

    plt.show()
Ejemplo n.º 17
0
def plot_acc_area_with_glaciers():
    gmask_vname = "VF"
    gmask_level = 2
    # gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/geophys_West_NA_0.25deg_144x115_GLNM_PRSF_CanHR85"
    gmask_path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/geophys_CORDEX_NA_0.11deg_695x680_filled_grDes_barBor_Crop2Gras_peat"

    # stab reading of the glacier mask
    # r = RPN(gmask_path)
    # gmask = r.get_first_record_for_name_and_level(varname=gmask_vname,
    #                                              level=gmask_level)

    r = RPN(
        "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/pm2013061400_00000000p"
    )
    r.get_first_record_for_name("PR")  # Because I almost sure that PR is there
    proj_params = r.get_proj_parameters_for_the_last_read_rec()
    rll = RotatedLatLon(**proj_params)
    lons, lats = r.get_longitudes_and_latitudes_for_the_last_read_rec()
    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons,
                                                   lats2d=lats,
                                                   resolution="i")
    # gmask = np.ma.masked_where(gmask < 0.01, gmask)
    gmask = np.ma.masked_all(lons.shape)
    mask_value = 0.25
    gmask[~gmask.mask] = mask_value

    path = "/RESCUE/skynet3_rech1/huziy/Netbeans Projects/Java/DDM/directions_WestCaUs_dx0.11deg.nc"
    # path = "/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/infocell_West_NA_0.25deg_104x75_GLNM_PRSF_CanHR85_104x75.nc"
    ds = Dataset(path)

    margin = 20

    var_name = "accumulation_area"
    data = ds.variables[var_name][margin:-margin, margin:-margin]

    data = np.ma.masked_where(data <= 0, data)

    # flow directions
    fldr = ds.variables["flow_direction_value"][:][margin:-margin,
                                                   margin:-margin]

    i_shifts, j_shifts = direction_and_value.flowdir_values_to_shift(fldr)

    x, y = basemap(lons, lats)
    fig = plt.figure(figsize=(15, 15))

    dx = (x[-1, -1] - x[0, 0]) / float(x.shape[0])
    dy = (y[-1, -1] - y[0, 0]) / float(y.shape[1])

    x1 = x - dx / 2.0
    y1 = y - dy / 2.0

    # im = basemap.pcolormesh(x1, y1, data, norm=LogNorm(vmin=1e3, vmax=1e7), cmap=cm.get_cmap("jet", 12))
    # cb = basemap.colorbar(im)
    # cb.ax.tick_params(labelsize=25)

    cmap = cm.get_cmap("gray_r", 10)

    basemap.pcolormesh(x1, y1, gmask, cmap=cmap, vmin=0., vmax=1.)

    nx, ny = x.shape
    inds_j, inds_i = np.meshgrid(range(ny), range(nx))
    inds_i_next = inds_i + i_shifts
    inds_j_next = inds_j + j_shifts

    inds_i_next = np.ma.masked_where((inds_i_next == nx) | (inds_i_next == -1),
                                     inds_i_next)
    inds_j_next = np.ma.masked_where((inds_j_next == ny) | (inds_j_next == -1),
                                     inds_j_next)

    u = np.ma.masked_all_like(x)
    v = np.ma.masked_all_like(x)

    good = (~inds_i_next.mask) & (~inds_j_next.mask)
    u[good] = x[inds_i_next[good], inds_j_next[good]] - x[inds_i[good],
                                                          inds_j[good]]
    v[good] = y[inds_i_next[good], inds_j_next[good]] - y[inds_i[good],
                                                          inds_j[good]]

    basemap.quiver(x,
                   y,
                   u,
                   v,
                   pivot="tail",
                   width=0.0005,
                   scale_units="xy",
                   headlength=20,
                   headwidth=15,
                   scale=1)

    basemap.drawcoastlines(linewidth=0.5)

    basemap.drawrivers(color="b")

    # plt.legend([Rectangle((0, 0), 5, 5, fc=cmap(mask_value)), ], ["Glaciers", ], loc=3)

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/athabasca/athabasca_dissolved", "atabaska",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/fraizer/fraizer", "frazier",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/South_sas/South_sas_dissolved", "south_sask",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/north_sas/north_sas", "north_sask",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/watersheds_up_sas/watershed_up_sas_proj",
    #                      "upsas",
    #                      zorder=2, linewidth=3, color="m")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network/network", "rivers",
    #                      zorder=2, linewidth=0.5, color="b")

    # basemap.readshapefile("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/lat_lon/network_up_sas/network_up_sout_sas_proj", "network",
    #                      zorder=2, linewidth=0.5, color="b")

    basemap.readshapefile(
        "/skynet3_exec2/aganji/NE_can/bow_river/bow_projected",
        "basin",
        color="m",
        linewidth=2)

    # plt.savefig("/RESCUE/skynet3_rech1/huziy/CNRCWP/C3/directions.png", bbox_inches="tight")
    plt.savefig(
        "/RESCUE/skynet3_rech1/huziy/CNRCWP/Calgary_flood/directions.png",
        bbox_inches="tight")

    plt.show()
Ejemplo n.º 18
0
def main():
    #path = "/RECH/data/Simulations/CRCM5/North_America/NorthAmerica_0.44deg_ERA40-Int_B1/Diagnostics/NorthAmerica_0.44deg_ERA40-Int_B1_2007{:02d}"
    path = "/RESCUE/skynet3_rech1/huziy/from_guillimin/new_outputs/current_climate_30_yr_sims/quebec_0.1_crcm5-hcd-rl-intfl_ITFS/Samples/quebec_crcm5-hcd-rl-intfl_1988{:02d}"

    months = [6, 7, 8]

    pm_list = []
    dm_list = []
    for m in months:
        print(path.format(m))

        month_folder = path.format(m)
        for fn in os.listdir(month_folder):

            # if not fn.endswith("moyenne"):
            #    continue

            if fn.startswith("pm"):
                pm_list.append(os.path.join(month_folder, fn))
            elif fn.startswith("dm"):
                dm_list.append(os.path.join(month_folder, fn))



    pm = MultiRPN(pm_list)
    dm = MultiRPN(dm_list)

    tsurf_mean = np.mean([field for field in pm.get_all_time_records_for_name_and_level(varname="J8").values()], axis=0)
    tair_mean = np.mean([field for field in dm.get_all_time_records_for_name_and_level(varname="TT", level=1, level_kind=level_kinds.HYBRID).values()], axis=0)


    lons, lats = pm.get_longitudes_and_latitudes_of_the_last_read_rec()

    projparams = pm.linked_robj_list[0].get_proj_parameters_for_the_last_read_rec()

    rll = RotatedLatLon(**projparams)
    bmp = rll.get_basemap_object_for_lons_lats(lons2d=lons, lats2d=lats)

    xx, yy = bmp(lons, lats)


    plt.figure()
    cs = bmp.contourf(xx, yy, tsurf_mean - 273.15, 40)
    bmp.drawcoastlines()
    plt.title("Tsurf")
    plt.colorbar()

    plt.figure()
    bmp.contourf(xx, yy, tair_mean, levels=cs.levels, norm=cs.norm, cmap=cs.cmap)
    bmp.drawcoastlines()
    plt.title("Tair")
    plt.colorbar()

    plt.figure()
    bmp.contourf(xx, yy, tsurf_mean - 273.15 - tair_mean, levels=np.arange(-2, 2.2, 0.2), cmap=cs.cmap)
    bmp.drawcoastlines()
    plt.title("Tsurf - Tair")
    plt.colorbar()



    pm.close()
    dm.close()

    plt.show()
Ejemplo n.º 19
0
def plot_lake_fraction_field():
    folder = "/home/huziy/skynet3_rech1/geof_lake_infl_exp"
    fName = "geophys_Quebec_0.1deg_260x260_with_dd_v6"
    path = os.path.join(folder, fName)

    rObj = RPN(path)

    lkf = rObj.get_first_record_for_name_and_level(varname="VF", level=3, level_kind=level_kinds.ARBITRARY)

    proj_params = rObj.get_proj_parameters_for_the_last_read_rec()
    lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    lons2d[lons2d >= 180] -= 360
    rObj.close()

    rll = RotatedLatLon(**proj_params)

    margin = 20
    lons2d = lons2d[margin:-margin, margin:-margin]
    lats2d = lats2d[margin:-margin, margin:-margin]
    lkf = lkf[margin:-margin, margin:-margin]

    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d, lats2d=lats2d, resolution="l")
    x, y = basemap(lons2d, lats2d)

    fig = plt.figure()
    gs = GridSpec(1, 2, width_ratios=[1, 1])

    ax = fig.add_subplot(gs[0, 0])
    df = 0.1
    levels = np.arange(0, 1.1, df)
    cMap = get_cmap("gist_ncar_r", len(levels) - 1)
    bn = BoundaryNorm(levels, cMap.N)

    basemap.drawmapboundary(fill_color="0.75")
    lkf_plot = maskoceans(lons2d, lats2d, lkf, inlands=False)
    print("Percentage of lakes in the sim domain: {}".format(lkf_plot.mean() * 100))

    img = basemap.pcolormesh(x, y, lkf_plot, norm=bn, cmap=cMap)
    basemap.drawcoastlines()

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("bottom", "5%", pad="3%")
    cb = fig.colorbar(img, cax=cax, ticks=levels, orientation="horizontal")

    ax = fig.add_subplot(gs[0, 1])
    df1 = df
    levels1 = np.arange(0, 1.1, df1)
    cell_numms = np.zeros((len(levels1) - 1,))

    left = levels[0]
    right = levels[1]

    lefts = []
    rights = []
    lkf_land = lkf[lkf > 0.01]
    for i in range(len(cell_numms)):
        cell_numms[i] = ((lkf_land > left) & (lkf_land <= right)).astype(int).sum()
        lefts.append(left)
        rights.append(right)
        left += df1
        right += df1

    assert isinstance(ax, Axes)
    ax.bar(lefts, cell_numms, width=df1)

    # ax.semilogy(rights, cell_numms)
    ax.xaxis.set_ticks(levels)
    ax.yaxis.set_ticks(np.arange(1000, 10000, 1000))
    sf = ScalarFormatter(useMathText=True)
    sf.set_powerlimits([-2, 1])
    ax.yaxis.set_major_formatter(sf)

    ax.grid("on")
    ax.set_xlabel("fraction")
    ax.set_ylabel("# gridcells")

    plt.show()
    fig.tight_layout()
    fig.savefig("lake_fractions_220x220_0.1deg.jpeg")
    plt.show()

    pass
Ejemplo n.º 20
0
def main():
    """

    """

    # s_lons = [-3.38, 3.40, -12.45, -11.04,-2.92, 0.1,32.55,30.48,23.6,31.27,15.31,23.91,17.51,21.08]
    # s_lats = [16.26,11.88,14.9,13.91,10.57,6.2,15.61,19.18,-14.02,-21.13,-4.26,4.97,-28.71,-28.69]

    # assert len(s_lons) == len(s_lats)
    #path = "data/directions_Africa_Bessam_0.44/infocell_Africa.nc"
    #path = "/home/huziy/skynet3_exec1/for_offline_routing/directions_africa_dx0.44deg_2.nc"
    path = "/skynet3_rech1/huziy/for_Arman_routing_data/infocell_na_0.44deg_arman.nc"
    ds = Dataset(path)

    dirs = ds.variables["flow_direction_value"][:]
    acc_area = ds.variables["accumulation_area"][:]

    lons2d = ds.variables["lon"][:]
    lats2d = ds.variables["lat"][:]

    lon_1, lat_1 = -97, 47.5
    lon_2, lat_2 = -7, 0

    lons2d[lons2d >= 180] -= 360

    #min_lon = lons2d[0,0]
    #max_lon = lons2d[-1,-1]
    #min_lat = lats2d[0, 0]
    #max_lat = lats2d[-1,-1]

    #plot_utils.apply_plot_params(width_pt=None, width_cm=80)
    #print max_lon

    fig = plt.figure(dpi=800)
    #TODO: change projection to rotpole (it will require params)
    #b = Basemap(projection="rotpole", llcrnrlon=min_lon,
    #    llcrnrlat=min_lat,
    #    urcrnrlon=max_lon, urcrnrlat=max_lat, resolution="i")
    myproj = RotatedLatLon(lon1=lon_1, lat1=lat_1, lon2=lon_2, lat2=lat_2)
    print(lons2d.shape)
    b = myproj.get_basemap_object_for_lons_lats(lons2d[100:150, 70:132],
                                                lats2d[100:150, 70:132])

    x, y = b(lons2d, lats2d)
    b.drawcoastlines(linewidth=0.2, color="0.5")

    #    b.pcolormesh(x, y, np.ma.masked_where(dirs <= 0, dirs ))
    #    plt.colorbar()

    di_list = np.array([1, 1, 0, -1, -1, -1, 0, 1])
    dj_list = np.array([0, -1, -1, -1, 0, 1, 1, 1])

    delta_indices = np.log2(dirs[dirs > 0])
    delta_indices = delta_indices.astype(int)

    di = di_list[delta_indices]
    dj = dj_list[delta_indices]

    acc_area = np.ma.masked_where(acc_area < 0, acc_area)
    #img = b.pcolormesh(x, y, np.ma.log(acc_area))

    ax = plt.gca()
    #divider = make_axes_locatable(ax)
    #cax = divider.append_axes("right", "5%", pad="3%")

    #plt.colorbar(img, cax = cax)

    i_indices_1d = list(range(dirs.shape[0]))
    j_indices_1d = list(range(dirs.shape[1]))

    j_indices_2d, i_indices_2d = np.meshgrid(j_indices_1d, i_indices_1d)

    i_indices_2d_next = np.zeros_like(i_indices_2d)
    j_indices_2d_next = np.zeros_like(i_indices_2d)

    i_indices_2d_next[dirs > 0] = i_indices_2d[dirs > 0] + di
    j_indices_2d_next[dirs > 0] = j_indices_2d[dirs > 0] + dj

    for i, j, i_next, j_next in zip(i_indices_2d[dirs > 0],
                                    j_indices_2d[dirs > 0],
                                    i_indices_2d_next[dirs > 0],
                                    j_indices_2d_next[dirs > 0]):
        # ax.add_line(Line2D([x[i,j], x[i_next, j_next]], [y[i,j], y[i_next, j_next]], linewidth=0.5))
        if i == i_next and j == j_next:
            continue
        p1 = [x[i, j], y[i, j]]
        p2 = [x[i_next, j_next], y[i_next, j_next]]
        dr = [p2[0] - p1[0], p2[1] - p1[1]]
        ax.add_patch(
            FancyArrow(p1[0],
                       p1[1],
                       dr[0],
                       dr[1],
                       linewidth=0.5,
                       fc="k",
                       head_width=0.1,
                       length_includes_head=True))

    # x1, y1 = b(s_lons, s_lats)
    # b.scatter(x1, y1, c="r", linewidth=0, zorder = 7, ax = ax)
    # b.drawrivers(linewidth=0.5, color="#0cf5f8", zorder=8, ax=ax)
    # b.drawmeridians(np.arange(-10, 90,30))
    # b.drawparallels(np.arange(-50, 40, 5), labels=[1,1,1,1], linewidth=0.1)
    plt.tight_layout()
    # plt.show()

    #b.readshapefile("/home/huziy/skynet3_exec1/other_shape/af_major_basins/af_basins", "basin",
    #    linewidth=3, zorder=9, ax=ax
    #)
    plt.savefig("with_station_riv_af_dirs_basin_1.0.eps")

    pass
Ejemplo n.º 21
0
def main():
    # plot_utils.apply_plot_params(20)
    folder = "/home/huziy/skynet3_rech1/from_guillimin"
    fname = "geophys_Quebec_0.1deg_260x260_with_dd_v6"
    path = os.path.join(folder, fname)

    rObj = RPN(path)

    mg = rObj.get_first_record_for_name_and_level(
        "MG", level=0, level_kind=level_kinds.PRESSURE)
    # j2 = rObj.get_first_record_for_name("J2")

    levs = [0, 100, 200, 300, 500, 700, 1000, 1500, 2000, 2800]
    norm = BoundaryNorm(levs, len(levs) - 1)

    me = rObj.get_first_record_for_name_and_level(
        "ME", level=0, level_kind=level_kinds.ARBITRARY)

    proj_params = rObj.get_proj_parameters_for_the_last_read_rec()

    print(me.shape)
    lons2d, lats2d = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    lons2d[lons2d > 180] -= 360

    # me_to_plot = np.ma.masked_where(mg < 0.4, me)
    me_to_plot = me
    # print me_to_plot.min(), me_to_plot.max()

    rll = RotatedLatLon(**proj_params)
    basemap = rll.get_basemap_object_for_lons_lats(lons2d=lons2d,
                                                   lats2d=lats2d)
    rObj.close()

    x, y = basemap(lons2d, lats2d)

    plt.figure()
    ax = plt.gca()
    # the_cmap = cm.get_cmap(name = "gist_earth", lut=len(levs) -1)
    # the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(path="colormap_files/topo_15lev.rgb")
    the_cmap = my_colormaps.get_cmap_from_ncl_spec_file(
        path="colormap_files/OceanLakeLandSnow.rgb", ncolors=len(levs) - 1)

    # new_cm = matplotlib.colors.LinearSegmentedColormap('colormap',new_dict,len(levs) - 1)

    me_to_plot = maskoceans(lons2d, lats2d, me_to_plot, resolution="l")
    basemap.contourf(x, y, me_to_plot, cmap=the_cmap, levels=levs, norm=norm)

    # basemap.fillcontinents(color = "none", lake_color="aqua")
    basemap.drawmapboundary(fill_color='#479BF9')
    basemap.drawcoastlines(linewidth=0.5)
    basemap.drawmeridians(np.arange(-180, 180, 20), labels=[1, 0, 0, 1])
    basemap.drawparallels(np.arange(45, 75, 15), labels=[1, 0, 0, 1])

    basemap.readshapefile("data/shape/contour_bv_MRCC/Bassins_MRCC_latlon",
                          name="basin",
                          linewidth=1)

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", "5%", pad="3%")
    plt.colorbar(ticks=levs, cax=cax)

    # basemap.scatter(x, y, color="k", s=1, linewidths=0, ax=ax, zorder=2)

    margin = 20
    x1 = x[margin, margin]
    x2 = x[-margin, margin]
    y1 = y[margin, margin]
    y2 = y[margin, -margin]
    pol_corners = ((x1, y1), (x2, y1), (x2, y2), (x1, y2))
    ax.add_patch(Polygon(xy=pol_corners, fc="none", ls="dashed", lw=3))

    # plt.tight_layout()
    # plt.show()
    plt.savefig("free_domain_260x260.png", dpi=cpp.FIG_SAVE_DPI)

    pass