Mercurial > repos > public > sbplib
diff +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 |
line wrap: on
line diff
--- a/+rv/+time/RungekuttaExteriorRV.m Wed Dec 05 15:04:44 2018 +0100 +++ b/+rv/+time/RungekuttaExteriorRV.m Thu Dec 06 11:30:47 2018 +0100 @@ -7,6 +7,7 @@ n % Time level coeffs % The coefficents used for the RK time integration RV % Residual Viscosity + bdfOrder v_prev % Solution vector at previous time levels, used for the RV update DvDt % Function for computing the time deriative used for the RV update end @@ -24,10 +25,14 @@ obj.coeffs = struct('s',s,'a',a,'b',b,'c',c); obj.RV = RV; - % TODO: Initialize v_prev. - obj.v_prev = zeros(length(obj.v),bdfOrder); % TBD: For cases where h~k we could probably use rkOrder-2 here. - obj.DvDt = rv.time.BDFDerivative(bdfOrder,k); + % TBD: Decide on if the initialization of the previous stages used by + % the BDF should be done here, or if it should be checked for each + % step taken. + assert(bdfOrder >= 2); + obj.bdfOrder = bdfOrder; + obj.v_prev = []; + obj.DvDt = rv.time.BDFDerivative(); end function [v, t] = getV(obj) @@ -41,15 +46,19 @@ end function obj = step(obj) - % Store current time level - obj.v_prev(:,2:end) = obj.v_prev(:,1:end-1); - obj.v_prev(:,1) = obj.v; + % Store current time level + if (size(obj.v_prev,2) < obj.bdfOrder) + obj.v_prev = [obj.v, obj.v_prev]; + else + obj.v_prev(:,2:end) = obj.v_prev(:,1:end-1); + obj.v_prev(:,1) = obj.v; + end % Fix the viscosity of the RHS function F - F_visc = @(v,t)F(v,t,obj.RV.getViscosity()); %Remove state in RV? - obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.RV, obj.coeffs); + F_visc = @(v,t) obj.F(v,t,obj.RV.getViscosity()); %TBD: Remove state in RV? + obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs); % Calculate dvdt and update RV - dvdt = obj.DvDt.evaluate(v, v_prev, lenght(v_prev)); - RV.update(v,dvdt); + dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k); + obj.RV.update(obj.v,dvdt); obj.t = obj.t + obj.k; obj.n = obj.n + 1; end