annotate +rv/+time/RungekuttaExteriorRV.m @ 1014:e547794a9407 feature/advectionRV

Add boot-strapping to RungeKuttaExteriorRV - Higher order BDF approximations are successively used as increasing number of time levels are obtained.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 06 Dec 2018 11:30:47 +0100
parents eb441fbdf379
children 9b7fcd5e4480
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 classdef RungekuttaExteriorRV < time.Timestepper
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 properties
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 F % RHS of the ODE
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 k % Time step
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 t % Time point
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 v % Solution vector
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 n % Time level
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 coeffs % The coefficents used for the RK time integration
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 RV % Residual Viscosity
1014
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
10 bdfOrder
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 v_prev % Solution vector at previous time levels, used for the RV update
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 DvDt % Function for computing the time deriative used for the RV update
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 methods
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrder)
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 obj.F = F;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 obj.k = k;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 obj.t = t0;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 obj.v = v0;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 obj.n = 0;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 % Extract the coefficients for the specified rkOrder
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 % used for the RK updates from the Butcher tableua.
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24 [s,a,b,c] = time.rk.butcherTableau(rkOrder);
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 obj.coeffs = struct('s',s,'a',a,'b',b,'c',c);
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 obj.RV = RV;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 % TBD: For cases where h~k we could probably use rkOrder-2 here.
1014
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
29 % TBD: Decide on if the initialization of the previous stages used by
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
30 % the BDF should be done here, or if it should be checked for each
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
31 % step taken.
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
32 assert(bdfOrder >= 2);
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
33 obj.bdfOrder = bdfOrder;
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
34 obj.v_prev = [];
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
35 obj.DvDt = rv.time.BDFDerivative();
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 function [v, t] = getV(obj)
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 v = obj.v;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 t = obj.t;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 function state = getState(obj)
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 [residual, u_t, grad_f] = obj.RV.getResidual();
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 state = struct('v', obj.v, 'residual', residual, 'u_t', u_t, 'grad_f', grad_f, 'viscosity', obj.RV.getViscosity(), 't', obj.t);
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 function obj = step(obj)
1014
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
49 % Store current time level
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
50 if (size(obj.v_prev,2) < obj.bdfOrder)
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
51 obj.v_prev = [obj.v, obj.v_prev];
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
52 else
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
53 obj.v_prev(:,2:end) = obj.v_prev(:,1:end-1);
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
54 obj.v_prev(:,1) = obj.v;
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
55 end
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 % Fix the viscosity of the RHS function F
1014
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
57 F_visc = @(v,t) obj.F(v,t,obj.RV.getViscosity()); %TBD: Remove state in RV?
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
58 obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs);
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 % Calculate dvdt and update RV
1014
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
60 dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k);
e547794a9407 Add boot-strapping to RungeKuttaExteriorRV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1013
diff changeset
61 obj.RV.update(obj.v,dvdt);
1013
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 obj.t = obj.t + obj.k;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 obj.n = obj.n + 1;
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 end
eb441fbdf379 Draft implementation of RungeKutta with exterior RV updates
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 end