annotate +time/ExplicitRungeKuttaDiscreteData.m @ 958:72cd29107a9a feature/poroelastic

Temporary changes in multiblock.DiffOp. Change traction operators in Elastic2dvariable to be true boundary operators. But adjoint FD conv test fails for dirichlet BC so need to debug!
author Martin Almquist <malmquist@stanford.edu>
date Wed, 05 Dec 2018 18:58:10 -0800
parents 4c7532db42cd
children c70131daaa6e 7963a9cab637
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();
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
38 otherwise
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
39 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
40 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
41
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
42 obj.K = sparse(obj.m, obj.s);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
43 obj.U = sparse(obj.m, obj.s);
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
44
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
45 end
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 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
48 v = obj.v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
49 t = obj.t;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
50 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
51 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
52 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
53 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
54
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
55 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
56 a = obj.a;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
57 b = obj.b;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
58 c = obj.c;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
59 s = obj.s;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
60 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
61
859
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
62 % Returns quadrature weights for stages in one time step
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
63 function quadWeights = getTimeStepQuadrature(obj)
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
64 [~, b] = obj.getTableau();
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
65 quadWeights = obj.k*b;
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
66 end
4c7532db42cd Add method getTimeStepQuadrature to RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 857
diff changeset
67
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
68 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
69 v = obj.v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
70 a = obj.a;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
71 b = obj.b;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
72 c = obj.c;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
73 s = obj.s;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
74 S = obj.S;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
75 dt = obj.k;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
76 K = obj.K;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
77 U = obj.U;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
78 D = obj.D;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
79 data = obj.data;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
80
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
81 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
82 U(:,i) = v;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
83 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
84 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
85 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
86
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
87 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
88 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
89
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
90 % 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
91 if ~isempty(S)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
92 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
93 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
94 if ~isempty(data)
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
95 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
96 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
97
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 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
101 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
102 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
103 obj.U = U;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
104 obj.K = K;
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
105 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
106 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
107
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
108
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
109 methods (Static)
857
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
110 function k = getTimeStep(lambda, order)
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
111 default_arg('order', 4);
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
112 switch order
856
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
113 case 4
857
3c916a00033f Bugfix in static getTimeStep method in RungeKuttaDiscreteData
Martin Almquist <malmquist@stanford.edu>
parents: 856
diff changeset
114 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
115 otherwise
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
116 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
117 end
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
118 end
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
ee4cfb37534d Merge with feature/d1_staggered to get RK timestepper for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
121 end