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.log(Level.INFO, format(" Urey-Bradleys \t%6d\t\t%1d", ureyBradleys.length, forceGroup));
86 }
87
88
89
90
91
92
93
94 public static Force constructForce(OpenMMEnergy openMMEnergy) {
95 UreyBradley[] ureyBradleys = openMMEnergy.getUreyBradleys();
96 if (ureyBradleys == null || ureyBradleys.length < 1) {
97 return null;
98 }
99 return new UreyBradleyForce(openMMEnergy);
100 }
101
102
103
104
105
106
107 public void updateForce(OpenMMEnergy openMMEnergy) {
108 UreyBradley[] ureyBradleys = openMMEnergy.getUreyBradleys();
109 if (ureyBradleys == null || ureyBradleys.length < 1) {
110 return;
111 }
112
113 double kParameterConversion = OpenMM_KJPerKcal / (OpenMM_NmPerAngstrom * OpenMM_NmPerAngstrom);
114
115 int index = 0;
116 for (UreyBradley ureyBradley : ureyBradleys) {
117 int i1 = ureyBradley.getAtom(0).getXyzIndex() - 1;
118 int i2 = ureyBradley.getAtom(2).getXyzIndex() - 1;
119 UreyBradleyType ureyBradleyType = ureyBradley.ureyBradleyType;
120 double length = ureyBradleyType.distance * OpenMM_NmPerAngstrom;
121
122
123 double k = 2.0 * ureyBradleyType.forceConstant * ureyBradleyType.ureyUnit * kParameterConversion;
124 setBondParameters(index++, i1, i2, length, k);
125 }
126
127 updateParametersInContext(openMMEnergy.getContext());
128 }
129
130 }