ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/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 1969 by gezelter, Wed Feb 26 14:14:50 2014 UTC

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

Comparing trunk/src/utils/ProgressBar.cpp (property svn:keywords):
Revision 1421 by gezelter, Tue Mar 30 15:04:19 2010 UTC vs.
Revision 1969 by gezelter, Wed Feb 26 14:14:50 2014 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines