annotate +multiblock/DiffOpTimeDep.m @ 714:bca7a52550d1 feature/optim

closing feature/optim
author Ylva Rydin <ylva.rydin@telia.com>
date Thu, 08 Mar 2018 09:42:49 +0100
parents e6fbdc9ccfc4
children acb58769610e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
705
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
1 classdef DiffOpTimeDep < scheme.Scheme
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
2 properties
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
3 grid
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
4 order
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
5 diffOps
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
6 D
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
7 H
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
8
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
9 blockmatrixDiv
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
10 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
11
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
12 methods
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
13 function obj = DiffOpTimeDep(doHand, grid, order, doParam)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
14 % doHand -- may either be a function handle or a cell array of
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
15 % function handles for each grid. The function handle(s)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
16 % should be on the form do = doHand(grid, order, ...)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
17 % Additional parameters for each doHand may be provided in
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
18 % the doParam input.
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
19 % grid -- a multiblock grid
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
20 % order -- integer specifying the order of accuracy
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
21 % doParam -- may either be a cell array or a cell array of cell arrays
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
22 % for each block. If it is a cell array with length equal
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
23 % to the number of blocks then each element is sent to the
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
24 % corresponding function handle as extra parameters:
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
25 % doHand(..., doParam{i}{:}) Otherwise doParam is sent as
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
26 % extra parameters to all doHand: doHand(..., doParam{:})
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
27 default_arg('doParam', [])
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
28
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
29 [getHand, getParam] = parseInput(doHand, grid, doParam);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
30 obj.grid = grid;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
31 nBlocks = grid.nBlocks();
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
32
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
33 obj.order = order;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
34
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
35 % Create the diffOps for each block
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
36 obj.diffOps = cell(1, nBlocks);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
37 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
38 h = getHand(i);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
39 p = getParam(i);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
40 if ~iscell(p)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
41 p = {p};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
42 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
43 obj.diffOps{i} = h(grid.grids{i}, order, p{:});
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
44 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
45
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
46
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
47 % Build the norm matrix
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
48 H = cell(nBlocks, nBlocks);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
49 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
50 H{i,i} = obj.diffOps{i}.H;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
51 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
52 obj.H = blockmatrix.toMatrix(H);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
53
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
54
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
55 % Build the differentiation matrix
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
56 obj.blockmatrixDiv = {grid.Ns, grid.Ns};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
57 % D = blockmatrix.zero(obj.blockmatrixDiv);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
58
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
59 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
60 for j = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
61 D{i,j} = @(t) 0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
62 D{j,i} = @(t) 0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
63 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
64 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
65
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
66
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
67 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
68 D{i,i} = @(t)obj.diffOps{i}.D(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
69 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
70
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
71 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
72 for j = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
73 intf = grid.connections{i,j};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
74 if isempty(intf)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
75 continue
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
76 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
77
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
78
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
79 [ii, ij] = obj.diffOps{i}.interface(intf{1}, obj.diffOps{j}, intf{2});
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
80 D{i,i} = @(t) D{i,i}(t) + ii(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
81 D{i,j} = @(t) D{i,j}(t) + ij(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
82
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
83 [jj, ji] = obj.diffOps{j}.interface(intf{2}, obj.diffOps{i}, intf{1});
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
84 D{j,j} = @(t) D{j,j}(t) + jj(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
85 D{j,i} = @(t) D{j,i}(t) + ji(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
86 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
87 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
88 obj.D = D;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
89
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
90
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
91 function [getHand, getParam] = parseInput(doHand, grid, doParam)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
92 if ~isa(grid, 'multiblock.Grid')
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
93 error('multiblock:DiffOp:DiffOp:InvalidGrid', 'Requires a multiblock grid.');
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
94 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
95
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
96 if iscell(doHand) && length(doHand) == grid.nBlocks()
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
97 getHand = @(i)doHand{i};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
98 elseif isa(doHand, 'function_handle')
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
99 getHand = @(i)doHand;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
100 else
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
101 error('multiblock:DiffOp:DiffOp:InvalidGridDoHand', 'doHand must be a function handle or a cell array of length grid.nBlocks');
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
102 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
103
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
104 if isempty(doParam)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
105 getParam = @(i){};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
106 return
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
107 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
108
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
109 if ~iscell(doParam)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
110 getParam = @(i)doParam;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
111 return
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
112 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
113
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
114 % doParam is a non-empty cell-array
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
115
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
116 if length(doParam) == grid.nBlocks() && all(cellfun(@iscell, doParam))
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
117 % doParam is a cell-array of cell-arrays
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
118 getParam = @(i)doParam{i};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
119 return
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
120 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
121
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
122 getParam = @(i)doParam;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
123 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
124 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
125
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
126 function ops = splitOp(obj, op)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
127 % Splits a matrix operator into a cell-matrix of matrix operators for
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
128 % each grid.
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
129 ops = sparse2cell(op, obj.NNN);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
130 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
131
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
132 % Get a boundary operator specified by opName for the given boundary/BoundaryGroup
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
133 function op = getBoundaryOperator(obj, opName, boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
134 switch class(boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
135 case 'cell'
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
136 localOpName = [opName '_' boundary{2}];
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
137 blockId = boundary{1};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
138 localOp = obj.diffOps{blockId}.(localOpName);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
139
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
140 div = {obj.blockmatrixDiv{1}, size(localOp,2)};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
141 blockOp = blockmatrix.zero(div);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
142 blockOp{blockId,1} = localOp;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
143 op = blockmatrix.toMatrix(blockOp);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
144 return
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
145 case 'multiblock.BoundaryGroup'
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
146 op = sparse(size(obj.D,1),0);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
147 for i = 1:length(boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
148 op = [op, obj.getBoundaryOperator(opName, boundary{i})];
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
149 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
150 otherwise
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
151 error('Unknown boundary indentifier')
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
152 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
153 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
154
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
155 % Creates the closure and penalty matrix for a given boundary condition,
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
156 % boundary -- the name of the boundary on the form {id,name} where
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
157 % id is the number of a block and name is the name of a
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
158 % boundary of that block example: {1,'s'} or {3,'w'}. It
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
159 % can also be a boundary group
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
160 function [closure, penalty] = boundary_condition(obj, boundary, type)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
161 switch class(boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
162 case 'cell'
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
163 [closure, penalty] = obj.singleBoundaryCondition(boundary, type);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
164 case 'multiblock.BoundaryGroup'
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
165 nBlocks = obj.grid.nBlocks();
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
166 %[n,m] = size(obj.D);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
167 %closure = sparse(n,m);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
168 %penalty = sparse(n,0);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
169 % closure =@(t)0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
170 % penalty = @(t)0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
171 for i = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
172 for j = 1:nBlocks
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
173 closure{j,i} = @(t)0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
174 penalty{j,i} = @(t)0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
175 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
176 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
177
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
178
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
179 for i = 1:length(boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
180 [closurePart, penaltyPart] = obj.boundary_condition(boundary{i}, type);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
181 closure{i,i} = @(t)closure{i,i}(t) + closurePart(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
182 penalty{i,i} = @(t)penalty{i,i}(t) + penaltyPart(t);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
183 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
184 otherwise
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
185 error('Unknown boundary indentifier')
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
186 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
187
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
188 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
189
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
190 function [blockClosure, blockPenalty] = singleBoundaryCondition(obj, boundary, type)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
191 I = boundary{1};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
192 name = boundary{2};
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
193 % Get the closure and penaly matrices
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
194 [blockClosure, blockPenalty] = obj.diffOps{I}.boundary_condition(name, type);
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
195
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
196 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
197
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
198 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
199 error('not implemented')
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
200 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
201
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
202 % Size returns the number of degrees of freedom
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
203 function N = size(obj)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
204 N = 0;
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
205 for i = 1:length(obj.diffOps)
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
206 N = N + obj.diffOps{i}.size();
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
207 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
208 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
209 end
e6fbdc9ccfc4 Add diffOp time Dep
Ylva Rydin <ylva.rydin@telia.com>
parents:
diff changeset
210 end