24 Loggable::LoggerMonitor Loggable::logger_monitor;
26 std::map<std::string, bool> Loggable::logger_written;
28 Loggable::Loggable(
bool verbose_output, callbackFn verbose_callback) : verbose_output(verbose_output), verbose_callback(verbose_callback)
32 bool Loggable::get_verbose_output()
const
34 return this->verbose_output;
37 Loggable::callbackFn Loggable::get_verbose_callback()
const
39 return this->verbose_callback;
42 void Loggable::Static::info(
const char* msg, ...)
45 char* text_contents = text + 1;
53 va_start(arglist, msg);
54 vsprintf(text_contents, msg, arglist);
59 HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
62 WORD console_attr_red = FOREGROUND_RED, console_attr_green = FOREGROUND_GREEN, console_attr_blue = FOREGROUND_BLUE;
64 WORD console_attrs = 0;
65 console_attrs |= console_attr_green;
68 SetConsoleTextAttribute(h_console, console_attrs);
72 BOOL write_success = WriteConsoleA(h_console, text_contents, strlen(text_contents), &num_written, NULL);
73 std::cout << std::endl;
77 # define FOREGROUND_RED 1
78 # define FOREGROUND_GREEN 2
79 # define FOREGROUND_BLUE 4
81 int console_attrs = 0;
82 bool console_bold =
true;
84 printf(
"\033[%dm", console_attrs + 30);
91 printf(
"%s\033[0m\n", text_contents);
96 void Loggable::Static::warn(
const char* msg, ...)
99 char* text_contents = text + 1;
107 va_start(arglist, msg);
108 vsprintf(text_contents, msg, arglist);
113 HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
116 WORD console_attr_red = FOREGROUND_RED, console_attr_green = FOREGROUND_GREEN, console_attr_blue = FOREGROUND_BLUE;
118 WORD console_attrs = 0;
119 console_attrs |= console_attr_red | console_attr_green;
122 SetConsoleTextAttribute(h_console, console_attrs);
126 BOOL write_success = WriteConsoleA(h_console, text_contents, strlen(text_contents), &num_written, NULL);
127 std::cout << std::endl;
130 # define FOREGROUND_RED 1
131 # define FOREGROUND_GREEN 2
132 # define FOREGROUND_BLUE 4
134 int console_attrs = 1;
135 console_attrs |= FOREGROUND_RED | FOREGROUND_GREEN;
136 bool console_bold =
false;
138 printf(
"\033[%dm", console_attrs + 30);
145 printf(
"%s\033[0m\n", text_contents);
150 void Loggable::Static::error(
const char* msg, ...)
153 char* text_contents = text + 1;
161 va_start(arglist, msg);
162 vsprintf(text_contents, msg, arglist);
167 HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
170 WORD console_attr_red = FOREGROUND_RED, console_attr_green = FOREGROUND_GREEN, console_attr_blue = FOREGROUND_BLUE;
172 WORD console_attrs = 0;
173 console_attrs |= console_attr_red;
176 SetConsoleTextAttribute(h_console, console_attrs);
180 BOOL write_success = WriteConsoleA(h_console, text_contents, strlen(text_contents), &num_written, NULL);
181 std::cout << std::endl;
184 # define FOREGROUND_RED 1
185 # define FOREGROUND_GREEN 2
186 # define FOREGROUND_BLUE 4
188 int console_attrs = 1;
189 console_attrs |= FOREGROUND_RED;
190 bool console_bold =
false;
192 printf(
"\033[%dm", console_attrs + 30);
199 printf(
"%s\033[0m\n", text_contents);
204 void Loggable::error(
const char* msg, ...)
const
206 if(!this->verbose_output)
210 char* text_contents = text + 1;
218 va_start(arglist, msg);
219 vsprintf(text_contents, msg, arglist);
224 void Loggable::error_if(
bool cond,
const char* msg, ...)
const
226 if(!this->verbose_output)
232 char* text_contents = text + 1;
240 va_start(arglist, msg);
241 vsprintf(text_contents, msg, arglist);
247 void Loggable::warn(
const char* msg, ...)
const
249 if(!this->verbose_output)
253 char* text_contents = text + 1;
261 va_start(arglist, msg);
262 vsprintf(text_contents, msg, arglist);
267 void Loggable::warn_if(
bool cond,
const char* msg, ...)
const
269 if(!this->verbose_output)
275 char* text_contents = text + 1;
283 va_start(arglist, msg);
284 vsprintf(text_contents, msg, arglist);
289 void Loggable::info(
const char* msg, ...)
const
291 if(!this->verbose_output)
295 char* text_contents = text + 1;
303 va_start(arglist, msg);
304 vsprintf(text_contents, msg, arglist);
308 void Loggable::info_if(
bool cond,
const char* msg, ...)
const
310 if(!this->verbose_output)
316 char* text_contents = text + 1;
324 va_start(arglist, msg);
325 vsprintf(text_contents, msg, arglist);
331 bool Loggable::write_console(
const char code,
const char* text)
const
335 HANDLE h_console = GetStdHandle(STD_OUTPUT_HANDLE);
336 if(h_console == INVALID_HANDLE_VALUE)
340 CONSOLE_SCREEN_BUFFER_INFO console_info;
341 if(!GetConsoleScreenBufferInfo(h_console, &console_info))
345 WORD console_attr_red = FOREGROUND_RED, console_attr_green = FOREGROUND_GREEN, console_attr_blue = FOREGROUND_BLUE;
347 WORD console_attrs = 0;
351 case HERMES_EC_WARNING: console_attrs |= console_attr_red | console_attr_green;
break;
357 SetConsoleTextAttribute(h_console, console_attrs);
361 BOOL write_success = WriteConsoleA(h_console, text, strlen(text), &num_written, NULL);
364 SetConsoleTextAttribute(h_console, console_info.wAttributes);
372 # define FOREGROUND_RED 1
373 # define FOREGROUND_GREEN 2
374 # define FOREGROUND_BLUE 4
376 int console_attrs = 0;
377 bool console_bold =
false;
380 case HERMES_EC_WARNING: console_attrs |= FOREGROUND_RED | FOREGROUND_GREEN;
break;
385 printf(
"\033[%dm", console_attrs + 30);
392 printf(
"%s\033[0m", text);
398 Loggable::HermesLogEventInfo* Loggable::hermes_build_log_info(
char event)
const
400 return new Loggable::HermesLogEventInfo(event, HERMES_LOG_FILE,
__CURRENT_FUNCTION, __FILE__, __LINE__);
403 void Loggable::hermes_fwrite(
const void* ptr,
size_t size,
size_t nitems, FILE* stream)
const
405 if(fwrite(ptr, size, nitems, stream) != nitems || ferror(stream))
409 void Loggable::hermes_fread(
void* ptr,
size_t size,
size_t nitems, FILE* stream)
const
411 size_t ret = fread(ptr, size, nitems, stream);
414 else if(ferror(stream))
418 Loggable::HermesLogEventInfo::HermesLogEventInfo(
const char code,
const char* log_file,
const char* src_function,
const char* src_file,
const int src_line)
419 : code(code), log_file(log_file), src_function(src_function), src_file(src_file), src_line(src_line)
422 void Loggable::hermes_log_message(
const char code,
const char* msg)
const
424 logger_monitor.enter();
427 if(!write_console(code, msg))
431 HermesLogEventInfo* info = this->hermes_build_log_info(code);
434 if(info->log_file != NULL)
436 FILE* file = fopen(info->log_file,
"at");
440 std::map<std::string, bool>::const_iterator found = logger_written.find(info->log_file);
441 if(found == logger_written.end()) {
442 logger_written[info->log_file] =
true;
446 fprintf(file,
"\n\n");
450 std::ostringstream location;
452 if(info->src_function != NULL)
454 location << info->src_function;
455 if(info->src_file != NULL)
458 if(info->src_file != NULL)
459 location << info->src_file <<
':' << info->src_line;
465 struct tm* now_tm = gmtime(&now);
466 char time_buf[BUF_SZ];
467 strftime(time_buf, BUF_SZ,
"%y%m%d-%H:%M", now_tm);
470 fprintf(file,
"%s\t%s %s\n", time_buf, msg, location.str().c_str());
473 if(this->verbose_callback != NULL)
474 this->verbose_callback(msg);
480 logger_monitor.leave();
485 this->verbose_output = to_set;
490 this->verbose_callback = callback;
496 #ifdef WIN32 //Windows
498 if(QueryPerformanceFrequency(&freq))
499 frequency = (double)freq.QuadPart;
506 TimeMeasurable::SysTime TimeMeasurable::get_time()
const
508 #ifdef WIN32 //Windows
512 QueryPerformanceCounter(&ticks);
513 return ticks.QuadPart;
519 #elif defined(__APPLE__) //Mac
525 clock_gettime(CLOCK_REALTIME, &tm);
530 double TimeMeasurable::period_in_seconds(
const SysTime& begin,
const SysTime& end)
const
532 #ifdef WIN32 //Windows
533 uint64_t period = end - begin;
535 return period / frequency;
537 return period / (double)CLOCKS_PER_SEC;
540 long period_nsec = end.tv_nsec - begin.tv_nsec;
544 period_nsec += 1000000000UL;
546 long period_sec = (long)(end.tv_sec - begin.tv_sec) + sec_corr;
547 return period_sec + (period_nsec / 1E9);
553 SysTime cur_time = get_time();
556 double secs = period_in_seconds(last_time, cur_time);
563 last_time = cur_time;
578 return to_string(accum);
588 return to_string(last_period);
601 last_time = get_time();
606 std::string TimeMeasurable::to_string(
double secs)
const
612 int hours = (int) secs / (3600);
613 int mins = (int) fmod(secs, 3600) / 60;
614 secs = fmod(secs, 60);
616 std::stringstream str;
618 str << hours <<
"h ";
619 if(hours > 0 || mins > 0)
627 IntegrableWithGlobalOrder::IntegrableWithGlobalOrder() : global_integration_order_set(false), global_integration_order(0)
630 void IntegrableWithGlobalOrder::set_global_integration_order(
unsigned int order)
632 this->global_integration_order = order;
633 this->global_integration_order_set =
true;
636 SettableComputationTime::SettableComputationTime() : time(0.0), time_step(0.0)
645 void SettableComputationTime::set_time_step(
double time_step)
647 this->time_step = time_step;
650 OutputAttachable::OutputAttachable()
654 void OutputAttachable::on_initialization()
659 void OutputAttachable::on_step_begin()
664 void OutputAttachable::on_step_end()
669 void OutputAttachable::on_finish()