Mercurial > repos > public > sbplib
comparison +sbp/D1Nonequidistant.m @ 284:dae8c3a56f5e
Merged in operator_remake (pull request #2)
Operator remake
author | Jonatan Werpers <jonatan.werpers@it.uu.se> |
---|---|
date | Mon, 12 Sep 2016 12:53:02 +0200 |
parents | 4b9310edcdf8 |
children | 3fdfad20037e |
comparison
equal
deleted
inserted
replaced
282:18c023aaf3f7 | 284:dae8c3a56f5e |
---|---|
1 classdef D1Nonequidistant < sbp.OpSet | |
2 properties | |
3 D1 % SBP operator approximating first derivative | |
4 H % Norm matrix | |
5 HI % H^-1 | |
6 Q % Skew-symmetric matrix | |
7 e_l % Left boundary operator | |
8 e_r % Right boundary operator | |
9 m % Number of grid points. | |
10 h % Step size | |
11 x % grid | |
12 borrowing % Struct with borrowing limits for different norm matrices | |
13 end | |
14 | |
15 methods | |
16 function obj = D1Nonequidistant(m,lim,order,option) | |
17 | |
18 default_arg('option','Accurate'); | |
19 % 'Accurate' operators are optimized for accuracy | |
20 % 'Minimal' operators have the smallest possible boundary | |
21 % closure | |
22 | |
23 x_l = lim{1}; | |
24 x_r = lim{2}; | |
25 L = x_r-x_l; | |
26 | |
27 switch option | |
28 | |
29 case {'Accurate','accurate','A'} | |
30 | |
31 if order == 4 | |
32 [obj.D1,obj.H,obj.x,obj.h] = ... | |
33 sbp.implementations.d1_noneq_4(m,L); | |
34 elseif order == 6 | |
35 [obj.D1,obj.H,obj.x,obj.h] = ... | |
36 sbp.implementations.d1_noneq_6(m,L); | |
37 elseif order == 8 | |
38 [obj.D1,obj.H,obj.x,obj.h] = ... | |
39 sbp.implementations.d1_noneq_8(m,L); | |
40 elseif order == 10 | |
41 [obj.D1,obj.H,obj.x,obj.h] = ... | |
42 sbp.implementations.d1_noneq_10(m,L); | |
43 elseif order == 12 | |
44 [obj.D1,obj.H,obj.x,obj.h] = ... | |
45 sbp.implementations.d1_noneq_12(m,L); | |
46 else | |
47 error('Invalid operator order %d.',order); | |
48 end | |
49 | |
50 case {'Minimal','minimal','M'} | |
51 | |
52 if order == 4 | |
53 [obj.D1,obj.H,obj.x,obj.h] = ... | |
54 sbp.implementations.d1_noneq_minimal_4(m,L); | |
55 elseif order == 6 | |
56 [obj.D1,obj.H,obj.x,obj.h] = ... | |
57 sbp.implementations.d1_noneq_minimal_6(m,L); | |
58 elseif order == 8 | |
59 [obj.D1,obj.H,obj.x,obj.h] = ... | |
60 sbp.implementations.d1_noneq_minimal_8(m,L); | |
61 elseif order == 10 | |
62 [obj.D1,obj.H,obj.x,obj.h] = ... | |
63 sbp.implementations.d1_noneq_minimal_10(m,L); | |
64 elseif order == 12 | |
65 [obj.D1,obj.H,obj.x,obj.h] = ... | |
66 sbp.implementations.d1_noneq_minimal_12(m,L); | |
67 else | |
68 error('Invalid operator order %d.',order); | |
69 end | |
70 | |
71 end | |
72 | |
73 obj.x = obj.x + x_l; | |
74 | |
75 obj.e_l = sparse(m,1); | |
76 obj.e_r = sparse(m,1); | |
77 obj.e_l(1) = 1; | |
78 obj.e_r(m) = 1; | |
79 | |
80 obj.HI = inv(obj.H); | |
81 obj.Q = obj.H*obj.D1 - obj.e_r*obj.e_r' + obj.e_l*obj.e_l'; | |
82 | |
83 obj.borrowing = []; | |
84 | |
85 end | |
86 end | |
87 | |
88 | |
89 end | |
90 | |
91 | |
92 | |
93 | |
94 |