annotate +time/ExplicitRungeKuttaDiscreteData.m @ 1333:0aefcb30cab4 feature/D2_boundary_opt

Add support for RK6
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Sat, 07 May 2022 10:30:59 +0200
parents 7963a9cab637
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
1 classdef ExplicitRungeKuttaDiscreteData < time.Timestepper
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
2 properties
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
3 D
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
4 S % Function handle for time-dependent data
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
5 data % Matrix of data vectors, one column per stage
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
6 k
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
7 t
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
8 v
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
9 m
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
10 n
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
11 order
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
12 a, b, c, s % Butcher tableau
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
13 K % Stage rates
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
14 U % Stage approximations
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
15 T % Stage times
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
16 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
17
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
18
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
19 methods
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
20 function obj = ExplicitRungeKuttaDiscreteData(D, S, data, k, t0, v0, order)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
21 default_arg('order', 4);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
22 default_arg('S', []);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
23 default_arg('data', []);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
24
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
25 obj.D = D;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
26 obj.S = S;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
27 obj.k = k;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
28 obj.t = t0;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
29 obj.v = v0;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
30 obj.m = length(v0);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
31 obj.n = 0;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
32 obj.order = order;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
33 obj.data = data;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
34
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
35 switch order
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
36 case 4
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
37 [obj.a, obj.b, obj.c, obj.s] = time.rkparameters.rk4();
1333
0aefcb30cab4 Add support for RK6
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1120
diff changeset
38 case 6
0aefcb30cab4 Add support for RK6
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1120
diff changeset
39 [obj.a, obj.b, obj.c, obj.s] = time.rkparameters.rk6();
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
40 otherwise
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
41 error('That RK method is not available');
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
42 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
43
1120
7963a9cab637 In RungeKuttaDiscreteData, make K and U non-sparse to improve performance by roughly a factor of 3.
Martin Almquist <malmquist@stanford.edu>
parents: 859
diff changeset
44 obj.K = zeros(obj.m, obj.s);
7963a9cab637 In RungeKuttaDiscreteData, make K and U non-sparse to improve performance by roughly a factor of 3.
Martin Almquist <malmquist@stanford.edu>
parents: 859
diff changeset
45 obj.U = zeros(obj.m, obj.s);
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
46
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
47 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
48
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
49 function [v,t,U,T,K] = getV(obj)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
50 v = obj.v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
51 t = obj.t;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
52 U = obj.U; % Stage approximations in previous time step.
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
53 T = obj.T; % Stage times in previous time step.
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
54 K = obj.K; % Stage rates in previous time step.
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
55 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
56
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
57 function [a,b,c,s] = getTableau(obj)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
58 a = obj.a;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
59 b = obj.b;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
60 c = obj.c;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
61 s = obj.s;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
62 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
63
859
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
64 % Returns quadrature weights for stages in one time step
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
65 function quadWeights = getTimeStepQuadrature(obj)
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
66 [~, b] = obj.getTableau();
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
67 quadWeights = obj.k*b;
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
68 end
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
69
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
70 function obj = step(obj)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
71 v = obj.v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
72 a = obj.a;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
73 b = obj.b;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
74 c = obj.c;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
75 s = obj.s;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
76 S = obj.S;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
77 dt = obj.k;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
78 K = obj.K;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
79 U = obj.U;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
80 D = obj.D;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
81 data = obj.data;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
82
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
83 for i = 1:s
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
84 U(:,i) = v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
85 for j = 1:i-1
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
86 U(:,i) = U(:,i) + dt*a(i,j)*K(:,j);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
87 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
88
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
89 K(:,i) = D*U(:,i);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
90 obj.T(i) = obj.t + c(i)*dt;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
91
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
92 % Data from continuous function and discrete time-points.
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
93 if ~isempty(S)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
94 K(:,i) = K(:,i) + S(obj.T(i));
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
95 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
96 if ~isempty(data)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
97 K(:,i) = K(:,i) + data(:,obj.n*s + i);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
98 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
99
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
100 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
101
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
102 obj.v = v + dt*K*b;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
103 obj.t = obj.t + dt;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
104 obj.n = obj.n + 1;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
105 obj.U = U;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
106 obj.K = K;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
107 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
108 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
109
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
110
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
111 methods (Static)
857
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
112 function k = getTimeStep(lambda, order)
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
113 default_arg('order', 4);
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
114 switch order
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
115 case 4
857
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
116 k = time.rk4.get_rk4_time_step(lambda);
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
117 otherwise
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
118 error('Time-step function not available for this order');
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
119 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
120 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
121 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
122
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
123 end