rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
dom_dec_RB_extension_eigenbasis.m
1 function RBext_G = dom_dec_RB_extension_eigenbasis(model, ...
2  detailed_data)
3 %function RBext_G = dom_dec_RB_extension_eigenbasis(model, ...
4 % detailed_data)
5 %
6 
7 % IM, 17.04.2012
8 
9 no_dir = mod(model.dirichlet_side,2)+1;
10 
11 [RB_0,RB_G] = model.get_rb_from_detailed_data(detailed_data);
12 clear('RB_0');
13 
14 RBext_G = cell(1,2);
15 
16 A = detailed_data.harm_ext_matrices;
17 G = detailed_data.gamma_inner_product_matrices;
18 g_dofs = detailed_data.gamma_dofs;
19 
20 for i = 1:2
21  G{i} = G{i}(g_dofs{no_dir},g_dofs{no_dir});
22 end;
23 
24 if (size(RB_G{no_dir},2) > 0)
25  % compute orthonormalized interface bases
26  warning off;
27  RB_GG = orthonormalize(RB_G{no_dir}(g_dofs{no_dir},:),G{1},[],'qr');
28  warning on;
29  clear('RB_G');
30 
31  % compute orthogonal complement
32  RB_GG_compl = eye(length(g_dofs{no_dir})) - ...
33  RB_GG * (RB_GG' * G{1});
34  clear('RB_GG');
35 
36  % eliminate linear dependent modes
37  RB_GG_compl = orthonormalize(RB_GG_compl,G{1},[],'qr');
38 
39  % solve generalized eigenvalue problem
40  [ep,vp] = eig(RB_GG_compl' * G{2} * RB_GG_compl,...
41  eye(size(RB_GG_compl,2)));
42 
43  evalues = diag(vp);
44 
45  [evalues,indices] = sort(evalues,1,'ascend');
46  RBext_GG = RB_GG_compl * ep(:,indices);
47 
48 else
49  % ............. see below
50  [ep,vp] = eig(G{2},G{1});
51 
52  evalues = diag(vp);
53 
54  % important modes correspond to small eigenvalues ???????
55  [evalues,indices] = sort(evalues,1,'ascend');
56  RBext_GG = ep(:,indices);
57 
58 end;
59 
60 % harmonic extensions (XNG1, XNG2)
61 for i = 1:2
62  zeroExt = zeros(detailed_data.df_infos{i}.ndofs, ...
63  size(RBext_GG,2));
64  zeroExt(g_dofs{i},:) = RBext_GG;
65  RBext_G{i} = A{i}\zeroExt;
66 end;