rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
test_subgrid_operators.m
1 function ok = test_subgrid_operators
2 
3 
4  bg_descr.rb_problem_type = 'LinEvol';
5  bg_descr.detailed_data_constructor = @Test.DetailedData;
6  bg_descr.reduced_data_constructor = @LinEvol.ReducedData;
7 
8  ok = true;
9 
10  mm = minimal_model;
11  mm.newton_steps = 10;
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 );
18 
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;
37 end
38 
39 function mm = minimal_model
40  % declare minimal model
41  mm = [];
42  mm.name = 'minimal_model';
43  mm.mu_names = {'par1', 'par2', 'par3'};
44  mm.mu_ranges = {[0 1], [0 2], [0 3]};
45  mm.par1 = 0;
46  mm.par2 = 0;
47  mm.par3 = 0;
48  mm.debug = 0;
49  mm.force_delete = 1;
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;
54  mm.l2_error_sequence_algorithm = @fv_l2_error;
55 
56  mm.gridtype = 'rectgrid';
57  mm.xrange = [0 1];
58  mm.yrange = [0 1];
59  mm.xnumintervals = 5;
60  mm.ynumintervals = 5;
61  mm.bnd_rect_corner1 = [-1 -1];
62  mm.bnd_rect_corner2 = [2 2];
63  mm.bnd_rect_index = -2;
64 
65  mm.verbose = 9;
66  mm.decomp_mode = 0;
67 
68  mm.new = 1;
69  mm.operators_ptr = @(x) x;
70  % mm.init_values_algorithm = @(x) x;
71 
72  mm.error_norm = 'l2';
73 end
74 
75 function ok = optest(dmodel, bg_descr, ophandle)
76  disp(['Testing for operator: ', class(ophandle)]);
77  mm = dmodel.descr;
78 
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);
82 
83  ei_extension1 = Greedy.Plugin.EI(ei_gen1);
84  ei_extension1.stop_Mmax = 200;
85 
86  ei_greedy1 = Greedy.Algorithm(ei_extension1, M_train);
87  ei_greedy1.stop_timeout = 60*60;
88  ei_greedy1.stop_epsilon = 1e-9;
89 
90  bg_descr.bg_algorithm = ei_greedy1;
91  red_model1 = Test.ReducedModel(dmodel, bg_descr);
92 
93  model_data = gen_model_data(dmodel);
94  ok = 1;
95  try
96  evalc('detailed_data1 = gen_detailed_data(red_model1, model_data);');
97  catch exception
98  ok = 0;
99  disp('ei generation failed');
100  disp(getReport(exception));
101  end
102 
103  TM = detailed_data1.datatree.TM;
104  BM = detailed_data1.datatree.BM;
105  QM = detailed_data1.datatree.QM;
106 
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);
119 
120  M_train.init_sample(dmodel);
121  dmodel.set_mu(M_train.sample(1,:));
122  sim_data = rb_generator.generate(dmodel, model_data);
123 
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});
129  end
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);
134  end
135  TMg = [TMg{:}];
136  else
137  ei_sim_data = sim_data(reduced_data.TM_global);
138  end
139 
140  max_err_sequence = get_field_on_active_child(detailed_data1.datatree, ...
141  'max_err_sequence', red_model1);
142 
143  ok = ok & (max_err_sequence(end) < 1e-10);
144  ok = ok & length(max_err_sequence) <= 31;
145  if ok
146  disp('epsilon was reached');
147  else
148  disp('ERROR: epsilon was not reached');
149  end
150 
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);
155 
156  oknow = all(abs(full_res(TM) - subgrid_res) < 1e-9);
157  if ~oknow
158  disp('ERROR: subgrid extraction failed');
159  keyboard;
160  end
161  ok = ok & oknow;
162  oknow = all(abs(full_J(TM, TMg) - subgrid_J) < 1e-9);
163  if ~oknow
164  disp('ERROR: subgrid extraction for jacobian failed');
165  end
166  sigma = BM \ subgrid_res;
167  oknow = all(abs(full_res - QM * sigma) < 1e-9);
168  if ~oknow
169  disp('ERROR: EI reconstruction failed');
170  keyboard;
171  end
172  ok = ok & oknow;
173 end