diff +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
line wrap: on
line diff
--- a/+util/calc_borrowing.m	Tue Sep 27 08:44:17 2016 +0200
+++ b/+util/calc_borrowing.m	Tue Sep 27 09:46:58 2016 +0200
@@ -1,97 +1,241 @@
+function calc_borrowing(m, h)
+    default_arg('m',100);
+    default_arg('h',1);
 
-m = 100;
-h = 1;
+    operators = {
+        {
+            'd4_lonely', getM4_lonely, {
+                {4, 'min_boundary_points'},
+                {6, 'min_boundary_points'},
+                {6, '2'},
+                {6, '3'},
+                {8, 'min_boundary_points'},
+                {8, 'higher_boundary_order'},
+            }
+        }, {
+            'd4_variable', {
+                {2},
+                {4},
+                {6},
+            }
+        }
+        % BORKEN BAD IDEA
+    }
+
+
+    for i = 1:operators
+        baseName = operators{i}{1};
+        postFixes = operators{i}{2};
+        for pf = postFixes
+            [a2, a3] = borrowFromD4(m, h, l{:});
+        end
+    end
 
 
-%% 4th order non-compatible
-[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);
-S1 = S_1*S_1'  + S_m*S_m';
-S2 = S2_1*S2_1' + S2_m*S2_m';
-S3 = S3_1*S3_1' + S3_m*S3_m';
+
+    lonely = {
+        {4, 'min_boundary_points'},
+        {6, 'min_boundary_points'},
+        {6, '2'},
+        {6, '3'},
+        {8, 'min_boundary_points'},
+        {8, 'higher_boundary_order'},
+    };
 
-alpha_I  = util.matrixborrow(M4, h^-1*S1  );
-alpha_II  = util.matrixborrow(M4, h*S2  );
-alpha_III = util.matrixborrow(M4, h^3*S3);
-fprintf('4th order non-compatible\n')
-fprintf('alpha_I1:  %.10f\n',alpha_I)
-fprintf('alpha_II:  %.10f\n',alpha_II)
-fprintf('alpha_III: %.10f\n',alpha_III)
-fprintf('\n')
-
+    for i = 1:length(lonely)
+        l = lonely{i};
+        [a2, a3] = d4_lonely(m, h, l{:});
+        fprintf('d4_lonely %d %s\n', l{:})
+        fprintf('\t  alpha_II = %f\n', a2)
+        fprintf('\t alpha_III = %f\n', a3)
+        fprintf('\n')
+    end
 
-%% 6th order non-compatible
-[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);
-S1 = S_1*S_1'  + S_m*S_m';
-S2 = S2_1*S2_1' + S2_m*S2_m';
-S3 = S3_1*S3_1' + S3_m*S3_m';
+    variable = {
+        {2},
+        {4},
+        {6},
+    };
 
-alpha_II  = util.matrixborrow(M4, h*S2  );
-alpha_III = util.matrixborrow(M4, h^3*S3);
-fprintf('6th order non-compatible\n')
-fprintf('alpha_II:  %.10f\n',alpha_II)
-fprintf('alpha_III: %.10f\n',alpha_III)
-fprintf('\n')
+    for i = 1:length(variable)
+        l = variable{i};
+        [a2, a3] = d4_variable(m, h, l{:});
+        fprintf('d4_variable %d\n', l{:})
+        fprintf('\t  alpha_II = %f\n', a2)
+        fprintf('\t alpha_III = %f\n', a3)
+        fprintf('\n')
+    end
 
 
-%% 2nd order compatible
-[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);
-S1 = S_1*S_1'  + S_m*S_m';
-S2 = S2_1*S2_1' + S2_m*S2_m';
-S3 = S3_1*S3_1' + S3_m*S3_m';
+    %% 4th order non-compatible
+    [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);
+    S1 = S_1*S_1'  + S_m*S_m';
+    S2 = S2_1*S2_1' + S2_m*S2_m';
+    S3 = S3_1*S3_1' + S3_m*S3_m';
 
-alpha_II  = util.matrixborrow(M4, h*S2  );
-alpha_III = util.matrixborrow(M4, h^3*S3);
-fprintf('2nd order compatible\n')
-fprintf('alpha_II:  %.10f\n',alpha_II)
-fprintf('alpha_III: %.10f\n',alpha_III)
-fprintf('\n')
+    alpha_I  = util.matrixborrow(M4, h^-1*S1  );
+    alpha_II  = util.matrixborrow(M4, h*S2  );
+    alpha_III = util.matrixborrow(M4, h^3*S3);
+    fprintf('4th order non-compatible\n')
+    fprintf('alpha_I1:  %.10f\n',alpha_I)
+    fprintf('alpha_II:  %.10f\n',alpha_II)
+    fprintf('alpha_III: %.10f\n',alpha_III)
+    fprintf('\n')
+
+
+    %% 6th order non-compatible
+    [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);
+    S1 = S_1*S_1'  + S_m*S_m';
+    S2 = S2_1*S2_1' + S2_m*S2_m';
+    S3 = S3_1*S3_1' + S3_m*S3_m';
+
+    alpha_II  = util.matrixborrow(M4, h*S2  );
+    alpha_III = util.matrixborrow(M4, h^3*S3);
+    fprintf('6th order non-compatible\n')
+    fprintf('alpha_II:  %.10f\n',alpha_II)
+    fprintf('alpha_III: %.10f\n',alpha_III)
+    fprintf('\n')
 
 
-%% 4th order compatible
-[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);
-S1 = S_1*S_1'  + S_m*S_m';
-S2 = S2_1*S2_1' + S2_m*S2_m';
-S3 = S3_1*S3_1' + S3_m*S3_m';
+    %% 2nd order compatible
+    [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);
+    S1 = S_1*S_1'  + S_m*S_m';
+    S2 = S2_1*S2_1' + S2_m*S2_m';
+    S3 = S3_1*S3_1' + S3_m*S3_m';
 
-alpha_II  = util.matrixborrow(M4, h*S2  );
-alpha_III = util.matrixborrow(M4, h^3*S3);
-fprintf('4th order compatible\n')
-fprintf('alpha_II:  %.10f\n',alpha_II)
-fprintf('alpha_III: %.10f\n',alpha_III)
-fprintf('\n')
+    alpha_II  = util.matrixborrow(M4, h*S2  );
+    alpha_III = util.matrixborrow(M4, h^3*S3);
+    fprintf('2nd order compatible\n')
+    fprintf('alpha_II:  %.10f\n',alpha_II)
+    fprintf('alpha_III: %.10f\n',alpha_III)
+    fprintf('\n')
+
+
+    %% 4th order compatible
+    [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);
+    S1 = S_1*S_1'  + S_m*S_m';
+    S2 = S2_1*S2_1' + S2_m*S2_m';
+    S3 = S3_1*S3_1' + S3_m*S3_m';
 
-%% 6th order compatible
-[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);
-S1 = S_1*S_1'  + S_m*S_m';
-S2 = S2_1*S2_1' + S2_m*S2_m';
-S3 = S3_1*S3_1' + S3_m*S3_m';
+    alpha_II  = util.matrixborrow(M4, h*S2  );
+    alpha_III = util.matrixborrow(M4, h^3*S3);
+    fprintf('4th order compatible\n')
+    fprintf('alpha_II:  %.10f\n',alpha_II)
+    fprintf('alpha_III: %.10f\n',alpha_III)
+    fprintf('\n')
 
-alpha_II  = util.matrixborrow(M4, h*S2  );
-alpha_III = util.matrixborrow(M4, h^3*S3);
-fprintf('6th order compatible\n')
-fprintf('alpha_II:  %.10f\n',alpha_II)
-fprintf('alpha_III: %.10f\n',alpha_III)
-fprintf('\n')
+    %% 6th order compatible
+    [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);
+    S1 = S_1*S_1'  + S_m*S_m';
+    S2 = S2_1*S2_1' + S2_m*S2_m';
+    S3 = S3_1*S3_1' + S3_m*S3_m';
+
+    alpha_II  = util.matrixborrow(M4, h*S2  );
+    alpha_III = util.matrixborrow(M4, h^3*S3);
+    fprintf('6th order compatible\n')
+    fprintf('alpha_II:  %.10f\n',alpha_II)
+    fprintf('alpha_III: %.10f\n',alpha_III)
+    fprintf('\n')
 
 
 
 
 
-% Ordinary
+    % Ordinary
+
+    for order = [2 4 6 8 10]
+        op = sbp.Ordinary(m,h, order);
+
+        S_1 = op.boundary.S_1;
+        S_m = op.boundary.S_m;
+
+        M = op.norms.M;
 
-for order = [2 4 6 8 10]
-    op = sbp.Ordinary(m,h, order);
+        S1 = S_1*S_1'  + S_m*S_m';
+        alpha  = util.matrixborrow(M, h*S1);
+        fprintf('%dth order Ordinary\n', order)
+        fprintf('alpha:  %.10f\n', alpha)
+        fprintf('\n')
+    end
 
-    S_1 = op.boundary.S_1;
-    S_m = op.boundary.S_m;
+
+
+
+end
 
-    M = op.norms.M;
+function [alpha_II, alpha_III] = d4_lonely(m, h, order, modifier)
+    default_arg('modifier', [])
+    func = sprintf('sbp.implementations.d4_lonely_%d', order);
+    if ~isempty(modifier)
+        func = sprintf('%s_%s', func, modifier);
+    end
+    funcCall = sprintf('%s(%s,%s)', func, toString(m), toString(h));
+    [H, HI, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
+
+    d2d2 = d2_l*d2_l' + d2_r*d2_r';
+    alpha_II  = util.matrixborrow(M4, h*d2d2);
+
+    d3d3 = d3_l*d3_l' + d3_r*d3_r';
+    alpha_III = util.matrixborrow(M4, h^3*d3d3);
+end
 
-    S1 = S_1*S_1'  + S_m*S_m';
-    alpha  = util.matrixborrow(M, h*S1);
-    fprintf('%dth order Ordinary\n', order)
-    fprintf('alpha:  %.10f\n', alpha)
-    fprintf('\n')
+function [alpha_II, alpha_III] = d4_variable(m, h, order)
+    default_arg('modifier', [])
+    func = sprintf('sbp.implementations.d4_variable_%d', order);
+
+    funcCall = sprintf('%s(%s,%s)', func, toString(m), toString(h));
+    [H, HI, D1, D2, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
+
+    d2d2 = d2_l*d2_l' + d2_r*d2_r';
+    alpha_II  = util.matrixborrow(M4, h*d2d2);
+
+    d3d3 = d3_l*d3_l' + d3_r*d3_r';
+    alpha_III = util.matrixborrow(M4, h^3*d3d3);
+end
+
+function [d2_l, d2_r, d3_l, d3_r, M4] = getM4_lonely(m, h, order, modifier)
+    fStr = getFunctionCallStr('d4_lonely', {order, modifier}, {m ,h});
+    [H, HI, D4, e_l, e_r, M4, d2_l, d2_r, d3_l, d3_r, d1_l, d1_r] = eval(funcCall);
 end
 
 
+% Calculates the borrowing constants for a D4 operator.
+% getM4 is a function handle on the form
+%  [d2_l, d2_r, d3_l, d3_r, M4] = getM4(m,h)
+function [a2, a3] = borrowFromD4(m, h, getM4)
+    [d2_l, d2_r, d3_l, d3_r, M4] = getM4(m, h);
+
+    d2d2 = d2_l*d2_l' + d2_r*d2_r';
+    a2  = util.matrixborrow(M4, h*d2d2);
+
+    d3d3 = d3_l*d3_l' + d3_r*d3_r';
+    a3 = util.matrixborrow(M4, h^3*d3d3);
+end
+
+
+function funcCallStr = getFunctionCallStr(baseName, postFix, parameters)
+    default_arg('postFix', [])
+    default_arg('parameters', [])
+
+    funcCallStr = sprintf('sbp.implementations.%s', baseName);
+
+    for i = 1:length(postFix)
+        if ischar(postFix{i})
+            funcCallStr = [funcCallStr '_' postFix{i}];
+        else
+            funcCallStr = [funcCallStr '_' toString(postFix{i})];
+        end
+    end
+
+    if isempty(parameters)
+        return
+    end
+
+    funcCallStr = [funcCallStr '(' toString(parameters{1})];
+
+    for i = 2:length(parameters)
+        funcCallStr = [funcCallStr ', ' toString(parameters{i})];
+    end
+
+    funcCallStr = [funcCallStr ')';
+end