Mercurial > repos > public > sbplib
diff +rv/+time/RungeKuttaRvInstage.m @ 1181:9ac86ccfd6a1 feature/rv
Move instage rungekutta time stepping to RungekuttaRvInstage
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 05 Jul 2019 16:51:05 +0200 |
parents | d02e5b8a0b24 |
children |
line wrap: on
line diff
--- a/+rv/+time/RungeKuttaRvInstage.m Fri Jul 05 16:49:19 2019 +0200 +++ b/+rv/+time/RungeKuttaRvInstage.m Fri Jul 05 16:51:05 2019 +0200 @@ -44,4 +44,36 @@ obj.n = obj.n + 1; end end + + % Takes one time step of size dt using the rungekutta method + % starting from v and where the function F(v,t,RV) gives the + % time derivatives. coeffs is a struct holding the RK coefficients + % for the specific method. RV is the residual viscosity which is updated + % in between the stages and after the updated solution is computed. + methods (Static) + function v = rungekuttaRV(v, t , dt, F, RV, DvDt, coeffs) + % Move one stage outside to avoid branching for updating the + % residual inside the loop. + k = zeros(length(v), coeffs.s); + k(:,1) = F(v,t,RV.evaluateViscosity(v,DvDt(v))); + + % Compute the intermediate stages k + for i = 2:coeffs.s + u = v; + for j = 1:i-1 + u = u + dt*coeffs.a(i,j)*k(:,j); + end + k(:,i) = F(u,t+coeffs.c(i)*dt, RV.evaluateViscosity(u,DvDt(u))); + end + + % Compute the updated solution as a linear combination + % of the intermediate stages. + u = v; + for i = 1:coeffs.s + u = u + dt*coeffs.b(i)*k(:,i); + end + v = u; + end + + end \ No newline at end of file