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