1 function rb_sim_data = vi_rb_simulation(model,reduced_data)
2 %
function rb_sim_data = vi_rb_simulation(model,reduced_data)
4 %
function performing a reduced simulation of a vi-model.
6 % Generated fields of rb_sim_data:
7 % UN: reduced solution vector
8 % LN: reduced Lagrange multiplier vector
9 % Delta_lambda: error estimator
for lambda variable
10 % Delta_u: error estimator
for u
16 model.decomp_mode = 2;
18 [A_coeff,dummy,f_coeff,g_coeff] = model.operators(model,[]);
20 % compute required matrices
21 AN = lincomb_sequence(reduced_data.AN_comp,A_coeff);
23 fN = lincomb_sequence(reduced_data.fN_comp,f_coeff);
24 gN = lincomb_sequence(reduced_data.gN_comp,g_coeff);
29 options.MaxIter = 1000; % required
for large bases...
30 options.Display =
'off';
31 rb_sim_data.UN = quadprog(AN,-fN,BN
',gN,[],[],[],[],[],options);
34 % BN may have low rank
35 rb_sim_data.LN = pinv(BN)*(fN - AN*rb_sim_data.UN);
37 % a-posteriori error estimators
38 if model.enable_error_estimator
39 % currently: no offline-online, high.dim evaluation:
40 model.decomp_mode = 0;
41 [A,B,f,g] = model.operators(model,reduced_data);
42 K = model.get_inner_product_matrix(model,reduced_data);
43 K_v_r = (f-A*(reduced_data.RB_U*rb_sim_data.UN)...
44 -B*reduced_data.RB_L*rb_sim_data.LN);
46 delta_r = sqrt(max(sum(v_r .* K_v_r),0));
48 % Kinv_eta_s = B*reduced_data.RB_U*rb_sim_data.UN-g;
49 % eta_s = K * Kinv_eta_s;
50 % pi_eta_s = max(eta_s,0); % projection pi!!
51 % Kinv_pi_eta_s = K\pi_eta_s;
52 % delta_s1 = pi_eta_s'* Kinv_pi_eta_s;
53 % delta_s2 = (reduced_data.RB_L*rb_sim_data.LN)
' * Kinv_pi_eta_s;
55 Kinv_eta_s = B*reduced_data.RB_U*rb_sim_data.UN-g;
56 Kinv_pi_eta_s = max(Kinv_eta_s,0); % projection pi!!
57 delta_s1 = sqrt(Kinv_pi_eta_s'* K * Kinv_pi_eta_s);
58 delta_s2 = (reduced_data.RB_L*rb_sim_data.LN)
' * Kinv_pi_eta_s;
60 %disp(['delta_s1:
',num2str(delta_s1),...
61 % ', delta_s2:
',num2str(delta_s2),...
62 % ', delta_r:
',num2str(delta_r)]);
64 % compare with true residual
65 %sim_data = detailed_simulation(model,reduced_data);
66 %tilde_Kinv_eta_s = B*sim_data.U-g;
67 %plot([Kinv_eta_s, tilde_Kinv_eta_s]);
69 gamma_a = model.gamma_a(model);
70 % gamma_a = svds(K^(-0.5)*A*K^(-0.5),1);
71 alpha_a = model.alpha_a(model);
72 % alpha_a = eigs(K^(-0.5)*A*K^(-0.5),1,0);
75 % beta = svds(B,1,'s
')
76 % disp(['mu:
',num2str(transpose(model.get_mu(model)))]);
77 % disp(['beta:
',num2str(beta),', alpha:
',num2str(alpha_a),...
78 % ', gamma:
',num2str(gamma_a)]);
79 c1 = (delta_r + delta_s1 * gamma_a / beta)/(2*alpha_a);
80 c2 = (delta_s1*delta_r/beta + delta_s2)/alpha_a;
81 Delta_u = c1 + sqrt(c1^2 + c2);
82 rb_sim_data.Delta_u = Delta_u;
83 rb_sim_data.Delta_lambda = (delta_r + gamma_a * Delta_u)/beta;