def L63_gen(): from dapper.mods.Lorenz63.sakov2012 import HMM as _HMM HMM = _HMM.copy() HMM.t.BurnIn = 0 HMM.t.KObs = 10 dpr.set_seed(3000) # xps xps = dpr.xpList() xps += da.Climatology() xps += da.OptInterp() xps += da.Var3D(xB=0.1) xps += da.ExtKF(infl=90) xps += da.EnKF("Sqrt", N=3, infl=1.30) xps += da.EnKF("Sqrt", N=10, infl=1.02, rot=True) xps += da.EnKF("PertObs", N=500, infl=0.95, rot=False) xps += da.EnKF_N(N=10, rot=True) xps += da.iEnKS("Sqrt", N=10, infl=1.02, rot=True) xps += da.PartFilt(N=100, reg=2.4, NER=0.3) xps += da.PartFilt(N=800, reg=0.9, NER=0.2) xps += da.PartFilt(N=4000, reg=0.7, NER=0.05) xps += da.PFxN(xN=1000, N=30, Qs=2, NER=0.2) # Run xps.launch(HMM, False, store_u=True) return xps
def L96_table(): import dapper.mods.Lorenz96 as model from dapper.mods.Lorenz96.sakov2008 import HMM as _HMM model.Force = 8.0 # undo pinheiro2019 HMM = _HMM.copy() HMM.t.BurnIn = 0 HMM.t.KObs = 10 dpr.set_seed(3000) # xps xps = dpr.xpList() xps += da.Climatology() xps += da.OptInterp() xps += da.Var3D(xB=0.02) xps += da.ExtKF(infl=6) xps += da.EnKF("PertObs", N=40, infl=1.06) xps += da.EnKF("Sqrt", N=28, infl=1.02, rot=True) xps += da.EnKF_N(N=24, rot=True) xps += da.EnKF_N(N=24, rot=True, xN=2) xps += da.iEnKS("Sqrt", N=40, infl=1.01, rot=True) xps += da.LETKF(N=7, rot=True, infl=1.04, loc_rad=4) xps += da.SL_EAKF(N=7, rot=True, infl=1.07, loc_rad=6) xps.launch(HMM, store_u=True) table = xps.tabulate_avrgs(statkeys, decimals=4) return table.splitlines(True)
# #### Imports # %matplotlib notebook from mpl_tools import is_notebook_or_qt as nb import dapper as dpr import dapper.da_methods as da # #### Load experiment setup: the hidden Markov model (HMM) from dapper.mods.Lorenz63.sakov2012 import HMM # isort:skip # #### Generate the same random numbers each time this script is run seed = dpr.set_seed(3000) # #### Simulate synthetic truth (xx) and noisy obs (yy) HMM.t.T = 30 # shorten experiment xx, yy = HMM.simulate() # #### Specify a DA method configuration ("xp" for "experiment") xp = da.EnKF('Sqrt', N=10, infl=1.02, rot=True) # xp = da.Var3D() # xp = da.PartFilt(N=100, reg=2.4, NER=0.3) # #### Assimilate yy, knowing the HMM; xx is used to assess the performance xp.assimilate(HMM, xx, yy, liveplots=not nb)
"""Prettier, static illustration of Lorenz two-speed/scale/layer model.""" # Sorry for the mess. import matplotlib as mpl import numpy as np from matplotlib import pyplot as plt import dapper as dpr from dapper.mods.LorenzUV.lorenz96 import LUV from dapper.tools.math import ccat # Setup sd0 = dpr.set_seed(4) # from dapper.mods.LorenzUV.wilks05 import LUV nU, J = LUV.nU, LUV.J dt = 0.005 t0 = np.nan K = int(10 / dt) step_1 = dpr.with_rk4(LUV.dxdt, autonom=True) step_K = dpr.with_recursion(step_1, prog=1) x0 = 0.01 * np.random.randn(LUV.M) x0 = step_K(x0, int(2 / dt), t0, dt)[-1] # BurnIn xx = step_K(x0, K, t0, dt) # Grab parts of state vector ii = np.arange(nU + 1) jj = np.arange(nU * J + 1) circU = np.mod(ii, nU)
def set_X0_and_simulate(hmm, xp): dpr.set_seed(3000) hmm.X0 = X0(TRUTH, 0) xx, yy = hmm.simulate() hmm.X0 = X0(GUESS, 0.1**2) return xx, yy
"""Illustrate usage of DAPPER to benchmark multiple DA methods.""" import dapper as dpr dpr.set_seed(3000) ############################## # DA method configurations ############################## xps = dpr.xpList() from dapper.mods.Lorenz63.sakov2012 import HMM # Expected rmse.a: xps += dpr.Climatology() # 7.6 xps += dpr.OptInterp() # 1.25 xps += dpr.Var3D(xB=0.1) # 1.03 xps += dpr.ExtKF(infl=90) # 0.87 xps += dpr.EnKF('Sqrt', N=3, infl=1.30) # 0.82 xps += dpr.EnKF('Sqrt', N=10, infl=1.02, rot=True) # 0.63 xps += dpr.EnKF('PertObs', N=500, infl=0.95, rot=False) # 0.56 xps += dpr.EnKF_N(N=10, rot=True) # 0.54 xps += dpr.iEnKS('Sqrt', N=10, infl=1.02, rot=True) # 0.31 xps += dpr.PartFilt(N=100, reg=2.4, NER=0.3) # 0.38 xps += dpr.PartFilt(N=800, reg=0.9, NER=0.2) # 0.28 # xps += dpr.PartFilt( N=4000, reg=0.7 , NER=0.05) # 0.27 # xps += dpr.PFxN(xN=1000, N=30 , Qs=2 , NER=0.2) # 0.56 # from dapper.mods.Lorenz96.sakov2008 import HMM # Expected rmse.a: # xps += dpr.Climatology() # 3.6 # xps += dpr.OptInterp() # 0.95 # xps += dpr.Var3D(xB=0.02) # 0.41
########################### # Setup ########################### PRMS = 'Lorenz' if PRMS == 'Wilks': from dapper.mods.LorenzUV.wilks05 import LUV else: from dapper.mods.LorenzUV.lorenz96 import LUV nU = LUV.nU K = 400 dt = 0.005 t0 = np.nan dpr.set_seed(30) # 3 5 7 13 15 30 x0 = np.random.randn(LUV.M) true_step = with_rk4(LUV.dxdt, autonom=True) model_step = with_rk4(LUV.dxdt_trunc, autonom=True) true_K = with_recursion(true_step, prog=1) ########################### # Compute truth trajectory ########################### x0 = true_K(x0, int(2 / dt), t0, dt)[-1] # BurnIn xx = true_K(x0, K, t0, dt) ########################### # Compute unresovled scales ###########################