rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
comsol_evol_detailed_simulation.m
1 function sim_data = comsol_evol_detailed_simulation(model,model_data)
2 %function sim_data = comsol_evol_detailed_simulation(model,model_data)
3 %
4 % This function computes a detailed solution!
5 % Depending on model.use_comsol = 0 or 1 it uses COMSOL to calculate a
6 % solution or does it "by hand".
7 %
8 % Oliver Zeeb, 2013
9 
10 
11 sim_data.grid_info = model_data.grid_info;
12 if model.use_comsol
13  comsol_model=comsol_set_mu_from_rbmatlab_model(model,model_data.comsol_model);
14  comsol_model.sol(model.comsol_tags.sol).feature('t1').active(true);
15  comsol_model.sol(model.comsol_tags.sol).runAll;
16  sol_size = comsol_model.sol(model.comsol_tags.sol).getSize();
17  nr_dofs = sol_size(1);
18  nt = sol_size(2);
19  sim_data.t = comsol_model.sol(model.comsol_tags.sol).getPVals();
20  sim_data.U = zeros(nr_dofs, nt);
21  for k = 1:length(sim_data.t)
22  sim_data.U(:,k) = comsol_model.sol(model.comsol_tags.sol).getU(k);
23  end
24 
25  % calculation of the derivative --> calculate only if needed!
26  % needs twice the time than storing only sim_data.U!!!
27  %sim_data.Udot = zeros(nr_dofs, nt);
28  %for k = 1:length(sim_data.t)
29  % sim_data.Udot(:,k) = comsol_model.sol(model.comsol_tags.sol).getUDot(k);
30  %end
31  if model.compute_output_functional
32  %sim_data.s = model.output_functional(model,sim_data);
33  %get operators:
34  v = model.operators_output(model,sim_data);
35  sim_data.s = v'*sim_data.U;
36  end
37 
38 
39 else %~model.use_comsol
40  nt = model.nt;
41  nr_DOFs = length(model_data.operators.init_values);
42  U = zeros(nr_DOFs,nt+1);
43 
44  % Initialize array for eliminated solution
45  Uc = zeros(size(model_data.ind_vectors.Null,2),nt+1);
46 
47  model.decomp_mode = 1;
48  [L_I_comp, L_E_comp, b_comp] = model.operators_ptr(model,model_data);
49 
50  model.decomp_mode = 2;
51  [L_I_coeff, L_E_coeff, b_coeff] = model.operators_ptr(model,model_data);
52 
53  L_I = lincomb_sequence(L_I_comp, L_I_coeff);
54  L_E = lincomb_sequence(L_E_comp, L_E_coeff);
55  b = lincomb_sequence(b_comp, b_coeff);
56 
57 % %%%%
58 % %FOR TESTING: ARE THE MATRICES OK?
59 % comsol_set_mu_from_rbmatlab_model(model,model_data.comsol_model);
60 % str = get_assembled_matrices(model_data.comsol_model);
61 % LI_comsol = str.Dc+model.dt*str.Kc;
62 % LE_comsol = str.Dc;
63 % b_comsol = model.dt * str.Lc;
64 % %Differenz bilden
65 % LI_diff = L_I-LI_comsol;
66 % LE_diff = L_E-LE_comsol;
67 % b_diff = b-b_comsol;
68 % %maximum der differenz ermitteln
69 % max_LI = max(max(abs(LI_diff)))
70 % max_LE = max(max(abs(LE_diff)))
71 % max_b = max(abs(b_diff))
72 % %norm der differenz ermitteln
73 % norm(LI_diff,'fro')
74 % norm(LE_diff,'fro')
75 % norm(b_diff,'fro')
76 % keyboard
77 % %ENDE: ZUM TESTEN OB MATRITZEN PASSEN!
78 % %%%%
79 
80 
81 
82  % Time stepping iteration
83  for t_ind = 1:nt;
84  Uc(:,t_ind+1) = L_I \ (b + L_E*Uc(:,t_ind)) ;
85  end
86 
87  % blow up the vectors to full size
88  for t_ind = 1:nt+1;
89  U(:,t_ind) = model_data.ind_vectors.Null*Uc(:,t_ind);
90  end
91 
92  sim_data.comsol_model = [];
93  sim_data.U = U;
94 
95  if model.compute_output_functional
96  %sim_data.s = model.output_functional(model,sim_data);
97  %get operators:
98  v = model.operators_output(model,model_data);
99  sim_data.s = v'*sim_data.U;
100  end
101 
102 end
103 
104 
105 
106 
Implementation of the parametric algebraic Riccati equation.