comparison +util/calc_borrowing.m @ 327:d24869abc7cd feature/beams

Calculated borrowin for D4Lonely.
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 27 Sep 2016 09:46:58 +0200
parents 8b4993d53663
children
comparison
equal deleted inserted replaced
326:b19e142fcae1 327:d24869abc7cd
1 1 function calc_borrowing(m, h)
2 m = 100; 2 default_arg('m',100);
3 h = 1; 3 default_arg('h',1);
4 4
5 5 operators = {
6 %% 4th order non-compatible 6 {
7 [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher4(m,h); 7 'd4_lonely', getM4_lonely, {
8 S1 = S_1*S_1' + S_m*S_m'; 8 {4, 'min_boundary_points'},
9 S2 = S2_1*S2_1' + S2_m*S2_m'; 9 {6, 'min_boundary_points'},
10 S3 = S3_1*S3_1' + S3_m*S3_m'; 10 {6, '2'},
11 11 {6, '3'},
12 alpha_I = util.matrixborrow(M4, h^-1*S1 ); 12 {8, 'min_boundary_points'},
13 alpha_II = util.matrixborrow(M4, h*S2 ); 13 {8, 'higher_boundary_order'},
14 alpha_III = util.matrixborrow(M4, h^3*S3); 14 }
15 fprintf('4th order non-compatible\n') 15 }, {
16 fprintf('alpha_I1: %.10f\n',alpha_I) 16 'd4_variable', {
17 fprintf('alpha_II: %.10f\n',alpha_II) 17 {2},
18 fprintf('alpha_III: %.10f\n',alpha_III) 18 {4},
19 fprintf('\n') 19 {6},
20 20 }
21 21 }
22 %% 6th order non-compatible 22 % BORKEN BAD IDEA
23 [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher6(m,h); 23 }
24 S1 = S_1*S_1' + S_m*S_m'; 24
25 S2 = S2_1*S2_1' + S2_m*S2_m'; 25
26 S3 = S3_1*S3_1' + S3_m*S3_m'; 26 for i = 1:operators
27 27 baseName = operators{i}{1};
28 alpha_II = util.matrixborrow(M4, h*S2 ); 28 postFixes = operators{i}{2};
29 alpha_III = util.matrixborrow(M4, h^3*S3); 29 for pf = postFixes
30 fprintf('6th order non-compatible\n') 30 [a2, a3] = borrowFromD4(m, h, l{:});
31 fprintf('alpha_II: %.10f\n',alpha_II) 31 end
32 fprintf('alpha_III: %.10f\n',alpha_III) 32 end
33 fprintf('\n') 33
34 34
35 35
36 %% 2nd order compatible 36 lonely = {
37 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible2(m,h); 37 {4, 'min_boundary_points'},
38 S1 = S_1*S_1' + S_m*S_m'; 38 {6, 'min_boundary_points'},
39 S2 = S2_1*S2_1' + S2_m*S2_m'; 39 {6, '2'},
40 S3 = S3_1*S3_1' + S3_m*S3_m'; 40 {6, '3'},
41 41 {8, 'min_boundary_points'},
42 alpha_II = util.matrixborrow(M4, h*S2 ); 42 {8, 'higher_boundary_order'},
43 alpha_III = util.matrixborrow(M4, h^3*S3); 43 };
44 fprintf('2nd order compatible\n') 44
45 fprintf('alpha_II: %.10f\n',alpha_II) 45 for i = 1:length(lonely)
46 fprintf('alpha_III: %.10f\n',alpha_III) 46 l = lonely{i};
47 fprintf('\n') 47 [a2, a3] = d4_lonely(m, h, l{:});
48 48 fprintf('d4_lonely %d %s\n', l{:})
49 49 fprintf('\t alpha_II = %f\n', a2)
50 %% 4th order compatible 50 fprintf('\t alpha_III = %f\n', a3)
51 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible4(m,h); 51 fprintf('\n')
52 S1 = S_1*S_1' + S_m*S_m'; 52 end
53 S2 = S2_1*S2_1' + S2_m*S2_m'; 53
54 S3 = S3_1*S3_1' + S3_m*S3_m'; 54 variable = {
55 55 {2},
56 alpha_II = util.matrixborrow(M4, h*S2 ); 56 {4},
57 alpha_III = util.matrixborrow(M4, h^3*S3); 57 {6},
58 fprintf('4th order compatible\n') 58 };
59 fprintf('alpha_II: %.10f\n',alpha_II) 59
60 fprintf('alpha_III: %.10f\n',alpha_III) 60 for i = 1:length(variable)
61 fprintf('\n') 61 l = variable{i};
62 62 [a2, a3] = d4_variable(m, h, l{:});
63 %% 6th order compatible 63 fprintf('d4_variable %d\n', l{:})
64 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible6(m,h); 64 fprintf('\t alpha_II = %f\n', a2)
65 S1 = S_1*S_1' + S_m*S_m'; 65 fprintf('\t alpha_III = %f\n', a3)
66 S2 = S2_1*S2_1' + S2_m*S2_m'; 66 fprintf('\n')
67 S3 = S3_1*S3_1' + S3_m*S3_m'; 67 end
68 68
69 alpha_II = util.matrixborrow(M4, h*S2 ); 69
70 alpha_III = util.matrixborrow(M4, h^3*S3); 70 %% 4th order non-compatible
71 fprintf('6th order compatible\n') 71 [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher4(m,h);
72 fprintf('alpha_II: %.10f\n',alpha_II) 72 S1 = S_1*S_1' + S_m*S_m';
73 fprintf('alpha_III: %.10f\n',alpha_III) 73 S2 = S2_1*S2_1' + S2_m*S2_m';
74 fprintf('\n') 74 S3 = S3_1*S3_1' + S3_m*S3_m';
75 75
76 76 alpha_I = util.matrixborrow(M4, h^-1*S1 );
77 77 alpha_II = util.matrixborrow(M4, h*S2 );
78 78 alpha_III = util.matrixborrow(M4, h^3*S3);
79 79 fprintf('4th order non-compatible\n')
80 % Ordinary 80 fprintf('alpha_I1: %.10f\n',alpha_I)
81 81 fprintf('alpha_II: %.10f\n',alpha_II)
82 for order = [2 4 6 8 10] 82 fprintf('alpha_III: %.10f\n',alpha_III)
83 op = sbp.Ordinary(m,h, order); 83 fprintf('\n')
84 84
85 S_1 = op.boundary.S_1; 85
86 S_m = op.boundary.S_m; 86 %% 6th order non-compatible
87 87 [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher6(m,h);
88 M = op.norms.M; 88 S1 = S_1*S_1' + S_m*S_m';
89 89 S2 = S2_1*S2_1' + S2_m*S2_m';
90 S1 = S_1*S_1' + S_m*S_m'; 90 S3 = S3_1*S3_1' + S3_m*S3_m';
91 alpha = util.matrixborrow(M, h*S1); 91
92 fprintf('%dth order Ordinary\n', order) 92 alpha_II = util.matrixborrow(M4, h*S2 );
93 fprintf('alpha: %.10f\n', alpha) 93 alpha_III = util.matrixborrow(M4, h^3*S3);
94 fprintf('\n') 94 fprintf('6th order non-compatible\n')
95 end 95 fprintf('alpha_II: %.10f\n',alpha_II)
96 96 fprintf('alpha_III: %.10f\n',alpha_III)
97 97 fprintf('\n')
98
99
100 %% 2nd order compatible
101 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible2(m,h);
102 S1 = S_1*S_1' + S_m*S_m';
103 S2 = S2_1*S2_1' + S2_m*S2_m';
104 S3 = S3_1*S3_1' + S3_m*S3_m';
105
106 alpha_II = util.matrixborrow(M4, h*S2 );
107 alpha_III = util.matrixborrow(M4, h^3*S3);
108 fprintf('2nd order compatible\n')
109 fprintf('alpha_II: %.10f\n',alpha_II)
110 fprintf('alpha_III: %.10f\n',alpha_III)
111 fprintf('\n')
112
113
114 %% 4th order compatible
115 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible4(m,h);
116 S1 = S_1*S_1' + S_m*S_m';
117 S2 = S2_1*S2_1' + S2_m*S2_m';
118 S3 = S3_1*S3_1' + S3_m*S3_m';
119
120 alpha_II = util.matrixborrow(M4, h*S2 );
121 alpha_III = util.matrixborrow(M4, h^3*S3);
122 fprintf('4th order compatible\n')
123 fprintf('alpha_II: %.10f\n',alpha_II)
124 fprintf('alpha_III: %.10f\n',alpha_III)
125 fprintf('\n')
126
127 %% 6th order compatible
128 [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m, S_1, S_m] = sbp.higher_compatible6(m,h);
129 S1 = S_1*S_1' + S_m*S_m';
130 S2 = S2_1*S2_1' + S2_m*S2_m';
131 S3 = S3_1*S3_1' + S3_m*S3_m';
132
133 alpha_II = util.matrixborrow(M4, h*S2 );
134 alpha_III = util.matrixborrow(M4, h^3*S3);
135 fprintf('6th order compatible\n')
136 fprintf('alpha_II: %.10f\n',alpha_II)
137 fprintf('alpha_III: %.10f\n',alpha_III)
138 fprintf('\n')
139
140
141
142
143
144 % Ordinary
145
146 for order = [2 4 6 8 10]
147 op = sbp.Ordinary(m,h, order);
148
149 S_1 = op.boundary.S_1;
150 S_m = op.boundary.S_m;
151
152 M = op.norms.M;
153
154 S1 = S_1*S_1' + S_m*S_m';
155 alpha = util.matrixborrow(M, h*S1);
156 fprintf('%dth order Ordinary\n', order)
157 fprintf('alpha: %.10f\n', alpha)
158 fprintf('\n')
159 end
160
161
162
163
164 end
165
166 function [alpha_II, alpha_III] = d4_lonely(m, h, order, modifier)
167 default_arg('modifier', [])
168 func = sprintf('sbp.implementations.d4_lonely_%d', order);
169 if ~isempty(modifier)
170 func = sprintf('%s_%s', func, modifier);
171 end
172 funcCall = sprintf('%s(%s,%s)', func, toString(m), toString(h));
173 [H, HI, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
174
175 d2d2 = d2_l*d2_l' + d2_r*d2_r';
176 alpha_II = util.matrixborrow(M4, h*d2d2);
177
178 d3d3 = d3_l*d3_l' + d3_r*d3_r';
179 alpha_III = util.matrixborrow(M4, h^3*d3d3);
180 end
181
182 function [alpha_II, alpha_III] = d4_variable(m, h, order)
183 default_arg('modifier', [])
184 func = sprintf('sbp.implementations.d4_variable_%d', order);
185
186 funcCall = sprintf('%s(%s,%s)', func, toString(m), toString(h));
187 [H, HI, D1, D2, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
188
189 d2d2 = d2_l*d2_l' + d2_r*d2_r';
190 alpha_II = util.matrixborrow(M4, h*d2d2);
191
192 d3d3 = d3_l*d3_l' + d3_r*d3_r';
193 alpha_III = util.matrixborrow(M4, h^3*d3d3);
194 end
195
196 function [d2_l, d2_r, d3_l, d3_r, M4] = getM4_lonely(m, h, order, modifier)
197 fStr = getFunctionCallStr('d4_lonely', {order, modifier}, {m ,h});
198 [H, HI, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
199 end
200
201
202 % Calculates the borrowing constants for a D4 operator.
203 % getM4 is a function handle on the form
204 % [d2_l, d2_r, d3_l, d3_r, M4] = getM4(m,h)
205 function [a2, a3] = borrowFromD4(m, h, getM4)
206 [d2_l, d2_r, d3_l, d3_r, M4] = getM4(m, h);
207
208 d2d2 = d2_l*d2_l' + d2_r*d2_r';
209 a2 = util.matrixborrow(M4, h*d2d2);
210
211 d3d3 = d3_l*d3_l' + d3_r*d3_r';
212 a3 = util.matrixborrow(M4, h^3*d3d3);
213 end
214
215
216 function funcCallStr = getFunctionCallStr(baseName, postFix, parameters)
217 default_arg('postFix', [])
218 default_arg('parameters', [])
219
220 funcCallStr = sprintf('sbp.implementations.%s', baseName);
221
222 for i = 1:length(postFix)
223 if ischar(postFix{i})
224 funcCallStr = [funcCallStr '_' postFix{i}];
225 else
226 funcCallStr = [funcCallStr '_' toString(postFix{i})];
227 end
228 end
229
230 if isempty(parameters)
231 return
232 end
233
234 funcCallStr = [funcCallStr '(' toString(parameters{1})];
235
236 for i = 2:length(parameters)
237 funcCallStr = [funcCallStr ', ' toString(parameters{i})];
238 end
239
240 funcCallStr = [funcCallStr ')';
241 end