NAMD
LJTable.C
Go to the documentation of this file.
1 
7 #include "InfoStream.h"
8 #include "LJTable.h"
9 #include "Node.h"
10 #include "Parameters.h"
11 // #define DEBUGM
12 #include "Debug.h"
13 #include "Molecule.h"
14 
15 //----------------------------------------------------------------------
17 {
18  Bool soluteScalingOn = Node::Object()->simParameters->soluteScalingOn;
19  //Bool useLJPME = Node::Object()->simParameters->LJPMEOn;
20  Bool LJPMESerial = Node::Object()->simParameters->LJPMESerial;
21 
22  if (!soluteScalingOn) {
23  table_dim = Node::Object()->parameters->get_num_vdw_params();
24  } else {
25  int ss_dim = Node::Object()->molecule->ss_num_vdw_params;
26  table_dim = ss_dim + Node::Object()->parameters->get_num_vdw_params();
27  }
28  table_alloc = new char[2*table_dim*table_dim*sizeof(TableEntry) + 31];
29  char *table_align = table_alloc;
30  while ( (long)table_align % 32 ) table_align++;
31  table = (TableEntry *) table_align;
32  for (register int i=0; i < table_dim; i++)
33  for (register int j=i; j < table_dim; j++)
34  {
35  TableEntry *curij = &(table[2*(i*table_dim+j)]);
36  TableEntry *curji = &(table[2*(j*table_dim+i)]);
37  // Set the repulsion and dispersion to zero if we do LJ-PME
38  if (!LJPMESerial) {
39  compute_vdw_params(i,j,curij,curij+1);
40  } else {
41  curij->A = curij->B = 0.0;
42  curji->A = curji->B = 0.0;
43  }
44 
45  // Copy to transpose entry
46  *curji = *curij;
47  *(curji + 1) = *(curij + 1);
48  }
49 
50 }
51 
52 //----------------------------------------------------------------------
54 {
55  delete [] table_alloc;
56 }
57 
58 //----------------------------------------------------------------------
59 void LJTable::compute_vdw_params(int i, int j,
60  LJTable::TableEntry *cur,
61  LJTable::TableEntry *cur_scaled)
62 {
63  Parameters *params = Node::Object()->parameters;
65  int useGeom = simParams->vdwGeometricSigma;
66  Bool tabulatedEnergies = simParams->tabulatedEnergies;
67  Bool soluteScalingOn = simParams->soluteScalingOn;
68  unsigned int table_dim_org = params->get_num_vdw_params();
69  int ss_dim = Node::Object()->molecule->ss_num_vdw_params;
70  Real A, B, A14, B14;
71  int K = -1;
72  int *ss_vdw_type = Node::Object()->molecule->ss_vdw_type;
73  const int i_type = soluteScalingOn ? ((i >= table_dim_org)? ss_vdw_type[i-table_dim_org]:i) : i;
74  const int j_type = soluteScalingOn ? ((j >= table_dim_org)? ss_vdw_type[j-table_dim_org]:j) : j;
75  // BigReal sigma_max;
76  // We need the A and B parameters for the Van der Waals. These can
77  // be explicitly be specified for this pair or calculated from the
78  // sigma and epsilon values for the two atom types
79 // printf("Looking at interaction of %i with %i\n", i, j);
80  if ( tabulatedEnergies && params->get_table_pair_params(i_type, j_type ,&K)) {
81 // printf("Making this interaction tabulated. %i %i %i\n", i, j, K);
82 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
83  NAMD_die("Tabulated energies are not supported in CUDA-enabled NAMD");
84 #endif
85  if ( K < 0 ) NAMD_bug(
86  "LJTable::compute_vdw_params: energy table index is negative");
87 
88  cur->A = -1 - K;
89  cur->B = 0;
90  cur_scaled->A = -1 - K;
91  cur_scaled->B = 0;
92  }
93  else if (params->get_vdw_pair_params(i_type, j_type, &A, &B, &A14, &B14))
94  {
95  cur->A = A;
96  cur->B = B;
97  cur_scaled->A = A14;
98  cur_scaled->B = B14;
99 
100  if ( tabulatedEnergies && ( cur->A < 0 || cur_scaled->A < 0 ) )
101  NAMD_die("LJ A is negative with tabulatedEnergies enabled");
102 
103  // BigReal sigma_ij, sigma_ij14;
104 
105  // if ((B == 0) || (A/B < 0)) sigma_ij = 0;
106  // else sigma_ij = pow((BigReal)(A/B),(BigReal)(1./6.));
107 
108  // if ((B14 == 0) || (A14/B14 < 0)) sigma_ij14 = 0;
109  // else sigma_ij14 = pow((BigReal)(A14/B14),(BigReal)(1./6.));
110 
111  // sigma_max = ( sigma_ij > sigma_ij14 ? sigma_ij : sigma_ij14 );
112  }
113  else
114  {
115  // We didn't find explicit parameters for this pair. So instead,
116  // get the parameters for each atom type separately and use them
117  // to calculate the values we need
118  Real sigma_i, sigma_i14, epsilon_i, epsilon_i14;
119  Real sigma_j, sigma_j14, epsilon_j, epsilon_j14;
120 
121  params->get_vdw_params(&sigma_i, &epsilon_i, &sigma_i14,
122  &epsilon_i14,i_type);
123  params->get_vdw_params(&sigma_j, &epsilon_j, &sigma_j14,
124  &epsilon_j14,j_type);
125 
126  BigReal sigma_ij =
127  useGeom ? sqrt(sigma_i*sigma_j) : 0.5*(sigma_i+sigma_j);
128  BigReal sigma_ij14 =
129  useGeom ? sqrt(sigma_i14*sigma_j14) : 0.5 * (sigma_i14+sigma_j14);
130  BigReal epsilon_ij = sqrt(epsilon_i*epsilon_j);
131  BigReal epsilon_ij14 = sqrt(epsilon_i14*epsilon_j14);
132 
133  // sigma_max = ( sigma_ij > sigma_ij14 ? sigma_ij : sigma_ij14 );
134 
135  // Calculate sigma^6
136  sigma_ij *= sigma_ij*sigma_ij;
137  sigma_ij *= sigma_ij;
138  sigma_ij14 *= sigma_ij14*sigma_ij14;
139  sigma_ij14 *= sigma_ij14;
140 
141  // Calculate LJ constants A & B
142  cur->B = 4.0 * sigma_ij * epsilon_ij;
143  cur->A = cur->B * sigma_ij;
144  cur_scaled->B = 4.0 * sigma_ij14 * epsilon_ij14;
145  cur_scaled->A = cur_scaled->B * sigma_ij14;
146 
147  if ( tabulatedEnergies && ( cur->A < 0 || cur_scaled->A < 0 ) )
148  NAMD_die("LJ A is negative with tabulatedEnergies enabled");
149 
150  // Calculate exclcut2
151  // cur_scaled->exclcut2 = cur->exclcut2 = 0.64 * sigma_max * sigma_max;
152  }
153  if (soluteScalingOn) {
154  const BigReal soluteScalingFactor = simParams->soluteScalingFactorVdw;
155  if (i >= table_dim_org && i < (table_dim_org+ss_dim) && j < table_dim_org) {
156  cur->A *= sqrt(soluteScalingFactor);
157  cur->B *= sqrt(soluteScalingFactor);
158  cur_scaled->A *= sqrt(soluteScalingFactor);
159  cur_scaled->B *= sqrt(soluteScalingFactor);
160  }
161  if (i < table_dim_org && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
162  cur->A *= sqrt(soluteScalingFactor);
163  cur->B *= sqrt(soluteScalingFactor);
164  cur_scaled->A *= sqrt(soluteScalingFactor);
165  cur_scaled->B *= sqrt(soluteScalingFactor);
166  }
167  if (i >=table_dim_org && i < (table_dim_org+ss_dim) && j >= table_dim_org && j < (table_dim_org+ss_dim)) {
168  cur->A *= soluteScalingFactor;
169  cur->B *= soluteScalingFactor;
170  cur_scaled->A *= soluteScalingFactor;
171  cur_scaled->B *= soluteScalingFactor;
172  }
173  }
174 }
175 
static Node * Object()
Definition: Node.h:86
SimParameters * simParameters
Definition: Node.h:181
float Real
Definition: common.h:118
void NAMD_bug(const char *err_msg)
Definition: common.C:195
int Bool
Definition: common.h:142
~LJTable(void)
Definition: LJTable.C:53
int get_vdw_pair_params(Index ind1, Index ind2, Real *, Real *, Real *, Real *)
Definition: Parameters.C:4646
void NAMD_die(const char *err_msg)
Definition: common.C:147
int get_num_vdw_params(void)
Definition: Parameters.h:602
LJTable(void)
Definition: LJTable.C:16
int get_table_pair_params(Index, Index, int *)
Definition: Parameters.C:4556
Parameters * parameters
Definition: Node.h:180
#define simParams
Definition: Output.C:131
int * ss_vdw_type
Definition: Molecule.h:486
void get_vdw_params(Real *sigma, Real *epsilon, Real *sigma14, Real *epsilon14, Index index)
Definition: Parameters.h:568
Molecule * molecule
Definition: Node.h:179
int ss_num_vdw_params
Definition: Molecule.h:485
double BigReal
Definition: common.h:123