use of simtk.openmm.AmoebaOpenMMLibrary.OpenMM_AmoebaTorsionTorsionForce_addTorsionTorsion in project ffx by mjschnie.
the class ForceFieldEnergyOpenMM method addTorsionTorsionForce.
private void addTorsionTorsionForce() {
TorsionTorsion[] torsionTorsions = super.getTorsionTorsions();
if (torsionTorsions == null || torsionTorsions.length < 1) {
return;
}
/**
* Load the torsion-torsions.
*/
int nTypes = 0;
LinkedHashMap<String, TorsionTorsionType> torTorTypes = new LinkedHashMap<>();
int nTorsionTorsions = torsionTorsions.length;
amoebaTorsionTorsionForce = OpenMM_AmoebaTorsionTorsionForce_create();
for (int i = 0; i < nTorsionTorsions; i++) {
TorsionTorsion torsionTorsion = torsionTorsions[i];
int ia = torsionTorsion.getAtom(0).getXyzIndex() - 1;
int ib = torsionTorsion.getAtom(1).getXyzIndex() - 1;
int ic = torsionTorsion.getAtom(2).getXyzIndex() - 1;
int id = torsionTorsion.getAtom(3).getXyzIndex() - 1;
int ie = torsionTorsion.getAtom(4).getXyzIndex() - 1;
TorsionTorsionType torsionTorsionType = torsionTorsion.torsionTorsionType;
String key = torsionTorsionType.getKey();
/**
* Check if the TorTor parameters have already been added to the
* Hash.
*/
int gridIndex = 0;
if (torTorTypes.containsKey(key)) {
/**
* If the TorTor has been added, get its (ordered) index in the
* Hash.
*/
int index = 0;
for (String entry : torTorTypes.keySet()) {
if (entry.equalsIgnoreCase(key)) {
gridIndex = index;
break;
} else {
index++;
}
}
} else {
/**
* Add the new TorTor.
*/
torTorTypes.put(key, torsionTorsionType);
gridIndex = nTypes;
nTypes++;
}
Atom atom = torsionTorsion.getChiralAtom();
int iChiral = -1;
if (atom != null) {
iChiral = atom.getXyzIndex() - 1;
}
OpenMM_AmoebaTorsionTorsionForce_addTorsionTorsion(amoebaTorsionTorsionForce, ia, ib, ic, id, ie, iChiral, gridIndex);
}
/**
* Load the Torsion-Torsion parameters.
*/
PointerByReference values = OpenMM_DoubleArray_create(6);
int gridIndex = 0;
for (String key : torTorTypes.keySet()) {
TorsionTorsionType torTorType = torTorTypes.get(key);
int nx = torTorType.nx;
int ny = torTorType.ny;
double[] tx = torTorType.tx;
double[] ty = torTorType.ty;
double[] f = torTorType.energy;
double[] dx = torTorType.dx;
double[] dy = torTorType.dy;
double[] dxy = torTorType.dxy;
/**
* Create the 3D grid.
*/
PointerByReference grid3D = OpenMM_3D_DoubleArray_create(nx, ny, 6);
int xIndex = 0;
int yIndex = 0;
for (int j = 0; j < nx * ny; j++) {
int addIndex = 0;
OpenMM_DoubleArray_set(values, addIndex++, tx[xIndex]);
OpenMM_DoubleArray_set(values, addIndex++, ty[yIndex]);
OpenMM_DoubleArray_set(values, addIndex++, OpenMM_KJPerKcal * f[j]);
OpenMM_DoubleArray_set(values, addIndex++, OpenMM_KJPerKcal * dx[j]);
OpenMM_DoubleArray_set(values, addIndex++, OpenMM_KJPerKcal * dy[j]);
OpenMM_DoubleArray_set(values, addIndex++, OpenMM_KJPerKcal * dxy[j]);
OpenMM_3D_DoubleArray_set(grid3D, yIndex, xIndex, values);
xIndex++;
if (xIndex == nx) {
xIndex = 0;
yIndex++;
}
}
OpenMM_AmoebaTorsionTorsionForce_setTorsionTorsionGrid(amoebaTorsionTorsionForce, gridIndex++, grid3D);
OpenMM_3D_DoubleArray_destroy(grid3D);
}
OpenMM_DoubleArray_destroy(values);
OpenMM_System_addForce(system, amoebaTorsionTorsionForce);
logger.log(Level.INFO, " Added Torsion-Torsions ({0})", nTorsionTorsions);
}
Aggregations