changeset 1290:b0208b130880 feature/boundary_optimized_grids

Add option to pass a boundary optimized grid to Rectangle.getGrid
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 01 Jul 2020 17:34:40 +0200
parents 2fd2e2337b77
children 2853b655c172
files +multiblock/+domain/Rectangle.m
diffstat 1 files changed, 25 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
diff -r 2fd2e2337b77 -r b0208b130880 +multiblock/+domain/Rectangle.m
--- a/+multiblock/+domain/Rectangle.m	Wed Jul 01 15:15:30 2020 +0200
+++ b/+multiblock/+domain/Rectangle.m	Wed Jul 01 17:34:40 2020 +0200
@@ -117,6 +117,20 @@
         % Returns a multiblock.Grid given some parameters
         % ms: cell array of [mx, my] vectors
         % For same [mx, my] in every block, just input one vector.
+        % Currently defaults to equidistant grid if varargin is empty. 
+        % If varargin is non-empty, the first argument should supply the grid, followed by
+        % additional arguments required to construct the grid.
+        % Grid types:
+        %          'equidist' - equidistant grid
+        %                       Additional argumets: none
+        %          'boundaryopt' - boundary optimized grid based on boundary 
+        %                          optimized SBP operators
+        %                          Additional arguments: order, stencil option
+        % Example: g = getGrid() - the local blocks are 21x21 equidistant grids.
+        %          g = getGrid(ms,) - block i is an equidistant grid with size given by ms{i}.
+        %          g = getGrid(ms,'equidist') - block i is an equidistant grid with size given by ms{i}.
+        %          g = getGrid(ms,'boundaryopt',4,'minimal') - block i is an cartesian grid with size given by ms{i}
+        %              and nodes placed according to the boundary optimized minimal 4th order SBP operator.
         function g = getGrid(obj, ms, varargin)
 
             default_arg('ms',[21,21])
@@ -129,10 +143,19 @@
                     ms{i} = m;
                 end
             end
-
+            if isempty(varargin) || strcmp(varargin{1},'equidist')
+               gridgenerator = @(m,xlim,ylim)grid.equidistant(m,xlim,ylim);
+            elseif strcmp(varargin{1},'boundaryopt')
+                order = varargin{2};
+                stenciloption = varargin{3};
+                gridgenerator = @(m,xlim,ylim)grid.boundaryoptimized(m,xlim,ylim,...
+                    order,stenciloption);
+            else
+                error('No grid type supplied!');
+            end
             grids = cell(1, obj.nBlocks);
             for i = 1:obj.nBlocks
-                grids{i} = grid.equidistant(ms{i}, obj.xlims{i}, obj.ylims{i});
+                grids{i} = gridgenerator(ms{i}, obj.xlims{i}, obj.ylims{i});
             end
 
             g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups);