annotate +multiblock/+domain/Line.m @ 1198:2924b3a9b921 feature/d2_compatible

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