1 function detailed_data = basisgen_refined(model,detailed_data)
2 %
function detailed_data = basisgen_refined(model,detailed_data)
4 % script demonstrating the generation of a reduced basis with
5 % a refined parameter grid approach, either uniformly refined or
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.
18 % produced fields of detailed_data:
19 % RB,V,W, etc. : collection of orthonormal reduced basis DOF
21 % RB_info: datastructure with basis-generation
22 % information, see below
23 % grid : numerical grid, is constructed
if not existent.
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.
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
55 % Bernard Haasdonk 29.5.2007
58 % We assume, that detailed_data is reasonably filled, e.g. contains
62 %
if ~isfield(detailed_data,
'grid') | isempty(detailed_data.grid)
63 % detailed_data.grid = construct_grid(model);
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')
70 if ~isfield(model,'RB_max_refinement_level')
71 model.RB_max_refinement_level = inf;
74 if ~isfield(model,'RB_force_stop_max_refinement_level')
75 model.RB_force_stop_max_refinement_level = false;
78 %%%%%%%%%%%%%%% specific settings for adaptive algorithm
80 %par.range = model.mu_ranges;
81 %par.numintervals = [model.RB_numintervals];
83 MMesh0 = detailed_data.RB_info.MMesh0;
84 detailed_data.RB_info.M_train = get(MMesh0,'vertex')';
86 % generate RB-start: all initial data constellations
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);
97 %detailed_data.RB = RB_init_data_basis(M_train, ...
98 % detailed_data.grid,...
104 %model.Nmax = size(detailed_data.RB,2);
105 model.Nmax = model.get_rb_size(model,detailed_data);
107 disp('Starting RB extension loop');
109 % start time measurement
111 start_time_basisgen_refined = tic;
113 % generate RB_info if required
114 if ~isfield(detailed_data,'RB_info')
115 detailed_data.RB_info = [];
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,...
125 ref_loop = 0; % number of refinement loops
127 % monitor certain quantities during extension
129 mesh_index_sequence = [];
131 % loop over refinement levels
134 max_val_train_ratio = model.RB_stop_max_val_train_ratio;
138 % 1.
Greedy search with current grid-vertices
140 % temporarily set M_train
141 % M_fine =
get(MMesh,
'vertex')
';
143 detailed_data.RB_info.M_train = get(MMesh, 'vertex
')';
148 % extend mesh-information
if required
149 nRB_new = model.get_rb_size(model,detailed_data);
150 lmi = length(mesh_index_sequence);
152 mesh_index_sequence = [mesh_index_sequence, ...
153 (ref_loop+1) * ones(1,nRB_new-lmi)];
154 MMesh_list = [MMesh_list, {MMesh}];
157 stopped_on_max_refinement_level = 0;
158 levels =
get(MMesh,
'level');
159 maxlev = max(levels);
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;
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;
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;
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;
186 if skip_refinement_and_break
191 disp(
'detected grid refinement necessary!!');
193 nleafelements =
get(MMesh,
'nleafelements');
195 switch model.RB_refinement_mode
198 MMesh = refine(MMesh,1:nleafelements);
202 % compute error estimators
204 %
for all
leaf e in grid M_t compute
206 % max_{mu in (V(e) and cog(e) Delta (Phi_t, mu)
207 %determine Theta most violating elements
209 % eta: pol0-
function on mu-grid-elements, only
leaf elements
211 detailed_data, offline_data, MMesh, ...
212 detailed_data.RB_info.M_last_errs, model);
214 %disp([
'saving before grid-refinement ',num2str(ref_loop)]);
215 %fn = [
'tmp_adapt',num2str(ref_loop),
'.mat'];
216 %save(fullfile(getenv(
'PDEMATLABTEMP'),fn));
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));
224 error(
'refinement mode unknown!');
227 ref_loop = ref_loop + 1;
229 disp(
'finished grid refinement!!');
231 end % end skip_refinement_and_break select
233 end % end loop over refinement levels
238 detailed_data.RB_info = rmfield(detailed_data.RB_info,
'M_train');
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');
244 detailed_data.RB_info.mesh_index_sequence = mesh_index_sequence;
245 detailed_data.RB_info.MMesh_list = MMesh_list;
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);
252 disp([
'Generated RB basis on refined grid with ',...
253 num2str(model.get_rb_size(model,detailed_data)), ...
255 disp([
'Number of MMesh-refinement loops = ',num2str(ref_loop)]);
256 t = toc(start_time_basisgen_refined);
257 disp([
'Runtime = ',num2str(t)]);
A hierarchical cubegrid of arbitrary dimension.
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.