77
88class da_system :
99
10- def __init__ (self ,x0 = [0 ],yo = [0 ],t0 = 0 ,dt = 0 ,alpha = 0.5 ,state_vector = [0 ],obs_data = [0 ] ):
10+ def __init__ (self ,x0 = [],yo = [],t0 = 0 ,dt = 0 ,alpha = 0.5 ,state_vector = [],obs_data = [], acyc_step = 10 ):
1111 self .xdim = np .size (x0 )
1212 self .ydim = np .size (yo )
1313 self .edim = 1
@@ -16,15 +16,19 @@ def __init__(self,x0=[0],yo=[0],t0=0,dt=0,alpha=0.5,state_vector=[0],obs_data=[0
1616 self .dt = dt
1717 self .X0 = x0
1818 self .t = t0
19- self .ainc = 1
19+ self .acyc_step = acyc_step
20+ self .dtau = dt * acyc_step
21+ self .fcst_step = acyc_step
22+ self .fcst_dt = dt
23+ self .maxit = 0
2024 self .B = np .matrix (np .identity (self .xdim ))
2125 self .R = np .matrix (np .identity (self .ydim ))
2226 self .H = np .matrix (np .identity (self .xdim ))
2327 self .Ht = (self .H ).transpose ()
2428 self .alpha = alpha
25- self .SqrtB = sp .linalg .sqrtm (self .B )
26- self .obs_data = obs_data
29+ self .SqrtB = []
2730 self .state_vector = state_vector
31+ self .obs_data = obs_data
2832
2933 def __str__ (self ):
3034 print ('xdim = ' , self .xdim )
@@ -33,10 +37,20 @@ def __str__(self):
3337 print ('t0 = ' , self .t0 )
3438 print ('dt = ' , self .dt )
3539 print ('t = ' , self .t )
40+ print ('acyc_step = ' , self .acyc_step )
41+ print ('dtau = ' , self .dtau )
42+ print ('fcst_step = ' , self .fcst_step )
43+ print ('fcst_dt = ' , self .fcst_dt )
3644 print ('B = ' )
3745 print (self .B )
3846 print ('R = ' )
3947 print (self .R )
48+ print ('H = ' )
49+ print (self .H )
50+ print ('state_vector = ' )
51+ print (self .state_vector )
52+ print ('obs_data = ' )
53+ print (obs_data )
4054 return 'type::da_system'
4155
4256 def setMethod (self ,method ):
@@ -113,42 +127,56 @@ def reduceYdim(self,yp):
113127 self .setR (self .R [yp ,yp ])
114128
115129 def compute_analysis (self ,xb ,yo ,params = [0 ]):
130+ # (params needed for 4D-Var)
116131 method = self .method
117132 if method == 'skip' :
118133 xa = xb
134+ KH = np .identity (self .xdim )
119135 elif method == 'nudging' :
120- xa = self .nudging (xb ,yo )
136+ xa , KH = self .nudging (xb ,yo )
121137 elif method == 'OI' :
122- xa = self .OI (xb ,yo )
138+ xa , KH = self .OI (xb ,yo )
123139 elif method == '3DVar' or method == '3D-Var' :
124- xa = self ._3DVar (xb ,yo )
140+ xa , KH = self ._3DVar (xb ,yo )
125141 elif method == 'ETKF' or method == 'EnKF' :
126- xa = self .ETKF (xb ,yo )
142+ xa , KH = self .ETKF (xb ,yo )
127143 elif method == 'PF' :
128- xa = self .PF (xb ,yo )
144+ xa , KH = self .PF (xb ,yo )
129145 elif method == 'Hybrid' :
130- xa = self .HybridGain (xb ,yo )
146+ xa , KH = self .HybridGain (xb ,yo )
131147# elif method == '4DVar' or method == '4D-Var':
132- # xa = self._4DVar(xb,yo)
148+ # xa,KH = self._4DVar(xb,yo)
133149# elif method == '4DEnVar':
134- # xa = self._4DEnVar(xb,yo)
150+ # xa,KH = self._4DEnVar(xb,yo)
135151# elif method == '4DETKF':
136- # xa = self._4DETKF(xb,yo)
152+ # xa,KH = self._4DETKF(xb,yo)
137153 else :
138154 print ('compute_analysis:: Unrecognized DA method.' )
139155 raise SystemExit
140- return xa
156+ return xa , KH
141157
142158 def initEns (self ,x0 ,mu = 0 ,sigma = 0.1 ,edim = 4 ):
143159 xdim = len (x0 )
144160 x0 = np .matrix (x0 ).flatten ().T
145- xrand = np .random .normal (mu ,sigma ,(xdim ,edim ))
161+ mu = np .matrix (mu ).flatten ().T
162+ Xrand = np .random .normal (0 ,sigma ,(xdim ,edim ))
163+ Xrand = np .matrix (Xrand )
164+ # print('Xrand = ')
165+ # print(Xrand)
166+ # Remove mean to make sure it is properly centered at 0
167+ # (add bias if included)
168+ rand_mean = np .mean (Xrand ,axis = 1 ) + mu
169+ # print('rand_mean = ')
170+ # print(rand_mean)
171+ rmat = np .matlib .repmat (rand_mean ,1 ,edim )
172+ Xrand = Xrand - rmat
146173# print('xrand = ')
147174# print(xrand)
175+ # add perturbations to x0
148176 rmat = np .matlib .repmat (x0 , 1 , edim )
149177# print('rmat = ')
150178# print(rmat)
151- X0 = np .matrix (rmat + xrand )
179+ X0 = np .matrix (rmat + Xrand )
152180 return X0
153181
154182# def init4D(self):
0 commit comments