Mercurial > repos > public > sbplib
comparison +rv/+time/getRvTimestepper.m @ 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 | |
children | 27f3b173dcfa |
comparison
equal
deleted
inserted
replaced
1178:e3d8f24b2c1c | 1179:cc2fd58989d1 |
---|---|
1 function ts = getRvTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | |
2 switch opt.method | |
3 case 'rkRvBdf' | |
4 ts = rkRvBdfTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); | |
5 case 'rkRvMs' | |
6 ts = rkRvMsTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); | |
7 case 'rkRvMg' | |
8 ts = rkRvMgTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); | |
9 case 'rkRvInstage' | |
10 ts = rkRvInstageTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0); | |
11 otherwise | |
12 error('Timestepping method ''%s'' not supported',method); | |
13 end | |
14 end | |
15 | |
16 function F = stabilizedRhs(D, data) | |
17 if isa(data, 'function_handle') | |
18 F = @(v, t, viscosity) D(v, viscosity) + data(v); | |
19 else | |
20 F = @(v, t, viscosity) D(v, viscosity) + data; | |
21 end | |
22 end | |
23 | |
24 function F = unstabilizedRhs(D, data) | |
25 if isa(data, 'function_handle') | |
26 F = @(v, t) D(v) + data(v); | |
27 else | |
28 F = @(v, t) D(v) + data; | |
29 end | |
30 end | |
31 | |
32 function ts = rkRvBdfTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | |
33 F = stabilizedRhs(diffOpStruct.D_scheme, data); | |
34 ts = rv.time.RungekuttaRvBdf(F, opt.k, t0, v0, residualViscosity, opt.rkOrder, opt.bdfOrders); | |
35 end | |
36 | |
37 function ts = rkRvMsTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | |
38 F = stabilizedRhs(diffOpStruct.D_scheme, data); | |
39 F_unstab = unstabilizedRhs(diffOpStruct.D_unstable, data); | |
40 ts = rv.time.RungekuttaRvMultiStage(F, F_unstab, opt.k, t0, v0,... | |
41 residualViscosity, diffOpStruct.D_t, opt.rkOrder); | |
42 end | |
43 | |
44 function ts = rkRvMgTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | |
45 F = stabilizedRhs(diffOpStruct.D_scheme, data); | |
46 F_coarse = unstabilizedRhs(diffOpStruct.D_coarse, data); | |
47 ts = rv.time.RungekuttaRvMultiGrid(F, F_coarse, opt.k, t0, v0,... | |
48 residualViscosity, diffOpStruct.D_t, opt.rkOrder); | |
49 end | |
50 | |
51 function ts = rkRvInstageTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | |
52 F = stabilizedRhs(diffOpStruct.D_scheme, data); | |
53 ts = rv.time.RungekuttaRvInstage(F, opt.k, t0, v0, residualViscosity, diffOpStruct.D_t, opt.rkOrder); | |
54 end | |
55 | |
56 | |
57 |