rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
dictionary_extend_reduced_data.m
1 function reduced_data = dictionary_extend_reduced_data(model,reduced_data,detailed_data)
2 %function reduced_data = dictionary_extend_reduced_data(model,reduced_data,detailed_data)
3 %
4 % function extending reduced_data if single new RB has been added
5 % in detailed_data.RB
6 %
7 %% The following also works, but results in slow linear combination
8 %and repetitive linear combinations over N extension loop.
9 % reduced_data= lin_stat_gen_reduced_data(model,detailed_data);
10 
11 % B. Haasdonk 13.3.2015
12 
13 A_comp = detailed_data.A_comp;
14 f_comp = detailed_data.f_comp;
15 Qa = length(A_comp);
16 %reduced_data.Qa = Qa;
17 Qf = length(f_comp);
18 %reduced_data.Qf = Qf;
19 
20 %reduced_data.AN_comp = cell(1,length(A_comp));
21 for q = 1:Qa
22  AN_comp_vec1 = detailed_data.RB'*A_comp{q}*detailed_data.RB(:,end);
23  AN_comp_vec2 = detailed_data.RB(:,end)'*A_comp{q}*detailed_data.RB;
24  reduced_data.AN_comp{q} = ...
25  [reduced_data.AN_comp{q}, AN_comp_vec1(1:end-1);
26  AN_comp_vec2(1:end)];
27 end;
28 
29 %reduced_data.fN_comp = cell(1,length(f_comp));
30 for q = 1:Qf
31  reduced_data.fN_comp{q} = [reduced_data.fN_comp{q} ;
32  detailed_data.RB(:,end)' * f_comp{q}];
33 end;
34 
35 if model.compute_output_functional
36  % assumption: nonparametic output functional, then simple RB
37  % evaluation possible
38  l_comp = ...
39  model.operators_output(model,detailed_data);
40  Q_l = length(l_comp);
41  reduced_data.lN_comp = cell(1,Q_l);
42  for q = 1:Q_l
43  reduced_data.lN_comp{q} = detailed_data.RB' * l_comp{q};
44  end;
45 end;
46 
47 N = model.get_rb_size(model,detailed_data);
48 reduced_data.N = N;
49 
50 % plus error estimation quantities
51 
52 % G = (v_r^q, v_r^q) = v_r^q' * K * v_r^q
53 % with {v_r^q}_q = (v_f^q, v_a^qq')_{qq'}
54 % G = [Gff, Gfa; Gfa', Gaa];
55 %
56 % (v_f^q,v_f^q') = v_f^q' * K * v_f^q
57 
58 % matrices of coefficient vectors of Riesz-representers:
59 % K * v_f^q = f^q (coefficient vector equations)
60 K = model.get_inner_product_matrix(detailed_data);
61 % search solution in H10, i.e. set dirichlet DOFs
62 
63 %v_f = zeros(size(detailed_data.RB,1),Qf);
64 K_v_f = reduced_data.K_v_f;
65 v_f = reduced_data.v_f;
66 %K_v_f = zeros(size(detailed_data.RB,1),Qf);
67 %for q = 1:Qf
68 % K_v_f(:,q) = f_comp{q};
69 % v_f = K \ K_v_f;
70 % % v_f(:,q) = K \ f_comp{q};
71 %end;
72 
73 K_v_a_N = zeros(size(K,1),Qa);
74 v_a_N = zeros(size(K,1),Qa);
75 %v_a = cell(N,1);
76 %K_v_a = cell(N,1);
77 %for n = 1:N
78 % K_v_a{n} = zeros(size(K,1),Qa);
79 % v_a{n} = zeros(size(K,1),Qa);
80 % for q = 1:Qa
81 % K_v_a{n}(:,q) = (A_comp{q}*detailed_data.RB(:,n));
82 % v_a{n} = K \ K_v_a{n};
83 % % v_a{n}(:,q) = K \ K_v_a{n}(:,q);
84 % end;
85 %end;
86 for q = 1:Qa
87  K_v_a_N(:,q) = A_comp{q}*detailed_data.RB(:,end);
88 end;
89 v_a_N = K \ K_v_a_N;
90 
91 reduced_data.K_v_a{N} = K_v_a_N;
92 reduced_data.v_a{N} = v_a_N;
93 
94 v_a = reduced_data.v_a;
95 K_v_a = reduced_data.K_v_a;
96 
97 % finally assemble G = [G_ff, G_fa{n}; G_fa{n}', G_aa{n}];
98 %Q_r = Qf + N * Qa;
99 %G = zeros(Q_r,Q_r);
100 %%G(1:Qf,1:Qf) = reduced_data.Gff;
101 %G(1:Qf,1:Qf) = v_f' * K_v_f;
102 %for n = 1:N
103 % G(1:Qf,Qf+(n-1)*Qa +(1:Qa)) = ...
104 % v_f' * K_v_a{n};
105 % % reduced_data.Gfa{n};
106 % G(Qf+(n-1)*Qa +(1:Qa),1:Qf) = ...
107 % transpose(v_f' * K_v_a{n});
108 % % reduced_data.Gfa{n}';
109 %end;
110 %for n1 = 1:N
111 % for n2 = 1:N
112 % G(Qf+(n1-1)*Qa+(1:Qa),Qf+(n2-1)*Qa +(1:Qa)) = ...
113 % v_a{n1}' * K_v_a{n2};
114 % % reduced_data.Gaa{n1,n2};
115 % end;
116 %end;
117 
118 % assemble Qf x Qf matrix Hff = (<vf1,vf1>, ... ,<vf1,vfQf>)
119 % .........
120 % (<vfQf,vf1>, ... ,<vfQf,vfQf>)
121 
122 %reduced_data.bar_Hff = v_f' * K_v_f;
123 
124 % assemble N x QaQf matrix
125 % Haf = (<vf1,va11>...<vf1,va1Qa> | <vf2,va11> ... <vf2,va1Qa> | ... <vfQf,va1Qa>)
126 % <vf1,va21>...<vf1,va2Qa> | <vf2,va21> ... <vf2,va2Qa> | ... <vfQf,va2Qa>)
127 % ............
128 % <vf1,vaN1>...<vf1,vaNQa> | <vf2,vaN1> ... <vf2,vaNQa> | ... <vfQf,vaNQa>)
129 
130 %Haf = zeros(N,Qa * Qf);
131 for q = 1:Qf
132  % for n = 1:N
133  % % insert row vector in block matrix:
134  % vaf = v_f(:,q)' * K_v_a{n};
135  % Haf(n,(1+(q-1)*Qa):(q*Qa)) = vaf;
136  % insert row vector in block matrix:
137  vaf = v_f(:,q)' * K_v_a_N;
138  reduced_data.bar_Haf(N,(1+(q-1)*Qa):(q*Qa)) = vaf;
139 end;
140 Haf = reduced_data.bar_Haf;
141 
142 % assemble N^2 x Qa^2 matrix
143 % Haa = (<va11,va11>...<va11,va1Qa> | <va12,va11> ... <va12,va1Qa> | <va1Qa,va11>... <va1Qa,va1Qa>)
144 % ............
145 % <vaN1,va11>...<vaN1,va1Qa> | <vaN2,va11> ... <vaN2,va1Qa> | <vaNQa,va11>... <vaNQa,va1Qa>)
146 % -------------------------------------------------------------------------------------------
147 % <va11,va21>...<va11,va2Qa> | <va12,va21> ... <va12,va2Qa> | <va1Qa,va21>... <va1Qa,va2Qa>
148 % ............
149 % <vaN1,va21>...<vaN1,va2Qa> | <vaN2,va21> ... <vaN2,va2Qa> | <vaNQa,va21>... <vaNQa,va2Qa>)
150 % -------------------------------------------------------------------------------------------
151 % ............
152 % -------------------------------------------------------------------------------------------
153 % <va11,vaN1>...<va11,vaNQa> | <va12,vaN1> ... <va12,vaNQa> | <va1Qa,vaN1>... <va1Qa,vaNQa>
154 % ............
155 % <vaN1,vaN1>...<vaN1,vaNQa> | <vaN2,vaN1> ... <vaN2,vaNQa> | <vaNQa,vaN1>... <vaNQa,vaNQa> )
156 
157 %% old expensive rule of computation:
158 %Haa = zeros(N*N,Qa*Qa);
159 %% insert row vectors in block matrix:
160 %for q = 1:Qa % loop over column-blocks
161 % for n1 = 1:N % loop over block-rows
162 % for n2 = 1:N % loop over rows within one block;
163 % vaa = v_a{n2}(:,q)' * K_v_a{n1};
164 % Haa((n1-1)*N + n2, (1+(q-1)*Qa):q*Qa) = vaa;
165 % end;
166 % end;
167 %end;
168 
169 % new rule
170 bar_Haa = zeros(N*N,Qa*Qa);
171 %distribute old matrix into new one:
172 dummy = ones(N,N);
173 dummy(N,:) = 0;
174 dummy(:,N) = 0;
175 new_row_ind = find(dummy);
176 bar_Haa(new_row_ind,:) = reduced_data.bar_Haa;
177 
178 % insert last row in each block-row:
179 n2 = N;
180 for n1 = 1:N % loop over block-rows
181  vaa = transpose(v_a_N' * K_v_a{n1});
182  bar_Haa((n1-1)*N + n2, :) = vaa(:);
183 end;
184 % insert last block-row:
185 n1 = N; % loop over block-rows
186 for n2 = 1:N-1 % loop over rows within last block row;
187  for q = 1:Qa % loop over column-block
188  vaa = transpose(v_a{n2}' * K_v_a_N);
189  bar_Haa((n1-1)*N + n2, :) = vaa(:);
190  end;
191 end;
192 
193 %if ~isequal(bar_Haa,Haa)
194 % disp('bar_Haa not equal Haa, please check!');
195 % keyboard;
196 %end;
197 
198 reduced_data.bar_Haa = bar_Haa;
199 
200 reduced_data.used_dictionary_gen_reduced_data = 1;
201