rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
vi_rb_simulation.m
1 function rb_sim_data = vi_rb_simulation(model,reduced_data)
2 %function rb_sim_data = vi_rb_simulation(model,reduced_data)
3 %
4 % function performing a reduced simulation of a vi-model.
5 %
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
11 
12 % I.Maier 31.05.2011
13 
14 rb_sim_data = [];
15 
16 model.decomp_mode = 2;
17 
18 [A_coeff,dummy,f_coeff,g_coeff] = model.operators(model,[]);
19 
20 % compute required matrices
21 AN = lincomb_sequence(reduced_data.AN_comp,A_coeff);
22 BN = reduced_data.BN;
23 fN = lincomb_sequence(reduced_data.fN_comp,f_coeff);
24 gN = lincomb_sequence(reduced_data.gN_comp,g_coeff);
25 
26 warning off
27 options = optimset;
28 %options.TolFun = 0;
29 options.MaxIter = 1000; % required for large bases...
30 options.Display = 'off';
31 rb_sim_data.UN = quadprog(AN,-fN,BN',gN,[],[],[],[],[],options);
32 warning on
33 
34 % BN may have low rank
35 rb_sim_data.LN = pinv(BN)*(fN - AN*rb_sim_data.UN);
36 
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);
45  v_r = K\K_v_r;
46  delta_r = sqrt(max(sum(v_r .* K_v_r),0));
47 
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;
54 
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;
59 
60  %disp(['delta_s1: ',num2str(delta_s1),...
61  % ', delta_s2: ',num2str(delta_s2),...
62  % ', delta_r: ',num2str(delta_r)]);
63 
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]);
68 
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);
73  beta = model.beta_b;
74 % keyboard;
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;
84 % keyboard;
85 end;