Mercurial > repos > public > sbplib
annotate spdiagsPeriodic.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | bbf303c1f0cf |
children |
rev | line source |
---|---|
801
bbf303c1f0cf
Rename spdaigsVariablePeriodic spdiagsPeriodic
Jonatan Werpers <jonatan@werpers.com>
parents:
800
diff
changeset
|
1 function A = spdiagsPeriodic(vals,diags) |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
2 % Creates an m x m periodic discretization matrix. |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
3 % vals - m x ndiags matrix of values |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
4 % diags - 1 x ndiags vector of the 'center diagonals' that vals end up on |
799
8c65ef13df89
Bort med martins hemska whitespace
Jonatan Werpers <jonatan@werpers.com>
parents:
683
diff
changeset
|
5 % vals that are not on main diagonal are going to spill over to |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
6 % off-diagonal corners. |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
7 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
8 default_arg('diags',0); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
9 |
799
8c65ef13df89
Bort med martins hemska whitespace
Jonatan Werpers <jonatan@werpers.com>
parents:
683
diff
changeset
|
10 [m, ~] = size(vals); |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
11 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
12 A = sparse(m,m); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
13 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
14 for i = 1:length(diags) |
799
8c65ef13df89
Bort med martins hemska whitespace
Jonatan Werpers <jonatan@werpers.com>
parents:
683
diff
changeset
|
15 |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
16 d = diags(i); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
17 a = vals(:,i); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
18 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
19 % Sub-diagonals |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
20 if d < 0 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
21 a_bulk = a(1+abs(d):end); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
22 a_corner = a(1:1+abs(d)-1); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
23 corner_diag = m-abs(d); |
799
8c65ef13df89
Bort med martins hemska whitespace
Jonatan Werpers <jonatan@werpers.com>
parents:
683
diff
changeset
|
24 A = A + spdiagVariable(a_bulk, d); |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
25 A = A + spdiagVariable(a_corner, corner_diag); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
26 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
27 % Super-diagonals |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
28 elseif d > 0 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
29 a_bulk = a(1:end-d); |
683
50e77b15d841
Bugfix in spdiagsVariablePeriodic
Martin Almquist <malmquist@stanford.edu>
parents:
681
diff
changeset
|
30 a_corner = a(end-d+1:end); |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
31 corner_diag = -m + d; |
799
8c65ef13df89
Bort med martins hemska whitespace
Jonatan Werpers <jonatan@werpers.com>
parents:
683
diff
changeset
|
32 A = A + spdiagVariable(a_bulk, d); |
681
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
33 A = A + spdiagVariable(a_corner, corner_diag); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
34 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
35 % Main diagonal |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
36 else |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
37 A = A + spdiagVariable(a, 0); |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
38 end |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
39 |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
40 end |
7368affc8f78
Add D2 variable periodic for second order.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
41 |
800
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
42 end |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
43 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
44 function A = spdiagVariable(a,i) |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
45 default_arg('i',0); |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
46 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
47 if isrow(a) |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
48 a = a'; |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
49 end |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
50 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
51 n = length(a)+abs(i); |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
52 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
53 if i > 0 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
54 a = [sparse(i,1); a]; |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
55 elseif i < 0 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
56 a = [a; sparse(abs(i),1)]; |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
57 end |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
58 |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
59 A = spdiags(a,i,n,n); |
87ea9cac3287
Make spdiagVariable a local functions
Jonatan Werpers <jonatan@werpers.com>
parents:
799
diff
changeset
|
60 end |