Mercurial > repos > public > sbplib
comparison +multiblock/DiffOp.m @ 210:39b7dcb2c724 feature/grids
multiblock: Implemented boundary conditions.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 16 Jun 2016 09:21:17 +0200 |
parents | e2fefb6f0746 |
children | 8b10476b9bb7 |
comparison
equal
deleted
inserted
replaced
209:4fc2631477a3 | 210:39b7dcb2c724 |
---|---|
3 grid | 3 grid |
4 order | 4 order |
5 diffOps | 5 diffOps |
6 D | 6 D |
7 H | 7 H |
8 | |
9 blockmatrixDiv | |
8 end | 10 end |
9 | 11 |
10 methods | 12 methods |
11 function obj = DiffOp(doHand, grid, order, doParam) | 13 function obj = DiffOp(doHand, grid, order, doParam) |
12 % doHand -- may either be a function handle or a cell array of | 14 % doHand -- may either be a function handle or a cell array of |
42 % Build the norm matrix | 44 % Build the norm matrix |
43 H = cell(nBlocks, nBlocks); | 45 H = cell(nBlocks, nBlocks); |
44 for i = 1:nBlocks | 46 for i = 1:nBlocks |
45 H{i,i} = obj.diffOps{i}.H; | 47 H{i,i} = obj.diffOps{i}.H; |
46 end | 48 end |
47 obj.H = cell2sparse(H); | 49 obj.H = blockmatrix.toMatrix(H); |
48 | 50 |
49 | 51 |
50 % Build the differentiation matrix | 52 % Build the differentiation matrix |
51 D = cell(nBlocks, nBlocks); | 53 D = cell(nBlocks, nBlocks); |
52 for i = 1:nBlocks | 54 for i = 1:nBlocks |
67 [jj, ji] = obj.diffOps{j}.interface(intf{2}, obj.diffOps{i}, intf{1}); | 69 [jj, ji] = obj.diffOps{j}.interface(intf{2}, obj.diffOps{i}, intf{1}); |
68 D{j,j} = D{j,j} + jj; | 70 D{j,j} = D{j,j} + jj; |
69 D{j,i} = D{j,i} + ji; | 71 D{j,i} = D{j,i} + ji; |
70 end | 72 end |
71 end | 73 end |
72 obj.D = cell2sparse(D); | 74 obj.D = blockmatrix.toMatrix(D); |
73 | 75 |
74 % end | 76 obj.blockmatrixDiv = blockmatrix.getDivision(D); |
75 | 77 |
76 function [getHand, getParam] = parseInput(doHand, grid, doParam) | 78 function [getHand, getParam] = parseInput(doHand, grid, doParam) |
77 if ~isa(grid, 'multiblock.Grid') | 79 if ~isa(grid, 'multiblock.Grid') |
78 error('multiblock:DiffOp:DiffOp:InvalidGrid', 'Requires a multiblock grid.'); | 80 error('multiblock:DiffOp:DiffOp:InvalidGrid', 'Requires a multiblock grid.'); |
79 end | 81 end |
108 % boundary of that block example: 1s or 3w | 110 % boundary of that block example: 1s or 3w |
109 function [closure, penalty] = boundary_condition(obj,boundary,type,data) | 111 function [closure, penalty] = boundary_condition(obj,boundary,type,data) |
110 I = boundary(1) | 112 I = boundary(1) |
111 name = boundary(2:end); | 113 name = boundary(2:end); |
112 | 114 |
113 [c, p] = obj.diffOps{I}.boundary_condition(name, type, data); | 115 % Get the closure and penaly matrices |
116 [blockClosure, blockPenalty] = obj.diffOps{I}.boundary_condition(name, type, data); | |
117 | |
118 % Expand to matrix for full domain. | |
119 div = obj.blockmatrixDiv; | |
120 closure = blockmatrix.zero(div); | |
121 closure{I,I} = blockClosure; | |
122 | |
123 div{2} = 1; % Penalty is a column vector | |
124 penalty = blockmatrix.zero(div); | |
125 penalty{I} = blockPenalty; | |
126 | |
127 % Convert to matrix | |
128 closure = blockmatrix.toMatrix(closure); | |
129 penalty = blockmatrix.toMatrix(closure); | |
114 end | 130 end |
115 | 131 |
116 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) | 132 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) |
117 | 133 |
118 end | 134 end |