rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
t_part_rb_simulation.m
1 function sim_data = t_part_rb_simulation(model, reduced_data)
2 %function sim_data = t_part_rb_simulation(model, reduced_data)
3 %
4 % function performing a reduced basis simulation for t-part models.
5 % For every time partition a different reduced basis is used. Between the
6 % t-partitions the initial coefficients of the next partitions are obtained
7 % by an orthogonal projection of the reduced solution of the last partition
8 % onto the reduced space of the next partition.
9 %
10 % Required fields of reduced_data:
11 % t_part_reduced_data: reduced data of the several partitions including a
12 % transormation matrix T to obtian initial
13 % coefficients of the nex partition
14 %
15 % Generated fields of sim_data:
16 % a: vector of solution coefficients
17 %
18 %
19 
20 % Markus Dihlmann 15.02.2011
21 
22 if ~isfield(model,'t_part_in_basis_generation')
23  model.t_part_in_basis_generation=0;
24 end
25 
26 
27 sim_data = [];
28 
29 base_model = model.base_model;
30 
31 if ~isfield(reduced_data,'t_part_reduced_data')
32  error('No complete t-part model. reduced_data lacks T-partition informations!');
33 else
34  t_part_reduced_data = reduced_data.t_part_reduced_data;
35  if model.transition_model
36  transition_reduced_data = reduced_data.t_part_transition_reduced_data;
37  base_model.transition_model=1;
38  end
39 end
40 
41 nr_t_parts = length(model.t_part_range); %number of t-partitions
42 
43 if (isfield(model,'t_part_for_simulation'))&&~isempty(model.t_part_for_simulation)
44  stop_part = model.t_part_for_simulation;
45 else
46  stop_part = nr_t_parts;
47 end
48 
49 t_part_sim_data = cell(1,stop_part);
50 
51 for t_part_ind = 1:stop_part
52 
53  base_model.starting_time_step = model.t_part_range{t_part_ind}(1);
54  base_model.stopping_time_step = model.t_part_range{t_part_ind}(2);
55 
56  if t_part_ind>1
57  if ~model.transition_model
58  %transition between the two reduced models is done by a
59  %projection
60 
61  %initial data manipulation
62  base_model.rb_init_values = @(model, detailed_data) 1;
63  a_end_tp1 = t_part_sim_data{t_part_ind-1}.a(:,end); %coeficient vector of last time step
64  a0_tp2 = t_part_reduced_data{t_part_ind}.T * a_end_tp1; %first coeffient vector in next time step
65  t_part_reduced_data{t_part_ind}.a0 = {a0_tp2};
66 
67  %error calculation
68  %projection error in t-part transfer
69 
70  err_proj = a_end_tp1'*a_end_tp1 - a0_tp2'*a0_tp2 ;
71  if err_proj<0
72  err_proj=0;
73  else
74  err_proj = sqrt(err_proj);
75  end
76  if model.verbose > 5
77  disp(['Projection error between partitions: ', num2str(err_proj)]);
78  end
79 
80  %adding initial error to t_part_reduced_data
81  t_part_reduced_data{t_part_ind}.Delta0 = t_part_sim_data{t_part_ind-1}.Delta(end) + err_proj;
82  if model.t_part_rb_generation_cut_error ...
83  &&...
84  model.t_part_in_basis_generation
85 
86  %cut the error so that in greedy basis generation only the
87  %real "added" error in this t-partition is regarded
88  t_part_reduced_data{t_part_ind}.Delta0 = err_proj;
89  end
90  else
91  %transition between the two models is done my a transition
92  %time step.
93 
94  %transition step
95  base_model.rb_init_values = @(model, detailed_data)1;
96  transition_reduced_data{t_part_ind-1}.a0{1} = t_part_sim_data{t_part_ind-1}.a(:,end); %coeficient vector of last time step
97  transition_reduced_data{t_part_ind-1}.Delta0 = t_part_sim_data{t_part_ind-1}.Delta(end) ;
98  %Transition simulation
99  base_model.starting_time_step = model.t_part_range{t_part_ind-1}(2);
100  base_model.stopping_time_step = model.t_part_range{t_part_ind}(1)+1;
101  sim_data_trans = rb_simulation(base_model, transition_reduced_data{t_part_ind-1});
102 
103  base_model.starting_time_step = model.t_part_range{t_part_ind}(1)+1; %subtract the transition step
104  base_model.stopping_time_step = model.t_part_range{t_part_ind}(2);
105  %error
106  %...
107  t_part_reduced_data{t_part_ind}.Delta0 = sim_data_trans.Delta(end);
108  t_part_reduced_data{t_part_ind}.a0{1} = sim_data_trans.a(:,end);
109  end
110  end
111 
112  if model.verbose > 4
113  disp(['rb simulation of partition ',num2str(t_part_ind)]);
114  end
115  t_part_sim_data{t_part_ind} = rb_simulation(base_model, t_part_reduced_data{t_part_ind});
116 end
117 
118 
119 %glue together sim_data
120 sim_data.t_part_sim_data = t_part_sim_data;
121 sim_data.a = [];
122 sim_data.Delta = [];
123 if isfield(t_part_sim_data{1},'s')
124  sim_data.s = [];
125  sim_data.Delta_s = [];
126 end
127 
128 
129 %sim_data.a=t_part_sim_data{1}.a;
130 sim_data.Delta = t_part_sim_data{1}.Delta;
131 if isfield(t_part_sim_data{1},'s')
132  sim_data.s = t_part_sim_data{1}.s;
133  sim_data.Delta_s = t_part_sim_data{1}.Delta_s;
134 end
135 if stop_part > 1
136  for ind=2:stop_part
137  len = length(t_part_sim_data{ind}.a(1,:));
138  %sim_data.a=[sim_data.a,t_part_sim_data{ind}.a(:,2:len)];
139  if ~model.transition_model
140  sim_data.Delta = [sim_data.Delta,...
141  t_part_sim_data{ind}.Delta(2:len)];
142  if isfield(t_part_sim_data{1},'s')
143  sim_data.s = [sim_data.s,...
144  t_part_sim_data{ind}.s(2:len)];
145  sim_data.Delta_s = [sim_data.Delta_s,...
146  t_part_sim_data{ind}.Delta_s(2:len)];
147  end
148  else
149  sim_data.Delta = [sim_data.Delta,...
150  t_part_sim_data{ind}.Delta(1:len)];
151  if isfield(t_part_sim_data{1},'s')
152  sim_data.s = [sim_data.s,...
153  t_part_sim_data{ind}.s(1:len)];
154  sim_data.Delta_s = [sim_data.Delta_s,...
155  t_part_sim_data{ind}.Delta_s(1:len)];
156  end
157  end
158  end
159 end
160 
161 
162 
163