2 %
function model = convdiff_dune_model(params)
3 % convection diffusion example
using dune-rb
for high dimensional computations
8 descr.name =
'laplace_dune';
9 descr.rb_problem_type =
'LinStatDune';
12 %% data that is definitely used outside of the detailed simulations
13 %% These values are now set in dunerbconvdiff(
'init_model')
15 if (~isempty(getenv('DUNERBHOME')))
16 % addpath( fullfile( getenv('DUNERBHOME'), 'mexclient' ) );
17 addpath( getenv('DUNERBHOME') );
20 descr.mexptr = @mexclient;
22 [~] = mexclient('echo', 1);
24 is_connected = descr.mexptr('is_connected');
27 error('No connection to server!');
30 % server_params.serverhost = 'rbevol.uni-muenster.de'
31 % server_params.port = '1909'
32 % mexclient('init_server', server_params)
34 % copy model data from detailed dune-rb model
35 tmp_struct = descr.mexptr('init_model');
40 descr.mu_names = tmp_struct.mu_names;
41 descr.mu_ranges = tmp_struct.mu_ranges;
42 descr.mu = descr.mexptr('get_mu');
43 descr.run_dir = tmp_struct.cwd;
45 tmp = descr.mexptr('rb_symbolic_coefficients', {
'Laplace'}, {
'RHS'});
46 fns = fieldnames(tmp);
48 for i = 1:length(fns);
49 sym_coeffs.(fns{i}) =
'@(mu) [ ';
50 for j = 1:size(tmp.(fns{i}),2);
52 sym_coeffs.(fns{i}) = [ sym_coeffs.(fns{i}),
', ' ];
54 sym_coeffs.(fns{i}) = [ sym_coeffs.(fns{i}), tmp.(fns{i}){j} ];
56 sym_coeffs.(fns{i}) = [ sym_coeffs.(fns{i}) ,
' ]' ];
59 coeff_ops = structfun(@eval, sym_coeffs,
'UniformOutput',
false);
61 descr.coeff_ops.LI = coeff_ops.Laplace;
62 descr.coeff_ops.f = coeff_ops.RHS;
63 descr.L_I_inv_norm_bound = @(mu) 1/mu(1);
65 descr.filecache_ignore_fields_in_model = {
'coeff_ops',
'mu'};
68 descr.mu_list = {[5 0.5], [1 0.5], [1 0]};
71 descr.data_const_in_time = 1;
73 descr.RB_train_num_intervals = 5;
75 %descr.RB_train_size = [10 10];
76 descr.RB_train_size = 200;
78 descr.RB_stop_Nmax = 200;
80 descr.RB_val_size = 10;
82 descr.RB_stop_epsilon = 3e-5;
84 descr.RB_refinement_mode =
'adaptive';
86 descr.RB_customized_basis_generation_ptr = @my_greedy_basisgen;
87 %% choose generation mode
88 %descr.RB_generation_mode =
'greedy_uniform_fixed';
90 %% RB_generation_mode =
'random_fixed';
92 %% choose extension method
93 %descr.RB_extension_algorithm = @dune_RB_extension_PCA_fixspace;
95 %descr.RB_stop_timeout = 60*60; % 1 hour
96 %% stop on maximum number of base functions
97 %descr.RB_stop_Nmax = 30;
99 %descr.RB_stop_epsilon = 1e-9; % 0.003 is already realized by init data!!
100 %% stop on overfitting (needs a validation test set)
101 %descr.RB_stop_max_val_train_ratio = inf;
103 %%descr.RB_test_size = 1000;
105 %% fix the rand seed in
case of RB_generation_mode = random_fixed
106 %descr.RB_train_rand_seed = 0.5;
107 %% trainig set size in
case of RB_generation_mode = random_fixed
108 %descr.RB_train_size = 50;
110 %% choose the error indicator
111 %descr.RB_error_indicator =
'estimator'; % Delta from rb_simulation
113 % model.RB_error_indicator =
'error'; %
true error
115 function RB = my_basisgen(rmodel, sdd)
117 dmodel = rmodel.detailed_model;
118 descr = dmodel.descr;
119 if isempty(descr.mu_list)
120 descr.mu_list = {cellfun(@mean, rmodel.descr.mu_ranges,
'UniformOutput',
true)};
123 sdd.mu_list = descr.mu_list;
126 for m = 1:length(descr.mu_list)
127 next = descr.mexptr('rb_extension_PCA', descr.mu_list{m}, 1);
134 function RB = my_greedy_basisgen(rmodel, sdd)
135 disp('entered my_Greedy_basisgen');
137 dmodel = rmodel.detailed_model;
138 set_mu(dmodel, [1 0]);
139 set_mu(rmodel, [1 0]);
140 descr = rmodel.detailed_model.descr;
141 sdd.RB = descr.mexptr('init_data_basis');
143 reduced_data = gen_reduced_data(rmodel, sdd);
145 % Kommentar MD: Alle Description Felder, die mit RB_ beginnen, werden von
147 % (bg_descr.x == descr.RB_x)
148 bg_descr = rmodel.bg_descr;
151 %ps.init_sample(dmodel);
153 mus = rand_uniform(bg_descr.train_size,rmodel.mu_ranges);
158 while( max_err_est> bg_descr.stop_epsilon) && ...
159 (size(sdd.RB,2)< bg_descr.stop_Nmax)
162 errs = zeros(1, size(mus,2));
163 for i = 1:size(mus,2);
164 set_mu(rmodel, mus(:,i));
165 rb_sim_data = rb_simulation(rmodel,reduced_data);
166 errs(i) = rb_sim_data.Delta;
167 if rb_sim_data.Delta > max_err_est
169 max_err_est = rb_sim_data.Delta;
174 mu_max_list = [mu_max_list, max_err_est];
175 mu_list = [mu_list, mu_max];
176 disp(['max error estimator: ',num2str(max_err_est),...
177 ' for mu = ',num2str(mu_max')]);
181 next = descr.mexptr('rb_extension_PCA', mu_max, 1);
182 sdd.RB = [sdd.RB, next];
184 reduced_data = gen_reduced_data(rmodel,sdd);
185 disp(['new basis size: ',num2str(size(sdd.RB,2))]);
188 save('/tmp/maxes', 'mu_list', 'mu_max_list');
Reduced basis implementation for linear stationary PDEs.
So far, this only implements the SimpleDetailedData class.
Reduced basis implementation for linear evolution equations.
Reduced data implementation for linear evolution problems with finite volume discretizations.
function rmodel = gen_reduced_model(dmodel,BasisGenDescr bg_descr)
generates an IReducedModel instance from a description structure.
function descr = laplace_dune_descr(params)
convection diffusion example using dune-rb for high dimensional computations and data structures ...