Mercurial > repos > public > sbplib
view +time/+rk/General.m @ 993:44e7e497c3b7 feature/timesteppers
Make time.rk.General accept a butcher tableau instead of a string to choose method. String variant implemented as a static method
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 09 Jan 2019 11:14:16 +0100 |
parents | bbd165cc585c |
children | 10c5eda235b7 |
line wrap: on
line source
classdef General < time.Timestepper properties F % RHS of the ODE dt % Time step t % Time point v % Solution vector n % Time level scheme % The scheme used for the time stepping, e.g rk4, rk6 etc. coeffs % Butcher tableau coefficients V % All stage approximations in most recent time step K % All stage rates in most recent time step end methods % Timesteps v_t = F(v,t), using the specified ButcherTableau % from t = t0 with timestep dt and initial conditions v(0) = v0 function obj = General(F, dt, t0, v0, bt, discreteData) assertType(bt, 'time.rk.ButcherTableau') default_arg('discreteData', []); obj.F = F; obj.dt = dt; obj.t = t0; obj.v = v0; obj.n = 0; assert(bt.isExplicit()) obj.coeffs = struct('s',bt.nStages,'a',bt.a(:,1:end-1),'b',bt.b,'c',bt.c); if isempty(discreteData) obj.scheme = @(v,t,n) time.rk.rungekutta(v, t, dt, F, obj.coeffs); else obj.scheme = @(v,t,n) time.rk.rungekuttaDiscreteData(v, t, dt, F, obj.coeffs, discreteData, n); end end % v: Current solution % t: Current time % V: All stage approximations in most recent time step % K: All stage rates in most recent time step % T: Time points (corresponding to V and K) in most recent time step function [v,t,V,T,K] = getV(obj) v = obj.v; t = obj.t; V = obj.V; K = obj.K; T = obj.t + obj.dt*obj.coeffs.b; end function obj = step(obj) [obj.v, obj.V, obj.K] = obj.scheme(obj.v, obj.t, obj.n); obj.t = obj.t + obj.dt; obj.n = obj.n + 1; end % Returns a vector of time points, including substage points, % in the time interval [t0, tEnd]. % The time-step obj.dt is assumed to be aligned with [t0, tEnd] already. function tvec = timePoints(obj, t0, tEnd) N = round( (tEnd-t0)/obj.dt ); tvec = zeros(N*obj.s, 1); s = obj.coeffs.s; c = obj.coeffs.c; for i = 1:N ind = (i-1)*s+1 : i*s; tvec(ind) = ((i-1) + c')*obj.dt; end end % Returns a vector of quadrature weights corresponding to grid points % in time interval [t0, tEnd], substage points included. % The time-step obj.dt is assumed to be aligned with [t0, tEnd] already. function weights = quadWeights(obj, t0, tEnd) N = round( (tEnd-t0)/obj.dt ); b = obj.coeffs.b; weights = repmat(b', N, 1); end end methods(Static) % TBD: Function name function ts = methodFromStr(F, dt, t0, v0, methodStr, discreteData) default_arg('discreteData', []); try bt = time.rk.ButcherTableau.(method); catch error('Runge-Kutta method ''%s'' is not implemented', methodStr) end ts = time.rk.General(F, dt, t0, v0, bt, discreteData); end end end