rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
dom_dec_rb_simulation.m
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 %
4 % realization of the iterative schema for RB methods according to
5 % my diploma thesis.
6 %
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
14 
15 % I. Maier, 19.07.2011
16 
17 rb_sim_data = [];
18 rb_sim_data.reached_maxiter = 0;
19 rb_sim_data.reached_tolerance = 0;
20 
21 model.decomp_mode = 2;
22 
23 dir = model.dirichlet_side;
24 no_dir = mod(dir,2)+1;
25 
26 % get coefficients
27 [A_coeff, f_coeff, dummy1, dummy2] = model.operators(model,[]);
28 
29 AN = cell(1,2);
30 fN = cell(1,2);
31 for i = 1:2
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});
34 end;
35 
36 % generate matrizes for iterative schema
37 AN_00 = cell(1,2);
38 AN_0G = cell(1,2);
39 for i = 1:2
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});
42 end;
43 
44 
45 if model.RB_approximate_thetaN
46  %%%%%%%%%%%% approximation of optimal theta
47 
48  % generate random test vectors
49  ntest_vecs = 10000;
50  intervals = cell(1,length(reduced_data.I_G{no_dir}));
51  for j = 1:length(intervals)
52  intervals{j} = [0,1];
53  end;
54  Rtest_G = rand_uniform(ntest_vecs,intervals);
55 
56  % compute harmonic extensions:
57  Rtest_norm = cell(1,2);
58  for i = 1:2
59  Rtest_0 = AN_00{i} \ (-AN_0G{i}*Rtest_G);
60  Rtest = [Rtest_0; Rtest_G];
61 
62  Rtest_norm{i} = sum((AN{i}' * Rtest) .* Rtest,1);
63  end;
64 
65  sigma = max( Rtest_norm{dir} ./ Rtest_norm{no_dir} );
66  tau = max( Rtest_norm{no_dir} ./ Rtest_norm{dir} );
67 
68  RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
69 
70 end;
71 
72 restart = 0;
73 rb_sim_data.reached_maxiter = 1;
74 while rb_sim_data.reached_maxiter
75 
76  rb_sim_data.reached_maxiter = 0;
77 
78  % initialize iteration
79  uN = cell(1,2);
80  uN_old = cell(1,2);
81  uN_tilde = cell(1,2);
82  zN = cell(1,2);
83  BN = zeros(reduced_data.N{no_dir},1);
84 
85  rb_sim_data.uN = cell(1,2);
86  for i = 1:2
87  rb_sim_data.uN{i} = zeros(reduced_data.N{i},model.RB_maxiterN);
88  end;
89 
90  for i = 1:2
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);
94  end;
95 
96  if model.RB_approximate_thetaN == 0
97  a = [];
98  sigma = 0;
99  tau = 0;
100  RB_thetaN = [];
101  end;
102 
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};
107 
108  for i = 1:2
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});
112  end;
113 
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);
118 
119  if (restart == 2 || ~model.RB_approximate_thetaN)
120  clear('AN_00');
121  clear('AN_0G');
122  clear('fN');
123  end;
124 
125  %%%%%%%%%%%% iterative schema %%%%%%%%%%%%
126  continue_loop = 1;
127  numiter = 0;
128  diff_norm = zeros(1,2);
129  while continue_loop
130 
131  % ...
132  numiter = numiter+1;
133  for i = 1:2
134  uN_old{i} = uN{i};
135  end;
136 
137  % ...
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});
142 
143  % ...
144  if model.RB_approximate_thetaN == 0
145  a = (zN{dir}'*AN{dir}*zN{dir}) / (uN_tilde{no_dir}'*AN{no_dir}* ...
146  uN_tilde{no_dir});
147  sigma = max(sigma,a);
148  tau = max(tau,1/a);
149  RB_thetaN = (tau+1)/(sigma^2*tau+tau+2)/2;
150  end;
151 
152  % ...
153  uN{dir} = uN{dir} + RB_thetaN*(zN{dir}-uN_tilde{dir});
154  uN_tilde{dir} = uN_tilde{dir} + RB_thetaN*(zN{dir}- ...
155  uN_tilde{dir});
156 
157  % ...
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;
160 
161  % ...
162  uN{no_dir} = uN_0_no_dir + zN{no_dir};
163  uN_tilde{no_dir} = uN_tilde{no_dir} + uN{no_dir} - ...
164  uN_old{no_dir};
165 
166  % save uN
167  for i = 1:2
168  rb_sim_data.uN{i}(:,numiter) = uN{i};
169  end;
170 
171  % stopping criteria
172  for i = 1:2
173  diff_norm(i) = sqrt((uN{i}-uN_old{i})' * AN{i} * ...
174  (uN{i}-uN_old{i}));
175  end;
176 
177  if sum(diff_norm) < model.RB_sim_tol
178  continue_loop = 0;
179  rb_sim_data.reached_tolerance = 1;
180  end;
181  if numiter == model.RB_maxiterN
182  continue_loop = 0;
183  rb_sim_data.reached_maxiter = 1;
184  end;
185 
186  end;
187 
188  rb_sim_data.RB_thetaN = RB_thetaN;
189  rb_sim_data.numiter = numiter;
190  for i = 1:2
191  rb_sim_data.uN{i} = rb_sim_data.uN{i}(:,1:numiter);
192  end;
193 
194  % if reached_maxiter procedure is started again 2 times
195  % with new relaxation parameter
196  if (restart == 2 || ~model.RB_approximate_thetaN)
197  break;
198  end;
199  RB_thetaN = RB_thetaN/2;
200  restart = restart+1;
201 
202 end;
203 
204 %%%%%%%%%%%% error estimation %%%%%%%%%%%%
205 
206 % jump over interface
207 jumpex_norm_sqr = zeros(numiter,1);
208 for j = 1:numiter
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);
215 end;
216 jumpex_norm_sqr(find(jumpex_norm_sqr < 0)) = 0;
217 
218 % residual
219 res_norm_sqr = cell(1,2);
220 for i = 1:2
221  res_norm_sqr{i} = zeros(numiter,1);
222  for j = 1:numiter
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;
227  end;
228  res_norm_sqr{i}(find(res_norm_sqr{i} < 0)) = 0;
229 
230 end;
231 
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);
238 
239 % complete error estimator
240 rb_sim_data.Delta = Delta_part1 + Delta_part2;
241