Mercurial > repos > public > sbplib
annotate +time/SBPInTime.m @ 401:9ff24a14f9ef feature/beams
Merge clarity changes for SBPInTime.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 02 Feb 2017 10:07:49 +0100 |
parents | 14f2be4fe9c1 fccd746d8573 |
children | 38173ea263ed |
rev | line source |
---|---|
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
1 classdef SBPInTime < time.Timestepper |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
2 % The SBP in time method. |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
3 % Implemented for v_t = A*v + f(t) |
398 | 4 % |
5 % Each "step" takes one block step and thus advances | |
6 % k = k_local*(blockSize-1) in time. | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
7 properties |
398 | 8 M % System matrix |
9 L,U,P,Q % LU factorization of M | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
10 A |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
11 Et_r |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
12 penalty |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
13 f |
398 | 14 k_local % step size within a block |
15 k % Time size of a block k/(blockSize-1) = k_local | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
16 t |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
17 v |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
18 m |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
19 n |
398 | 20 blockSize % number of points in each block |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
21 order |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
22 nodes |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
23 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
24 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
25 methods |
398 | 26 function obj = SBPInTime(A, f, k, t0, v0, TYPE, order, blockSize) |
27 default_arg('TYPE','minimal'); | |
28 default_arg('order', 8); | |
29 default_arg('blockSize',time.SBPInTime.smallestBlockSize(order,TYPE)); | |
30 | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
31 obj.A = A; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
32 obj.f = f; |
398 | 33 obj.k_local = k/(blockSize-1); |
34 obj.k = k; | |
35 obj.blockSize = blockSize; | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
36 obj.t = t0; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
37 obj.m = length(v0); |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
38 obj.n = 0; |
398 | 39 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
40 %==== Build the time discretization matrix =====% |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
41 switch TYPE |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
42 case 'equidistant' |
398 | 43 ops = sbp.D2Standard(blockSize,{0,obj.k},order); |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
44 case 'optimal' |
398 | 45 ops = sbp.D1Nonequidistant(blockSize,{0,obj.k},order); |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
46 case 'minimal' |
398 | 47 ops = sbp.D1Nonequidistant(blockSize,{0,obj.k},order,'minimal'); |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
48 end |
398 | 49 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
50 D1 = ops.D1; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
51 HI = ops.HI; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
52 e_l = ops.e_l; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
53 e_r = ops.e_r; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
54 obj.nodes = ops.x; |
398 | 55 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
56 Ix = speye(size(A)); |
398 | 57 It = speye(blockSize,blockSize); |
58 | |
59 obj.Et_r = kron(e_r,Ix); | |
60 | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
61 % Time derivative + penalty |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
62 tau = 1; |
398 | 63 Mt = D1 + tau*HI*(e_l*e_l'); |
64 | |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
65 % penalty to impose "data" |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
66 penalty = tau*HI*e_l; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
67 obj.penalty = kron(penalty,Ix); |
398 | 68 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
69 Mx = kron(It,A); |
398 | 70 Mt = kron(Mt,Ix); |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
71 obj.M = Mt - Mx; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
72 %==============================================% |
398 | 73 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
74 % LU factorization |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
75 [obj.L,obj.U,obj.P,obj.Q] = lu(obj.M); |
398 | 76 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
77 % Pretend that the initial condition is the last level |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
78 % of a previous step. |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
79 obj.v = obj.Et_r * v0; |
398 | 80 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
81 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
82 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
83 function [v,t] = getV(obj) |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
84 v = obj.Et_r' * obj.v; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
85 t = obj.t; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
86 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
87 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
88 function obj = step(obj) |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
89 obj.v = time.sbp.sbpintime(obj.v, obj.t, obj.nodes,... |
398 | 90 obj.penalty, obj.f, obj.blockSize,... |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
91 obj.Et_r,... |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
92 obj.L, obj.U, obj.P, obj.Q); |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
93 obj.t = obj.t + obj.k; |
398 | 94 obj.n = obj.n + 1; |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
95 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
96 end |
398 | 97 |
400
14f2be4fe9c1
Add function to center colorlimits.
Jonatan Werpers <jonatan@werpers.com>
parents:
365
diff
changeset
|
98 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
99 methods(Static) |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
100 function N = smallestBlockSize(order,TYPE) |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
101 default_arg('TYPE','equidistant') |
398 | 102 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
103 switch TYPE |
398 | 104 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
105 case 'equidistant' |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
106 switch order |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
107 case 2 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
108 N = 2; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
109 case 4 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
110 N = 8; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
111 case 6 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
112 N = 12; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
113 case 8 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
114 N = 16; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
115 case 10 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
116 N = 20; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
117 case 12 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
118 N = 24; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
119 otherwise |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
120 error('Operator does not exist'); |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
121 end |
398 | 122 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
123 case 'optimal' |
398 | 124 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
125 switch order |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
126 case 4 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
127 N = 8; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
128 case 6 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
129 N = 12; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
130 case 8 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
131 N = 16; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
132 case 10 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
133 N = 20; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
134 case 12 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
135 N = 24; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
136 otherwise |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
137 error('Operator does not exist'); |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
138 end |
398 | 139 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
140 case 'minimal' |
398 | 141 |
365
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
142 switch order |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
143 case 4 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
144 N = 6; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
145 case 6 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
146 N = 10; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
147 case 8 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
148 N = 12; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
149 case 10 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
150 N = 16; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
151 case 12 |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
152 N = 20; |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
153 otherwise |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
154 error('Operator does not exist'); |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
155 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
156 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
157 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
158 end |
f908ce064f35
Added SBP in time timestepper.
Martin Almquist <martin.almquist@it.uu.se>
parents:
diff
changeset
|
159 end |