rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
dom_dec_rb_simulation.m
Go to the documentation of this file.
1 function rb_sim_data = dom_dec_rb_simulation(model,reduced_data)
2 % function rb_sim_data = dom_dec_rb_simulation(model,reduced_data)
3 % Realization of the iterative schema for RB methods according to
4 % my diploma thesis.
5 %
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
13 
14 % I. Maier, 19.07.2011
15 
16 rb_sim_data = [];
17 rb_sim_data.reached_maxiter = 0;
18 rb_sim_data.reached_tolerance = 0;
19 
20 model.decomp_mode = 2;
21 
22 dir = model.dirichlet_side;
23 no_dir = mod(dir,2)+1;
24 
25 % get coefficients
26 [A_coeff, f_coeff, ~, ~] = model.operators(model,[]);
27 
28 AN = cell(1,2);
29 fN = cell(1,2);
30 for i = 1:2
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});
33 end;
34 
35 % generate matrizes for iterative schema
36 AN_00 = cell(1,2);
37 AN_0G = cell(1,2);
38 for i = 1:2
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});
41 end;
42 
43 
44 if model.RB_approximate_thetaN
45  %%%%%%%%%%%% approximation of optimal theta
46 
47  % generate random test vectors
48  ntest_vecs = 10000;
49  intervals = cell(1,length(reduced_data.I_G{no_dir}));
50  for j = 1:length(intervals)
51  intervals{j} = [0,1];
52  end;
53  Rtest_G = rand_uniform(ntest_vecs,intervals);
54 
55  % compute harmonic extensions:
56  Rtest_norm = cell(1,2);
57  for i = 1:2
58  Rtest_0 = AN_00{i} \ (-AN_0G{i}*Rtest_G);
59  Rtest = [Rtest_0; Rtest_G];
60 
61  Rtest_norm{i} = sum((AN{i}' * Rtest) .* Rtest,1);
62  end;
63 
64  sigma = max( Rtest_norm{dir} ./ Rtest_norm{no_dir} );
65  tau = max( Rtest_norm{no_dir} ./ Rtest_norm{dir} );
66 
67  RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
68 
69 end;
70 
71 restart = 0;
72 rb_sim_data.reached_maxiter = 1;
73 while rb_sim_data.reached_maxiter
74 
75  rb_sim_data.reached_maxiter = 0;
76 
77  % initialize iteration
78  uN = cell(1,2);
79  uN_old = cell(1,2);
80  uN_tilde = cell(1,2);
81  zN = cell(1,2);
82  BN = zeros(reduced_data.N{no_dir},1);
83 
84  rb_sim_data.uN = cell(1,2);
85  for i = 1:2
86  rb_sim_data.uN{i} = zeros(reduced_data.N{i},model.RB_maxiterN);
87  end;
88 
89  for i = 1:2
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);
93  end;
94 
95  if model.RB_approximate_thetaN == 0
96  a = [];
97  sigma = 0;
98  tau = 0;
99  RB_thetaN = [];
100  end;
101 
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};
106 
107  for i = 1:2
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});
111  end;
112 
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);
117 
118  if (restart == 2 || ~model.RB_approximate_thetaN)
119  clear('AN_00');
120  clear('AN_0G');
121  clear('fN');
122  end;
123 
124  %%%%%%%%%%%% iterative schema %%%%%%%%%%%%
125  continue_loop = 1;
126  numiter = 0;
127  diff_norm = zeros(1,2);
128  while continue_loop
129 
130  % ...
131  numiter = numiter+1;
132  for i = 1:2
133  uN_old{i} = uN{i};
134  end;
135 
136  % ...
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});
141 
142  % ...
143  if model.RB_approximate_thetaN == 0
144  a = (zN{dir}'*AN{dir}*zN{dir}) / (uN_tilde{no_dir}'*AN{no_dir}* ...
145  uN_tilde{no_dir});
146  sigma = max(sigma,a);
147  tau = max(tau,1/a);
148  RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
149  end;
150 
151  % ...
152  uN{dir} = uN{dir} + RB_thetaN*(zN{dir}-uN_tilde{dir});
153  uN_tilde{dir} = uN_tilde{dir} + RB_thetaN*(zN{dir}- ...
154  uN_tilde{dir});
155 
156  % ...
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;
159 
160  % ...
161  uN{no_dir} = uN_0_no_dir + zN{no_dir};
162  uN_tilde{no_dir} = uN_tilde{no_dir} + uN{no_dir} - ...
163  uN_old{no_dir};
164 
165  % save uN
166  for i = 1:2
167  rb_sim_data.uN{i}(:,numiter) = uN{i};
168  end;
169 
170  % stopping criteria
171  for i = 1:2
172  diff_norm(i) = sqrt((uN{i}-uN_old{i})' * AN{i} * ...
173  (uN{i}-uN_old{i}));
174  end;
175 
176  if sum(diff_norm) < model.RB_sim_tol
177  continue_loop = 0;
178  rb_sim_data.reached_tolerance = 1;
179  end;
180  if numiter == model.RB_maxiterN
181  continue_loop = 0;
182  rb_sim_data.reached_maxiter = 1;
183  end;
184 
185  end;
186 
187  rb_sim_data.RB_thetaN = RB_thetaN;
188  rb_sim_data.numiter = numiter;
189  for i = 1:2
190  rb_sim_data.uN{i} = rb_sim_data.uN{i}(:,1:numiter);
191  end;
192 
193  % if reached_maxiter procedure is started again 2 times
194  % with new relaxation parameter
195  if (restart == 2 || ~model.RB_approximate_thetaN)
196  break;
197  end;
198  RB_thetaN = RB_thetaN/2;
199  restart = restart+1;
200 
201 end;
202 
203 if model.base_model.compute_output_functional && ~model.base_model.dual_mode
204 
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;
208 
209  model.base_model.decomp_mode = model.decomp_mode;
210 
211  sN = 0;
212  sN1 = 0;
213  v_coeff = model.operators_output(model.base_model, []);
214 
215  % l(u_N)
216  for i = 1:2
217  vN = lincomb_sequence(reduced_data.vN_comp{i},v_coeff);
218  sN = sN + (vN(:)') * rb_sim_data.uN{i}(:,numiter);
219  end
220 
221  % l(R_1gu_{N,i})
222  for i = 1:2
223  vN = lincomb_sequence(reduced_data.vNext_comp{i},v_coeff);
224  sN = sN + (-1)^i * (vN(:)') * rb_sim_data.uN{i}(:,numiter);
225  end
226 
227  % f(\psi_N)
228  for i = 1:2
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);
231  end
232 
233  % f(R_2g\psi_{N,i})
234  for i = 1:2
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);
237  end
238 
239  % A(u_N,\psi_N)
240  for i = 1:2
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);
244  end
245 
246  % A(u_N,R_2g\psi_{N,i})
247  for i = 1:2
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);
251  end
252 
253  % A(R_1gu_{N,i},\psi_N)
254  for i = 1:2
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);
258  end
259 
260  rb_sim_data.sN = sN - sN1;
261 
262 end
263 
264 
265 %%%%%%%%%%%% error estimation %%%%%%%%%%%%
266 
267 % jump over interface
268 jumpex_norm_sqr = zeros(numiter,1);
269 for j = 1:numiter
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);
276 end;
277 jumpex_norm_sqr(jumpex_norm_sqr < 0) = 0;
278 
279 % residual
280 res_norm_sqr = cell(1,2);
281 for i = 1:2
282  res_norm_sqr{i} = zeros(numiter,1);
283  for j = 1:numiter
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;
288  end;
289  res_norm_sqr{i}(res_norm_sqr{i} < 0) = 0;
290 
291 end;
292 
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
296 
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);
300 else
301 
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);
307 end
308 
309 % complete error estimator
310 rb_sim_data.Delta = Delta_part1 + Delta_part2;
311 
312 % output error bound
313 if model.base_model.compute_output_functional && ~model.base_model.dual_mode
314 
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;
317 end
function rb_sim_data = dom_dec_rb_simulation(model, reduced_data)
Realization of the iterative schema for RB methods according to my diploma thesis.