Mercurial > repos > public > sbplib
annotate +time/CdiffNonlin.m @ 13:b18d3d201a71
Fixed initialization of step counter in timesteppers.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 22 Sep 2015 08:41:28 +0200 |
parents | 8e14b5a577a6 |
children | cd2e28c5ecd2 |
rev | line source |
---|---|
1
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
1 classdef CdiffNonlin < time.Timestepper |
0 | 2 properties |
3 D | |
4 E | |
5 S | |
6 k | |
7 t | |
8 v | |
9 v_prev | |
10 n | |
11 end | |
12 | |
13 | |
14 methods | |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
15 function obj = CdiffNonlin(D, E, S, k, t0,n0, v, v_prev) |
4
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
16 m = size(D(v),1); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
17 default_arg('E',@(v)sparse(m,m)); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
18 default_arg('S',@(v,t)sparse(m,1)); |
0 | 19 |
1
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
20 |
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
21 % m = size(D,1); |
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
22 % default_arg('E',sparse(m,m)); |
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
23 % default_arg('S',sparse(m,1)); |
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
24 |
0 | 25 obj.D = D; |
26 obj.E = E; | |
27 obj.S = S; | |
28 obj.k = k; | |
1
5ae4f23d9130
Added CdiffNonlin timestepper. Probably fixed a bug with Cdiff. Added default arguments to Rk4SecondOrderNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
29 obj.t = t0; |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
30 obj.n = n0; |
0 | 31 obj.v = v; |
32 obj.v_prev = v_prev; | |
33 end | |
34 | |
35 function [v,t] = getV(obj) | |
36 v = obj.v; | |
37 t = obj.t; | |
38 end | |
39 | |
40 function [vt,t] = getVt(obj) | |
41 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u)) | |
42 t = obj.t; | |
43 end | |
44 | |
45 function obj = step(obj) | |
4
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
46 D = obj.D(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
47 E = obj.E(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
48 S = obj.S(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
49 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
50 m = size(D,1); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
51 I = speye(m); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
52 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
53 %% Calculate for which indices we need to solve system of equations |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
54 [rows,cols] = find(E); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
55 j = union(rows,cols); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
56 i = setdiff(1:m,j); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
57 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
58 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
59 %% Calculate matrices need for the timestep |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
60 % Before optimization: A = 1/k^2 * I - 1/(2*k)*E; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
61 k = obj.k; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
62 Aj = 1/k^2 * I(j,j) - 1/(2*k)*E(j,j); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
63 B = 2/k^2 * I + D; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
64 C = -1/k^2 * I - 1/(2*k)*E; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
65 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
66 %% Take the timestep |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
67 v = obj.v; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
68 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
69 % Before optimization: obj.v = A\(B*v + C*v_prev + S); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
70 obj.v(i) = k^2*(B(i,i)*v(i) -1/k^2*obj.v_prev(i) + S(i)); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
71 obj.v(j) = Aj\(B(j,j)*v(j) + C(j,j)*obj.v_prev(j) + S(j)); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
72 obj.v_prev = v; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
73 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
74 %% Update state of the timestepper |
0 | 75 obj.t = obj.t + obj.k; |
76 obj.n = obj.n + 1; | |
77 end | |
78 end | |
79 end |