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