1 function sim_data = t_part_rb_simulation(model, reduced_data)
2 %
function sim_data = t_part_rb_simulation(model, reduced_data)
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.
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
15 % Generated fields of sim_data:
16 % a: vector of solution coefficients
20 % Markus Dihlmann 15.02.2011
22 if ~isfield(model,
't_part_in_basis_generation')
23 model.t_part_in_basis_generation=0;
29 base_model = model.base_model;
31 if ~isfield(reduced_data,'t_part_reduced_data')
32 error('No complete t-part model. reduced_data lacks T-partition informations!');
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;
41 nr_t_parts = length(model.t_part_range); %number of t-partitions
43 if (isfield(model,'t_part_for_simulation'))&&~isempty(model.t_part_for_simulation)
44 stop_part = model.t_part_for_simulation;
46 stop_part = nr_t_parts;
49 t_part_sim_data = cell(1,stop_part);
51 for t_part_ind = 1:stop_part
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);
57 if ~model.transition_model
58 %transition between the two reduced models is done by a
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};
68 %projection error in t-part transfer
70 err_proj = a_end_tp1
'*a_end_tp1 - a0_tp2'*a0_tp2 ;
74 err_proj = sqrt(err_proj);
77 disp([
'Projection error between partitions: ', num2str(err_proj)]);
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 ...
84 model.t_part_in_basis_generation
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;
91 %transition between the two models is done my a transition
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});
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);
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);
113 disp([
'rb simulation of partition ',num2str(t_part_ind)]);
115 t_part_sim_data{t_part_ind} = rb_simulation(base_model, t_part_reduced_data{t_part_ind});
119 %glue together sim_data
120 sim_data.t_part_sim_data = t_part_sim_data;
123 if isfield(t_part_sim_data{1},
's')
125 sim_data.Delta_s = [];
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;
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)];
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)];