rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
rb_basis_generation.m
Go to the documentation of this file.
1 function detailed_data = rb_basis_generation(model,detailed_data)
2 %function detailed_data = rb_basis_generation(model,detailed_data)
3 % reduced basis construction with different methods
4 %
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
8 % grid if required
9 %
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
19 % model.RB_mu_list
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
31 %
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
40 %
41 % generated fields of detailed_data:
42 % RB : reduced basis columns 1,...,Nmax
43 % RB_info : depending on generation method some detailed information
44 
45 % Bernard Haasdonk 15.5.2007
46 
47 % import necessary model methods
48 
49 
50 
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,[]);
56  else
57  detailed_data.RB_info = [];
58  detailed_data = model.set_rb_in_detailed_data(...
59  detailed_data,detailed_data.RB);
60  end;
61 else
62  % initialize empty, such that get_rb_size works subsequently
63  detailed_data = model.set_rb_in_detailed_data(detailed_data,[]);
64 end;
65 
66 switch model.RB_generation_mode
67  case 'file_load'
68 
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;
73 
74  case 'lagrangian'
75 
76  Utot = [];
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);
80  if isempty(Utot)
81  Utot = model.get_dofs_from_sim_data(sim_data);
82  else
83  U = model.get_dofs_from_sim_data(sim_data);
84  Utot = [Utot U];
85  end;
86  end;
87  detailed_data = model.set_rb_in_detailed_data(detailed_data,Utot);
88 
89  case 'from_detailed_data'
90 
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;
95 
96  case 'PCA_trajectory'
97 
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), ...
102  []);
103  else
104  RB = model.PCA_fixspace( ...
105  model.get_dofs_from_sim_data(sim_data), ...
106  [],...
107  model.get_inner_product_matrix(detailed_data), ...
108  model.RB_stop_Nmax);
109  end;
110  detailed_data = model.set_rb_in_detailed_data(detailed_data,RB);
111 
112  case 'PCA_trajectories'
113 
114  Utot = [];
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);
118  if isempty(Utot)
119  Utot = model.get_dofs_from_sim_data(sim_data);
120  else
121  U = model.get_dofs_from_sim_data(sim_data);
122  Utot = [Utot U];
123  end;
124  end;
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!!');
130 
131  if ~isfield(model,'RB_stop_Nmax')
132  RB = model.PCA_fixspace(Utot, ...
133  [],W,[],'qr');
134  else
135  RB = model.PCA_fixspace( ...
136  Utot, ...
137  [],...
138  W, ...
139  model.RB_stop_Nmax,'qr');
140  end;
141 
142  detailed_data=model.set_rb_in_detailed_data(detailed_data,RB);
143 
144  case 'greedy_random_fixed'
145 
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,...
150  model.mu_ranges);
151  detailed_data = basisgen_fixed(model,detailed_data);
152 
153 
154  case 'greedy_fixed'
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);
159 
160 
161  case 'greedy_uniform_fixed'
162 
163  par.numintervals = model.RB_numintervals;
164  par.range = model.mu_ranges;
165  % enable restart of basis generation!!!
166  % detailed_data.RB_info = [];
167 
168  MMesh0 = cubegrid(par);
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);
172 
173  case 'greedy_log_uniform_fixed'
174 
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});
179  end;
180  % enable restart of basis generation!!!
181  % detailed_data.RB_info = [];
182  MMesh0 = cubegrid(par);
183  Mtrain_log = get(MMesh0,'vertex')';
184  detailed_data.RB_info.M_train = exp(Mtrain_log);
185 % keyboard; % check
186  detailed_data = basisgen_fixed(model,detailed_data);
187 
188  case 'greedy_refined'
189 
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,...
200 % model.mu_ranges);
201 
202  case 'model_RB_basisgen'
203  res = model.RB_basisgen(model,detailed_data);
204 
205  if iscell(res)
206  detailed_data.RB = res{1};
207  detailed_data.RB_info = res{2};
208  else
209  detailed_data.RB = res;
210  end;
211 
212  case 'none'
213  disp(['warning: no reduced basis is produced, detailed_data will' ...
214  ' not be suitable for simulation now!!']);
215 
216  otherwise
217  error('RB_generation_mode unknown!!!');
218 end;
219 
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)))));
224  if e>1e-4
225  error('reduced basis not orthonormal!!')
226  end;
227 end;
A hierarchical cubegrid of arbitrary dimension.
Definition: cubegrid.m:17
function detailed_data = rb_basis_generation(model, detailed_data)
reduced basis construction with different methods