1 function rb_sim_data = dom_dec_rb_simulation(model,reduced_data)
2 %
function rb_sim_data = dom_dec_rb_simulation(model,reduced_data)
4 % realization of the iterative schema
for RB methods according to
7 % Generated fields of rb_sim_data:
8 % uN: cell, coefficient vectors of all iteratives
9 % RB_thetaN: relaxation-parameter
10 % numiter: number of iterations
11 % reached_maxiter: indicates the cause of termination
12 % reached_tolerance: indicates the cause of termination
13 % Delta: vector of error estimates for all iteratives in uN
15 % I. Maier, 19.07.2011
18 rb_sim_data.reached_maxiter = 0;
19 rb_sim_data.reached_tolerance = 0;
21 model.decomp_mode = 2;
23 dir = model.dirichlet_side;
24 no_dir = mod(dir,2)+1;
27 [A_coeff, f_coeff, dummy1, dummy2] = model.operators(model,[]);
32 AN{i} = lincomb_sequence(reduced_data.AN_comp{i},A_coeff{i});
33 fN{i} = lincomb_sequence(reduced_data.fN_comp{i},f_coeff{i});
36 % generate matrizes
for iterative schema
40 AN_00{i} = AN{i}(reduced_data.I_0{i},reduced_data.I_0{i});
41 AN_0G{i} = AN{i}(reduced_data.I_0{i},reduced_data.I_G{i});
45 if model.RB_approximate_thetaN
46 %%%%%%%%%%%% approximation of optimal theta
48 % generate random test vectors
50 intervals = cell(1,length(reduced_data.I_G{no_dir}));
51 for j = 1:length(intervals)
54 Rtest_G = rand_uniform(ntest_vecs,intervals);
56 % compute harmonic extensions:
57 Rtest_norm = cell(1,2);
59 Rtest_0 = AN_00{i} \ (-AN_0G{i}*Rtest_G);
60 Rtest = [Rtest_0; Rtest_G];
62 Rtest_norm{i} = sum((AN{i}
' * Rtest) .* Rtest,1);
65 sigma = max( Rtest_norm{dir} ./ Rtest_norm{no_dir} );
66 tau = max( Rtest_norm{no_dir} ./ Rtest_norm{dir} );
68 RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
73 rb_sim_data.reached_maxiter = 1;
74 while rb_sim_data.reached_maxiter
76 rb_sim_data.reached_maxiter = 0;
78 % initialize iteration
83 BN = zeros(reduced_data.N{no_dir},1);
85 rb_sim_data.uN = cell(1,2);
87 rb_sim_data.uN{i} = zeros(reduced_data.N{i},model.RB_maxiterN);
91 uN{i} = zeros(reduced_data.N{i},1);
92 uN_tilde{i} = zeros(reduced_data.N{i},1);
93 zN{i} = zeros(reduced_data.N{i},1);
96 if model.RB_approximate_thetaN == 0
103 uN{dir}(reduced_data.I_0{dir}) = AN_00{dir} \ ...
104 fN{dir}(reduced_data.I_0{dir});
105 uN{no_dir} = AN{no_dir} \ fN{no_dir};
106 uN_0_no_dir = uN{no_dir};
109 uN_tilde{i}(reduced_data.I_0{i}) = ...
110 AN_00{i} \ (-AN_0G{i}*uN{i}(reduced_data.I_G{i}));
111 uN_tilde{i}(reduced_data.I_G{i}) = uN{i}(reduced_data.I_G{i});
114 AN_dir = AN_00{dir}^(-1) * (-AN_0G{dir});
115 fN_dir_G = fN{dir}(reduced_data.I_G{dir});
116 AN_dir_G = AN{dir}(reduced_data.I_G{dir},:);
117 AN_no_dir_inv = AN{no_dir}^(-1);
119 if (restart == 2 || ~model.RB_approximate_thetaN)
125 %%%%%%%%%%%% iterative schema %%%%%%%%%%%%
128 diff_norm = zeros(1,2);
138 zN{dir}(reduced_data.I_0{dir}) = AN_dir * ...
139 uN_tilde{no_dir}(reduced_data.I_G{no_dir});
140 zN{dir}(reduced_data.I_G{dir}) = ...
141 uN_tilde{no_dir}(reduced_data.I_G{no_dir});
144 if model.RB_approximate_thetaN == 0
145 a = (zN{dir}'*AN{dir}*zN{dir}) / (uN_tilde{no_dir}
'*AN{no_dir}* ...
147 sigma = max(sigma,a);
149 RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
153 uN{dir} = uN{dir} + RB_thetaN*(zN{dir}-uN_tilde{dir});
154 uN_tilde{dir} = uN_tilde{dir} + RB_thetaN*(zN{dir}- ...
158 BN(reduced_data.I_G{no_dir}) = fN_dir_G - AN_dir_G*uN{dir};
159 zN{no_dir} = AN_no_dir_inv * BN;
162 uN{no_dir} = uN_0_no_dir + zN{no_dir};
163 uN_tilde{no_dir} = uN_tilde{no_dir} + uN{no_dir} - ...
168 rb_sim_data.uN{i}(:,numiter) = uN{i};
173 diff_norm(i) = sqrt((uN{i}-uN_old{i})' * AN{i} * ...
177 if sum(diff_norm) < model.RB_sim_tol
179 rb_sim_data.reached_tolerance = 1;
181 if numiter == model.RB_maxiterN
183 rb_sim_data.reached_maxiter = 1;
188 rb_sim_data.RB_thetaN = RB_thetaN;
189 rb_sim_data.numiter = numiter;
191 rb_sim_data.uN{i} = rb_sim_data.uN{i}(:,1:numiter);
194 %
if reached_maxiter procedure is started again 2 times
195 % with
new relaxation parameter
196 if (restart == 2 || ~model.RB_approximate_thetaN)
199 RB_thetaN = RB_thetaN/2;
204 %%%%%%%%%%%% error estimation %%%%%%%%%%%%
206 % jump over interface
207 jumpex_norm_sqr = zeros(numiter,1);
209 jumpex_norm_sqr(j) = rb_sim_data.uN{dir}(:,j)
' ...
210 * reduced_data.R_11 * rb_sim_data.uN{dir}(:,j) ...
211 - 2*rb_sim_data.uN{dir}(:,j)' ...
212 * reduced_data.R_12 * rb_sim_data.uN{no_dir}(:,j) ...
213 + rb_sim_data.uN{no_dir}(:,j)
' ...
214 * reduced_data.R_22 * rb_sim_data.uN{no_dir}(:,j);
216 jumpex_norm_sqr(find(jumpex_norm_sqr < 0)) = 0;
219 res_norm_sqr = cell(1,2);
221 res_norm_sqr{i} = zeros(numiter,1);
223 neg_a1uN_coeff = -A_coeff{1} * rb_sim_data.uN{1}(:,j)';
224 neg_a2uN_coeff = -A_coeff{2} * rb_sim_data.uN{2}(:,j)
';
225 res_coeff = [f_coeff{1}; neg_a1uN_coeff(:); neg_a2uN_coeff(:)];
226 res_norm_sqr{i}(j) = res_coeff' * reduced_data.G{i} * res_coeff;
228 res_norm_sqr{i}(find(res_norm_sqr{i} < 0)) = 0;
232 % error estimator parts
233 Delta_part1 = sqrt(res_norm_sqr{1} + res_norm_sqr{2})/ ...
234 model.coercivity_alpha(model);
235 Delta_part2 = (1+sqrt(model.continuity_gamma(model)/ ...
236 model.coercivity_alpha(model))) * ...
237 sqrt(jumpex_norm_sqr);
239 % complete error estimator
240 rb_sim_data.Delta = Delta_part1 + Delta_part2;