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 }
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}
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")