3 % Realization of the iterative schema
for RB methods according to
6 % Generated fields of rb_sim_data:
7 % uN: cell, coefficient vectors of all iteratives
8 % RB_thetaN: relaxation-parameter
9 % numiter: number of iterations
10 % reached_maxiter: indicates the cause of termination
11 % reached_tolerance: indicates the cause of termination
12 % Delta: vector of error estimates
for all iteratives in uN
14 % I. Maier, 19.07.2011
17 rb_sim_data.reached_maxiter = 0;
18 rb_sim_data.reached_tolerance = 0;
20 model.decomp_mode = 2;
22 dir = model.dirichlet_side;
23 no_dir = mod(dir,2)+1;
26 [A_coeff, f_coeff, ~, ~] = model.operators(model,[]);
31 AN{i} = lincomb_sequence(reduced_data.AN_comp{i},A_coeff{i});
32 fN{i} = lincomb_sequence(reduced_data.fN_comp{i},f_coeff{i});
35 % generate matrizes
for iterative schema
39 AN_00{i} = AN{i}(reduced_data.I_0{i},reduced_data.I_0{i});
40 AN_0G{i} = AN{i}(reduced_data.I_0{i},reduced_data.I_G{i});
44 if model.RB_approximate_thetaN
45 %%%%%%%%%%%% approximation of optimal theta
47 % generate random test vectors
49 intervals = cell(1,length(reduced_data.I_G{no_dir}));
50 for j = 1:length(intervals)
53 Rtest_G = rand_uniform(ntest_vecs,intervals);
55 % compute harmonic extensions:
56 Rtest_norm = cell(1,2);
58 Rtest_0 = AN_00{i} \ (-AN_0G{i}*Rtest_G);
59 Rtest = [Rtest_0; Rtest_G];
61 Rtest_norm{i} = sum((AN{i}
' * Rtest) .* Rtest,1);
64 sigma = max( Rtest_norm{dir} ./ Rtest_norm{no_dir} );
65 tau = max( Rtest_norm{no_dir} ./ Rtest_norm{dir} );
67 RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
72 rb_sim_data.reached_maxiter = 1;
73 while rb_sim_data.reached_maxiter
75 rb_sim_data.reached_maxiter = 0;
77 % initialize iteration
82 BN = zeros(reduced_data.N{no_dir},1);
84 rb_sim_data.uN = cell(1,2);
86 rb_sim_data.uN{i} = zeros(reduced_data.N{i},model.RB_maxiterN);
90 uN{i} = zeros(reduced_data.N{i},1);
91 uN_tilde{i} = zeros(reduced_data.N{i},1);
92 zN{i} = zeros(reduced_data.N{i},1);
95 if model.RB_approximate_thetaN == 0
102 uN{dir}(reduced_data.I_0{dir}) = AN_00{dir} \ ...
103 fN{dir}(reduced_data.I_0{dir});
104 uN{no_dir} = AN{no_dir} \ fN{no_dir};
105 uN_0_no_dir = uN{no_dir};
108 uN_tilde{i}(reduced_data.I_0{i}) = ...
109 AN_00{i} \ (-AN_0G{i}*uN{i}(reduced_data.I_G{i}));
110 uN_tilde{i}(reduced_data.I_G{i}) = uN{i}(reduced_data.I_G{i});
113 AN_dir = AN_00{dir}^(-1) * (-AN_0G{dir});
114 fN_dir_G = fN{dir}(reduced_data.I_G{dir});
115 AN_dir_G = AN{dir}(reduced_data.I_G{dir},:);
116 AN_no_dir_inv = AN{no_dir}^(-1);
118 if (restart == 2 || ~model.RB_approximate_thetaN)
124 %%%%%%%%%%%% iterative schema %%%%%%%%%%%%
127 diff_norm = zeros(1,2);
137 zN{dir}(reduced_data.I_0{dir}) = AN_dir * ...
138 uN_tilde{no_dir}(reduced_data.I_G{no_dir});
139 zN{dir}(reduced_data.I_G{dir}) = ...
140 uN_tilde{no_dir}(reduced_data.I_G{no_dir});
143 if model.RB_approximate_thetaN == 0
144 a = (zN{dir}'*AN{dir}*zN{dir}) / (uN_tilde{no_dir}
'*AN{no_dir}* ...
146 sigma = max(sigma,a);
148 RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
152 uN{dir} = uN{dir} + RB_thetaN*(zN{dir}-uN_tilde{dir});
153 uN_tilde{dir} = uN_tilde{dir} + RB_thetaN*(zN{dir}- ...
157 BN(reduced_data.I_G{no_dir}) = fN_dir_G - AN_dir_G*uN{dir};
158 zN{no_dir} = AN_no_dir_inv * BN;
161 uN{no_dir} = uN_0_no_dir + zN{no_dir};
162 uN_tilde{no_dir} = uN_tilde{no_dir} + uN{no_dir} - ...
167 rb_sim_data.uN{i}(:,numiter) = uN{i};
172 diff_norm(i) = sqrt((uN{i}-uN_old{i})' * AN{i} * ...
176 if sum(diff_norm) < model.RB_sim_tol
178 rb_sim_data.reached_tolerance = 1;
180 if numiter == model.RB_maxiterN
182 rb_sim_data.reached_maxiter = 1;
187 rb_sim_data.RB_thetaN = RB_thetaN;
188 rb_sim_data.numiter = numiter;
190 rb_sim_data.uN{i} = rb_sim_data.uN{i}(:,1:numiter);
193 %
if reached_maxiter procedure is started again 2 times
194 % with
new relaxation parameter
195 if (restart == 2 || ~model.RB_approximate_thetaN)
198 RB_thetaN = RB_thetaN/2;
203 if model.base_model.compute_output_functional && ~model.base_model.dual_mode
205 model.base_model.dual_mode = 1;
206 rb_dual_sim_data = rb_simulation(model, reduced_data.dual_reduced_data);
207 model.base_model.dual_mode = 0;
209 model.base_model.decomp_mode = model.decomp_mode;
213 v_coeff = model.operators_output(model.base_model, []);
217 vN = lincomb_sequence(reduced_data.vN_comp{i},v_coeff);
218 sN = sN + (vN(:)
') * rb_sim_data.uN{i}(:,numiter);
223 vN = lincomb_sequence(reduced_data.vNext_comp{i},v_coeff);
224 sN = sN + (-1)^i * (vN(:)') * rb_sim_data.uN{i}(:,numiter);
229 vN = lincomb_sequence(reduced_data.fN_d_comp{i},f_coeff{i});
230 sN1 = sN1 + (vN(:)
') * rb_dual_sim_data.uN{i}(:,rb_dual_sim_data.numiter);
235 vN = lincomb_sequence(reduced_data.vNfR_comp{i},f_coeff{dir});
236 sN1 = sN1 - (-1)^i * (vN(:)') * rb_dual_sim_data.uN{i}(:,rb_dual_sim_data.numiter);
241 vN = lincomb_sequence(reduced_data.AN_pd_comp{i},A_coeff{i}) * ...
242 rb_sim_data.uN{i}(:,numiter);
243 sN1 = sN1 - (vN(:)
') * rb_dual_sim_data.uN{i}(:,rb_dual_sim_data.numiter);
246 % A(u_N,R_2g\psi_{N,i})
248 vN = lincomb_sequence(reduced_data.vNAR1_comp{i},A_coeff{no_dir}) * ...
249 rb_sim_data.uN{no_dir}(:,numiter);
250 sN1 = sN1 + (-1)^i * (vN(:)') * rb_dual_sim_data.uN{i}(:,rb_dual_sim_data.numiter);
253 % A(R_1gu_{N,i},\psi_N)
255 vN = lincomb_sequence(reduced_data.vNAR2_comp{i},A_coeff{dir}) * ...
256 rb_sim_data.uN{i}(:,numiter);
257 sN1 = sN1 - (-1)^i * (vN(:)
') * rb_dual_sim_data.uN{dir}(:,rb_dual_sim_data.numiter);
260 rb_sim_data.sN = sN - sN1;
265 %%%%%%%%%%%% error estimation %%%%%%%%%%%%
267 % jump over interface
268 jumpex_norm_sqr = zeros(numiter,1);
270 jumpex_norm_sqr(j) = rb_sim_data.uN{dir}(:,j)' ...
271 * reduced_data.R_11 * rb_sim_data.uN{dir}(:,j) ...
272 - 2*rb_sim_data.uN{dir}(:,j)
' ...
273 * reduced_data.R_12 * rb_sim_data.uN{no_dir}(:,j) ...
274 + rb_sim_data.uN{no_dir}(:,j)' ...
275 * reduced_data.R_22 * rb_sim_data.uN{no_dir}(:,j);
277 jumpex_norm_sqr(jumpex_norm_sqr < 0) = 0;
280 res_norm_sqr = cell(1,2);
282 res_norm_sqr{i} = zeros(numiter,1);
284 neg_a1uN_coeff = -A_coeff{1} * rb_sim_data.uN{1}(:,j)
';
285 neg_a2uN_coeff = -A_coeff{2} * rb_sim_data.uN{2}(:,j)';
286 res_coeff = [f_coeff{1}; neg_a1uN_coeff(:); neg_a2uN_coeff(:)];
287 res_norm_sqr{i}(j) = res_coeff
' * reduced_data.G{i} * res_coeff;
289 res_norm_sqr{i}(res_norm_sqr{i} < 0) = 0;
293 % error estimator parts
294 if model.base_model.compute_output_functional || model.base_model.dual_mode
295 % here: use \bar{u}_N^n approximation
297 Delta_part1 = sqrt(res_norm_sqr{1} + res_norm_sqr{2})/ ...
298 sqrt(model.coercivity_alpha(model));
299 Delta_part2 = sqrt(model.continuity_gamma(model)) * sqrt(jumpex_norm_sqr);
302 Delta_part1 = sqrt(res_norm_sqr{1} + res_norm_sqr{2})/ ...
303 model.coercivity_alpha(model);
304 Delta_part2 = (1+sqrt(model.continuity_gamma(model)/ ...
305 model.coercivity_alpha(model))) * ...
306 sqrt(jumpex_norm_sqr);
309 % complete error estimator
310 rb_sim_data.Delta = Delta_part1 + Delta_part2;
313 if model.base_model.compute_output_functional && ~model.base_model.dual_mode
315 rb_sim_data.Delta_s = rb_sim_data.Delta(end) * rb_dual_sim_data.Delta(end);
316 rb_sim_data.rb_dual_sim_data = rb_dual_sim_data;
function rb_sim_data = dom_dec_rb_simulation(model, reduced_data)
Realization of the iterative schema for RB methods according to my diploma thesis.