annotate +sbp/+implementations/d2_noneq_variable_4.m @ 1344:b4e5e45bd239 feature/D2_boundary_opt

Remove round off zeros from D2Nonequidistant operators
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Sat, 15 Oct 2022 15:48:20 +0200
parents 8e9df030a0a5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 function [H, HI, D1, D2, DI] = d2_noneq_variable_4(N, h, options)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 % N: Number of grid points
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 % h: grid spacing
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 % options: struct containing options for constructing the operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 % current options are:
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 % options.stencil_type ('minimal','nonminimal','wide')
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 % options.AD ('upwind', 'op')
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 % BP: Number of boundary points
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 % order: Accuracy of interior stencil
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 BP = 4;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 order = 4;
1330
855871e0b852 Add size checks to the operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1326
diff changeset
13 if(N<2*BP)
855871e0b852 Add size checks to the operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1326
diff changeset
14 error(['Operator requires at least ' num2str(2*BP) ' grid points']);
855871e0b852 Add size checks to the operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1326
diff changeset
15 end
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 %%%% Norm matrix %%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 P = zeros(BP, 1);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 P0 = 2.1259737557798e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 P1 = 1.0260290400758e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 P2 = 1.0775123588954e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 P3 = 9.8607273802835e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24 for i = 0:BP - 1
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 P(i + 1) = eval(['P' num2str(i)]);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 Hv = ones(N, 1);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 Hv(1:BP) = P;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30 Hv(end - BP + 1:end) = flip(P);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 Hv = h * Hv;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32 H = spdiags(Hv, 0, N, N);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 HI = spdiags(1 ./ Hv, 0, N, N);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 %%%%%%%%%%%%%%%%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 %%%% Q matrix %%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 d = [1/12, -2/3, 0, 2/3, -1/12];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 d = repmat(d, N, 1);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 Q = spdiags(d, -order / 2:order / 2, N, N);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 % Boundaries
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 Q0_0 = -5.0000000000000e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 Q0_1 = 6.5605279837843e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 Q0_2 = -1.9875859409017e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 Q0_3 = 4.2705795711740e-02;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 Q0_4 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 Q0_5 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 Q1_0 = -6.5605279837843e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49 Q1_1 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 Q1_2 = 8.1236966439895e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 Q1_3 = -1.5631686602052e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 Q1_4 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 Q1_5 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 Q2_0 = 1.9875859409017e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 Q2_1 = -8.1236966439895e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 Q2_2 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 Q2_3 = 6.9694440364211e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 Q2_4 = -8.3333333333333e-02;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 Q2_5 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 Q3_0 = -4.2705795711740e-02;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 Q3_1 = 1.5631686602052e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 Q3_2 = -6.9694440364211e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 Q3_3 = 0.0000000000000e+00;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 Q3_4 = 6.6666666666667e-01;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 Q3_5 = -8.3333333333333e-02;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
67 for i = 1:BP
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 for j = 1:BP
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70 Q(i, j) = eval(['Q' num2str(i - 1) '_' num2str(j - 1)]);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 Q(N + 1 - i, N + 1 - j) = -eval(['Q' num2str(i - 1) '_' num2str(j - 1)]);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
74 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
77
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 %%% Undivided difference operators %%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 % Closed with zeros at the first boundary nodes.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 m = N;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
81
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82 DD_2 = (diag(ones(m - 1, 1), -1) - 2 * diag(ones(m, 1), 0) + diag(ones(m - 1, 1), 1));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 DD_2(1:3, 1:4) = [0 0 0 0; 0.16138369498429727170e1 -0.26095138364100825853e1 0.99567688656710986834e0 0; 0 0.84859980956172494512e0 -0.17944203477786665350e1 0.94582053821694158989e0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84 DD_2(m - 2:m, m - 3:m) = [0.94582053821694158989e0 -0.17944203477786665350e1 0.84859980956172494512e0 0; 0 0.99567688656710986834e0 -0.26095138364100825853e1 0.16138369498429727170e1; 0 0 0 0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
85 DD_2 = sparse(DD_2);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
86
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
87 DD_3 = (-diag(ones(m - 2, 1), -2) + 3 * diag(ones(m - 1, 1), -1) - 3 * diag(ones(m, 1), 0) + diag(ones(m - 1, 1), 1));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 DD_3(1:4, 1:5) = [0 0 0 0 0; 0 0 0 0 0; -0.17277463987989539852e1 0.37021976718569105700e1 -0.29870306597013296050e1 0.10125793866433730203e1 0; 0 -0.81738495424057284493e0 0.26916305216679998025e1 -0.28374616146508247697e1 0.96321604722339781208e0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 DD_3(m - 2:m, m - 4:m) = [-0.96321604722339781208e0 0.28374616146508247697e1 -0.26916305216679998025e1 0.81738495424057284493e0 0; 0 -0.10125793866433730203e1 0.29870306597013296050e1 -0.37021976718569105700e1 0.17277463987989539852e1; 0 0 0 0 0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90 DD_3 = sparse(DD_3);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
92 DD_4 = (diag(ones(m - 2, 1), 2) - 4 * diag(ones(m - 1, 1), 1) + 6 * diag(ones(m, 1), 0) - 4 * diag(ones(m - 1, 1), -1) + diag(ones(m - 2, 1), -2));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
93 DD_4(1:4, 1:6) = [0 0 0 0 0 0; 0 0 0 0 0 0; 0.18176226052481525189e1 -0.47546882767009058782e1 0.59740613194026592100e1 -0.40503175465734920811e1 0.10133218986235862303e1 0; 0 0.79462567299107735362e0 -0.35888406955573330700e1 0.56749232293016495393e1 -0.38528641888935912483e1 0.97215598215819742539e0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 DD_4(m - 3:m, m - 5:m) = [0.97215598215819742539e0 -0.38528641888935912483e1 0.56749232293016495393e1 -0.35888406955573330700e1 0.79462567299107735362e0 0; 0 0.10133218986235862303e1 -0.40503175465734920811e1 0.59740613194026592100e1 -0.47546882767009058782e1 0.18176226052481525189e1; 0 0 0 0 0 0; 0 0 0 0 0 0; ];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
95 DD_4 = sparse(DD_4);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
96 %%%%%%%%%%%%%%%%%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
97
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
98 %%%% Difference operators %%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
99 D1 = H \ Q;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
100
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
101 % Helper functions for constructing D2(c)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
102 % TODO: Consider changing sparse(diag(...)) to spdiags(....)
1344
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
103 min_inds = sbp.implementations.d2_sparsity_pattern_inds(m, order, BP, 0, 2);
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
104 nonmin_inds = sbp.implementations.d2_sparsity_pattern_inds(m, order, BP, 1, 2);
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
105
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
106 % Minimal 5 point stencil width
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
107 function D2 = D2_fun_minimal(c)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
108 % Here we add variable diffusion
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
109 C1 = sparse(diag(c));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
110 C2 = 1/2 * diag(ones(m - 1, 1), -1) + 1/2 * diag(ones(m, 1), 0); C2(1, 2) = 1/2;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
111
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
112 C2 = sparse(diag(C2 * c));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
113
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
114 % Remainder term added to wide second drivative opereator, to obtain a 5
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
115 % point narrow stencil.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
116 R = (1/144 / h) * transpose(DD_4) * C1 * DD_4 + (1/18 / h) * transpose(DD_3) * C2 * DD_3;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
117 D2 = D1 * C1 * D1 - H \ R;
1344
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
118
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
119 % Remove potential round off zeros
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
120 D2tmp = sparse(m,m);
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
121 D2tmp(min_inds) = D2(min_inds);
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
122 D2 = D2tmp;
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
123 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
124
1332
8e9df030a0a5 Clarify comments
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1330
diff changeset
125 % Non-minimal 7 point stencil width
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
126 function D2 = D2_fun_nonminimal(c)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
127 % Here we add variable diffusion
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
128 C1 = sparse(diag(c));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
129
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
130 % Remainder term added to wide second derivative operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
131 R = (1/144 / h) * transpose(DD_4) * C1 * DD_4;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
132 D2 = D1 * C1 * D1 - H \ R;
1344
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
133
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
134 % Remove potential round off zeros
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
135 D2tmp = sparse(m,m);
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
136 D2tmp(nonmin_inds) = D2(nonmin_inds);
b4e5e45bd239 Remove round off zeros from D2Nonequidistant operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1332
diff changeset
137 D2 = D2tmp;
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
138 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
139
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
140 % Wide stencil
1326
c2d716c4f1ed Fix bug when using wide stencils
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1325
diff changeset
141 function D2 = D2_fun_wide(c)
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
142 % Here we add variable diffusion
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
143 C1 = sparse(diag(c));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
144 D2 = D1 * C1 * D1;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
145 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
146
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
147 switch options.stencil_width
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
148 case 'minimal'
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
149 D2 = @D2_fun_minimal;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
150 case 'nonminimal'
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
151 D2 = @D2_fun_nonminimal;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
152 case 'wide'
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
153 D2 = @D2_fun_wide;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
154 otherwise
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
155 error('No option %s for stencil width', options.stencil_width)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
156 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
157
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
158 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
159
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
160 %%%% Artificial dissipation operator %%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
161 switch options.AD
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
162 case 'upwind'
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
163 % This is the choice that yield 3rd order Upwind
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
164 DI = H \ (transpose(DD_2) * DD_2) * (-1/12);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
165 case 'op'
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
166 % This choice will preserve the order of the underlying
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
167 % Non-dissipative D1 SBP operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
168 DI = H \ (transpose(DD_3) * DD_3) * (-1 / (5 * 12));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
169 otherwise
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
170 error("Artificial dissipation options '%s' not implemented.", option.AD)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
171 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
172
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
173 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
174 end