Mercurial > repos > public > sbplib
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
--- 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
--- /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
--- /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
--- 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);
--- /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