annotate +anim/animate.m @ 1037:2d7ba44340d0 feature/burgers1d

Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Fri, 18 Jan 2019 09:02:02 +0100
parents 2fe13db674da
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 % Calls F(t) repeatedly
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 % Should there be a Fsetup and a F, two function, to allow creating a plot and then updating it?
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 % F takes the time to generate the frame for and returns the actual time for the generated frame.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 % t = F(t_r) is a function that paints a frame for time t. t is the closest time <=t_r
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 % it will be called for increasnig t.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 %Todo: make it catch up and produce warnings if it lags behind? Instead of just requesting the next target time
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
8
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
9
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
10 % If adapt is true time_modifier is treated as an upper bound
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
11 function animate(F, tstart, tend, time_modifier, target_frame_rate)
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
12 default_arg('time_modifier', 1);
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
13 default_arg('target_frame_rate',30);
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
14
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
15 % t is simulation time
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
16 % tau is real time
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
17
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
18 time_modifier_bound = time_modifier;
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
19 dTau_target = 1/target_frame_rate; % Real time between frames
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
20
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
21 rs = util.ReplaceableString();
144
2fe13db674da animate: Show the simulation time.
Jonatan Werpers <jonatan@werpers.com>
parents: 133
diff changeset
22 rs.appendFormat(' t: %d\n');
133
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
23 rs.appendFormat(' tau: %d\n');
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
24 rs.appendFormat(' target tau: %d\n');
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
25 rs.appendFormat(' Target fps: %.2f\n');
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
26 rs.appendFormat(' Actual fps: %.2f\n');
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
27 rs.appendFormat('Target time_modifier: %d\n');
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
28 rs.appendFormat('actual time_modifier: %d\n');
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
30 animation_start = tic();
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
31 prevTau = 0;
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
32 targetTau = 0;
133
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
33 tauFrameStart = -dTau_target;
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
34 t = F(tstart);
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
35
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
36 while t < tend
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
37 % Sleep until the frame should start
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
38 pause(targetTau-toc(animation_start));
133
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
39 tau = toc(animation_start);
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
40 dTau = tau - tauFrameStart;
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
41
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
42 % Calculate error in tau
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
43 e_Tau = tau - targetTau;
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
44
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
45 % Regulate time_modifier based on e_Tau
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
46 % time_modifier = min(time_modifier_bound, max(0.5, abs(1-e_Tau/dTau)) * time_modifier);
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
47
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
48 % Mark the start of the frame
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
49 tauFrameStart = tau;
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
50
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
51 dt_target = dTau_target*time_modifier; % Targeted simulation time between frames
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
52
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
53 t_prev = t;
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
54 t = F(t + dt_target); % Run simulation
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
55
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
56 % Calculate when this frame should end and the next start. (this depends on what simulation time we ended up on)
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
57 dt = t-t_prev;
133
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
58 % targetTau = targetTau + dt/time_modifier;
43f8df3595cf Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents: 132
diff changeset
59 targetTau = targetTau + dTau_target;
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
60
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
61 % Update information about this frame
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
62 tau = toc(animation_start);
144
2fe13db674da animate: Show the simulation time.
Jonatan Werpers <jonatan@werpers.com>
parents: 133
diff changeset
63 rs.updateParam(t, tau, targetTau, 1/dTau_target, 1/dTau, time_modifier_bound, time_modifier);
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66
132
6ec2248b83c4 Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents: 79
diff changeset
67 % Final time reporting
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
68 time_to_animate = toc(animation_start);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69 expected_time = tend/time_modifier;
71
1edee9e1ea41 Updated printing stuff for animation functions.
Jonatan Werpers <jonatan@werpers.com>
parents: 0
diff changeset
70 fprintf('\n');
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 fprintf('Time to animate: %.3f\n', time_to_animate)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72 fprintf('Expected time : %.3f\n', expected_time)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 end