Mercurial > repos > public > sbplib
annotate +sbp/D1Nonequidistant.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 | bc78157c89cb |
children | 4cb627c7fb90 |
rev | line source |
---|---|
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
1 classdef D1Nonequidistant < sbp.OpSet |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
2 properties |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
3 D1 % SBP operator approximating first derivative |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
4 H % Norm matrix |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
5 HI % H^-1 |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
6 Q % Skew-symmetric matrix |
268
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
7 e_l % Left boundary operator |
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
8 e_r % Right boundary operator |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
9 m % Number of grid points. |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
10 h % Step size |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
11 x % grid |
259
a94bb3d92aba
Added empty borrowing property to nonequidstant class.
Martin Almquist <martin.almquist@it.uu.se>
parents:
258
diff
changeset
|
12 borrowing % Struct with borrowing limits for different norm matrices |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
13 end |
396 | 14 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
15 methods |
264
8a625c5a3633
Changed input parameter L (domain length) to lim (cell with domain boundaries)
Martin Almquist <martin.almquist@it.uu.se>
parents:
262
diff
changeset
|
16 function obj = D1Nonequidistant(m,lim,order,option) |
396 | 17 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
18 default_arg('option','Accurate'); |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
19 % 'Accurate' operators are optimized for accuracy |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
20 % 'Minimal' operators have the smallest possible boundary |
259
a94bb3d92aba
Added empty borrowing property to nonequidstant class.
Martin Almquist <martin.almquist@it.uu.se>
parents:
258
diff
changeset
|
21 % closure |
396 | 22 |
264
8a625c5a3633
Changed input parameter L (domain length) to lim (cell with domain boundaries)
Martin Almquist <martin.almquist@it.uu.se>
parents:
262
diff
changeset
|
23 x_l = lim{1}; |
8a625c5a3633
Changed input parameter L (domain length) to lim (cell with domain boundaries)
Martin Almquist <martin.almquist@it.uu.se>
parents:
262
diff
changeset
|
24 x_r = lim{2}; |
8a625c5a3633
Changed input parameter L (domain length) to lim (cell with domain boundaries)
Martin Almquist <martin.almquist@it.uu.se>
parents:
262
diff
changeset
|
25 L = x_r-x_l; |
396 | 26 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
27 switch option |
396 | 28 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
29 case {'Accurate','accurate','A'} |
396 | 30 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
31 if order == 4 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
32 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
33 sbp.implementations.d1_noneq_4(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
34 elseif order == 6 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
35 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
36 sbp.implementations.d1_noneq_6(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
37 elseif order == 8 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
38 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
39 sbp.implementations.d1_noneq_8(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
40 elseif order == 10 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
41 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
42 sbp.implementations.d1_noneq_10(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
43 elseif order == 12 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
44 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
45 sbp.implementations.d1_noneq_12(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
46 else |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
47 error('Invalid operator order %d.',order); |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
48 end |
396 | 49 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
50 case {'Minimal','minimal','M'} |
396 | 51 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
52 if order == 4 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
53 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
54 sbp.implementations.d1_noneq_minimal_4(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
55 elseif order == 6 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
56 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
57 sbp.implementations.d1_noneq_minimal_6(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
58 elseif order == 8 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
59 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
60 sbp.implementations.d1_noneq_minimal_8(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
61 elseif order == 10 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
62 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
63 sbp.implementations.d1_noneq_minimal_10(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
64 elseif order == 12 |
261
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
65 [obj.D1,obj.H,obj.x,obj.h] = ... |
6009f2712d13
Moved and renamned all implementations.
Martin Almquist <martin.almquist@it.uu.se>
parents:
259
diff
changeset
|
66 sbp.implementations.d1_noneq_minimal_12(m,L); |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
67 else |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
68 error('Invalid operator order %d.',order); |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
69 end |
396 | 70 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
71 end |
396 | 72 |
264
8a625c5a3633
Changed input parameter L (domain length) to lim (cell with domain boundaries)
Martin Almquist <martin.almquist@it.uu.se>
parents:
262
diff
changeset
|
73 obj.x = obj.x + x_l; |
396 | 74 |
268
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
75 obj.e_l = sparse(m,1); |
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
76 obj.e_r = sparse(m,1); |
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
77 obj.e_l(1) = 1; |
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
78 obj.e_r(m) = 1; |
396 | 79 |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
80 obj.HI = inv(obj.H); |
268
4b9310edcdf8
Renamned boundary operators!
Martin Almquist <martin.almquist@it.uu.se>
parents:
264
diff
changeset
|
81 obj.Q = obj.H*obj.D1 - obj.e_r*obj.e_r' + obj.e_l*obj.e_l'; |
396 | 82 |
259
a94bb3d92aba
Added empty borrowing property to nonequidstant class.
Martin Almquist <martin.almquist@it.uu.se>
parents:
258
diff
changeset
|
83 obj.borrowing = []; |
402
bc78157c89cb
Add string methods to some sbp classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
397
diff
changeset
|
84 |
bc78157c89cb
Add string methods to some sbp classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
397
diff
changeset
|
85 end |
bc78157c89cb
Add string methods to some sbp classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
397
diff
changeset
|
86 |
bc78157c89cb
Add string methods to some sbp classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
397
diff
changeset
|
87 function str = string(obj) |
bc78157c89cb
Add string methods to some sbp classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
397
diff
changeset
|
88 str = [class(obj) '_' num2str(obj.order)]; |
258
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
89 end |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
90 end |
a8d89688ba01
Merged nonequidistant into one class and cleaned up.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
91 end |