Mercurial > repos > public > sbplib
diff +rv/+time/RungekuttaExteriorRV.m @ 1016:4b42999874c0 feature/advectionRV
Add lower level for boot-strapping to RungeKuttaExteriorRV
- Add a lower level to RungeKuttaExteriorRV for which bootstrapping starts, e.g start bootstrapping from time level 3 using a 3rd order BDF
- Clean up ResidualViscosity
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 07 Dec 2018 13:11:53 +0100 |
parents | 9b7fcd5e4480 |
children | 2d7c1333bd6c |
line wrap: on
line diff
--- a/+rv/+time/RungekuttaExteriorRV.m Thu Dec 06 17:03:22 2018 +0100 +++ b/+rv/+time/RungekuttaExteriorRV.m Fri Dec 07 13:11:53 2018 +0100 @@ -7,16 +7,16 @@ 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 - - - dudt + lowerBdfOrder % Orders of the approximation of the time deriative, used for the RV update. + % dictates which accuracy the boot-strapping should start from. + upperBdfOrder % Orders of the approximation of the time deriative, used for the RV update. + % Dictates the order of accuracy used once the boot-strapping is complete. end methods - function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrder, dudt) + function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrders) obj.F = F; obj.k = k; obj.t = t0; @@ -28,16 +28,17 @@ obj.coeffs = struct('s',s,'a',a,'b',b,'c',c); obj.RV = RV; - % TBD: For cases where h~k we could probably use rkOrder-2 here. % 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 >= 1) && (bdfOrder <= 6)); - obj.bdfOrder = bdfOrder; + % If it is moved here, then multiple branching stages can be removed in step() + % but this will effectively result in a plotted simulation starting from n = upperBdfOrder. + % In addition, the properties lowerBdfOrder and upperBdfOrder can be removed. + obj.lowerBdfOrder = bdfOrders.lowerBdfOrder; + obj.upperBdfOrder = bdfOrders.upperBdfOrder; + assert((obj.lowerBdfOrder >= 1) && (obj.upperBdfOrder <= 6)); obj.v_prev = []; - obj.DvDt = rv.time.BDFDerivative(); - - obj.dudt = dudt; + obj.DvDt = rv.time.BdfDerivative(); end function [v, t] = getV(obj) @@ -52,8 +53,10 @@ function obj = step(obj) % Store current time level - if (size(obj.v_prev,2) < obj.bdfOrder) + numStoredStages = size(obj.v_prev,2); + if (numStoredStages < obj.upperBdfOrder) obj.v_prev = [obj.v, obj.v_prev]; + numStoredStages = numStoredStages+1; else obj.v_prev(:,2:end) = obj.v_prev(:,1:end-1); obj.v_prev(:,1) = obj.v; @@ -64,11 +67,10 @@ obj.t = obj.t + obj.k; obj.n = obj.n + 1; % Calculate dvdt and update RV for the new time level - dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k); - if ((size(obj.v_prev,2) >= 4) && (size(obj.v_prev,2) <= obj.bdfOrder)) + if ((numStoredStages >= obj.lowerBdfOrder) && (numStoredStages <= obj.upperBdfOrder)) + dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k); obj.RV.update(obj.v,dvdt); end - %obj.RV.update(obj.v,obj.dudt(obj.t)); end end end \ No newline at end of file