changeset 1274:8aa0909125a4 feature/poroelastic

Add support for plotting and evaluating on curvilinear multiblock staggered grids
author Martin Almquist <malmquist@stanford.edu>
date Tue, 02 Jun 2020 11:44:38 -0700
parents cf542444f022
children 8ff3a95ad7cc
files +grid/Staggered.m +grid/evalOnStaggered.m +grid/lebedev2dCurvilinear.m +multiblock/DefCurvilinear.m +multiblock/StaggeredSurface.m
diffstat 5 files changed, 186 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
diff -r cf542444f022 -r 8aa0909125a4 +grid/Staggered.m
--- a/+grid/Staggered.m	Mon Jun 01 19:00:31 2020 -0700
+++ b/+grid/Staggered.m	Tue Jun 02 11:44:38 2020 -0700
@@ -4,6 +4,7 @@
         nGroups % Number of grid groups
         h      % Interior grid spacing
         d      % Number of dimensions
+        logic  % Grid in logical domain, if any.
     end
 
     methods
@@ -22,6 +23,7 @@
             end
 
             obj.h = [];
+            obj.logic = [];
         end
 
         % N returns the number of points in the first grid group
diff -r cf542444f022 -r 8aa0909125a4 +grid/evalOnStaggered.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+grid/evalOnStaggered.m	Tue Jun 02 11:44:38 2020 -0700
@@ -0,0 +1,29 @@
+function gf = evalOnStaggered(g, f, gridGroup, subGrids)
+
+	default_arg('gridGroup', 1);
+
+	gf = [];
+
+	if isa(g, 'multiblock.Grid')
+
+		nSubGrids = numel(g.grids{1}.gridGroups{gridGroup});
+		default_arg('subGrids', 1:nSubGrids );
+
+		for i = 1:g.nBlocks()
+			for j = subGrids
+				gf = [gf; grid.evalOn(g.grids{i}.gridGroups{gridGroup}{j}, f)];
+			end
+		end
+
+	else
+
+		nSubGrids = numel(g.gridGroups{gridGroup});
+		default_arg('subGrids', 1:nSubGrids );
+
+		for j = subGrids
+			gf = [gf; grid.evalOn(g.grids{i}.gridGroups{gridGroup}{j}, f)];
+		end
+
+	end
+
+end
\ No newline at end of file
diff -r cf542444f022 -r 8aa0909125a4 +grid/lebedev2dCurvilinear.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+grid/lebedev2dCurvilinear.m	Tue Jun 02 11:44:38 2020 -0700
@@ -0,0 +1,46 @@
+% Creates a curvilinear 2d lebedev2d grid
+% over the logical domain xi_lim, eta_lim, ...
+% If all limits are ommited they are set to {0,1}.
+% Examples:
+%   g = grid.lebedev2dCurvilinear(mapping, [m_xi, m_eta])
+%   g = grid.lebedev2dCurvilinear(mapping, [m_xi, m_eta], xi_lim, eta_lim)
+%   g = grid.lebedev2dCurvilinear(mapping, [10, 15], {0,1}, {0,1})
+function g = lebedev2dCurvilinear(mapping, m, varargin)
+    if isempty(varargin)
+        varargin = repmat({{0,1}}, [1 length(m)]);
+    end
+
+    if length(m) ~= length(varargin)
+        error('grid:lebedev2d:NonMatchingParameters','The number of provided dimensions do not match.')
+    end
+
+    for i = 1:length(m)
+        if ~iscell(varargin{i}) || numel(varargin{i}) ~= 2
+           error('grid:lebedev2d:InvalidLimits','The limits should be cell arrays with 2 elements.');
+        end
+
+        if varargin{i}{1} > varargin{i}{2}
+            error('grid:lebedev2d:InvalidLimits','The elements of the limit must be increasing.');
+        end
+    end
+
+    g_logic = grid.lebedev2d(m, varargin{:});
+
+    gu1_logic = g_logic.gridGroups{1}{1};
+    gu2_logic = g_logic.gridGroups{1}{2};
+    gs1_logic = g_logic.gridGroups{2}{1};
+    gs2_logic = g_logic.gridGroups{2}{2};
+
+    gu1 = grid.Curvilinear(mapping, gu1_logic.x{1}, gu1_logic.x{2});
+    gu2 = grid.Curvilinear(mapping, gu2_logic.x{1}, gu2_logic.x{2});
+    gs1 = grid.Curvilinear(mapping, gs1_logic.x{1}, gs1_logic.x{2});
+    gs2 = grid.Curvilinear(mapping, gs2_logic.x{1}, gs2_logic.x{2});
+
+    gu = {gu1, gu2};
+    gs = {gs1, gs2};
+
+    dim = 2;
+    g = grid.Staggered(dim, gu, gs);
+
+    g.logic = g_logic;
+end
\ No newline at end of file
diff -r cf542444f022 -r 8aa0909125a4 +multiblock/DefCurvilinear.m
--- a/+multiblock/DefCurvilinear.m	Mon Jun 01 19:00:31 2020 -0700
+++ b/+multiblock/DefCurvilinear.m	Tue Jun 02 11:44:38 2020 -0700
@@ -48,6 +48,18 @@
             g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups);
         end
 
+        function g = getLebedevGrid(obj, varargin)
+            ms = obj.getGridSizes(varargin{:});
+
+            grids = cell(1, obj.nBlocks);
+            for i = 1:obj.nBlocks
+                % grids{i} = grid.equidistantCurvilinear(obj.blockMaps{i}.S, ms{i});
+                grids{i} = grid.lebedev2dCurvilinear(obj.blockMaps{i}.S, ms{i});
+            end
+
+            g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups);
+        end
+
         function h = show(obj, label, gridLines, varargin)
             default_arg('label', 'name')
             default_arg('gridLines', false);
diff -r cf542444f022 -r 8aa0909125a4 +multiblock/StaggeredSurface.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+multiblock/StaggeredSurface.m	Tue Jun 02 11:44:38 2020 -0700
@@ -0,0 +1,97 @@
+classdef StaggeredSurface < handle
+    properties
+        grid
+        surfs
+        gridGroup
+        subGrid
+
+        ZData
+        CData
+
+    end
+
+    methods
+        function obj = StaggeredSurface(g, gf, gridGroup, subGrid)
+
+            default_arg('gridGroup', 1);
+            default_arg('subGrid', 1);
+
+            obj.grid = g;
+            obj.gridGroup = gridGroup;
+            obj.subGrid = subGrid;
+
+            % coords = obj.grid.points();
+            % X = obj.grid.funcToPlotMatrices(coords(:,1));
+            % Y = obj.grid.funcToPlotMatrices(coords(:,2));
+            % V = obj.grid.funcToPlotMatrices(gf);
+            X = {};
+            Y = {};
+            V = {};
+
+            holdState = ishold();
+            hold on
+
+            surfs = cell(1, obj.grid.nBlocks);
+            gfIndex = 1;
+            for i = 1:g.nBlocks()
+
+                gi = g.grids{i}.gridGroups{gridGroup}{subGrid};
+
+                X{i} = grid.funcToPlotMatrix(gi, gi.coords(:,1));
+                Y{i} = grid.funcToPlotMatrix(gi, gi.coords(:,2));
+
+                Ni = gi.N();
+                gf_i = gf(gfIndex:gfIndex+Ni-1);
+                V{i} = grid.funcToPlotMatrix(gi, gf_i);
+
+                surfs{i} = surf(X{i}, Y{i}, V{i});
+                gfIndex = gfIndex + Ni;
+            end
+
+            if holdState == false
+                hold off
+            end
+
+            obj.surfs = [surfs{:}];
+
+            obj.ZData = gf;
+            obj.CData = gf;
+        end
+
+        function set(obj, propertyName, propertyValue)
+            set(obj.surfs, propertyName, propertyValue);
+        end
+
+        function obj = set.ZData(obj, gf)
+            obj.ZData = gf;
+
+            % V = obj.grid.funcToPlotMatrices(gf);
+            gfIndex = 1;
+            for i = 1:obj.grid.nBlocks()
+                gi = obj.grid.grids{i}.gridGroups{obj.gridGroup}{obj.subGrid};
+                Ni = gi.N();
+                gf_i = gf(gfIndex:gfIndex+Ni-1);
+                Vi = grid.funcToPlotMatrix(gi, gf_i);
+                obj.surfs(i).ZData = Vi;
+
+                gfIndex = gfIndex + Ni;
+            end
+        end
+
+        function obj = set.CData(obj, gf)
+            obj.CData = gf;
+
+            % V = obj.grid.funcToPlotMatrices(gf);
+            gfIndex = 1;
+            for i = 1:obj.grid.nBlocks()
+                gi = obj.grid.grids{i}.gridGroups{obj.gridGroup}{obj.subGrid};
+                Ni = gi.N();
+                gf_i = gf(gfIndex:gfIndex+Ni-1);
+                Vi = grid.funcToPlotMatrix(gi, gf_i);
+                obj.surfs(i).CData = Vi;
+
+                gfIndex = gfIndex + Ni;
+            end
+        end
+    end
+end