def render_plot_frame(x): (m, lon, lat, rect, field, ttl, x, y, c, clim, plot_ndx) = x import matplotlib.pyplot as plt plt.figure(figsize=(12,10)) render_spatial_field(m, lon, lat, field, ttl) m.drawparallels(np.arange(rect[0], rect[1], 1.0)) m.drawmeridians(np.arange(rect[2], rect[3],1.0)) x, y = m(x, y) plt.scatter(x, y, c=c) if clim is not None: plt.clim(clim) plt.colorbar() plt.savefig('results/field_%04d.png' % plot_ndx)
mws.load_station_info(os.path.join(cfg["station_info_dir"], "%s.info" % code)) mws.register_to_grid(wrf_data) mws.load_station_data(os.path.join(cfg["station_obs_dir"], "%s.obs" % code)) stations.append(mws) print('Loaded %d stations.' % len(stations)) # construct basemap for rendering domain_rng = wrf_data.get_domain_extent() m = Basemap(llcrnrlon=domain_rng[0],llcrnrlat=domain_rng[1], urcrnrlon=domain_rng[2],urcrnrlat=domain_rng[3], projection = 'mill') # show the equilibrium field and render position of stations on top plt.figure(figsize = (12,9)) render_spatial_field(m, lon, lat, hgt[0,:,:], 'Station positions over topography') for s in stations: slon, slat = s.get_position() x, y = m(slon, slat) plt.plot(x, y, 'o', markersize = 4, markerfacecolor = 'magenta') plt.text(x, y, s.get_id(), color = 'black') # compute station means and standard deviations station_stats = {} for s in stations: v = [o.get_value() for o in s.get_observations("FM")] stdev = np.std(v) if np.isnan(stdev) or abs(stdev) < 1e-6: stdev = 1.0 station_stats[s.get_id()] = (np.mean(v), stdev)
def run_module(): # configure diagnostics init_diagnostics("results/kriging_test_diagnostics.txt") diagnostics().configure_tag("skdm_obs_res", True, True, True) diagnostics().configure_tag("skdm_obs_res_mean", True, True, True) wrf_data = WRFModelData( '../real_data/witch_creek/realfire03_d04_20071022.nc') # read in vars lat, lon = wrf_data.get_lats(), wrf_data.get_lons() tm = wrf_data.get_times() rain = wrf_data['RAINNC'] Ed, Ew = wrf_data.get_moisture_equilibria() # obtain sizes Nt = rain.shape[0] dom_shape = lat.shape locs = np.prod(dom_shape) # load station data, match to grid points and build observation records # load station data from files tz = pytz.timezone('US/Pacific') stations = [ Station(os.path.join(station_data_dir, s), tz, wrf_data) for s in station_list ] obs_data = build_observation_data(stations, 'fuel_moisture', wrf_data) # construct initial vector mfm = MeanFieldModel() # set up parameters mod_res_std = np.ones_like(Ed[0, :, :]) * 0.05 obs_res_std = np.ones((len(stations), )) * 0.1 # construct a basemap representation of the area lat_rng = (np.min(lat), np.max(lat)) lon_rng = (np.min(lon), np.max(lon)) m = Basemap(llcrnrlon=lon_rng[0], llcrnrlat=lat_rng[0], urcrnrlon=lon_rng[1], urcrnrlat=lat_rng[1], projection='mill') plt.figure(figsize=(10, 6)) # run model ndx = 1 for t in range(1, Nt): model_time = wrf_data.get_times()[t] E = 0.5 * (Ed[t, :, :] + Ew[t, :, :]) # if we have an observation somewhere in time, run kriging if model_time in obs_data: print("Time: %s, step: %d" % (str(model_time), t)) mfm.fit_to_data(E, obs_data[model_time]) Efit = mfm.predict_field(E) # krige data to observations K, V = simple_kriging_data_to_model(obs_data[model_time], obs_res_std, Efit, wrf_data, mod_res_std, t) plt.clf() plt.subplot(2, 2, 1) render_spatial_field(m, lon, lat, Efit, 'Equilibrium') plt.clim([0.0, 0.2]) plt.colorbar() plt.subplot(2, 2, 2) render_spatial_field(m, lon, lat, K, 'Kriging field') plt.clim([0.0, 0.2]) plt.colorbar() plt.subplot(2, 2, 3) render_spatial_field(m, lon, lat, V, 'Kriging variance') plt.clim([0.0, np.max(V)]) plt.colorbar() plt.subplot(2, 2, 4) render_spatial_field(m, lon, lat, K - Efit, 'Kriging vs. mean field residuals') # plt.clim([0.0, np.max()]) plt.colorbar() plt.savefig('model_outputs/kriging_test_t%03d.png' % (ndx)) ndx += 1
llcrnrlon=lon_rng[0], llcrnrlat=lat_rng[0], urcrnrlon=lon_rng[1], urcrnrlat=lat_rng[1], projection="mill" ) # compute the equilibrium moisture on grid points Ed, Ew = equilibrium_moisture(v["PSFC"][:, :, :], Q2, v["T2"][:, :, :]) pb.ion() pb.figure(figsize=(14, 7)) for i in range(Ed.shape[0]): # if i > 0 and np.all(rain[i,:,:] == 0): # continue pb.clf() pb.subplot(221) render_spatial_field(m, lon, lat, Ed[i, :, :], "Drying equilibrium [%d]" % i) pb.clim([np.min(Ed), np.max(Ed)]) pb.colorbar() pb.subplot(222) render_spatial_field(m, lon, lat, Ew[i, :, :], "Wetting equilibrium") pb.clim([np.min(Ew), np.max(Ew)]) pb.colorbar() pb.subplot(223) render_spatial_field(m, lon, lat, rain[i, :, :], "Rain") pb.clim([np.min(rain), np.max(rain)]) pb.colorbar() pb.subplot(224) render_spatial_field(m, lon, lat, Q2[i, :, :], "Water vapor ratio") pb.clim([np.min(Q2), np.max(Q2)]) pb.colorbar() pb.draw()
os.path.join(cfg["station_obs_dir"], "%s.obs" % code)) stations.append(mws) print('Loaded %d stations.' % len(stations)) # construct basemap for rendering domain_rng = wrf_data.get_domain_extent() m = Basemap(llcrnrlon=domain_rng[0], llcrnrlat=domain_rng[1], urcrnrlon=domain_rng[2], urcrnrlat=domain_rng[3], projection='mill') # show the equilibrium field and render position of stations on top plt.figure(figsize=(12, 9)) render_spatial_field(m, lon, lat, hgt[0, :, :], 'Station positions over topography') for s in stations: slon, slat = s.get_position() x, y = m(slon, slat) plt.plot(x, y, 'o', markersize=4, markerfacecolor='magenta') plt.text(x, y, s.get_id(), color='black') # compute station means and standard deviations station_stats = {} for s in stations: v = [o.get_value() for o in s.get_observations("FM")] stdev = np.std(v) if np.isnan(stdev) or abs(stdev) < 1e-6: stdev = 1.0 station_stats[s.get_id()] = (np.mean(v), stdev)
mfm = MeanFieldModel() # construct basemap for rendering llcrnrlon = min(map(lambda x: x.lon, stations)) llcrnrlat = min(map(lambda x: x.lat, stations)) urcrnrlon = max(map(lambda x: x.lon, stations)) urcrnrlat = max(map(lambda x: x.lat, stations)) m = Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, urcrnrlat=urcrnrlat, projection = 'mill') # show the equilibrium field and render position of stations on top render_spatial_field(m, lon, lat, E[0,:,:], 'Equilibrium moisture') plt.figure() m.drawparallels(np.arange(llcrnrlat,urcrnrlat,1.0)) m.drawmeridians(np.arange(llcrnrlon,urcrnrlon,1.0)) for s in stations: slon, slat = s.get_position() x, y = m(slon, slat) plt.plot(x, y, 'o', markersize = 8, markerfacecolor = 'magenta') plt.text(x, y, s.get_name(), color = 'white') x, y = m(lon.ravel(), lat.ravel()) plt.plot(x, y, 'k+', markersize = 4) plt.savefig('results/station_localization.png') # find common observation times for the station and for the WRF model tms = stations[0].get_obs_times()
urcrnrlon=lon_rng[1],urcrnrlat=lat_rng[1], projection = 'mill') # compute the equilibrium moisture on grid points Ed, Ew = equilibrium_moisture(v['PSFC'][:,:,:], Q2, v['T2'][:,:,:]) pb.ion() pb.figure(figsize = (14, 7)) for i in range(Ed.shape[0]): # if i > 0 and np.all(rain[i,:,:] == 0): # continue pb.clf() pb.subplot(221) render_spatial_field(m, lon, lat, Ed[i,:,:], 'Drying equilibrium [%d]' % i) pb.clim([np.min(Ed), np.max(Ed)]) pb.colorbar() pb.subplot(222) render_spatial_field(m, lon, lat, Ew[i,:,:], 'Wetting equilibrium') pb.clim([np.min(Ew), np.max(Ew)]) pb.colorbar() pb.subplot(223) render_spatial_field(m, lon, lat, rain[i,:,:], 'Rain') pb.clim([np.min(rain), np.max(rain)]) pb.colorbar() pb.subplot(224) render_spatial_field(m, lon, lat, Q2[i,:,:], 'Water vapor ratio') pb.clim([np.min(Q2), np.max(Q2)]) pb.colorbar() pb.draw()
def run_module(): # configure diagnostics init_diagnostics("results/kriging_test_diagnostics.txt") diagnostics().configure_tag("skdm_obs_res", True, True, True) diagnostics().configure_tag("skdm_obs_res_mean", True, True, True) wrf_data = WRFModelData('../real_data/witch_creek/realfire03_d04_20071022.nc') # read in vars lat, lon = wrf_data.get_lats(), wrf_data.get_lons() tm = wrf_data.get_times() rain = wrf_data['RAINNC'] Ed, Ew = wrf_data.get_moisture_equilibria() # obtain sizes Nt = rain.shape[0] dom_shape = lat.shape locs = np.prod(dom_shape) # load station data, match to grid points and build observation records # load station data from files tz = pytz.timezone('US/Pacific') stations = [Station(os.path.join(station_data_dir, s), tz, wrf_data) for s in station_list] obs_data = build_observation_data(stations, 'fuel_moisture', wrf_data) # construct initial vector mfm = MeanFieldModel() # set up parameters mod_res_std = np.ones_like(Ed[0,:,:]) * 0.05 obs_res_std = np.ones((len(stations),)) * 0.1 # construct a basemap representation of the area lat_rng = (np.min(lat), np.max(lat)) lon_rng = (np.min(lon), np.max(lon)) m = Basemap(llcrnrlon=lon_rng[0],llcrnrlat=lat_rng[0], urcrnrlon=lon_rng[1],urcrnrlat=lat_rng[1], projection = 'mill') plt.figure(figsize = (10, 6)) # run model ndx = 1 for t in range(1, Nt): model_time = wrf_data.get_times()[t] E = 0.5 * (Ed[t,:,:] + Ew[t,:,:]) # if we have an observation somewhere in time, run kriging if model_time in obs_data: print("Time: %s, step: %d" % (str(model_time), t)) mfm.fit_to_data(E, obs_data[model_time]) Efit = mfm.predict_field(E) # krige data to observations K, V = simple_kriging_data_to_model(obs_data[model_time], obs_res_std, Efit, wrf_data, mod_res_std, t) plt.clf() plt.subplot(2,2,1) render_spatial_field(m, lon, lat, Efit, 'Equilibrium') plt.clim([0.0, 0.2]) plt.colorbar() plt.subplot(2,2,2) render_spatial_field(m, lon, lat, K, 'Kriging field') plt.clim([0.0, 0.2]) plt.colorbar() plt.subplot(2,2,3) render_spatial_field(m, lon, lat, V, 'Kriging variance') plt.clim([0.0, np.max(V)]) plt.colorbar() plt.subplot(2,2,4) render_spatial_field(m, lon, lat, K - Efit, 'Kriging vs. mean field residuals') # plt.clim([0.0, np.max()]) plt.colorbar() plt.savefig('model_outputs/kriging_test_t%03d.png' % (ndx)) ndx += 1