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.Force;
41 import ffx.openmm.HarmonicBondForce;
42 import ffx.potential.bonded.UreyBradley;
43 import ffx.potential.parameters.UreyBradleyType;
44
45 import java.util.logging.Level;
46 import java.util.logging.Logger;
47
48 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_KJPerKcal;
49 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_NmPerAngstrom;
50 import static java.lang.String.format;
51
52
53
54
55 public class UreyBradleyForce extends HarmonicBondForce {
56
57 private static final Logger logger = Logger.getLogger(UreyBradleyForce.class.getName());
58
59
60
61
62
63
64 public UreyBradleyForce(OpenMMEnergy openMMEnergy) {
65 UreyBradley[] ureyBradleys = openMMEnergy.getUreyBradleys();
66 if (ureyBradleys == null || ureyBradleys.length < 1) {
67 return;
68 }
69
70 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
71
72 for (UreyBradley ureyBradley : ureyBradleys) {
73 int i1 = ureyBradley.getAtom(0).getXyzIndex() - 1;
74 int i2 = ureyBradley.getAtom(2).getXyzIndex() - 1;
75 UreyBradleyType ureyBradleyType = ureyBradley.ureyBradleyType;
76 double length = ureyBradleyType.distance * OpenMM_NmPerAngstrom;
77
78
79 double k = 2.0 * ureyBradleyType.forceConstant * ureyBradleyType.ureyUnit * kParameterConversion;
80 addBond(i1, i2, length, k);
81 }
82
83 int forceGroup = openMMEnergy.getMolecularAssembly().getForceField().getInteger("UREY_BRADLEY_FORCE", 0);
84 setForceGroup(forceGroup);
85 logger.info(format(" Urey-Bradleys: %10d", ureyBradleys.length));
86 logger.fine(format(" Force Group: %10d", forceGroup));
87 }
88
89
90
91
92
93
94
95 public static Force constructForce(OpenMMEnergy openMMEnergy) {
96 UreyBradley[] ureyBradleys = openMMEnergy.getUreyBradleys();
97 if (ureyBradleys == null || ureyBradleys.length < 1) {
98 return null;
99 }
100 return new UreyBradleyForce(openMMEnergy);
101 }
102
103
104
105
106
107
108 public void updateForce(OpenMMEnergy openMMEnergy) {
109 UreyBradley[] ureyBradleys = openMMEnergy.getUreyBradleys();
110 if (ureyBradleys == null || ureyBradleys.length < 1) {
111 return;
112 }
113
114 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
115
116 int index = 0;
117 for (UreyBradley ureyBradley : ureyBradleys) {
118 int i1 = ureyBradley.getAtom(0).getXyzIndex() - 1;
119 int i2 = ureyBradley.getAtom(2).getXyzIndex() - 1;
120 UreyBradleyType ureyBradleyType = ureyBradley.ureyBradleyType;
121 double length = ureyBradleyType.distance * OpenMM_NmPerAngstrom;
122
123
124 double k = 2.0 * ureyBradleyType.forceConstant * ureyBradleyType.ureyUnit * kParameterConversion;
125 setBondParameters(index++, i1, i2, length, k);
126 }
127
128 updateParametersInContext(openMMEnergy.getContext());
129 }
130
131 }