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

并行计算

开发平台:

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(_MSC_VER)
  19.     // disable the warning: ' function ': was declared deprecated
  20.     #pragma warning (disable: 4996)
  21. #endif
  22. // the BOINC API header files
  23. #if defined(BOINC)
  24.     #include "diagnostics.h"
  25.     #include "boinc_api.h"
  26.     #include "filesys.h"    // boinc_fopen(), etc...
  27. #endif
  28. #include "Utils.h"
  29. #include "Exceptions.h"
  30. #include "times.h"
  31. void saveAVSGridmapsFile(const GridMapList &gridmaps, const InputData *input, const ProgramParameters &programParams, LogFile &logFile)
  32. {
  33.     FILE *fldFileAVS;
  34.     if ((fldFileAVS = boincOpenFile(input->fldFilenameAVS, "w")) == 0)
  35.     {
  36.         logFile.printErrorFormatted(ERROR, "can't create grid dimensions data file %sn", input->fldFilenameAVS);
  37.         logFile.printError(FATAL_ERROR, "Unsuccessful completion.nn");
  38.     }
  39.     else
  40.         logFile.printFormatted("nCreating (AVS-readable) grid maps file : %sn", input->fldFilenameAVS);
  41.     int numMaps = gridmaps.getNumMapsInclFloatingGrid();
  42.     fprintf(fldFileAVS, "# AVS field filen#n");
  43.     fprintf(fldFileAVS, "# AutoDock Atomic Affinity and Electrostatic Gridsn#n");
  44.     fprintf(fldFileAVS, "# Created by %s.n#n", programParams.getProgramName());
  45.     fprintf(fldFileAVS, "#SPACING %.3fn", float(input->gridSpacing));
  46.     fprintf(fldFileAVS, "#NELEMENTS %d %d %dn", input->numGridPoints.x-1, input->numGridPoints.y-1, input->numGridPoints.z-1);
  47.     fprintf(fldFileAVS, "#CENTER %.3lf %.3lf %.3lfn", input->gridCenter.x, input->gridCenter.y, input->gridCenter.z);
  48.     fprintf(fldFileAVS, "#MACROMOLECULE %sn", input->receptorFilename);
  49.     fprintf(fldFileAVS, "#GRID_PARAMETER_FILE %sn#n", programParams.getGridParameterFilename());
  50.     fprintf(fldFileAVS, "ndim=3ttt# number of dimensions in the fieldn");
  51.     fprintf(fldFileAVS, "dim1=%dttt# number of x-elementsn", input->numGridPoints.x);
  52.     fprintf(fldFileAVS, "dim2=%dttt# number of y-elementsn", input->numGridPoints.y);
  53.     fprintf(fldFileAVS, "dim3=%dttt# number of z-elementsn", input->numGridPoints.z);
  54.     fprintf(fldFileAVS, "nspace=3tt# number of physical coordinates per pointn");
  55.     fprintf(fldFileAVS, "veclen=%dtt# number of affinity values at each pointn", numMaps);
  56.     fprintf(fldFileAVS, "data=floattt# data type (byte, integer, float, double)n");
  57.     fprintf(fldFileAVS, "field=uniformtt# field type (uniform, rectilinear, irregular)n");
  58.     for (int i = 0; i < 3; i++)
  59.         fprintf(fldFileAVS, "coord %d file=%s filetype=ascii offset=%dn", (i + 1), input->xyzFilename, (i * 2));
  60.     for (int i = 0; i < gridmaps.getNumAtomMaps(); i++)
  61.         fprintf(fldFileAVS, "label=%s-affinityt# component label for variable %dn", gridmaps[i].type, (i + 1));
  62.     fprintf(fldFileAVS, "label=Electrostaticst# component label for variable %dn", numMaps - 2);
  63.     fprintf(fldFileAVS, "label=Desolvationt# component label for variable %dn", numMaps - 1);
  64.     if (gridmaps.containsFloatingGrid())
  65.         fprintf(fldFileAVS, "label=Floating_Gridt# component label for variable %dn", numMaps);
  66.     fprintf(fldFileAVS, "#n# location of affinity grid files and how to read themn#n");
  67.     for (int i = 0; i < gridmaps.getNumMaps(); i++)
  68.         fprintf(fldFileAVS, "variable %d file=%s filetype=ascii skip=6n", (i + 1), gridmaps[i].filename);
  69.     if (gridmaps.containsFloatingGrid())
  70.         fprintf(fldFileAVS, "variable %d file=%s filetype=ascii skip=6n", numMaps, input->floatingGridFilename);
  71.     fclose(fldFileAVS);
  72. }
  73. // initializes BOINC
  74. void boincInit()
  75. {
  76. #if defined(BOINC)
  77.     boinc_init_diagnostics(BOINC_DIAG_DUMPCALLSTACKENABLED | BOINC_DIAG_HEAPCHECKENABLED | BOINC_DIAG_REDIRECTSTDERR | BOINC_DIAG_REDIRECTSTDOUT);
  78. #if defined(BOINCCOMPOUND)
  79.     BOINC_OPTIONS options;
  80.     options.main_program = false;
  81.     options.check_heartbeat = false;    // monitor does check heartbeat
  82.     options.handle_trickle_ups = false;
  83.     options.handle_trickle_downs = false;
  84.     options.handle_process_control = false;
  85.     options.send_status_msgs = true;    // only the worker programs (i.e. model) sends status msgs
  86.     options.direct_process_action = true;   // monitor handles suspend/quit, but app/model doesn't
  87.     // Initialization of Boinc
  88.     int rc = boinc_init_options(options);   // return 0 for success
  89.     if (rc)
  90.     {
  91.         fprintf(stderr, "BOINC_ERROR: boinc_init_options() failed n");
  92.         throw ExitProgram(rc);
  93.     }
  94. #else
  95.     // All BOINC applications must initialize the BOINC interface:
  96.     rc = boinc_init();
  97.     if (rc)
  98.     {
  99.         fprintf(stderr, "BOINC_ERROR: boinc_init() failed.n");
  100.         throw ExitProgram(rc);
  101.     }
  102. #endif
  103. #endif
  104. }
  105. void boincDone()
  106. {
  107. #if defined(BOINCCOMPOUND)
  108.     boinc_fraction_done(1);
  109. #endif
  110. #if defined(BOINC)
  111.     boinc_finish(0); // should not return
  112. #endif
  113. }
  114. // fopen rewrite to either use BOINC api or normal system call
  115. FILE *boincOpenFile(const char *path, const char *mode)
  116. {
  117.     FILE *filep;
  118. #if defined(BOINC)
  119.     int rc;
  120.     char resolved_name[512];
  121.     rc = boinc_resolve_filename(path, resolved_name, sizeof(resolved_name));
  122.     if (rc)
  123.     {
  124.         fprintf(stderr, "BOINC_ERROR: cannot open filename.%sn", path);
  125.         boinc_finish(rc);       // back to BOINC core
  126.     }
  127.     // Then open the file with boinc_fopen() not just fopen()
  128.     filep = boinc_fopen(resolved_name, mode);
  129. #else
  130.     filep = fopen(path, mode);
  131. #endif
  132.     return filep;
  133. }
  134. ///////////////////////////////////////////////////////////////////////////////////////////////////
  135. static Timer timers[256];
  136. struct Timer::Private
  137. {
  138. private:
  139.     friend class Timer;
  140.     const char *name;
  141.     clock_t real, user, sys;
  142.     clock_t realStart, userStart, sysStart;
  143. };
  144. Timer *Timer::startNew(const char *name, bool start)
  145. {
  146.     static int i = 0;
  147.     Timer *t = &timers[i++];
  148.     t->p->name = name;
  149.     if (start)
  150.         t->start();
  151.     return t;
  152. }
  153. Timer::Timer()
  154. {
  155.     p = new Private();
  156. }
  157. Timer::~Timer()
  158. {
  159.     delete p;
  160. }
  161. void Timer::start()
  162. {
  163.     tms t;
  164.     p->realStart = times(&t);
  165.     p->userStart = t.tms_utime;
  166.     p->sysStart = t.tms_stime;
  167. }
  168. void Timer::stop()
  169. {
  170.     tms t;
  171.     p->real += times(&t) - p->realStart;
  172.     p->user += t.tms_utime - p->userStart;
  173.     p->sys += t.tms_stime - p->sysStart;
  174. }
  175. void Timer::reset()
  176. {
  177.     p->real = 0;
  178.     p->user = 0;
  179.     p->sys = 0;
  180. }
  181. void Timer::log(FILE *file, bool reset)
  182. {
  183.     int cps = getClocksPerSec();
  184.     fprintf(file, "%s  Real: %li ms,tUser: %li ms,tSys: %li msn", p->name, p->real * 1000 / cps, p->user * 1000 / cps, p->sys * 1000 / cps);
  185.     fflush(file);
  186.     if (reset)
  187.         this->reset();
  188. }
  189. void Timer::stopAndLog(FILE *file, bool reset)
  190. {
  191.     stop();
  192.     log(file, reset);
  193. }
  194. void Timer::logAll(FILE *file)
  195. {
  196.     for (int i = 0; i < 256; i++)
  197.         if (timers[i].p->real != 0)
  198.             timers[i].log(file);
  199. }
  200. clock_t Timer::getReal() const
  201. {
  202.     return p->real;
  203. }
  204. clock_t Timer::getUser() const
  205. {
  206.     return p->user;
  207. }
  208. clock_t Timer::getSys() const
  209. {
  210.     return p->sys;
  211. }
  212. // Dummy graphics API entry points.  This app does not do graphics, but it still must provide these callbacks.
  213. #if defined(BOINC)
  214. void app_graphics_render(int xs, int ys, double time_of_day){}
  215. void app_graphics_reread_prefs(){}
  216. void boinc_app_mouse_move(int x, int y, bool left, bool middle, bool right){}
  217. void boinc_app_mouse_button(int x, int y, int which, bool is_down){}
  218. void boinc_app_key_press(int wParam, int lParam){}
  219. void boinc_app_key_release(int wParam, int lParam){}
  220. #endif