rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
dom_dec_PCA_fixspace.m
1 function [B_0,B_G] = dom_dec_PCA_fixspace(X,XFix_0,XFix_G,A,A_G, ...
2  gamma_dofs,PCA_modes,epsilon)
3 %function [B_0,B_G] = dom_dec_PCA_fixspace(X,XFix_0,XFix_G,A,A_G, ...
4 % gamma_dofs,PCA_modes,epsilon)
5 %
6 % computing PCA fixspaces according to schema 2 for the RB
7 % extension
8 %
9 % Return values:
10 % B_0: extension for `X_{N,2}^0`
11 % B_G: extension for `X_{N,2}^G`
12 
13 % I.Maier 19.07.2011
14 
15 % compute pca modes
16 X = PCA_fixspace(X,[XFix_0,XFix_G],A,PCA_modes,[],epsilon);
17 
18 % orthonormalize XFix_G with respect to L2-Gamma inner product
19 
20 A_GG = sparse(A_G(gamma_dofs,gamma_dofs));
21 
22 if isempty(XFix_G)
23  XFix_G = [];
24 else
25  for i = 1:(size(XFix_G,2)-1)
26  for j = (i+1):size(XFix_G,2)
27  if isequal(XFix_G(:,i),XFix_G(:,j))
28  XFix_G(:,j) = 0;
29  end;
30  end;
31  end;
32 
33  opts.shape = 'upper';
34  opts.type = 'ict';
35  R_M = ichol(A_GG, opts);
36  [~,R,E] = qr(R_M * XFix_G(gamma_dofs,:),0);
37  XFix_G = XFix_G(:,E);
38 
39  ind = find(abs(diag(R))>epsilon);
40  if ~isempty(ind)
41  XFix_G = XFix_G(:,ind);
42  Rind = R(ind,ind);
43  XFix_G = XFix_G(:,ind) / Rind;
44  end;
45 
46 end;
47 
48 % separate RB_0, RB_G extension
49 if ~isempty(XFix_G)
50  Xo = X - XFix_G * (XFix_G' * A_G * X);
51 else
52  Xo = X;
53 end;
54 clear('A_G');
55 
56 K = Xo(gamma_dofs,:)' * A_GG * Xo(gamma_dofs,:);
57 K = 0.5*(K + K');
58 clear('A_GG');
59 
60 [ep,vp] = eigs(K);
61 evalues = diag(vp);
62 
63 fi_G = find(abs(evalues)>=epsilon);
64 fi_0 = find(abs(evalues)<epsilon);
65 
66 B_0 = Xo * ep(:,fi_0);
67 B_G = X * ep(:,fi_G);
68 
69 clear('X');
70 clear('Xo');
71 
72 B_0(gamma_dofs,:) = 0;
73 
74 % compute pod-extension
75 B_0 = PCA_fixspace(B_0,XFix_0,A,[],[],epsilon);