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