annotate +time/Cdiff.m @ 1344:b4e5e45bd239 feature/D2_boundary_opt

Remove round off zeros from D2Nonequidistant operators
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Sat, 15 Oct 2022 15:48:20 +0200
parents 1a30dbe99c7c
children 7a5e770974ed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 classdef Cdiff < time.Timestepper
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 properties
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
3 A, B, C
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
4 AA, BB, CC
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
5 G
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 k
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 t
978
1a30dbe99c7c Refactor CdiffImplicit to take input arguments in the right order
Jonatan Werpers <jonatan@werpers.com>
parents: 977
diff changeset
8 v, v_prev
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 n
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13 methods
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
14 % Solves
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
15 % A*v_tt + B*v_t + C*v = G(t)
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
16 % v(t0) = v0
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
17 % v_t(t0) = v0t
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
18 % starting at time t0 with timestep k
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
19 % Using
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
20 % A*Dp*Dm*v_n + B*D0*v_n + C*v_n = G(t_n)
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
21 function obj = Cdiff(A, B, C, G, v0, v0t, k, t0)
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
22 m = length(v0);
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
23 default_arg('A', speye(m));
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
24 default_arg('B', sparse(m,m));
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
25 default_arg('G', @(t) sparse(m,1));
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
26 default_arg('t0', 0);
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
28 obj.A = A;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
29 obj.B = B;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
30 obj.C = C;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
31 obj.G = G;
227
151ab2b5a686 Added a timedependent version of Cdiff.
Jonatan Werpers <jonatan@werpers.com>
parents: 142
diff changeset
32
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
33 % Rewrite as AA*v_(n+1) + BB*v_n + CC*v_(n-1) = G(t_n)
978
1a30dbe99c7c Refactor CdiffImplicit to take input arguments in the right order
Jonatan Werpers <jonatan@werpers.com>
parents: 977
diff changeset
34 obj.AA = A/k^2 + B/(2*k);
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
35 obj.BB = -2*A/k^2 + C;
978
1a30dbe99c7c Refactor CdiffImplicit to take input arguments in the right order
Jonatan Werpers <jonatan@werpers.com>
parents: 977
diff changeset
36 obj.CC = A/k^2 - B/(2*k);
227
151ab2b5a686 Added a timedependent version of Cdiff.
Jonatan Werpers <jonatan@werpers.com>
parents: 142
diff changeset
37
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 obj.k = k;
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
39 obj.v_prev = v0;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
40 obj.v = v0 + k*v0t;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
41 obj.t = t0+k;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
42 obj.n = 1;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 function [v,t] = getV(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 v = obj.v;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 function [vt,t] = getVt(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u))
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
55 function E = getEnergy(obj)
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
56 v = obj.v;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
57 vp = obj.v_prev;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
58 vt = (obj.v - obj.v_prev)/obj.k;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
59
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
60 E = vt'*obj.A*vt + v'*obj.C*vp;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
61 end
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
62
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63 function obj = step(obj)
977
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
64 v_next = obj.AA\(-obj.BB*obj.v - obj.CC*obj.v_prev + obj.G(obj.t));
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
65
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
66 obj.v_prev = obj.v;
c9009d5a3101 Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents: 227
diff changeset
67 obj.v = v_next;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
68 obj.t = obj.t + obj.k;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69 obj.n = obj.n + 1;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
70 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 end
978
1a30dbe99c7c Refactor CdiffImplicit to take input arguments in the right order
Jonatan Werpers <jonatan@werpers.com>
parents: 977
diff changeset
72 end