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.log(Level.INFO, format(" Bonds \t\t%6d\t\t%1d", bonds.length, forceGroup));
92 }
93
94
95
96
97 public static Force constructForce(OpenMMEnergy openMMEnergy) {
98 Bond[] bonds = openMMEnergy.getBonds();
99 if (bonds == null || bonds.length < 1) {
100 return null;
101 }
102 return new BondForce(openMMEnergy);
103 }
104
105
106
107
108 public void updateForce(OpenMMEnergy openMMEnergy) {
109 Bond[] bonds = openMMEnergy.getBonds();
110 if (bonds == null || bonds.length < 1) {
111 return;
112 }
113
114 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
115 DoubleArray parameters = new DoubleArray(0);
116 int index = 0;
117 for (Bond bond : bonds) {
118 int i1 = bond.getAtom(0).getXyzIndex() - 1;
119 int i2 = bond.getAtom(1).getXyzIndex() - 1;
120 BondType bondType = bond.bondType;
121 double r0 = bondType.distance * OpenMM_NmPerAngstrom;
122 double k = kParameterConversion * bondType.forceConstant * bondType.bondUnit;
123 parameters.append(r0);
124 parameters.append(k);
125 setBondParameters(index++, i1, i2, parameters);
126 parameters.resize(0);
127 }
128 parameters.destroy();
129 updateParametersInContext(openMMEnergy.getContext());
130 }
131
132 }