1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.potential.openmm;
39
40 import ffx.openmm.CustomBondForce;
41 import ffx.openmm.DoubleArray;
42 import ffx.openmm.Force;
43 import ffx.potential.bonded.Bond;
44 import ffx.potential.parameters.BondType;
45 import ffx.potential.parameters.ForceField;
46
47 import java.util.logging.Level;
48 import java.util.logging.Logger;
49
50 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_KJPerKcal;
51 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_NmPerAngstrom;
52 import static java.lang.String.format;
53
54
55
56
57 public class BondForce extends CustomBondForce {
58
59 private static final Logger logger = Logger.getLogger(BondForce.class.getName());
60
61
62
63
64
65
66 public BondForce(OpenMMEnergy openMMEnergy) {
67 super(openMMEnergy.getBondEnergyString());
68 Bond[] bonds = openMMEnergy.getBonds();
69 addPerBondParameter("r0");
70 addPerBondParameter("k");
71 setName("AmoebaBond");
72
73 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
74 DoubleArray parameters = new DoubleArray(0);
75 for (Bond bond : bonds) {
76 int i1 = bond.getAtom(0).getXyzIndex() - 1;
77 int i2 = bond.getAtom(1).getXyzIndex() - 1;
78 BondType bondType = bond.bondType;
79 double r0 = bondType.distance * OpenMM_NmPerAngstrom;
80 double k = kParameterConversion * bondType.forceConstant * bond.bondType.bondUnit;
81 parameters.append(r0);
82 parameters.append(k);
83 addBond(i1, i2, parameters);
84 parameters.resize(0);
85 }
86 parameters.destroy();
87
88 ForceField forceField = openMMEnergy.getMolecularAssembly().getForceField();
89 int forceGroup = forceField.getInteger("BOND_FORCE_GROUP", 0);
90 setForceGroup(forceGroup);
91 logger.info(format(" Bonds: %10d", bonds.length));
92 logger.fine(format(" Force Group: %10d", forceGroup));
93 }
94
95
96
97
98 public static Force constructForce(OpenMMEnergy openMMEnergy) {
99 Bond[] bonds = openMMEnergy.getBonds();
100 if (bonds == null || bonds.length < 1) {
101 return null;
102 }
103 return new BondForce(openMMEnergy);
104 }
105
106
107
108
109 public void updateForce(OpenMMEnergy openMMEnergy) {
110 Bond[] bonds = openMMEnergy.getBonds();
111 if (bonds == null || bonds.length < 1) {
112 return;
113 }
114
115 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
116 DoubleArray parameters = new DoubleArray(0);
117 int index = 0;
118 for (Bond bond : bonds) {
119 int i1 = bond.getAtom(0).getXyzIndex() - 1;
120 int i2 = bond.getAtom(1).getXyzIndex() - 1;
121 BondType bondType = bond.bondType;
122 double r0 = bondType.distance * OpenMM_NmPerAngstrom;
123 double k = kParameterConversion * bondType.forceConstant * bondType.bondUnit;
124 parameters.append(r0);
125 parameters.append(k);
126 setBondParameters(index++, i1, i2, parameters);
127 parameters.resize(0);
128 }
129 parameters.destroy();
130 updateParametersInContext(openMMEnergy.getContext());
131 }
132
133 }