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,
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,
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]])
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,