3 % reduced basis construction with different methods
5 % reduced basis construction with different methods. Performs
6 % computing and insertion of a field RB and RB_info into the
7 % detailed_data structure. detailed_data is assumed to contain the
10 % Required fields of model:
11 % mu_names : cell array of parameter-names
12 % mu_ranges : cell array of parameter-intervals
13 % RB_generation_mode :
14 % - \c
'file_load' : simple loading of reduced basis from a file
15 % - \c
'lagrangian' : simple snapshots without orthonormalization
16 % - \c
'PCA_trajectory' : simple detailed simulation and PCA of the
17 % - \c
'PCA_trajectories' : simple detailed simulation and PCA of the
18 % trajectories with parameter vectors specified in
20 % - \c
'greedy_uniform_fixed' : greedy algorithm based on a uniform
21 % cartesian parameter grid
22 % - \c
'greedy_log_uniform_fixed' : greedy algorithm based on a
23 % logarithmically uniform
24 % cartesian parameter grid
25 % - \c
'greedy_random_fixed' : greedy algorithm based on a uniformly
26 % distributed random parameter set
27 % - \c
'greedy_refined' : greedy algorithm based on a uniformly
28 % random parameter set with grid refinement
29 % - \c
'model_RB_basisgen' : call individual model.RB_basisgen
30 % - \c
'none' : skipping of basis generation
32 % Optional fields of model:
33 % RB_basis_filename : name of file, that contains precomputed
34 % reduced basis RB in
'file_load' mode
35 % RB_train_rand_seed : set random seed
for M_train generation in random mode
36 % RB_train_size : number of training parameter vectors to ...
37 % generate in random-mode
38 % RB_numintervals: vector indicating the number of intervals of
39 % the (coarse) grid in parameter space
41 % generated fields of detailed_data:
42 % RB : reduced basis columns 1,...,Nmax
43 % RB_info : depending on generation method some detailed information
45 % Bernard Haasdonk 15.5.2007
47 % import necessary model methods
51 % if use_generated_RB_basis is true a previews generated basis
52 % is used (necessary for hp algorithm)
53 if isfield(model,'use_generated_RB_basis')
54 if model.use_generated_RB_basis==0
55 detailed_data = model.set_rb_in_detailed_data(detailed_data,[]);
57 detailed_data.RB_info = [];
58 detailed_data = model.set_rb_in_detailed_data(...
59 detailed_data,detailed_data.RB);
62 % initialize empty, such that get_rb_size works subsequently
63 detailed_data = model.set_rb_in_detailed_data(detailed_data,[]);
66 switch model.RB_generation_mode
69 tmp = load(model.RB_basis_filename);
70 detailed_data.RB_info = [];
71 detailed_data = model.set_rb_in_detailed_data(detailed_data,tmp.RB);
72 % detailed_data.RB = tmp.RB;
77 for m = 1:length(model.RB_mu_list)
78 model = set_mu(model,model.RB_mu_list{m});
79 sim_data = detailed_simulation(model,detailed_data);
81 Utot = model.get_dofs_from_sim_data(sim_data);
83 U = model.get_dofs_from_sim_data(sim_data);
87 detailed_data = model.set_rb_in_detailed_data(detailed_data,Utot);
89 case 'from_detailed_data'
91 detailed_data.RB_info = [];
92 detailed_data = model.set_rb_in_detailed_data(...
93 detailed_data,detailed_data.RB);
94 % detailed_data.RB = tmp.RB;
98 detailed_data.RB_info = [];
99 sim_data = detailed_simulation(model,detailed_data);
100 if ~isfield(model,'RB_stop_Nmax')
101 RB = model.PCA_fixspace(model.get_dofs_from_sim_data(sim_data), ...
104 RB = model.PCA_fixspace( ...
105 model.get_dofs_from_sim_data(sim_data), ...
107 model.get_inner_product_matrix(detailed_data), ...
110 detailed_data = model.set_rb_in_detailed_data(detailed_data,RB);
112 case 'PCA_trajectories'
115 for m = 1:length(model.RB_mu_list)
116 model = set_mu(model,model.RB_mu_list{m});
117 sim_data = detailed_simulation(model,detailed_data);
119 Utot = model.get_dofs_from_sim_data(sim_data);
121 U = model.get_dofs_from_sim_data(sim_data);
125 detailed_data.RB_info = [];
126 W = model.get_inner_product_matrix(detailed_data);
127 %%% gram_schmidt too inaccurate in the following!!!
128 % RB = orthonormalize_qr(Utot,W);
129 % disp('perhaps also try PCA_fixspace in this case!!');
131 if ~isfield(model,'RB_stop_Nmax')
132 RB = model.PCA_fixspace(Utot, ...
135 RB = model.PCA_fixspace( ...
139 model.RB_stop_Nmax,'qr');
142 detailed_data=model.set_rb_in_detailed_data(detailed_data,RB);
144 case 'greedy_random_fixed'
146 rand('state',model.RB_train_rand_seed);
147 %model.RB_extension_stop = 'epsilon';
148 detailed_data.RB_info = [];
149 detailed_data.RB_info.M_train = rand_uniform(model.RB_train_size,...
151 detailed_data = basisgen_fixed(model,detailed_data);
155 %the trainigsset has to be set in model.training external
156 detailed_data.RB_info = [];
157 detailed_data.RB_info.M_train = model.training;
158 detailed_data = basisgen_fixed(model,detailed_data);
161 case 'greedy_uniform_fixed'
163 par.numintervals = model.RB_numintervals;
164 par.range = model.mu_ranges;
165 % enable restart of basis generation!!!
166 % detailed_data.RB_info = [];
169 detailed_data.RB_info.M_train = get(MMesh0,'vertex')';
170 %detailed_data.RB_info.M_train = [0;1;0];
171 detailed_data = basisgen_fixed(model,detailed_data);
173 case 'greedy_log_uniform_fixed'
175 par.numintervals = model.RB_numintervals;
176 par.range = model.mu_ranges;
177 for i = 1:length(par.range);
178 par.range{i} = log(par.range{i});
180 % enable restart of basis generation!!!
181 % detailed_data.RB_info = [];
183 Mtrain_log =
get(MMesh0,
'vertex')
';
184 detailed_data.RB_info.M_train = exp(Mtrain_log);
186 detailed_data = basisgen_fixed(model,detailed_data);
188 case 'greedy_refined
'
190 detailed_data.RB_info = [];
191 par.numintervals = model.RB_numintervals;
192 par.range = model.mu_ranges;
193 % enable restart of basis generation!!!
194 % detailed_data.RB_info = [];
195 MMesh0 = cubegrid(par);
196 % detailed_data.RB_info.M_train = get(MMesh0,'vertex
')';
197 detailed_data.RB_info.MMesh0 = MMesh0;
198 detailed_data = basisgen_refined(model, detailed_data);
199 % detailed_data.RB_info.M_val = rand_uniform(model.RB_M_val_size,...
202 case 'model_RB_basisgen'
203 res = model.RB_basisgen(model,detailed_data);
206 detailed_data.RB = res{1};
207 detailed_data.RB_info = res{2};
209 detailed_data.RB = res;
213 disp([
'warning: no reduced basis is produced, detailed_data will' ...
214 ' not be suitable for simulation now!!']);
217 error(
'RB_generation_mode unknown!!!');
220 if model.debug && isfield(detailed_data,
'RB') && ~isempty(detailed_data.RB)
221 K = detailed_data.RB'* ...
222 model.get_inner_product_matrix(detailed_data) * detailed_data.RB;
223 e = max(max(abs(K-eye(size(K)))));
225 error('reduced basis not orthonormal!!')
A hierarchical cubegrid of arbitrary dimension.
function detailed_data = rb_basis_generation(model, detailed_data)
reduced basis construction with different methods