rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
refine_t_part.m
1 function [model, detailed_data] = refine_t_part(model, detailed_data, refine_p, sim_data)
2 %function refine_t_part(model, detailed_data, refine_p)
3 %
4 % function refines the t_partitions with numbers 'refine_p'.
5 % The function identifies the time step where half of the error growth in
6 % this partition is reached and refines the partition at this time step.
7 % refine_p is a vector of t-partition ids.
8 %
9 % parameters:
10 % refine_p: array of partition indices which are to be refined.
11 % sim_data: a maximum error curve over a test sample of mus
12 %
13 % Required fields of model:
14 % t_part_range: cell-array, giving information about the t-partitions
15 % transition_model: boolean flag indicating whether a projection should take
16 % place at every overlap (false), of whether at an overlap
17 % both reduced basis shall be used (true). In the second
18 % case the t_part_ranges do not overlap.
19 %
20 % Required fields of detailed_data:
21 % t_part_detailed_data: the t-partition detailed data
22 %
23 %
24 
25 % Markus Dihlmann 22.02.10
26 
27 if ~isfield(model,'t_part_middle_point_bisection')
28  model.t_part_middle_point_bisection =0;
29 end
30 
31 t_part_detailed_data = detailed_data.t_part_detailed_data;
32 t_parts_for_basis_generation = [];
33 t_part_range = model.t_part_range;
34 t_part_range_old = t_part_range;
35 offset=0;
36 for p = 1:length(refine_p)
37 
38  % get detailed data for current t-partition
39  tp_detailed_data = detailed_data.t_part_detailed_data{refine_p(p)};
40 
41  %identify for which mu the maximum error has been detected
42  %mu=tp_detailed_data.RB_info.mu_sequence(:,end);
43 
44  %old_mu = get_mu(model);
45  %t_part_old = model.t_part_for_simulation;
46  %prepare a reduced simulation for this parameter
47  %model = set_mu(model, mu);
48  %reduced_data = gen_reduced_data(model, detailed_data);
49  %model.t_part_for_simulation = refine_p(p);
50 
51  %sim_data = rb_simulation(model, reduced_data);
52 
53  %find k where the average error is reached
54  if ~model.t_part_middle_point_bisection
55  %Bisection at timestep k where half the error is reached
56  delta_diff = sim_data.t_part_sim_data{refine_p(p)}.Delta(end)...
57  -sim_data.t_part_sim_data{refine_p(p)}.Delta(1);
58 
59  v = find(sim_data.t_part_sim_data{refine_p(p)}.Delta>(delta_diff/2));
60  k_cut = v(1);
61  else
62  %bisection in the middle of the interval
63  interval_length=t_part_range{refine_p(p)+offset}(2)-t_part_range{refine_p(p)+offset}(1);
64  k_cut = floor(interval_length/2);
65 
66  end
67 
68  % check wether t-partition can be refined at k_cut
69  if (k_cut>3) && (k_cut<(length(sim_data.t_part_sim_data{refine_p(p)}.Delta)-3))
70 
71  % new t partition interval
72  new_t_partition = [k_cut + t_part_range{refine_p(p) + offset}(1), ...
73  t_part_range{refine_p(p) + offset}(2)];
74  %
75  t_part_range{refine_p(p)+offset}(2) = new_t_partition(1);
76  % add new t partition interval to old range list
77  t_part_range = add_to_array(new_t_partition,...
78  refine_p(p) + 1 + offset,...
79  t_part_range);
80  % also copy the detailed data with RB to this new interval
81  t_part_detailed_data = add_to_array(tp_detailed_data,...
82  refine_p(p)+1+offset,...
83  t_part_detailed_data);
84  %
85  t_parts_for_basis_generation = [t_parts_for_basis_generation,...
86  refine_p(p)+offset,...
87  refine_p(p)+1+offset];
88  offset = offset+1;
89  else
90  disp('no segmentation possible because of too big projection error');
91  end
92 
93 % model = set_mu(model, old_mu);
94 % model.t_part_for_simulation = t_part_old;
95 end
96 
97 model.t_part_range = t_part_range;
98 detailed_data.t_part_detailed_data = t_part_detailed_data;
99 detailed_data.t_part_range = t_part_range;
100 model.t_parts_for_basis_generation = t_parts_for_basis_generation;
101 
102 %store partition history
103 if ~isfield(detailed_data,'t_part_ranges_history')
104  detailed_data.t_part_ranges_history{1} = t_part_range_old;
105 else
106  len = length(detailed_data.t_part_ranges_history);
107  detailed_data.t_part_ranges_history{len+1} = t_part_range_old;
108 end
109 
110 %store max error history
111 sim_data.Delta=sim_data.t_part_sim_data{1}.Delta;
112 if isfield(sim_data.t_part_sim_data{1},'s')
113  sim_data.s = sim_data.t_part_sim_data{1}.s;
114  sim_data.Delta_s = sim_data.t_part_sim_data{1}.Delta_s;
115 end
116 
117 for ind = 2:length(sim_data.t_part_sim_data)
118  len = length(sim_data.t_part_sim_data{ind}.a(1,:));
119  %sim_data.a=[sim_data.a,t_part_sim_data{ind}.a(:,2:len)];
120  if ~model.transition_model
121  sim_data.Delta=[sim_data.Delta,...
122  sim_data.t_part_sim_data{ind}.Delta(2:len)];
123  if isfield(sim_data.t_part_sim_data{1},'s')
124  sim_data.s = [sim_data.s,...
125  sim_data.t_part_sim_data{ind}.s(2:len)];
126  sim_data.Delta_s = [sim_data.Delta_s,...
127  sim_data.t_part_sim_data{ind}.Delta_s(2:len)];
128  end
129  else
130  sim_data.Delta=[sim_data.Delta,...
131  sim_data.t_part_sim_data{ind}.Delta(1:len)];
132  if isfield(sim_data.t_part_sim_data{1},'s')
133  sim_data.s = [sim_data.s,sim_data.t_part_sim_data{ind}.s(1:len)];
134  sim_data.Delta_s = [sim_data.Delta_s,sim_data.t_part_sim_data{ind}.Delta_s(1:len)];
135  end
136  end
137 end
138 
139 if ~isfield(detailed_data,'max_error_history')
140  detailed_data.max_error_history{1} = sim_data.Delta;
141 else
142  len = length(detailed_data.max_error_history);
143  detailed_data.max_error_history{len+1} = sim_data.Delta;
144 end