Mercurial > repos > public > sbplib
comparison +scheme/Hypsyst2dCurve.m @ 997:78db023a7fe3 feature/getBoundaryOp
Add getBoundaryOperator method to all 2d schemes, except obsolete Wave2dCurve and ElastiCurve, which needs a big makeover.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Sat, 12 Jan 2019 11:57:50 -0800 |
parents | 706d1c2b4199 |
children | 8d73fcdb07a5 |
comparison
equal
deleted
inserted
replaced
982:a0b3161e44f3 | 997:78db023a7fe3 |
---|---|
167 params = obj.params; | 167 params = obj.params; |
168 X = obj.X; | 168 X = obj.X; |
169 Y = obj.Y; | 169 Y = obj.Y; |
170 xi = obj.xi; | 170 xi = obj.xi; |
171 eta = obj.eta; | 171 eta = obj.eta; |
172 e_ = obj.getBoundaryOperator('e', boundary); | |
172 | 173 |
173 switch boundary | 174 switch boundary |
174 case {'w','W','west'} | 175 case {'w','W','west'} |
175 e_ = obj.e_w; | |
176 mat = obj.Ahat; | 176 mat = obj.Ahat; |
177 boundPos = 'l'; | 177 boundPos = 'l'; |
178 Hi = obj.Hxii; | 178 Hi = obj.Hxii; |
179 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_w),Y(obj.index_w),obj.X_eta(obj.index_w),obj.Y_eta(obj.index_w)); | 179 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_w),Y(obj.index_w),obj.X_eta(obj.index_w),obj.Y_eta(obj.index_w)); |
180 side = max(length(eta)); | 180 side = max(length(eta)); |
181 case {'e','E','east'} | 181 case {'e','E','east'} |
182 e_ = obj.e_e; | |
183 mat = obj.Ahat; | 182 mat = obj.Ahat; |
184 boundPos = 'r'; | 183 boundPos = 'r'; |
185 Hi = obj.Hxii; | 184 Hi = obj.Hxii; |
186 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_e),Y(obj.index_e),obj.X_eta(obj.index_e),obj.Y_eta(obj.index_e)); | 185 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_e),Y(obj.index_e),obj.X_eta(obj.index_e),obj.Y_eta(obj.index_e)); |
187 side = max(length(eta)); | 186 side = max(length(eta)); |
188 case {'s','S','south'} | 187 case {'s','S','south'} |
189 e_ = obj.e_s; | |
190 mat = obj.Bhat; | 188 mat = obj.Bhat; |
191 boundPos = 'l'; | 189 boundPos = 'l'; |
192 Hi = obj.Hetai; | 190 Hi = obj.Hetai; |
193 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_s),Y(obj.index_s),obj.X_xi(obj.index_s),obj.Y_xi(obj.index_s)); | 191 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_s),Y(obj.index_s),obj.X_xi(obj.index_s),obj.Y_xi(obj.index_s)); |
194 side = max(length(xi)); | 192 side = max(length(xi)); |
195 case {'n','N','north'} | 193 case {'n','N','north'} |
196 e_ = obj.e_n; | |
197 mat = obj.Bhat; | 194 mat = obj.Bhat; |
198 boundPos = 'r'; | 195 boundPos = 'r'; |
199 Hi = obj.Hetai; | 196 Hi = obj.Hetai; |
200 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_n),Y(obj.index_n),obj.X_xi(obj.index_n),obj.Y_xi(obj.index_n)); | 197 [V,Vi,D,signVec] = obj.matrixDiag(mat,X(obj.index_n),Y(obj.index_n),obj.X_xi(obj.index_n),obj.Y_xi(obj.index_n)); |
201 side = max(length(xi)); | 198 side = max(length(xi)); |
372 D = diag([DD(poseig); DD(zeroeig); DD(negeig)]); | 369 D = diag([DD(poseig); DD(zeroeig); DD(negeig)]); |
373 V = [V(:,poseig) V(:,zeroeig) V(:,negeig)]; | 370 V = [V(:,poseig) V(:,zeroeig) V(:,negeig)]; |
374 Vi = [Vi(poseig,:); Vi(zeroeig,:); Vi(negeig,:)]; | 371 Vi = [Vi(poseig,:); Vi(zeroeig,:); Vi(negeig,:)]; |
375 signVec = [sum(poseig),sum(zeroeig),sum(negeig)]; | 372 signVec = [sum(poseig),sum(zeroeig),sum(negeig)]; |
376 end | 373 end |
374 | |
375 % Returns the boundary operator op for the boundary specified by the string boundary. | |
376 % op -- string or a cell array of strings | |
377 % boundary -- string | |
378 function varargout = getBoundaryOperator(obj, op, boundary) | |
379 | |
380 if ~iscell(op) | |
381 op = {op}; | |
382 end | |
383 | |
384 for i = 1:numel(op) | |
385 switch op{i} | |
386 case 'e' | |
387 switch boundary | |
388 case 'w' | |
389 e = obj.e_w; | |
390 case 'e' | |
391 e = obj.e_e; | |
392 case 's' | |
393 e = obj.e_s; | |
394 case 'n' | |
395 e = obj.e_n; | |
396 otherwise | |
397 error('No such boundary: boundary = %s',boundary); | |
398 end | |
399 varargout{i} = e; | |
400 end | |
401 end | |
402 end | |
403 | |
404 % Returns square boundary quadrature matrix, of dimension | |
405 % corresponding to the number of boundary points | |
406 % | |
407 % boundary -- string | |
408 function H_b = getBoundaryQuadrature(obj, boundary) | |
409 | |
410 e = obj.getBoundaryOperator('e', boundary); | |
411 | |
412 switch boundary | |
413 case 'w' | |
414 H_b = inv(e'*obj.Hetai*e); | |
415 case 'e' | |
416 H_b = inv(e'*obj.Hetai*e); | |
417 case 's' | |
418 H_b = inv(e'*obj.Hxii*e); | |
419 case 'n' | |
420 H_b = inv(e'*obj.Hxii*e); | |
421 otherwise | |
422 error('No such boundary: boundary = %s',boundary); | |
423 end | |
424 end | |
425 | |
426 | |
377 end | 427 end |
378 end | 428 end |