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