for i in range(N+1): Jac[i,i] = 1. #print 'J is', Jac #Jac0 = np.copy(Jac) #** ALT AT 26/03 - ADDING THIS VARIABLE TO ALL Jac CALCULATIONS** dsdx = np.zeros([DM,N+1]) dxds = np.zeros([N+1,DM]) ## Running from 0 to 10 for w in range(10): random = np.zeros(N+1) #random = np.random.randn(N+1) x[:,w+1] = mod.lorenz96(x[:,w],random,dt) dfdx = mod.df(x[:,w]) #######Jac = Jac + dt*(np.dot(dfdx,Jac)) Jac = Jac*(np.exp(dt*dfdx)) print 'Initial Jacs', Jac ##print 'x10 is', x[:,10] # Main loop mcn = 0 summation = np.zeros(N+1) run = 500 count = 1 integ = DM*ns differ = np.zeros(DM) scount = 0
x[:, 10] = x[:, 0] ##for t in range(10, run): for t in range(run): S[0] = np.transpose(np.dot(H, x[:, t])) Y[0] = y[:, t] dsdx[0, :] = H Jac = Jac0 for n in range(2, DM + 1): for i in range(1, ns + 1): tt = t + (i - 1 + (n - 1) * ns) #random = np.zeros(N) x[:, tt + 1] = mod.lorenz96(x[:, tt], random, dt) ####f = mod.l95(x[:,tt],dt) dfdx = mod.df(x[:, tt]) #print 'dfdx', dfdx Jac = np.dot(dfdx, Jac) idxs = MO * (n - 2) + MO S[idxs] = np.transpose(np.dot(H, x[:, tt + 1])) idxy = t + (n - 1) * ns Y[idxs] = y[:, idxy] dsdx[idxs, :] = Jac[0, :] dxds = np.linalg.pinv(dsdx) ########dxds = np.linalg.pinv(dsdx,rcond=2.22e-16) dif = Y - S
##for t in range(10, run): for t in range(run): ####if (t == tobs[mcn]): if (t == 10): ##ldelay = integ + t ####print 'Initial x10 is', x[:,10] ####print 'Initial dsdx', dsdx ldelay = integ + mcn*ns ####print 'ldelay', ldelay for m in range(t,ldelay+1): ## ldelay + 1 really needed or only ldelay is enough? ## if m == t: random = np.zeros(N+1) x[:,m+1] = mod.lorenz96(x[:,m],random,dt) ####print 'Jac', Jac[0,:] dsdx[scount,:] = Jac[0,:] dfdx = mod.df(x[:,m]) Jac = Jac + dt*(np.dot(dfdx,Jac)) ########Jac = Jac*(np.exp(dt*dfdx)) ####print 'Second dsdx', dsdx scount = scount + 1 else: random = np.zeros(N+1) #random = np.random.randn(N+1) x[:,m+1] = mod.lorenz96(x[:,m],random,dt) #print 'x is', x[:,m+1] dfdx = mod.df(x[:,m]) Jac = Jac + dt*(np.dot(dfdx,Jac)) ## SEE IF Jac SHOULD BE FROM TIME 9 TO 10 ## ######Jac = Jac*(np.exp(dt*dfdx)) Jaclast = Jac newcount = (count+1)*ns if (m+1 == newcount):
for m in range(2, M + 1): for i in range(1, int(nTau) + 1): tt = t + dt * (i - 1 + (m - 1) * nTau) ##Jacsize = D**2 ##Jacv = Jac.reshape(Jacsize) # creates an array (Jacsize,) ##Jacvec = Jacv.reshape(Jacsize,1) # creates an array (Jacsize,1) ##dxdt = mod.dxdt(xx,Jacvec,D,dt) ##xtran = mod.rk4(dxdt,dt) ##xx = xtran[0:D] ##print 'n=', n, 'xx at m', m, 'is', xx ##Jact = xtran[D:] ##Jac = Jact.reshape(D,D) dfdx = mod.df(xx) random = np.zeros(D) xx = mod.lorenz96(xx, random, dt) Jac = Jac + dt * (np.dot(dfdx, Jac)) #print 'xx at m', m, 'is', xx #dfdx = mod.df(xx) #print 'dfdx', dfdx #print 'n=', n, 'xx at m', m, 'is', xx #####Jac = np.dot(dfdx,Jac) #print 'Jac', Jac #########Jacsize = D**2 #########Jacv = Jac.reshape(Jacsize) #########Jacvec = Jacv.reshape(Jacsize,1) #########f,Jac = mod.dxdt(xx,Jacvec,D,dt) #f = dxdt[0:D]
for m in range(2,M+1): for i in range(1,int(nTau)+1): tt = t + dt*(i-1+(m-1)*nTau) ##Jacsize = D**2 ##Jacv = Jac.reshape(Jacsize) # creates an array (Jacsize,) ##Jacvec = Jacv.reshape(Jacsize,1) # creates an array (Jacsize,1) ##dxdt = mod.dxdt(xx,Jacvec,D,dt) ##xtran = mod.rk4(dxdt,dt) ##xx = xtran[0:D] ##print 'n=', n, 'xx at m', m, 'is', xx ##Jact = xtran[D:] ##Jac = Jact.reshape(D,D) dfdx = mod.df(xx) random = np.zeros(D) xx = mod.lorenz96(xx,random,dt) Jac = Jac + dt*(np.dot(dfdx,Jac)) #print 'xx at m', m, 'is', xx #dfdx = mod.df(xx) #print 'dfdx', dfdx #print 'n=', n, 'xx at m', m, 'is', xx #####Jac = np.dot(dfdx,Jac) #print 'Jac', Jac #########Jacsize = D**2 #########Jacv = Jac.reshape(Jacsize) #########Jacvec = Jacv.reshape(Jacsize,1) #########f,Jac = mod.dxdt(xx,Jacvec,D,dt) #f = dxdt[0:D]
#####if m == t: ##### random = np.zeros(N+1) ##### x[:,m+1] = mod.lorenz96(x[:,m],random,dt) ##### dsdx[scount,:] = Jac[0,:] ##### dfdx = mod.df(x[:,m]) ##### Jac = Jac + dt*(np.dot(dfdx,Jac)) ##### scount = scount + 1 #####else: random = np.zeros(N) #random = np.random.randn(N+1) x[:,m+1] = mod.lorenz96(x[:,m],random,dt) #print 'x size', x[:,m].shape dfdx = mod.df(x[:,m]) Jacvec = Jac.reshape(jacsize) #print 'Jacvec size', Jacvec.shape randJ = np.zeros(jacsize) Jacstep = mod.lorenz96(Jacvec,randJ,dt) Jac = Jacstep.reshape(N,N) #print 'Jac is', Jac ######Jac = Jac + dt*(np.dot(dfdx,Jac)) #####Jac = Jac*(np.exp(dt*dfdx)) #Jaclast = Jac newcount = (count+1)*ns if (m+1 == newcount): dsdx[scount,:] = Jac[0,:] scount = scount + 1
dxds = np.zeros([N + 1, DM]) count = 0 # Running x with pure Lorenz to calculate the initial S integ = DM * ns for t in range(integ + 1): #random = np.random.randn(N+1) # Taking off randomness from the model (deterministic in the article) ***** PJ - 19/03 ***** random = np.zeros(N + 1) x[:, t + 1] = mod.lorenz96(x[:, t], random, dt) #print 'x at', t, 'is', x[:,t+1] # Calculating dF/dx, J, dS/dx for the first 100 steps dfdx = mod.df( x[:, t] ) # CORRECTION MADE:1st dfdx to be calculated shall be from x[:0] ** Me - 22/04** #print 'dfdx', dfdx Jac = Jac + dt * (np.dot(dfdx, Jac)) #print 'Jac is', Jac if (t == tobs[count]): #for a in range(DM): dsdx[count, :] = Jac[0, :] count = count + 1 #print 'Initial dsdx is', dsdx # Calculating initial dx/dS (10-100) #dxds = np.linalg.pinv(dsdx,rcond=1e-16) dxds = np.linalg.pinv( dsdx ) #### CHECK IF THE COMPLETE CALCULATION WILL BE NEEDED!!!!!!!!########
x[:,10] = x[:,0] ##for t in range(10, run): for t in range(run): S[0] = np.transpose(np.dot(H,x[:,t])) Y[0] = y[:,t] dsdx[0,:] = H Jac = Jac0 for n in range(2,DM+1): for i in range(1,ns+1): tt = t + (i-1+(n-1)*ns) #random = np.zeros(N) x[:,tt+1] = mod.lorenz96(x[:,tt],random,dt) ####f = mod.l95(x[:,tt],dt) dfdx = mod.df(x[:,tt]) #print 'dfdx', dfdx Jac = np.dot(dfdx,Jac) idxs = MO*(n-2) + MO S[idxs] = np.transpose(np.dot(H,x[:,tt+1])) idxy = t + (n-1)*ns Y[idxs] = y[:,idxy] dsdx[idxs,:] = Jac[0,:] dxds = np.linalg.pinv(dsdx) ########dxds = np.linalg.pinv(dsdx,rcond=2.22e-16) dif = Y - S
#####if m == t: ##### random = np.zeros(N+1) ##### x[:,m+1] = mod.lorenz96(x[:,m],random,dt) ##### dsdx[scount,:] = Jac[0,:] ##### dfdx = mod.df(x[:,m]) ##### Jac = Jac + dt*(np.dot(dfdx,Jac)) ##### scount = scount + 1 #####else: random = np.zeros(N) #random = np.random.randn(N+1) x[:, m + 1] = mod.lorenz96(x[:, m], random, dt) #print 'x size', x[:,m].shape dfdx = mod.df(x[:, m]) Jacvec = Jac.reshape(jacsize) #print 'Jacvec size', Jacvec.shape randJ = np.zeros(jacsize) Jacstep = mod.lorenz96(Jacvec, randJ, dt) Jac = Jacstep.reshape(N, N) #print 'Jac is', Jac ######Jac = Jac + dt*(np.dot(dfdx,Jac)) #####Jac = Jac*(np.exp(dt*dfdx)) #Jaclast = Jac newcount = (count + 1) * ns if (m + 1 == newcount): dsdx[scount, :] = Jac[0, :] scount = scount + 1
dxds = np.zeros([N+1,DM]) count = 0 # Running x with pure Lorenz to calculate the initial S integ = DM*ns for t in range(integ+1): #random = np.random.randn(N+1) # Taking off randomness from the model (deterministic in the article) ***** PJ - 19/03 ***** random = np.zeros(N+1) x[:,t+1] = mod.lorenz96(x[:,t],random,dt) #print 'x at', t, 'is', x[:,t+1] # Calculating dF/dx, J, dS/dx for the first 100 steps dfdx = mod.df(x[:,t]) # CORRECTION MADE:1st dfdx to be calculated shall be from x[:0] ** Me - 22/04** #print 'dfdx', dfdx Jac = Jac + dt*(np.dot(dfdx,Jac)) #print 'Jac is', Jac if (t == tobs[count]): #for a in range(DM): dsdx [count,:] = Jac[0,:] count = count + 1 #print 'Initial dsdx is', dsdx # Calculating initial dx/dS (10-100) #dxds = np.linalg.pinv(dsdx,rcond=1e-16) dxds = np.linalg.pinv(dsdx) #### CHECK IF THE COMPLETE CALCULATION WILL BE NEEDED!!!!!!!!######## #print 'dxds', dxds # Y and S