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);