1 function rb_sim_data = rb_simulation_impl(rmodel, reduced_data, sim_data, dd)
2 %
function rb_sim_data = rb_simulation_impl(rmodel, reduced_data)
3 %
function, which performs a reduced basis online simulation
for
4 % the parameter vector `\mu \in {\cal P} \subset \mathbb{R}^p`, which is
7 % - allowed dependency of data: Nmax, Mmax, N, M, mu
8 % - not allowed dependency of data: H
9 % - allowed dependency of computation: Nmax, Mmax, N, M, mu
10 % - not allowed dependency of computation: H
11 % - Unknown at
this stage: ---
13 % The behaviour of
this simulation is controlled by the
ModelDescr structure
19 % generated fields of rb_sim_data:
20 % a :
'a(:,k)' is the coefficient vector of the reduced simulation at time
25 % error(
'wrong number of arguments: should be 2');
28 if rmodel.verbose >= 10
29 disp([
'performing simulation for mu = ',mat2str(get_mu(rmodel))]);
33 rmodel.decomp_mode = 2;
35 sat0Ind = get_index(reduced_data,
'sat_init', get_mu(rmodel), rmodel.t);
36 rd_sat0 =
get(reduced_data, sat0Ind);
40 sat_a0 = lincomb_sequence(rd_sat0, descr);
42 % perform simulation loop in time
43 descr.dt = descr.T/descr.nt;
45 sat_N = get_N(rmodel,
'saturation');
46 vel_N = get_N(rmodel,
'velocity');
47 prs_N = get_N(rmodel,
'pressure');
50 sat_a = zeros(sat_N, descr.nt+1); % matrix of saturation RB-coefficients
51 vel_a = zeros(vel_N, descr.nt+1); % matrix of velocity RB-coefficients
52 prs_a = zeros(prs_N, descr.nt+1); % matrix of pressure RB-coefficients
53 exflags = zeros(1, descr.nt+1);
54 outtext = cell(1, descr.nt+1);
56 sat_a(:,1) = sat_a0(1:sat_N);
58 [rd_sat] = get_reduced_data_for_operator(
'L_saturation', rmodel, reduced_data);
59 [rd_vel] = get_reduced_data_for_operator(
'L_velocity', rmodel, reduced_data);
60 [rd_prs] = get_reduced_data_for_operator(
'L_pressure_mean', rmodel, reduced_data);
61 rd_divInd = get_index(reduced_data,
'L_divergence', get_mu(rmodel), rmodel.t);
62 rd_div =
get(reduced_data, rd_divInd);
64 % loop over time steps: computation of a(t+1)==a^t
66 descr.t = (t-1)*descr.dt;
68 if rmodel.verbose >= 10
69 disp([
'entered time-loop step ',num2str(t)]);
72 V_last = [sat_a(:,t); vel_a(:,t); prs_a(:,t)];
73 descr.t = descr.t + descr.dt;
75 fsolve_fun = @(X) sat_fun(descr, sat_a(:,t), X, rd_sat, rd_vel, rd_div, rd_prs);
77 gplmmopts.Px = @(X) box_projection(X, sat_N);
78 gplmmopts.debug =
false;
79 gplmmopts.TolRes = 1e-7;
80 gplmmopts.TolChange = 1e-10;
81 % gplmmopts.HessFun = @(params, jac, dummy, arg) jac
' * (jac * arg);
82 [V_new, resnorm, FV, exitflag, output] = gplmm(fsolve_fun, V_last, gplmmopts);
84 exflags(t) = exitflag;
87 sat_a(:, t+1) = V_new(1:sat_N);
88 vel_a(:, t+1) = V_new(sat_N+1:sat_N+vel_N);
89 prs_a(:, t+1) = V_new(sat_N+vel_N+1:end);
93 if rmodel.enable_error_estimator
94 error('error estimator is not implemented yet.
');
95 rb_sim_data.Delta = 0;
98 % prepare return parameters
99 rb_sim_data.sat_a = sat_a;
100 rb_sim_data.vel_a = vel_a;
101 rb_sim_data.prs_a = prs_a;
102 rb_sim_data.exit_flags = exflags;
103 rb_sim_data.outputs = outtext;
107 function [reduced_data_op] = get_reduced_data_for_operator(id, rmodel, reduced_data)
109 crbInd = get_index(reduced_data, id, get_mu(rmodel), rmodel.t);
110 reduced_data_op = get(reduced_data, crbInd);
113 if isa(reduced_data_op, 'TwoPhaseFlow.EiRbReducedDataNode
') ...
114 && ( isempty(reduced_data_op.CE) ...
115 || any(size(reduced_data_op.CE) ~= size(reduced_data_op.DE)) )
117 M = reduced_data_op.M;
118 reduced_data_op.CE = reduced_data_op.DE / reduced_data_op.BM;
119 reduced_data_op.CE_red = reduced_data_op.DE(:,1:M) ...
120 / reduced_data_op.BM(1:M, 1:M);
124 function [ret, J] = sat_fun(descr, Sold, X, rd_sat, rd_vel, rd_div, rd_prs)
126 sat_N = length(Sold);
127 vel_N = size(rd_sat.RB_local_ext.U, 2);
130 Xsat.S = rd_sat.RB_local_ext.S * X(1:sat_N);
131 Xsat.U = rd_sat.RB_local_ext.U * X(sat_N+1:sat_N+vel_N);
132 msatsat = size(rd_sat.RB_local_ext.S,1);
134 [sat_ret, dummy, sat_Jret] = descr.L_saturation.apply(descr, rd_sat, Xsat, rd_sat.TM_local);
135 sat_ret = rd_sat.CE * sat_ret;
137 if descr.linear_velocity
138 vel_Jret = lincomb_sequence(rd_vel, descr);
139 vel_ret = vel_Jret * X(sat_N+vel_N+1:end) - X(sat_N+1:sat_N+vel_N);
142 % hier koennte man die empirische interpolation auch lediglich fuer die
143 % totale mobilitaet machen, statt fuer den ganzen velocity operator.
144 Xvel.S = rd_vel.RB_local_ext.S * X(1:sat_N);
145 % Xvel.U = rd_vel.RB_local_ext.U * X(sat_N+1:sat_N+vel_N);
146 Xvel.P = rd_vel.RB_local_ext.P * X(sat_N+vel_N+1:end);
147 mvelsat = size(rd_vel.RB_local_ext.S,1);
150 % Xvel.Uoff = mvelsat;
151 [vel_ret, dummy, vel_Jret] = descr.L_velocity.apply(descr, rd_vel, Xvel, rd_vel.TM_local);
152 vel_ret = rd_vel.CE * vel_ret - X(sat_N+1:sat_N+vel_N);
154 % dd = evalin('base
', 'dd
');
155 % dd_sat = get_by_description(dd.datatree.rb, 'saturation
');
156 % dd_vel = get_by_description(dd.datatree.rb, 'velocity
');
157 % dd_prs = get_by_description(dd.datatree.rb, 'pressure
');
158 % dd_Lvel = get_by_description(dd.datatree.ei, 'L_velocity
');
159 % dd_Xvel.S = dd_sat.RB * X(1:sat_N);
160 % dd_Xvel.P = dd_prs.RB * X(sat_N+vel_N+1:end);
161 % [dd_ret, dummy, dd_Jret] = descr.L_velocity.apply(descr, dd.model_data, dd_Xvel);
162 % vel_ret_recon_sigma = dd_Lvel.BM \ vel_ret;
163 % vel_ret_recon = dd_Lvel.QM * vel_ret_recon_sigma;
164 % debug_diff = vel_ret_recon - dd_ret;
165 % disp(['linfty-norm:
', num2str(max(abs(debug_diff))), ...
166 % ' l2-norm:
', num2str(sqrt(debug_diff' * dd.model_data.diamondW * debug_diff))]);
167 %% disp([
'TM-linfty-norm: ', num2str(max(abs(dd_ret(dd_Lvel.TM) - vel_ret)))]);
168 % vel_ret = dd_vel.RB
' * dd.model_data.diamondW * vel_ret_recon - X(sat_N+1:sat_N+vel_N);
173 [div_Jret, div_bb] = lincomb_sequence(rd_div, descr);
174 prs_Jret = lincomb_sequence(rd_prs, descr);
175 div_ret = div_Jret * (X(sat_N + 1:sat_N + vel_N)) + div_bb;
176 prs_ret = prs_Jret * (X(sat_N+vel_N+1:end));
178 sat_ret = (X(1:sat_N) - Sold)./descr.dt + sat_ret;
179 ret = [sat_ret; vel_ret; div_ret; prs_ret];
183 sat_Jret = rd_sat.CE * ...
184 [sat_Jret(:,1:msatsat) * rd_sat.RB_local_ext.S, ...
185 sat_Jret(:,msatsat+1:end) * rd_sat.RB_local_ext.U, ...
186 zeros(size(sat_Jret,1), prs_N)];
187 ntime = size(sat_Jret, 1);
188 Jtime = sparse(1:ntime, 1:ntime, 1/descr.dt * ones(1, ntime),...
189 ntime, size(sat_Jret,2));
191 if descr.linear_velocity
192 vel_Jret = [zeros(size(vel_Jret,1), sat_N+vel_N), vel_Jret];
194 vel_Jret = rd_vel.CE * ...
195 [ vel_Jret(:,1:mvelsat) * rd_vel.RB_local_ext.S, ...
196 zeros(size(vel_Jret,1), vel_N), ...
197 vel_Jret(:,mvelsat+1:end) * rd_vel.RB_local_ext.P ];
198 % vel_Jret = rd_vel.CE * ...
199 % [ dd_Jret(dd_Lvel.TM,1:400) * dd_sat.RB, ...
200 % zeros(size(vel_Jret, 1), vel_N), ...
201 % dd_Jret(dd_Lvel.TM,401:end) * dd_prs.RB ];
204 sp_minus_U = sparse(1:vel_N, sat_N+1:sat_N+vel_N, -1, vel_N, size(vel_Jret,2));
205 J = [ Jtime + sat_Jret;...
206 vel_Jret + sp_minus_U;...
207 zeros(size(div_Jret,1),sat_N), div_Jret, zeros(size(div_Jret,1),prs_N);
208 zeros(1, sat_N+vel_N), prs_Jret ];
212 function Xproj = box_projection(X, Slength)
Reduced data implementation for non-linear evolution problems with finite volume discretizations.
function IDetailedModel this = set_mu(mu)
sets the active parameter vector
Struct with control fields for the analytical PDE functions, the discretization and the parametrizati...
This is the interface for a detailed model providing methods to compute high dimensional simulation s...