changeset 173:f7bb2a94d291 feature/grids

Added functionallity for storing grid scaling on structured grids.
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 26 Feb 2016 16:06:03 +0100
parents c3483685116a
children 513019e3d855
files +grid/Cartesian.m +grid/CartesianTest.m +grid/Curvilinear.m +grid/CurvilinearTest.m +grid/Structured.m
diffstat 5 files changed, 45 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/+grid/Cartesian.m	Thu Feb 25 11:30:05 2016 +0100
+++ b/+grid/Cartesian.m	Fri Feb 26 16:06:03 2016 +0100
@@ -4,6 +4,7 @@
         d % Number of dimensions
         m % Number of points in each direction
         x % Cell array of vectors with node placement for each dimension.
+        h % Spacing/Scaling
     end
 
     % General d dimensional grid with n points
@@ -12,14 +13,18 @@
         % in each direction
         function obj = Cartesian(varargin)
             obj.d = length(varargin);
+
             for i = 1:obj.d
                 obj.x{i} = varargin{i};
                 obj.m(i) = length(varargin{i});
             end
+
             obj.n = prod(obj.m);
             if obj.n == 0
                 error('grid:Cartesian:EmptyGrid','Input parameter gives an empty grid.')
             end
+
+            obj.h = [];
         end
         % n returns the number of points in the grid
         function o = N(obj)
@@ -76,6 +81,14 @@
             end
         end
 
+        function h = scaling(obj)
+            if isempty(obj.h)
+                error('grid:Cartesian:NoScalingSet', 'No scaling set')
+            end
+
+            h = obj.h;
+        end
+
         % Restricts the grid function gf on obj to the subgrid g.
         % Only works for even multiples
         function gf = restrictFunc(obj, gf, g)
--- a/+grid/CartesianTest.m	Thu Feb 25 11:30:05 2016 +0100
+++ b/+grid/CartesianTest.m	Fri Feb 26 16:06:03 2016 +0100
@@ -184,3 +184,13 @@
     end
 end
 
+function testScaling(testCase)
+    in = {[1 2 3], [1 2]};
+    g = grid.Cartesian(in{:});
+
+    testCase.verifyError(@()g.scaling(),'grid:Cartesian:NoScalingSet');
+
+    g.h = [2 1];
+    testCase.verifyEqual(g.scaling(),[2 1]);
+
+end
--- a/+grid/Curvilinear.m	Thu Feb 25 11:30:05 2016 +0100
+++ b/+grid/Curvilinear.m	Fri Feb 26 16:06:03 2016 +0100
@@ -29,7 +29,7 @@
             if iscell(mapping)
                 obj.coords = cellMappingToCoords(mapping, N, D, obj.logic.m);
             elseif isnumeric(mapping)
-                obj.coords = matrixMappingToCoords(mapping, N, D)
+                obj.coords = matrixMappingToCoords(mapping, N, D);
             else
                 error('grid:Curvilinear:Curvilinear','mapping must be a matrix or a cell array.');
             end
@@ -73,13 +73,20 @@
         function gf = projectFunc(obj, gf, g)
             gf = obj.logic.projectFunc(gf,g.baseGrid());
         end
+
+        function h = scaling(obj)
+            if isempty(obj.logic.h)
+                error('grid:Curvilinear:NoScalingSet','No scaling set');
+            end
+            h = obj.logic.h;
+        end
     end
 end
 
 
 function coords = cellMappingToCoords(mapping, N, D, m)
     if ~isequal(size(mapping),[1 D])
-        error('grid:Curvilinear:Curvilinear','The cell array must be a row array.');
+        error('grid:Curvilinear:Curvilinear','The cell array must be a 1xD array.');
     end
 
     if isequal(size(mapping{1}),[N 1])
--- a/+grid/CurvilinearTest.m	Thu Feb 25 11:30:05 2016 +0100
+++ b/+grid/CurvilinearTest.m	Fri Feb 26 16:06:03 2016 +0100
@@ -69,3 +69,14 @@
 function testMappingInputError(testCase)
     testCase.assumeFail();
 end
+
+function testScaling(testCase)
+    in = {{1:2, 1:3}, {[1 2 3 4 5 6]', [7 8 9 10 11 12]'}};
+    g = grid.Curvilinear(in{2},in{1}{:});
+
+    testCase.verifyError(@()g.scaling(),'grid:Curvilinear:NoScalingSet');
+
+    g.logicalGrid.h = [2 1];
+    testCase.verifyEqual(g.scaling(),[2 1]);
+end
+
--- a/+grid/Structured.m	Thu Feb 25 11:30:05 2016 +0100
+++ b/+grid/Structured.m	Fri Feb 26 16:06:03 2016 +0100
@@ -1,6 +1,7 @@
 classdef Structured < grid.Grid
     methods (Abstract)
         % Returns the size of the grid in each dimension m = [mx my mz ...]
-        m = size(obj)
+        m = size(obj);
+        h = scaling(obj);
     end
 end