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)
4 % This
function returns the time integrated output
6 % J(u) = 1/Tlen \int_0^T\int_{\Omega} f u dOmega dt
8 % where f is a suitable kernel defined by model.output_ptr ...oder so
12 % Markus Dihlmann 01.08.2012
15 %decide
if it
's a p-part model
16 if isfield(model,'p_part_ranges
')
18 model = model.base_model;
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);
28 Tlen = (model.stime_stop - model.stime_start)/model.nt;
32 if ~isfield(model, 'starting_time_step
')
33 model.starting_time_step = 0;
35 if ~isfield(model,'stopping_time_step
')
36 model.stopping_time_step = model.nt;
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;
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;
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);
68 if isfield(varargin{1},'grid
')
70 model_data = varargin{1};
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))])
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));
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);
94 v = model.operators_output(model, model_data);
96 y = initial_value_output.*ones(1,nt);
100 y(t_eval(1)) = fac.*model.dt.*(v{1}')*U(:,t_eval(1))+ initial_value_output;
102 y(t_eval(t)) = y(t_eval(t)-1) + fac/Tlen.*model.dt.*(v{1}
')*U(:,t_eval(t));
104 y(t_eval(end)+1:end) =y(t_eval(end));
106 if model.compute_derivative_info
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);
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));
115 y_der(i,t_eval(end)+1:end) = y_der(i,t_eval(end));
117 sim_data.y_der = y_der;
121 if model.compute_derivative_info
122 sim_data.y_der = repmat(initial_value_output_gradient,1,nt);
129 reduced_data = varargin{1};
132 s = initial_value_output.*ones(1,nt);
134 %fix start end end time of time integration
135 %t1 = model.stime_start;
136 %t2 = model.stime_stop;
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;
144 error('Hier stimmt was nicht
')
146 t_eval=find((t_ind>=model.stime_start)&(t_ind<=model.stime_stop));
147 nt_eval = length(t_eval);
151 s(t_eval(1)) = model.dt.*reduced_data.s_RB'*a(:,t_eval(1))+initial_value_output;
153 s(t_eval(i)) = s(t_eval(i)-1) + model.dt/Tlen.*reduced_data.s_RB
'*a(:,t_eval(i));
155 s(t_eval(end)+1:end) = s(t_eval(end));
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;
163 Delta_s(t_eval(i)) = Delta_s(t_eval(i)-1) + model.dt.*model.s_l1norm * sim_data.Delta(t_eval(i));
165 Delta_s(t_eval(end):end) = Delta_s(t_eval(end));
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;
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;
172 Delta_s_l2(t_eval(end):end) = Delta_s_l2(t_eval(end));
173 Delta_s_l2 = sqrt(Delta_s_l2);
176 if (model.verbose >=5)
177 disp('warning: no L2_norm
for output defined in lin_evol_rb_simulation...
')
182 if model.compute_derivative_info
183 %derivative output and error estimation of gradient
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));
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);
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));
196 s_der{i}(t_eval(end):end) = s_der{i}(t_eval(end));
197 %sum = sum + max(Delta_der(i,:))^2;
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);
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));
204 Delta_s_grad(i,t_eval(end):end) = Delta_s_grad(i,t_eval(end));
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;
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;
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,:));
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;
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);
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;