Mercurial > repos > public > sbplib
changeset 1179:cc2fd58989d1 feature/rv
Add getTimestepper for the RV time steppers
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 28 Jun 2019 17:24:01 +0200 |
parents | e3d8f24b2c1c |
children | beecb580c5bf |
files | +rv/+time/getRvTimestepper.m |
diffstat | 1 files changed, 57 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/+rv/+time/getRvTimestepper.m Fri Jun 28 17:24:01 2019 +0200 @@ -0,0 +1,57 @@ +function ts = getRvTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) + switch opt.method + case 'rkRvBdf' + ts = rkRvBdfTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); + case 'rkRvMs' + ts = rkRvMsTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); + case 'rkRvMg' + ts = rkRvMgTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); + case 'rkRvInstage' + ts = rkRvInstageTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); + otherwise + error('Timestepping method ''%s'' not supported',method); + end +end + +function F = stabilizedRhs(D, data) + if isa(data, 'function_handle') + F = @(v, t, viscosity) D(v, viscosity) + data(v); + else + F = @(v, t, viscosity) D(v, viscosity) + data; + end +end + +function F = unstabilizedRhs(D, data) + if isa(data, 'function_handle') + F = @(v, t) D(v) + data(v); + else + F = @(v, t) D(v) + data; + end +end + +function ts = rkRvBdfTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) + F = stabilizedRhs(diffOpStruct.D_scheme, data); + ts = rv.time.RungekuttaRvBdf(F, opt.k, t0, v0, residualViscosity, opt.rkOrder, opt.bdfOrders); +end + +function ts = rkRvMsTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) + F = stabilizedRhs(diffOpStruct.D_scheme, data); + F_unstab = unstabilizedRhs(diffOpStruct.D_unstable, data); + ts = rv.time.RungekuttaRvMultiStage(F, F_unstab, opt.k, t0, v0,... + residualViscosity, diffOpStruct.D_t, opt.rkOrder); +end + +function ts = rkRvMgTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) + F = stabilizedRhs(diffOpStruct.D_scheme, data); + F_coarse = unstabilizedRhs(diffOpStruct.D_coarse, data); + ts = rv.time.RungekuttaRvMultiGrid(F, F_coarse, opt.k, t0, v0,... + residualViscosity, diffOpStruct.D_t, opt.rkOrder); +end + +function ts = rkRvInstageTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) + F = stabilizedRhs(diffOpStruct.D_scheme, data); + ts = rv.time.RungekuttaRvInstage(F, opt.k, t0, v0, residualViscosity, diffOpStruct.D_t, opt.rkOrder); +end + + +