annotate +sbp/+implementations/d2_variable_periodic_4.m @ 1198:2924b3a9b921 feature/d2_compatible

Add OpSet for fully compatible D2Variable, created from regular D2Variable by replacing d1 by first row of D1. Formal reduction by one order of accuracy at the boundary point.
author Martin Almquist <malmquist@stanford.edu>
date Fri, 16 Aug 2019 14:30:28 -0700
parents bbf303c1f0cf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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