2 % Plugin
for the
Greedy.
Algorithm class generating a collateral reduced basis
3 % space plus interpolation DOFs and a local grid.
5 % This can be used
for the empirical interpolation of parametrized functions
6 % or
operator evaluations.
9 function eide = EIPOD(generator)
10 % constructor storing the snapshot generator
17 function Uapprox = generate_reduced(
this, rmodel, reduced_data, detailed_data, U)
18 %
function Uapprox = generate_reduced(
this, [], [], detailed_data, U)
24 % rmodel: of type .Greedy.User.IReducedModel
25 % detailed_data: of type .Greedy.User.IDetailedData
26 % reduced_data: of type .Greedy.User.IReducedData
28 switch get_field(detailed_data,
'ei_target_error')
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;
36 error(
'ei_target_error unknown!');
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)
47 % rmodel: of type .Greedy.User.IReducedModel
48 % detailed_data: of type .Greedy.DataTree.Detailed.EILeafNode
51 % detailed_data: of type .Greedy.DataTree.Detailed.EILeafNode
53 dmodel = rmodel.detailed_model;
55 LU = generate(this.generator, dmodel, detailed_data.model_data);
56 LU_red = generate_reduced(
this, rmodel, [], detailed_data, LU);
58 if size(LU,1) == detailed_data.model_data.grid.nelements
59 A = detailed_data.model_data.W;
61 A = detailed_data.model_data.diamondW;
63 QM = detailed_data.QM;
64 zeta_M = PCA_fixspace(LU - LU_red, QM, A, 1,
'qr',eps);
69 TM = detailed_data.TM;
70 BM = detailed_data.BM;
73 %% compute interpolant
76 %
get target values in interpolation points
77 zeta_M_part = zeta_M(TM);
79 %
get interpolation coefficients
80 %sigma = bicgstab(BM,zeta_M_part,[],1000);
81 sigma = BM \ zeta_M_part;
83 % compute residual and project it onto QM^orthogonal
84 r_M = zeta_M - QM * sigma;
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))]);
93 max_r = max(abs(r_M));
94 t_M = find(abs(r_M) >= max_r - 1e-12, 1);
97 if ~isempty(find(t_M(1)==TM, 1))
98 error('empirical interpolation selected magic point twice!!');
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
109 disp(['positive minus negative contributions of new basis function (should be zero:)', num2str(sum(q_M))]);
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));
117 disp('WARNING: applied regularisation!');
118 disp(['positive minus negative contributions of new basis function (should be zero:)', num2str(sum(q_M))]);
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
128 detailed_data.BM = BM;
129 detailed_data.TM = TM;
130 detailed_data.QM = QM;
134 set_stop_flag(detailed_data, 'stopped_on_empty_extension');
139 function cop = copy(this)
140 % function cop = copy(this)
141 % deep copy of
Greedy.Plugin.
EI object
144 % cop: copied
object of type
Greedy.Plugin.
EI
145 cop =
EI(this.generator);
147 fnames = fieldnames(this);
148 for i=1:length(fnames)
149 cop.(fnames{i}) = this.(fnames{i});
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...
Interface for the storage and generation of detailed data that can be used to build reduced basis fun...
default greedy basis generation class
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.
Cacheable generators of detailed data snapshots.
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 ...
Customizable implementation of an abstract greedy algorithm.