rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
basisgen_refined.m
1 function detailed_data = basisgen_refined(model,detailed_data)
2 %function detailed_data = basisgen_refined(model,detailed_data)
3 %
4 % script demonstrating the generation of a reduced basis with
5 % a refined parameter grid approach, either uniformly refined or
6 % adaptively.
7 %
8 % RB is started with initial data by varying all parameters as
9 % specified in the coarse parameter grid M_0.
10 % For current parameter mesh M_t, the basis is extended by
11 % greedy searching for the node with the maximum posterior error
12 % estimator, for this mu a single vector is chosen for basisextension.
13 % A validation error is determined for checking, whether overfitting is
14 % currently happening. If so, the grid is refined either uniformly
15 % or by an a-posteriori error estimation approach, and the
16 % basis-extension again started.
17 %
18 % produced fields of detailed_data:
19 % RB,V,W, etc. : collection of orthonormal reduced basis DOF
20 % vectors
21 % RB_info: datastructure with basis-generation
22 % information, see below
23 % grid : numerical grid, is constructed if not existent.
24 %
25 % generated fields in RB_info:
26 % M_train : is deleted and only set temporarilty in this function
27 % MMesh_list : a cell array containing the sequence of
28 % increasingly refined meshes
29 % mesh_index_sequence : a list indicating, on which refinement-level
30 % each extension-mu-vector in
31 % mu_sequence was added.
32 % RB_stopped_on_max_refinement_level : indicates, whether
33 % the maximum level of refinements was reached
34 % RB_max_val_train_ratio_assured : indicates whether the maximum
35 % validation training ratio has been fulfilled at any time.
36 %
37 % required fields of model:
38 % RB_refinement_mode: 'uniform' or 'adaptive'
39 % RB_max_refinement_level : level after which
40 % no further refinement is performed (Default: 'inf')
41 % RB_force_stop_max_refinement_level : flag indicating whether the
42 % basis generation algorithm needs to be stopped when the
43 % maximum refinment level is reached. If set to 'false',
44 % 'RB_stop_max_val_train_ratio' is set to '1e6' after last
45 % possible refinement. (Default: false)
46 % mu_ranges : cell array of intervals for the mu-components
47 % RB_numintervals : vector indicating the number of
48 % intervals for the coarse initial mesh
49 % RB_val_rand_seed: random seed for validation set
50 % creation, if not already given in RB_info.M_val
51 % RB_M_val_size: number of validation points for extension
52 % RB_refinement_theta: theta-value in [0,1] in case of
53 % adaptive refinement
54 
55 % Bernard Haasdonk 29.5.2007
56 
57 
58 % We assume, that detailed_data is reasonably filled, e.g. contains
59 % the grid.
60 
61 % generate grid
62 %if ~isfield(detailed_data,'grid') | isempty(detailed_data.grid)
63 % detailed_data.grid = construct_grid(model);
64 %end;
65 
66 if isfield(model,'RB_stop_max_refinement_level')
67  error('field RB_stop_max_refinement_level has been replaced by RB_max_refinement_level. If you want to force RB generation to stop use RB_force_stop_max_refinement_level')
68 end
69 
70 if ~isfield(model,'RB_max_refinement_level')
71  model.RB_max_refinement_level = inf;
72 end;
73 
74 if ~isfield(model,'RB_force_stop_max_refinement_level')
75  model.RB_force_stop_max_refinement_level = false;
76 end
77 
78 %%%%%%%%%%%%%%% specific settings for adaptive algorithm
79 
80 %par.range = model.mu_ranges;
81 %par.numintervals = [model.RB_numintervals];
82 %MMesh0 = cubegrid(par);
83 MMesh0 = detailed_data.RB_info.MMesh0;
84 detailed_data.RB_info.M_train = get(MMesh0,'vertex')';
85 
86 % generate RB-start: all initial data constellations
87 
88 if (model.get_rb_size(model,detailed_data)==0)
89  % generate RBstart: all initial data constellations
90  RB = model.rb_init_data_basis(model, detailed_data);
91  detailed_data = model.set_rb_in_detailed_data(detailed_data,RB);
92  % if (get_rb_size(detailed_data)==0) % check if reduced basis is empty
93  % detailed_data = model.RB_init_data_basis(model, detailed_data, ...
94  % detailed_data.RB_info.M_train);
95 end;
96 
97 %detailed_data.RB = RB_init_data_basis(M_train, ...
98 % detailed_data.grid,...
99 % model);
100 
101 
102 %prepare model
103 
104 %model.Nmax = size(detailed_data.RB,2);
105 model.Nmax = model.get_rb_size(model,detailed_data);
106 
107 disp('Starting RB extension loop');
108 
109 % start time measurement
110 tic;
111 start_time_basisgen_refined = tic;
112 
113 % generate RB_info if required
114 if ~isfield(detailed_data,'RB_info')
115  detailed_data.RB_info = [];
116 end;
117 
118 % generate validation data if required
119 if ~isfield(detailed_data.RB_info,'M_val')
120  rand('state',model.RB_val_rand_seed); % random but deterministic
121  detailed_data.RB_info.M_val = rand_uniform(model.RB_M_val_size,...
122  model.mu_ranges);
123 end;
124 
125 ref_loop = 0; % number of refinement loops
126 MMesh = MMesh0;
127 % monitor certain quantities during extension
128 MMesh_list = {};
129 mesh_index_sequence = [];
130 
131 % loop over refinement levels
132 continue_loop = 1;
133 
134 max_val_train_ratio = model.RB_stop_max_val_train_ratio;
135 
136 while continue_loop
137 
138  % 1. Greedy search with current grid-vertices
139 
140  % temporarily set M_train
141  % M_fine = get(MMesh, 'vertex')';
142 
143  detailed_data.RB_info.M_train = get(MMesh, 'vertex')';
144 
145  % extend basis
146  [detailed_data,offline_data] = RB_greedy_extension(model,detailed_data);
147 
148  % extend mesh-information if required
149  nRB_new = model.get_rb_size(model,detailed_data);
150  lmi = length(mesh_index_sequence);
151  if (nRB_new > lmi)
152  mesh_index_sequence = [mesh_index_sequence, ...
153  (ref_loop+1) * ones(1,nRB_new-lmi)];
154  MMesh_list = [MMesh_list, {MMesh}];
155  end;
156 
157  stopped_on_max_refinement_level = 0;
158  levels = get(MMesh,'level');
159  maxlev = max(levels);
160 
161  if maxlev == model.RB_max_refinement_level - 1 ...
162  && ~model.RB_force_stop_max_refinement_level
163  model.RB_stop_max_val_train_ratio = 1e6;
164  end
165 
166  % force stop of basis generation after maximum refinement level is reached
167  if maxlev >= model.RB_max_refinement_level ...
168  && model.RB_force_stop_max_refinement_level
169  stopped_on_max_refinement_level = 1;
170  end
171 
172  % if refinement is still possible and required val-train ratio is not assured
173  % refine the parameter space regardless of stopped_on_epsilon flag.
174  if maxlev < model.RB_max_refinement_level ...
175  && detailed_data.RB_info.r_value_sequence(end) > max_val_train_ratio
176  detailed_data.RB_info.stopped_on_epsilon = 0;
177  end;
178 
179 
180  skip_refinement_and_break = detailed_data.RB_info.stopped_on_epsilon | ...
181  detailed_data.RB_info.stopped_on_empty_extension | ...
182  detailed_data.RB_info.stopped_on_timeout | ...
183  detailed_data.RB_info.stopped_on_Nmax | ...
184  stopped_on_max_refinement_level;
185 
186  if skip_refinement_and_break
187  continue_loop = 0;
188  else
189  % 2. Grid refinement
190 
191  disp('detected grid refinement necessary!!');
192 
193  nleafelements = get(MMesh,'nleafelements');
194 
195  switch model.RB_refinement_mode
196  case 'uniform'
197 
198  MMesh = refine(MMesh,1:nleafelements);
199 
200  case 'adaptive'
201 
202  % compute error estimators
203 
204  %for all leaf e in grid M_t compute
205  % eta(e) :=
206  % max_{mu in (V(e) and cog(e) Delta (Phi_t, mu)
207  %determine Theta most violating elements
208 
209  % eta: pol0-function on mu-grid-elements, only leaf elements
210  [eta, eta_info] = rb_mu_element_indicators ( ...
211  detailed_data, offline_data, MMesh, ...
212  detailed_data.RB_info.M_last_errs, model);
213 
214  %disp(['saving before grid-refinement ',num2str(ref_loop)]);
215  %fn = ['tmp_adapt',num2str(ref_loop),'.mat'];
216  %save(fullfile(getenv('PDEMATLABTEMP'),fn));
217 
218  [dummy , ind] = sort(-eta);
219  nmax = ceil(nleafelements * model.RB_refinement_theta);
220  %li = get(MMesh,'leafelements');
221  MMesh = refine(MMesh,ind(1:nmax));
222 
223  otherwise
224  error('refinement mode unknown!');
225  end;
226 
227  ref_loop = ref_loop + 1;
228 
229  disp('finished grid refinement!!');
230 
231  end % end skip_refinement_and_break select
232 
233 end % end loop over refinement levels
234 
235 
236 
237 % prepare output:
238 detailed_data.RB_info = rmfield(detailed_data.RB_info,'M_train');
239 
240 % the following field does also not make much sense in case of
241 % multiple greedy runs, so remove
242 detailed_data.RB_info = rmfield(detailed_data.RB_info,'M_first_errs');
243 
244 detailed_data.RB_info.mesh_index_sequence = mesh_index_sequence;
245 detailed_data.RB_info.MMesh_list = MMesh_list;
246 
247 detailed_data.RB_info.RB_stopped_on_max_refinement_level = ...
248  stopped_on_max_refinement_level;
249 detailed_data.RB_info.RB_max_val_train_ratio_assured = ...
250  (detailed_data.RB_info.r_value_sequence(end) < max_val_train_ratio);
251 
252 disp(['Generated RB basis on refined grid with ',...
253  num2str(model.get_rb_size(model,detailed_data)), ...
254  ' basis vectors.']);
255 disp(['Number of MMesh-refinement loops = ',num2str(ref_loop)]);
256 t = toc(start_time_basisgen_refined);
257 disp(['Runtime = ',num2str(t)]);
258 
259 
260 %| \docupdate
A hierarchical cubegrid of arbitrary dimension.
Definition: cubegrid.m:17
Definition: leaf.m:17
function [ detailed_data , reduced_data ] = RB_greedy_extension(model, detailed_data)
function performing a greedy search loop for reduced basis generation.
function [ eta , eta_info ] = rb_mu_element_indicators(detailed_data, offline_data, MMesh, Delta_train, model)
detailed_data, [offline_data], MMesh, Delta_train, model)
Customizable implementation of an abstract greedy algorithm.
Definition: DuneRBLeafNode.m:1