comparison +rv/+time/RungekuttaExteriorRV.m @ 1029:dce08a74e0ad feature/advectionRV

Create a separate class of RungekuttaExteriorRV which uses BDFs for computing the time derivative. Remove BDFs from RungekuttaExteriorRV
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Fri, 11 Jan 2019 15:47:10 +0100
parents 5359a61cb4d9
children
comparison
equal deleted inserted replaced
1028:5df155ededcd 1029:dce08a74e0ad
22 dvdt 22 dvdt
23 Df 23 Df
24 end 24 end
25 methods 25 methods
26 26
27 % TODO: Decide on how to compute dvdt. 27 function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, DvDt, rkOrder)
28 function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, DvDt, rkOrder, bdfOrders)
29 obj.F = F; 28 obj.F = F;
30 obj.k = k; 29 obj.k = k;
31 obj.t = t0; 30 obj.t = t0;
32 obj.v = v0; 31 obj.v = v0;
33 obj.n = 0; 32 obj.n = 0;
35 % used for the RK updates from the Butcher tableua. 34 % used for the RK updates from the Butcher tableua.
36 [s,a,b,c] = time.rk.butcherTableau(rkOrder); 35 [s,a,b,c] = time.rk.butcherTableau(rkOrder);
37 obj.coeffs = struct('s',s,'a',a,'b',b,'c',c); 36 obj.coeffs = struct('s',s,'a',a,'b',b,'c',c);
38 37
39 obj.RV = RV; 38 obj.RV = RV;
40 % TBD: Decide on if the initialization of the previous stages used by
41 % the BDF should be done here, or if it should be checked for each
42 % step taken.
43 % If it is moved here, then multiple branching stages can be removed in step()
44 % but this will effectively result in a plotted simulation starting from n = upperBdfOrder.
45 % In addition, the properties lowerBdfOrder and upperBdfOrder can be removed.
46 % obj.lowerBdfOrder = bdfOrders.lowerBdfOrder;
47 % obj.upperBdfOrder = bdfOrders.upperBdfOrder;
48 % assert((obj.lowerBdfOrder >= 1) && (obj.upperBdfOrder <= 6));
49 % obj.v_prev = [];
50 % obj.DvDt = rv.time.BdfDerivative();
51 % obj.viscosity = zeros(size(v0));
52 % obj.residual = zeros(size(v0));
53 % obj.dvdt = zeros(size(v0));
54 % obj.Df = zeros(size(v0));
55
56 % Using the ODE:
57 obj.DvDt = DvDt; 39 obj.DvDt = DvDt;
58 obj.dvdt = obj.DvDt(obj.v); 40 obj.dvdt = obj.DvDt(obj.v);
59 [obj.viscosity, obj.Df] = RV.evaluate(obj.v,obj.dvdt); 41 [obj.viscosity, obj.Df] = RV.evaluate(obj.v,obj.dvdt);
60 obj.residual = obj.dvdt + obj.Df; 42 obj.residual = obj.dvdt + obj.Df;
61 end 43 end
67 49
68 function state = getState(obj) 50 function state = getState(obj)
69 state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t); 51 state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t);
70 end 52 end
71 53
72 function obj = step(obj) 54 function obj = step(obj)
73 % % Store current time level and update v_prev
74 % numStoredStages = size(obj.v_prev,2);
75 % if (numStoredStages < obj.upperBdfOrder)
76 % obj.v_prev = [obj.v, obj.v_prev];
77 % numStoredStages = numStoredStages+1;
78 % else
79 % obj.v_prev(:,2:end) = obj.v_prev(:,1:end-1);
80 % obj.v_prev(:,1) = obj.v;
81 % end
82
83 obj.dvdt = obj.DvDt(obj.v); 55 obj.dvdt = obj.DvDt(obj.v);
84 [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt); 56 [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
85 obj.residual = obj.dvdt + obj.Df; 57 obj.residual = obj.dvdt + obj.Df;
86 58
87 % Fix the viscosity of the RHS function F 59 % Fix the viscosity of the RHS function F
88 F_visc = @(v,t) obj.F(v,t,obj.viscosity); 60 F_visc = @(v,t) obj.F(v,t,obj.viscosity);
89 obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs); 61 obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs);
90 obj.t = obj.t + obj.k; 62 obj.t = obj.t + obj.k;
91 obj.n = obj.n + 1; 63 obj.n = obj.n + 1;
92
93 % %Calculate dvdt and evaluate RV for the new time level
94 % if ((numStoredStages >= obj.lowerBdfOrder) && (numStoredStages <= obj.upperBdfOrder))
95 % obj.dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k);
96 % [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
97 % obj.residual = obj.dvdt + obj.Df;
98 % end
99 end 64 end
100 end 65 end
101 end 66 end