rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
lin_evol_opt_output_time_integrated.m
1 function sim_data = lin_evol_opt_output_time_integrated(model, sim_data, varargin)
2 %function sim_data = lin_evol_opt_output_time_integrated(model, sim_data, varargin)
3 %
4 % This function returns the time integrated output
5 %
6 % J(u) = 1/Tlen \int_0^T\int_{\Omega} f u dOmega dt
7 %
8 % where f is a suitable kernel defined by model.output_ptr ...oder so
9 % aehnlich
10 %
11 
12 % Markus Dihlmann 01.08.2012
13 
14 
15 %decide if it's a p-part model
16 if isfield(model,'p_part_ranges')
17  %yes_p_part model
18  model = model.base_model;
19 end
20 
21 
22 %calculate the length of the time interval
23 if isfield(model,'save_time_indices')
24  Tlen = (model.stime_stop-model.stime_start)/length(model.save_time_indices);
25 elseif isfield(model,'base_model')&&(isfield(model.base_model,'save_time_indices'))
26  Tlen = (model.stime_stop-model.stime_start)/length(model.base_model.save_time_indices);
27 else
28  Tlen = (model.stime_stop - model.stime_start)/model.nt;
29 end
30 
31 
32 if ~isfield(model, 'starting_time_step')
33  model.starting_time_step = 0;
34 end
35 if ~isfield(model,'stopping_time_step')
36  model.stopping_time_step = model.nt;
37 end
38 if isfield(model,'initial_value_output')
39  initial_value_output = model.initial_value_output;
40  if isfield(model, 'initial_value_output_Delta_s')
41  initial_value_output_Delta_s = model.initial_value_output_Delta_s;
42  initial_value_output_Delta_s_l2 = model.initial_value_output_Delta_s_l2;
43  end
44  if model.compute_derivative_info
45  initial_value_output_gradient = model.initial_value_output_gradient;
46  if isfield(model, 'initial_value_output_Delta_s_grad')
47  initial_value_output_Delta_s_grad = model.initial_value_output_Delta_s_grad;
48  initial_value_output_Delta_s_grad_l2 = model.initial_value_output_Delta_s_grad_l2;
49  end
50  end
51 else
52  initial_value_output = 0;
53  initial_value_output_Delta_s = 0;
54  initial_value_output_Delta_s_l2 = 0;
55  if model.compute_derivative_info
56  if isfield(sim_data,'c')
57  initial_value_output_gradient = zeros(length(sim_data.c),1);
58  initial_value_output_Delta_s_grad = zeros(length(sim_data.c),1);
59  initial_value_output_Delta_s_grad_l2 = zeros(length(sim_data.c),1);
60  elseif isfield(sim_data,'U_der')
61  initial_value_output_gradient = zeros(length(sim_data.U_der),1);
62  end
63 
64  end
65 end
66 
67 
68 if isfield(varargin{1},'grid')
69  % --> model_data
70  model_data = varargin{1};
71 
72  U=sim_data.U;
73  nt = size(U,2);
74 
75  %distance between two time steps
76  fac = model.save_time_indices(end-1) - model.save_time_indices(end-2);
77  if ~(nt == ceil(model.nt/fac))
78  warning(['dt and fac in get output time integration is wrong... maybe... error',...
79  num2str(nt-ceil(model.nt/fac))])
80  end
81 
82  %in case of t-partition model...
83  t_ind = find(((model.save_time_indices)>=model.starting_time_step)&...
84  ((model.save_time_indices)<=model.stopping_time_step));
85  %t_ind = t_ind;
86 
87  t_s_ind = find(((model.save_time_indices)>=model.stime_start)&...
88  ((model.save_time_indices)<=model.stime_stop));
89  t_eval=find((t_ind>=t_s_ind(1))&(t_ind<=t_s_ind(end)));
90  nt_eval = length(t_eval);
91 
92  %output field
93  model.decomp_mode =1;
94  v = model.operators_output(model, model_data);
95 
96  y = initial_value_output.*ones(1,nt);
97 
98  %time integration
99  if ~isempty(t_eval)
100  y(t_eval(1)) = fac.*model.dt.*(v{1}')*U(:,t_eval(1))+ initial_value_output;
101  for t = 2:nt_eval
102  y(t_eval(t)) = y(t_eval(t)-1) + fac/Tlen.*model.dt.*(v{1}')*U(:,t_eval(t));
103  end
104  y(t_eval(end)+1:end) =y(t_eval(end));
105  sim_data.y = y;
106  if model.compute_derivative_info
107 
108  U_der = sim_data.U_der;
109  y_der = repmat(initial_value_output_gradient,1,nt);
110  for i=1:length(U_der)
111  y_der(i,t_eval(1)) = fac/Tlen.*model.dt.*(v{1}')*U_der{i}(:,t_eval(1))+ initial_value_output_gradient(i);
112  for t =2:nt_eval
113  y_der(i,t_eval(t)) = y_der(i,t_eval(t)-1)+fac.*model.dt.*(v{1}')*U_der{i}(:,t_eval(t));
114  end
115  y_der(i,t_eval(end)+1:end) = y_der(i,t_eval(end));
116  end
117  sim_data.y_der = y_der;
118  end
119  else
120  sim_data.y = y;
121  if model.compute_derivative_info
122  sim_data.y_der = repmat(initial_value_output_gradient,1,nt);
123  end
124  end
125 
126 else
127 
128  %--> reduced_data
129  reduced_data = varargin{1};
130  a = sim_data.a;
131  nt = size(a,2);
132  s = initial_value_output.*ones(1,nt);
133 
134  %fix start end end time of time integration
135  %t1 = model.stime_start;
136  %t2 = model.stime_stop;
137 
138  %in case of t-part model this interval is not always included in the
139  %t-partition interval
140  %so find out which time indices will be simulated
141  t_ind = model.starting_time_step:model.stopping_time_step;
142  %t_ind = t_ind+1;
143  if length(t_ind)~=nt
144  error('Hier stimmt was nicht')
145  end
146  t_eval=find((t_ind>=model.stime_start)&(t_ind<=model.stime_stop));
147  nt_eval = length(t_eval);
148 
149  %time integration
150  if ~isempty(t_eval)
151  s(t_eval(1)) = model.dt.*reduced_data.s_RB'*a(:,t_eval(1))+initial_value_output;
152  for i =2:nt_eval
153  s(t_eval(i)) = s(t_eval(i)-1) + model.dt/Tlen.*reduced_data.s_RB'*a(:,t_eval(i));
154  end
155  s(t_eval(end)+1:end) = s(t_eval(end));
156 
157 
158 
159  if isfield(model,'s_l2norm')
160  Delta_s = initial_value_output_Delta_s.*ones(1,nt);
161  Delta_s(t_eval(1)) = model.dt.*model.s_l1norm * sim_data.Delta(t_eval(1))+initial_value_output_Delta_s;
162  for i = 2:nt_eval
163  Delta_s(t_eval(i)) = Delta_s(t_eval(i)-1) + model.dt.*model.s_l1norm * sim_data.Delta(t_eval(i));
164  end
165  Delta_s(t_eval(end):end) = Delta_s(t_eval(end));
166 
167  Delta_s_l2 = (initial_value_output_Delta_s_l2)^2.*ones(1,nt);
168  Delta_s_l2(t_eval(1)) = model.dt.*model.s_l2norm * (sim_data.Delta(t_eval(1)))^2+(initial_value_output_Delta_s_l2)^2;
169  for i = 2:nt_eval
170  Delta_s_l2(t_eval(i)) = Delta_s_l2(t_eval(i)-1) + model.dt.*model.s_l2norm * (sim_data.Delta(t_eval(i)))^2;
171  end
172  Delta_s_l2(t_eval(end):end) = Delta_s_l2(t_eval(end));
173  Delta_s_l2 = sqrt(Delta_s_l2);
174 
175  else
176  if (model.verbose >=5)
177  disp('warning: no L2_norm for output defined in lin_evol_rb_simulation...')
178  end
179  end
180 
181 
182  if model.compute_derivative_info
183  %derivative output and error estimation of gradient
184  %sum=0;%for l2-norm
185  c = sim_data.c;
186  Delta_der = sim_data.Delta_der;
187  Delta_s_grad = zeros(length(c),nt);
188  Delta_s_grad_l2 = zeros(length(c),nt);
189  s_der = cell(1,length(c));
190  for i=1:length(c)
191  s_der{i} = initial_value_output_gradient(i).*ones(1,nt);
192  s_der{i}(t_eval(1)) = model.dt/Tlen.*reduced_data.s_RB_der{i}'*c{i}(:,t_eval(1))+initial_value_output_gradient(i);
193  for t = 2:nt_eval
194  s_der{i}(t_eval(t)) = s_der{i}(t_eval(t)-1) + model.dt.*reduced_data.s_RB_der{i}'*c{i}(:,t_eval(t));
195  end
196  s_der{i}(t_eval(end):end) = s_der{i}(t_eval(end));
197  %sum = sum + max(Delta_der(i,:))^2;
198 
199  Delta_s_grad(i,:) = initial_value_output_Delta_s_grad(i).*ones(1,nt);
200  Delta_s_grad(i,t_eval(1)) = model.dt.*model.s_l1norm.*Delta_der(i,t_eval(1))+initial_value_output_Delta_s_grad(i);
201  for t=2:nt_eval
202  Delta_s_grad(i,t_eval(t)) = Delta_s_grad(i,t_eval(t-1))+ model.dt.*model.s_l1norm.*Delta_der(i,t_eval(t));
203  end
204  Delta_s_grad(i,t_eval(end):end) = Delta_s_grad(i,t_eval(end));
205 
206  Delta_s_grad_l2(i,:) = (initial_value_output_Delta_s_grad_l2(i))^2.*ones(1,nt);
207  Delta_s_grad_l2(i,t_eval(1)) = model.dt.*model.s_l2norm.*(Delta_der(i,t_eval(1)))^2+(initial_value_output_Delta_s_grad_l2(i))^2;
208  for t=2:nt_eval
209  Delta_s_grad_l2(i,t_eval(t)) = Delta_s_grad_l2(i,t_eval(t-1))+ model.dt.*model.s_l2norm.*(Delta_der(i,t_eval(t)))^2;
210  end
211  Delta_s_grad_l2(i,t_eval(end):end) = Delta_s_grad_l2(i,t_eval(end));
212  Delta_s_grad_l2(i,:) = sqrt(Delta_s_grad_l2(i,:));
213 
214  end
215  sim_data.s_der = s_der;
216  sim_data.Delta_s_grad = Delta_s_grad;
217  sim_data.Delta_s_grad_l2 = Delta_s_grad_l2;
218  %simulation_data.Delta_s_grad = model.s_l2norm * Delta_der;
219  end
220  else
221  %no time integration in this simulation time interval
222  s = initial_value_output.*ones(1,nt);
223  Delta_s = initial_value_output_Delta_s.*ones(1,nt);
224  Delta_s_l2 = initial_value_output_Delta_s_l2.*ones(1,nt);
225  if model.compute_derivative_info
226  Delta_s_grad = repmat(initial_value_output_Delta_s_grad,1,nt);
227  Delta_s_grad_l2 = repmat(initial_value_output_Delta_s_grad_l2,1,nt);
228  for i=1:length(initial_value_output_gradient)
229  s_der{i} = initial_value_output_gradient(i).*ones(1,nt);
230  end
231  end
232  end
233 
234 
235  sim_data.s = s;
236  sim_data.Delta_s = Delta_s;
237  sim_data.Delta_s_l2 = Delta_s_l2;
238  if model.compute_derivative_info
239  sim_data.s_der = s_der;
240  sim_data.Delta_s_grad = Delta_s_grad;
241  sim_data.Delta_s_grad_l2 = Delta_s_grad_l2;
242  end
243 end