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)
4 %
function extending reduced_data
if single
new RB has been added
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);
11 % B. Haasdonk 13.3.2015
13 A_comp = detailed_data.A_comp;
14 f_comp = detailed_data.f_comp;
16 %reduced_data.Qa = Qa;
18 %reduced_data.Qf = Qf;
20 %reduced_data.AN_comp = cell(1,length(A_comp));
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);
29 %reduced_data.fN_comp = cell(1,length(f_comp));
31 reduced_data.fN_comp{q} = [reduced_data.fN_comp{q} ;
32 detailed_data.RB(:,end)
' * f_comp{q}];
35 if model.compute_output_functional
36 % assumption: nonparametic output functional, then simple RB
39 model.operators_output(model,detailed_data);
41 reduced_data.lN_comp = cell(1,Q_l);
43 reduced_data.lN_comp{q} = detailed_data.RB' * l_comp{q};
47 N = model.get_rb_size(model,detailed_data);
50 % plus error estimation quantities
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];
56 % (v_f^q,v_f^q
') = v_f^q' * K * v_f^q
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
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);
68 % K_v_f(:,q) = f_comp{q};
70 % % v_f(:,q) = K \ f_comp{q};
73 K_v_a_N = zeros(size(K,1),Qa);
74 v_a_N = zeros(size(K,1),Qa);
78 % K_v_a{n} = zeros(size(K,1),Qa);
79 % v_a{n} = zeros(size(K,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);
87 K_v_a_N(:,q) = A_comp{q}*detailed_data.RB(:,end);
91 reduced_data.K_v_a{N} = K_v_a_N;
92 reduced_data.v_a{N} = v_a_N;
94 v_a = reduced_data.v_a;
95 K_v_a = reduced_data.K_v_a;
97 %
finally assemble G = [G_ff, G_fa{n}; G_fa{n}
', G_aa{n}];
100 %%G(1:Qf,1:Qf) = reduced_data.Gff;
101 %G(1:Qf,1:Qf) = v_f' * K_v_f;
103 % G(1:Qf,Qf+(n-1)*Qa +(1:Qa)) = ...
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}
';
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};
118 % assemble Qf x Qf matrix Hff = (<vf1,vf1>, ... ,<vf1,vfQf>)
120 % (<vfQf,vf1>, ... ,<vfQf,vfQf>)
122 %reduced_data.bar_Hff = v_f
' * K_v_f;
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>)
128 % <vf1,vaN1>...<vf1,vaNQa> | <vf2,vaN1> ... <vf2,vaNQa> | ... <vfQf,vaNQa>)
130 %Haf = zeros(N,Qa * Qf);
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;
140 Haf = reduced_data.bar_Haf;
142 % assemble N^2 x Qa^2 matrix
143 % Haa = (<va11,va11>...<va11,va1Qa> | <va12,va11> ... <va12,va1Qa> | <va1Qa,va11>... <va1Qa,va1Qa>)
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>
149 % <vaN1,va21>...<vaN1,va2Qa> | <vaN2,va21> ... <vaN2,va2Qa> | <vaNQa,va21>... <vaNQa,va2Qa>)
150 % -------------------------------------------------------------------------------------------
152 % -------------------------------------------------------------------------------------------
153 % <va11,vaN1>...<va11,vaNQa> | <va12,vaN1> ... <va12,vaNQa> | <va1Qa,vaN1>... <va1Qa,vaNQa>
155 % <vaN1,vaN1>...<vaN1,vaNQa> | <vaN2,vaN1> ... <vaN2,vaNQa> | <vaNQa,vaN1>... <vaNQa,vaNQa> )
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;
170 bar_Haa = zeros(N*N,Qa*Qa);
171 %distribute old matrix into
new one:
175 new_row_ind = find(dummy);
176 bar_Haa(new_row_ind,:) = reduced_data.bar_Haa;
178 % insert last row in each block-row:
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(:);
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(:);
193 %
if ~isequal(bar_Haa,Haa)
194 % disp(
'bar_Haa not equal Haa, please check!');
198 reduced_data.bar_Haa = bar_Haa;
200 reduced_data.used_dictionary_gen_reduced_data = 1;