1 function ok = test_subgrid_operators
4 bg_descr.rb_problem_type =
'LinEvol';
5 bg_descr.detailed_data_constructor = @Test.DetailedData;
6 bg_descr.reduced_data_constructor = @LinEvol.ReducedData;
12 mm.newton_epsilon = 1e-10;
13 mm.two_phase = TwoPhaseData.Michel;
14 mm = mm.two_phase.default_descr(mm);
15 mm.mean_ptr = @(X) harmmean(max(X, 0), 2);
16 mm.mean_deriv1_ptr = @(X) 2./( (1./X(:,1) + 1./(X(:,2))).^2 .* X(:,1).^2 );
17 mm.mean_deriv2_ptr = @(X) 2./( (1./X(:,1) + 1./(X(:,2))).^2 .* X(:,2).^2 );
19 dmodel = TwoPhaseFlow.DetailedModel(mm);
20 model_data = gen_model_data(dmodel);
21 subfields(1).name =
'saturation';
22 subfields(2).name =
'velocity';
23 subfields(3).name =
'pressure';
24 subfields(1).shortname =
'S';
25 subfields(2).shortname =
'U';
26 subfields(3).shortname =
'P';
27 subfields(1).length = model_data.grid.nelements;
28 subfields(2).length = model_data.gn_edges;
29 subfields(3).length = model_data.grid.nelements;
30 subfields(1).ranges = [0 1];
31 subfields(2).ranges = [-2 2];
32 subfields(3).ranges = [-5 5];
33 mm.subfields = subfields;
34 dmodel = TwoPhaseFlow.DetailedModel(mm);
35 ok = optest(dmodel, bg_descr, Fv.TwoPhase.SaturationSpace) & ok;
36 ok = optest(dmodel, bg_descr, Fv.TwoPhase.VelocitySpace) & ok;
39 function mm = minimal_model
40 % declare minimal model
42 mm.name =
'minimal_model';
43 mm.mu_names = {
'par1',
'par2',
'par3'};
44 mm.mu_ranges = {[0 1], [0 2], [0 3]};
50 mm.filecache_ignore_fields_in_model = {
'subfields'};
51 mm.detailed_simulation = @(model, model_data)
struct(
'u', model.get_mu(model));
52 mm.mass_matrix = @fv_mass_matrix;
53 mm.get_inner_product_matrix = @(detailed_data) detailed_data.W;
56 mm.gridtype =
'rectgrid';
61 mm.bnd_rect_corner1 = [-1 -1];
62 mm.bnd_rect_corner2 = [2 2];
63 mm.bnd_rect_index = -2;
69 mm.operators_ptr = @(x) x;
70 % mm.init_values_algorithm = @(x) x;
75 function ok = optest(dmodel, bg_descr, ophandle)
76 disp(['Testing for operator: ', class(ophandle)]);
79 M_train = ParameterSampling.Random(30);
80 rb_generator = SnapshotsGenerator.Random(dmodel, 'random', [], true, false);
81 ei_gen1 = SnapshotsGenerator.SpaceOpEvals(dmodel, 'implicit', rb_generator, ophandle, true, false);
83 ei_extension1 = Greedy.Plugin.EI(ei_gen1);
84 ei_extension1.stop_Mmax = 200;
86 ei_greedy1 = Greedy.Algorithm(ei_extension1, M_train);
87 ei_greedy1.stop_timeout = 60*60;
88 ei_greedy1.stop_epsilon = 1e-9;
90 bg_descr.bg_algorithm = ei_greedy1;
91 red_model1 = Test.ReducedModel(dmodel, bg_descr);
93 model_data = gen_model_data(dmodel);
96 evalc('detailed_data1 = gen_detailed_data(red_model1, model_data);');
99 disp('ei generation failed');
100 disp(getReport(exception));
103 TM = detailed_data1.datatree.TM;
104 BM = detailed_data1.datatree.BM;
105 QM = detailed_data1.datatree.QM;
107 [nmd, eind, eind_local] = ophandle.compute_TM_global(model_data, TM);
108 reduced_data.grid_local_ext = nmd.grid_local_ext;
109 reduced_data.grid = nmd.grid_local_ext;
110 reduced_data.TM_global_args = nmd.TM_global_args;
111 reduced_data.gEI = nmd.gEI;
112 reduced_data.gn_edges = nmd.gn_edges;
113 reduced_data.gn_inner_edges = nmd.gn_inner_edges;
114 reduced_data.gn_boundary_edges = nmd.gn_boundary_edges;
115 reduced_data.TM_global = eind;
116 reduced_data.TM_local = eind_local;
117 reduced_data.BM = BM;
118 reduced_data.opdata = ophandle.fill_opdata(red_model1, detailed_data1.datatree);
120 M_train.init_sample(dmodel);
121 dmodel.set_mu(M_train.sample(1,:));
122 sim_data = rb_generator.generate(dmodel, model_data);
124 if isfield(mm, 'subfields')
125 [names, ii, jj] = intersect({mm.subfields(:).shortname}, ophandle.arg_vars_short);
126 TMg = reduced_data.TM_global_args(jj);
127 for i = 1:length(names)
128 ei_sim_data.(names{i}) = sim_data.(names{i})(TMg{i});
130 offset = size(sim_data.(names{1}), 1);
131 for i = 2:length(names)
132 TMg{i} = TMg{i} + offset;
133 offset = offset + size(sim_data.(names{i}), 1);
137 ei_sim_data = sim_data(reduced_data.TM_global);
140 max_err_sequence = get_field_on_active_child(detailed_data1.datatree, ...
141 'max_err_sequence', red_model1);
143 ok = ok & (max_err_sequence(end) < 1e-10);
144 ok = ok & length(max_err_sequence) <= 31;
146 disp(
'epsilon was reached');
148 disp(
'ERROR: epsilon was not reached');
151 [full_res, dummy, full_J] = ...
152 ophandle.apply(mm, model_data, sim_data);
153 [subgrid_res dummy, subgrid_J] = ...
154 ophandle.apply(mm, reduced_data, ei_sim_data, reduced_data.TM_local);
156 oknow = all(abs(full_res(TM) - subgrid_res) < 1e-9);
158 disp(
'ERROR: subgrid extraction failed');
162 oknow = all(abs(full_J(TM, TMg) - subgrid_J) < 1e-9);
164 disp(
'ERROR: subgrid extraction for jacobian failed');
166 sigma = BM \ subgrid_res;
167 oknow = all(abs(full_res - QM * sigma) < 1e-9);
169 disp(
'ERROR: EI reconstruction failed');