| version 1.2 | version 1.3 |
|---|
| |
| #include "common.h" | #include "common.h" |
| | |
| #define MIN_DEBUG_LEVEL 3 | #define MIN_DEBUG_LEVEL 3 |
| //#define DEBUGM | #define DEBUGM |
| #include "Debug.h" | #include "Debug.h" |
| | |
| | |
| |
| for (int i1 = 0; i1 < 3; i1++) { | for (int i1 = 0; i1 < 3; i1++) { |
| if (cross(Avec[i0], Kvec[i1]) == 0) { | if (cross(Avec[i0], Kvec[i1]) == 0) { |
| cont[i1] = TRUE; | cont[i1] = TRUE; |
| offset[i1] = simParams->gridforceVOffset[i0]; | offset[i1] = simParams->gridforceVOffset[i0] * factor; |
| gap[i1] = (inv * (Avec[i0] - Kvec[i1])).length(); // want in grid-point units (normal = 1) | gap[i1] = (inv * (Avec[i0] - Kvec[i1])).length(); // want in grid-point units (normal = 1) |
| | |
| if (gap[i1] < 0) { | if (gap[i1] < 0) { |
| |
| | |
| if (cont[i0] && fabs(offset[i0] - (p_avg[i0]-n_avg[i0])) > modThresh) { | if (cont[i0] && fabs(offset[i0] - (p_avg[i0]-n_avg[i0])) > modThresh) { |
| iout << iWARN << "GRID FORCE POTENTIAL DIFFERENCE IN K" << i0 | iout << iWARN << "GRID FORCE POTENTIAL DIFFERENCE IN K" << i0 |
| << " DIRECTION IS GREATER THAN " << modThresh << " KCAL/MOL*E\n" << endi; | << " DIRECTION IS " << offset[i0] - (p_avg[i0]-n_avg[i0]) << " KCAL/MOL*E\n" << endi; |
| } | } |
| DebugM(3, "n_avg[" << i0 << "] = " << n_avg[i0] << "\n" << endi); | DebugM(3, "n_avg[" << i0 << "] = " << n_avg[i0] << "\n" << endi); |
| DebugM(3, "p_avg[" << i0 << "] = " << p_avg[i0] << "\n" << endi); | DebugM(3, "p_avg[" << i0 << "] = " << p_avg[i0] << "\n" << endi); |
| |
| int inds2[3]; | int inds2[3]; |
| int ind2 = 0; | int ind2 = 0; |
| | |
| | float voff = 0.0; |
| int bit = 1; // bit = 2^i1 in the below loop | int bit = 1; // bit = 2^i1 in the below loop |
| for (int i1 = 0; i1 < 3; i1++) { | for (int i1 = 0; i1 < 3; i1++) { |
| inds2[i1] = (inds[i1] + ((i0 & bit) ? 1 : 0)) % k[i1]; | inds2[i1] = (inds[i1] + ((i0 & bit) ? 1 : 0)) % k[i1]; |
| ind2 += inds2[i1] * dk[i1]; | ind2 += inds2[i1] * dk[i1]; |
| | |
| | // Deal with voltage offsets |
| | if (cont[i1] && inds[i1] == (k[i1]-1) && inds2[i1] == 0) { |
| | voff += offset[i1]; |
| | DebugM(3, "offset[" << i1 << "] = " << offset[i1] << "\n" << endi); |
| | } |
| | |
| bit <<= 1; // i.e. multiply by 2 | bit <<= 1; // i.e. multiply by 2 |
| } | } |
| | |
| |
| Bool zero_derivs = FALSE; | Bool zero_derivs = FALSE; |
| int dk_hi[3]; | int dk_hi[3]; |
| int dk_lo[3]; | int dk_lo[3]; |
| | float voffs[3]; |
| for (int i1 = 0; i1 < 3; i1++) { | for (int i1 = 0; i1 < 3; i1++) { |
| if (inds2[i1] == 0) { | if (inds2[i1] == 0) { |
| if (cont[i1]) { | if (cont[i1]) { |
| dk_hi[i1] = dk[i1]; | dk_hi[i1] = dk[i1]; |
| dk_lo[i1] = -(k[i1]-1) * dk[i1]; | dk_lo[i1] = -(k[i1]-1) * dk[i1]; |
| | voffs[i1] = offset[i1]; |
| } | } |
| else zero_derivs = TRUE; | else zero_derivs = TRUE; |
| } | } |
| |
| if (cont[i1]) { | if (cont[i1]) { |
| dk_hi[i1] = -(k[i1]-1) * dk[i1]; | dk_hi[i1] = -(k[i1]-1) * dk[i1]; |
| dk_lo[i1] = dk[i1]; | dk_lo[i1] = dk[i1]; |
| | voffs[i1] = offset[i1]; |
| } | } |
| else zero_derivs = TRUE; | else zero_derivs = TRUE; |
| } | } |
| else { | else { |
| dk_hi[i1] = dk[i1]; | dk_hi[i1] = dk[i1]; |
| dk_lo[i1] = dk[i1]; | dk_lo[i1] = dk[i1]; |
| | voffs[i1] = 0.0; |
| } | } |
| } | } |
| | |
| |
| box->loc = dg; | box->loc = dg; |
| | |
| // V | // V |
| box->b[i0] = grid[ind2]; | box->b[i0] = grid[ind2] + voff; |
| | |
| // First derivatives | if (zero_derivs) { |
| // dV/dx | box->b[8+i0] = 0.0; |
| box->b[8+i0] = (zero_derivs) ? 0.0 : | box->b[16+i0] = 0.0; |
| 0.5 * (grid[ind2 + dk_hi[0]] - grid[ind2 - dk_lo[0]]); | box->b[24+i0] = 0.0; |
| // dV/dy | box->b[32+i0] = 0.0; |
| box->b[16+i0] = (zero_derivs) ? 0.0 : | box->b[40+i0] = 0.0; |
| 0.5 * (grid[ind2 + dk_hi[1]] - grid[ind2 - dk_lo[1]]); | box->b[48+i0] = 0.0; |
| // dV/dz | box->b[56+i0] = 0.0; |
| box->b[24+i0] = (zero_derivs) ? 0.0 : | } else { |
| 0.5 * (grid[ind2 + dk_hi[2]] - grid[ind2 - dk_lo[2]]); | box->b[8+i0] = 0.5 * (grid[ind2 + dk_hi[0]] - grid[ind2 - dk_lo[0]] + voffs[0]); // dV/dx |
| | box->b[16+i0] = 0.5 * (grid[ind2 + dk_hi[1]] - grid[ind2 - dk_lo[1]] + voffs[1]); // dV/dy |
| // Mixed second derivatives | box->b[24+i0] = 0.5 * (grid[ind2 + dk_hi[2]] - grid[ind2 - dk_lo[2]] + voffs[2]); // dV/dz |
| // d2V/dxdy | box->b[32+i0] = 0.25 * (grid[ind2 + dk_hi[0] + dk_hi[1]] - grid[ind2 - dk_lo[0] + dk_hi[1]] |
| box->b[32+i0] = (zero_derivs) ? 0.0 : | - grid[ind2 + dk_hi[0] - dk_lo[1]] + grid[ind2 - dk_lo[0] - dk_lo[1]]); // d2V/dxdy |
| 0.25 * (grid[ind2 + dk_hi[0] + dk_hi[1]] - grid[ind2 - dk_lo[0] + dk_hi[1]] | box->b[40+i0] = 0.25 * (grid[ind2 + dk_hi[0] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[2]] |
| - grid[ind2 + dk_hi[0] - dk_lo[1]] + grid[ind2 - dk_lo[0] - dk_lo[1]]); | - grid[ind2 + dk_hi[0] - dk_lo[2]] + grid[ind2 - dk_lo[0] - dk_lo[2]]); // d2V/dxdz |
| // d2V/dxdz | box->b[48+i0] = 0.25 * (grid[ind2 + dk_hi[1] + dk_hi[2]] - grid[ind2 - dk_lo[1] + dk_hi[2]] |
| box->b[40+i0] = (zero_derivs) ? 0.0 : | - grid[ind2 + dk_hi[1] - dk_lo[2]] + grid[ind2 - dk_lo[1] - dk_lo[2]]); // d2V/dydz |
| 0.25 * (grid[ind2 + dk_hi[0] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[2]] | |
| - grid[ind2 + dk_hi[0] - dk_lo[2]] + grid[ind2 - dk_lo[0] - dk_lo[2]]); | |
| // d2V/dydz | |
| box->b[48+i0] = (zero_derivs) ? 0.0 : | |
| 0.25 * (grid[ind2 + dk_hi[1] + dk_hi[2]] - grid[ind2 - dk_lo[1] + dk_hi[2]] | |
| - grid[ind2 + dk_hi[1] - dk_lo[2]] + grid[ind2 - dk_lo[1] - dk_lo[2]]); | |
| | |
| // d3V/dxdydz | box->b[56+i0] = // d3V/dxdydz |
| box->b[56+i0] = (zero_derivs) ? 0.0 : | |
| 0.125 * (grid[ind2 + dk_hi[0] + dk_hi[1] + dk_hi[2]] - grid[ind2 + dk_hi[0] + dk_hi[1] - dk_lo[2]] | 0.125 * (grid[ind2 + dk_hi[0] + dk_hi[1] + dk_hi[2]] - grid[ind2 + dk_hi[0] + dk_hi[1] - dk_lo[2]] |
| - grid[ind2 + dk_hi[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[1] + dk_hi[2]] | - grid[ind2 + dk_hi[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[1] + dk_hi[2]] |
| + grid[ind2 + dk_hi[0] - dk_lo[1] - dk_lo[2]] + grid[ind2 - dk_lo[0] + dk_hi[1] - dk_lo[2]] | + grid[ind2 + dk_hi[0] - dk_lo[1] - dk_lo[2]] + grid[ind2 - dk_lo[0] + dk_hi[1] - dk_lo[2]] |
| + grid[ind2 - dk_lo[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] - dk_lo[1] - dk_lo[2]]); | + grid[ind2 - dk_lo[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] - dk_lo[1] - dk_lo[2]]); |
| | } |
| | |
| DebugM(2, "V = " << box->b[i0] << "\n"); | DebugM(2, "V = " << box->b[i0] << "\n"); |
| | |