Mercurial > repos > public > sbplib
annotate +sbp/D2Nonequidistant.m @ 1330:855871e0b852 feature/D2_boundary_opt
Add size checks to the operators
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Thu, 17 Feb 2022 18:55:11 +0100 |
parents | 7ab7d42a5b24 |
children |
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, 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
|
53 case 8 |
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_8(m, h, options); |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
55 case 10 |
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, 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
|
57 case 12 |
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_12(m, h, options); |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
59 otherwise |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
60 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
|
61 end |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
62 |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
63 if ~options.variable_coeffs |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
64 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
|
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 % Boundary operators |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
68 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
|
69 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
|
70 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
|
71 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
|
72 |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
73 % Borrowing coefficients |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
74 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
|
75 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
|
76 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
|
77 |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
78 % grid data |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
79 obj.x = x; |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
80 obj.h = h; |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
81 obj.m = m; |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
82 |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
83 % misc |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
84 obj.options = options; |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
85 end |
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 function str = string(obj) |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
88 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
|
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 end |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
92 |
1b0f2415237f
Add variable coefficient boundary-optimized second derivatives.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
93 end |