diff +multiblock/stitchSchemes.m @ 0:48b6fb693025

Initial commit.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 17 Sep 2015 10:12:50 +0200
parents
children 5c569cbef49e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+multiblock/stitchSchemes.m	Thu Sep 17 10:12:50 2015 +0200
@@ -0,0 +1,85 @@
+% Stitch schemes together given connection matrix and BC vector.
+%     schmHand  - function_handle to a Scheme constructor
+%     order     - order of accuracy
+%     schmParam - cell array of extra parameters sent to each Scheme stored as cell arrays
+%     blocks    - block definitions, On whatever form the scheme expects.
+%     ms        - grid points in each direction for each block. Ex {[10,10], [10, 20]}
+%     conn      - connection matrix
+%     bound     - boundary condition vector, array of structs with fields w,e,s,n
+%                 each field with a parameter array that is sent to schm.boundary_condition
+%
+% Output parameters are cell arrays and cell matrices.
+function [schms, D, H] = stitchSchemes(schmHand, order, schmParam, blocks, ms, conn, bound)
+
+    n_blocks = numel(blocks);
+
+    % Creating Schemes
+    for i = 1:n_blocks
+        if ~iscell(schmParam{i})
+            param = schmParam(i);
+        else
+            param = schmParam{i};
+        end
+
+        % class(schmParam)
+        % class(ms)
+        % class(blocks)
+        % class(schmParam{i})
+        % class(ms)
+
+        schms{i} = schmHand(ms{i},blocks{i},order,param{:});
+    end
+
+
+    % Total norm
+    H = cell(n_blocks,n_blocks);
+    for i = 1:n_blocks
+        H{i,i} = schms{i}.H;
+    end
+
+
+
+
+
+    %% Total system matrix
+
+    % Differentiation terms
+    D = cell(n_blocks,n_blocks);
+    for i = 1:n_blocks
+        D{i,i} = schms{i}.D;
+    end
+
+    % Boundary penalty terms
+    for i = 1:n_blocks
+        if ~isstruct(bound{i})
+            continue
+        end
+
+        fn = fieldnames(bound{i});
+        for j = 1:length(fn);
+            bc = bound{i}.(fn{j});
+            if isempty(bc)
+                continue
+            end
+
+            t = schms{i}.boundary_condition(fn{j},bc{:});
+            D{i,i} = D{i,i}+t;
+        end
+    end
+
+    % Interface penalty terms
+    for i = 1:n_blocks
+        for j = 1:n_blocks
+            intf = conn{i,j};
+            if isempty(intf)
+                continue
+            end
+
+            [uu,uv,vv,vu] = noname.Scheme.interface_coupling(schms{i},intf{1},schms{j},intf{2});
+            D{i,i} = D{i,i} + uu;
+            D{i,j} = uv;
+            D{j,j} = D{j,j} + vv;
+            D{j,i} = vu;
+        end
+    end
+end
\ No newline at end of file