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