ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/utils/ProgressBar.cpp
(Generate patch)

Comparing trunk/src/utils/ProgressBar.cpp (file contents):
Revision 1421 by gezelter, Tue Mar 30 15:04:19 2010 UTC vs.
Revision 1432 by chuckv, Thu Apr 8 19:49:38 2010 UTC

# 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>
45 #define _POSIX_SOURCE
46 #include <unistd.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 60 | 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 72 | 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
80 <
80 >      
81        // only do the progress bar if we are actually running in a tty:
82 <      if (isatty(fileno(stdout))) {        
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 +        // handle the case when the width is returned as a nonsensical value.
89 +        if (width <= 0) width = 80;
90 +
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 <        
96 >        int avail = width - 31 - 6 - 2;      
97 >
98          ++iteration_;
99 <        
99 >
100          if (maximum_ > 0.0) {
101  
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);
102          std::string progressbar;
103          progressbar.assign(hashes, '#');
106            
105          // add the spinner to the end of the progress bar:
106          progressbar += progressSpinner_[iteration_ & 3];
107          
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[24];
112 <          strftime(buffer, 24, "%a %b %d @ %I:%M %p", ender);
111 >          char buffer[22];
112 >          strftime(buffer, 22, "%a %b %d @ %I:%M %p", ender);
113            
114 <          std::stringstream fmt;
115 <          fmt << "\r%3d%% [%-" << avail << "s] Estimate: %s";
116 <          std::string st = fmt.str();
117 <          
118 <          printf(st.c_str(), int(percent),
119 <                 progressbar.c_str(),
120 <                 buffer);
121 <          
122 <        } else {
123 <          // we don't know the maximum, so we can't draw a progress bar
124 <          int center = (iteration_ % 48) + 1; // 50 spaces, minus 2
125 <          std::string before;
126 <          std::string after;
127 <          before.assign(std::max(center - 2, 0), ' ');
128 <          after.assign(std::min(center + 2, 50), ' ');
129 <          
130 <          printf("\r[%s###%s]            ",
131 <                 before.c_str(), after.c_str());
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 <        fflush(stdout);
138 >        cout.flush();
139        }
140   #ifdef IS_MPI
141      }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines