comparison +multiblock/DiffOp.m @ 890:c70131daaa6e feature/d1_staggered

Merge with feature/poroelastic.
author Martin Almquist <malmquist@stanford.edu>
date Wed, 21 Nov 2018 18:29:29 -0800
parents 7d4f57725192
children 386ef449df51 72cd29107a9a
comparison
equal deleted inserted replaced
885:18e10217dca9 890:c70131daaa6e
51 end 51 end
52 obj.H = blockmatrix.toMatrix(H); 52 obj.H = blockmatrix.toMatrix(H);
53 53
54 54
55 % Build the differentiation matrix 55 % Build the differentiation matrix
56 obj.blockmatrixDiv = {g.Ns, g.Ns}; 56 Ns = zeros(nBlocks,1);
57 for i = 1:nBlocks
58 Ns(i) = length(obj.diffOps{i}.D);
59 end
60 obj.blockmatrixDiv = {Ns, Ns};
57 D = blockmatrix.zero(obj.blockmatrixDiv); 61 D = blockmatrix.zero(obj.blockmatrixDiv);
58 for i = 1:nBlocks 62 for i = 1:nBlocks
59 D{i,i} = obj.diffOps{i}.D; 63 D{i,i} = obj.diffOps{i}.D;
60 end 64 end
61 65
115 end 119 end
116 end 120 end
117 121
118 function ops = splitOp(obj, op) 122 function ops = splitOp(obj, op)
119 % Splits a matrix operator into a cell-matrix of matrix operators for 123 % Splits a matrix operator into a cell-matrix of matrix operators for
120 % each g. 124 % each grid.
121 ops = sparse2cell(op, obj.NNN); 125 ops = sparse2cell(op, obj.NNN);
122 end 126 end
123 127
124 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup 128 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup
125 function op = getBoundaryOperator(obj, opName, boundary) 129 function op = getBoundaryOperator(obj, opName, boundary)
137 case 'multiblock.BoundaryGroup' 141 case 'multiblock.BoundaryGroup'
138 op = sparse(size(obj.D,1),0); 142 op = sparse(size(obj.D,1),0);
139 for i = 1:length(boundary) 143 for i = 1:length(boundary)
140 op = [op, obj.getBoundaryOperator(opName, boundary{i})]; 144 op = [op, obj.getBoundaryOperator(opName, boundary{i})];
141 end 145 end
146 otherwise
147 error('Unknown boundary indentifier')
148 end
149 end
150
151 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup
152 function op = getBoundaryOperatorWrapper(obj, opName, boundary)
153 switch class(boundary)
154 case 'cell'
155 blockId = boundary{1};
156 localOp = obj.diffOps{blockId}.get_boundary_operator(opName, boundary{2});
157
158 div = {obj.blockmatrixDiv{1}, size(localOp,2)};
159 blockOp = blockmatrix.zero(div);
160 blockOp{blockId,1} = localOp;
161 op = blockmatrix.toMatrix(blockOp);
162 return
163 case 'multiblock.BoundaryGroup'
164 op = sparse(size(obj.D,1),0);
165 for i = 1:length(boundary)
166 op = [op, obj.getBoundaryOperatorWrapper(opName, boundary{i})];
167 end
168 otherwise
169 error('Unknown boundary indentifier')
170 end
171 end
172
173 function op = getBoundaryQuadrature(obj, boundary)
174 opName = 'H';
175 switch class(boundary)
176 case 'cell'
177 localOpName = [opName '_' boundary{2}];
178 blockId = boundary{1};
179 op = obj.diffOps{blockId}.(localOpName);
180
181 return
182 case 'multiblock.BoundaryGroup'
183 N = length(boundary);
184 H_bm = cell(N,N);
185 for i = 1:N
186 H_bm{i,i} = obj.getBoundaryQuadrature(boundary{i});
187 end
188 op = blockmatrix.toMatrix(H_bm);
142 otherwise 189 otherwise
143 error('Unknown boundary indentifier') 190 error('Unknown boundary indentifier')
144 end 191 end
145 end 192 end
146 193