Mercurial > repos > public > sbplib
comparison +rv/+time/getRvTimestepper.m @ 1187:5aa3049a4212 feature/rv
Allow for time dependent data when construcing the ODE RHS
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Mon, 08 Jul 2019 14:48:56 +0200 |
parents | 27f3b173dcfa |
children | b3c47a716d57 |
comparison
equal
deleted
inserted
replaced
1186:3364a51f0d9e | 1187:5aa3049a4212 |
---|---|
13 otherwise | 13 otherwise |
14 error('Timestepping method ''%s'' not supported',method); | 14 error('Timestepping method ''%s'' not supported',method); |
15 end | 15 end |
16 end | 16 end |
17 | 17 |
18 function F = stabilizedRhs(D, data) | 18 function fhData = dataFunctionHandle(data) |
19 if isa(data, 'function_handle') | 19 if isa(data, 'function_handle') |
20 F = @(v, t, viscosity) D(v, viscosity) + data(v); | 20 switch nargin(data) |
21 case 1 | |
22 fhData = @(v, t) data(v); | |
23 case 2 | |
24 fhData = @(v, t) data(v,t); | |
25 otherwise | |
26 error('Incorrect number of input arguments'); | |
27 end | |
21 else | 28 else |
22 F = @(v, t, viscosity) D(v, viscosity) + data; | 29 fhData = @(v, t) data; |
23 end | 30 end |
24 end | 31 end |
25 | 32 |
33 function F = stabilizedRhs(D, data) | |
34 fhData = dataFunctionHandle(data); | |
35 F = @(v, t, viscosity) D(v, viscosity) + fhData(v,t); | |
36 end | |
37 | |
26 function F = unstabilizedRhs(D, data) | 38 function F = unstabilizedRhs(D, data) |
27 if isa(data, 'function_handle') | 39 fhData = dataFunctionHandle(data); |
28 F = @(v, t) D(v) + data(v); | 40 F = @(v, t) D(v) + fhData(v,t); |
29 else | |
30 F = @(v, t) D(v) + data; | |
31 end | |
32 end | 41 end |
33 | 42 |
34 function ts = rkRvTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) | 43 function ts = rkRvTimestepper(opt, diffOpStruct, residualViscosity, data, t0, v0) |
35 F = stabilizedRhs(diffOpStruct.D_scheme, data); | 44 F = stabilizedRhs(diffOpStruct.D_scheme, data); |
36 ts = rv.time.RungekuttaRv(F, opt.k, t0, v0, residualViscosity, diffOpStruct.D_t, opt.rkOrder); | 45 ts = rv.time.RungekuttaRv(F, opt.k, t0, v0, residualViscosity, diffOpStruct.D_t, opt.rkOrder); |