LogFile.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:12k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     FastGrid (formerly AutoGrid)
  3.     Copyright (C) 2009 The Scripps Research Institute. All rights reserved.
  4.     Copyright (C) 2009 Masaryk University. All rights reserved.
  5.     AutoGrid is a Trade Mark of The Scripps Research Institute.
  6.     This program is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU General Public License
  8.     as published by the Free Software Foundation; either version 2
  9.     of the License, or (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. */
  18. #if !defined(PACKAGE_BUGREPORT)
  19. #define PACKAGE_BUGREPORT "marao@mail.muni.cz"
  20. #endif
  21. #if defined(_WIN32)
  22.     #define WIN32_LEAN_AND_MEAN
  23.     #include <Winsock2.h>
  24. #else
  25.     #include <unistd.h>
  26. #endif
  27. #include <cstring>
  28. #include <cstdarg>
  29. #include "LogFile.h"
  30. #include "Exceptions.h"
  31. #include "Utils.h"
  32. #define FORMATTED_MSG_MAX_SIZE (1<<14)
  33. // Formats a message
  34. // The reason we use a macro instead of a function is that we need to access the variable number of arguments
  35. #define FORMAT_MESSAGE(message, messageLength, format) 
  36.         char message[FORMATTED_MSG_MAX_SIZE]; 
  37.         int messageLength; 
  38.         message[sizeof(message)-1] = 0; 
  39.         va_list ap; 
  40.         va_start(ap, format); 
  41.         messageLength = vsnprintf(message, sizeof(message), format, ap); 
  42.         /* if the message buffer is not long enough or hasn't been terminated by zero */ 
  43.         if (messageLength == -1 || message[sizeof(message)-1] != 0) 
  44.         { 
  45.             printError(WARNING, "The following formatted string will be truncated."); 
  46.             message[sizeof(message)-1] = 0; 
  47.             messageLength = sizeof(message)-1; 
  48.         } 
  49.         va_end(ap);
  50. LogFile::LogFile(const char *versionNumber, const char *programName, const char *filename): file(0), invClocksPerSec(1 / float(getClocksPerSec()))
  51. {
  52.     strncpy(this->programName, programName, MAX_CHARS);
  53.     // Initialize the log file
  54.     if (!filename || !filename[0])
  55.         file = stdout;
  56.     else
  57.     {
  58.         file = boincOpenFile(filename, "w");
  59.         if (!file)
  60.         {
  61.             fprintf(stderr, "n%s: Sorry, I can't create the log file "%s"n", programName, filename);
  62.             fprintf(stderr, "n%s: Unsuccessful Completion.nn", programName);
  63.             throw ExitProgram(911);
  64.         }
  65.     }
  66.     // Output basic information
  67.     printBanner(versionNumber);
  68.     fprintf(file, "                           $Revision: 1.71 $nnn"
  69.                   "nMaximum number of maps that can be computed = %d (defined by MAX_MAPS in "autocomm.h").nnn"
  70.                   "This file was created at:ttt", MAX_MAPS);
  71.     printCurrentDate(1);
  72.     printHostname();
  73.     print("nn");
  74. }
  75. LogFile::~LogFile()
  76. {
  77.     if (file && file != stdout)
  78.         fclose(file);
  79. }
  80. const char *LogFile::getProgramName() const
  81. {
  82.     return programName;
  83. }
  84. void LogFile::print(const char *msg)
  85. {
  86.     size_t len = strlen(msg);
  87.     if (!fwrite(msg, len, 1, file))
  88.         printError(FATAL_ERROR, "Not enough disk space.");
  89. }
  90. void LogFile::printFormatted(const char *format, ...)
  91. {
  92.     FORMAT_MESSAGE(message, messageLength, format);
  93.     if (!fwrite(message, messageLength, 1, file))
  94.         printError(FATAL_ERROR, "Not enough disk space.");
  95. }
  96. void LogFile::printTitled(const char *msg)
  97. {
  98.     fprintf(file, "%s: %s", programName, msg);
  99. }
  100. void LogFile::printTitledFormatted(const char *format, ...)
  101. {
  102.     FORMAT_MESSAGE(message, messageLength, format);
  103.     printTitled(message);
  104. }
  105. void LogFile::printError(ErrorLevel errorLevel, const char *msg)
  106. {
  107.     const char *tags[5] = {
  108.         "ERROR",
  109.         "ERROR",
  110.         "WARNING",
  111.         "INFORMATION",
  112.         "SUGGESTION"
  113.     };
  114.     char outputMessage[LINE_LEN];
  115.     snprintf(outputMessage, LINE_LEN, "n%s: %s:  %sn", programName, tags[errorLevel+2], msg);
  116.     size_t len = strlen(outputMessage);
  117.     if (!fwrite(outputMessage, len, 1, file) && errorLevel != FATAL_ERROR)
  118.         // if it's a fatal error, no need to care because the program will be terminated anyway
  119.         printError(FATAL_ERROR, "Not enough disk space.");
  120.     // Only send errors, fatal errors and warnings to standard error.
  121.     if (errorLevel <= WARNING)
  122.         if (!fwrite(outputMessage, len, 1, stderr) && errorLevel != FATAL_ERROR)
  123.             // the log file *might* still be writable...
  124.             printError(FATAL_ERROR, "Cannot write to standard error output.");
  125.     // If this is a fatal error, exit now.
  126.     if (errorLevel == FATAL_ERROR)
  127.         throw ExitProgram(errorLevel);
  128. }
  129. void LogFile::printErrorFormatted(ErrorLevel errorLevel, const char *format, ...)
  130. {
  131.     FORMAT_MESSAGE(message, messageLength, format);
  132.     printError(errorLevel, message);
  133. }
  134. void LogFile::printExecutionTimes(Clock startTime, Clock endTime, tms *start, tms *end)
  135. {
  136.     fprintf(file, "Real= %.2f,  CPU= %.2f,  System= %.2fn",
  137.         invClocksPerSec * (endTime - startTime),
  138.         invClocksPerSec * (end->tms_utime - start->tms_utime),
  139.         invClocksPerSec * (end->tms_stime - start->tms_stime));
  140. }
  141. void LogFile::printTimeInHMS(Clock time, bool fixedOutputLength)
  142. {
  143.     printTimeInHMS(invClocksPerSec * time, fixedOutputLength);
  144. }
  145. void LogFile::printTimeInHMS(float time, bool fixedOutputLength)
  146. {
  147.     float hrs = 3600, min = 60;
  148.     int h = int(time / hrs);
  149.     float T = time - h*hrs;
  150.     int m = int(T / min);
  151.     float s = T - m*min;
  152.     if (h == 0)
  153.         if (m == 0)
  154.             fprintf(file, fixedOutputLength ? "        %5.2fs" : "%.2fs", s);
  155.         else
  156.             fprintf(file, fixedOutputLength ? "    %2dm %05.2fs" : "%dm %05.2fs", m, s);
  157.     else
  158.         fprintf(file, fixedOutputLength ? "%2dh %02dm %05.2fs" : "%dh %02dm %05.2fs", h, m, s);
  159. }
  160. void LogFile::printExecutionTimesInHMS(Clock startTime, Clock endTime, tms *start, tms *end)
  161. {
  162.     print("Real= ");
  163.     printTimeInHMS(invClocksPerSec * (endTime - startTime), false);
  164.     print(",  CPU= ");
  165.     printTimeInHMS(invClocksPerSec * (end->tms_utime - start->tms_utime), false);
  166.     print(",  System= ");
  167.     printTimeInHMS(invClocksPerSec * (end->tms_stime  - start->tms_stime), false);
  168.     print("n");
  169. }
  170. // Output banner...
  171. void LogFile::printBanner(const char *versionNumber)
  172. {
  173.     fprintf(file,
  174.         "n       _______________________________________________________n"
  175.         "n"
  176. #if defined(FASTGRID)
  177.         "________///////_________________________/////_________________/________n"
  178.         "_______/_________________________/_____/______________/_______/________n"
  179.         "_______/_________________________/_____/______________________/________n"
  180.         "_______///////___/////___//////_/////__/__////_/_///__/__////_/________n"
  181.         "_______/______________/_/________/_____/_____/_//___/_/_/____//________n"
  182.         "_______/________///////__/////___/_____/_____/_/______/_/_____/________n"
  183.         "_______/_______/_____//_______/__/___/_/_____/_/______/_/____//________n"
  184.         "_______/________/////_/_//////____///___/////__/______/__////_/________n"
  185. #else
  186.         "__________//____________________________/////_________________/________n"
  187.         "_________/__/____________/_____________/______________/_______/________n"
  188.         "________/____/___________/_____________/______________________/________n"
  189.         "________/____/__/_____/_/////___/////__/__////_/_///__/__////_/________n"
  190.         "_______/______/_/_____/__/_____/_____/_/_____/_//___/_/_/____//________n"
  191.         "_______////////_/_____/__/_____/_____/_/_____/_/______/_/_____/________n"
  192.         "_______/______/_/____//__/___/_/_____/_/_____/_/______/_/____//________n"
  193.         "_______/______/__////_/___///___/////___/////__/______/__////_/________n"
  194. #endif
  195.         "n"
  196.         "       _______________________________________________________n"
  197.         "n"
  198.         "                                ______n"
  199.         "                               /      \n"
  200.         "                              /        \n"
  201.         "                             /          \n"
  202.         "                             \    /\    /n"
  203.         "                              \  /  \  /n"
  204.         "                               \/ /\ \/n"
  205.         "                                 /  \n"
  206.         "                                /____\n"
  207.         "n"
  208.         "n"
  209.         "                ______________________________________ n"
  210.         "               |                                      |n"
  211.         "               |            " APPNAME " %-8s         |n"
  212. #if defined(FASTGRID)
  213.         "               |                                      |n"
  214.         "               |          The fork of AutoGrid        |n"
  215.         "               |      optimized to fully leverage     |n"
  216.         "               |  the power of multi-core processors  |n"
  217.         "               |     and NVIDIA graphics hardware.    |n"
  218. #endif
  219.         "               |                                      |n"
  220.         "               |        Garrett M. Morris, TSRI       |n"
  221.         "               |            Ruth Huey, TSRI           |n"
  222.         "               |        David S. Goodsell, TSRI       |n"
  223.         "               |         Arthur J. Olson, TSRI        |n"
  224.         "               |         Marek Olsak, FI MUNI         |n"
  225.         "               |       Jiri Filipovic, NCBR MUNI      |n"
  226.         "               |                                      |n"
  227.         "               |        (C) 1989-2009, TSRI           |n"
  228.         "               |   The Scripps Research Institute     |n"
  229.         "               |                                      |n"
  230.         "               |           (C) 2009, MUNI             |n"
  231.         "               |          Masaryk University          |n"
  232.         "               |______________________________________|n"
  233.         "n"
  234.         "                ______________________________________ n"
  235.         "               |                                      |n"
  236.         "               | Calculation of van der Waals, H-Bond,|n"
  237.         "               |   Electrostatic Potential Energy, &  |n"
  238.         "               |   Desolvation Free Energy Grid Maps  |n"
  239.         "               |             for AutoDock             |n"
  240.         "               | For help, email %-19s |n"
  241.         "               |______________________________________|n"
  242.         "n"
  243.         "n"
  244.         "n"
  245.         "n", versionNumber, PACKAGE_BUGREPORT);
  246. }
  247. void LogFile::printCurrentDate(int flag)
  248. {
  249.     time_t timeNow;
  250.     timeNow = time(&timeNow);
  251.     tm *ts = localtime(&timeNow);
  252.     if (flag == 1)
  253.         fprintf(file, "%d:%02d %02d" %s, %02d/%02d/%4dn",
  254.             ((ts->tm_hour >  12) ? (ts->tm_hour-12) : ts->tm_hour), ts->tm_min, ts->tm_sec,
  255.             ((ts->tm_hour >= 12) ? "p.m." : "a.m."),
  256.             (ts->tm_mon + 1), ts->tm_mday, 1900+ts->tm_year);
  257.     else if (flag == 2)
  258.         fprintf(file, "%s", ctime(&timeNow));
  259.     else
  260.         fprintf(file, "%d:%02d %02d" %sn",
  261.             ((ts->tm_hour >  12) ? (ts->tm_hour-12) : ts->tm_hour), ts->tm_min, ts->tm_sec,
  262.             ((ts->tm_hour >= 12) ? "pm" : "am"));
  263. }
  264. void LogFile::printHostname()
  265. {
  266. #if defined(_WIN32)
  267.     WSADATA wsaData;
  268.     WSAStartup(MAKEWORD(2, 2), &wsaData);
  269. #endif
  270.     char buffer[MAX_CHARS];
  271.     if (gethostname(buffer, MAX_CHARS) != 0)
  272.         strncpy(buffer, "(gethostname returned an error)", MAX_CHARS);
  273. #if defined(_WIN32)
  274.     WSACleanup();
  275. #endif
  276.     fprintf(file, "                   using:ttt"%s"n", buffer);
  277. }