rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
rb_simulation_impl.m
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
5 % assumed to be set by IDetailedModel.set_mu()
6 %
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: ---
12 %
13 % The behaviour of this simulation is controlled by the ModelDescr structure
14 % 'rmodel.descr'.
15 %
16 % Parameters:
17 % reduced_data: of type TwoPhaseFlow.EiRbReducedDataNode
18 %
19 % generated fields of rb_sim_data:
20 % a : 'a(:,k)' is the coefficient vector of the reduced simulation at time
21 % `t^{k-1}`
22 %
23 
24 %if ~(nargin == 2)
25 % error('wrong number of arguments: should be 2');
26 %end
27 
28 if rmodel.verbose >= 10
29  disp(['performing simulation for mu = ',mat2str(get_mu(rmodel))]);
30 end;
31 
32 % set init data
33 rmodel.decomp_mode = 2;
34 
35 sat0Ind = get_index(reduced_data, 'sat_init', get_mu(rmodel), rmodel.t);
36 rd_sat0 = get(reduced_data, sat0Ind);
37 
38 descr = rmodel.descr;
39 
40 sat_a0 = lincomb_sequence(rd_sat0, descr);
41 
42 % perform simulation loop in time
43 descr.dt = descr.T/descr.nt;
44 
45 sat_N = get_N(rmodel, 'saturation');
46 vel_N = get_N(rmodel, 'velocity');
47 prs_N = get_N(rmodel, 'pressure');
48 descr.prs_N = prs_N;
49 
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);
55 
56 sat_a(:,1) = sat_a0(1:sat_N);
57 
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);
63 
64 % loop over time steps: computation of a(t+1)==a^t
65 for t = 1:descr.nt
66  descr.t = (t-1)*descr.dt;
67  descr.tstep = t;
68  if rmodel.verbose >= 10
69  disp(['entered time-loop step ',num2str(t)]);
70  end;
71 
72  V_last = [sat_a(:,t); vel_a(:,t); prs_a(:,t)];
73  descr.t = descr.t + descr.dt;
74 
75  fsolve_fun = @(X) sat_fun(descr, sat_a(:,t), X, rd_sat, rd_vel, rd_div, rd_prs);
76 
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);
83 
84  exflags(t) = exitflag;
85  outtext{t} = output;
86 
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);
90 
91 end
92 
93 if rmodel.enable_error_estimator
94  error('error estimator is not implemented yet.');
95  rb_sim_data.Delta = 0;
96 end
97 
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;
104 
105 end
106 
107 function [reduced_data_op] = get_reduced_data_for_operator(id, rmodel, reduced_data)
108 
109  crbInd = get_index(reduced_data, id, get_mu(rmodel), rmodel.t);
110  reduced_data_op = get(reduced_data, crbInd);
111 
112 
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)) )
116 
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);
121  end
122 end
123 
124 function [ret, J] = sat_fun(descr, Sold, X, rd_sat, rd_vel, rd_div, rd_prs)
125 
126  sat_N = length(Sold);
127  vel_N = size(rd_sat.RB_local_ext.U, 2);
128  prs_N = descr.prs_N;
129 
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);
133  Xsat.Uoff = msatsat;
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;
136 
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);
140  else
141 
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);
148  Xvel.Poff = mvelsat;
149  Xvel.n = vel_N;
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);
153 
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);
169 
170  end
171 
172 
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));
177 
178  sat_ret = (X(1:sat_N) - Sold)./descr.dt + sat_ret;
179  ret = [sat_ret; vel_ret; div_ret; prs_ret];
180 
181  if nargout > 1
182 
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));
190 
191  if descr.linear_velocity
192  vel_Jret = [zeros(size(vel_Jret,1), sat_N+vel_N), vel_Jret];
193  else
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 ];
202  end
203 
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 ];
209  end
210 end
211 
212 function Xproj = box_projection(X, Slength)
213 
214  Xproj = X;
215 
216 end
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...
Definition: dummyclasses.c:15
This is the interface for a detailed model providing methods to compute high dimensional simulation s...