comparison +time/SBPInTimeSecondOrderFormImplicit.m @ 886:8894e9c49e40 feature/timesteppers

Merge with default for latest changes
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 15 Nov 2018 16:36:21 -0800
parents +time/SBPInTimeSecondOrderForm.m@b5e5b195da1e +time/SBPInTimeSecondOrderForm.m@66eb4a2bbb72
children f5e14e5986b5
comparison
equal deleted inserted replaced
816:b5e5b195da1e 886:8894e9c49e40
1 classdef SBPInTimeSecondOrderFormImplicit < time.Timestepper
2 properties
3 A, B, C, f
4 AA, BB, ff
5
6 n
7 t
8 k
9
10 firstOrderTimeStepper
11 end
12
13 methods
14 % Solves A*u_tt + B*u_t + C*u = f(t)
15 % A, B can either both be constants or both be function handles,
16 % They can also be omitted by setting them equal to the empty matrix.
17 function obj = SBPInTimeSecondOrderFormImplicit(A, B, C, f, k, t0, v0, v0t, do_scaling, TYPE, order, blockSize)
18 default_arg('f', []);
19 default_arg('TYPE', []);
20 default_arg('order', []);
21 default_arg('blockSize',[]);
22 default_arg('do_scaling', false);
23
24 m = length(v0);
25
26 default_arg('A', speye(m, m));
27 default_arg('B', sparse(m, m));
28 default_arg('C', sparse(m, m));
29
30 I = speye(m);
31 O = sparse(m,m);
32
33 % Rewrite to
34 % AA*w_t = BB*w + ff(t);
35
36 obj.AA = [
37 I, O;
38 O, A;
39 ];
40 obj.BB = [
41 O, I;
42 -C, -B;
43 ];
44
45 if ~isempty(f)
46 obj.ff = @(t)[
47 sparse(m,1);
48 f(t);
49 ];
50 else
51 obj.ff = @(t) sparse(2*m,1);
52 end
53
54 w0 = [v0; v0t];
55
56 obj.k = k;
57 obj.t = t0;
58 obj.n = 0;
59
60 if do_scaling
61 scaling = [ones(m,1); sqrt(diag(C))];
62 obj.firstOrderTimeStepper = time.SBPInTimeScaled(obj.AA, obj.BB, obj.ff, obj.k, obj.t, w0, scaling, TYPE, order, blockSize);
63 else
64 obj.firstOrderTimeStepper = time.SBPInTimeImplicitFormulation(obj.AA, obj.BB, obj.ff, obj.k, obj.t, w0, TYPE, order, blockSize);
65 end
66 end
67
68 function [v,t] = getV(obj)
69 w = obj.firstOrderTimeStepper.getV();
70 v = w(1:end/2);
71 t = obj.t;
72 end
73
74 function [vt,t] = getVt(obj)
75 w = obj.firstOrderTimeStepper.getV();
76 vt = w(end/2+1:end);
77 t = obj.t;
78 end
79
80 function state = getState(obj)
81 [v, t] = obj.getV();
82 [vt] = obj.getVt();
83 state = struct('v', v, 'vt', vt, 't', t, 'k', obj.k);
84 end
85
86 function obj = step(obj)
87 obj.firstOrderTimeStepper.step();
88 obj.t = obj.firstOrderTimeStepper.t;
89 obj.n = obj.firstOrderTimeStepper.n;
90 end
91 end
92 end