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()
Esempio n. 5
0
            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)
Esempio n. 6
0
    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()
Esempio n. 7
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()
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