www.mooseframework.org
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | Private Attributes | Friends | List of all members
FormattedTable Class Reference

This class is used for building, formatting, and outputting tables of numbers. More...

#include <FormattedTable.h>

Public Member Functions

 FormattedTable ()
 Default constructor - The default constructor takes an optional parameter to turn off stateful printing. More...
 
 FormattedTable (const FormattedTable &o)
 Copy constructor - The copy constructor will duplicate the data structures but is not designed to work with FormattedTables with open streams (e.g. More...
 
 ~FormattedTable ()
 The destructor is used to close the file handle. More...
 
bool empty () const
 Returns a boolean value based on whether the FormattedTable contains data or not. More...
 
void append (bool append_existing_file)
 Sets append mode which means an existing file is not truncated on opening. More...
 
void addRow (Real time)
 Force a new row in the table with the passed in time. More...
 
template<typename T = Real>
void addData (const std::string &name, const T &value)
 Method for adding data to the output table. More...
 
template<typename T = Real>
void addData (const std::string &name, const T &value, Real time)
 Method for adding data to the output table. More...
 
template<typename T = Real>
void addData (const std::string &name, const std::vector< T > &vector)
 Method for adding an entire vector to a table at a time. More...
 
Real getLastTime ()
 Retrieve the last time (or independent variable) value. More...
 
template<typename T = Real>
T & getLastData (const std::string &name)
 Retrieve Data for last value of given name. More...
 
void clear ()
 
void outputTimeColumn (bool output_time)
 Set whether or not to output time column. More...
 
void printTable (std::ostream &out, unsigned int last_n_entries=0)
 Methods for dumping the table to the stream - either by filename or by stream handle. More...
 
void printTable (std::ostream &out, unsigned int last_n_entries, const MooseEnum &suggested_term_width)
 
void printTable (const std::string &file_name)
 
void printCSV (const std::string &file_name, int interval=1, bool align=false)
 Method for dumping the table to a csv file - opening and closing the file handle is handled. More...
 
void printEnsight (const std::string &file_name)
 
void writeExodus (ExodusII_IO *ex_out, Real time)
 
void makeGnuplot (const std::string &base_file, const std::string &format)
 
void setDelimiter (std::string delimiter)
 By default printCSV places "," between each entry, this allows this to be changed. More...
 
void setPrecision (unsigned int precision)
 By default printCSV prints output to a precision of 14, this allows this to be changed. More...
 
void sortColumns ()
 Sorts columns alphabetically. More...
 

Static Public Member Functions

static MooseEnum getWidthModes ()
 

Protected Member Functions

void printTablePiece (std::ostream &out, unsigned int last_n_entries, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end)
 
void printOmittedRow (std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const
 
void printRowDivider (std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const
 
void printNoDataRow (char intersect_char, char fill_char, std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const
 

Protected Attributes

std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
 Data structure for the console table: The first part of the pair tracks the independent variable (normally time) and is associated with the second part of the table which is the map of dependent variables and their associated values. More...
 
std::map< std::string, unsigned int_align_widths
 Alignment widths (only used if asked to print aligned to CSV output) More...
 
std::vector< std::string > _column_names
 The set of column names updated when data is inserted through the setter methods. More...
 

Static Protected Attributes

static const unsigned short _column_width = 15
 The single cell width used for all columns in the table. More...
 
static const unsigned short _min_pps_width = 40
 The absolute minimum PPS table width. More...
 

Private Member Functions

void close ()
 Close the underlying output file stream if any. This is idempotent. More...
 
void open (const std::string &file_name)
 Open or switch the underlying file stream to point to file_name. This is idempotent. More...
 
void printRow (std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase >>> &row_data, bool align)
 
void fillEmptyValues ()
 Fill any values that are not defined (usually when there are mismatched column lengths) More...
 

Private Attributes

std::string _output_file_name
 The optional output file stream. More...
 
std::ofstream _output_file
 The stream handle (corresponds to _output_file_name) More...
 
std::size_t _output_row_index
 Keeps track of the index indicating which vector elements have been output. More...
 
bool _headers_output
 Keeps track of whether the header has been output. More...
 
bool _append
 Keeps track of whether we want to open an existing file for appending or overwriting. More...
 
bool _output_time
 Whether or not to output the Time column. More...
 
std::string _csv_delimiter
 *.csv file delimiter, defaults to "," More...
 
unsigned int _csv_precision
 *.csv file precision, defaults to 14 More...
 
bool _column_names_unsorted = true
 Flag indicating that sorting is necessary (used by sortColumns method). More...
 

Friends

void dataStore (std::ostream &stream, FormattedTable &table, void *context)
 
void dataLoad (std::istream &stream, FormattedTable &v, void *context)
 

Detailed Description

This class is used for building, formatting, and outputting tables of numbers.

Definition at line 109 of file FormattedTable.h.

Constructor & Destructor Documentation

◆ FormattedTable() [1/2]

FormattedTable::FormattedTable ( )

Default constructor - The default constructor takes an optional parameter to turn off stateful printing.

This means that each time you ask the FormattedTable to print to a file, it'll, print the entire table. The default is to only print the part of the table that hasn't already been printed.

Definition at line 143 of file FormattedTable.C.

144  : _output_row_index(0),
145  _headers_output(false),
146  _append(false),
147  _output_time(true),
150 {
151 }
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
bool _output_time
Whether or not to output the Time column.
std::string _csv_delimiter
*.csv file delimiter, defaults to ","
const unsigned short DEFAULT_CSV_PRECISION
unsigned int _csv_precision
*.csv file precision, defaults to 14
bool _headers_output
Keeps track of whether the header has been output.
bool _append
Keeps track of whether we want to open an existing file for appending or overwriting.
const std::string DEFAULT_CSV_DELIMITER

◆ FormattedTable() [2/2]

FormattedTable::FormattedTable ( const FormattedTable o)

Copy constructor - The copy constructor will duplicate the data structures but is not designed to work with FormattedTables with open streams (e.g.

CSV Output mode).

Definition at line 153 of file FormattedTable.C.

155  _output_file_name(""),
158  _append(o._append),
163 {
164  if (_output_file.is_open())
165  mooseError("Copying a FormattedTable with an open stream is not supported");
166 
167  for (const auto & it : o._data)
168  _data.emplace_back(it.first, it.second);
169 }
std::string _output_file_name
The optional output file stream.
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
bool _output_time
Whether or not to output the Time column.
bool _column_names_unsorted
Flag indicating that sorting is necessary (used by sortColumns method).
std::string _csv_delimiter
*.csv file delimiter, defaults to ","
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
unsigned int _csv_precision
*.csv file precision, defaults to 14
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...
bool _headers_output
Keeps track of whether the header has been output.
bool _append
Keeps track of whether we want to open an existing file for appending or overwriting.

◆ ~FormattedTable()

FormattedTable::~FormattedTable ( )

The destructor is used to close the file handle.

Definition at line 171 of file FormattedTable.C.

171 { close(); }
void close()
Close the underlying output file stream if any. This is idempotent.

Member Function Documentation

◆ addData() [1/3]

template<typename T >
void FormattedTable::addData ( const std::string &  name,
const T &  value 
)

Method for adding data to the output table.

Data is added to the last row. Method will error if called on an empty table.

Definition at line 327 of file FormattedTable.h.

Referenced by AutomaticMortarGeneration::msmStatistics(), TableOutput::outputPostprocessors(), TableOutput::outputReporter(), TableOutput::outputScalarVariables(), and TableOutput::outputVectorPostprocessors().

328 {
329  if (empty())
330  mooseError("No Data stored in the the FormattedTable");
331 
332  auto back_it = _data.rbegin();
333  back_it->second[name] =
334  std::dynamic_pointer_cast<TableValueBase>(std::make_shared<TableValue<T>>(value));
335 
336  if (std::find(_column_names.begin(), _column_names.end(), name) == _column_names.end())
337  {
338  _column_names.push_back(name);
339  _column_names_unsorted = true;
340  }
341 }
std::string name(const ElemQuality q)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
bool _column_names_unsorted
Flag indicating that sorting is necessary (used by sortColumns method).
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
bool empty() const
Returns a boolean value based on whether the FormattedTable contains data or not. ...
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ addData() [2/3]

template<typename T >
void FormattedTable::addData ( const std::string &  name,
const T &  value,
Real  time 
)

Method for adding data to the output table.

The dependent variable is named "time"

Definition at line 345 of file FormattedTable.h.

346 {
347  auto back_it = _data.rbegin();
348 
349  mooseAssert(back_it == _data.rend() || !MooseUtils::absoluteFuzzyLessThan(time, back_it->first),
350  "Attempting to add data to FormattedTable with the dependent variable in a "
351  "non-increasing order.\nDid you mean to use addData(std::string &, const "
352  "std::vector<Real> &)?");
353 
354  // See if the current "row" is already in the table
355  if (back_it == _data.rend() || !MooseUtils::absoluteFuzzyEqual(time, back_it->first))
356  {
357  _data.emplace_back(time, std::map<std::string, std::shared_ptr<TableValueBase>>());
358  back_it = _data.rbegin();
359  }
360  // Insert or update value
361  back_it->second[name] =
362  std::dynamic_pointer_cast<TableValueBase>(std::make_shared<TableValue<T>>(value));
363 
364  if (std::find(_column_names.begin(), _column_names.end(), name) == _column_names.end())
365  {
366  _column_names.push_back(name);
367  _column_names_unsorted = true;
368  }
369 }
std::string name(const ElemQuality q)
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether two variables are equal within an absolute tolerance.
Definition: MooseUtils.h:346
bool _column_names_unsorted
Flag indicating that sorting is necessary (used by sortColumns method).
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
bool absoluteFuzzyLessThan(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether a variable is less than another variable within an absolute tolerance...
Definition: MooseUtils.h:437
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ addData() [3/3]

template<typename T >
void FormattedTable::addData ( const std::string &  name,
const std::vector< T > &  vector 
)

Method for adding an entire vector to a table at a time.

Checks are made to ensure that the dependent variable index lines up with the vector indices.

Definition at line 373 of file FormattedTable.h.

374 {
375  for (MooseIndex(vector) i = 0; i < vector.size(); ++i)
376  {
377  if (i == _data.size())
378  _data.emplace_back(i, std::map<std::string, std::shared_ptr<TableValueBase>>());
379 
380  mooseAssert(MooseUtils::absoluteFuzzyEqual(_data[i].first, i),
381  "Inconsistent indexing in VPP vector");
382 
383  auto & curr_entry = _data[i];
384  curr_entry.second[name] =
385  std::dynamic_pointer_cast<TableValueBase>(std::make_shared<TableValue<T>>(vector[i]));
386  }
387 
388  if (std::find(_column_names.begin(), _column_names.end(), name) == _column_names.end())
389  {
390  _column_names.push_back(name);
391  _column_names_unsorted = true;
392  }
393 }
std::string name(const ElemQuality q)
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether two variables are equal within an absolute tolerance.
Definition: MooseUtils.h:346
bool _column_names_unsorted
Flag indicating that sorting is necessary (used by sortColumns method).
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ addRow()

void FormattedTable::addRow ( Real  time)

Force a new row in the table with the passed in time.

Definition at line 186 of file FormattedTable.C.

Referenced by AutomaticMortarGeneration::msmStatistics(), TableOutput::outputPostprocessors(), and TableOutput::outputReporter().

187 {
188  _data.emplace_back(time, std::map<std::string, std::shared_ptr<TableValueBase>>());
189 }
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...

◆ append()

void FormattedTable::append ( bool  append_existing_file)

Sets append mode which means an existing file is not truncated on opening.

This mode is typically used for recovery.

Definition at line 180 of file FormattedTable.C.

Referenced by CSV::initialSetup().

181 {
182  _append = append_existing_file;
183 }
bool _append
Keeps track of whether we want to open an existing file for appending or overwriting.

◆ clear()

void FormattedTable::clear ( )

Definition at line 568 of file FormattedTable.C.

Referenced by TableOutput::clear(), and AutomaticMortarGeneration::msmStatistics().

569 {
570  _data.clear();
571  _output_file.close();
572  _output_row_index = 0;
573 }
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...

◆ close()

void FormattedTable::close ( )
private

Close the underlying output file stream if any. This is idempotent.

Definition at line 111 of file FormattedTable.C.

Referenced by open(), and ~FormattedTable().

112 {
113  if (!_output_file.is_open())
114  return;
115  _output_file.flush();
116  _output_file.close();
117  _output_file_name = "";
118 }
std::string _output_file_name
The optional output file stream.
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)

◆ empty()

bool FormattedTable::empty ( ) const

Returns a boolean value based on whether the FormattedTable contains data or not.

Definition at line 174 of file FormattedTable.C.

Referenced by addData(), getLastData(), getLastTime(), Gnuplot::output(), CSV::output(), TableOutput::outputPostprocessors(), Console::outputPostprocessors(), TableOutput::outputReporter(), Console::outputReporters(), and Console::outputScalarVariables().

175 {
176  return _data.empty();
177 }
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...

◆ fillEmptyValues()

void FormattedTable::fillEmptyValues ( )
private

Fill any values that are not defined (usually when there are mismatched column lengths)

Definition at line 576 of file FormattedTable.C.

Referenced by dataStore(), makeGnuplot(), printCSV(), and printTablePiece().

577 {
578  for (auto & it : _data)
579  for (const auto & col_name : _column_names)
580  if (!it.second[col_name])
581  it.second[col_name] =
582  std::dynamic_pointer_cast<TableValueBase>(std::make_shared<TableValue<char>>('0'));
583 }
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ getLastData()

template<typename T >
T & FormattedTable::getLastData ( const std::string &  name)

Retrieve Data for last value of given name.

Definition at line 397 of file FormattedTable.h.

398 {
399  mooseAssert(!empty(), "No Data stored in the FormattedTable");
400 
401  auto & last_data_map = _data.rbegin()->second;
402  auto it = last_data_map.find(name);
403  if (it == last_data_map.end())
404  mooseError("No Data found for name: " + name);
405 
406  auto value = std::dynamic_pointer_cast<TableValue<T>>(it->second);
407  if (!value)
408  mooseError("Data for ", name, " is not of the requested type.");
409  return value->set();
410 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
bool empty() const
Returns a boolean value based on whether the FormattedTable contains data or not. ...
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...

◆ getLastTime()

Real FormattedTable::getLastTime ( )

Retrieve the last time (or independent variable) value.

Definition at line 192 of file FormattedTable.C.

Referenced by TableOutput::outputPostprocessors(), and TableOutput::outputReporter().

193 {
194  mooseAssert(!empty(), "No Data stored in the FormattedTable");
195  return _data.rbegin()->first;
196 }
bool empty() const
Returns a boolean value based on whether the FormattedTable contains data or not. ...
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...

◆ getWidthModes()

MooseEnum FormattedTable::getWidthModes ( )
static

Definition at line 586 of file FormattedTable.C.

Referenced by Console::validParams().

587 {
588  return MooseEnum("ENVIRONMENT=-1 AUTO=0 80=80 120=120 160=160", "ENVIRONMENT", true);
589 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:31

◆ makeGnuplot()

void FormattedTable::makeGnuplot ( const std::string &  base_file,
const std::string &  format 
)

Definition at line 474 of file FormattedTable.C.

Referenced by Gnuplot::output().

475 {
476  fillEmptyValues();
477 
478  // TODO: run this once at end of simulation, right now it runs every iteration
479  // TODO: do I need to be more careful escaping column names?
480  // Note: open and close the files each time, having open files may mess with gnuplot
481 
482  // supported filetypes: ps, png
483  std::string extension, terminal;
484  if (format == "png")
485  {
486  extension = ".png";
487  terminal = "png";
488  }
489 
490  else if (format == "ps")
491  {
492  extension = ".ps";
493  terminal = "postscript";
494  }
495 
496  else if (format == "gif")
497  {
498  extension = ".gif";
499  terminal = "gif";
500  }
501 
502  else
503  mooseError("gnuplot format \"" + format + "\" is not supported.");
504 
505  // Write the data to disk
506  std::string dat_name = base_file + ".dat";
507  std::ofstream datfile;
508  datfile.open(dat_name.c_str(), std::ios::trunc | std::ios::out);
509  if (datfile.fail())
510  mooseError("Unable to open file ", dat_name);
511 
512  datfile << "# time";
513  for (const auto & col_name : _column_names)
514  datfile << '\t' << col_name;
515  datfile << '\n';
516 
517  for (auto & data_it : _data)
518  {
519  datfile << data_it.first;
520  for (const auto & col_name : _column_names)
521  {
522  auto & tmp = data_it.second;
523  datfile << '\t' << *tmp[col_name];
524  }
525  datfile << '\n';
526  }
527  datfile.flush();
528  datfile.close();
529 
530  // Write the gnuplot script
531  std::string gp_name = base_file + ".gp";
532  std::ofstream gpfile;
533  gpfile.open(gp_name.c_str(), std::ios::trunc | std::ios::out);
534  if (gpfile.fail())
535  mooseError("Unable to open file ", gp_name);
536 
537  gpfile << gnuplot::before_terminal << terminal << gnuplot::before_ext << extension
539 
540  // plot all postprocessors in one plot
541  int column = 2;
542  for (const auto & col_name : _column_names)
543  {
544  gpfile << " '" << dat_name << "' using 1:" << column << " title '" << col_name
545  << "' with linespoints";
546  column++;
547  if (column - 2 < static_cast<int>(_column_names.size()))
548  gpfile << ", \\\n";
549  }
550  gpfile << "\n\n";
551 
552  // plot the postprocessors individually
553  column = 2;
554  for (const auto & col_name : _column_names)
555  {
556  gpfile << "set output '" << col_name << extension << "'\n";
557  gpfile << "set ylabel '" << col_name << "'\n";
558  gpfile << "plot '" << dat_name << "' using 1:" << column << " title '" << col_name
559  << "' with linespoints\n\n";
560  column++;
561  }
562 
563  gpfile.flush();
564  gpfile.close();
565 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
const std::string after_ext
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...
const std::string before_ext
const std::string before_terminal
void fillEmptyValues()
Fill any values that are not defined (usually when there are mismatched column lengths) ...

◆ open()

void FormattedTable::open ( const std::string &  file_name)
private

Open or switch the underlying file stream to point to file_name. This is idempotent.

Definition at line 121 of file FormattedTable.C.

Referenced by printCSV(), and printTable().

122 {
123  if (_output_file.is_open() && _output_file_name == file_name)
124  return;
125  close();
126  _output_file_name = file_name;
127 
128  std::ios_base::openmode open_flags = std::ios::out;
129  if (_append)
130  open_flags |= std::ios::app;
131  else
132  {
133  open_flags |= std::ios::trunc;
134  _output_row_index = 0;
135  _headers_output = false;
136  }
137 
138  _output_file.open(file_name.c_str(), open_flags);
139  if (_output_file.fail())
140  mooseError("Unable to open file ", file_name);
141 }
std::string _output_file_name
The optional output file stream.
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
void close()
Close the underlying output file stream if any. This is idempotent.
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
bool _headers_output
Keeps track of whether the header has been output.
bool _append
Keeps track of whether we want to open an existing file for appending or overwriting.

◆ outputTimeColumn()

void FormattedTable::outputTimeColumn ( bool  output_time)
inline

Set whether or not to output time column.

Definition at line 183 of file FormattedTable.h.

Referenced by TableOutput::outputReporter(), TableOutput::outputVectorPostprocessors(), and TableOutput::TableOutput().

183 { _output_time = output_time; }
bool _output_time
Whether or not to output the Time column.

◆ printCSV()

void FormattedTable::printCSV ( const std::string &  file_name,
int  interval = 1,
bool  align = false 
)

Method for dumping the table to a csv file - opening and closing the file handle is handled.

Note: Only call this on processor 0!

When the alignment option is set to true, the widths of the columns needs to be computed based on longest of the column name of the data supplied. This is done here by creating a map of the widths for each of the columns, including time

Definition at line 350 of file FormattedTable.C.

Referenced by CSV::output().

351 {
352  fillEmptyValues();
353 
354  open(file_name);
355 
356  if (_output_row_index == 0)
357  {
364  if (align)
365  {
366  // Set the initial width to the names of the columns
367  _align_widths["time"] = 4;
368 
369  for (const auto & col_name : _column_names)
370  _align_widths[col_name] = col_name.size();
371 
372  // Loop through the various times
373  for (const auto & it : _data)
374  {
375  // Update the time _align_width
376  {
377  std::ostringstream oss;
378  oss << std::setprecision(_csv_precision) << it.first;
379  unsigned int w = oss.str().size();
380  _align_widths["time"] = std::max(_align_widths["time"], w);
381  }
382 
383  // Loop through the data for the current time and update the _align_widths
384  for (const auto & jt : it.second)
385  {
386  std::ostringstream oss;
387  oss << std::setprecision(_csv_precision) << *jt.second;
388  unsigned int w = oss.str().size();
389  _align_widths[jt.first] = std::max(_align_widths[jt.first], w);
390  }
391  }
392  }
393 
394  // Output Header
395  if (!_headers_output)
396  {
397  if (_output_time)
398  {
399  if (align)
400  _output_file << std::setw(_align_widths["time"]) << "time";
401  else
402  _output_file << "time";
403  _headers_output = true;
404  }
405 
406  for (const auto & col_name : _column_names)
407  {
408  if (_headers_output)
410 
411  if (align)
412  _output_file << std::right << std::setw(_align_widths[col_name]) << col_name;
413  else
414  _output_file << col_name;
415  _headers_output = true;
416  }
417  _output_file << "\n";
418  }
419  }
420 
421  for (; _output_row_index < _data.size(); ++_output_row_index)
422  {
423  if (_output_row_index % interval == 0)
425  }
426 
427  _output_file.flush();
428 }
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
void open(const std::string &file_name)
Open or switch the underlying file stream to point to file_name. This is idempotent.
bool _output_time
Whether or not to output the Time column.
void printRow(std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase >>> &row_data, bool align)
std::string _csv_delimiter
*.csv file delimiter, defaults to ","
auto max(const L &left, const R &right)
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
std::map< std::string, unsigned int > _align_widths
Alignment widths (only used if asked to print aligned to CSV output)
unsigned int _csv_precision
*.csv file precision, defaults to 14
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...
bool _headers_output
Keeps track of whether the header has been output.
void fillEmptyValues()
Fill any values that are not defined (usually when there are mismatched column lengths) ...

◆ printEnsight()

void FormattedTable::printEnsight ( const std::string &  file_name)

◆ printNoDataRow()

void FormattedTable::printNoDataRow ( char  intersect_char,
char  fill_char,
std::ostream &  out,
std::map< std::string, unsigned short > &  col_widths,
std::vector< std::string >::iterator &  col_begin,
std::vector< std::string >::iterator &  col_end 
) const
protected

Definition at line 217 of file FormattedTable.C.

Referenced by printOmittedRow(), and printRowDivider().

223 {
224  out.fill(fill_char);
225  out << std::right << intersect_char;
226  if (_output_time)
227  out << std::setw(_column_width + 2) << intersect_char;
228  for (auto header_it = col_begin; header_it != col_end; ++header_it)
229  out << std::setw(col_widths[*header_it] + 2) << intersect_char;
230  out << "\n";
231 
232  // Clear the fill character
233  out.fill(' ');
234 }
bool _output_time
Whether or not to output the Time column.
static const unsigned short _column_width
The single cell width used for all columns in the table.
OStreamProxy out

◆ printOmittedRow()

void FormattedTable::printOmittedRow ( std::ostream &  out,
std::map< std::string, unsigned short > &  col_widths,
std::vector< std::string >::iterator &  col_begin,
std::vector< std::string >::iterator &  col_end 
) const
protected

Definition at line 199 of file FormattedTable.C.

Referenced by printTablePiece().

203 {
204  printNoDataRow(':', ' ', out, col_widths, col_begin, col_end);
205 }
void printNoDataRow(char intersect_char, char fill_char, std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const

◆ printRow()

void FormattedTable::printRow ( std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase >>> &  row_data,
bool  align 
)
private

Definition at line 431 of file FormattedTable.C.

Referenced by printCSV().

433 {
434  bool first = true;
435 
436  if (_output_time)
437  {
438  if (align)
439  _output_file << std::setprecision(_csv_precision) << std::right
440  << std::setw(_align_widths["time"]) << row_data.first;
441  else
442  _output_file << std::setprecision(_csv_precision) << row_data.first;
443  first = false;
444  }
445 
446  for (const auto & col_name : _column_names)
447  {
448  std::map<std::string, std::shared_ptr<TableValueBase>> & tmp = row_data.second;
449 
450  if (!first)
452  else
453  first = false;
454 
455  if (align)
456  _output_file << std::setprecision(_csv_precision) << std::right
457  << std::setw(_align_widths[col_name]) << *tmp[col_name];
458  else
459  _output_file << std::setprecision(_csv_precision) << *tmp[col_name];
460  }
461  _output_file << "\n";
462 }
bool _output_time
Whether or not to output the Time column.
std::string _csv_delimiter
*.csv file delimiter, defaults to ","
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
std::map< std::string, unsigned int > _align_widths
Alignment widths (only used if asked to print aligned to CSV output)
unsigned int _csv_precision
*.csv file precision, defaults to 14
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ printRowDivider()

void FormattedTable::printRowDivider ( std::ostream &  out,
std::map< std::string, unsigned short > &  col_widths,
std::vector< std::string >::iterator &  col_begin,
std::vector< std::string >::iterator &  col_end 
) const
protected

Definition at line 208 of file FormattedTable.C.

Referenced by printTablePiece().

212 {
213  printNoDataRow('+', '-', out, col_widths, col_begin, col_end);
214 }
void printNoDataRow(char intersect_char, char fill_char, std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const

◆ printTable() [1/3]

void FormattedTable::printTable ( std::ostream &  out,
unsigned int  last_n_entries = 0 
)

Methods for dumping the table to the stream - either by filename or by stream handle.

If a filename is supplied opening and closing of the file is properly handled. In the screen version of the method, an optional parameters can be passed to print only the last "n" entries. A value of zero means don't skip any rows

Note: Only call these from processor 0!

Definition at line 244 of file FormattedTable.C.

Referenced by AutomaticMortarGeneration::msmStatistics(), Console::outputPostprocessors(), Console::outputReporters(), Console::outputScalarVariables(), and printTable().

245 {
246  printTable(out, last_n_entries, MooseEnum("ENVIRONMENT=-1", "ENVIRONMENT"));
247 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:31
void printTable(std::ostream &out, unsigned int last_n_entries=0)
Methods for dumping the table to the stream - either by filename or by stream handle.

◆ printTable() [2/3]

void FormattedTable::printTable ( std::ostream &  out,
unsigned int  last_n_entries,
const MooseEnum suggested_term_width 
)

Definition at line 250 of file FormattedTable.C.

253 {
254  unsigned short term_width;
255 
256  if (suggested_term_width == "ENVIRONMENT")
257  term_width = MooseUtils::getTermWidth(true);
258  else if (suggested_term_width == "AUTO")
259  term_width = MooseUtils::getTermWidth(false);
260  else
261  term_width = MooseUtils::stringToInteger(suggested_term_width);
262 
263  if (term_width < _min_pps_width)
264  term_width = _min_pps_width;
265 
266  std::vector<std::string>::iterator col_it = _column_names.begin();
267  std::vector<std::string>::iterator col_end = _column_names.end();
268 
269  std::vector<std::string>::iterator curr_begin = col_it;
270  std::vector<std::string>::iterator curr_end;
271  while (col_it != col_end)
272  {
273  std::map<std::string, unsigned short> col_widths;
274  unsigned int curr_width = _column_width + 4;
275  unsigned int cols_in_group = 0;
276  while (curr_width < term_width && col_it != col_end)
277  {
278  curr_end = col_it;
279  col_widths[*col_it] = col_it->length() > _column_width ? col_it->length() + 1 : _column_width;
280 
281  curr_width += col_widths[*col_it] + 3;
282  ++col_it;
283  ++cols_in_group;
284  }
285  if (col_it != col_end && cols_in_group >= 2)
286  {
287  // curr_width -= col_widths[*curr_end];
288  col_widths.erase(*curr_end);
289  col_it = curr_end;
290  }
291  else
292  curr_end = col_it;
293 
294  printTablePiece(out, last_n_entries, col_widths, curr_begin, curr_end);
295  curr_begin = curr_end;
296  }
297 }
void printTablePiece(std::ostream &out, unsigned int last_n_entries, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end)
int stringToInteger(const std::string &input, bool throw_on_failure=false)
Robust string to integer conversion that fails for cases such at "1foo".
Definition: MooseUtils.C:1062
static const unsigned short _min_pps_width
The absolute minimum PPS table width.
static const unsigned short _column_width
The single cell width used for all columns in the table.
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...
unsigned short getTermWidth(bool use_environment)
Returns the width of the terminal using sys/ioctl.
Definition: MooseUtils.C:626

◆ printTable() [3/3]

void FormattedTable::printTable ( const std::string &  file_name)

Definition at line 237 of file FormattedTable.C.

238 {
239  open(file_name);
241 }
void open(const std::string &file_name)
Open or switch the underlying file stream to point to file_name. This is idempotent.
std::ofstream _output_file
The stream handle (corresponds to _output_file_name)
void printTable(std::ostream &out, unsigned int last_n_entries=0)
Methods for dumping the table to the stream - either by filename or by stream handle.

◆ printTablePiece()

void FormattedTable::printTablePiece ( std::ostream &  out,
unsigned int  last_n_entries,
std::map< std::string, unsigned short > &  col_widths,
std::vector< std::string >::iterator &  col_begin,
std::vector< std::string >::iterator &  col_end 
)
protected

Print out the header row

Definition at line 300 of file FormattedTable.C.

Referenced by printTable().

305 {
306  fillEmptyValues();
310  printRowDivider(out, col_widths, col_begin, col_end);
311  out << "|";
312  if (_output_time)
313  out << std::setw(_column_width) << std::left << " time"
314  << " |";
315  for (auto header_it = col_begin; header_it != col_end; ++header_it)
316  out << " " << std::setw(col_widths[*header_it]) << *header_it << "|";
317  out << "\n";
318  printRowDivider(out, col_widths, col_begin, col_end);
319 
320  auto data_it = _data.begin();
321  if (last_n_entries)
322  {
323  if (_data.size() > last_n_entries)
324  {
325  // Print a blank row to indicate that values have been ommited
326  printOmittedRow(out, col_widths, col_begin, col_end);
327 
328  // Jump to the right place in the vector
329  data_it += _data.size() - last_n_entries;
330  }
331  }
332  // Now print the remaining data rows
333  for (; data_it != _data.end(); ++data_it)
334  {
335  out << "|";
336  if (_output_time)
337  out << std::right << std::setw(_column_width) << std::scientific << data_it->first << " |";
338  for (auto header_it = col_begin; header_it != col_end; ++header_it)
339  {
340  auto & tmp = data_it->second;
341  out << std::setw(col_widths[*header_it]) << *tmp[*header_it] << " |";
342  }
343  out << "\n";
344  }
345 
346  printRowDivider(out, col_widths, col_begin, col_end);
347 }
void printOmittedRow(std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const
bool _output_time
Whether or not to output the Time column.
void printRowDivider(std::ostream &out, std::map< std::string, unsigned short > &col_widths, std::vector< std::string >::iterator &col_begin, std::vector< std::string >::iterator &col_end) const
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
static const unsigned short _column_width
The single cell width used for all columns in the table.
OStreamProxy out
void fillEmptyValues()
Fill any values that are not defined (usually when there are mismatched column lengths) ...

◆ setDelimiter()

void FormattedTable::setDelimiter ( std::string  delimiter)
inline

By default printCSV places "," between each entry, this allows this to be changed.

Definition at line 217 of file FormattedTable.h.

Referenced by CSV::initialSetup().

std::string _csv_delimiter
*.csv file delimiter, defaults to ","
charT const * delimiter
Definition: InfixIterator.h:34

◆ setPrecision()

void FormattedTable::setPrecision ( unsigned int  precision)
inline

By default printCSV prints output to a precision of 14, this allows this to be changed.

Definition at line 222 of file FormattedTable.h.

Referenced by CSV::initialSetup().

222 { _csv_precision = precision; }
unsigned int _csv_precision
*.csv file precision, defaults to 14

◆ sortColumns()

void FormattedTable::sortColumns ( )

Sorts columns alphabetically.

Definition at line 592 of file FormattedTable.C.

Referenced by CSV::output(), Console::outputPostprocessors(), Console::outputReporters(), and Console::outputScalarVariables().

593 {
595  {
596  std::sort(_column_names.begin(), _column_names.end());
597  _column_names_unsorted = false;
598  }
599 }
bool _column_names_unsorted
Flag indicating that sorting is necessary (used by sortColumns method).
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...

◆ writeExodus()

void FormattedTable::writeExodus ( ExodusII_IO *  ex_out,
Real  time 
)

Friends And Related Function Documentation

◆ dataLoad

void dataLoad ( std::istream &  stream,
FormattedTable v,
void context 
)
friend

Definition at line 39 of file FormattedTable.C.

40 {
41  loadHelper(stream, table._data, context);
42  loadHelper(stream, table._align_widths, context);
43  loadHelper(stream, table._column_names, context);
44  loadHelper(stream, table._output_row_index, context);
45  loadHelper(stream, table._headers_output, context);
46 }
void loadHelper(std::istream &stream, P &data, void *context)
Scalar helper routine.
Definition: DataIO.h:948

◆ dataStore

void dataStore ( std::ostream &  stream,
FormattedTable table,
void context 
)
friend

Definition at line 27 of file FormattedTable.C.

28 {
29  table.fillEmptyValues();
30  storeHelper(stream, table._data, context);
31  storeHelper(stream, table._align_widths, context);
32  storeHelper(stream, table._column_names, context);
33  storeHelper(stream, table._output_row_index, context);
34  storeHelper(stream, table._headers_output, context);
35 }
std::size_t _output_row_index
Keeps track of the index indicating which vector elements have been output.
void storeHelper(std::ostream &stream, P &data, void *context)
Scalar helper routine.
Definition: DataIO.h:856
std::vector< std::pair< Real, std::map< std::string, std::shared_ptr< TableValueBase > > > > _data
Data structure for the console table: The first part of the pair tracks the independent variable (nor...
std::map< std::string, unsigned int > _align_widths
Alignment widths (only used if asked to print aligned to CSV output)
std::vector< std::string > _column_names
The set of column names updated when data is inserted through the setter methods. ...
bool _headers_output
Keeps track of whether the header has been output.
void fillEmptyValues()
Fill any values that are not defined (usually when there are mismatched column lengths) ...

Member Data Documentation

◆ _align_widths

std::map<std::string, unsigned int> FormattedTable::_align_widths
protected

Alignment widths (only used if asked to print aligned to CSV output)

Definition at line 261 of file FormattedTable.h.

Referenced by dataLoad(), dataStore(), printCSV(), and printRow().

◆ _append

bool FormattedTable::_append
private

Keeps track of whether we want to open an existing file for appending or overwriting.

Definition at line 306 of file FormattedTable.h.

Referenced by append(), and open().

◆ _column_names

std::vector<std::string> FormattedTable::_column_names
protected

The set of column names updated when data is inserted through the setter methods.

Definition at line 264 of file FormattedTable.h.

Referenced by addData(), dataLoad(), dataStore(), fillEmptyValues(), makeGnuplot(), printCSV(), printRow(), printTable(), and sortColumns().

◆ _column_names_unsorted

bool FormattedTable::_column_names_unsorted = true
private

Flag indicating that sorting is necessary (used by sortColumns method).

Definition at line 318 of file FormattedTable.h.

Referenced by addData(), and sortColumns().

◆ _column_width

const unsigned short FormattedTable::_column_width = 15
staticprotected

The single cell width used for all columns in the table.

Definition at line 267 of file FormattedTable.h.

Referenced by printNoDataRow(), printTable(), and printTablePiece().

◆ _csv_delimiter

std::string FormattedTable::_csv_delimiter
private

*.csv file delimiter, defaults to ","

Definition at line 312 of file FormattedTable.h.

Referenced by printCSV(), printRow(), and setDelimiter().

◆ _csv_precision

unsigned int FormattedTable::_csv_precision
private

*.csv file precision, defaults to 14

Definition at line 315 of file FormattedTable.h.

Referenced by printCSV(), printRow(), and setPrecision().

◆ _data

std::vector<std::pair<Real, std::map<std::string, std::shared_ptr<TableValueBase> > > > FormattedTable::_data
protected

Data structure for the console table: The first part of the pair tracks the independent variable (normally time) and is associated with the second part of the table which is the map of dependent variables and their associated values.

Definition at line 258 of file FormattedTable.h.

Referenced by addData(), addRow(), clear(), dataLoad(), dataStore(), empty(), fillEmptyValues(), FormattedTable(), getLastData(), getLastTime(), makeGnuplot(), printCSV(), and printTablePiece().

◆ _headers_output

bool FormattedTable::_headers_output
private

Keeps track of whether the header has been output.

This is separate from _output_row_index because it's possible to output the header with zero rows. We don't consider this a bug, it helps users understand that they have declared vectors properly but maybe haven't populated them correctly.

Definition at line 303 of file FormattedTable.h.

Referenced by dataLoad(), dataStore(), open(), and printCSV().

◆ _min_pps_width

const unsigned short FormattedTable::_min_pps_width = 40
staticprotected

The absolute minimum PPS table width.

Definition at line 270 of file FormattedTable.h.

Referenced by printTable().

◆ _output_file

std::ofstream FormattedTable::_output_file
private

The stream handle (corresponds to _output_file_name)

Definition at line 289 of file FormattedTable.h.

Referenced by clear(), close(), FormattedTable(), open(), printCSV(), printRow(), and printTable().

◆ _output_file_name

std::string FormattedTable::_output_file_name
private

The optional output file stream.

Definition at line 286 of file FormattedTable.h.

Referenced by close(), and open().

◆ _output_row_index

std::size_t FormattedTable::_output_row_index
private

Keeps track of the index indicating which vector elements have been output.

All items with an index less than this index have been output. Higher values have not.

Definition at line 295 of file FormattedTable.h.

Referenced by clear(), dataLoad(), dataStore(), open(), and printCSV().

◆ _output_time

bool FormattedTable::_output_time
private

Whether or not to output the Time column.

Definition at line 309 of file FormattedTable.h.

Referenced by outputTimeColumn(), printCSV(), printNoDataRow(), printRow(), and printTablePiece().


The documentation for this class was generated from the following files: