# | Line 39 | Line 39 | |
---|---|---|
39 | * [4] Vardeman, Stocker & Gezelter, in progress (2010). | |
40 | */ | |
41 | ||
42 | < | #include <string> |
43 | < | #include <sstream> |
42 | > | #include <iostream> |
43 | #include <sys/ioctl.h> | |
44 | #ifdef IS_MPI | |
45 | #include <mpi.h> | |
46 | < | #endif //is_mpi |
46 | > | #endif |
47 | #include "utils/ProgressBar.hpp" | |
48 | ||
49 | + | using namespace std; |
50 | + | |
51 | namespace OpenMD { | |
52 | ||
53 | const char * progressSpinner_ = "|/-\\"; | |
# | Line 58 | Line 59 | namespace OpenMD { | |
59 | #ifdef IS_MPI | |
60 | if (MPI::COMM_WORLD.Get_rank() == 0) { | |
61 | #endif | |
62 | < | printf("\n"); |
63 | < | fflush(stdout); |
62 | > | cout << endl; |
63 | > | cout.flush(); |
64 | #ifdef IS_MPI | |
65 | } | |
66 | #endif | |
# | Line 70 | Line 71 | namespace OpenMD { | |
71 | } | |
72 | ||
73 | void ProgressBar::update() { | |
74 | < | int width = 80; |
74 | > | |
75 | > | int width; |
76 | > | |
77 | #ifdef IS_MPI | |
78 | if (MPI::COMM_WORLD.Get_rank() == 0) { | |
79 | #endif | |
77 | – | #ifndef IS_MPI |
78 | – | // get the window width: |
79 | – | struct winsize w; |
80 | – | ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); |
81 | – | width = w.ws_col; |
82 | – | #endif |
83 | – | |
84 | – | // We'll use: |
85 | – | // 31 characters for the completion estimate, |
86 | – | // 6 for the % complete, |
87 | – | // 2 characters for the open and closing brackets. |
88 | – | |
89 | – | int avail = width - 31 - 6 - 2; |
90 | – | |
91 | – | ++iteration_; |
92 | – | |
93 | – | if (maximum_ > 0.0) { |
94 | – | // we know the maximum, so |
95 | – | // draw a progress bar |
80 | ||
81 | < | RealType percent = value_ * 100.0 / maximum_; |
82 | < | int hashes = int(percent * avail / 100.0); |
83 | < | std::string progressbar; |
84 | < | progressbar.assign(hashes, '#'); |
81 | > | // only do the progress bar if we are actually running in a tty: |
82 | > | if (isatty(fileno(stdout)) && (getenv("SGE_TASK_ID")==NULL)) { |
83 | > | // get the window width: |
84 | > | struct winsize w; |
85 | > | ioctl(fileno(stdout), TIOCGWINSZ, &w); |
86 | > | width = w.ws_col; |
87 | ||
88 | < | // add the spinner to the end of the progress bar: |
89 | < | progressbar += progressSpinner_[iteration_ & 3]; |
88 | > | // handle the case when the width is returned as a nonsensical value. |
89 | > | if (width <= 0) width = 80; |
90 | ||
91 | < | // compute the best estimate of the ending time: |
92 | < | time_t current_ = time(NULL); |
93 | < | time_t end_ = start_ + (current_ - start_) * (100.0/percent); |
94 | < | struct tm * ender = localtime(&end_); |
95 | < | char buffer[24]; |
96 | < | strftime(buffer, 24, "%a %b %d @ %I:%M %p", ender); |
91 | > | // We'll use: |
92 | > | // 31 characters for the completion estimate, |
93 | > | // 6 for the % complete, |
94 | > | // 2 characters for the open and closing brackets. |
95 | > | |
96 | > | int avail = width - 31 - 6 - 2; |
97 | ||
98 | < | std::stringstream fmt; |
113 | < | fmt << "\r%3d%% [%-" << avail << "s] Estimate: %s"; |
114 | < | std::string st = fmt.str(); |
98 | > | ++iteration_; |
99 | ||
100 | < | printf(st.c_str(), int(percent), |
117 | < | progressbar.c_str(), |
118 | < | buffer); |
100 | > | if (maximum_ > 0.0) { |
101 | ||
102 | < | } else { |
103 | < | // we don't know the maximum, so we can't draw a progress bar |
104 | < | int center = (iteration_ % 48) + 1; // 50 spaces, minus 2 |
105 | < | std::string before; |
106 | < | std::string after; |
107 | < | before.assign(std::max(center - 2, 0), ' '); |
108 | < | after.assign(std::min(center + 2, 50), ' '); |
109 | < | |
110 | < | printf("\r[%s###%s] ", |
111 | < | before.c_str(), after.c_str()); |
112 | < | } |
113 | < | fflush(stdout); |
102 | > | // we know the maximum, so draw a progress bar |
103 | > | |
104 | > | RealType percent = value_ * 100.0 / maximum_; |
105 | > | int hashes = int(percent * avail / 100.0); |
106 | > | |
107 | > | // compute the best estimate of the ending time: |
108 | > | time_t current_ = time(NULL); |
109 | > | time_t end_ = start_ + (current_ - start_) * (100.0/percent); |
110 | > | struct tm * ender = localtime(&end_); |
111 | > | char buffer[22]; |
112 | > | strftime(buffer, 22, "%a %b %d @ %I:%M %p", ender); |
113 | > | |
114 | > | cout << '\r'; |
115 | > | cout.width(3); |
116 | > | cout << right << int(percent); |
117 | > | cout.width(3); |
118 | > | cout << "% ["; |
119 | > | cout.fill('#'); |
120 | > | if (hashes+1 < avail) { |
121 | > | cout.width(hashes+1); |
122 | > | cout << progressSpinner_[iteration_ & 3]; |
123 | > | } else { |
124 | > | cout.width(avail); |
125 | > | cout << '#'; |
126 | > | } |
127 | > | cout.fill(' '); |
128 | > | if (avail - hashes - 1 > 0) { |
129 | > | cout.width(avail - hashes - 1); |
130 | > | cout << ' '; |
131 | > | } |
132 | > | cout.width(11); |
133 | > | cout << "] Estimate:"; |
134 | > | cout.width(22); |
135 | > | cout << buffer; |
136 | > | |
137 | > | } |
138 | > | cout.flush(); |
139 | > | } |
140 | #ifdef IS_MPI | |
141 | } | |
142 | #endif |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |