1 function detailed_data = t_part_gen_detailed_data(model, model_data)
2 %
function detailed_data = t_part_gen_detailed_data(model, model_data)
4 %
function generating the detailed data (the RB)
for a t-partition model
6 % required fields of model:
7 % basis_vector_overlap: number of basis vectors from the foregoing t-part RB
8 % used as initial basis in the next one.
9 % RB_stop_epsilon_global: This is equal to the base model
's 'RB_stop_epsilon
'
10 % field, which defines the maximum error estimator
11 % tolerance for the generated basis.
13 % there are different generation modes: for fixed t-partition and adaptive.
16 % Markus Dihlmann 15.02.2011
18 model.t_part_in_basis_generation =1;
19 model.reduced_data_subset = @(model, reduced_data)reduced_data; %temp replace to circumvent problems in rb_test_indicator
23 detailed_data = structcpy(detailed_data,model_data);
25 detailed_data.t_part_range = model.t_part_range;
27 base_model = model.base_model;
29 if ~isfield(model,'t_part_rb_generation_mode
')
30 error('For t-partition please set the field t_part_rb_generation_mode in t_part_model
');
33 switch model.t_part_rb_generation_mode
35 nr_t_parts = length(model.t_part_range);
36 %t_part_detailed_data = cell(1,nr_t_parts);
38 for ind = 1:nr_t_parts
40 model.t_part_for_simulation = ind;
42 %overlap from foregoing t-part RB as initial basis in next
44 model.init_values_algorithm = @(model, detailed_data)t_part_detailed_data{ind-1}.RB(:,1:model.basis_vector_overlap);
46 %try with POD of some final time step solutions of the
48 %model.init_values_algorithm = @t_part_initial_cond_POD;
49 %model.rb_init_data_basis = @t_part_initial_cond_POD;
52 model.RB_stop_epsilon = model.RB_stop_epsilon_global/model.nt*(model.t_part_range{ind}(2)-model.t_part_range{ind}(1));
53 t_part_detailed_data{ind} = rb_basis_generation(model, detailed_data);
54 % prevent recursive detailed data structures
55 t_part_detailed_data{ind} = rmfield(t_part_detailed_data{ind}, 't_part_detailed_data
');
56 detailed_data.t_part_detailed_data = t_part_detailed_data;
60 %make a refinement of the ranges which have the biggest error gain
61 %(model.t_part_theta controls the partition of total refinement)
63 case 'adaptive_error_restriction
'
64 %make refinement so that the error gain is equally repartitioned
65 nr_t_parts = length(model.t_part_range);
67 if ~isfield(model,'max_t_part_refinement_level
')
68 model.max_t_part_refinement_level = 4;
73 t_parts_for_basis_generation = 1:nr_t_parts;
78 refine_p=[]; % array of partition indices marked for refinement
79 nr_t_parts = length(t_parts_for_basis_generation);
80 if isfield(detailed_data,'t_part_detailed_data
')
81 t_part_detailed_data = detailed_data.t_part_detailed_data;
84 for ind = 1:nr_t_parts
86 t_part_ind = t_parts_for_basis_generation(ind);
87 model.t_part_for_simulation = t_part_ind;
88 model.t_part_id_in_basisgen = t_part_ind;
90 %overlap from foregoing t-part RB as initial basis in next
93 %model.init_values_algorithm = @(model, detailed_data)...
94 % t_part_detailed_data{t_part_ind-1}.RB(:,1:model.basis_vector_overlap);
96 %model.init_values_algorithm = @t_part_initial_cond_POD;
97 model.rb_init_data_basis = @t_part_initial_cond_POD;
99 model.RB_stop_epsilon = model.RB_stop_epsilon_global ...
101 *(model.t_part_range{t_part_ind}(2)-model.t_part_range{t_part_ind}(1));
103 % call the usual reduced basis generation POD-greedy algorithm for the current t partition
104 t_part_detailed_data{t_part_ind} = rb_basis_generation(model, detailed_data);
106 % prevent recursive detailed data structures
107 if isfield(t_part_detailed_data{t_part_ind},'t_part_detailed_data
')
108 t_part_detailed_data{t_part_ind} = rmfield(t_part_detailed_data{t_part_ind}, 't_part_detailed_data
');
110 detailed_data.t_part_detailed_data = t_part_detailed_data;
114 t_parts_for_basis_generation=[];
116 % create maximumm error curve over randon test sample
117 model.t_part_for_simulation = length(model.t_part_range);
118 reduced_data = gen_reduced_data(model, detailed_data);
119 sim_data = get_max_sim_data(model, reduced_data);
122 for p=1:length(sim_data.t_part_sim_data)
123 % compute maximum epsilon tolerance for this partition
124 epsilon_tol_p = model.RB_stop_epsilon_global/ model.nt* (model.t_part_range{p}(2)-model.t_part_range{p}(1));
126 if (sim_data.t_part_sim_data{p}.Delta(end) > epsilon_tol_p)||(t_part_detailed_data{p}.RB_info.stopped_on_Nmax)
127 disp(['refinement of partition
',num2str(p),' is neccessary
']);
128 % mark this partition for refinement
129 refine_p=[refine_p,p];
133 if isempty(refine_p)||(loop_nr>=model.max_t_part_refinement_level)
136 % refine the partition
137 [model, detailed_data] = refine_t_part(model, detailed_data, refine_p, sim_data);
139 %delete temp files for mesh refinement
140 delete(fullfile(rbmatlabtemp,'tmp*
'));
141 if isfield(model,'t_parts_for_basis_generation
')
142 t_parts_for_basis_generation = model.t_parts_for_basis_generation;
145 % check for termination conditions: no refinement or maximum number of refinements
149 %number of t_part_ranges shoud be the same as number of RBs
150 if length(model.t_part_range) ~= length(detailed_data.t_part_detailed_data)
151 error('different number of t-partitions in model and detailed_data. Probably problem with refinement
')
158 % do not stop on Nmax for last loop
159 if (loop_nr==model.max_t_part_refinement_level)
160 model.RB_stop_Nmax = 100;
167 detailed_data.t_part_detailed_data = t_part_detailed_data;
171 function max_sim_data = get_max_sim_data(model, reduced_data)
172 rand('state
',model.random_seed);
173 M_val=rand_uniform(20, model.mu_ranges);
175 model = set_mu(model,M_val(:,1));
177 max_sim_data = rb_simulation(model, reduced_data);
179 for i=1:size(M_val,2)
180 model = set_mu(model, M_val(:,i));
181 sim_data = rb_simulation(model, reduced_data);
183 for p=1:length(sim_data.t_part_sim_data)
184 for k=1:length(sim_data.t_part_sim_data{p}.Delta)
185 if (max_sim_data.t_part_sim_data{p}.Delta(k)<sim_data.t_part_sim_data{p}.Delta(k))
186 max_sim_data.t_part_sim_data{p}.Delta(k) = sim_data.t_part_sim_data{p}.Delta(k);
193 if isfield(max_sim_data,'Delta
')
194 max_sim_data = rmfield(max_sim_data,'Delta
');
197 %test_error = rb_test_estimator(model, reduced_data,M_val);
198 %[error_max,mu_ind] = max(test_error);
200 %model = set_mu(model,M_val(:,mu_ind));
201 %sim_data = rb_simulation(model, reduced_data);