annotate +sbp/D2Nonequidistant.m @ 1327:7ab7d42a5b24 feature/D2_boundary_opt

Fix typo in comment
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 14 Feb 2022 10:49:49 +0100
parents 1b0f2415237f
children 855871e0b852
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 classdef D2Nonequidistant < sbp.OpSet
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 % Implements the boundary optimized variable coefficient
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 % second derivative.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 %
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 % The boundary closure uses the first and last rows of the
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 % boundary-optimized D1 operator, i.e. the operators are
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 % fully compatible.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 properties
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 H % Norm matrix
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 HI % H^-1
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 D1 % SBP operator approximating first derivative
1327
7ab7d42a5b24 Fix typo in comment
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1325
diff changeset
12 D2 % SBP operator approximating second derivative
1325
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 DI % Dissipation operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 e_l % Left boundary operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 e_r % Right boundary operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 d1_l % Left boundary first derivative
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 d1_r % Right boundary first derivative
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 m % Number of grid points.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 h % Step size
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 x % grid
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 borrowing % Struct with borrowing limits for different norm matrices
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 options % Struct holding options used to create the operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 methods
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 function obj = D2Nonequidistant(m, lim, order, options)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 % m - number of gridpoints
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 % lim - cell array holding the limits of the domain
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30 % order - order of the operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 % options - struct holding options used to construct the operator
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32 % struct.stencil_width: {'minimal', 'nonminimal', 'wide'}
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 % minimal: minimal compatible stencil width (default)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 % nonminimal: a few additional stencil points compared to minimal
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 % wide: wide stencil obtained by applying D1 twice
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 % struct.AD: {'op', 'upwind'}
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 % 'op': order-preserving AD (preserving interior stencil order) (default)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 % 'upwind': upwind AD (order-1 upwind interior stencil)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 % struct.variable_coeffs: {true, false}
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 % true: obj.D2 is a function handle D2(c) returning a matrix
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 % for coefficient vector c (default)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 % false: obj.D2 is a matrix.
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 default_arg('options', struct);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 default_field(options,'stencil_width','minimal');
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 default_field(options,'AD','op');
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 default_field(options,'variable_coeffs',true);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 [x, h] = sbp.grid.accurateBoundaryOptimizedGrid(lim, m, order);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 switch order
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49 case 4
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 [obj.H, obj.HI, obj.D1, obj.D2, obj.DI] = sbp.implementations.d2_noneq_variable_4(m, h, options);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 case 6
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 % [obj.H, obj.HI, obj.D1, D2, M, Q, obj.e_l, obj.e_r, obj.d1_l, obj.d1_r] = sbp.implementations.d2_noneq_6(m,h,2);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 % obj.D2 = @(c)D2;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 [obj.H, obj.HI, obj.D1, obj.D2, obj.DI] = sbp.implementations.d2_noneq_variable_6(m, h, options);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 case 8
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 % [obj.H, obj.HI, obj.D1, D2, M, Q, obj.e_l, obj.e_r, obj.d1_l, obj.d1_r] = sbp.implementations.d2_noneq_8(m,h,1);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 % obj.D2 = @(c)D2;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 [obj.H, obj.HI, obj.D1, obj.D2, obj.DI] = sbp.implementations.d2_noneq_variable_8(m, h, options);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 case 10
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 [obj.H, obj.HI, obj.D1, obj.D2, obj.DI] = sbp.implementations.d2_noneq_variable_10(m, h, options);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 case 12
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 [obj.H, obj.HI, obj.D1, obj.D2, obj.DI] = sbp.implementations.d2_noneq_variable_12(m, h, options);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 otherwise
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 error('Invalid operator order %d.', order);
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 end
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 if ~options.variable_coeffs
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 obj.D2 = obj.D2(ones(m,1));
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 % Boundary operators
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 obj.e_l = sparse(m, 1); obj.e_l(1) = 1;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73 obj.e_r = sparse(m, 1); obj.e_r(m) = 1;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
74 obj.d1_l = (obj.e_l' * obj.D1)';
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 obj.d1_r = (obj.e_r' * obj.D1)';
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 % Borrowing coefficients
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 obj.borrowing.H11 = obj.H(1, 1) / h; % First element in H/h,
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 obj.borrowing.M.d1 = obj.H(1, 1) / h; % First element in H/h is borrowing also for M
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 obj.borrowing.R.delta_D = inf;
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 % grid data
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 obj.x = x;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84 obj.h = h;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
85 obj.m = m;
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 % misc
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 obj.options = options;
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91 function str = string(obj)
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
92 str = [class(obj) '_' num2str(obj.order)];
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
93 end
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94
1b0f2415237f Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
95 end
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 end