4 %
function generating the reduced basis functions.
6 % Required fields of model:
7 % RB_generation_mode: there are two options: PCA_trajectories and
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
19 detailed_data = model_data;
21 dir = model.dirichlet_side;
22 no_dir = mod(dir,2)+1;
24 [RB_0,RB_G] = model.get_rb_from_detailed_data(detailed_data);
27 switch model.RB_generation_mode
29 case 'PCA_trajectories'
31 % generate parameter sample
32 mu_params.numintervals = model.RB_numintervals;
33 mu_params.range = model.mu_ranges;
36 mu_sample =
get(mu_mesh,
'vertex');
40 for m = 1:size(mu_sample,1)
42 model = set_mu(model,mu_sample(m,:));
43 sim_data = detailed_simulation(model,detailed_data);
46 if sim_data.reached_maxiter
47 warning('detailed simulation may have diverged!');
49 % dof matrizes depend on model.sequence_mode
50 U = model.get_dofs_from_sim_data(model,sim_data);
60 [RB_0, RB_G] = model.orthonormalize(model, detailed_data, X, model.RB_generation_epsilon);
62 detailed_data = model.set_rb_in_detailed_data(detailed_data, RB_0, RB_G);
67 % check
if former greedy steps are available
68 if ~isfield(detailed_data,
'RB_info')
69 detailed_data.RB_info = [];
71 bases_sizes.N0 = cell(1,2);
72 bases_sizes.NG = cell(1,2);
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;
83 detailed_data.RB_info.stopped_on_tolerance = 0;
84 detailed_data.RB_info.stopped_on_empty_extension = 0;
86 % generate training parameter sample
87 par.numintervals = model.RB_numintervals;
88 par.range = model.base_model.mu_ranges;
91 detailed_data.RB_info.M_train = get(par_mesh,'vertex');
93 % step 0: initialize basis
94 [N0,NG] = model.get_rb_size(detailed_data);
99 switch model.RB_init_mode
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)
');
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;
112 case 'eigenbasis
' % eigenbasis on interface plus random empirical mode
114 model = set_mu(model,rand_uniform(1,model.mu_ranges)');
116 [RBext_0,RBext_G] = model.RB_extension_PCA_fixspace(...
117 model,detailed_data);
119 if (NG{1} < model.N_eigenbasis || NG{2} < model.N_eigenbasis)
120 RBext_G = model.RB_extension_eigenbasis(model,detailed_data);
122 RBext_G{i} = RBext_G{i}(:,1:(model.N_eigenbasis - NG{i}));
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');
141 % save detailed simulations of the base_model
for all
142 % parameters,
if needed
143 if (requireBaseSimData)
145 detailed_data.base_model_data, ...
146 detailed_data.RB_info.M_train
', ...
148 .detailed_train_savepath);
151 % inner product matrices for the computation of the projection
153 if (requireProjection1)
154 K = model.get_inner_product_matrices(detailed_data);
156 if (requireProjection2)
157 K = model.base_model.get_inner_product_matrix( ...
158 detailed_data.base_model_data);
165 while (continue_loop)
168 N_remain = model.N_max{1};
170 N_remain = min([N_remain, model.N_max{i} - N0{i} - NG{i}]);
173 N_extend = min([N_remain, size(RBext_G{i},2)]);
175 RB_G{i} = [RB_G{i}, RBext_G{i}(:, 1:N_extend)];
177 N_extend = min([model.N_max{i} - N0{i} - NG{i} - N_extend, ...
178 size(RBext_0{i},2)]);
180 RB_0{i} = [RB_0{i}, RBext_0{i}(:, 1:N_extend)];
184 detailed_data = model.set_rb_in_detailed_data(detailed_data, ...
188 [N0,NG] = model.get_rb_size(detailed_data);
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}]))
194 detailed_data.RB_info.stopped_on_empty_extension = 1;
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}),')
']);
207 % save new basis sizes
209 bases_sizes.N0{i} = [bases_sizes.N0{i}; N0{i}];
210 bases_sizes.NG{i} = [bases_sizes.NG{i}; NG{i}];
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);
220 if (requireReducedData)
221 % generate required data for the reduced simulations
222 reduced_data = gen_reduced_data(model,detailed_data);
225 if (requireProjection1)
228 XN{i} = orthonormalize([RB_0{i},RB_G{i}],K{i},[],'qr
');
232 if (requireProjection2)
233 XN = zeros(detailed_data.base_model_data.df_info.ndofs,N0{1}+ ...
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};
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};
244 XN = orthonormalize(XN,K,[],'qr
');
248 % testing on maximal error
249 fprintf('testing on maximal error
');
251 for m = 1:size(detailed_data.RB_info.M_train,1)
254 model = set_mu(model,detailed_data.RB_info.M_train(m,:));
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, ...
263 switch (model.RB_error_indicator)
265 case 'projection_error1
'
267 errs(m) = dom_dec_compute_projection_error(...
268 detailed_data,XN,K,rb_sim_data.base_sim_data);
270 case 'projection_error2
'
272 errs(m) = dom_dec_compute_projection_error(...
273 detailed_data,XN,K,rb_sim_data.base_sim_data);
275 case 'rb_error_estimate
'
277 rb_sim_data = rb_simulation(model,reduced_data);
278 if rb_sim_data.reached_maxiter
279 warning(['reached maximal iterations in reduced
', ...
282 errs(m) = rb_sim_data.Delta(end);
283 thetas(m) = rb_sim_data.RB_thetaN;
287 rb_sim_data = rb_simulation(model,reduced_data);
288 if rb_sim_data.reached_maxiter
289 warning(['reached maximal iterations in reduced
', ...
294 rb_sim_data = rb_reconstruction(model,detailed_data, ...
296 rb_sim_data = model.compute_error(model,detailed_data, ...
299 errs(m) = rb_sim_data.X_err(end);
300 thetas(m) = rb_sim_data.RB_thetaN;
304 if mod(m,ceil(size(detailed_data.RB_info.M_train,1)/45)) == 1
311 % print/save new information
313 [max_err, err_ind] = max(errs);
314 [min_theta, ~] = min(thetas);
315 mu_max_err = detailed_data.RB_info.M_train(err_ind,:);
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))]);
324 disp([' minimal theta:
',num2str(min_theta)]);
326 max_errs = [max_errs; max_err];
327 min_thetas = [min_thetas; min_theta];
328 max_err_mus = [max_err_mus; mu_max_err];
332 if max_err < model.RB_greedy_tolerance
334 detailed_data.RB_info.stopped_on_tolerance = 1;
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, ...
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
'];
355 detailed_data.RB_info.extension_method = ...
356 [model.RB_extension_method, '-NSEQ
'];
A hierarchical cubegrid of arbitrary dimension.
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.