Beispiel #1
0
    for n in range(nens):
        iStorm_ens[n] = iStorm + iBias + np.random.normal(0, 1) * Csprd
        jStorm_ens[n] = jStorm + jBias + np.random.normal(0, 1) * Csprd
        Rmw_n = Rmw + np.random.normal(0, 1) * Rsprd
        Vmax_n = Vmax + np.random.normal(0, 1) * Vsprd
        Vout_n = Vout + np.random.normal(0, 1) * 0.0
        Xb[n, :] = rv.make_state(ni, nj, nv, iStorm_ens[n], jStorm_ens[n],
                                 Rmw_n, Vmax_n, Vout_n)

    ###Observations
    th = np.random.uniform(0, 360) * np.pi / 180 * np.array([1, 1])
    iObs = iStorm + obsR * np.sin(th)
    jObs = iStorm + obsR * np.cos(th)
    vObs = np.array([0, 1])
    nobs = iObs.size  # number of observation points
    H = rv.obs_operator(iX, jX, nv, iObs, jObs, vObs)
    obs = np.dot(H, Xt) + np.random.normal(0.0, obserr, nobs)

    ##Run filter
    Xa = Xb.copy()
    krange = np.arange(1, ns + 1)
    Xa = DA.filter_update(ni, nj, nv, Xb, iX, jX, H, iObs, jObs, vObs, obs,
                          obserr, localize_cutoff, krange, filter_kind)

    ###Diagnose
    ###domain-averaged (near storm region) state (u,v) error:
    for m in range(nens):
        u, v = rv.X2uv(ni, nj, Xa[m, :])
        square_err = (u - ut)**2 + (v - vt)**2
        state_error[realize, m] = np.sqrt(
            np.mean(square_err[iStorm - 20:iStorm + 20,
Beispiel #2
0
for n in range(nt + 1):
    print(n)
    u, v = rv.X2uv(ni, nj, X[:, n])
    zeta = rv.uv2zeta(u, v, dx)
    loc[0, n], loc[1, n] = rv.get_center_ij(u, v, dx)
    wind[n] = rv.get_max_wind(u, v)

    for p in range(nobs):
        for v in range(nv):
            iObs[n, p * nv +
                 v] = np.random.uniform(-obs_range, obs_range) + loc[0, n]
            jObs[n, p * nv +
                 v] = np.random.uniform(-obs_range, obs_range) + loc[1, n]
            vObs[n, p * nv + v] = v
    H = rv.obs_operator(iX, jX, nv, iObs[n, :], jObs[n, :], vObs[n, :])
    obs[n, :] = np.dot(H, X[:, n]) + np.random.normal(0.0, obserr,
                                                      (nobs * nv, ))

    if n < nt:
        X[:, n + 1] = rv.advance_time(ni, nj, X[:, n], dx,
                                      int(cycle_period / dt), dt, diss)

np.save(outdir + 'truth_state.npy', X)
np.save(outdir + 'truth_ij.npy', loc)
np.save(outdir + 'truth_wind.npy', wind)
np.save(outdir + 'obs.npy', obs)
np.save(outdir + 'obs_i.npy', iObs)
np.save(outdir + 'obs_j.npy', jObs)
np.save(outdir + 'obs_v.npy', vObs)
#!/usr/bin/env python

import numpy as np
import rankine_vortex as rv
import graphics as g
import config as p
import matplotlib.pyplot as plt
import data_assimilation as DA

plt.switch_backend('Agg')

x_in = 17
y_in = 29
iout1 = np.array([x_in])
jout1 = np.array([y_in])
H = rv.obs_operator(p.iX, p.jX, p.nv, iout1, jout1, p.iSite, p.jSite)
obs = np.matmul(H, p.Xt) + np.random.normal(0.0, p.obserr)
# Xa = DA.EnSRF(p.ni, p.nj, p.nv, p.Xb, p.iX, p.jX, H, iout1, jout1, obs, p.obserr, p.localize_cutoff)
Xa = DA.RHF(p.ni, p.nj, p.nv, p.Xb, p.iX, p.jX, H, iout1, jout1, obs, p.obserr,
            p.localize_cutoff)

for x_in in range(41):
    for y_in in range(41):
        iout2 = np.array([x_in])
        jout2 = np.array([y_in])

        plt.figure(figsize=(3, 3))

        ###scatter plot
        ax = plt.subplot(1, 1, 1)
        Hout = rv.obs_operator(p.iX, p.jX, p.nv, iout1, jout1, p.iSite,
Beispiel #4
0
import matplotlib.pyplot as plt

plt.switch_backend('Agg')

# for x_in in range(41):
# for y_in in range(41):
for x_in in [17]:
    for y_in in [29]:
        iout = np.array([x_in])
        jout = np.array([y_in])

        plt.figure(figsize=(3, 2))

        ###plot histogram
        ax = plt.subplot(1, 1, 1)
        Hout = rv.obs_operator(p.iX, p.jX, p.nv, iout, jout, p.iSite, p.jSite)
        prior_err = np.dot(Hout, p.Xb.T) - np.dot(Hout, p.Xt)
        err_mean = np.mean(prior_err)
        err_std = np.std(prior_err)
        ii = np.arange(-50, 50, 1)
        jj = np.exp(-0.5 * (ii - err_mean)**2 / err_std**2) / np.sqrt(
            2 * np.pi) / err_std
        jj0 = g.hist_normal(ii, prior_err[0, :])
        ax.plot(ii, jj0, 'k', linewidth=2, label='Sample')
        ax.plot(ii, jj, 'r:', linewidth=1, label='Gaussian')
        # ax.legend(fontsize=12, loc=1)

        cmap = [plt.cm.jet(x) for x in np.linspace(0, 1, p.nens_show)]
        for n in range(p.nens_show):
            ax.scatter(prior_err[0, n], 0, s=40, color=[cmap[n][0:3]])
Beispiel #5
0
    jStorm_ens[n] = jStorm + jBias + np.random.normal(0, 1) * Csprd
    Rmw_n = Rmw + np.random.normal(0, 1) * Rsprd
    Vmax_n = Vmax + np.random.normal(0, 1) * Vsprd
    Vout_n = Vout + np.random.normal(0, 1) * 0.0
    Xb[n, :] = rv.make_state(ni, nj, nv, iStorm_ens[n], jStorm_ens[n], Rmw_n,
                             Vmax_n, Vout_n)

###Observations
iObs = np.array([63, 63])
jObs = np.array([65, 65])
# iObs = np.array([66.53, 66.53])
# jObs = np.array([66.53, 66.53])
vObs = np.array([0, 1])
nobs = iObs.size  # number of observation points
obserr = 4.0  # observation error spread
H = rv.obs_operator(iX, jX, nv, iObs, jObs, vObs)
obs = np.dot(H, Xt) + np.array([2.0, -2.0])

iout = np.array([70])
jout = np.array([55])
vout = np.array([0])
Hout = rv.obs_operator(iX, jX, nv, iout, jout, vout)

##Run filter
Xa = np.zeros((4, nens, ni * nj * nv))
Xa[0, :, :] = Xb
Xa[1, :, :] = DA.filter_update(ni, nj, nv, Xb, iX, jX, H, iObs, jObs, vObs,
                               obs, obserr, 0, np.arange(1, 2), 'EnSRF')
Xa[2, :, :] = DA.filter_update(ni, nj, nv, Xb, iX, jX, H, iObs, jObs, vObs,
                               obs, obserr, 0, np.arange(1, 2), 'EnSRF')
Xa[3, :, :] = DA.filter_update(ni, nj, nv, Xb, iX, jX, H, iObs, jObs, vObs,