예제 #1
0
def get_basemap_from_hdf(file_path="", resolution="l"):
    """
    :param file_path:
    :return: lons(2d), lats(2), basemap - corresponding to the data in the file
    """
    h = tb.open_file(file_path)

    # Extract 2d longitudes and latitudes
    lons = h.getNode("/", "longitude")[:]
    lats = h.getNode("/", "latitude")[:]

    rotpoletable = h.getNode("/", "rotpole")

    assert isinstance(rotpoletable, tb.Table)

    params = {}
    for row in rotpoletable:
        print(row["name"], row["value"])

        params[row["name"].decode()] = row["value"].decode() if isinstance(row["value"], bytes) else row["value"]
    rotpoletable.close()

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d=lats,
        lon_1=params["lon1"], lon_2=params["lon2"],
        lat_1=params["lat1"], lat_2=params["lat2"], resolution=resolution
    )
    h.close()
    return lons, lats, basemap
예제 #2
0
def main():
    path = "/skynet3_rech1/huziy/from_guillimin/new_outputs/quebec_0.1_crcm5-hcd-rl-intfl_spinup2/Samples/quebec_crcm5-hcd-rl-intfl_197901/pm1979010100_00000000p"

    rObj = RPN(path)

    sani = rObj.get_first_record_for_name("SANI")
    lons, lats = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(lons2d=lons, lats2d=lats)
    x, y = basemap(lons, lats)

    sani = np.ma.masked_where(sani < 2, sani)

    levels = [2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 40]
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    fig = plt.figure()
    basemap.contourf(x, y, sani, levels=levels, cmap=cmap, norm=bn)
    basemap.drawcoastlines()
    basemap.colorbar(ticks=levels)

    fig.tight_layout()
    fig.savefig("soil_anis.jpeg")

    pass
예제 #3
0
def main():
    path = "/skynet3_rech1/huziy/from_guillimin/new_outputs/quebec_0.1_crcm5-hcd-rl-intfl_spinup2/Samples/quebec_crcm5-hcd-rl-intfl_197901/pm1979010100_00000000p"

    rObj = RPN(path)

    sani = rObj.get_first_record_for_name("SANI")
    lons, lats = rObj.get_longitudes_and_latitudes_for_the_last_read_rec()

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d=lats)
    x, y = basemap(lons, lats)

    sani = np.ma.masked_where(sani < 2, sani)

    levels = [2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 40]
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    fig = plt.figure()
    basemap.contourf(x, y, sani, levels=levels, cmap=cmap, norm=bn)
    basemap.drawcoastlines()
    basemap.colorbar(ticks=levels)

    fig.tight_layout()
    fig.savefig("soil_anis.jpeg")

    pass
예제 #4
0
def main():

    rpn_folder = "/home/huziy/skynet3_rech1/from_guillimin/new_outputs/quebec_0.1_crcm5-r_spinup"
    nc_db_folder = "/home/huziy/skynet3_rech1/crcm_data_ncdb"

    start_year = 1979
    end_year = 1988

    sim_name = "crcm5-r"

    #dmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder, file_name_prefix="dm", all_files_in_samples_folder=True)
    pmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder,
                                      file_name_prefix="pm",
                                      all_files_in_samples_folder=True)

    #plot results
    assert isinstance(pmManager, Crcm5ModelDataManager)
    lons, lats = pmManager.lons2D, pmManager.lats2D

    stfl_mask = pmManager.cbf < 0

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d=lats)
    x, y = basemap(lons, lats)
    print(x.shape)

    month_dates = [
        datetime(year, month, 15) for year in range(start_year, end_year + 1)
        for month in range(1, 13)
    ]

    print(len(month_dates), " month of animation ")

    nc_data_folder = os.path.join(nc_db_folder, sim_name)
    dsDict = {}
    var_names = ["STFL", "PR", "TT"]
    for i, vName in enumerate(var_names):
        path = os.path.join(nc_data_folder, "{0}.nc4".format(vName))
        dsDict[vName] = Dataset(path)

    aniObj = Animator(var_names, dsDict, basemap, x, y, stfl_mask=stfl_mask)

    #fa = animation.FuncAnimation(fig, aniObj.animate, month_dates, interval=50)
    temp_folder = "for_anim_{0}".format(sim_name)
    if os.path.isdir(temp_folder):
        shutil.rmtree(temp_folder)
    os.mkdir(temp_folder)

    for d in month_dates:
        aniObj.animate(d)

        aniObj.saveFrame(tmp_folder=temp_folder)
예제 #5
0
def main():

    rpn_folder = "/home/huziy/skynet3_rech1/from_guillimin/new_outputs/quebec_0.1_crcm5-r_spinup"
    nc_db_folder = "/home/huziy/skynet3_rech1/crcm_data_ncdb"

    start_year = 1979
    end_year = 1988

    sim_name = "crcm5-r"

    #dmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder, file_name_prefix="dm", all_files_in_samples_folder=True)
    pmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder, file_name_prefix="pm", all_files_in_samples_folder=True)


    #plot results
    assert isinstance(pmManager, Crcm5ModelDataManager)
    lons, lats = pmManager.lons2D, pmManager.lats2D


    stfl_mask = pmManager.cbf < 0

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d = lats
    )
    x, y = basemap(lons, lats)
    print(x.shape)


    month_dates = [ datetime(year, month, 15)  for year in range(start_year, end_year + 1) for month in range(1,13) ]

    print(len(month_dates), " month of animation ")

    nc_data_folder = os.path.join(nc_db_folder, sim_name)
    dsDict = {}
    var_names = [ "STFL", "PR", "TT"]
    for i, vName in enumerate(var_names):
        path = os.path.join(nc_data_folder, "{0}.nc4".format(vName))
        dsDict[vName] = Dataset(path)

    aniObj = Animator(var_names, dsDict, basemap, x, y, stfl_mask = stfl_mask)

    #fa = animation.FuncAnimation(fig, aniObj.animate, month_dates, interval=50)
    temp_folder = "for_anim_{0}".format(sim_name)
    if os.path.isdir(temp_folder):
        shutil.rmtree(temp_folder)
    os.mkdir(temp_folder)


    for d in month_dates:
        aniObj.animate(d)

        aniObj.saveFrame(tmp_folder=temp_folder)
예제 #6
0
def main():
    AFRIC = 1
    QUEBEC = 2

    varname = "drainage_density"
    region = QUEBEC

    if region == QUEBEC:
        data_path = "/home/huziy/skynet3_rech1/Netbeans Projects/Java/DDM/directions_with_drainage_density/directions_qc_dx0.1deg_5.nc"
        out_path = "qc_{0}_0.1deg.pdf".format(varname)
    elif region == AFRIC:
        data_path = "/home/huziy/skynet3_rech1/Netbeans Projects/Java/DDM/directions_africa_dx0.44deg.v3.nc"
        out_path = "af_{0}_0.44deg.pdf".format(varname)
    else:
        raise Exception("Unknown region...")

    #
    ds = Dataset(data_path)

    data = ds.variables[varname][20:-20, 20:-20]

    lons = ds.variables["lon"][20:-20, 20:-20]
    lats = ds.variables["lat"][20:-20, 20:-20]
    slope = ds.variables["slope"][20:-20, 20:-20]

    fig = plt.figure()
    print(data.min(), data.max())
    ax = plt.gca()

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

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(lons2d=lons, lats2d=lats)

    lons[lons > 180] -= 360
    x, y = basemap(lons, lats)

    data = maskoceans(lons, lats, data, inlands=False)

    img = basemap.contourf(x, y, data, cmap=cm.get_cmap("jet", 10))

    ax.set_title("Drainage density")

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", "5%", pad="3%")
    cb = fig.colorbar(img, cax=cax)
    cax.set_title("(km**-1)")

    basemap.drawcoastlines(ax=ax)
    fig.tight_layout()
    fig.savefig(out_path)
예제 #7
0
def get_omerc_basemap_quebec(lons, lats, lon1=-68, lat1=52, lon2=16.65, lat2=0):
    return Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(lons, lats,
                                                                     lon_1=lon1, lat_1=lat1, lon_2=lon2, lat_2=lat2)
예제 #8
0
def plot_flow_directions_and_basin_boundaries(ax, s, sim_name_to_station_to_model_point,
                                              sim_name_to_manager=None):
    assert isinstance(ax, Axes)
    assert isinstance(s, Station)
    assert isinstance(sim_name_to_station_to_model_point, dict)

    mp_list = list(sim_name_to_station_to_model_point.items())[0][1][s]

    #selecting only one (the first model point)
    mp = mp_list[0]

    manager = list(sim_name_to_manager.items())[0][1]
    assert isinstance(manager, Crcm5ModelDataManager)

    flow_in_mask = manager.get_mask_for_cells_upstream(mp.ix, mp.jy)

    lons2d, lats2d = manager.lons2D, manager.lats2D

    i_upstream, j_upstream = np.where(flow_in_mask == 1)

    nx_total, ny_total = lons2d.shape

    imin, imax = np.min(i_upstream), np.max(i_upstream)
    jmin, jmax = np.min(j_upstream), np.max(j_upstream)

    margin = 8
    imin = max(0, imin - margin)
    jmin = max(0, jmin - margin)
    imax = min(nx_total - 1, imax + margin)
    jmax = min(ny_total - 1, jmax + margin)

    sub_lons2d = lons2d[imin:imax + 1, jmin:jmax + 1]
    sub_lats2d = lats2d[imin:imax + 1, jmin:jmax + 1]
    sub_flow_directions = manager.flow_directions[imin:imax + 1, jmin:jmax + 1]
    sub_flow_in_mask = flow_in_mask[imin:imax + 1, jmin:jmax + 1]

    sub_i_upstream, sub_j_upstream = np.where(sub_flow_in_mask == 1)

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=sub_lons2d, lats2d=sub_lats2d, resolution="h"
    )



    #plot all stations
    #stations = sim_name_to_station_to_model_point.items()[0][1].keys()
    x_list = [the_station.longitude for the_station in (s,)]
    y_list = [the_station.latitude for the_station in (s,)]

    basemap_big = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons2d, lats2d=lats2d
    )
    x_list, y_list = basemap_big(x_list, y_list)

    basemap_big.scatter(x_list, y_list, c="r", s=40, linewidths=0, ax=ax)
    basemap_big.drawcoastlines(ax=ax)
    basemap_big.drawrivers(ax=ax)
    ax.annotate(s.id, xy=basemap(s.longitude, s.latitude), xytext=(3, 3), textcoords='offset points',
                font_properties=FontProperties(weight="bold"), bbox=dict(facecolor='w', alpha=1),
                ha="left", va="bottom", zorder=2)

    x_big, y_big = basemap_big(manager.lons2D, manager.lats2D)


    ####zoom to the area of interest
    #axins = zoomed_inset_axes(ax, 3, loc=2)
    displayCoords = ax.transData.transform((x_big[imin, jmin], y_big[imin, jmin]))
    x_shift_fig, y_shift_fig = ax.figure.transFigure.inverted().transform(displayCoords)
    print("After transData", displayCoords)
    print("xshift and yshift", x_shift_fig, y_shift_fig)


    #ax.annotate("yuyu", xy = ( 0.733264985153, 0.477182994408), xycoords = "figure fraction" )



    rect = [0.1, y_shift_fig + 0.1, 0.4, 0.4]
    axins = ax.figure.add_axes(rect)


    #assert isinstance(axins, Axes)



    x, y = basemap(sub_lons2d, sub_lats2d)

    x1d_start = x[sub_flow_in_mask == 1]
    y1d_start = y[sub_flow_in_mask == 1]
    fld1d = sub_flow_directions[sub_flow_in_mask == 1]

    from util import direction_and_value

    ishift, jshift = direction_and_value.flowdir_values_to_shift(fld1d)

    sub_i_upstream_next = sub_i_upstream + ishift
    sub_j_upstream_next = sub_j_upstream + jshift

    u = x[sub_i_upstream_next, sub_j_upstream_next] - x1d_start
    v = y[sub_i_upstream_next, sub_j_upstream_next] - y1d_start

    u2d = np.ma.masked_all_like(x)
    v2d = np.ma.masked_all_like(y)

    u2d[sub_i_upstream, sub_j_upstream] = u
    v2d[sub_i_upstream, sub_j_upstream] = v

    basemap.quiver(x, y, u2d, v2d, angles="xy", scale_units="xy", scale=1, ax=axins)

    x_list = [the_station.longitude for the_station in (s,)]
    y_list = [the_station.latitude for the_station in (s,)]
    x_list, y_list = basemap(x_list, y_list)
    basemap.scatter(x_list, y_list, c="r", s=40, linewidths=0)

    basemap.drawcoastlines(ax=axins)
    basemap.drawrivers(ax=axins)


    #read waterbase file, and plot only the polygons which contain at least one upstream point
    shp_path = "/skynet3_exec1/huziy/Netbeans Projects/Java/DDM/data/shape/waterbase/na_bas_ll_r500m/na_bas_ll_r500m.shp"
    c = fiona.open(shp_path)
    hits = c.filter(bbox=(sub_lons2d[0, 0], sub_lats2d[0, 0], sub_lons2d[-1, -1], sub_lats2d[-1, -1]))
    points = [Point(the_x, the_y) for the_x, the_y in zip(x1d_start, y1d_start)]

    selected_polygons = []
    for feature in hits:
        new_coords = []
        old_coords = feature["geometry"]["coordinates"]
        #transform to the map coordinates
        for ring in old_coords:
            x1 = [tup[0] for tup in ring]
            y1 = [tup[1] for tup in ring]
            x2, y2 = basemap(x1, y1)
            new_coords.append(list(zip(x2, y2)))
        feature["geometry"]["coordinates"] = new_coords
        poly = shape(feature["geometry"])
        #print poly, type(poly)
        #print feature.keys()
        #print feature["properties"]
        prep_poly = prep.prep(poly)
        hits = list(filter(prep_poly.contains, points))
        if len(hits) > 2:
            selected_polygons.append(feature["geometry"])

    for p in selected_polygons:
        axins.add_patch(PolygonPatch(p, fc="none", ec="b", lw=1.5))

    zoom_lines_color = "#6600FF"
    #set color of the frame
    for child in axins.get_children():
        if isinstance(child, Spine):
            child.set_color(zoom_lines_color)
            child.set_linewidth(3)

    # draw a bbox of the region of the inset axes in the parent axes and
    # connecting lines between the bbox and the inset axes area
    mark_inset(ax, axins, loc1=1, loc2=3, fc="none", ec=zoom_lines_color, lw=3)
    #basemap.readshapefile(, "basin")



    pass
def main():

    sim1 = "crcm5-r"
    sim2 = "crcm5-hcd-r"

    start_date = datetime(1985,1,1)
    end_date = datetime(1985,12,31)

    sims = [sim1, sim2]

    season_months = [4,5,6]

    ncdb_path = "/home/huziy/skynet3_rech1/crcm_data_ncdb"
    fname_pattern = "{0}_all.nc4"
    varname = "TT"

    figure = plt.figure()


    file_paths = [ os.path.join(ncdb_path, the_sim, fname_pattern.format(varname)) for the_sim in sims ]

    dsList = [ Dataset(fPath) for fPath in file_paths ]

    lons2d, lats2d, time = dsList[0].variables["lon"][:], dsList[0].variables["lat"][:], dsList[0].variables["time"][:]

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(lons2d = lons2d, lats2d = lats2d)

    varsDict = {}


    time = num2date(time, dsList[0].variables["time"].units)
    sel_times = np.where([t.month in season_months for t in time])[0]

    sim_name_to_mean = {}
    for sim, ds in zip( sims, dsList ):
        varsDict["{0} ({1})".format(varname, sim)] = ds.variables[varname]

        data = ds.variables[varname][sel_times,0,:,:].mean(axis = 0)
        sim_name_to_mean[sim] = data


    x, y = basemap(lons2d, lats2d)

    #plot clickable field
    ax = plt.gca()
    basemap.contourf(x, y, sim_name_to_mean[sim2] - sim_name_to_mean[sim1])
    basemap.colorbar()
    basemap.drawcoastlines()
    ax.set_title("({0})-({1})".format(sim2, sim1).upper())

    TimeSeriesPlotter(ax, basemap, lons2d, lats2d, varsDict, time, start_date, end_date)

    plt.show()









    pass
예제 #10
0
def main():
    dmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder, file_name_prefix="dm", all_files_in_samples_folder=True)
    pmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder, file_name_prefix="pm", all_files_in_samples_folder=True)


    #export monthly means to netcdf files if necessary
    if export_to_nc:
        for varname, prefix in zip( field_names, file_name_prefixes ):
            manager = None
            if prefix == "dm":
                manager = dmManager
            elif prefix == "pm":
                manager = pmManager

            level = -1
            level_kind = -1

            if varname == "TT":
                level = 1
                level_kind = level_kinds.HYBRID


            if varname in ["TRAF", "TDRA"]:
                level = 1
                level_kind = level_kinds.ARBITRARY


            if varname == "STFA": continue
            export_monthly_means_to_ncdb(manager, varname, level= level,
                level_kind= level_kind, rewrite = True)
    #plot results
    assert isinstance(pmManager, Crcm5ModelDataManager)
    lons, lats = pmManager.lons2D, pmManager.lats2D

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d = lats
    )
    x, y = basemap(lons, lats)


    nc_data_folder = os.path.join(nc_db_folder, sim_name)

    import matplotlib.pyplot as plt
    all_axes = []
    ax_to_levels = {}
    imgs = []

    gs = gridspec.GridSpec(2,3, height_ratios=[1,1], width_ratios=[1,1,1])
    fig = plt.figure()
    #fig.suptitle("({0} - {1})".format(start_year, end_year))
    #plot Temp
    varname = "TT"
    levels = [-30, -25, -10, -5, -2, 0, 2, 5,10, 15, 20, 25]
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    tt = ds.variables[varname][sel,:,:,:].mean(axis = 0).mean(axis = 0)
    ds.close()
    ax = fig.add_subplot(gs[0,0])
    ax.set_title("Temperature (${\\rm ^\circ C}$)")
    img = basemap.contourf(x, y, tt, levels = levels, cmap = cmap, norm = bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels


    #plot precip
    varname = "PR"
    levels = np.arange(0, 6.5, 0.5)
    cmap = cm.get_cmap("jet_r", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    pr = ds.variables[varname][sel,:,:,:].mean(axis = 0).mean(axis = 0)
    convert_factor = 1000.0 * 24 * 60 * 60  #m/s to mm/day
    pr *= convert_factor
    ds.close()
    ax = fig.add_subplot(gs[0,1])
    ax.set_title("Precip (mm/day)")
    img = basemap.contourf(x, y, pr, levels = levels, cmap = cmap, norm = bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels


    #plot AH
    varname = "AH"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    ah = ds.variables[varname][sel,:,:,:].mean(axis = 0).mean(axis = 0)
    ds.close()

    levels = np.arange(-60, 160, 20)# np.linspace(au.min(), au.max(), 10)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[1,0])
    ax.set_title("Sensible heat flux (${\\rm W/m^2}$)")
    img = basemap.contourf(x, y, ah,  cmap = cmap, norm = bn, levels = levels)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    #plot AV
    varname = "AV"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    av = ds.variables[varname][sel,:,:,:].mean(axis = 0).mean(axis = 0)
    ds.close()
    coef = 3600* 3
    levels = np.arange(-40, 220, 20)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[1,1])
    ax.set_title("Latent heat flux (${\\rm W/m^2}$)")

    img = basemap.contourf(x, y, av * coef, levels = levels, cmap = cmap, norm = bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels


#plot stfl
    varname = "STFL"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]

    stfl = ds.variables[varname][sel,:,:,:].mean(axis = 0).mean(axis = 0)
    ds.close()
    levels = [0,50,100,200,300,500,750,1000, 1500,2000,5000,10000,15000]
    stfl = np.ma.masked_where(stfl < 0.01, stfl)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[0,2])
    ax.set_title("Streamflow (${\\rm m^3/s}$)")
    img = basemap.contourf(x, y, stfl, levels = levels, cmap = cmap, norm = bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels


    sf  = ScalarFormatter(useMathText=True)
    sf.set_powerlimits([-3,4])



    #draw coast lines
    for the_ax, the_img in zip(all_axes, imgs):
        basemap.drawcoastlines(ax = the_ax)
        divider = make_axes_locatable(the_ax)
        cax = divider.append_axes("right", "5%", pad="3%")

        cb = plt.colorbar(the_img, cax = cax, ticks = ax_to_levels[the_ax])
        assert isinstance(cax, Axes)
        title = cax.get_title()

    fig.tight_layout()
    fig.savefig("{0}-mean-annual-fields.pdf".format(sim_name))
def main():
    dmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder,
                                      file_name_prefix="dm",
                                      all_files_in_samples_folder=True)
    pmManager = Crcm5ModelDataManager(samples_folder_path=rpn_folder,
                                      file_name_prefix="pm",
                                      all_files_in_samples_folder=True)

    #export monthly means to netcdf files if necessary
    if export_to_nc:
        for varname, prefix in zip(field_names, file_name_prefixes):
            manager = None
            if prefix == "dm":
                manager = dmManager
            elif prefix == "pm":
                manager = pmManager

            level = -1
            level_kind = -1

            if varname == "TT":
                level = 1
                level_kind = level_kinds.HYBRID

            if varname in ["TRAF", "TDRA"]:
                level = 1
                level_kind = level_kinds.ARBITRARY

            if varname == "STFA": continue
            export_monthly_means_to_ncdb(manager,
                                         varname,
                                         level=level,
                                         level_kind=level_kind,
                                         rewrite=True)
    #plot results
    assert isinstance(pmManager, Crcm5ModelDataManager)
    lons, lats = pmManager.lons2D, pmManager.lats2D

    basemap = Crcm5ModelDataManager.get_rotpole_basemap_using_lons_lats(
        lons2d=lons, lats2d=lats)
    x, y = basemap(lons, lats)

    nc_data_folder = os.path.join(nc_db_folder, sim_name)

    import matplotlib.pyplot as plt
    all_axes = []
    ax_to_levels = {}
    imgs = []

    gs = gridspec.GridSpec(2, 3, height_ratios=[1, 1], width_ratios=[1, 1, 1])
    fig = plt.figure()
    #fig.suptitle("({0} - {1})".format(start_year, end_year))
    #plot Temp
    varname = "TT"
    levels = [-30, -25, -10, -5, -2, 0, 2, 5, 10, 15, 20, 25]
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    tt = ds.variables[varname][sel, :, :, :].mean(axis=0).mean(axis=0)
    ds.close()
    ax = fig.add_subplot(gs[0, 0])
    ax.set_title("Temperature (${\\rm ^\circ C}$)")
    img = basemap.contourf(x, y, tt, levels=levels, cmap=cmap, norm=bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    #plot precip
    varname = "PR"
    levels = np.arange(0, 6.5, 0.5)
    cmap = cm.get_cmap("jet_r", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    pr = ds.variables[varname][sel, :, :, :].mean(axis=0).mean(axis=0)
    convert_factor = 1000.0 * 24 * 60 * 60  #m/s to mm/day
    pr *= convert_factor
    ds.close()
    ax = fig.add_subplot(gs[0, 1])
    ax.set_title("Precip (mm/day)")
    img = basemap.contourf(x, y, pr, levels=levels, cmap=cmap, norm=bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    #plot AH
    varname = "AH"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    ah = ds.variables[varname][sel, :, :, :].mean(axis=0).mean(axis=0)
    ds.close()

    levels = np.arange(-60, 160, 20)  # np.linspace(au.min(), au.max(), 10)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[1, 0])
    ax.set_title("Sensible heat flux (${\\rm W/m^2}$)")
    img = basemap.contourf(x, y, ah, cmap=cmap, norm=bn, levels=levels)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    #plot AV
    varname = "AV"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]
    av = ds.variables[varname][sel, :, :, :].mean(axis=0).mean(axis=0)
    ds.close()
    coef = 3600 * 3
    levels = np.arange(-40, 220, 20)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[1, 1])
    ax.set_title("Latent heat flux (${\\rm W/m^2}$)")

    img = basemap.contourf(x, y, av * coef, levels=levels, cmap=cmap, norm=bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    #plot stfl
    varname = "STFL"
    ds = Dataset(os.path.join(nc_data_folder, "{0}.nc4".format(varname)))
    years = ds.variables["year"][:]
    sel = np.where((start_year <= years) & (years <= end_year))[0]

    stfl = ds.variables[varname][sel, :, :, :].mean(axis=0).mean(axis=0)
    ds.close()
    levels = [
        0, 50, 100, 200, 300, 500, 750, 1000, 1500, 2000, 5000, 10000, 15000
    ]
    stfl = np.ma.masked_where(stfl < 0.01, stfl)
    cmap = cm.get_cmap("jet", len(levels) - 1)
    bn = BoundaryNorm(levels, cmap.N)
    ax = fig.add_subplot(gs[0, 2])
    ax.set_title("Streamflow (${\\rm m^3/s}$)")
    img = basemap.contourf(x, y, stfl, levels=levels, cmap=cmap, norm=bn)
    all_axes.append(ax)
    imgs.append(img)
    ax_to_levels[ax] = levels

    sf = ScalarFormatter(useMathText=True)
    sf.set_powerlimits([-3, 4])

    #draw coast lines
    for the_ax, the_img in zip(all_axes, imgs):
        basemap.drawcoastlines(ax=the_ax)
        divider = make_axes_locatable(the_ax)
        cax = divider.append_axes("right", "5%", pad="3%")

        cb = plt.colorbar(the_img, cax=cax, ticks=ax_to_levels[the_ax])
        assert isinstance(cax, Axes)
        title = cax.get_title()

    fig.tight_layout()
    fig.savefig("{0}-mean-annual-fields.pdf".format(sim_name))