rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
Combined.m
1 classdef Combined < Greedy.Interface
2  % combines two or more instances of a Greedy.Interface class by executing
3  % them subsequently.
4 
5  properties (SetAccess = private, Dependent)
6  generated_basis_type;
7 
8  id;
9  end
10 
11  properties (Access = private)
12  container;
13 
14  idmap;
15  end
16 
17  methods
18 
19  function cbg = Combined(varargin)
20  % function cbg = Combined(varargin)
21  % constructor storing the Greedy.Interface instances to be combined.
22  %
23  % Parameters:
24  % varargin: a list of greedy algorithm instances of type Greedy.Interface
25  cbg.container = varargin;
26  idm = cell(1, length(varargin));
27  for i = 1:length(idm)
28  idm{i} = varargin{i}.id;
29  end
30  cbg.idmap = idm;
31  cbg.generated_basis_type;
32  end
33 
34  function generated_type = get.generated_basis_type(this)
35  if all(cellfun(@(x) isequal(x.generated_basis_type, 'ei'), this.container))
36  generated_type = 'ei';
37  elseif all(cellfun(@(x) isequal(x.generated_basis_type, 'rb'), this.container))
38  generated_type = 'rb';
39  elseif length(this.container) == 2 ...
40  && isequal(get_generated_basis_type(this.container{1}), 'ei') ...
41  && isequal(this.container{2}.generated_basis_type, 'rb')
42  generated_type = 'eirb';
43  else
44  error('Unsupported combination of basis generation algorithms! You can combine only EI or only RB generations, or _one_ EI with _one_ RB');
45  end
46  end
47 
48 % function [max_errs, max_err_seq, max_mu_index] = error_indicators(this, detailed_data, parameter_set, reuse_reduced_data)
49 % if nargin < 4
50 % reuse_reduced_data = false;
51 % end
52 % if nargin < 3
53 % parameter_set = [];
54 % end
55 % if isequal(generated_type, 'eirb')
56 % [max_errs, max_err_seq, max_mu_index] = error_indicators(this.container{2}, detailed_data, parameter_set, reuse_reduced_data);
57 % elseif isequal(generated_type, 'ei')
58 % max_errs = DataTree.IdMapNode(this.idmap);
59 % max_err_seqs = DataTree.IdMapNode(this.idmap);
60 % max_mu_index = DataTree.IdMapNode(this.idmap);
61 % parameters = DataTree.IdMapNode(this.idmap, parameter_set);
62 %
63 % for i = 1:length(this.idmap)
64 % [me, mes, mu] = error_indicators(this.container{i}, get(detailed_data, i), ...
65 % get(parameters,i));
66 % set(max_errs, i, me);
67 % set(max_err_seqs, i, mes);
68 % set(max_mu_index, i, mu);
69 % end
70 %
71 % end
72 % end
73 
74  function id = get.id(this)
75  id = this.idmap;
76  end
77 
78  function prepare(this, rmodel, model_data)
79  for i=1:length(this.container)
80  prepare(this.container{i}, rmodel, model_data);
81  end
82  end
83 
84  function detailed_data = init_basis(this, rmodel, model_data)
85  % function detailed_data = init_basis(this, rmodel, model_data)
86  % @copybrief Greedy.Interface.init_basis()
87  %
88  % @copydoc Greedy.Interface.init_basis()
89  %
90  % Parameters:
91  % rmodel: of type Greedy.User.IReducedModel
92  if isequal(this.generated_basis_type, 'eirb')
93  detailed_data = Greedy.DataTree.Detailed.IdMapNode({'ei', 'rb'});
94  set(detailed_data, 1, init_basis(this.container{1}, rmodel, model_data));
95  ddrb = init_basis(this.container{2}, rmodel, model_data);
96 
97  tree_descr = get_leaf_description(ddrb);
98  for leaf_descr = tree_descr
99  dd_rb_leaf = get(ddrb, leaf_descr.basepath);
101  dd_podei_leaf = Greedy.DataTree.Detailed.PODEILeafNode(model_data, false);
102 % dd_podei_leaf.fields = dd_rb_leaf.fields;
103 % dd_podei_leaf.stop_flags = dd_rb_leaf.stop_flags;
104 % dd_rb_leaf.fields = [];
105 % dd_rb_leaf.stop_flags = [];
106 
107  dd_podei_leaf.rb = dd_rb_leaf;
108  % TODO: extract the subtree that fits to the rb_leaf...?
109  dd_podei_leaf.ei = get(detailed_data, 1);
110  if ~isempty(leaf_descr.basepath)
111  set(ddrb, leaf_descr.basepath, dd_podei_leaf);
112  else
113  ddrb = dd_podei_leaf;
114  end
115  end
116 
117  set(detailed_data, 2, ddrb);
118  return;
119  elseif isequal(this.generated_basis_type, 'ei')
120 % index_map = cellfun(@(x) x.detailed_extension.id, this.container, 'UniformOutput', false);
121  detailed_data = Greedy.DataTree.Detailed.IdMapNode(this.idmap);
122  else % generate several rb spaces subsequently
123  error('It is not supported yet to generate several RB spaces subsequently.');
124  end
125  for i=1:length(this.container)
126  set(detailed_data, i, init_basis(this.container{i}, rmodel, model_data));
127  end
128  end
129 
130  function detailed_data = basis_extension(this, rmodel, detailed_data, checkpoint)
131  % function detailed_data = basis_extension(this, rmodel, detailed_data, checkpoint)
132  % @copybrief Greedy.Interface.basis_extension()
133  %
134  % @copydetails Greedy.Interface.basis_extension()
135  %
136  % Parameters:
137  % rmodel: of type Greedy.User.IReducedModel
138  % detailed_data: of type Greedy.User.IDetailedData
139  idname = DataTree.IdMapNode.name_from_idmap(this.idmap);
140  if nargin == 2
141  checkpoint = Greedy.Checkpoint;
142  end
143  if isequal(this.generated_basis_type, 'eirb')
144  if ~get(checkpoint, 'ei_computed', false)
145  set(detailed_data, 1,...
146  basis_extension(this.container{1}, rmodel, ...
147  get(detailed_data,1), checkpoint.child(1) )...
148  );
149  end
150  checkpoint = checkpoint.store(rmodel, detailed_data, idname, struct('ei_computed', true));
151 
152  set(detailed_data, 2,...
153  basis_extension(this.container{2}, rmodel, ...
154  get(detailed_data,2), checkpoint.child(2) )...
155  );
156  else
157  ei_start = get(checkpoint, 'ei_ei_start', 1);
158  for i=ei_start:length(this.container)
159  set(detailed_data, i, ...
160  basis_extension(this.container{i}, rmodel, ...
161  get(detailed_data,i), checkpoint.child(i) )...
162  );
163  checkpoint = checkpoint.store(rmodel, detailed_data, idname, struct('ei_ei_start', i+1));
164  end
165  end
166  end
167 
168  function rb_basis_gen = get_rb_basis_generator(this)
169  % function rb_basis_gen = get_rb_basis_generator(this)
170  % returns the snapshot generator for the reduced basis construction
171  %
172  % Return values:
173  % rb_basis_gen: snapshot generator of type SnapshotsGenerator.Cached
174  if isequal(this.generated_basis_type, 'eirb')
175  rb_basis_gen = this.container{2};
176  else
177  rb_basis_gen = [];
178  end
179  end
180 
181  function rb_basis_gen = get_ei_basis_generator(this)
182  % function rb_basis_gen = get_ei_basis_generator(this)
183  % returns the snapshot generator for the reduced basis construction
184  %
185  % Return values:
186  % rb_basis_gen: snapshot generator of type SnapshotsGenerator.Cached
187  if isequal(this.generated_basis_type, 'eirb')
188  rb_basis_gen = this.container{1};
189  else
190  rb_basis_gen = [];
191  end
192  end
193  end
194 end
195