Bridge++  Ver. 2.0.4
bridgeIO.cpp
Go to the documentation of this file.
1 
14 #include "bridgeIO.h"
17 
19 
20 //====================================================================
21 // verbose output for c style
22 // default verbose level, node 0
23 
24 namespace Bridge {
25  //====================================================================
26  const std::string BridgeIO::class_name = "BridgeIO";
27 
28  //====================================================================
29  BridgeIO::BridgeIO(const std::string& filename)
30  {
31  os_ = NULL;
32  m_node_write = -1;
33  init(filename);
34  }
35 
36  //====================================================================
37  BridgeIO::BridgeIO(const std::string& filename, int node)
38  {
39  os_ = NULL;
40  m_node_write = -1;
41  init(filename, node);
42  }
43 
44  //====================================================================
45  BridgeIO::BridgeIO(const std::string& filename, int node,
46  std::ios_base::openmode mode)
47  {
48  os_ = NULL;
49  m_node_write = -1;
50  init(filename, node, mode);
51  }
52 
53 
54  //====================================================================
56  {
57  tidyup_();
58  }
59 
60 
61  //====================================================================
62  void BridgeIO::init(const std::string& filename)
63  {
64  // open in all ranks, the default output rank is 0
65  int this_node = Communicator::self();
66  init(filename, this_node, std::ios::out);
67  m_node_write = 0; // force the default output rank to 0
68  }
69 
70 
71  //====================================================================
72  void BridgeIO::init(const std::string& filename, int node)
73  {
74  // open in specified rank, the default output rank is the same
75  init(filename, node, std::ios::out);
76  }
77 
78  //====================================================================
79  void BridgeIO::init(const std::string& filename, int node,
80  std::ios_base::openmode mode)
81  {
83  int this_node = Communicator::self();
84 
85  push_();
86 
87  m_node_write = node;
88 
89  if( this_node != node) {
90  os_ = NULL;
91  return;
92  }
93 
94  if (filename == "stdout") {
95  os_ = new std::ostream(std::cout.rdbuf());
96  } else {
97  os_ = new std::ofstream(filename.c_str(), mode);
98  }
99 
100  if (!os_) {
101  fprintf(stderr, "%s: init: unable to open log file \"%s\".\n", class_name.c_str(), filename.c_str());
102  exit(EXIT_FAILURE);
103 
104  rewind_();
105  }
106 
107  }
108 
109 
110  //====================================================================
111  void BridgeIO::init(const std::ostream& ost)
112  {
113  int this_node = Communicator::self();
114  init(ost, this_node);
115  }
116 
117  //====================================================================
118  void BridgeIO::init(const std::ostream& ost, int node)
119  {
120  int this_node = Communicator::self();
121 
122  push_();
123  m_node_write = node;
124 
125  if( this_node != m_node_write ) {
126  os_ = NULL;
127  return;
128  }
129 
130  os_ = new std::ostream(ost.rdbuf());
131 
132  if (!os_) {
133  fprintf(stderr, "%s: init: unable to open stream.\n", class_name.c_str());
134  exit(EXIT_FAILURE);
135 
136  rewind_();
137  }
138  }
139 
140 
141  //====================================================================
143  {
144  if (os_) delete os_;
145 
146  rewind_();
147  }
148 
149 
150  //====================================================================
152  {
153  if ( os_ ) {
154  *os_ << std::flush;
155  }
156  os_info info;
157  info.os = os_;
158  info.node_write = m_node_write;
159  stack_.push(info);
160  }
161 
162 
163  //====================================================================
165  {
166  if (stack_.size() > 0) {
167  os_info info = stack_.top();
168  os_ = info.os;
169  m_node_write = info.node_write;
170 
171  stack_.pop();
172  } else {
173  os_ = NULL;
174  }
175  }
176 
177 
178  //====================================================================
180  {
181  if (os_) delete os_;
182 
183  while (stack_.size() > 0)
184  {
185  std::ostream *otmp = stack_.top().os;
186  if (otmp) delete otmp;
187  stack_.pop();
188  }
189 
190  }
191 
192 
193  //====================================================================
195  BridgeIO::set_verbose_level(const std::string& str)
196  {
198 
199  if ((str == "Crucial") || (str == "crucial") || (str == "CRUCIAL")) return Bridge::CRUCIAL;
200 
201  if ((str == "General") || (str == "general") || (str == "GENERAL")) return Bridge::GENERAL;
202 
203  if ((str == "Detailed") || (str == "detailed") || (str == "DETAILED")) return Bridge::DETAILED;
204 
205  if ((str == "Paranoiac") || (str == "paranoiac") || (str == "PARANOIAC")) return Bridge::PARANOIAC;
206 
207  if ((str == "NULL") || (str == "null")) return CommonParameters::Vlevel();
208 
209  // safe default
210  return Bridge::GENERAL;
211  }
212 
213 
214  //====================================================================
215  std::string
217  {
219 
220  switch (vl)
221  {
222  case Bridge::CRUCIAL:
223  return "Crucial";
224 
225  case Bridge::GENERAL:
226  return "General";
227 
228  case Bridge::DETAILED:
229  return "Detailed";
230 
231  case Bridge::PARANOIAC:
232  return "Paranoiac";
233 
234  default:
235  return "NULL";
236  }
237  }
238 
239 
240  //====================================================================
241  void
242  BridgeIO::crucial(const char *format, ...)
243  {
245 
246  if (vl < Bridge::CRUCIAL) return;
247 
248  va_list arg;
249 
250  int ith = ThreadManager::get_thread_id();
251  if (ith == 0) {
252  va_start(arg, format);
253  print(vl, Bridge::CRUCIAL, m_node_write, format, arg);
254  va_end(arg);
255  if( os_ ) *os_ << std::flush;
256  }
257  }
258 
259 
260  //====================================================================
261  void
262  BridgeIO::general(const char *format, ...)
263  {
265 
266  if (vl < Bridge::GENERAL) return;
267 
268  va_list arg;
269 
270  int ith = ThreadManager::get_thread_id();
271  if (ith == 0) {
272  va_start(arg, format);
273  print(vl, Bridge::GENERAL, m_node_write, format, arg);
274  va_end(arg);
275  }
276  }
277 
278 
279  //====================================================================
280  void
281  BridgeIO::detailed(const char *format, ...)
282  {
284 
285  if (vl < Bridge::DETAILED) return;
286 
287  va_list arg;
288 
289  int ith = ThreadManager::get_thread_id();
290  if (ith == 0) {
291  va_start(arg, format);
292  print(vl, Bridge::DETAILED, m_node_write, format, arg);
293  va_end(arg);
294  }
295  }
296 
297 
298  //====================================================================
299  void
300  BridgeIO::paranoiac(const char *format, ...)
301  {
303 
304  if (vl < Bridge::PARANOIAC) return;
305 
306  va_list arg;
307 
308  int ith = ThreadManager::get_thread_id();
309  if (ith == 0) {
310  va_start(arg, format);
311  print(vl, Bridge::PARANOIAC, m_node_write, format, arg);
312  va_end(arg);
313  }
314  }
315 
316 
317  //====================================================================
318  // input verbose level, node 0
319  void
320  BridgeIO::crucial(VerboseLevel vl, const char *format, ...)
321  {
322  if (vl < Bridge::CRUCIAL) return;
323 
324  va_list arg;
325 
326  int ith = ThreadManager::get_thread_id();
327  if (ith == 0) {
328  va_start(arg, format);
329  print(vl, Bridge::CRUCIAL, m_node_write, format, arg);
330  va_end(arg);
331  if( m_node_write == Communicator::self() && os_ ) *os_ << std::flush;
332  }
333  }
334 
335 
336  //====================================================================
337  void
338  BridgeIO::general(VerboseLevel vl, const char *format, ...)
339  {
340  if (vl < Bridge::GENERAL) return;
341 
342  va_list arg;
343 
344  int ith = ThreadManager::get_thread_id();
345  if (ith == 0) {
346  va_start(arg, format);
347  print(vl, Bridge::GENERAL, m_node_write, format, arg);
348  va_end(arg);
349  }
350  }
351 
352 
353  //====================================================================
354  void
355  BridgeIO::detailed(VerboseLevel vl, const char *format, ...)
356  {
357  if (vl < Bridge::DETAILED) return;
358 
359  va_list arg;
360 
361  int ith = ThreadManager::get_thread_id();
362  if (ith == 0) {
363  va_start(arg, format);
364  print(vl, Bridge::DETAILED, m_node_write, format, arg);
365  va_end(arg);
366  }
367  }
368 
369 
370  //====================================================================
371  void
372  BridgeIO::paranoiac(VerboseLevel vl, const char *format, ...)
373  {
374  if (vl < Bridge::PARANOIAC) return;
375 
376  va_list arg;
377 
378  int ith = ThreadManager::get_thread_id();
379  if (ith == 0) {
380  va_start(arg, format);
381  print(vl, Bridge::PARANOIAC, m_node_write, format, arg);
382  va_end(arg);
383  }
384  }
385 
386  //====================================================================
387  // input verbose level, input node
388  void
389  BridgeIO::crucial(VerboseLevel vl, int node, const char *format, ...)
390  {
391  if (vl < Bridge::CRUCIAL) return;
392 
393  va_list arg;
394 
395  int ith = ThreadManager::get_thread_id();
396  if (ith == 0 ) {
397  if (node == m_node_write ) {
398  va_start(arg, format);
399  print(vl, Bridge::CRUCIAL, node, format, arg);
400  va_end(arg);
401  if( (m_node_write == Communicator::self()) && os_ ) *os_ << std::flush;
402  } else {
403 #ifdef DEBUG
404  if (!isOpen() ){
405  // if the output is stdout, it is always open
406  // and m_node_rank != node can be by intention
407  fprintf(stderr,
408  "BridgeIO::curical: the stream is open for rank %d but specified %d\n",
409  m_node_write, node);
410  }
411 #endif
412  }
413  }
414  }
415 
416 
417  //====================================================================
418  void
419  BridgeIO::general(VerboseLevel vl, int node, const char *format, ...)
420  {
421  if (vl < Bridge::GENERAL) return;
422 
423  va_list arg;
424 
425  int ith = ThreadManager::get_thread_id();
426  if (ith == 0) {
427  if (node == m_node_write ) {
428  va_start(arg, format);
429  print(vl, Bridge::GENERAL, node, format, arg);
430  va_end(arg);
431  } else {
432 #ifdef DEBUG
433  if (!isOpen() ){
434  fprintf(stderr,
435  "BridgeIO::general: the stream is open for rank %d but specified %d\n",
436  m_node_write, node);
437  }
438 #endif
439  }
440  }
441  }
442 
443  //====================================================================
444  void
445  BridgeIO::detailed(VerboseLevel vl, int node, const char *format, ...)
446  {
447  if (vl < Bridge::DETAILED) return;
448 
449  va_list arg;
450 
451  int ith = ThreadManager::get_thread_id();
452  if (ith == 0) {
453  if ( node == m_node_write ) {
454  va_start(arg, format);
455  print(vl, Bridge::DETAILED, node, format, arg);
456  va_end(arg);
457  } else {
458 #ifdef DEBUG
459  if (!isOpen() ){
460  fprintf(stderr,
461  "BridgeIO::detailed: the stream is open for rank %d but specified %d\n",
462  m_node_write, node);
463  }
464 #endif
465  }
466  }
467  }
468 
469  //====================================================================
470  void
471  BridgeIO::paranoiac(VerboseLevel vl, int node, const char *format, ...)
472  {
473  if (vl < Bridge::PARANOIAC) return;
474 
475  va_list arg;
476 
477  int ith = ThreadManager::get_thread_id();
478  if (ith == 0) {
479  if (node == m_node_write ) {
480  va_start(arg, format);
481  print(vl, Bridge::PARANOIAC, node, format, arg);
482  va_end(arg);
483  } else {
484 #ifdef DEBUG
485  if (!isOpen() ){
486  fprintf(stderr,
487  "BridgeIO::paranoiac: the stream is open for rank %d but specified %d\n",
488  m_node_write, node);
489  }
490 #endif
491  }
492  }
493  }
494 
495  //====================================================================
496  std::ostream& BridgeIO::getStream()
497  {
498  return *os_;
499  }
500 
501 
502  //====================================================================
504  {
505  return os_ && *os_;
506  }
507 
509  int ith = ThreadManager::get_thread_id();
510  // synchronization with omp barrier is omitted
511  // as m_indent_level is used only in the master thread
512  if (ith == 0) {
513  ++m_indent_level;
514  }
515  }
516 
518  int ith = ThreadManager::get_thread_id();
519  // synchronization with omp barrier is omitted
520  // as m_indent_level is used only in the master thread
521  if (ith == 0) {
522  --m_indent_level;
523  }
524  }
525 
526  void BridgeIO::set_indent(const int level){
527  int ith = ThreadManager::get_thread_id();
528  // synchronization with omp barrier is omitted
529  // as m_indent_level is used only in the master thread
530  if (ith == 0) {
531  m_indent_level = level;
532  }
533  }
534 
535  //====================================================================
536  inline
537  void
539  int node, const char *format, va_list& arg)
540  {
541  if ((write_level <= level) && (Communicator::nodeid() == node)) {
542  if (!os_) {
543  std::cerr << "ERROR: BridgeIO: no output stream." << std::endl;
544  exit(EXIT_FAILURE);
545  }
546 
547  vsprintf(buff_, format, arg);
548 
549  for (int i = 0; i < m_indent_level; ++i) {
550  *os_ << " ";
551  }
552 
553  *os_ << buff_;
554 #ifdef DEBUG
555  *os_ << std::flush;
556 #endif
557 
558  if (!os_->good()) {
559  std::cerr << "ERROR: BridgeIO: output failed." << std::endl;
560  exit(EXIT_FAILURE);
561  }
562  }
563  }
564 
565 
566 
567 
568  //====================================================================
570 }
571 
572 //====================================================================
573 //====================================================================
bridgeIO.h
Bridge::PARANOIAC
@ PARANOIAC
Definition: bridgeIO.h:50
Bridge::BridgeIO::rewind_
void rewind_()
Definition: bridgeIO.cpp:164
Bridge::BridgeIO::init
void init(const std::string &filename)
Definition: bridgeIO.cpp:62
Bridge::BridgeIO::os_info::node_write
int node_write
Definition: bridgeIO.h:155
Bridge::BridgeIO::os_
std::ostream * os_
Definition: bridgeIO.h:139
Bridge::BridgeIO::set_indent
void set_indent(const int level)
Definition: bridgeIO.cpp:526
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:517
Bridge
BridgeIO for output under parallel environment with verbose level control.
Definition: bridgeIO.cpp:24
Communicator::self
static int self()
rank within small world.
Definition: communicator.cpp:74
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:281
Bridge::GENERAL
@ GENERAL
Definition: bridgeIO.h:48
Bridge::BridgeIO::unset
void unset()
Definition: bridgeIO.cpp:142
Bridge::BridgeIO::os_info
Definition: bridgeIO.h:153
Bridge::BridgeIO::~BridgeIO
virtual ~BridgeIO()
Definition: bridgeIO.cpp:55
Bridge::BridgeIO::paranoiac
void paranoiac(const char *format,...)
Definition: bridgeIO.cpp:300
Bridge::BridgeIO::tidyup_
void tidyup_()
Definition: bridgeIO.cpp:179
Bridge::BridgeIO::stack_
std::stack< os_info > stack_
Definition: bridgeIO.h:158
Bridge::BridgeIO::push_
void push_()
Definition: bridgeIO.cpp:151
ParameterCheck::vl
Bridge::VerboseLevel vl
Definition: parameterCheck.cpp:18
Bridge::BridgeIO
Definition: bridgeIO.h:53
threadManager.h
Bridge::BridgeIO::class_name
static const std::string class_name
Definition: bridgeIO.h:55
Bridge::BridgeIO::buff_
char buff_[1024]
Definition: bridgeIO.h:145
Bridge::BridgeIO::m_node_write
int m_node_write
Definition: bridgeIO.h:150
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
Bridge::BridgeIO::BridgeIO
BridgeIO(const std::string &filename="stdout")
Definition: bridgeIO.cpp:29
Bridge::DETAILED
@ DETAILED
Definition: bridgeIO.h:49
Bridge::BridgeIO::m_indent_level
static int m_indent_level
Definition: bridgeIO.h:147
Bridge::BridgeIO::os_info::os
std::ostream * os
Definition: bridgeIO.h:154
Bridge::BridgeIO::isOpen
bool isOpen()
Definition: bridgeIO.cpp:503
commonParameters.h
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
Bridge::VerboseLevel
VerboseLevel
Definition: bridgeIO.h:45
Bridge::BridgeIO::getStream
std::ostream & getStream()
Definition: bridgeIO.cpp:496
Bridge::CRUCIAL
@ CRUCIAL
Definition: bridgeIO.h:47
Bridge::BridgeIO::print
void print(VerboseLevel level, VerboseLevel write_level, int node, const char *format, va_list &arg)
Definition: bridgeIO.cpp:538
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:569
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216