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 1420 by gezelter, Fri Mar 26 18:42:55 2010 UTC vs.
branches/development/src/utils/ProgressBar.cpp (file contents), Revision 1794 by gezelter, Thu Sep 6 19:44:06 2012 UTC

# Line 36 | Line 36
36   * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37   * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38   * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
39 < * [4]  Vardeman, Stocker & Gezelter, in progress (2010).                        
39 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43 < #include <string>
44 < #include <sstream>
43 > #include <iostream>
44 > #include <cstdlib>
45 >
46 > #ifdef _MSC_VER
47 > #include <Windows.h>
48 > #include <stdio.h>
49 > #include <io.h>
50 > #define isatty _isatty
51 > #define fileno _fileno
52 > #else
53 > #include <cstdio>
54   #include <sys/ioctl.h>
55 + #endif
56 +
57   #ifdef IS_MPI
58   #include <mpi.h>
59 < #endif //is_mpi
59 > #endif
60 >
61   #include "utils/ProgressBar.hpp"
62  
63 + using namespace std;
64 +
65   namespace OpenMD {
66  
67    const char * progressSpinner_ = "|/-\\";
# Line 58 | Line 73 | namespace OpenMD {
73   #ifdef IS_MPI
74      if (MPI::COMM_WORLD.Get_rank() == 0) {
75   #endif
76 <      printf("\n");
77 <      fflush(stdout);
76 >      cout << endl;
77 >      cout.flush();
78   #ifdef IS_MPI
79      }
80   #endif
# Line 70 | Line 85 | namespace OpenMD {
85    }
86    
87    void ProgressBar::update() {
88 <    int width = 80;
88 >
89 >    int width;
90 >
91   #ifdef IS_MPI
92      if (MPI::COMM_WORLD.Get_rank() == 0) {
93   #endif
94 < #ifndef IS_MPI
95 <    // get the window width:
96 <    struct winsize w;
97 <    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
81 <    width = w.ws_col;
82 < #endif  
94 >      
95 >      // only do the progress bar if we are actually running in a tty:
96 >      if (isatty(fileno(stdout))  && (getenv("SGE_TASK_ID")==NULL)) {    
97 >        // get the window width:
98  
99 <    // We'll use:
100 <    // 31 characters for the completion estimate,
101 <    //  6 for the % complete,
102 <    //  2 characters for the open and closing brackets.
99 > #ifdef _MSC_VER
100 >        CONSOLE_SCREEN_BUFFER_INFO csbi;
101 >        int ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ),
102 >                                             &csbi);
103 >        if(ret) {
104 >          width = csbi.dwSize.X;
105 >        }
106 > #else
107 >        struct winsize w;
108 >        ioctl(fileno(stdout), TIOCGWINSZ, &w);
109 >        width = w.ws_col;
110 > #endif
111  
112 <    int avail = width - 31 - 6 - 2;
112 >        // handle the case when the width is returned as a nonsensical value.
113 >        if (width <= 0) width = 80;
114  
115 <    ++iteration_;
116 <    
117 <    if (maximum_ > 0.0) {
118 <      // we know the maximum, so
119 <      // draw a progress bar
120 <      
97 <      RealType percent = value_ * 100.0 / maximum_;
98 <      int hashes = int(percent * avail / 100.0);
99 <      std::string progressbar;
100 <      progressbar.assign(hashes, '#');
115 >        // We'll use:
116 >        // 31 characters for the completion estimate,
117 >        //  6 for the % complete,
118 >        //  2 characters for the open and closing brackets.
119 >        
120 >        int avail = width - 31 - 6 - 2;      
121  
122 <      // add the spinner to the end of the progress bar:
103 <      progressbar += progressSpinner_[iteration_ & 3];
122 >        ++iteration_;
123  
124 <      // compute the best estimate of the ending time:
106 <      time_t current_ = time(NULL);
107 <      time_t end_ = start_ + (current_ - start_) * (100.0/percent);
108 <      struct tm * ender = localtime(&end_);
109 <      char buffer[24];
110 <      strftime(buffer, 24, "%a %b %d @ %I:%M %p", ender);
124 >        if (maximum_ > 0.0) {
125  
126 <      std::stringstream fmt;
127 <      fmt << "\r%3d%% [%-" << avail << "s] Estimate: %s";
128 <      std::string st = fmt.str();
126 >          // we know the maximum, so draw a progress bar
127 >          
128 >          RealType percent = value_ * 100.0 / maximum_;
129 >          int hashes = int(percent * avail / 100.0);
130 >          
131 >          // compute the best estimate of the ending time:
132 >          time_t current_ = time(NULL);
133 >          time_t end_ = start_ + (current_ - start_) * (100.0/percent);
134 >          struct tm * ender = localtime(&end_);
135 >          char buffer[22];
136 >          strftime(buffer, 22, "%a %b %d @ %I:%M %p", ender);
137  
138 <      printf(st.c_str(), int(percent),
139 <             progressbar.c_str(),
140 <             buffer);
141 <
142 <    } else {
143 <      // we don't know the maximum, so we can't draw a progress bar
144 <      int center = (iteration_ % 48) + 1; // 50 spaces, minus 2
145 <      std::string before;
146 <      std::string after;
147 <      before.assign(std::max(center - 2, 0), ' ');
148 <      after.assign(std::min(center + 2, 50), ' ');
149 <      
150 <      printf("\r[%s###%s]            ",
151 <             before.c_str(), after.c_str());
152 <    }
153 <    fflush(stdout);
138 > #ifdef _MSC_VER
139 >          csbi.dwCursorPosition.X = 0;
140 >          SetConsoleCursorPosition(hConsole, csbi.dwCursorPosition);
141 > #else          
142 >          cout << '\r';
143 > #endif
144 >          cout.width(3);
145 >          cout << right << int(percent);
146 >          cout.width(3);
147 >          cout << "% [";
148 >          cout.fill('#');
149 >          if (hashes+1 < avail) {
150 >            cout.width(hashes+1);
151 >            cout << progressSpinner_[iteration_ & 3];
152 >          } else {
153 >            cout.width(avail);
154 >            cout << '#';            
155 >          }
156 >          cout.fill(' ');
157 >          if (avail - hashes - 1  > 0) {
158 >            cout.width(avail - hashes - 1);
159 >            cout << ' ';
160 >          }
161 >          cout.width(11);
162 >          cout << "] Estimate:";
163 >          cout.width(22);
164 >          cout << buffer;
165 >                  
166 >        }
167 >        cout.flush();
168 >      }
169   #ifdef IS_MPI
170      }
171   #endif

Comparing:
trunk/src/utils/ProgressBar.cpp (property svn:keywords), Revision 1420 by gezelter, Fri Mar 26 18:42:55 2010 UTC vs.
branches/development/src/utils/ProgressBar.cpp (property svn:keywords), Revision 1794 by gezelter, Thu Sep 6 19:44:06 2012 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines