rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
ReducedData.m
1 classdef ReducedData < AbstractModel.ReducedData
2 
3  properties
4  A_comp;
5  B_comp;
6  C_comp;
7  E_comp;
8  R_comp;
9  Q_comp;
10 
11  estim;
12 
13  gamma_function;
14  gamma_mode;
15 
16  RB_V;
17  RB_W;
18 
19  RB_size;
20  end
21 
22  methods
23  function obj = ReducedData(model, detailed_data)
24  % REDUCEDDATA Constructor for the class
25  model_data = detailed_data.model_data;
26 
27  % Extract the reduced basis matrices
28  V = detailed_data.RB_V;
29  W = detailed_data.RB_W;
30 
31  obj.RB_V = V;
32  obj.RB_W = W;
33  obj.RB_size = size(W,2);
34 
35  for k = 1:length(model_data.A_comp)
36  obj.A_comp{k} = W'*model_data.A_comp{k}*V;
37  end
38 
39  for k = 1:length(model_data.B_comp)
40  obj.B_comp{k} = W'*model_data.B_comp{k};
41  end
42 
43  for k = 1:length(model_data.C_comp)
44  obj.C_comp{k} = model_data.C_comp{k}*V;
45  end
46 
47  for k = 1:length(model_data.E_comp)
48  obj.E_comp{k} = W'*model_data.E_comp{k}*V;
49  end
50 
51  obj.R_comp = model_data.R_comp;
52  obj.Q_comp = model_data.Q_comp;
53 
54  % Calculate all the reduced quantities:
55  estim.M1a = {};
56  for i = 1:length(model_data.C_comp)
57  for j = 1:length(model_data.A_comp)
58  estim.M1a{i,j} = model_data.C_comp{i}*model_data.A_comp{j}'*W;
59  end
60  end
61  for i = 1:length(model_data.E_comp)
62  for j = 1:length(model_data.C_comp)
63  estim.M1b{i,j} = W'*model_data.E_comp{i}*model_data.C_comp{j}';
64  end
65  end
66 
67  estim.M3 = {};
68  for i=1:length(model_data.C_comp)
69  for j=1:length(model_data.C_comp)
70  for k=1:length(model_data.E_comp)
71  for l=1:length(model_data.E_comp)
72  estim.M4{i,j,k,l} = (W'*model_data.E_comp{k}*model_data.C_comp{i}')*(model_data.C_comp{j}*model_data.E_comp{l}'*W);
73  end
74  end
75  end
76  end
77 
78  estim.M5 = {};
79  estim.M6 = {};
80  for i = 1:length(model_data.A_comp)
81  for j = 1:length(model_data.E_comp)
82  estim.M3{i,j} = W'*model_data.E_comp{j}*(model_data.A_comp{i})'*W;
83  estim.M6{i,j} = estim.M3{i,j}';
84  end
85  for j = 1:length(model_data.A_comp)
86  estim.M5{i,j} = W'*model_data.A_comp{i}*(model_data.A_comp{j}')*W;
87  end
88  end
89 
90  for i = 1:length(model_data.C_comp)
91  for j = 1:length(model_data.C_comp)
92  estim.M7{i,j} = model_data.C_comp{i}*model_data.C_comp{j}';
93  end
94  end
95 
96  for i = 1:length(model_data.E_comp)
97  for j = 1:length(model_data.E_comp)
98  estim.M8{i,j} = W'*model_data.E_comp{i}*(model_data.E_comp{j}')*W;
99  end
100  end
101 
102 
103 
104  if length(model_data.E_comp) > 1
105  error('We cannot deal with more than one component in the matrices E,B,R,Q')
106  end
107 
108  % Finally the last components for the error estimator:
109  [~,nE] = evalc('svds(model_data.E_comp{1}, 1);');
110  estim.normE = nE;
111  nEinv = [];
112  while isempty(nEinv)
113  [~,nEinv] = evalc('1/svds(model_data.E_comp{1},1,0);');
114  end
115  estim.normEinv = nEinv;
116 
117  % Prepare the value for ||BR^{-1}B^T||
118  estim.normBBT = {};
119  estim.normBBT_use2norm = false;
120  if length(model_data.B_comp) == 1
121  estim.normBBT = norm(full(model_data.B_comp{1}));
122  estim.normBBT_use2norm = true;
123  else
124  % We use the Frobenius norm as an upper bound for the
125  % 2-norm
126  for i = 1:length(model_data.B_comp)
127  for j = 1:length(model_data.B_comp)
128  for k = 1:length(model_data.B_comp)
129  for l = 1:length(model_data.B_comp)
130  estim.normBBT{i,j,k,l} = trace(model_data.B_comp{k}'*model_data.B_comp{l});
131  end
132  end
133  end
134  end
135  end
136 
137  estim.WtW = W'*W;
138 
139  % For the calculation of norm A:
140  normA = {};
141  for i = 1:length(model_data.A_comp)
142  for j = 1:length(model_data.A_comp)
143  normA{i,j} = trace(model_data.A_comp{i}'*model_data.A_comp{j});
144  end
145  end
146  estim.normA = normA;
147 
148  normB = {};
149  for i = 1:length(model_data.B_comp)
150  for j = 1:length(model_data.B_comp)
151  normB{i,j} = trace(model_data.B_comp{i}'*model_data.B_comp{j});
152  end
153  end
154  estim.normB = normB;
155 
156  obj.estim = estim;
157  if ~isempty(detailed_data.gamma)
158  obj.gamma_function = detailed_data.gamma_calculation.gen_reduced_data(model, detailed_data, obj);
159  end
160  obj.gamma_mode = detailed_data.gamma_mode;
161  end
162 
163  end
164 
165 
166 end
Abstract OOP model implementation interface.