comparison +multiblock/DiffOp.m @ 969:adae8063ea2f feature/poroelastic

Remove silly getBoundaryOperator* methods in multiblock.DiffOp and make the getBoundaryOperator and getBoundaryQuadrature methods use the scheme.getBoundaryOperator/Quadrature methods instead of properties.
author Martin Almquist <malmquist@stanford.edu>
date Tue, 25 Dec 2018 07:21:19 +0100
parents a4ad90b37998
children e54c2f54dbfe bd8e607768ce
comparison
equal deleted inserted replaced
968:a4ad90b37998 969:adae8063ea2f
127 ops = sparse2cell(op, obj.NNN); 127 ops = sparse2cell(op, obj.NNN);
128 end 128 end
129 129
130 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup 130 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup
131 function op = getBoundaryOperator(obj, opName, boundary) 131 function op = getBoundaryOperator(obj, opName, boundary)
132 switch class(boundary) 132 blockmatrixDiv = obj.blockmatrixDiv{1};
133 case 'cell'
134 localOpName = [opName '_' boundary{2}];
135 blockId = boundary{1};
136 localOp = obj.diffOps{blockId}.(localOpName);
137
138 div = {obj.blockmatrixDiv{1}, size(localOp,2)};
139 blockOp = blockmatrix.zero(div);
140 blockOp{blockId,1} = localOp;
141 op = blockmatrix.toMatrix(blockOp);
142 return
143 case 'multiblock.BoundaryGroup'
144 op = sparse(size(obj.D,1),0);
145 for i = 1:length(boundary)
146 op = [op, obj.getBoundaryOperator(opName, boundary{i})];
147 end
148 otherwise
149 error('Unknown boundary indentifier')
150 end
151 end
152
153 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup
154 function op = getBoundaryOperatorWrapper(obj, opName, boundary, blockmatrixDiv)
155 default_arg('blockmatrixDiv', obj.blockmatrixDiv{1});
156 133
157 switch class(boundary) 134 switch class(boundary)
158 case 'cell' 135 case 'cell'
159 blockId = boundary{1}; 136 blockId = boundary{1};
160 localOp = obj.diffOps{blockId}.get_boundary_operator(opName, boundary{2}); 137 localOp = obj.diffOps{blockId}.getBoundaryOperator(opName, boundary{2});
161 138
162 div = {blockmatrixDiv, size(localOp,2)}; 139 div = {blockmatrixDiv, size(localOp,2)};
163 blockOp = blockmatrix.zero(div); 140 blockOp = blockmatrix.zero(div);
164 blockOp{blockId,1} = localOp; 141 blockOp{blockId,1} = localOp;
165 op = blockmatrix.toMatrix(blockOp); 142 op = blockmatrix.toMatrix(blockOp);
166 return 143 return
167 case 'multiblock.BoundaryGroup' 144 case 'multiblock.BoundaryGroup'
168 op = sparse(sum(blockmatrixDiv),0); 145 op = sparse(sum(blockmatrixDiv),0);
169 for i = 1:length(boundary) 146 for i = 1:length(boundary)
170 op = [op, obj.getBoundaryOperatorWrapper(opName, boundary{i}, blockmatrixDiv)]; 147 op = [op, obj.getBoundaryOperator(opName, boundary{i})];
171 end 148 end
172 otherwise 149 otherwise
173 error('Unknown boundary indentifier') 150 error('Unknown boundary indentifier')
174 end 151 end
175 end 152 end
176 153
177 % Get a boundary cell of operators, specified by opName for the given boundary/BoundaryGroup 154 function op = getBoundaryQuadrature(obj, boundary)
178 function opCell = getBoundaryCellOperator(obj, opName, boundary, blockmatrixDiv)
179 default_arg('blockmatrixDiv', obj.blockmatrixDiv{1});
180
181 % Get size of cell
182 switch class(boundary) 155 switch class(boundary)
183 case 'cell' 156 case 'cell'
184 blockId = boundary{1}; 157 blockId = boundary{1};
185 localCell = obj.diffOps{blockId}.get_boundary_operator(opName, boundary{2}); 158 op = obj.diffOps{blockId}.getBoundaryQuadrature(boundary{2});
186 case 'multiblock.BoundaryGroup'
187 blockId = boundary{1}{1};
188 localCell = obj.diffOps{blockId}.get_boundary_operator(opName, boundary{1}{2});
189 otherwise
190 error('Unknown boundary indentifier')
191 end
192
193 % Loop over cell elements and build the boundary operator in each cell
194 opCell = cell(size(localCell));
195 for i = 1:numel(opCell)
196 switch class(boundary)
197 case 'cell'
198 blockId = boundary{1};
199 localOpCell = obj.diffOps{blockId}.get_boundary_operator(opName, boundary{2});
200 localOp = localOpCell{i};
201
202 div = {blockmatrixDiv, size(localOp,2)};
203 blockOp = blockmatrix.zero(div);
204 blockOp{blockId,1} = localOp;
205 op = blockmatrix.toMatrix(blockOp);
206 opCell{i} = op;
207
208 case 'multiblock.BoundaryGroup'
209 op = sparse(sum(blockmatrixDiv),0);
210 for j = 1:length(boundary)
211 localCell = obj.getBoundaryCellOperator(opName, boundary{j}, blockmatrixDiv);
212 op = [op, localCell{i}];
213 end
214 opCell{i} = op;
215 otherwise
216 error('Unknown boundary indentifier')
217 end
218 end
219 end
220
221 function op = getBoundaryQuadrature(obj, boundary)
222 opName = 'H';
223 switch class(boundary)
224 case 'cell'
225 localOpName = [opName '_' boundary{2}];
226 blockId = boundary{1};
227 op = obj.diffOps{blockId}.(localOpName);
228
229 return 159 return
230 case 'multiblock.BoundaryGroup' 160 case 'multiblock.BoundaryGroup'
231 N = length(boundary); 161 N = length(boundary);
232 H_bm = cell(N,N); 162 H_bm = cell(N,N);
233 for i = 1:N 163 for i = 1:N