Mercurial > repos > public > sbplib
annotate +time/Timestepper.m @ 1198:2924b3a9b921 feature/d2_compatible
Add OpSet for fully compatible D2Variable, created from regular D2Variable by replacing d1 by first row of D1. Formal reduction by one order of accuracy at the boundary point.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Fri, 16 Aug 2019 14:30:28 -0700 |
parents | 64a9a8a27858 |
children | 8894e9c49e40 |
rev | line source |
---|---|
0 | 1 classdef Timestepper < handle |
2 properties (Abstract) | |
3 t | |
4 k | |
5 n | |
6 end | |
7 | |
8 methods (Abstract) | |
9 [v,t] = getV(obj) | |
10 obj = step(obj) | |
11 end | |
12 | |
13 | |
14 methods | |
15 function [v,t] = stepN(obj,n,progress_bar) | |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
3
diff
changeset
|
16 default_arg('progress_bar',false); |
0 | 17 |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
18 if ~progress_bar |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
19 obj.stepN_without_progress(n); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
20 else |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
21 obj.stepN_with_progress(n); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
22 end |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
23 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
24 v = obj.getV; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
25 t = obj.t; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
26 end |
0 | 27 |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
28 function stepN_without_progress(obj, n) |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
29 for i=1:n |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
30 obj.step(); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
31 end |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
32 end |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
33 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
34 function stepN_with_progress(obj, n) |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
35 FRAME_RATE = 20; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
36 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
37 steps_to_update = 1; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
38 steps_since_update = 0; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
39 last_update = tic(); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
40 s = util.replace_string('',' %d %%',0); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
41 for i=1:n |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
42 obj.step(); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
43 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
44 steps_since_update = steps_since_update + 1; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
45 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
46 if steps_since_update >= steps_to_update |
0 | 47 s = util.replace_string(s,' %.2f %%',i/n*100); |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
48 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
49 time_since_update = toc(last_update); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
50 time_error = time_since_update - 1/FRAME_RATE; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
51 time_per_step = time_since_update/steps_since_update; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
52 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
53 steps_to_update = max(steps_to_update - 0.9*time_error/time_per_step ,1); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
54 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
55 steps_since_update = 0; |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
56 last_update = tic(); |
0 | 57 end |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
58 end |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
59 |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
60 s = util.replace_string(s,''); |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
61 end |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
62 |
385
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
63 |
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
64 function [v, t] = stepTo(obj, n, progress_bar) |
614
64a9a8a27858
Add assertion in time.Timestepper for robustness
Jonatan Werpers <jonatan@werpers.com>
parents:
385
diff
changeset
|
65 assertScalar(n); |
385
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
66 default_arg('progress_bar',false); |
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
67 |
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
68 [v, t] = obj.stepN(n-obj.n, progress_bar); |
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
69 end |
b361a04894e3
Fix bug in implicit cdiff. Add stepTo method for timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
126
diff
changeset
|
70 |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
71 function [v,t] = evolve(obj, tend, progress_bar) |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
72 default_arg('progress_bar',false) |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
73 if ~progress_bar |
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
74 obj.evolve_without_progress(tend); |
0 | 75 else |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
76 obj.evolve_with_progress(tend); |
0 | 77 end |
78 v = obj.getV; | |
79 t = obj.t; | |
80 end | |
81 | |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
82 function evolve_without_progress(obj, tend) |
126
54055b32d516
Changed evolve so that it always stops as close to tend as possible.
Jonatan Werpers <jonatan@werpers.com>
parents:
16
diff
changeset
|
83 while obj.t < tend - obj.k/2 |
16
f7975c054bc3
Improved progress indication for stepN
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
84 obj.step(); |
0 | 85 end |
86 end | |
87 | |
88 function evolve_with_progress(obj, tend) | |
3
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
89 FRAME_RATE = 20; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
90 |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
91 steps_to_update = 1; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
92 steps_since_update = 0; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
93 last_update = tic(); |
0 | 94 s = util.replace_string('',' %d %%',0); |
126
54055b32d516
Changed evolve so that it always stops as close to tend as possible.
Jonatan Werpers <jonatan@werpers.com>
parents:
16
diff
changeset
|
95 while obj.t < tend - obj.k/2 |
0 | 96 obj.step(); |
97 | |
3
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
98 steps_since_update = steps_since_update + 1; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
99 |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
100 if steps_since_update >= steps_to_update |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
101 s = util.replace_string(s,' %.2f %%',obj.t/tend*100); |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
102 |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
103 time_since_update = toc(last_update); |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
104 time_error = time_since_update - 1/FRAME_RATE; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
105 time_per_step = time_since_update/steps_since_update; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
106 |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
107 steps_to_update = max(steps_to_update - 0.9*time_error/time_per_step ,1); |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
108 |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
109 steps_since_update = 0; |
5205251db8c3
Added some smartness to evolve with progress.`
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
110 last_update = tic(); |
0 | 111 end |
112 end | |
113 | |
114 s = util.replace_string(s,''); | |
115 end | |
116 | |
117 | |
118 end | |
119 end |