rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
dom_dec_gen_reduced_data.m
Go to the documentation of this file.
1 function reduced_data = dom_dec_gen_reduced_data(model, ...
2  detailed_data)
3 % function reduced_data = dom_dec_reduced_data(model,detailed_data)
4 % all required offline data for the rb-simulation is computed.
5 % there are two ingredients for the error estimator - the jump
6 % across `\Gamma` and the residuum.
7 %
8 % the computation of residuum-components needs
9 % Q_f+N1*Q_A1+N2*Q_A2 detailed simulations. the number of
10 % iterations is very high there, because the accuracy of the error
11 % estimator is good then. therefore very expensive computations.
12 %
13 % Generated fields of reduced_data:
14 % AN_comp: nested cell containing the components of the system matrizes
15 % for the subproblems
16 % fN_comp: nested cell containing the components of the right hand
17 % side vectors for the subproblems
18 % R_11, R_12, R_22: matrizes for the computation of the jump
19 % across `\Gamma` component of the error estimator
20 % G: cell containing the matrizes for the residuum component
21 % N: cell with the dimensions of the RB spaces
22 % I_0, I_G: cells with index vectors of `0` and `\Gamma` spaces
23 
24 % I.Maier, 19.07.2011
25 
26 dir = model.dirichlet_side;
27 no_dir = mod(dir,2)+1;
28 
29 reduced_data = [];
30 
31 model.decomp_mode = 1;
32 
33 % A_comp and f_comp are nested cells!
34 [A_comp, f_comp, ~, ~] = ...
35  model.operators(model,detailed_data);
36 
37 % number of matrix/vector components
38 Q_A = cell(1,2);
39 Q_f = cell(1,2);
40 N = cell(1,2);
41 for i = 1:2
42  Q_A{i} = length(A_comp{i});
43  Q_f{i} = length(f_comp{i});
44 
45  N{i} = size(detailed_data.RB{i},2);
46 end;
47 
48 reduced_data.N = N;
49 reduced_data.I_0 = detailed_data.I_0;
50 reduced_data.I_G = detailed_data.I_G;
51 
52 reduced_data.AN_comp = cell(1,2);
53 reduced_data.fN_comp = cell(1,2);
54 
55 for i = 1:2
56  reduced_data.AN_comp{i} = cell(1,Q_A{i});
57  for q = 1:Q_A{i}
58  reduced_data.AN_comp{i}{q} = detailed_data.RB{i}' * ...
59  A_comp{i}{q} * detailed_data.RB{i};
60  end;
61 
62  reduced_data.fN_comp{i} = cell(1,Q_f{i});
63  for q = 1:Q_f{i}
64  reduced_data.fN_comp{i}{q} = detailed_data.RB{i}' * ...
65  f_comp{i}{q};
66  end;
67 end;
68 
69 %%%%%%%%%%% computation of extension matrizes
70 K = model.get_inner_product_matrices(detailed_data);
71 
72 if model.base_model.dual_mode
73 ext_ind = no_dir;
74  else
75  ext_ind = dir;
76 end
77 
78 RB_ext = cell(1,2);
79 % trivial finite element extension
80 for i = 1:2
81  RB_ext{i} = zeros(size(detailed_data.RB{ext_ind},1), ...
82  size(detailed_data.RB{i},2));
83  RB_ext{i}(detailed_data.gamma_dofs{ext_ind},:) = ...
84  detailed_data.RB{i}(detailed_data.gamma_dofs{i},:);
85 end;
86 reduced_data.R_11 = RB_ext{dir}' * K{ext_ind} * RB_ext{dir};
87 reduced_data.R_12 = RB_ext{dir}' * K{ext_ind} * RB_ext{no_dir};
88 reduced_data.R_22 = RB_ext{no_dir}' * K{ext_ind} * RB_ext{no_dir};
89 
90 % output functional terms
91 if model.base_model.compute_output_functional && ~model.base_model.dual_mode
92 
93  model.base_model.dual_mode = 1;
94  reduced_data.dual_reduced_data = ...
95  gen_reduced_data(model,detailed_data.dual_detailed_data);
96  model.base_model.dual_mode = 0;
97 
98  RBext_dual = cell(1,2);
99  for i = 1:2
100  RBext_dual{i} = ...
101  zeros(size(detailed_data.RB{no_dir},1), ...
102  size(detailed_data.dual_detailed_data.RB{i},2));
103  RBext_dual{i}(detailed_data.gamma_dofs{no_dir},:) = ...
104  detailed_data.dual_detailed_data.RB{i}(detailed_data.gamma_dofs{i},:);
105  end
106 
107  v_comp = cell(1,2);
108  for i = 1:2
109  model.base_model.decomp_mode = model.decomp_mode;
110 
111  detailed_data.df_info = detailed_data.df_infos{i};
112  v_comp{i} = model.operators_output(model.base_model,detailed_data);
113  end
114 
115  Q_v = cell(1,2);
116  for i = 1:2
117  Q_v{i} = length(v_comp{i});
118  end
119 
120  reduced_data.vN_comp = cell(1,2);
121  for i = 1:2
122  reduced_data.vN_comp{i} = cell(1, Q_v{i});
123  for q = 1:Q_v{i}
124  reduced_data.vN_comp{i}{q} = detailed_data.RB{i}' * v_comp{i}{q};
125  end
126  end
127 
128  reduced_data.vNext_comp = cell(1, 2);
129  for i = 1:2
130  reduced_data.vNext_comp{i} = cell(1, Q_v{dir});
131  for q = 1:Q_v{dir}
132  reduced_data.vNext_comp{i}{q} = RB_ext{i}' * v_comp{dir}{q};
133  end
134  end
135 
136  reduced_data.vNfR_comp = cell(1, 2);
137  for i = 1:2
138  reduced_data.vNfR_comp{i} = cell(1, Q_f{dir});
139  for q = 1:Q_f{dir}
140  reduced_data.vNfR_comp{i}{q} = RBext_dual{i}' * f_comp{no_dir}{q};
141  end
142  end
143 
144  reduced_data.fN_d_comp = cell(1, 2);
145  for i = 1:2
146  reduced_data.fN_d_comp{i} = cell(1,Q_f{i});
147  for q = 1:Q_f{i}
148  reduced_data.fN_d_comp{i}{q} = ...
149  detailed_data.dual_detailed_data.RB{i}' * f_comp{i}{q};
150  end
151  end
152 
153  reduced_data.AN_pd_comp = cell(1, 2);
154  for i = 1:2
155  reduced_data.AN_pd_comp{i} = cell(1,Q_A{i});
156  for q = 1:Q_A{i}
157  reduced_data.AN_pd_comp{i}{q} = ...
158  detailed_data.dual_detailed_data.RB{i}' * ...
159  A_comp{i}{q} * detailed_data.RB{i};
160  end;
161  end
162 
163  reduced_data.vNAR1_comp = cell(1, 2);
164  for i = 1:2
165  reduced_data.vNAR1_comp{i} = cell(1, Q_A{no_dir});
166  for q = 1:Q_A{no_dir}
167  reduced_data.vNAR1_comp{i}{q} = RBext_dual{i}' * A_comp{no_dir}{q} * ...
168  detailed_data.RB{no_dir};
169  end
170  end
171 
172  reduced_data.vNAR2_comp = cell(1, 2);
173  for i = 1:2
174  reduced_data.vNAR2_comp{i} = cell(1, Q_A{dir});
175  for q = 1:Q_A{dir}
176  reduced_data.vNAR2_comp{i}{q} = ...
177  detailed_data.dual_detailed_data.RB{dir}' * A_comp{dir}{q} * ...
178  RB_ext{i};
179  end
180  end
181 
182 end
183 
184 % error estimation quantities
185 model.base_model.compute_output_functional = 0;
186 
187 %%%%%%%%%%%%% computation of residuum-components
188 % perform a detailed simulation for each component
189 
190 model.verbose = 0;
191 
192 res_mat = cell(1,2);
193 res_rhs = cell(1,2);
194 for i = 1:2
195  res_mat{i} = K{i};
196  dir_gids = detailed_data.df_infos{i}.dirichlet_gids;
197  mat_dir = sparse(dir_gids,dir_gids,ones(size(dir_gids)), ...
198  detailed_data.df_infos{i}.ndofs, ...
199  detailed_data.df_infos{i}.ndofs);
200  res_mat{i}(dir_gids,:) = 0;
201  res_mat{i} = res_mat{i} + mat_dir;
202 end;
203 clear('mat_dir');
204 
205 % assume Q_f{1}=Q_f{2}
206 % v_f has one part on each domain
207 v_f = cell(1,2);
208 for i = 1:2
209  v_f{i} = zeros(size(res_mat{i},1),Q_f{i});
210 end;
211 
212 for q = 1:Q_f{1}
213  if any(f_comp{1}{q}) || any(f_comp{2}{q})
214 
215  % prepare detailed simulation
216  detailed_data.operators = @(j) deal(res_mat{j}, f_comp{j}{q});
217 
218  % detailed simulation
219  sim_data = detailed_simulation(model,detailed_data);
220  if sim_data.reached_maxiter
221  warning('detailed simulation may have diverged!');
222  end;
223  for i = 1:2
224  v_f{i}(:,q) = sim_data.uh{i}.dofs;
225  end;
226 
227  end;
228 end;
229 
230 % two different right hand sides for v_a
231 % (v_a{1}{m},phi) = a_1(phi_N^m,phi)
232 % (v_a{2}{m},phi) = a_2(phi_N^m,phi)
233 v_a = cell(1,2);
234 for i = 1:2
235 
236  v_a{i} = cell(1,N{i});
237  for m = 1:N{i}
238 
239  % v_a{i}{m} has one part on each domain
240  v_a{i}{m} = cell(1,2);
241  for j = 1:2
242  v_a{i}{m}{j} = zeros(size(res_mat{j},1),Q_A{i});
243  end;
244 
245  for q = 1:Q_A{i}
246  if any(any(A_comp{i}{q}))
247 
248  % prepare detailed simulation
249  res_rhs{i} = A_comp{i}{q} * detailed_data.RB{i}(:,m);
250  res_rhs{mod(i,2)+1} = zeros(size(res_mat{mod(i,2)+1},1),1);
251  detailed_data.operators = @(j) deal(res_mat{j}, ...
252  res_rhs{j});
253 
254  % detailed simulation
255  sim_data = detailed_simulation(model,detailed_data);
256  if sim_data.reached_maxiter
257  warning('detailed simulation may have diverged!');
258  end;
259  for j = 1:2
260  v_a{i}{m}{j}(:,q) = sim_data.uh{j}.dofs;
261  end;
262 
263  end;
264  end;
265 
266  end;
267 end;
268 
269 reduced_data.G = cell(1,2);
270 
271 % two matrizes G (same procedure as in lin_stat_gen_reduced_data)
272 for i = 1:2
273 
274  Gff = v_f{i}' * K{i} * v_f{i};
275 
276  Gfa1 = cell(1,N{1});
277  for n = 1:N{1}
278  Gfa1{n} = v_f{i}' * K{i} * v_a{1}{n}{i};
279  end;
280  Gfa2 = cell(1,N{2});
281  for n = 1:N{2}
282  Gfa2{n} = v_f{i}' * K{i} * v_a{2}{n}{i};
283  end;
284 
285  Ga1a1 = cell(N{1},N{1});
286  for n1 = 1:N{1}
287  for n2 = 1:N{1}
288  Ga1a1{n1,n2} = v_a{1}{n1}{i}' * K{i} * v_a{1}{n2}{i};
289  end;
290  end;
291  Ga1a2 = cell(N{1},N{2});
292  for n1 = 1:N{1}
293  for n2 = 1:N{2}
294  Ga1a2{n1,n2} = v_a{1}{n1}{i}' * K{i} * v_a{2}{n2}{i};
295  end;
296  end;
297  Ga2a2 = cell(N{2},N{2});
298  for n1 = 1:N{2}
299  for n2 = 1:N{2}
300  Ga2a2{n1,n2} = v_a{2}{n1}{i}' * K{i} * v_a{2}{n2}{i};
301  end;
302  end;
303 
304  Q_r = Q_f{1}+N{1}*Q_A{1}+N{2}*Q_A{2};
305  G = zeros(Q_r,Q_r);
306  G(1:Q_f{1},1:Q_f{1}) = Gff;
307  for n = 1:N{1}
308  G(1:Q_f{1},Q_f{1}+(n-1)*Q_A{1}+(1:Q_A{1})) = Gfa1{n};
309  G(Q_f{1}+(n-1)*Q_A{1}+(1:Q_A{1}),1:Q_f{1}) = Gfa1{n}';
310  end;
311  for n = 1:N{2}
312  G(1:Q_f{1},Q_f{1}+N{1}*Q_A{1}+(n-1)*Q_A{2}+(1:Q_A{2})) = ...
313  Gfa2{n};
314  G(Q_f{1}+N{1}*Q_A{1}+(n-1)*Q_A{2}+(1:Q_A{2}),1:Q_f{1}) = ...
315  Gfa2{n}';
316  end;
317  for n1 = 1:N{1}
318  for n2 = 1:N{1}
319  G(Q_f{1}+(n1-1)*Q_A{1}+(1:Q_A{1}),Q_f{1}+(n2-1)*Q_A{1}+(1:Q_A{1})) ...
320  = Ga1a1{n1,n2};
321  end;
322  end;
323 
324  for n1 = 1:N{1}
325  for n2 = 1:N{2}
326  G(Q_f{1}+(n1-1)*Q_A{1}+(1:Q_A{1}),Q_f{1}+N{1}*Q_A{1}+ ...
327  (n2-1)*Q_A{2}+(1:Q_A{2})) = Ga1a2{n1,n2};
328  G(Q_f{1}+N{1}*Q_A{1}+(n2-1)*Q_A{2}+(1:Q_A{2}),Q_f{1}+ ...
329  (n1-1)*Q_A{1}+(1:Q_A{1})) = Ga1a2{n1,n2}';
330  end;
331  end;
332 
333  for n1 = 1:N{2}
334  for n2 = 1:N{2}
335  G(Q_f{1}+N{1}*Q_A{1}+(n1-1)*Q_A{2}+(1:Q_A{2}),Q_f{1}+ ...
336  N{1}*Q_A{1}+(n2-1)*Q_A{2}+(1:Q_A{2})) = Ga2a2{n1,n2};
337  end;
338  end;
339 
340  reduced_data.G{i} = G;
341 
342 end
343 
344 if exist('v_comp', 'var')
345  model.base_model.compute_output_functional = 1;
346 end
347 
348 
function reduced_data = dom_dec_gen_reduced_data(model, detailed_data)
all required offline data for the rb-simulation is computed. there are two ingredients for the error ...