obserr = 3.0 cycle_period = 3600 * 1 iX, jX = rv.make_coords(ni, nj) X = np.zeros((ni * nj * nv, nt + 1)) loc = np.zeros((2, nt + 1)) wind = np.zeros((nt + 1, )) obs = np.zeros((nt + 1, nobs * nv)) iObs = np.zeros((nt + 1, nobs * nv)) jObs = np.zeros((nt + 1, nobs * nv)) vObs = np.zeros((nt + 1, nobs * nv)) ##initial state np.random.seed(0) X_bkg = rv.make_background_flow(ni, nj, nv, dx, ampl=1e-4) X[:, 0] = X_bkg + rv.make_state(ni, nj, nv, iStorm, jStorm, Rmw, Vmax, Vout) 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
iBias = 0 jBias = 0 Rsprd = 0 Vsprd = 0 filter_kind = sys.argv[1] #'EnSRF' ns = int(sys.argv[2]) nens = int(sys.argv[3]) # ensemble size Csprd = int(sys.argv[4]) obsR = int(sys.argv[5]) obserr = int(sys.argv[6]) # observation error spread localize_cutoff = 0 ##truth iX, jX = rv.make_coords(ni, nj) Xt = rv.make_state(ni, nj, nv, iStorm, jStorm, Rmw, Vmax, Vout) ut, vt = rv.X2uv(ni, nj, Xt) ##DA trials casename = '{}_s{}_N{}_C{}_R{}_err{}'.format(filter_kind, ns, nens, Csprd, obsR, obserr) if os.path.exists(outdir + casename + '.npy'): state_error = np.load(outdir + casename + '.npy') else: state_error = np.zeros((nrealize, nens + 1)) state_error[:, :] = np.nan for realize in range(r0, r0 + 100): np.random.seed(realize) # fix random number seed, make results predictable
#diss_ens = 3e2*np.ones(nens) ##+ np.random.uniform(-2, 4, (nens,)) ##initial ensemble state np.random.seed(0) X_bkg = rv.make_background_flow(ni, nj, nv, dx, ampl=1e-4) iX, jX = rv.make_coords(ni, nj) X = np.zeros((ni * nj * nv, nens, nt + 1)) loc = np.zeros((2, nens, nt + 1)) wind = np.zeros((nens, nt + 1)) iStorm_ens = np.zeros(nens) jStorm_ens = np.zeros(nens) for m in range(nens): iStorm_ens[m] = iStorm + np.random.normal(0, 1) * Csprd jStorm_ens[m] = jStorm + np.random.normal(0, 1) * Csprd X[:, m, 0] = rv.make_state(ni, nj, nv, iStorm_ens[m], jStorm_ens[m], Rmw, Vmax, Vout) X[:, m, 0] += X_bkg + rv.make_background_flow(ni, nj, nv, dx, ampl=5e-5) Xt = np.load(outdir + 'truth_state.npy') obs = np.load(outdir + 'obs.npy') iObs = np.load(outdir + 'obs_i.npy') jObs = np.load(outdir + 'obs_j.npy') vObs = np.load(outdir + 'obs_v.npy') for n in range(nt): print(n) ##DA update H = rv.obs_operator(iX, jX, nv, iObs[n, :], jObs[n, :], vObs[n, :]) krange = np.arange(2, 2 * ns + 1, 2) Xa = DA.filter_update(ni, nj, nv, X[:, :, n].T, iX, jX, H, iObs[n, :],