rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
dom_dec_gen_detailed_data.m
Go to the documentation of this file.
1 function detailed_data = dom_dec_gen_detailed_data(model, ...
2  model_data)
3 % function detailed_data = dom_dec_gen_detailed_data(model,model_data)
4 % function generating the reduced basis functions.
5 %
6 % Required fields of model:
7 % RB_generation_mode: there are two options: PCA_trajectories and
8 % POD_greedy
9 %
10 % Generated fields of detailed_data:
11 % RB: cell of the reduced basis on the subdomains
12 % I_0: cell of indizes into detailed_data.RB
13 % I_G: cell of indizes into detailed_data.RB
14 % RB_info: information about the generation process, depends on
15 % generation mode
16 
17 % I.Maier, 19.07.2011
18 
19 detailed_data = model_data;
20 
21 dir = model.dirichlet_side;
22 no_dir = mod(dir,2)+1;
23 
24 [RB_0,RB_G] = model.get_rb_from_detailed_data(detailed_data);
25 
26 
27 switch model.RB_generation_mode
28 
29  case 'PCA_trajectories'
30 
31  % generate parameter sample
32  mu_params.numintervals = model.RB_numintervals;
33  mu_params.range = model.mu_ranges;
34 
35  mu_mesh = cubegrid(mu_params);
36  mu_sample = get(mu_mesh,'vertex');
37 
38  X = cell(1, 2);
39 
40  for m = 1:size(mu_sample,1)
41 
42  model = set_mu(model,mu_sample(m,:));
43  sim_data = detailed_simulation(model,detailed_data);
44  fprintf('.');
45 
46  if sim_data.reached_maxiter
47  warning('detailed simulation may have diverged!');
48  end;
49  % dof matrizes depend on model.sequence_mode
50  U = model.get_dofs_from_sim_data(model,sim_data);
51 
52  for i = 1:2
53  X{i} = [X{i}, U{i}];
54  end
55 
56  end;
57 
58  fprintf('\n');
59 
60  [RB_0, RB_G] = model.orthonormalize(model, detailed_data, X, model.RB_generation_epsilon);
61 
62  detailed_data = model.set_rb_in_detailed_data(detailed_data, RB_0, RB_G);
63 
64 
65  case 'POD_greedy'
66 
67  % check if former greedy steps are available
68  if ~isfield(detailed_data,'RB_info')
69  detailed_data.RB_info = [];
70  step = 0;
71  bases_sizes.N0 = cell(1,2);
72  bases_sizes.NG = cell(1,2);
73  max_errs = [];
74  min_thetas = [];
75  max_err_mus = [];
76  else
77  step = detailed_data.RB_info.steps;
78  bases_sizes = detailed_data.RB_info.bases_sizes;
79  max_errs = detailed_data.RB_info.max_errs;
80  min_thetas = detailed_data.RB_info.min_thetas;
81  max_err_mus = detailed_data.RB_info.max_err_mus;
82  end;
83  detailed_data.RB_info.stopped_on_tolerance = 0;
84  detailed_data.RB_info.stopped_on_empty_extension = 0;
85 
86  % generate training parameter sample
87  par.numintervals = model.RB_numintervals;
88  par.range = model.base_model.mu_ranges;
89 
90  par_mesh = cubegrid(par);
91  detailed_data.RB_info.M_train = get(par_mesh,'vertex');
92 
93  % step 0: initialize basis
94  [N0,NG] = model.get_rb_size(detailed_data);
95 
96  RBext_0 = cell(1,2);
97  RBext_G = cell(1,2);
98 
99  switch model.RB_init_mode
100 
101  case 'random' % random empirical mode
102  if ~all([N0{dir},NG{1},NG{2}])
103  model = set_mu(model,rand_uniform(1,model.mu_ranges)');
104 
105  old_ext_method = model.RB_extension_method;
106  model.RB_extension_method = 'A';
107  [RBext_0,RBext_G] = model.RB_extension_PCA_fixspace(...
108  model,detailed_data);
109  model.RB_extension_method = old_ext_method;
110  end;
111 
112  case 'eigenbasis' % eigenbasis on interface plus random empirical mode
113  if (~N0{dir})
114  model = set_mu(model,rand_uniform(1,model.mu_ranges)');
115 
116  [RBext_0,RBext_G] = model.RB_extension_PCA_fixspace(...
117  model,detailed_data);
118  end;
119  if (NG{1} < model.N_eigenbasis || NG{2} < model.N_eigenbasis)
120  RBext_G = model.RB_extension_eigenbasis(model,detailed_data);
121  for i = 1:2
122  RBext_G{i} = RBext_G{i}(:,1:(model.N_eigenbasis - NG{i}));
123  end;
124  end;
125 
126  end;
127 
128  % prepare for greedy algorithm
129  requireProjection1 = strcmp(model.RB_error_indicator, ...
130  'projection_error1');
131  requireProjection2 = strcmp(model.RB_error_indicator, ...
132  'projection_error2');
133  requireReducedData = ...
134  strcmp(model.RB_error_indicator,'rb_error_estimate') | ...
135  strcmp(model.RB_error_indicator,'rb_error');
136  requireBaseSimData = ...
137  strcmp(model.RB_error_indicator,'projection_error1') | ...
138  strcmp(model.RB_error_indicator,'projection_error2') | ...
139  strcmp(model.RB_error_indicator,'rb_error');
140 
141  % save detailed simulations of the base_model for all
142  % parameters, if needed
143  if (requireBaseSimData)
144  save_detailed_simulations(model.base_model, ...
145  detailed_data.base_model_data, ...
146  detailed_data.RB_info.M_train', ...
147  model.base_model ...
148  .detailed_train_savepath);
149  end;
150 
151  % inner product matrices for the computation of the projection
152  % errors
153  if (requireProjection1)
154  K = model.get_inner_product_matrices(detailed_data);
155  end;
156  if (requireProjection2)
157  K = model.base_model.get_inner_product_matrix( ...
158  detailed_data.base_model_data);
159  end;
160 
161 
162  % start loop
163  continue_loop = 1;
164 
165  while (continue_loop)
166 
167  % extend bases
168  N_remain = model.N_max{1};
169  for i = 1:2
170  N_remain = min([N_remain, model.N_max{i} - N0{i} - NG{i}]);
171  end;
172  for i = 1:2
173  N_extend = min([N_remain, size(RBext_G{i},2)]);
174  if (N_extend > 0)
175  RB_G{i} = [RB_G{i}, RBext_G{i}(:, 1:N_extend)];
176  end;
177  N_extend = min([model.N_max{i} - N0{i} - NG{i} - N_extend, ...
178  size(RBext_0{i},2)]);
179  if (N_extend > 0)
180  RB_0{i} = [RB_0{i}, RBext_0{i}(:, 1:N_extend)];
181  end;
182  end;
183 
184  detailed_data = model.set_rb_in_detailed_data(detailed_data, ...
185  RB_0,RB_G);
186  N0_old = N0;
187  NG_old = NG;
188  [N0,NG] = model.get_rb_size(detailed_data);
189 
190  % check if extension is empty
191  if (~any([N0{1}-N0_old{1}, N0{2}-N0_old{2}, ...
192  NG{1}-NG_old{1}, NG{2}-NG_old{2}]))
193  continue_loop = 0;
194  detailed_data.RB_info.stopped_on_empty_extension = 1;
195 
196  break;
197 
198  end;
199 
200  % print new basis sizes
201  disp('new basis sizes:');
202  disp(['(N1_0,N1_G,N2_0,N2_G) = (',num2str(N0{dir}),',', ...
203  num2str(NG{dir}),',',num2str(N0{no_dir}),',', ...
204  num2str(NG{no_dir}),')']);
205  fprintf('\n');
206 
207  % save new basis sizes
208  for i = 1:2
209  bases_sizes.N0{i} = [bases_sizes.N0{i}; N0{i}];
210  bases_sizes.NG{i} = [bases_sizes.NG{i}; NG{i}];
211  end;
212 
213  % next step
214  step = step + 1;
215 
216  % prepare error computation
217  errs = zeros(size(detailed_data.RB_info.M_train,1),1);
218  thetas = zeros(size(detailed_data.RB_info.M_train,1),1);
219 
220  if (requireReducedData)
221  % generate required data for the reduced simulations
222  reduced_data = gen_reduced_data(model,detailed_data);
223  end;
224 
225  if (requireProjection1)
226  XN = cell(1,2);
227  for i = 1:2
228  XN{i} = orthonormalize([RB_0{i},RB_G{i}],K{i},[],'qr');
229  end;
230  end;
231 
232  if (requireProjection2)
233  XN = zeros(detailed_data.base_model_data.df_info.ndofs,N0{1}+ ...
234  N0{2}+NG{1});
235 
236  % insert XN_0 functions
237  XN(detailed_data.masks{1},1:N0{1}) = RB_0{1};
238  XN(detailed_data.masks{2},N0{1}+(1:N0{2})) = RB_0{2};
239 
240  % insert XN_Gamma functions
241  XN(detailed_data.masks{1},(N0{1}+N0{2}+1):end) = RB_G{1};
242  XN(detailed_data.masks{2},(N0{1}+N0{2}+1):end) = RB_G{2};
243 
244  XN = orthonormalize(XN,K,[],'qr');
245  end;
246 
247 
248  % testing on maximal error
249  fprintf('testing on maximal error ');
250 
251  for m = 1:size(detailed_data.RB_info.M_train,1)
252 
253  rb_sim_data = [];
254  model = set_mu(model,detailed_data.RB_info.M_train(m,:));
255 
256  if (requireBaseSimData)
257  % load detailed simulation of base model
258  rb_sim_data.base_sim_data = load_detailed_simulation( ...
259  m,model.base_model.detailed_train_savepath, ...
260  model.base_model);
261  end;
262 
263  switch (model.RB_error_indicator)
264 
265  case 'projection_error1'
266 
267  errs(m) = dom_dec_compute_projection_error(...
268  detailed_data,XN,K,rb_sim_data.base_sim_data);
269 
270  case 'projection_error2'
271 
272  errs(m) = dom_dec_compute_projection_error(...
273  detailed_data,XN,K,rb_sim_data.base_sim_data);
274 
275  case 'rb_error_estimate'
276 
277  rb_sim_data = rb_simulation(model,reduced_data);
278  if rb_sim_data.reached_maxiter
279  warning(['reached maximal iterations in reduced', ...
280  ' simulation!']);
281  end;
282  errs(m) = rb_sim_data.Delta(end);
283  thetas(m) = rb_sim_data.RB_thetaN;
284 
285  case 'rb_error'
286 
287  rb_sim_data = rb_simulation(model,reduced_data);
288  if rb_sim_data.reached_maxiter
289  warning(['reached maximal iterations in reduced', ...
290  ' simulation!']);
291  end;
292 
293  % compute error
294  rb_sim_data = rb_reconstruction(model,detailed_data, ...
295  rb_sim_data);
296  rb_sim_data = model.compute_error(model,detailed_data, ...
297  rb_sim_data);
298 
299  errs(m) = rb_sim_data.X_err(end);
300  thetas(m) = rb_sim_data.RB_thetaN;
301 
302  end;
303 
304  if mod(m,ceil(size(detailed_data.RB_info.M_train,1)/45)) == 1
305  fprintf('.');
306  end;
307 
308  end;
309 
310 
311  % print/save new information
312  fprintf('\n');
313  [max_err, err_ind] = max(errs);
314  [min_theta, ~] = min(thetas);
315  mu_max_err = detailed_data.RB_info.M_train(err_ind,:);
316 
317  disp([' maximal error: ',num2str(max_err)]);
318  fprintf([' maximal error mu-vector: (', ...
319  num2str(mu_max_err(1))]);
320  for i = 2:length(model.mu_ranges)
321  fprintf([',',num2str(mu_max_err(i))]);
322  end;
323  fprintf(')\n');
324  disp([' minimal theta: ',num2str(min_theta)]);
325 
326  max_errs = [max_errs; max_err];
327  min_thetas = [min_thetas; min_theta];
328  max_err_mus = [max_err_mus; mu_max_err];
329 
330 
331  % test tolerance
332  if max_err < model.RB_greedy_tolerance
333  continue_loop = 0;
334  detailed_data.RB_info.stopped_on_tolerance = 1;
335  end;
336 
337  if continue_loop == 1
338  % compute basis extensions
339  model = set_mu(model,mu_max_err);
340  [RBext_0,RBext_G] = model.RB_extension_PCA_fixspace(model, ...
341  detailed_data);
342  end;
343 
344  end;
345 
346  detailed_data.RB_info.steps = step;
347  detailed_data.RB_info.bases_sizes = bases_sizes;
348  detailed_data.RB_info.max_errs = max_errs;
349  detailed_data.RB_info.min_thetas = min_thetas;
350  detailed_data.RB_info.max_err_mus = max_err_mus;
351  if model.RB_sequence_mode
352  detailed_data.RB_info.extension_method = ...
353  [model.RB_extension_method, '-SEQ'];
354  else
355  detailed_data.RB_info.extension_method = ...
356  [model.RB_extension_method, '-NSEQ'];
357  end;
358 
359 end;
A hierarchical cubegrid of arbitrary dimension.
Definition: cubegrid.m:17
function save_detailed_simulations(model, model_data, M, savepath)
perform loop over detailed simulations and save results or check consistency with existing saved resu...
function detailed_data = dom_dec_gen_detailed_data(model, model_data)
function generating the reduced basis functions.