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.groovy;
39
40 import ffx.potential.ForceFieldEnergy;
41 import ffx.potential.groovy.test.Gradient;
42 import ffx.potential.groovy.test.LambdaGradient;
43 import ffx.potential.utils.PotentialTest;
44 import org.junit.Test;
45
46 import java.io.File;
47
48 import static org.apache.commons.math3.util.FastMath.floor;
49 import static org.apache.commons.math3.util.FastMath.random;
50 import static org.junit.Assert.assertEquals;
51
52
53
54
55 public class ParentEnergyTest extends PotentialTest {
56
57 private final String info;
58 private final String filename;
59 private final String filepath;
60 private final int nAtoms;
61 private final int nBonds;
62 private final int nAngles;
63 private final int nStretchBends;
64 private final int nUreyBradleys;
65 private final int nOutOfPlaneBends;
66 private final int nTorsions;
67 private final int nImproperTorsions;
68 private final int nPiOrbitalTorsions;
69 private final int nTorsionTorsions;
70 private final int nStretchTorsions;
71 private final int nAngleTorsions;
72 private final int nVanDerWaals;
73 private final int nPermanent;
74 private final int nPolar;
75 private final int nGK;
76 private final double bondEnergy;
77 private final double angleEnergy;
78 private final double stretchBendEnergy;
79 private final double ureyBradleyEnergy;
80 private final double outOfPlaneBendEnergy;
81 private final double torsionEnergy;
82 private final double improperTorsionEnergy;
83 private final double piOrbitalTorsionEnergy;
84 private final double torsionTorsionEnergy;
85 private final double stretchTorsionEnergy;
86 private final double angleTorsionEnergy;
87 private final double vanDerWaalsEnergy;
88 private final double permanentEnergy;
89 private final double polarizationEnergy;
90 private final double gkEnergy;
91 private final double totalEnergy;
92 private final boolean testOpenMM;
93 private final double tolerance = 1.0e-2;
94
95 public ParentEnergyTest(String info, String filename, int nAtoms, double bondEnergy, int nBonds,
96 double angleEnergy, int nAngles, double stretchBendEnergy, int nStretchBends,
97 double ureyBradleyEnergy, int nUreyBradleys, double outOfPlaneBendEnergy,
98 int nOutOfPlaneBends, double torsionEnergy, int nTorsions, double improperTorsionEnergy,
99 int nImproperTorsions, double piOrbitalTorsionEnergy, int nPiOrbitalTorsions,
100 double torsionTorsionEnergy, int nTorsionTorsions, double stretchTorsionEnergy,
101 int nStretchTorsions, double angleTorsionEnergy, int nAngleTorsions, double vanDerWaalsEnergy,
102 int nVanDerWaals, double permanentEnergy, int nPermanent, double polarizationEnergy,
103 int nPolar, double gkEnergy, int nGK, boolean testOpenMM) {
104 this.filename = filename;
105 this.info = info;
106 this.nAtoms = nAtoms;
107 this.bondEnergy = bondEnergy;
108 this.nBonds = nBonds;
109 this.angleEnergy = angleEnergy;
110 this.nAngles = nAngles;
111 this.stretchBendEnergy = stretchBendEnergy;
112 this.nStretchBends = nStretchBends;
113 this.ureyBradleyEnergy = ureyBradleyEnergy;
114 this.nUreyBradleys = nUreyBradleys;
115 this.outOfPlaneBendEnergy = outOfPlaneBendEnergy;
116 this.nOutOfPlaneBends = nOutOfPlaneBends;
117 this.torsionEnergy = torsionEnergy;
118 this.nTorsions = nTorsions;
119 this.improperTorsionEnergy = improperTorsionEnergy;
120 this.nImproperTorsions = nImproperTorsions;
121 this.piOrbitalTorsionEnergy = piOrbitalTorsionEnergy;
122 this.nPiOrbitalTorsions = nPiOrbitalTorsions;
123 this.torsionTorsionEnergy = torsionTorsionEnergy;
124 this.nTorsionTorsions = nTorsionTorsions;
125 this.stretchTorsionEnergy = stretchTorsionEnergy;
126 this.nStretchTorsions = nStretchTorsions;
127 this.angleTorsionEnergy = angleTorsionEnergy;
128 this.nAngleTorsions = nAngleTorsions;
129 this.vanDerWaalsEnergy = vanDerWaalsEnergy;
130 this.nVanDerWaals = nVanDerWaals;
131 this.permanentEnergy = permanentEnergy;
132 this.nPermanent = nPermanent;
133 this.polarizationEnergy = polarizationEnergy;
134 this.nPolar = nPolar;
135 this.gkEnergy = gkEnergy;
136 this.nGK = nGK;
137 this.testOpenMM = testOpenMM;
138
139 filepath = getResourcePath(filename);
140 totalEnergy = bondEnergy + angleEnergy + stretchBendEnergy + ureyBradleyEnergy + outOfPlaneBendEnergy
141 + torsionEnergy + improperTorsionEnergy + piOrbitalTorsionEnergy + torsionTorsionEnergy + stretchTorsionEnergy
142 + angleTorsionEnergy + vanDerWaalsEnergy + permanentEnergy + polarizationEnergy + gkEnergy;
143 }
144
145 @Test
146 public void testEnergy() {
147 if (nAtoms > 10000 && !ffxCI) {
148 return;
149 }
150 logger.info(" Testing energy for " + info);
151 String[] args = {filepath};
152 binding.setVariable("args", args);
153
154
155 Energy energy = new Energy(binding).run();
156 potentialScript = energy;
157 ForceFieldEnergy forceFieldEnergy = energy.forceFieldEnergy;
158
159
160 assertEquals(info + " Bond Energy", bondEnergy, forceFieldEnergy.getBondEnergy(), tolerance);
161 assertEquals(info + " Bond Count", nBonds, forceFieldEnergy.getNumberofBonds());
162
163 assertEquals(info + " Angle Energy", angleEnergy, forceFieldEnergy.getAngleEnergy(), tolerance);
164 assertEquals(info + " Angle Count", nAngles, forceFieldEnergy.getNumberofAngles());
165
166 assertEquals(info + " Stretch-Bend Energy", stretchBendEnergy, forceFieldEnergy.getStrenchBendEnergy(), tolerance);
167 assertEquals(info + " Stretch-Bend Count", nStretchBends, forceFieldEnergy.getNumberofStretchBends());
168
169 assertEquals(info + " Urey-Bradley Energy", ureyBradleyEnergy, forceFieldEnergy.getUreyBradleyEnergy(), tolerance);
170 assertEquals(info + " Urey-Bradley Count", nUreyBradleys, forceFieldEnergy.getNumberofUreyBradleys());
171
172 assertEquals(info + " Out-of-Plane Bend Energy", outOfPlaneBendEnergy, forceFieldEnergy.getOutOfPlaneBendEnergy(), tolerance);
173 assertEquals(info + " Out-of-Plane Bend Count", nOutOfPlaneBends, forceFieldEnergy.getNumberofOutOfPlaneBends());
174
175 assertEquals(info + " Torsion Energy", torsionEnergy, forceFieldEnergy.getTorsionEnergy(), tolerance);
176 assertEquals(info + " Torsion Count", nTorsions, forceFieldEnergy.getNumberofTorsions());
177
178 assertEquals(info + " Improper Torsion Energy", improperTorsionEnergy, forceFieldEnergy.getImproperTorsionEnergy(), tolerance);
179 assertEquals(info + " Improper Torsion Count", nImproperTorsions, forceFieldEnergy.getNumberofImproperTorsions());
180
181 assertEquals(info + " Pi-OrbitalTorsion Energy", piOrbitalTorsionEnergy, forceFieldEnergy.getPiOrbitalTorsionEnergy(), tolerance);
182 assertEquals(info + " Pi-OrbitalTorsion Count", nPiOrbitalTorsions, forceFieldEnergy.getNumberofPiOrbitalTorsions());
183
184 assertEquals(info + " Torsion-Torsion Energy", torsionTorsionEnergy, forceFieldEnergy.getTorsionTorsionEnergy(), tolerance);
185 assertEquals(info + " Torsion-Torsion Count", nTorsionTorsions, forceFieldEnergy.getNumberofTorsionTorsions());
186
187 assertEquals(info + " Stretch-Torsion Energy", stretchTorsionEnergy, forceFieldEnergy.getStretchTorsionEnergy(), tolerance);
188 assertEquals(info + " Stretch-Torsion Count", nStretchTorsions, forceFieldEnergy.getNumberofStretchTorsions());
189
190 assertEquals(info + " Angle-Torsion Energy", angleTorsionEnergy, forceFieldEnergy.getAngleTorsionEnergy(), tolerance);
191 assertEquals(info + " Angle-Torsion Count", nAngleTorsions, forceFieldEnergy.getNumberofAngleTorsions());
192
193 assertEquals(info + " van Der Waals Energy", vanDerWaalsEnergy, forceFieldEnergy.getVanDerWaalsEnergy(), tolerance);
194 assertEquals(info + " van Der Waals Count", nVanDerWaals, forceFieldEnergy.getVanDerWaalsInteractions());
195
196 assertEquals(info + " Permanent Multipole Energy", permanentEnergy, forceFieldEnergy.getPermanentMultipoleEnergy(), tolerance);
197 assertEquals(info + " Permanent Multipole Count", nPermanent, forceFieldEnergy.getPermanentInteractions());
198
199 assertEquals(info + " Polarization Energy", polarizationEnergy, forceFieldEnergy.getPolarizationEnergy(), tolerance);
200 assertEquals(info + " Polarization Count", nPolar, forceFieldEnergy.getPermanentInteractions());
201
202 assertEquals(info + " Solvation", gkEnergy, forceFieldEnergy.getSolvationEnergy(), tolerance);
203 assertEquals(info + " Solvation Count", nGK, forceFieldEnergy.getSolvationInteractions());
204 }
205
206 @Test
207 public void testGradient() {
208 if (!ffxCI) {
209 if (nAtoms > 5000) {
210 return;
211 } else if (nGK > 0 && nAtoms > 500) {
212 return;
213 }
214 }
215
216
217 logger.info(" Testing Cartesian gradient(s) for " + info);
218
219
220
221 int atomID = (int) floor(random() * nAtoms) + 1;
222 double stepSize = 1.0e-5;
223 String[] args = {"--ga", Integer.toString(atomID),
224 "--dx", Double.toString(stepSize),
225 "--tol", Double.toString(tolerance),
226 filepath};
227 binding.setVariable("args", args);
228
229
230 Gradient gradient = new Gradient(binding).run();
231 potentialScript = gradient;
232 assertEquals(info + " gradient failures: ", 0, gradient.nFailures);
233 }
234
235 @Test
236 public void testLambdaGradient() {
237 if (!ffxCI) {
238 if (nAtoms > 5000) {
239 return;
240 } else if (nGK > 0 && nAtoms > 500) {
241 return;
242 }
243 }
244
245 logger.info(" Testing lambda gradient(s) for " + info);
246
247
248
249 int atomID = (int) floor(random() * nAtoms) + 1;
250 double stepSize = 1.0e-5;
251 String[] args = {"--ga", Integer.toString(atomID),
252 "--dx", Double.toString(stepSize),
253 "--tol", Double.toString(tolerance),
254 "--ac", "ALL",
255 "-l", "0.9",
256 filepath};
257 binding.setVariable("args", args);
258
259
260 LambdaGradient lambdaGradient = new LambdaGradient(binding).run();
261 potentialScript = lambdaGradient;
262 assertEquals(info + " dEdL failures: ", 0, lambdaGradient.ndEdLFailures);
263 assertEquals(info + " d2EdL2 failures: ", 0, lambdaGradient.nd2EdL2Failures);
264 assertEquals(info + " dEdXdL failures: ", 0, lambdaGradient.ndEdXdLFailures);
265 assertEquals(info + " dEdX failures: ", 0, lambdaGradient.ndEdXFailures);
266 }
267
268 @Test
269 public void testOpenMMEnergy() {
270 if (!testOpenMM || !ffxOpenMM) {
271 return;
272 }
273 logger.info(" Testing OpenMM energy for " + info);
274
275
276 String[] args = {filepath};
277 binding.setVariable("args", args);
278 System.setProperty("platform", "OMM");
279
280
281 Energy energy = new Energy(binding).run();
282 potentialScript = energy;
283 double openMMTolerance = 0.5;
284 assertEquals(info + " OpenMM Energy", totalEnergy, energy.energy, openMMTolerance);
285 }
286 }