rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
weak_strong_POD_Greedy_comp.m
Go to the documentation of this file.
1 function res = weak_strong_POD_Greedy_comp(step)
2 % script comparing weak and strong POD-Greedy on lin_evol default
3 % example
4 %
5 % expected result:
6 % * strong POD-Greedy: longer runtime, better quality than
7 % weak-POD-Greedy for same training set
8 % * weak-POD-Greedy on larger train set:
9 % faster than coarser strong POD-Greedy
10 % better tes quality than coarser strong POD-Greedy
11 
12 % B. Haasdonk 1.10.2012
13 
14 model = convdiff_model;
15 
16 if nargin<1
17  step = 1;
18 end;
19 
20 strong_PODGreedy_fn = 'strong_PODGreedy_fn.mat';
21 weak_coarse_PODGreedy_fn = 'weak_coarse_PODGreedy_fn.mat';
22 weak_fine_PODGreedy_fn = 'weak_fine_PODGreedy_fn.mat';
23 weak_finer_PODGreedy_fn = 'weak_finer_PODGreedy_fn.mat';
24 
25 coarse_Nmax = 85;
26 fine_Nmax = 100;
27 finer_Nmax = 100;
28 
29 switch step
30  case 1 % basis generation by strong POD-Greedy
31 
32  disp('--------------------------------------')
33  disp('performing strong POD-Greedy procedure');
34  model.RB_numintervals = [2,2,2];
35  % compute 150 basis vectors
36  model.RB_stop_Nmax = coarse_Nmax;
37  model.RB_stop_epsilon = 0;
38  model.RB_error_indicator = 'projection-error';
39  model.RB_detailed_train_savepath = ...
40  fullfile('PODgreedy_exp_train');
41  % delete if existing
42  if exist(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath))
43  disp('deleting old training data for correct timing measurement');
44  delete(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath,'*.*'));
45  rmdir(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath));
46  end;
47 
48  model_data = gen_model_data(model);
49  tic;
50  detailed_data = filecache_function(@gen_detailed_data,model,model_data);
51 % detailed_data.RB_info.computation_time
52  t = toc;
53  disp(['basis_generation time: ',num2str(t),' sec.']);
54  detailed_data.RB_info.basis_generation_time = t;
55  save(strong_PODGreedy_fn,'model','detailed_data');
56 
57  case 2 % basis generation by weak coarse and weak fine POD-Greedy
58 
59  % using beta = const, gamma = const
60 
61  disp('-------------------------------------------')
62  disp('performing weak coarse POD-Greedy procedure');
63  % compute 125 trajectories
64  model.RB_numintervals = [2,2,2];
65  % compute 150 basis vectors
66  model.RB_stop_Nmax = fine_Nmax;
67  model.RB_stop_epsilon = 0;
68  model.RB_error_indicator = 'estimator';
69  model.error_norm = 'l2l2';
70  model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
71  disp('warning: inf-sup-constant set to 1, unrealistic! ');
72 
73  model_data = gen_model_data(model);
74  tic;
75  detailed_data = filecache_function(@gen_detailed_data,model,model_data);
76 % detailed_data.RB_info.computation_time
77  t = toc;
78  disp(['basis_generation time: ',num2str(t),' sec.']);
79  detailed_data.RB_info.basis_generation_time = t;
80  save(weak_coarse_PODGreedy_fn,'model','detailed_data');
81 
82  % fine set:
83  disp('-------------------------------------------')
84  disp('performing weak fine POD-Greedy procedure');
85  detailed_data = [];
86  model.RB_numintervals = [4,4,4];
87  tic;
88  detailed_data = gen_detailed_data(model,model_data);
89 % detailed_data.RB_info.computation_time
90  t = toc;
91  disp(['basis_generation time: ',num2str(t),' sec.']);
92  detailed_data.RB_info.basis_generation_time = t;
93  save(weak_fine_PODGreedy_fn,'model','detailed_data');
94 
95  case 2.1
96 
97  % using beta = const, gamma = const
98 
99  disp('-------------------------------------------')
100  disp('performing weak finer POD-Greedy procedure');
101  % compute 9^3 trajectories
102  model.RB_numintervals = [6,6,6];
103  model.RB_stop_Nmax = finer_Nmax;
104  model.RB_stop_epsilon = 0;
105  model.RB_error_indicator = 'estimator';
106  model.error_norm = 'l2l2';
107  model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
108  disp('warning: inf-sup-constant set to 1, unrealistic! ');
109 
110  model_data = gen_model_data(model);
111  tic;
112  detailed_data = gen_detailed_data(model,model_data);
113 % detailed_data.RB_info.computation_time
114  t = toc;
115  disp(['basis_generation time: ',num2str(t),' sec.']);
116  detailed_data.RB_info.basis_generation_time = t;
117  save(weak_finer_PODGreedy_fn,'model','detailed_data');
118 
119  case 3 % compare offline runtimes
120 
121  disp('--------------------------------------')
122  disp('comparing runtimes');
123  tmp = load(strong_PODGreedy_fn);
124  tstrong = tmp.detailed_data.RB_info.basis_generation_time
125  tmp = load(weak_coarse_PODGreedy_fn);
126  tweakcoarse = tmp.detailed_data.RB_info.basis_generation_time
127  tmp = load(weak_fine_PODGreedy_fn);
128  tweakfine = tmp.detailed_data.RB_info.basis_generation_time
129  tmp = load(weak_finer_PODGreedy_fn);
130  tweakfiner = tmp.detailed_data.RB_info.basis_generation_time
131 
132  case 4 % determine relative RB-test-error decay: 50 random points
133 
134  % 50 random trajectories
135  Ntest = 50;
136 
137  RandStream.setDefaultStream(RandStream('mt19937ar','seed',100000));
138  Mtest = rand_uniform(Ntest,model.mu_ranges);
139  test_savepath = 'PODGreedy_test';
140 
141  fns = {strong_PODGreedy_fn,weak_coarse_PODGreedy_fn,...
142  weak_fine_PODGreedy_fn, weak_finer_PODGreedy_fn};
143  Nmax = [coarse_Nmax,coarse_Nmax,fine_Nmax,finer_Nmax];
144 
145  model_data = gen_model_data(model);
146 
147  test_errs = cell(1,length(fns));
148  Nss = cell(1,length(fns));
149  for s = 1:length(fns)
150  Nss{s} = 5:5:Nmax(s);
151  Nss{s} = [1,Nss{s}];
152  tmp = load(fns{s});
153  Nrb = size(tmp.detailed_data.RB,2);
154  if Nss{s}(end)~=Nrb
155  Nss{s} = [Nss{s}, Nrb];
156  end;
157  test_errs{s} = ...
158  filecache_function(@compute_test_errs,fns{s},Nss{s},Mtest,test_savepath);
159  end;
160  save('PODGreedy_test_step4');
161 
162  case 4.5
163 
164  linestyles = {'b','r','r','r'};
165  load('PODGreedy_test_step4');
166 
167  % plot results
168 % for s = 1:length(fns);
169  for s = 3;
170  plot(Nss{s},test_errs{s},linestyles{s});
171  hold on;
172  end;
173 % legend({'strong POD-Greedy, coarse','weak POD-Greedy, coarse',...
174 % 'weak POD-Greedy, fine', 'weak POD-Greedy, finer'});
175  legend({'weak POD-Greedy'});
176  axis tight;
177 
178  set(gca,'Yscale','log');
179  disp('please adjust plot');
180  title('maximum relative test rb-error','Fontsize',15);
181  xlabel('dimension N','Fontsize',15);
182  ylabel('rb-error','Fontsize',15);
183  c = get(gca,'children');
184  set(c(:),'Linewidth',2)
185  set(gca,'Fontsize',15)
186  save('PODGreedy_test')
187  saveas(gcf,'PODGreedy_relative_test_rb_error.png')
188  keyboard;
189 
190  figure;
191  load(fns{3});
192  plot_detailed_data(model,detailed_data);
193 
194  plot_params.no_lines = 1;
195  plot_params.show_colorbar = 0;
196  plot_params.axis_equal = 1;
197  for i=97:100
198  model.plot(detailed_data.grid,detailed_data.RB(:,i),plot_params);
199  axis off
200  saveas(gcf,['basis_func',num2str(i),'.png']);
201  pause;
202  end;
203 
204 
205  case 5 % determine relative projection-test-error decay: 50 random points
206 
207  Ntest = 50;
208  model_data = gen_model_data(model);
209 
210  RandStream.setDefaultStream(RandStream('mt19937ar','seed',100000));
211  Mtest = rand_uniform(Ntest,model.mu_ranges);
212  test_savepath = 'PODGreedy_test';
213 
214 % fns = {strong_PODGreedy_fn,weak_coarse_PODGreedy_fn,...
215 % weak_fine_PODGreedy_fn, weak_finer_PODGreedy_fn};
216 % Nmax = [coarse_Nmax,coarse_Nmax,fine_Nmax,finer_Nmax];
217  fns = {weak_fine_PODGreedy_fn};
218  Nmax = [fine_Nmax];
219  linestyles = {'r'};
220 
221  test_errs = cell(1,length(fns));
222  Nss = cell(1,length(fns));
223  for s = 1:length(fns)
224  Nss{s} = 5:5:Nmax(s);
225  Nss{s} = [1,Nss{s}];
226  tmp = load(fns{s});
227  Nrb = size(tmp.detailed_data.RB,2);
228  if Nss{s}(end)~=Nrb
229  Nss{s} = [Nss{s}, Nrb];
230  end;
231  test_errs{s} = ...
232  filecache_function(@compute_test_projection_errs,...
233  model,model_data,fns{s},Nss{s},Mtest);
234  end;
235  save('PODGreedy_test_step5');
236 
237  case 5.5
238 
239  load('PODGreedy_test_step5');
240  % plot results
241  for s = 1:length(fns);
242  plot(Nss{s},test_errs{s},linestyles{s});
243  hold on;
244  end;
245  % legend({'strong POD-Greedy, coarse','weak POD-Greedy, coarse',...
246  % 'weak POD-Greedy, fine', 'weak POD-Greedy, finer'});
247  legend({'weak POD-Greedy'});
248  set(gca,'Yscale','log');
249  c = get(gca,'children');
250  set(c(:),'Linewidth',2)
251  set(gca,'Fontsize',15)
252  title('maximum relative test projection error ','Fontsize',15);
253  xlabel('dimension N','Fontsize',15);
254  ylabel('projection error','Fontsize',15);
255  disp('please adjust plot');
256  save('PODGreedy_projection_test')
257  saveas(gcf,'PODGreedy_relative_test_projection_error.png')
258  keyboard;
259 
260  %case 6 % determine train-error decay: only reasonable if identical
261  % % train set
262 
263  % Ns = 5:5:150;
264  % Ns = [1,Ns];
265 
266  otherwise
267  error('step unknown')
268 end;
269 
270 function errs = compute_test_errs(fn,Ns,Mtest,test_savepath)
271 tmp = load(fn);
272 model = tmp.model;
273 model.relative_error = 1;
274 model.error_norm = 'l2l2';
275 model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
276 detailed_data = tmp.detailed_data;
277 reduced_data = gen_reduced_data(model,detailed_data);
278 errs = zeros(1,length(Ns));
279 for Ni = 1:length(Ns)
280  tmp_model = model;
281  tmp_model.N = Ns(Ni);
282  tmp_reduced_data = model.reduced_data_subset(tmp_model,reduced_data);
283  test_errs = rb_test_error(model,detailed_data,...
284  tmp_reduced_data,Mtest,test_savepath);
285  errs(Ni) = max(test_errs);
286 end;
287 
288 
289 function errs = compute_test_projection_errs(model,model_data,fn,Ns,Mtest);
290 tmp = load(fn);
291 detailed_data = tmp.detailed_data;
292 
293 %model.relative_error = 1;
294 %model.error_norm = 'l2l2';
295 %model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
296 %detailed_data = tmp.detailed_data;
297 %reduced_data = gen_reduced_data(model,detailed_data);
298 errs = zeros(1,length(Ns));
299 for i = 1:length(Mtest);
300  model = set_mu(model,Mtest(:,i));
301  sim_data = filecache_function(@detailed_simulation,model, ...
302  model_data);
303  test_errs = zeros(length(Ns),length(Mtest));
304  for Ni = 1:length(Ns)
305  proj_sol = detailed_data.RB(:,1:Ns(Ni))*...
306  (detailed_data.RB(:,1:Ns(Ni))' * detailed_data.W) * sim_data.U;
307  er = fv_l2l2_error(sim_data.U,proj_sol, ...
308  detailed_data.W,model);
309  test_errs(Ni,i) = er(end);
310  end;
311 end;
312 errs = max(test_errs,[],2);
313 
314 
function varargout = filecache_function(funcptr, varargin)
function used for file-caching other function calls.
function model = convdiff_model(dummy)
function creating a simple model for a linear convection diffusion problem
function res = weak_strong_POD_Greedy_comp(step)
script comparing weak and strong POD-Greedy on lin_evol default example
Customizable implementation of an abstract greedy algorithm.
Definition: DuneRBLeafNode.m:1