Skip to content

Commit b5d0fb4

Browse files
author
Abhinab Bhattacharjee
committed
some changes
1 parent cb59845 commit b5d0fb4

File tree

3 files changed

+86
-83
lines changed

3 files changed

+86
-83
lines changed

src/+datools/+examples/+sandu/l63_experiments.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
% Use this to run Lorenz 63 experiments
55

66
% uncomment the filter you want to run
7-
filtername = 'EnKF';
7+
%filtername = 'EnKF';
88
%filtername = 'ETKF';
99
%filtername = 'ETPF';
1010
%filtername = 'SIR';
11-
%filtername = 'RHF';
11+
filtername = 'RHF';
1212

1313
% oservation variance
1414
variance = 1;

src/+datools/+examples/+sandu/l96_experiments.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
variance = 1;
1818

1919
% create an aray of ensemble
20-
ensNs = [50, 75, 100];
20+
ensNs = [50, 75, 100, 200];
2121

2222
% create an array of inflation
2323
infs = [1.02, 1.05, 1.10];

src/+datools/+examples/l96_hybrid.m

Lines changed: 83 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
21
clear;
32
close all;
43
figure;
54
drawnow;
65

7-
Deltat = 0.11;
6+
Deltat = 0.11;
87

98
solvermodel = @(f, t, y) datools.utils.rk4(f, t, y, 22);
109
solvernature = @(f, t, y) datools.utils.rk4(f, t, y, 22);
@@ -16,11 +15,11 @@
1615
modelODE = otp.lorenz96.presets.Canonical;
1716
modelODE.TimeSpan = [0, Deltat];
1817

19-
[tt, yy] = ode45(natureODE.Rhs.F, [0 10], nature0);
20-
nature0 = yy(end, :).';
18+
[tt, yy] = ode45(natureODE.Rhs.F, [0, 10], nature0);
19+
nature0 = yy(end, :).';
2120
natureODE.Y0 = nature0;
2221

23-
model = datools.Model('Solver', solvermodel, 'ODEModel', modelODE);
22+
model = datools.Model('Solver', solvermodel, 'ODEModel', modelODE);
2423
nature = datools.Model('Solver', solvernature, 'ODEModel', natureODE);
2524

2625
naturetomodel = datools.observation.Linear(numel(nature0), 'H', speye(natureODE.NumVars));
@@ -29,7 +28,7 @@
2928

3029
nobsvars = numel(observeindicies);
3130

32-
R = (8/1)*speye(nobsvars);
31+
R = (8 / 1) * speye(nobsvars);
3332

3433
obserrormodel = datools.error.Gaussian('CovarianceSqrt', sqrtm(R));
3534
%obserrormodel = datools.error.Tent;
@@ -46,67 +45,66 @@
4645
ensNs = 20:5:30;
4746
alphass = 0.0:0.1:0.5;
4847

49-
rmses = inf*ones(numel(ensNs), numel(alphass));
48+
rmses = inf * ones(numel(ensNs), numel(alphass));
5049

5150
maxallowerr = 16;
5251

5352
mm = min(rmses(:));
5453

55-
if mm >= maxallowerr
54+
if mm >= maxallowerr
5655
mm = 0;
5756
end
5857

5958
runsleft = find(rmses == inf);
6059

6160
for runn = runsleft.'
6261
[ensNi, infi] = ind2sub([numel(ensNs), numel(alphass)], runn);
63-
62+
6463
fprintf('N: %d, inf: %.3f\n', ensNs(ensNi), alphass(infi));
65-
64+
6665
ns = 1;
6766
sE = zeros(ns, 1);
68-
67+
6968
alphassAll = alphass(infi);
7069
ensN = ensNs(ensNi);
71-
70+
7271
for sample = 1:ns
7372
% Set rng for standard experiments
74-
rng(17 + sample - 1);
75-
73+
rng(17+sample-1);
74+
7675
inflation = 1;
77-
76+
7877
% No localization
7978
%localization = [];
80-
79+
8180
%localization= @(t, y, H) datools.tapering.gc(t, y, r, d, H);
8281
r = 3;
8382
d = @(t, y, i, j) modelODE.DistanceFunction(t, y, i, j);
8483
localization = @(t, y, Hi, k) datools.tapering.gcCTilde(t, y, Hi, r, d, k);
8584
%localization = @(t, y, Hi, k) datools.tapering.cutoffCTilde(t, y, r, d, Hi, k);
86-
85+
8786
% required for LETPF
88-
localizationEnsembleDistance = @(~, ~, inds, k) spdiags([zeros(k - 1, 1); 1; zeros(numel(inds) - k + 1, 1)], 0, numel(inds), numel(inds));
89-
87+
localizationEnsembleDistance = @(~, ~, inds, k) spdiags([zeros(k-1, 1); 1; zeros(numel(inds)-k+1, 1)], 0, numel(inds), numel(inds));
88+
9089
fnum = 1;
91-
90+
9291
filters = cell(fnum, 1);
9392
%alphas = ones(fnum*2, 1)/(2*fnum);
94-
alphas = ones(fnum, 1)/(fnum);
95-
93+
alphas = ones(fnum, 1) / (fnum);
94+
9695
for i = 1:fnum
97-
96+
9897
letkf = datools.statistical.ensemble.LETKF(model, ...
9998
'Observation', observation, ...
10099
'NumEnsemble', ensN, ...
101100
'ModelError', modelerror, ...
102101
'EnsembleGenerator', ensembleGenerator, ...
103-
'Inflation', inflation^(1/fnum), ...
102+
'Inflation', inflation^(1 / fnum), ...
104103
'Localization', localization, ...
105104
'Rejuvenation', 0, ...
106105
'Parallel', false);
107-
108-
109-
106+
107+
110108
letpf = datools.statistical.ensemble.LETPF2(model, ...
111109
'Observation', observation, ...
112110
'NumEnsemble', ensN, ...
@@ -118,16 +116,16 @@
118116
'Rejuvenation', 0, ...
119117
'Parallel', false);
120118

121-
filters{2*i - 1} = letpf;
122-
filters{2*i} = letkf;
123-
alphas(2*i - 1) = alphassAll;
124-
alphas(2*i) = 1 - alphassAll;
125-
119+
filters{2*i-1} = letpf;
120+
filters{2*i} = letkf;
121+
alphas(2*i-1) = alphassAll;
122+
alphas(2*i) = 1 - alphassAll;
123+
126124
end
127-
128-
alphas = alphas/sum(alphas);
129-
130-
125+
126+
alphas = alphas / sum(alphas);
127+
128+
131129
hybrid = datools.statistical.ensemble.Hybrid(model, ...
132130
'Observation', observation, ...
133131
'NumEnsemble', ensN, ...
@@ -137,115 +135,120 @@
137135
'Localization', localization, ...
138136
'Filters', filters, ...
139137
'Alphas', alphas, ...
140-
'Rejuvenation', (0.2^2), ...
138+
'Rejuvenation', (0.2^2), ...
141139
'Parallel', false);
142-
143-
144-
140+
141+
145142
natureODE.Y0 = nature0;
146143
nature = datools.Model('Solver', solvernature, 'ODEModel', natureODE);
147144

148-
145+
149146
hybrid.setMean(natureODE.Y0);
150147
hybrid.scaleAnomalies(1/10);
151-
148+
152149
spinup = 200;
153-
times = 11*spinup;
154-
150+
times = 11 * spinup;
151+
155152
mses = zeros(times - spinup, 1);
156-
153+
157154
rmse = nan;
158-
155+
159156
ps = '';
160-
157+
161158
do_enkf = true;
162-
159+
163160
for i = 1:times
164161
% forecast
165-
162+
166163
nature.evolve();
167-
164+
168165
if do_enkf
169166
hybrid.forecast();
170167
end
171-
172-
168+
169+
173170
% observe
174171
xt = naturetomodel.observeWithoutError(nature.TimeSpan(1), nature.State);
175172
y = hybrid.Observation.observeWithError(model.TimeSpan(1), xt);
176-
173+
177174
% analysis
178-
175+
179176
% try
180177
if do_enkf
181178
hybrid.analysis(R, y);
182179
end
183180
%catch
184181
% do_enkf = false;
185182
%end
186-
183+
187184
xa = hybrid.BestEstimate;
188-
185+
189186
err = xt - xa;
190-
187+
191188
if i > spinup
192-
189+
193190
mses(i - spinup) = mean((xa - xt).^2);
194191
rmse = sqrt(mean(mses(1:(i - spinup))));
195-
196-
if rmse > maxallowerr || isnan(rmse) || mses(i - spinup) > 200*maxallowerr
192+
193+
if rmse > maxallowerr || isnan(rmse) || mses(i - spinup) > 200 * maxallowerr
197194
do_enkf = false;
198195
end
199-
196+
200197
if mod(i, 10) == 0
201198
fprintf('step %d %.5f\n', i, rmse);
202199
end
203-
200+
204201
else
205-
202+
206203
fprintf('%d|', i)
207204
if mod(i, 10) == 0
208205
fprintf('\n');
209206
end
210-
207+
211208
end
212-
213-
209+
210+
214211
if ~do_enkf
215212
break;
216213
end
217-
214+
218215
end
219-
216+
220217
if isnan(rmse)
221218
rmse = 1000;
222219
end
223-
220+
224221
if ~do_enkf
225222
sE(sample) = 1000;
226223
else
227224
sE(sample) = rmse;
228225
end
229-
226+
230227
end
231-
228+
232229
resE = mean(sE);
233-
230+
234231
if isnan(resE)
235232
resE = 1000;
236233
end
237-
234+
238235
rmses(ensNi, infi) = resE;
239-
236+
240237
mm = min(rmses(:));
241-
242-
if mm >= maxallowerr
238+
239+
if mm >= maxallowerr
243240
mm = 0;
244241
end
245-
246-
imagesc(ensNs, alphass, rmses.'); caxis([1, 2.5]); colorbar; set(gca,'YDir','normal');
247-
axis square; title('EnKF'); colormap('pink');
248-
xlabel('Ensemble Size'); ylabel('\alpha');
242+
243+
imagesc(ensNs, alphass, rmses.');
244+
caxis([1, 2.5]);
245+
colorbar;
246+
set(gca, 'YDir', 'normal');
247+
axis square;
248+
title('EnKF');
249+
colormap('pink');
250+
xlabel('Ensemble Size');
251+
ylabel('\alpha');
249252
drawnow;
250253
end
251254

0 commit comments

Comments
 (0)