42 #ifndef TEUCHOS_TABULAR_OUTPUTTER_HPP 43 #define TEUCHOS_TABULAR_OUTPUTTER_HPP 46 #include "Teuchos_FancyOStream.hpp" 48 #include "Teuchos_Tuple.hpp" 51 #include "Teuchos_Exceptions.hpp" 69 enum { numFieldTypes = 3 };
73 enum { numFieldJustifications = 2 };
77 enum { numFloatingOutputTypes = 2 };
107 void pushFieldSpec(
const std::string &fieldName,
118 void setFieldTypePrecision(
const EFieldType fieldType,
const int prec );
125 void outputField(
const T& t );
128 void nextRow(
const bool allowRemainingFields =
false);
135 FieldSpec(std::string fieldName_in,
EFieldType fieldType_in,
138 const int outputWidth_in
140 :fieldName(fieldName_in), fieldType(fieldType_in),
141 fieldJustification(fieldJustification_in),
142 floatingOutputType(floatingOutputType_in),
143 outputWidth(outputWidth_in),
146 std::string fieldName;
147 EFieldType fieldType;
148 EFieldJustification fieldJustification;
149 EFloatingOutputType floatingOutputType;
156 static const std::string fieldSpacer_;
160 #pragma warning(push) 161 #pragma warning(disable:4251) 163 Array<FieldSpec> fieldSpecs_;
164 RCP<FancyOStream> out_;
165 Tuple<int,numFieldTypes> fieldTypePrecision_;
179 double adjustTime(
const double &time_in )
181 return ( time_in > 0.0 ? time_in : -1.0 );
186 void startTimer(
const int numLoops)
190 numLoops_ = numLoops;
199 const double relTime =
200 adjustTime(timer_.totalElapsedTime()) / numLoops_;
214 #define TEUCHOS_START_PERF_OUTPUT_TIMER(OUTPUTTER, NUMLOOPS) \ 215 (OUTPUTTER).startTimer(NUMLOOPS); \ 216 for ( int k = 0; k < (NUMLOOPS); ++k ) 220 #define TEUCHOS_START_PERF_OUTPUT_TIMER_INNERLOOP(OUTPUTTER, NUMLOOPS, NUMINNERLOOPS) \ 221 (OUTPUTTER).startTimer((NUMLOOPS)*(NUMINNERLOOPS)); \ 222 for ( int k = 0; k < (NUMLOOPS); ++k ) 226 #define TEUCHOS_START_PERF_OUTPUT_TIMER_INNERLOOP(OUTPUTTER, NUMLOOPS, NUMINNERLOOPS) \ 227 (OUTPUTTER).startTimer((NUMLOOPS)*(NUMINNERLOOPS)); \ 228 for ( int k = 0; k < (NUMLOOPS); ++k ) 234 #define TEUCHOS_END_PERF_OUTPUT_TIMER(OUTPUTTER, VARNAME) \ 235 const double VARNAME = (OUTPUTTER).stopTimer(); \ 236 (OUTPUTTER).outputField(VARNAME) 254 "Error, you can not output a field until you print the header with" 258 !(currFieldIdx_ < as<int>(fieldSpecs_.size())),
260 "Error, you have already output all of the " 261 << fieldSpecs_.size() <<
" fields for this tabular output." 262 " You must call nextRow() before outputting to the next row." 266 FieldSpec &fieldSpec = fieldSpecs_[currFieldIdx_];
268 *out_ << fieldSpacer_ << std::setprecision(fieldSpec.precision);
270 switch(fieldSpec.fieldJustification) {
282 switch(fieldSpec.floatingOutputType) {
284 *out_ << std::scientific;
294 *out_ << setw(fieldSpec.outputWidth) << t;
305 #endif // TEUCHOS_TABULAR_OUTPUTTER_HPP void outputField(const T &t)
Output to the next field.
Basic wall-clock timer class.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
Utility class that makes it easy to create formatted tables of output.
Templated array class derived from the STL std::vector.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos, as well as a number of utility routines.
Smart reference counting pointer class for automatic garbage collection.
Base exception class for Teuchos.
Reference-counted pointer class and non-member templated function implementations.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call...