Mercurial > repos > public > sbplib
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 |
rev | line source |
---|---|
0 | 1 % Calls F(t) repeatedly |
2 % Should there be a Fsetup and a F, two function, to allow creating a plot and then updating it? | |
3 % F takes the time to generate the frame for and returns the actual time for the generated frame. | |
4 % t = F(t_r) is a function that paints a frame for time t. t is the closest time <=t_r | |
5 % it will be called for increasnig t. | |
6 | |
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 | 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 | 64 end |
65 | |
66 | |
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
67 % Final time reporting |
0 | 68 time_to_animate = toc(animation_start); |
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 | 71 fprintf('Time to animate: %.3f\n', time_to_animate) |
72 fprintf('Expected time : %.3f\n', expected_time) | |
73 end |