-
Notifications
You must be signed in to change notification settings - Fork 2
/
progressbar.f95
142 lines (124 loc) · 3.93 KB
/
progressbar.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
!************************************************************
! Progress indicators library.
!
! (gfortran needs compilation parameter: -fbackslash)
!
! Maciej Żok, 2010 MIT License
! https://github.com/macie/fortran-libs
subroutine progress_bar(iteration, maximum)
!
! Prints progress bar.
!
! Args:
! iteration - iteration number
! maximum - total iterations
!
implicit none
integer :: iteration, maximum
integer :: counter
integer :: step, done
step = nint(iteration * 100 / (1.0 * maximum))
done = floor(step / 10.0) ! mark every 10%
do counter = 1, 36 ! clear whole line - 36 chars
write(6,'(a)',advance='no') '\b' ! (\b - backslash)
end do
write(6,'(a)',advance='no') ' -> In progress... ['
if (done .LE. 0) then
do counter = 1, 10
write(6,'(a)',advance='no') '='
end do
else if ((done .GT. 0) .and. (done .LT. 10)) then
do counter = 1, done
write(6,'(a)',advance='no') '#'
end do
do counter = done+1, 10
write(6,'(a)',advance='no') '='
end do
else
do counter = 1, 10
write(6,'(a)',advance='no') '#'
end do
end if
write(6,'(a)',advance='no') '] '
write(6,'(I3.1)',advance='no') step
write(6,'(a)',advance='no') '%'
end
subroutine remaining_time(iteration, maximum)
!
! Prints remaining time.
!
! Args:
! iteration - iteration number
! maximum - total iterations
!
implicit none
integer :: iteration, maximum
integer :: counter
integer :: hours, minutes, seconds
real :: tarray(2), current, remains
call etime(tarray, current)
remains = 2 * current * (maximum / (1.0 * iteration) - 1)
hours = floor(remains / 3600)
minutes = floor((remains - hours * 3600) / 60)
seconds = nint(remains - (hours * 3600 + minutes * 60))
do counter = 1, 38 ! clear whole line - 38 chars
write(6,'(a)',advance='no') '\b' ! (\b - backslash)
end do
write(6,'(a)',advance='no') ' -> Remaining time (h:m:s): '
write(6,'(I4.1)',advance='no') hours
write(6,'(a)',advance='no') ':'
write(6,'(I2.2)',advance='no') minutes
write(6,'(a)',advance='no') ':'
write(6,'(I2.2)',advance='no') seconds
end
subroutine progress_bar_time(iteration, maximum)
!
! Prints progress bar with remaining time.
!
! Args:
! iteration - iteration number
! maximum - total iterations
!
implicit none
integer :: iteration, maximum
integer :: counter
integer :: hours, minutes, seconds
integer :: step, done
real :: tarray(2), current, remains
call etime(tarray, current)
remains = 2 * current * (maximum / (1.0 * iteration) - 1)
hours = floor(remains / 3600)
minutes = floor((remains - hours * 3600) / 60)
seconds = nint(remains - (hours * 3600 + minutes * 60))
step = nint(100/(1.0*maximum)*iteration)
done = floor(step / 10.0) ! mark every 10%
do counter = 1, 63 ! clear whole line - 63 chars
write(6,'(a)',advance='no') '\b' ! (\b - backslash)
end do
write(6,'(a)',advance='no') ' -> In progress... ['
if (done .LE. 0) then
do counter = 1, 10
write(6,'(a)',advance='no') '='
end do
else if ((done .GT. 0) .and. (done .LT. 10)) then
do counter = 1, done
write(6,'(a)',advance='no') '#'
end do
do counter = done+1, 10
write(6,'(a)',advance='no') '='
end do
else
do counter = 1, 10
write(6,'(a)',advance='no') '#'
end do
end if
write(6,'(a)',advance='no') '] '
write(6,'(I3.1)',advance='no') x
write(6,'(a)',advance='no') '% (remaining '
write(6,'(I4.1)',advance='no') hours
write(6,'(a)',advance='no') ':'
write(6,'(I2.2)',advance='no') minutes
write(6,'(a)',advance='no') "'"
write(6,'(I2.2)',advance='no') seconds
write(6,'(a)',advance='no') '")'
end