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)
def test_L63(): from dapper.mods.Lorenz63.sakov2012 import HMM xps = dpr.xpList() xps += dpr.EnKF('Sqrt', N=10, infl=1.02, rot=True) xps += dpr.PartFilt(N=20, reg=2.4, NER=0.3) xps += dpr.OptInterp() # xps += dpr.iEnKS('Sqrt', N=10, infl=1.02,rot=True) HMM.t.BurnIn = HMM.t.dtObs HMM.t.KObs = 1 xps.launch(HMM, free=False, liveplots="all", store_u=False, fail_gently=False) for xp in xps: xp.stats.replay("all") xp.stats.replay(t2=1) xp.stats.replay(t2=0.0) xp.stats.replay(t2=0.3) xp.stats.replay(t2=0.8) xp.stats.replay(t2=0.8, t1=0.2) xp.stats.replay(t2=np.inf) xp.stats.replay(t2=np.inf, speed=1) xp.stats.replay(t2=np.inf, pause_a=0, pause_f=0) assert True # An assertion for pytest to count return HMM, xps # Return useful stuff
def test_L63(): from dapper.mods.Lorenz63.sakov2012 import HMM as _HMM xps = dpr.xpList() xps += da.EnKF("Sqrt", N=10, infl=1.02, rot=True) xps += da.PartFilt(N=20, reg=2.4, NER=0.3) xps += da.OptInterp() # xps += da.iEnKS('Sqrt', N=10, infl=1.02,rot=True) HMM = _HMM.copy() HMM.tseq.BurnIn = HMM.tseq.dto HMM.tseq.Ko = 1 xps.launch( HMM, free=False, statkeys=True, liveplots=None, store_u=False, fail_gently=False, save_as=False, ) print(xps.tabulate_avrgs(["rmse.a"])) # Disabled coz magic doesn't work any more on python 3.7 # spell_out(HMM) # spell_out(xps[-1]) # spell_out(xps[-1].stats) # spell_out(xps[-1].avrgs) assert True # An assertion for pytest to count return HMM, xps # Return useful stuff
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 L63_gen(): from dapper.mods.Lorenz63.sakov2012 import HMM as _HMM HMM = _HMM.copy() HMM.tseq.BurnIn = 0 HMM.tseq.Ko = 10 # xps xps = dpr.xpList() xps += da.Climatology() xps += da.OptInterp() xps += da.Persistence() xps += da.PreProg(lambda k, xx, yy: xx[k]) 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) xps += da.OptPF(N=100, Qs=2, reg=0.7, NER=0.3) xps += da.EnKS("Serial", N=30, Lag=1) xps += da.EnRTS("Serial", N=30, DeCorr=0.99) for xp in xps: xp.seed = 3000 # Run xps.launch(HMM, False, store_u=True) return xps
def L96_gen(): 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.tseq.BurnIn = 0 HMM.tseq.Ko = 10 # xps xps = dpr.xpList() xps += da.Climatology() xps += da.OptInterp() xps += da.Persistence() xps += da.PreProg(lambda k, xx, yy: xx[k]) 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) for xp in xps: xp.seed = 3000 xps.launch(HMM, store_u=True) return xps
def data(): from dapper.mods.LA.small import HMM as _HMM HMM = _HMM.copy() HMM.t.BurnIn = 0 HMM.t.KObs = 10 xps = dpr.xpList(unique=True) # yapf: disable xps += da.EnKF('Sqrt' , N=20) xps += da.EnKF('PertObs', N=20) xps += da.EnKF('DEnKF' , N=20) for Lag in [0, 1, 3]: xps += da.EnKS('Sqrt' , N=20, Lag=Lag) xps += da.EnKS('PertObs', N=20, Lag=Lag) xps += da.EnKS('DEnKF' , N=20, Lag=Lag) for nIter in [1, 4]: for MDA in [False, True]: xps += da.iEnKS('Sqrt' , N=20, Lag=Lag, nIter=nIter, MDA=MDA) xps += da.iEnKS('PertObs', N=20, Lag=Lag, nIter=nIter, MDA=MDA) xps += da.iEnKS('Order1' , N=20, Lag=Lag, nIter=nIter, MDA=MDA) # yapf: enable for xp in xps: xp.seed = 3000 xps.launch(HMM, store_u=True, save_as=False) print(xps.tabulate_avrgs(["rmse.a", "rmse.f", "rmse.u", "rmse.s"])) return xps
def test_L63(): from dapper.mods.Lorenz63.sakov2012 import HMM xps = dpr.xpList() xps += dpr.EnKF("Sqrt", N=10, infl=1.02, rot=True) xps += dpr.PartFilt(N=20, reg=2.4, NER=0.3) xps += dpr.OptInterp() # xps += dpr.iEnKS('Sqrt', N=10, infl=1.02,rot=True) HMM.t.BurnIn = HMM.t.dtObs HMM.t.KObs = 1 xps.launch( HMM, free=False, statkeys=True, liveplots=None, store_u=False, fail_gently=False, save_as=False, ) print(xps.tabulate_avrgs(["rmse.a"])) spell_out(HMM) spell_out(xps[-1]) spell_out(xps[-1].stats) spell_out(xps[-1].avrgs) assert True # An assertion for pytest to count return HMM, xps # Return useful stuff
def test_L96(): xps = dpr.xpList() from dapper.mods.Lorenz96.sakov2008 import HMM as _HMM xps += da.EnKF('PertObs', N=40, infl=1.06) xps += da.EnKF('Serial', N=28, infl=1.02, rot=True) xps += da.OptInterp() xps += da.Var3D(xB=0.02) xps += da.ExtKF(infl=10) xps += da.LETKF(N=6, rot=True, infl=1.05, loc_rad=4, taper='Step') # from dapper.mods.Lorenz96.bocquet2015loc import HMM # xps += da.EnKF_N( N=24, rot=True ,infl=1.01) # xps += da.PartFilt(N=3000,NER=0.20,reg=1.2) # xps += da.PFxN( N=1000,xN=100, NER=0.9,Qs=0.6) HMM = _HMM.copy() # HMM.t.BurnIn = 10*HMM.t.dtObs # HMM.t.KObs = 30 HMM.t.BurnIn = HMM.t.dtObs HMM.t.KObs = 2 xps.launch(HMM, free=False, liveplots="all", store_u=False, fail_gently=False, save_as=False) for xp in xps: xp.stats.replay("all") xp.stats.replay(t2=1) xp.stats.replay(t2=0.0) xp.stats.replay(t2=0.3) xp.stats.replay(t2=0.8) xp.stats.replay(t2=0.8, t1=0.2) xp.stats.replay(t2=np.inf) xp.stats.replay(t2=np.inf, speed=1) xp.stats.replay(t2=np.inf, pause_a=0, pause_f=0) assert True # An assertion for pytest to count return HMM, xps # Return useful stuff
def test_L96(): xps = dpr.xpList() from dapper.mods.Lorenz96.sakov2008 import HMM as _HMM xps += da.EnKF("PertObs", N=40, infl=1.06) xps += da.EnKF("Serial", N=28, infl=1.02, rot=True) xps += da.OptInterp() xps += da.Var3D(xB=0.02) xps += da.ExtKF(infl=10) xps += da.LETKF(N=6, rot=True, infl=1.05, loc_rad=4, taper="Step") # from dapper.mods.Lorenz96.bocquet2015loc import HMM # xps += da.EnKF_N( N=24, rot=True ,infl=1.01) # xps += da.PartFilt(N=3000,NER=0.20,reg=1.2) # xps += da.PFxN( N=1000,xN=100, NER=0.9,Qs=0.6) HMM = _HMM.copy() # HMM.tseq.BurnIn = 10*HMM.tseq.dto # HMM.tseq.Ko = 30 HMM.tseq.BurnIn = HMM.tseq.dto HMM.tseq.Ko = 2 xps.launch( HMM, free=False, statkeys=True, liveplots=None, store_u=False, fail_gently=False, save_as=False, ) print(xps.tabulate_avrgs(["rmse.a"])) # spell_out(HMM) # spell_out(xps[-1]) # spell_out(xps[-1].stats) # spell_out(xps[-1].avrgs) assert True # An assertion for pytest to count return HMM, xps # Return useful stuff
############################## # DA Configurations ############################## # Param ranges params = dict( xB = [.1, .2, .4, 1], N = [5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 25, 30, 35, 40, 45, 50], infl = 1+np.array([0, .01, .02, .04, .07, .1, .2, .4, .7, 1]), rot = [True, False], loc_rad = dpr.round2sigfig([a*b for b in [.1, 1, 10] for a in [1, 2, 4, 7]], 2), ) # Combines all the params suitable for a method. Faster than "manual" for-loops. for_params = dpr.get_param_setter(params, seed=3000+np.arange(10), F=[8, 10]) xps = dpr.xpList() xps += for_params(da.Climatology) xps += for_params(da.OptInterp) xps += for_params(da.Var3D, B="eye") xps += for_params(da.EnKF, upd_a="PertObs") xps += for_params(da.EnKF, upd_a="Sqrt") xps += for_params(da.EnKF_N, infl=1.0) xps += for_params(da.LETKF) ############################## # Run experiments ############################## # Paralellize/distribute experiments across CPUs. mp = False # 1 CPU only
# and the dynamics for the DA methods. 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 # Note: An alternative approach might be to simply # write our own `simulate()` which merely sets the `Force` parameter, # rather than sampling it. # #### DA methods configurations xps = dpr.xpList() # xps += da.PartFilt(N=1000, reg=1) # works OK with Nx=6 for N in [20, 50]: # xps += da.EnKF('Sqrt', N, infl=1.04) xps += da.EnKF_N(N, xN=2) for Lag in [1, 4, 20]: xps += da.iEnKS("Sqrt", N, Lag=Lag, xN=2, wtol=1e-5) # TODO 4: Add 3D- and 4D-Var # #### Launch experiments scriptname = "basic_3" if nb else __file__ save_as = xps.launch( HMM, scriptname, setup=set_X0_and_simulate, mp=False, # Multiprocessing
"""Tests with the LA model, which are very useful for testing boundary cases of the iEnKS (e.g. nIter=1, Lag=0).""" ############################## # Preamble ############################## import numpy as np import dapper as dpr from dapper.dict_tools import deep_getattr from dapper.mods.LA.small import HMM HMM.t.BurnIn = 0 HMM.t.KObs = 10 xps = dpr.xpList(unique=True) # yapf: disable xps += dpr.EnKF('Sqrt', N=20) xps += dpr.EnKF('PertObs', N=20) xps += dpr.EnKF('DEnKF', N=20) for Lag in [0, 1, 3]: xps += dpr.EnKS('Sqrt', N=20, Lag=Lag) xps += dpr.EnKS('PertObs', N=20, Lag=Lag) xps += dpr.EnKS('DEnKF', N=20, Lag=Lag) for nIter in [1, 4]: for MDA in [False, True]: xps += dpr.iEnKS('Sqrt', N=20, Lag=Lag, nIter=nIter, MDA=MDA) xps += dpr.iEnKS('PertObs', N=20, Lag=Lag, nIter=nIter, MDA=MDA) xps += dpr.iEnKS('Order1', N=20, Lag=Lag, nIter=nIter, MDA=MDA) # yapf: enable