Mercurial > repos > public > sbplib
annotate +sbp/+implementations/d2_variable_periodic_4.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 |
---|---|
686
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
1 function [H, HI, D1, D2, e_l, e_r, d1_l, d1_r] = d2_variable_periodic_4(m,h) |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
2 % m = number of unique grid points, i.e. h = L/m; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
3 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
4 if(m<5) |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
5 error(['Operator requires at least ' num2str(5) ' grid points']); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
6 end |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
7 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
8 % Norm |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
9 Hv = ones(m,1); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
10 Hv = h*Hv; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
11 H = spdiag(Hv, 0); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
12 HI = spdiag(1./Hv, 0); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
13 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
14 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
15 % Dummy boundary operators |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
16 e_l = sparse(m,1); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
17 e_r = rot90(e_l, 2); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
18 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
19 d1_l = sparse(m,1); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
20 d1_r = -rot90(d1_l, 2); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
21 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
22 S = d1_l*d1_l' + d1_r*d1_r'; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
23 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
24 % D1 operator |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
25 stencil = [1/12 -2/3 0 2/3 -1/12]; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
26 diags = -2:2; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
27 Q = stripeMatrixPeriodic(stencil, diags, m); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
28 D1 = HI*(Q - 1/2*e_l*e_l' + 1/2*e_r*e_r'); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
29 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
30 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
31 scheme_width = 5; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
32 scheme_radius = (scheme_width-1)/2; |
801
bbf303c1f0cf
Rename spdaigsVariablePeriodic spdiagsPeriodic
Jonatan Werpers <jonatan@werpers.com>
parents:
686
diff
changeset
|
33 |
686
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
34 r = 1:m; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
35 offset = scheme_width; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
36 r = r + offset; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
37 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
38 function D2 = D2_fun(c) |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
39 c = [c(end-scheme_width+1:end); c; c(1:scheme_width) ]; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
40 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
41 % Note: these coefficients are for -M. |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
42 Mm2 = -1/8*c(r-2) + 1/6*c(r-1) - 1/8*c(r); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
43 Mm1 = 1/6 *c(r-2) + 1/2*c(r-1) + 1/2*c(r) + 1/6*c(r+1); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
44 M0 = -1/24*c(r-2)- 5/6*c(r-1) - 3/4*c(r) - 5/6*c(r+1) - 1/24*c(r+2); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
45 Mp1 = 0 * c(r-2) + 1/6*c(r-1) + 1/2*c(r) + 1/2*c(r+1) + 1/6 *c(r+2); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
46 Mp2 = 0 * c(r-2) + 0 * c(r-1) - 1/8*c(r) + 1/6*c(r+1) - 1/8 *c(r+2); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
47 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
48 vals = -[Mm2,Mm1,M0,Mp1,Mp2]; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
49 diags = -scheme_radius : scheme_radius; |
801
bbf303c1f0cf
Rename spdaigsVariablePeriodic spdiagsPeriodic
Jonatan Werpers <jonatan@werpers.com>
parents:
686
diff
changeset
|
50 M = spdiagsPeriodic(vals,diags); |
686
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
51 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
52 M=M/h; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
53 D2=HI*(-M ); |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
54 |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
55 end |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
56 D2 = @D2_fun; |
5ccf6aaf6d6b
Add D2VariablePeriodic orders 4 and 6.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
57 end |