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

Initial commit.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 17 Sep 2015 10:12:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+multiblock/multiblockgrid.m	Thu Sep 17 10:12:50 2015 +0200
@@ -0,0 +1,70 @@
+% Creates a multi block square grid with defined boundary conditions.
+%   x,y defines the grid lines. Rember to think of the indexing as a matrix. Order matters!
+%   bc is a struct defining the boundary conditions on each side of the block.
+%       bc.w = {'dn',[function or value]}
+function [block,conn,bound,ms] = multiblockgrid(x,y,mx,my,bc)
+    n = length(y)-1; % number of blocks in the y direction.
+    m = length(x)-1; % number of blocks in the x direction.
+    N = n*m; % number of blocks
+
+    if ~issorted(x)
+        error('The elements of x seem to be in the wrong order');
+    end
+    if ~issorted(flip(y))
+        error('The elements of y seem to be in the wrong order');
+    end
+    % y = sort(y,'descend');
+
+    % Dimensions of blocks and number of points
+    block = cell(n,m);
+    for i = 1:n
+        for j = 1:m
+            block{i,j} = {
+                {x(j),x(j+1)}, {y(i+1),y(i)};
+            };
+
+            ms{i,j} = [mx(i),my(j)];
+        end
+    end
+
+    % Interface couplings
+    conn = cell(N,N);
+    for i = 1:n
+        for j = 1:m
+            I = flat_index(n,i,j);
+            if i < n
+                J = flat_index(n,i+1,j);
+                conn{I,J} = {'s','n'};
+            end
+
+            if j < m
+                J = flat_index(n,i,j+1);
+                conn{I,J} = {'e','w'};
+            end
+        end
+    end
+
+
+    % Boundary conditions
+    bound = cell(n,m);
+    for i = 1:n
+        if isfield(bc,'w')
+            bound{i,1}.w = bc.w;
+        end
+
+        if isfield(bc,'e')
+            bound{i,n}.e = bc.e;
+        end
+    end
+
+    for j = 1:m
+        if isfield(bc,'n')
+            bound{1,j}.n = bc.n;
+        end
+
+        if isfield(bc,'s')
+            bound{m,j}.s = bc.s;
+        end
+    end
+end
+