1 function sim_data = comsol_evol_detailed_simulation(model,model_data)
2 %
function sim_data = comsol_evol_detailed_simulation(model,model_data)
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".
11 sim_data.grid_info = model_data.grid_info;
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);
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);
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);
31 if model.compute_output_functional
32 %sim_data.s = model.output_functional(model,sim_data);
34 v = model.operators_output(model,sim_data);
35 sim_data.s = v'*sim_data.U;
39 else %~model.use_comsol
41 nr_DOFs = length(model_data.operators.init_values);
42 U = zeros(nr_DOFs,nt+1);
44 % Initialize array for eliminated solution
45 Uc = zeros(size(model_data.ind_vectors.Null,2),nt+1);
47 model.decomp_mode = 1;
48 [L_I_comp, L_E_comp, b_comp] = model.operators_ptr(model,model_data);
50 model.decomp_mode = 2;
51 [L_I_coeff, L_E_coeff, b_coeff] = model.operators_ptr(model,model_data);
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);
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;
63 % b_comsol = model.dt * str.Lc;
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
77 % %ENDE: ZUM TESTEN OB MATRITZEN PASSEN!
82 % Time stepping iteration
84 Uc(:,t_ind+1) = L_I \ (b + L_E*Uc(:,t_ind)) ;
87 % blow up the vectors to full size
89 U(:,t_ind) = model_data.ind_vectors.Null*Uc(:,t_ind);
92 sim_data.comsol_model = [];
95 if model.compute_output_functional
96 %sim_data.s = model.output_functional(model,sim_data);
98 v = model.operators_output(model,model_data);
99 sim_data.s = v'*sim_data.U;
Implementation of the parametric algebraic Riccati equation.