Mercurial > repos > public > sbplib
diff +rv/+time/RungekuttaExteriorRV.m @ 1017:2d7c1333bd6c feature/advectionRV
Add support for using the ODE to approximate the time derivative in the residual
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Tue, 11 Dec 2018 16:29:21 +0100 |
parents | 4b42999874c0 |
children | 5359a61cb4d9 |
line wrap: on
line diff
--- a/+rv/+time/RungekuttaExteriorRV.m Fri Dec 07 13:11:53 2018 +0100 +++ b/+rv/+time/RungekuttaExteriorRV.m Tue Dec 11 16:29:21 2018 +0100 @@ -6,17 +6,26 @@ v % Solution vector n % Time level coeffs % The coefficents used for the RK time integration - RV % Residual Viscosity - 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 - 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. + + % Properties related to the residual viscositys + RV % Residual Viscosity operator + viscosity % Viscosity vector + v_prev % Solution vector at previous time levels, used for the RV evaluation + DvDt % Function for computing the time deriative used for the RV evaluation + lowerBdfOrder % Orders of the approximation of the time deriative, used for the RV evaluation. + % dictates which accuracy the boot-strapping should start from. + upperBdfOrder % Orders of the approximation of the time deriative, used for the RV evaluation. + % Dictates the order of accuracy used once the boot-strapping is complete. + + % Convenience properties. Only for plotting + residual + dvdt + Df end methods - function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrders) + % TODO: Decide on how to compute dvdt. + function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, DvDt, rkOrder, bdfOrders) obj.F = F; obj.k = k; obj.t = t0; @@ -34,11 +43,21 @@ % 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.lowerBdfOrder = bdfOrders.lowerBdfOrder; + % obj.upperBdfOrder = bdfOrders.upperBdfOrder; + % assert((obj.lowerBdfOrder >= 1) && (obj.upperBdfOrder <= 6)); + % obj.v_prev = []; + % obj.DvDt = rv.time.BdfDerivative(); + % obj.viscosity = zeros(size(v0)); + % obj.residual = zeros(size(v0)); + % obj.dvdt = zeros(size(v0)); + % obj.Df = zeros(size(v0)); + + % Using the ODE: + obj.DvDt = DvDt; + obj.dvdt = obj.DvDt(obj.v); + [obj.viscosity, obj.Df] = RV.evaluate(obj.v,obj.dvdt); + obj.residual = obj.dvdt + obj.Df; end function [v, t] = getV(obj) @@ -47,30 +66,36 @@ end function state = getState(obj) - [residual, u_t, grad_f] = obj.RV.getResidual(); - state = struct('v', obj.v, 'residual', residual, 'u_t', u_t, 'grad_f', grad_f, 'viscosity', obj.RV.getViscosity(), 't', obj.t); + state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t); end function obj = step(obj) - % Store current time level - 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; - end + % Store current time level and update v_prev + % 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; + % end + + obj.dvdt = obj.DvDt(obj.v); + [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt); + obj.residual = obj.dvdt + obj.Df; + % Fix the viscosity of the RHS function F - F_visc = @(v,t) obj.F(v,t,obj.RV.getViscosity()); %TBD: Remove state in RV? + F_visc = @(v,t) obj.F(v,t,obj.viscosity); obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs); obj.t = obj.t + obj.k; obj.n = obj.n + 1; - % Calculate dvdt and update RV for the new time level - 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 + + % %Calculate dvdt and evaluate RV for the new time level + % if ((numStoredStages >= obj.lowerBdfOrder) && (numStoredStages <= obj.upperBdfOrder)) + % obj.dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k); + % [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt); + % obj.residual = obj.dvdt + obj.Df; + % end end end end \ No newline at end of file