Mercurial > repos > public > sbplib
comparison +multiblock/+domain/Line.m @ 760:408fb46f7266 feature/d1_staggered
Add +multiblock/+domain/Line for 1D multiblock.
| author | Martin Almquist <malmquist@stanford.edu> |
|---|---|
| date | Mon, 18 Jun 2018 16:33:53 -0700 |
| parents | |
| children | 532b58a9e849 |
comparison
equal
deleted
inserted
replaced
| 759:2645188489f6 | 760:408fb46f7266 |
|---|---|
| 1 classdef Line < multiblock.Definition | |
| 2 properties | |
| 3 | |
| 4 xlims | |
| 5 blockNames % Cell array of block labels | |
| 6 nBlocks | |
| 7 connections % Cell array specifying connections between blocks | |
| 8 boundaryGroups % Structure of boundaryGroups | |
| 9 | |
| 10 end | |
| 11 | |
| 12 | |
| 13 methods | |
| 14 % Creates a divided line | |
| 15 % x is a vector of boundary and interface positions. | |
| 16 % blockNames: cell array of labels. The id is default. | |
| 17 function obj = Line(x,blockNames) | |
| 18 default_arg('blockNames',[]); | |
| 19 | |
| 20 N = length(x)-1; % number of blocks in the x direction. | |
| 21 | |
| 22 if ~issorted(x) | |
| 23 error('The elements of x seem to be in the wrong order'); | |
| 24 end | |
| 25 | |
| 26 % Dimensions of blocks and number of points | |
| 27 blockTi = cell(N,1); | |
| 28 xlims = cell(N,1); | |
| 29 for i = 1:N | |
| 30 xlims{i} = {x(i), x(i+1)}; | |
| 31 end | |
| 32 | |
| 33 % Interface couplings | |
| 34 conn = cell(N,N); | |
| 35 for i = 1:N | |
| 36 conn{i,i+1} = {'r','l'}; | |
| 37 end | |
| 38 | |
| 39 % Block names (id number as default) | |
| 40 if isempty(blockNames) | |
| 41 obj.blockNames = cell(1, N); | |
| 42 for i = 1:N | |
| 43 obj.blockNames{i} = sprintf('%d', i); | |
| 44 end | |
| 45 else | |
| 46 assert(length(blockNames) == N); | |
| 47 obj.blockNames = blockNames; | |
| 48 end | |
| 49 nBlocks = N; | |
| 50 | |
| 51 % Boundary groups | |
| 52 boundaryGroups = struct(); | |
| 53 L = { {1, 'l'} }; | |
| 54 R = { {N, 'r'} }; | |
| 55 boundaryGroups.L = multiblock.BoundaryGroup(L); | |
| 56 boundaryGroups.R = multiblock.BoundaryGroup(R); | |
| 57 boundaryGroups.all = multiblock.BoundaryGroup([L,R]); | |
| 58 | |
| 59 obj.connections = conn; | |
| 60 obj.nBlocks = nBlocks; | |
| 61 obj.boundaryGroups = boundaryGroups; | |
| 62 obj.xlims = xlims; | |
| 63 | |
| 64 end | |
| 65 | |
| 66 | |
| 67 % Returns a multiblock.Grid given some parameters | |
| 68 % ms: cell array of m values | |
| 69 % For same m in every block, just input one scalar. | |
| 70 function g = getGrid(obj, ms, varargin) | |
| 71 | |
| 72 default_arg('ms',21) | |
| 73 | |
| 74 % Extend ms if input is a single scalar | |
| 75 if (numel(ms) == 1) && ~iscell(ms) | |
| 76 m = ms; | |
| 77 ms = cell(1,obj.nBlocks); | |
| 78 for i = 1:obj.nBlocks | |
| 79 ms{i} = m; | |
| 80 end | |
| 81 end | |
| 82 | |
| 83 grids = cell(1, obj.nBlocks); | |
| 84 for i = 1:obj.nBlocks | |
| 85 grids{i} = grid.equidistant(ms{i}, obj.xlims{i}, obj.ylims{i}); | |
| 86 end | |
| 87 | |
| 88 g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups); | |
| 89 end | |
| 90 | |
| 91 % Returns a multiblock.Grid given some parameters | |
| 92 % ms: cell array of m values | |
| 93 % For same m in every block, just input one scalar. | |
| 94 function g = getStaggeredGrid(obj, ms, varargin) | |
| 95 | |
| 96 default_arg('ms',21) | |
| 97 | |
| 98 % Extend ms if input is a single scalar | |
| 99 if (numel(ms) == 1) && ~iscell(ms) | |
| 100 m = ms; | |
| 101 ms = cell(1,obj.nBlocks); | |
| 102 for i = 1:obj.nBlocks | |
| 103 ms{i} = m; | |
| 104 end | |
| 105 end | |
| 106 | |
| 107 grids = cell(1, obj.nBlocks); | |
| 108 for i = 1:obj.nBlocks | |
| 109 [g_primal, g_dual] = grid.primalDual1D(ms{i}, obj.xlims{i}); | |
| 110 grids{i} = grid.Staggered1d(g_primal, g_dual); | |
| 111 end | |
| 112 | |
| 113 g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups); | |
| 114 end | |
| 115 | |
| 116 % label is the type of label used for plotting, | |
| 117 % default is block name, 'id' show the index for each block. | |
| 118 function show(obj, label) | |
| 119 default_arg('label', 'name') | |
| 120 | |
| 121 m = 10; | |
| 122 figure | |
| 123 for i = 1:obj.nBlocks | |
| 124 x = linspace(obj.xlims{i}{1}, obj.xlims{i}{2}, m); | |
| 125 y = 0*x + 0.05* ( (-1)^i + 1 ) ; | |
| 126 plot(x,y,'+'); | |
| 127 hold on | |
| 128 end | |
| 129 hold off | |
| 130 | |
| 131 switch label | |
| 132 case 'name' | |
| 133 labels = obj.blockNames; | |
| 134 case 'id' | |
| 135 labels = {}; | |
| 136 for i = 1:obj.nBlocks | |
| 137 labels{i} = num2str(i); | |
| 138 end | |
| 139 otherwise | |
| 140 axis equal | |
| 141 return | |
| 142 end | |
| 143 | |
| 144 legend(labels) | |
| 145 axis equal | |
| 146 end | |
| 147 | |
| 148 % Returns the grid size of each block in a cell array | |
| 149 % The input parameters are determined by the subclass | |
| 150 function ms = getGridSizes(obj, varargin) | |
| 151 end | |
| 152 end | |
| 153 end |
