Mercurial > repos > public > sbplib
annotate +time/CdiffNonlin.m @ 4:8e14b5a577a6
Attempt att optimization of CdiffNonlin.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 18 Sep 2015 15:12:44 +0200 |
parents | 5ae4f23d9130 |
children | b18d3d201a71 |
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 | |
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
|
15 function obj = CdiffNonlin(D, E, S, k, t0, 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; |
0 | 30 obj.v = v; |
31 obj.v_prev = v_prev; | |
32 end | |
33 | |
34 function [v,t] = getV(obj) | |
35 v = obj.v; | |
36 t = obj.t; | |
37 end | |
38 | |
39 function [vt,t] = getVt(obj) | |
40 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u)) | |
41 t = obj.t; | |
42 end | |
43 | |
44 function obj = step(obj) | |
4
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
45 D = obj.D(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
46 E = obj.E(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
47 S = obj.S(obj.v); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
48 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
49 m = size(D,1); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
50 I = speye(m); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
51 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
52 %% 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
|
53 [rows,cols] = find(E); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
54 j = union(rows,cols); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
55 i = setdiff(1:m,j); |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
56 |
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 %% Calculate matrices need for the timestep |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
59 % 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
|
60 k = obj.k; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
61 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
|
62 B = 2/k^2 * I + D; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
63 C = -1/k^2 * I - 1/(2*k)*E; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
64 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
65 %% Take the timestep |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
66 v = obj.v; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
67 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
68 % 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
|
69 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
|
70 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
|
71 obj.v_prev = v; |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
72 |
8e14b5a577a6
Attempt att optimization of CdiffNonlin.
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
73 %% Update state of the timestepper |
0 | 74 obj.t = obj.t + obj.k; |
75 obj.n = obj.n + 1; | |
76 end | |
77 end | |
78 end |