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

并行计算

开发平台:

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. #pragma once
  19. #if !defined(__CUDACC__)
  20.     // Required for a successful compilation on Visual C++
  21.     #if defined(_MSC_VER)
  22.         // disable the warning: ' function ': was declared deprecated
  23.         #pragma warning (disable: 4996)
  24.         // disable the warning: conditional expression is constant
  25.         #pragma warning (disable: 4127)
  26.         // Some functions in Visual C++ differ from those in the linux/unix environment
  27.         #define isnan _isnan
  28.         #define strncasecmp _strnicmp
  29.         #define snprintf _snprintf
  30.         #define inline __forceinline
  31.         #define SIZE_T_FLAG "I"
  32.     #else
  33.         #define SIZE_T_FLAG "Z"
  34.     #endif
  35. #endif
  36. #include "../autodock/autocomm.h"
  37. #if defined(FASTGRID)
  38.     #define APPNAME "FastGrid"
  39. #else
  40.     #define APPNAME "AutoGrid"
  41. #endif
  42. // Copied from autodock/constants.h (to avoid compile errors)
  43. enum Unbound_Model { Unbound_Default=0, Unbound_Same_As_Bound=1, Extended=2, Compact=3, User=4 };
  44. #if !defined(__CUDACC__)
  45.     #undef X
  46.     #undef Y
  47.     #undef Z
  48.     #undef XYZ
  49.     #include <cmath>
  50.     #include <cfloat>
  51.     #if defined(AG_OPENMP)
  52.         #include <omp.h>
  53.     #endif
  54.     #include "Math.h"
  55.     // These options needs to be specified in the command-line arguments of your
  56.     // compiler (G++, CMake) or in the project settings (VC++):
  57.     // Defining AG_OPENMP enables the OpenMP support.
  58.     // Defining AG_CUDA enables the NVIDIA CUDA support.
  59.     //
  60.     // OpenMP is enabled by default in VC++ 2008 and automatically detected in CMake.
  61.     // CUDA is enabled by default everywhere because the automatic detection hasn't been implemented yet.
  62.     //
  63.     // Always use the Release configuration in VC++.
  64. #endif
  65. // Macros
  66. // Using a greater value of MAX_DIST might increase precision a little,
  67. // but keep in mind that this is a factor of application memory usage
  68. #define MAX_DIST                (1<<13) // 2^13 = 8192 = 81.92 Angstroms. Maximum distance in 100ths of an Angstrom.
  69. #define NBCUTOFF                8       // non-bond cutoff = 8 Angstroms.
  70. #define AG_MAX_ATOMS            ((1u<<31)-1) // 2^31 - 1. Maximum number of atoms in macromolecule.
  71. #define A_DIVISOR               100     // Angstrom is divided by this in the look-up table.
  72. #define MAX_LEN_AUTOGRID_TYPE   7
  73. #define NUM_ALL_TYPES           32      // TODO: IS THIS REASONABLE???
  74. #define NUM_RECEPTOR_TYPES      NUM_ALL_TYPES
  75. #define INIT_NUM_GRID_PTS       UINT_MAX // Max number of grid points per axis.
  76. #if !defined(AG_CALLCONV)
  77.     #define AG_CALLCONV
  78. #endif
  79. // Functions
  80. #define DDD_FACTOR 332 // Used to convert between calories and SI units
  81. // Distance-dependent dielectric ewds: Mehler and Solmajer, Prot Eng 4, 903-910.
  82. template<typename T>
  83. inline AG_CALLCONV T calculateDistDepDielInv(T distance)
  84. {
  85.     // Optimized formula is given by:
  86.     T E = exp(T(-0.3153767175) * distance);
  87.     return (T(DDD_FACTOR) + T(DDD_FACTOR * 7.7839) * E) / (T(78.4) + T(-66.57180475) * E);
  88. }
  89. template<typename Float, typename Int>
  90. inline AG_CALLCONV Float indexToAngstrom(Int i)
  91. {
  92.     return Float(i) * (1 / Float(A_DIVISOR));
  93. }
  94. template<typename Int, typename Float>
  95. inline AG_CALLCONV Int angstromToIndex(Float r)
  96. {
  97.     Int index = Int(r * Float(A_DIVISOR));
  98.     return min(index, Int(MAX_DIST-1)); // make sure lookup index is in the table
  99. }
  100. #if !defined(__CUDACC__)
  101.     inline double roundOutput(double a)
  102.     {
  103.         return fabs(a) < 0.0005 ? 0 : Mathd::Round(a * 1000) * 0.001; // round to 3 decimal places
  104.     }
  105.     inline int align(int value, int size)
  106.     {
  107.         return ((value - 1) / size + 1) * size;
  108.     }
  109.     // Useful macros - loop over all grid points
  110.     #define FOR_EACH_GRID_POINT(gridPos, outputIndex) 
  111.         /* Z axis */ 
  112.         for (int z = 0; z < input->numGridPoints.z; z++) 
  113.         { 
  114.             /* gridPos contains the current grid point. */ 
  115.             Vec3d gridPos; 
  116.             gridPos.z = (z - input->numGridPointsDiv2.z) * input->gridSpacing; 
  117.             int outputOffsetZBase = z * input->numGridPoints.x*input->numGridPoints.y; 
  118.     
  119.             /* Y axis */ 
  120.             for (int y = 0; y < input->numGridPoints.y; y++) 
  121.             { 
  122.                 gridPos.y = (y - input->numGridPointsDiv2.y) * input->gridSpacing; 
  123.                 int outputOffsetZYBase = outputOffsetZBase + y * input->numGridPoints.x; 
  124.     
  125.                 /* X axis */ 
  126.                 for (int x = 0; x < input->numGridPoints.x; x++) 
  127.                 { 
  128.                     gridPos.x = (x - input->numGridPointsDiv2.x) * input->gridSpacing; 
  129.                     int outputIndex = outputOffsetZYBase + x;
  130.     #define END_FOR() } } }
  131. #endif