rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
EIPOD.m
1 classdef EIPOD < Greedy.Plugin.EI
2  % Plugin for the Greedy.Algorithm class generating a collateral reduced basis
3  % space plus interpolation DOFs and a local grid.
4  %
5  % This can be used for the empirical interpolation of parametrized functions
6  % or operator evaluations.
7 
8  methods
9  function eide = EIPOD(generator)
10  % constructor storing the snapshot generator
11  %
12  % Parameters:
13  % generator: snapshot generator of type SnapshotsGenerator.Cached.
14  eide = eide@Greedy.Plugin.EI(generator);
15  end
16 
17  function Uapprox = generate_reduced(this, rmodel, reduced_data, detailed_data, U)
18  % function Uapprox = generate_reduced(this, [], [], detailed_data, U)
20  %
22  %
23  % Parameters:
24  % rmodel: of type .Greedy.User.IReducedModel
25  % detailed_data: of type .Greedy.User.IDetailedData
26  % reduced_data: of type .Greedy.User.IReducedData
27 
28  switch get_field(detailed_data, 'ei_target_error')
29  case 'approx'
30  P = this.A * U;
31  Uapprox = detailed_data.QM*P;
32  case {'interpol', 'linfty-interpol'}
33  coeff = detailed_data.BM \ U(detailed_data.TM,:);
34  Uapprox = detailed_data.QM * coeff;
35  otherwise
36  error('ei_target_error unknown!');
37  end
38  end
39 
40  function detailed_data = basis_extension(this, rmodel, detailed_data, max_err_seq, mu)
41  % function detailed_data = basis_extension(this, rmodel, detailed_data, max_err_seq, mu)
43  %
45  %
46  % Parameters:
47  % rmodel: of type .Greedy.User.IReducedModel
48  % detailed_data: of type .Greedy.DataTree.Detailed.EILeafNode
49  %
50  % Return values:
51  % detailed_data: of type .Greedy.DataTree.Detailed.EILeafNode
52  %
53  dmodel = rmodel.detailed_model;
54  set_mu(dmodel, mu);
55  LU = generate(this.generator, dmodel, detailed_data.model_data);
56  LU_red = generate_reduced(this, rmodel, [], detailed_data, LU);
57 
58  if size(LU,1) == detailed_data.model_data.grid.nelements
59  A = detailed_data.model_data.W;
60  else
61  A = detailed_data.model_data.diamondW;
62  end
63  QM = detailed_data.QM;
64  zeta_M = PCA_fixspace(LU - LU_red, QM, A, 1, 'qr',eps);
65 
66  % residual
67  r_M = zeta_M;
68 
69  TM = detailed_data.TM;
70  BM = detailed_data.BM;
71 
72  m = size(QM, 2);
73  %% compute interpolant
74  if (m > 0)
75 
76  % get target values in interpolation points
77  zeta_M_part = zeta_M(TM);
78 
79  % get interpolation coefficients
80  %sigma = bicgstab(BM,zeta_M_part,[],1000);
81  sigma = BM \ zeta_M_part;
82 
83  % compute residual and project it onto QM^orthogonal
84  r_M = zeta_M - QM * sigma;
85  if rmodel.verbose > 1
86  disp(['positive minus negative contributions of residual (should be zero:)', num2str(sum(r_M))]);
87  disp(['positive minus negative contributions of zeta_M (should be zero:)', num2str(sum(zeta_M))]);
88  end
89 % if(sum(r_M) > 1e-4)
90 % keyboard;
91 % end
92  end;
93  max_r = max(abs(r_M));
94  t_M = find(abs(r_M) >= max_r - 1e-12, 1);
95 
96  if ~isempty(t_M)
97  if ~isempty(find(t_M(1)==TM, 1))
98  error('empirical interpolation selected magic point twice!!');
99  end
100 
101  q_M = PCA_fixspace(r_M, QM, A, 1, 'qr', eps);
102 % q_M = orth_r_M / orth_r_M(t_M(1)); % then sign is respected short version
103  % (after verifying zero-1 structure...)
104  % BM = [BM, zeros(m-1,1) ; ...
105  % QM(t_M,:), 1 ]; % interpolation matrix mit BM(i,j) = q_j(t_i)
106  % TM = [TM; t_M]; % new vector of interpolation DOFs
107  % QM = [QM, q_M]; % new matrix of basis functions
108  if rmodel.verbose > 1
109  disp(['positive minus negative contributions of new basis function (should be zero:)', num2str(sum(q_M))]);
110  end
111  if abs(sum(q_M)) > 1e-12 && get_field(detailed_data, 'enable_regularisation')
112  subset = abs(q_M) > 1e-8;
113  if length(subset) > 10
114  q_M(subset) = q_M(subset) - sum(q_M)/length(q_M(subset));
115  end
116  if rmodel.verbose > 1
117  disp('WARNING: applied regularisation!');
118  disp(['positive minus negative contributions of new basis function (should be zero:)', num2str(sum(q_M))]);
119  end
120  end
121 
122 
123  BM = [BM, q_M(TM) ; ...
124  QM(t_M,:), q_M(t_M) ]; % interpolation matrix mit BM(i,j) = q_j(t_i)
125  TM = [TM; t_M]; % new vector of interpolation DOFs
126  QM = [QM, q_M]; % new matrix of basis functions
127 
128  detailed_data.BM = BM;
129  detailed_data.TM = TM;
130  detailed_data.QM = QM;
131 
132 
133  else
134  set_stop_flag(detailed_data, 'stopped_on_empty_extension');
135  end
136 
137  end
138 
139  function cop = copy(this)
140  % function cop = copy(this)
141  % deep copy of Greedy.Plugin.EI object
142  %
143  % Return values:
144  % cop: copied object of type Greedy.Plugin.EI
145  cop = EI(this.generator);
146 
147  fnames = fieldnames(this);
148  for i=1:length(fnames)
149  cop.(fnames{i}) = this.(fnames{i});
150  end
151  end
152 
153  end
154 end
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...
Definition: verbose.m:17
Interface for the storage and generation of detailed data that can be used to build reduced basis fun...
Definition: Cached.m:18
default greedy basis generation class
Definition: Algorithm.m:18
virtual function Uapprox = generate_reduced(Greedy.User.IReducedModel rmodel,Greedy.User.ReducedData reduced_data,Greedy.User.IDetailedData detailed_data, U)
generates a reduced function .
Specialization plugins for the greedy algorithm.
Definition: Default.m:2
Cacheable generators of detailed data snapshots.
Definition: Cached.m:1
virtual function Greedy.User.IDetailedData detailed_data = basis_extension(Greedy.User.IReducedModel rmodel,Greedy.User.IDetailedData detailed_data, max_err_seq, mu)
extends the reduced basis space from a given function .
Plugin for the Greedy.Algorithm class generating a collateral reduced basis space plus interpolation ...
Definition: EI.m:19
Customizable implementation of an abstract greedy algorithm.
Definition: DuneRBLeafNode.m:1