View Javadoc
1   // ******************************************************************************
2   //
3   // Title:       Force Field X.
4   // Description: Force Field X - Software for Molecular Biophysics.
5   // Copyright:   Copyright (c) Michael J. Schnieders 2001-2025.
6   //
7   // This file is part of Force Field X.
8   //
9   // Force Field X is free software; you can redistribute it and/or modify it
10  // under the terms of the GNU General Public License version 3 as published by
11  // the Free Software Foundation.
12  //
13  // Force Field X is distributed in the hope that it will be useful, but WITHOUT
14  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16  // details.
17  //
18  // You should have received a copy of the GNU General Public License along with
19  // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple
20  // Place, Suite 330, Boston, MA 02111-1307 USA
21  //
22  // Linking this library statically or dynamically with other modules is making a
23  // combined work based on this library. Thus, the terms and conditions of the
24  // GNU General Public License cover the whole combination.
25  //
26  // As a special exception, the copyright holders of this library give you
27  // permission to link this library with independent modules to produce an
28  // executable, regardless of the license terms of these independent modules, and
29  // to copy and distribute the resulting executable under terms of your choice,
30  // provided that you also meet, for each linked independent module, the terms
31  // and conditions of the license of that module. An independent module is a
32  // module which is not derived from or based on this library. If you modify this
33  // library, you may extend this exception to your version of the library, but
34  // you are not obligated to do so. If you do not wish to do so, delete this
35  // exception statement from your version.
36  //
37  // ******************************************************************************
38  package ffx.potential.nonbonded.implicit;
39  
40  import edu.rit.pj.IntegerForLoop;
41  import edu.rit.pj.ParallelRegion;
42  import edu.rit.pj.ParallelTeam;
43  import edu.rit.pj.reduction.SharedDouble;
44  import edu.rit.pj.reduction.SharedInteger;
45  import ffx.crystal.Crystal;
46  import ffx.crystal.SymOp;
47  import ffx.numerics.atomic.AtomicDoubleArray;
48  import ffx.numerics.atomic.AtomicDoubleArray.AtomicDoubleArrayImpl;
49  import ffx.numerics.atomic.AtomicDoubleArray3D;
50  import ffx.numerics.multipole.GKEnergyQI;
51  import ffx.numerics.multipole.GKEnergyQISIMD;
52  import ffx.numerics.multipole.PolarizableMultipole;
53  import ffx.numerics.multipole.PolarizableMultipoleSIMD;
54  import ffx.numerics.multipole.QIFrame;
55  import ffx.numerics.multipole.QIFrameSIMD;
56  import ffx.potential.bonded.Atom;
57  import ffx.potential.nonbonded.GeneralizedKirkwood.NonPolarModel;
58  import ffx.potential.nonbonded.pme.Polarization;
59  import jdk.incubator.vector.DoubleVector;
60  
61  import java.util.List;
62  import java.util.logging.Level;
63  import java.util.logging.Logger;
64  
65  import static ffx.numerics.multipole.GKSource.cn;
66  import static ffx.potential.parameters.MultipoleType.t000;
67  import static ffx.potential.parameters.MultipoleType.t001;
68  import static ffx.potential.parameters.MultipoleType.t002;
69  import static ffx.potential.parameters.MultipoleType.t010;
70  import static ffx.potential.parameters.MultipoleType.t011;
71  import static ffx.potential.parameters.MultipoleType.t020;
72  import static ffx.potential.parameters.MultipoleType.t100;
73  import static ffx.potential.parameters.MultipoleType.t101;
74  import static ffx.potential.parameters.MultipoleType.t110;
75  import static ffx.potential.parameters.MultipoleType.t200;
76  import static java.lang.String.format;
77  import static java.util.Arrays.fill;
78  import static jdk.incubator.vector.DoubleVector.SPECIES_PREFERRED;
79  import static jdk.incubator.vector.DoubleVector.broadcast;
80  import static jdk.incubator.vector.DoubleVector.fromArray;
81  import static jdk.incubator.vector.VectorOperators.ADD;
82  import static org.apache.commons.math3.util.FastMath.exp;
83  import static org.apache.commons.math3.util.FastMath.sqrt;
84  
85  /**
86   * Parallel calculation of the Generalized Kirkwood reaction field energy.
87   *
88   * @author Michael J. Schnieders
89   * @since 1.0
90   */
91  public class GKEnergyRegion extends ParallelRegion {
92  
93    private static final Logger logger = Logger.getLogger(GKEnergyRegion.class.getName());
94    /**
95     * Constant factor used with quadrupoles.
96     */
97    protected static final double oneThird = 1.0 / 3.0;
98    /**
99     * Conversion from electron**2/Ang to kcal/mole.
100    */
101   protected final double electric;
102   /**
103    * Treatment of polarization.
104    */
105   protected final Polarization polarization;
106   protected final NonPolarModel nonPolarModel;
107 
108   private final double soluteDielectric;
109   private final double solventDielectric;
110 
111   /**
112    * Dielectric offset from:
113    *
114    * <p>W. C. Still, A. Tempczyk, R. C. Hawley and T. Hendrickson, "A Semianalytical Treatment of
115    * Solvation for Molecular Mechanics and Dynamics", J. Amer. Chem. Soc., 112, 6127-6129 (1990)
116    */
117   protected final double dOffset = 0.09;
118   /**
119    * Cavitation surface tension coefficient (kcal/mol/A^2).
120    */
121   protected final double surfaceTension;
122   /**
123    * Empirical constant that controls the GK cross-term.
124    */
125   protected final double gkc;
126   /**
127    * Kirkwood monopole reaction field constant.
128    */
129   private final double fc;
130   /**
131    * Kirkwood dipole reaction field constant.
132    */
133   private final double fd;
134   /**
135    * Kirkwood quadrupole reaction field constant.
136    */
137   private final double fq;
138   /**
139    * Water probe radius.
140    */
141   private final double probe;
142   private final SharedDouble sharedPermanentGKEnergy;
143   private final SharedDouble sharedPolarizationGKEnergy;
144   private final SharedDouble sharedGKEnergy;
145   private final SharedInteger sharedInteractions;
146   private final IntegerForLoop[] gkEnergyLoop;
147   /**
148    * An ordered array of atoms in the system.
149    */
150   private Atom[] atoms;
151   /**
152    * Induced dipoles for each symmetry operator.
153    */
154   private double[][][] inducedDipole;
155   /**
156    * Induced dipole chain rule terms for each symmetry operator.
157    */
158   private double[][][] inducedDipoleCR;
159   /**
160    * Multipole moments for each symmetry operator.
161    */
162   private double[][][] globalMultipole;
163   /**
164    * Periodic boundary conditions and symmetry.
165    */
166   private Crystal crystal;
167   /**
168    * Atomic coordinates for each symmetry operator.
169    */
170   private double[][][] sXYZ;
171   /**
172    * Neighbor lists for each atom and symmetry operator.
173    */
174   private int[][][] neighborLists;
175   /**
176    * Flag to indicate if an atom should be included.
177    */
178   private boolean[] use = null;
179   /**
180    * GK cut-off distance squared.
181    */
182   private double cut2;
183   /**
184    * Base radius of each atom (for Born radii based nonpolar energy).
185    */
186   private double[] baseRadius;
187   /**
188    * Born radius of each atom.
189    */
190   private double[] born;
191 
192   private boolean gradient = false;
193   /**
194    * Atomic 3D Gradient array.
195    */
196   private AtomicDoubleArray3D grad;
197   /**
198    * Atomic 3D Torque array.
199    */
200   private AtomicDoubleArray3D torque;
201   /**
202    * Shared array for computation of Born radii gradient.
203    */
204   private AtomicDoubleArray sharedBornGrad;
205   /**
206    * Self-energy for each atom
207    */
208   private AtomicDoubleArray selfEnergy;
209   /**
210    * Cross-term energy for each atom
211    */
212   private AtomicDoubleArray crossEnergy;
213 
214 
215   public GKEnergyRegion(
216       int nt, Polarization polarization, NonPolarModel nonPolarModel,
217       double surfaceTension, double probe, double electric,
218       double soluteDieletric, double solventDieletric, double gkc, boolean gkQI) {
219 
220     // Set the Kirkwood multipolar reaction field constants.
221     this.soluteDielectric = soluteDieletric;
222     this.solventDielectric = solventDieletric;
223     fc = cn(0, soluteDieletric, solventDieletric);
224     fd = cn(1, soluteDieletric, solventDieletric);
225     fq = cn(2, soluteDieletric, solventDieletric);
226     this.gkc = gkc;
227 
228     this.polarization = polarization;
229     this.nonPolarModel = nonPolarModel;
230     this.surfaceTension = surfaceTension;
231     this.probe = probe;
232     // Set the conversion from electron**2/Ang to kcal/mole
233     this.electric = electric;
234 
235     gkEnergyLoop = new IntegerForLoop[nt];
236     for (int i = 0; i < nt; i++) {
237       if (gkQI) {
238         gkEnergyLoop[i] = new GKEnergyLoopQI();
239         // gkEnergyLoop[i] = new GKEnergyLoopQISIMD();
240       } else {
241         gkEnergyLoop[i] = new GKEnergyLoop();
242       }
243     }
244     sharedPermanentGKEnergy = new SharedDouble();
245     sharedPolarizationGKEnergy = new SharedDouble();
246     sharedGKEnergy = new SharedDouble();
247     sharedInteractions = new SharedInteger();
248   }
249 
250   public double getEnergy() {
251     return sharedGKEnergy.get();
252   }
253 
254   public double getPermanentEnergy() {
255     return sharedPermanentGKEnergy.get();
256   }
257 
258   public double getPolarizationEnergy() {
259     return sharedPolarizationGKEnergy.get();
260   }
261 
262   public AtomicDoubleArray getSelfEnergy() {
263     int nAtoms = atoms.length;
264     selfEnergy.reduce(0, nAtoms - 1);
265     return selfEnergy;
266   }
267 
268   public int getInteractions() {
269     return sharedInteractions.get();
270   }
271 
272   public void init(
273       Atom[] atoms,
274       double[][][] globalMultipole,
275       double[][][] inducedDipole,
276       double[][][] inducedDipoleCR,
277       Crystal crystal,
278       double[][][] sXYZ,
279       int[][][] neighborLists,
280       boolean[] use,
281       double cut2,
282       double[] baseRadius,
283       double[] born,
284       boolean gradient,
285       ParallelTeam parallelTeam,
286       AtomicDoubleArray3D grad,
287       AtomicDoubleArray3D torque,
288       AtomicDoubleArray sharedBornGrad) {
289     // Input
290     this.atoms = atoms;
291     this.globalMultipole = globalMultipole;
292     this.inducedDipole = inducedDipole;
293     this.inducedDipoleCR = inducedDipoleCR;
294     this.crystal = crystal;
295     this.sXYZ = sXYZ;
296     this.neighborLists = neighborLists;
297     this.use = use;
298     this.cut2 = cut2;
299     this.baseRadius = baseRadius;
300     this.born = born;
301     this.gradient = gradient;
302     // Output
303     this.grad = grad;
304     this.torque = torque;
305     this.sharedBornGrad = sharedBornGrad;
306 
307     int nAtoms = atoms.length;
308     int nThreads = gkEnergyLoop.length;
309     if (selfEnergy == null || selfEnergy.size() != atoms.length) {
310       selfEnergy = AtomicDoubleArray.atomicDoubleArrayFactory(
311           AtomicDoubleArrayImpl.MULTI, nThreads, nAtoms);
312       crossEnergy = AtomicDoubleArray.atomicDoubleArrayFactory(
313           AtomicDoubleArrayImpl.MULTI, nThreads, nAtoms);
314     } else {
315       selfEnergy.reset(parallelTeam, 0, nAtoms - 1);
316       crossEnergy.reset(parallelTeam, 0, nAtoms - 1);
317     }
318   }
319 
320   @Override
321   public void run() {
322     try {
323       int nAtoms = atoms.length;
324       int threadIndex = getThreadIndex();
325       execute(0, nAtoms - 1, gkEnergyLoop[threadIndex]);
326     } catch (Exception e) {
327       String message = "Fatal exception computing GK Energy in thread " + getThreadIndex() + "\n";
328       logger.log(Level.SEVERE, message, e);
329     }
330   }
331 
332   @Override
333   public void start() {
334     sharedPermanentGKEnergy.set(0.0);
335     sharedPolarizationGKEnergy.set(0.0);
336     sharedGKEnergy.set(0.0);
337     sharedInteractions.set(0);
338   }
339 
340   @Override
341   public void finish() {
342     if (logger.isLoggable(Level.FINER)) {
343       int nAtoms = atoms.length;
344       selfEnergy.reduce(0, nAtoms - 1);
345       crossEnergy.reduce(0, nAtoms - 1);
346       logger.finer(" Generalized Kirkwood Self-Energies and Cross-Energies\n");
347       double selfSum = 0.0;
348       double crossSum = 0.0;
349       for (int i = 0; i < nAtoms; i++) {
350         double self = selfEnergy.get(i);
351         double cross = crossEnergy.get(i);
352         logger.finer(format("GKSELF   %5d %16.8f %16.8f", i, self, cross));
353         selfSum += self;
354         crossSum += cross;
355       }
356       logger.finer(format("       %16.8f %16.8f %16.8f\n",
357           selfSum, crossSum, selfSum + crossSum));
358     }
359   }
360 
361   /**
362    * Compute the GK Energy.
363    *
364    * @since 1.0
365    */
366   private class GKEnergyLoop extends IntegerForLoop {
367 
368     private final double[][] a;
369     private final double[][] b;
370     private final double[] gc;
371     private final double[] gux;
372     private final double[] guy;
373     private final double[] guz;
374     private final double[] gqxx;
375     private final double[] gqyy;
376     private final double[] gqzz;
377     private final double[] gqxy;
378     private final double[] gqxz;
379     private final double[] gqyz;
380     private final double[] dx_local;
381     private double ci, uxi, uyi, uzi, qxxi, qxyi, qxzi, qyyi, qyzi, qzzi;
382     private double ck, uxk, uyk, uzk, qxxk, qxyk, qxzk, qyyk, qyzk, qzzk;
383     private double dxi, dyi, dzi, pxi, pyi, pzi, sxi, syi, szi;
384     private double dxk, dyk, dzk, pxk, pyk, pzk, sxk, syk, szk;
385     private double xr, yr, zr, xr2, yr2, zr2, rbi, rbk;
386     private double xi, yi, zi;
387     private double dedxi, dedyi, dedzi;
388     private double dborni;
389     private double trqxi, trqyi, trqzi;
390     private int count;
391     private int iSymm;
392     private int threadID;
393     private final double[][] transOp;
394     private double gkPermanentEnergy;
395     private double gkPolarizationEnergy;
396     private double gkEnergy;
397 
398     GKEnergyLoop() {
399       a = new double[6][4];
400       b = new double[5][3];
401       gc = new double[31];
402       gux = new double[31];
403       guy = new double[31];
404       guz = new double[31];
405       gqxx = new double[31];
406       gqyy = new double[31];
407       gqzz = new double[31];
408       gqxy = new double[31];
409       gqxz = new double[31];
410       gqyz = new double[31];
411       dx_local = new double[3];
412       transOp = new double[3][3];
413     }
414 
415     @Override
416     public void finish() {
417       sharedInteractions.addAndGet(count);
418       sharedGKEnergy.addAndGet(gkEnergy);
419       sharedPermanentGKEnergy.addAndGet(gkPermanentEnergy);
420       sharedPolarizationGKEnergy.addAndGet(gkPolarizationEnergy);
421     }
422 
423     @Override
424     public void run(int lb, int ub) {
425 
426       double[] x = sXYZ[0][0];
427       double[] y = sXYZ[0][1];
428       double[] z = sXYZ[0][2];
429 
430       int nSymm = crystal.spaceGroup.symOps.size();
431       List<SymOp> symOps = crystal.spaceGroup.symOps;
432 
433       for (iSymm = 0; iSymm < nSymm; iSymm++) {
434         SymOp symOp = symOps.get(iSymm);
435         crystal.getTransformationOperator(symOp, transOp);
436         for (int i = lb; i <= ub; i++) {
437           if (!use[i]) {
438             continue;
439           }
440 
441           // Zero out force accumulation for atom i.
442           dedxi = 0.0;
443           dedyi = 0.0;
444           dedzi = 0.0;
445           dborni = 0.0;
446           trqxi = 0.0;
447           trqyi = 0.0;
448           trqzi = 0.0;
449 
450           xi = x[i];
451           yi = y[i];
452           zi = z[i];
453           final double[] multipolei = globalMultipole[0][i];
454           ci = multipolei[t000];
455           uxi = multipolei[t100];
456           uyi = multipolei[t010];
457           uzi = multipolei[t001];
458           qxxi = multipolei[t200] * oneThird;
459           qyyi = multipolei[t020] * oneThird;
460           qzzi = multipolei[t002] * oneThird;
461           qxyi = multipolei[t110] * oneThird;
462           qxzi = multipolei[t101] * oneThird;
463           qyzi = multipolei[t011] * oneThird;
464           dxi = inducedDipole[0][i][0];
465           dyi = inducedDipole[0][i][1];
466           dzi = inducedDipole[0][i][2];
467           pxi = inducedDipoleCR[0][i][0];
468           pyi = inducedDipoleCR[0][i][1];
469           pzi = inducedDipoleCR[0][i][2];
470           sxi = dxi + pxi;
471           syi = dyi + pyi;
472           szi = dzi + pzi;
473           rbi = born[i];
474           int[] list = neighborLists[iSymm][i];
475           for (int k : list) {
476             if (!use[k]) {
477               continue;
478             }
479             interaction(i, k);
480           }
481           if (iSymm == 0) {
482             // Include self-interactions for the asymmetric unit atoms.
483             interaction(i, i);
484             /*
485              Formula for Born energy approximation for cavitation energy is:
486              e = surfaceTension / 6 * (ri + probe)^2 * (ri/rb)^6.
487              ri is the base atomic radius the atom.
488              rb is Born radius of the atom.
489             */
490             switch (nonPolarModel) {
491               case BORN_SOLV:
492               case BORN_CAV_DISP:
493                 double r = baseRadius[i] + dOffset + probe;
494                 double ratio = (baseRadius[i] + dOffset) / born[i];
495                 ratio *= ratio;
496                 ratio *= (ratio * ratio);
497                 double saTerm = surfaceTension * r * r * ratio / 6.0;
498                 gkEnergy += saTerm;
499                 sharedBornGrad.sub(threadID, i, 6.0 * saTerm / born[i]);
500                 break;
501               default:
502                 break;
503             }
504           }
505           if (gradient) {
506             grad.add(threadID, i, dedxi, dedyi, dedzi);
507             torque.add(threadID, i, trqxi, trqyi, trqzi);
508             sharedBornGrad.add(threadID, i, dborni);
509           }
510         }
511       }
512     }
513 
514     @Override
515     public void start() {
516       gkEnergy = 0.0;
517       gkPermanentEnergy = 0.0;
518       gkPolarizationEnergy = 0.0;
519       count = 0;
520       threadID = getThreadIndex();
521     }
522 
523     private void interaction(int i, int k) {
524       dx_local[0] = sXYZ[iSymm][0][k] - xi;
525       dx_local[1] = sXYZ[iSymm][1][k] - yi;
526       dx_local[2] = sXYZ[iSymm][2][k] - zi;
527       double r2 = crystal.image(dx_local);
528       if (r2 > cut2) {
529         return;
530       }
531       xr = dx_local[0];
532       yr = dx_local[1];
533       zr = dx_local[2];
534       xr2 = xr * xr;
535       yr2 = yr * yr;
536       zr2 = zr * zr;
537       rbk = born[k];
538 
539       final double[] multipolek = globalMultipole[iSymm][k];
540       ck = multipolek[t000];
541       uxk = multipolek[t100];
542       uyk = multipolek[t010];
543       uzk = multipolek[t001];
544       qxxk = multipolek[t200] * oneThird;
545       qyyk = multipolek[t020] * oneThird;
546       qzzk = multipolek[t002] * oneThird;
547       qxyk = multipolek[t110] * oneThird;
548       qxzk = multipolek[t101] * oneThird;
549       qyzk = multipolek[t011] * oneThird;
550       dxk = inducedDipole[iSymm][k][0];
551       dyk = inducedDipole[iSymm][k][1];
552       dzk = inducedDipole[iSymm][k][2];
553       pxk = inducedDipoleCR[iSymm][k][0];
554       pyk = inducedDipoleCR[iSymm][k][1];
555       pzk = inducedDipoleCR[iSymm][k][2];
556       sxk = dxk + pxk;
557       syk = dyk + pyk;
558       szk = dzk + pzk;
559       final double rb2 = rbi * rbk;
560       final double expterm = exp(-r2 / (gkc * rb2));
561       final double expc = expterm / gkc;
562       final double expc1 = 1.0 - expc;
563       final double expcr = r2 * expterm / (gkc * gkc * rb2 * rb2);
564       final double dexpc = -2.0 / (gkc * rb2);
565       double expcdexpc = -expc * dexpc;
566       final double dexpcr = 2.0 / (gkc * rb2 * rb2);
567       final double dgfdr = 0.5 * expterm * (1.0 + r2 / (rb2 * gkc));
568       final double gf2 = 1.0 / (r2 + rb2 * expterm);
569       final double gf = sqrt(gf2);
570       final double gf3 = gf2 * gf;
571       final double gf5 = gf3 * gf2;
572       final double gf7 = gf5 * gf2;
573       final double gf9 = gf7 * gf2;
574       final double gf11 = gf9 * gf2;
575 
576       // Reaction potential auxiliary terms.
577       a[0][0] = gf;
578       a[1][0] = -gf3;
579       a[2][0] = 3.0 * gf5;
580       a[3][0] = -15.0 * gf7;
581       a[4][0] = 105.0 * gf9;
582       a[5][0] = -945.0 * gf11;
583 
584       // Reaction potential gradient auxiliary terms.
585       a[0][1] = expc1 * a[1][0];
586       a[1][1] = expc1 * a[2][0];
587       a[2][1] = expc1 * a[3][0];
588       a[3][1] = expc1 * a[4][0];
589       a[4][1] = expc1 * a[5][0];
590 
591       // 2nd reaction potential gradient auxiliary terms.
592       a[0][2] = expc1 * a[1][1] + expcdexpc * a[1][0];
593       a[1][2] = expc1 * a[2][1] + expcdexpc * a[2][0];
594       a[2][2] = expc1 * a[3][1] + expcdexpc * a[3][0];
595       a[3][2] = expc1 * a[4][1] + expcdexpc * a[4][0];
596 
597       if (gradient) {
598 
599         // 3rd reaction potential gradient auxiliary terms.
600         expcdexpc = 2.0 * expcdexpc;
601         a[0][3] = expc1 * a[1][2] + expcdexpc * a[1][1];
602         a[1][3] = expc1 * a[2][2] + expcdexpc * a[2][1];
603         a[2][3] = expc1 * a[3][2] + expcdexpc * a[3][1];
604         expcdexpc = -expc * dexpc * dexpc;
605         a[0][3] = a[0][3] + expcdexpc * a[1][0];
606         a[1][3] = a[1][3] + expcdexpc * a[2][0];
607         a[2][3] = a[2][3] + expcdexpc * a[3][0];
608 
609         // Born radii derivatives of reaction potential auxiliary terms.
610         b[0][0] = dgfdr * a[1][0];
611         b[1][0] = dgfdr * a[2][0];
612         b[2][0] = dgfdr * a[3][0];
613         b[3][0] = dgfdr * a[4][0];
614         b[4][0] = dgfdr * a[5][0];
615 
616         // Born radii gradients of reaction potential gradient auxiliary terms.
617         b[0][1] = b[1][0] - expcr * a[1][0] - expc * b[1][0];
618         b[1][1] = b[2][0] - expcr * a[2][0] - expc * b[2][0];
619         b[2][1] = b[3][0] - expcr * a[3][0] - expc * b[3][0];
620         b[3][1] = b[4][0] - expcr * a[4][0] - expc * b[4][0];
621 
622         // Born radii derivatives of the 2nd reaction potential gradient auxiliary terms.
623         b[0][2] = b[1][1] - (expcr * (a[1][1] + dexpc * a[1][0])
624             + expc * (b[1][1] + dexpcr * a[1][0] + dexpc * b[1][0]));
625         b[1][2] = b[2][1] - (expcr * (a[2][1] + dexpc * a[2][0])
626             + expc * (b[2][1] + dexpcr * a[2][0] + dexpc * b[2][0]));
627         b[2][2] = b[3][1] - (expcr * (a[3][1] + dexpc * a[3][0])
628             + expc * (b[3][1] + dexpcr * a[3][0] + dexpc * b[3][0]));
629 
630         // Multiply the Born radii auxiliary terms by their dielectric functions.
631         b[0][0] = electric * fc * b[0][0];
632         b[0][1] = electric * fc * b[0][1];
633         b[0][2] = electric * fc * b[0][2];
634         b[1][0] = electric * fd * b[1][0];
635         b[1][1] = electric * fd * b[1][1];
636         b[1][2] = electric * fd * b[1][2];
637         b[2][0] = electric * fq * b[2][0];
638         b[2][1] = electric * fq * b[2][1];
639         b[2][2] = electric * fq * b[2][2];
640       }
641 
642       // Multiply the potential auxiliary terms by their dielectric functions.
643       a[0][0] = electric * fc * a[0][0];
644       a[0][1] = electric * fc * a[0][1];
645       a[0][2] = electric * fc * a[0][2];
646       a[0][3] = electric * fc * a[0][3];
647       a[1][0] = electric * fd * a[1][0];
648       a[1][1] = electric * fd * a[1][1];
649       a[1][2] = electric * fd * a[1][2];
650       a[1][3] = electric * fd * a[1][3];
651       a[2][0] = electric * fq * a[2][0];
652       a[2][1] = electric * fq * a[2][1];
653       a[2][2] = electric * fq * a[2][2];
654       a[2][3] = electric * fq * a[2][3];
655 
656       // Compute the GK tensors required to compute the energy.
657       energyTensors();
658 
659       // Compute the GK interaction energy.
660       double eik = energy(i, k);
661       gkEnergy += eik;
662       count++;
663 
664       // List<Atom> i12 = atoms[i].get12List();
665       // List<Atom> i13 = atoms[i].get13List();
666       // List<Atom> i14 = atoms[i].get14List();
667       // List<Atom> i15 = atoms[i].get15List();
668       // Atom aK = atoms[k];
669       // if (i != k && !i12.contains(aK) && !i13.contains(aK) && !i14.contains(aK) && !i15.contains(aK)) {
670       //   logger.info(format(" GK %s %7.4f %s %7.4f %7.4f %7.4f", atoms[i], rbi, atoms[k], rbk, sqrt(r2), eik));
671       // }
672 
673       if (gradient) {
674         // Compute the additional GK tensors required to compute the energy gradient.
675         gradientTensors();
676 
677         // Compute the permanent GK energy gradient.
678         permanentEnergyGradient(i, k);
679 
680         if (polarization != Polarization.NONE) {
681           // Compute the induced GK energy gradient.
682           polarizationEnergyGradient(i, k);
683         }
684       }
685     }
686 
687     private void energyTensors() {
688       // Unweighted reaction potential tensor.
689       gc[1] = a[0][0];
690       gux[1] = xr * a[1][0];
691       guy[1] = yr * a[1][0];
692       guz[1] = zr * a[1][0];
693       gqxx[1] = xr2 * a[2][0];
694       gqyy[1] = yr2 * a[2][0];
695       gqzz[1] = zr2 * a[2][0];
696       gqxy[1] = xr * yr * a[2][0];
697       gqxz[1] = xr * zr * a[2][0];
698       gqyz[1] = yr * zr * a[2][0];
699 
700       // Unweighted reaction potential gradient tensor.
701       gc[2] = xr * a[0][1];
702       gc[3] = yr * a[0][1];
703       gc[4] = zr * a[0][1];
704       gux[2] = a[1][0] + xr2 * a[1][1];
705       gux[3] = xr * yr * a[1][1];
706       gux[4] = xr * zr * a[1][1];
707       guy[2] = gux[3];
708       guy[3] = a[1][0] + yr2 * a[1][1];
709       guy[4] = yr * zr * a[1][1];
710       guz[2] = gux[4];
711       guz[3] = guy[4];
712       guz[4] = a[1][0] + zr2 * a[1][1];
713       gqxx[2] = xr * (2.0 * a[2][0] + xr2 * a[2][1]);
714       gqxx[3] = yr * xr2 * a[2][1];
715       gqxx[4] = zr * xr2 * a[2][1];
716       gqyy[2] = xr * yr2 * a[2][1];
717       gqyy[3] = yr * (2.0 * a[2][0] + yr2 * a[2][1]);
718       gqyy[4] = zr * yr2 * a[2][1];
719       gqzz[2] = xr * zr2 * a[2][1];
720       gqzz[3] = yr * zr2 * a[2][1];
721       gqzz[4] = zr * (2.0 * a[2][0] + zr2 * a[2][1]);
722       gqxy[2] = yr * (a[2][0] + xr2 * a[2][1]);
723       gqxy[3] = xr * (a[2][0] + yr2 * a[2][1]);
724       gqxy[4] = zr * xr * yr * a[2][1];
725       gqxz[2] = zr * (a[2][0] + xr2 * a[2][1]);
726       gqxz[3] = gqxy[4];
727       gqxz[4] = xr * (a[2][0] + zr2 * a[2][1]);
728       gqyz[2] = gqxy[4];
729       gqyz[3] = zr * (a[2][0] + yr2 * a[2][1]);
730       gqyz[4] = yr * (a[2][0] + zr2 * a[2][1]);
731 
732       // Unweighted 2nd reaction potential gradient tensor.
733       gc[5] = a[0][1] + xr2 * a[0][2];
734       gc[6] = xr * yr * a[0][2];
735       gc[7] = xr * zr * a[0][2];
736       gc[8] = a[0][1] + yr2 * a[0][2];
737       gc[9] = yr * zr * a[0][2];
738       gc[10] = a[0][1] + zr2 * a[0][2];
739       gux[5] = xr * (3.0 * a[1][1] + xr2 * a[1][2]);
740       gux[6] = yr * (a[1][1] + xr2 * a[1][2]);
741       gux[7] = zr * (a[1][1] + xr2 * a[1][2]);
742       gux[8] = xr * (a[1][1] + yr2 * a[1][2]);
743       gux[9] = zr * xr * yr * a[1][2];
744       gux[10] = xr * (a[1][1] + zr2 * a[1][2]);
745       guy[5] = yr * (a[1][1] + xr2 * a[1][2]);
746       guy[6] = xr * (a[1][1] + yr2 * a[1][2]);
747       guy[7] = gux[9];
748       guy[8] = yr * (3.0 * a[1][1] + yr2 * a[1][2]);
749       guy[9] = zr * (a[1][1] + yr2 * a[1][2]);
750       guy[10] = yr * (a[1][1] + zr2 * a[1][2]);
751       guz[5] = zr * (a[1][1] + xr2 * a[1][2]);
752       guz[6] = gux[9];
753       guz[7] = xr * (a[1][1] + zr2 * a[1][2]);
754       guz[8] = zr * (a[1][1] + yr2 * a[1][2]);
755       guz[9] = yr * (a[1][1] + zr2 * a[1][2]);
756       guz[10] = zr * (3.0 * a[1][1] + zr2 * a[1][2]);
757       gqxx[5] = 2.0 * a[2][0] + xr2 * (5.0 * a[2][1] + xr2 * a[2][2]);
758       gqxx[6] = yr * xr * (2.0 * a[2][1] + xr2 * a[2][2]);
759       gqxx[7] = zr * xr * (2.0 * a[2][1] + xr2 * a[2][2]);
760       gqxx[8] = xr2 * (a[2][1] + yr2 * a[2][2]);
761       gqxx[9] = zr * yr * xr2 * a[2][2];
762       gqxx[10] = xr2 * (a[2][1] + zr2 * a[2][2]);
763       gqyy[5] = yr2 * (a[2][1] + xr2 * a[2][2]);
764       gqyy[6] = xr * yr * (2.0 * a[2][1] + yr2 * a[2][2]);
765       gqyy[7] = xr * zr * yr2 * a[2][2];
766       gqyy[8] = 2.0 * a[2][0] + yr2 * (5.0 * a[2][1] + yr2 * a[2][2]);
767       gqyy[9] = yr * zr * (2.0 * a[2][1] + yr2 * a[2][2]);
768       gqyy[10] = yr2 * (a[2][1] + zr2 * a[2][2]);
769       gqzz[5] = zr2 * (a[2][1] + xr2 * a[2][2]);
770       gqzz[6] = xr * yr * zr2 * a[2][2];
771       gqzz[7] = xr * zr * (2.0 * a[2][1] + zr2 * a[2][2]);
772       gqzz[8] = zr2 * (a[2][1] + yr2 * a[2][2]);
773       gqzz[9] = yr * zr * (2.0 * a[2][1] + zr2 * a[2][2]);
774       gqzz[10] = 2.0 * a[2][0] + zr2 * (5.0 * a[2][1] + zr2 * a[2][2]);
775       gqxy[5] = xr * yr * (3.0 * a[2][1] + xr2 * a[2][2]);
776       gqxy[6] = a[2][0] + (xr2 + yr2) * a[2][1] + xr2 * yr2 * a[2][2];
777       gqxy[7] = zr * yr * (a[2][1] + xr2 * a[2][2]);
778       gqxy[8] = xr * yr * (3.0 * a[2][1] + yr2 * a[2][2]);
779       gqxy[9] = zr * xr * (a[2][1] + yr2 * a[2][2]);
780       gqxy[10] = xr * yr * (a[2][1] + zr2 * a[2][2]);
781       gqxz[5] = xr * zr * (3.0 * a[2][1] + xr2 * a[2][2]);
782       gqxz[6] = yr * zr * (a[2][1] + xr2 * a[2][2]);
783       gqxz[7] = a[2][0] + (xr2 + zr2) * a[2][1] + xr2 * zr2 * a[2][2];
784       gqxz[8] = xr * zr * (a[2][1] + yr2 * a[2][2]);
785       gqxz[9] = xr * yr * (a[2][1] + zr2 * a[2][2]);
786       gqxz[10] = xr * zr * (3.0 * a[2][1] + zr2 * a[2][2]);
787       gqyz[5] = zr * yr * (a[2][1] + xr2 * a[2][2]);
788       gqyz[6] = xr * zr * (a[2][1] + yr2 * a[2][2]);
789       gqyz[7] = xr * yr * (a[2][1] + zr2 * a[2][2]);
790       gqyz[8] = yr * zr * (3.0 * a[2][1] + yr2 * a[2][2]);
791       gqyz[9] = a[2][0] + (yr2 + zr2) * a[2][1] + yr2 * zr2 * a[2][2];
792       gqyz[10] = yr * zr * (3.0 * a[2][1] + zr2 * a[2][2]);
793     }
794 
795     private double energy(int i, int k) {
796       // Electrostatic solvation energy of the permanent multipoles in their own GK reaction
797       // potential.
798       double esym =
799           ci * ck * gc[1]
800               - (uxi * (uxk * gux[2] + uyk * guy[2] + uzk * guz[2])
801               + uyi * (uxk * gux[3] + uyk * guy[3] + uzk * guz[3])
802               + uzi * (uxk * gux[4] + uyk * guy[4] + uzk * guz[4]));
803       double ewi =
804           ci * (uxk * gc[2] + uyk * gc[3] + uzk * gc[4])
805               - ck * (uxi * gux[1] + uyi * guy[1] + uzi * guz[1])
806               + ci
807               * (qxxk * gc[5]
808               + qyyk * gc[8]
809               + qzzk * gc[10]
810               + 2.0 * (qxyk * gc[6] + qxzk * gc[7] + qyzk * gc[9]))
811               + ck
812               * (qxxi * gqxx[1]
813               + qyyi * gqyy[1]
814               + qzzi * gqzz[1]
815               + 2.0 * (qxyi * gqxy[1] + qxzi * gqxz[1] + qyzi * gqyz[1]))
816               - uxi
817               * (qxxk * gux[5]
818               + qyyk * gux[8]
819               + qzzk * gux[10]
820               + 2.0 * (qxyk * gux[6] + qxzk * gux[7] + qyzk * gux[9]))
821               - uyi
822               * (qxxk * guy[5]
823               + qyyk * guy[8]
824               + qzzk * guy[10]
825               + 2.0 * (qxyk * guy[6] + qxzk * guy[7] + qyzk * guy[9]))
826               - uzi
827               * (qxxk * guz[5]
828               + qyyk * guz[8]
829               + qzzk * guz[10]
830               + 2.0 * (qxyk * guz[6] + qxzk * guz[7] + qyzk * guz[9]))
831               + uxk
832               * (qxxi * gqxx[2]
833               + qyyi * gqyy[2]
834               + qzzi * gqzz[2]
835               + 2.0 * (qxyi * gqxy[2] + qxzi * gqxz[2] + qyzi * gqyz[2]))
836               + uyk
837               * (qxxi * gqxx[3]
838               + qyyi * gqyy[3]
839               + qzzi * gqzz[3]
840               + 2.0 * (qxyi * gqxy[3] + qxzi * gqxz[3] + qyzi * gqyz[3]))
841               + uzk
842               * (qxxi * gqxx[4]
843               + qyyi * gqyy[4]
844               + qzzi * gqzz[4]
845               + 2.0 * (qxyi * gqxy[4] + qxzi * gqxz[4] + qyzi * gqyz[4]))
846               + qxxi
847               * (qxxk * gqxx[5]
848               + qyyk * gqxx[8]
849               + qzzk * gqxx[10]
850               + 2.0 * (qxyk * gqxx[6] + qxzk * gqxx[7] + qyzk * gqxx[9]))
851               + qyyi
852               * (qxxk * gqyy[5]
853               + qyyk * gqyy[8]
854               + qzzk * gqyy[10]
855               + 2.0 * (qxyk * gqyy[6] + qxzk * gqyy[7] + qyzk * gqyy[9]))
856               + qzzi
857               * (qxxk * gqzz[5]
858               + qyyk * gqzz[8]
859               + qzzk * gqzz[10]
860               + 2.0 * (qxyk * gqzz[6] + qxzk * gqzz[7] + qyzk * gqzz[9]))
861               + 2.0
862               * (qxyi
863               * (qxxk * gqxy[5]
864               + qyyk * gqxy[8]
865               + qzzk * gqxy[10]
866               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxy[7] + qyzk * gqxy[9]))
867               + qxzi
868               * (qxxk * gqxz[5]
869               + qyyk * gqxz[8]
870               + qzzk * gqxz[10]
871               + 2.0 * (qxyk * gqxz[6] + qxzk * gqxz[7] + qyzk * gqxz[9]))
872               + qyzi
873               * (qxxk * gqyz[5]
874               + qyyk * gqyz[8]
875               + qzzk * gqyz[10]
876               + 2.0 * (qxyk * gqyz[6] + qxzk * gqyz[7] + qyzk * gqyz[9])));
877       double ewk =
878           ci * (uxk * gux[1] + uyk * guy[1] + uzk * guz[1])
879               - ck * (uxi * gc[2] + uyi * gc[3] + uzi * gc[4])
880               + ci
881               * (qxxk * gqxx[1]
882               + qyyk * gqyy[1]
883               + qzzk * gqzz[1]
884               + 2.0 * (qxyk * gqxy[1] + qxzk * gqxz[1] + qyzk * gqyz[1]))
885               + ck
886               * (qxxi * gc[5]
887               + qyyi * gc[8]
888               + qzzi * gc[10]
889               + 2.0 * (qxyi * gc[6] + qxzi * gc[7] + qyzi * gc[9]))
890               - uxi
891               * (qxxk * gqxx[2]
892               + qyyk * gqyy[2]
893               + qzzk * gqzz[2]
894               + 2.0 * (qxyk * gqxy[2] + qxzk * gqxz[2] + qyzk * gqyz[2]))
895               - uyi
896               * (qxxk * gqxx[3]
897               + qyyk * gqyy[3]
898               + qzzk * gqzz[3]
899               + 2.0 * (qxyk * gqxy[3] + qxzk * gqxz[3] + qyzk * gqyz[3]))
900               - uzi
901               * (qxxk * gqxx[4]
902               + qyyk * gqyy[4]
903               + qzzk * gqzz[4]
904               + 2.0 * (qxyk * gqxy[4] + qxzk * gqxz[4] + qyzk * gqyz[4]))
905               + uxk
906               * (qxxi * gux[5]
907               + qyyi * gux[8]
908               + qzzi * gux[10]
909               + 2.0 * (qxyi * gux[6] + qxzi * gux[7] + qyzi * gux[9]))
910               + uyk
911               * (qxxi * guy[5]
912               + qyyi * guy[8]
913               + qzzi * guy[10]
914               + 2.0 * (qxyi * guy[6] + qxzi * guy[7] + qyzi * guy[9]))
915               + uzk
916               * (qxxi * guz[5]
917               + qyyi * guz[8]
918               + qzzi * guz[10]
919               + 2.0 * (qxyi * guz[6] + qxzi * guz[7] + qyzi * guz[9]))
920               + qxxi
921               * (qxxk * gqxx[5]
922               + qyyk * gqyy[5]
923               + qzzk * gqzz[5]
924               + 2.0 * (qxyk * gqxy[5] + qxzk * gqxz[5] + qyzk * gqyz[5]))
925               + qyyi
926               * (qxxk * gqxx[8]
927               + qyyk * gqyy[8]
928               + qzzk * gqzz[8]
929               + 2.0 * (qxyk * gqxy[8] + qxzk * gqxz[8] + qyzk * gqyz[8]))
930               + qzzi
931               * (qxxk * gqxx[10]
932               + qyyk * gqyy[10]
933               + qzzk * gqzz[10]
934               + 2.0 * (qxyk * gqxy[10] + qxzk * gqxz[10] + qyzk * gqyz[10]))
935               + 2.0
936               * (qxyi
937               * (qxxk * gqxx[6]
938               + qyyk * gqyy[6]
939               + qzzk * gqzz[6]
940               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]))
941               + qxzi
942               * (qxxk * gqxx[7]
943               + qyyk * gqyy[7]
944               + qzzk * gqzz[7]
945               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]))
946               + qyzi
947               * (qxxk * gqxx[9]
948               + qyyk * gqyy[9]
949               + qzzk * gqzz[9]
950               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9])));
951       double e = esym + 0.5 * (ewi + ewk);
952       double ei = 0.0;
953 
954       // Electrostatic solvation energy of the permanent multipoles in the
955       // GK reaction potential of the induced dipoles.
956       if (polarization != Polarization.NONE) {
957         double esymi =
958             -uxi * (dxk * gux[2] + dyk * guy[2] + dzk * guz[2])
959                 - uyi * (dxk * gux[3] + dyk * guy[3] + dzk * guz[3])
960                 - uzi * (dxk * gux[4] + dyk * guy[4] + dzk * guz[4])
961                 - uxk * (dxi * gux[2] + dyi * guy[2] + dzi * guz[2])
962                 - uyk * (dxi * gux[3] + dyi * guy[3] + dzi * guz[3])
963                 - uzk * (dxi * gux[4] + dyi * guy[4] + dzi * guz[4]);
964         double ewii =
965             ci * (dxk * gc[2] + dyk * gc[3] + dzk * gc[4])
966                 - ck * (dxi * gux[1] + dyi * guy[1] + dzi * guz[1])
967                 - dxi
968                 * (qxxk * gux[5]
969                 + qyyk * gux[8]
970                 + qzzk * gux[10]
971                 + 2.0 * (qxyk * gux[6] + qxzk * gux[7] + qyzk * gux[9]))
972                 - dyi
973                 * (qxxk * guy[5]
974                 + qyyk * guy[8]
975                 + qzzk * guy[10]
976                 + 2.0 * (qxyk * guy[6] + qxzk * guy[7] + qyzk * guy[9]))
977                 - dzi
978                 * (qxxk * guz[5]
979                 + qyyk * guz[8]
980                 + qzzk * guz[10]
981                 + 2.0 * (qxyk * guz[6] + qxzk * guz[7] + qyzk * guz[9]))
982                 + dxk
983                 * (qxxi * gqxx[2]
984                 + qyyi * gqyy[2]
985                 + qzzi * gqzz[2]
986                 + 2.0 * (qxyi * gqxy[2] + qxzi * gqxz[2] + qyzi * gqyz[2]))
987                 + dyk
988                 * (qxxi * gqxx[3]
989                 + qyyi * gqyy[3]
990                 + qzzi * gqzz[3]
991                 + 2.0 * (qxyi * gqxy[3] + qxzi * gqxz[3] + qyzi * gqyz[3]))
992                 + dzk
993                 * (qxxi * gqxx[4]
994                 + qyyi * gqyy[4]
995                 + qzzi * gqzz[4]
996                 + 2.0 * (qxyi * gqxy[4] + qxzi * gqxz[4] + qyzi * gqyz[4]));
997         double ewki =
998             ci * (dxk * gux[1] + dyk * guy[1] + dzk * guz[1])
999                 - ck * (dxi * gc[2] + dyi * gc[3] + dzi * gc[4])
1000                 - dxi
1001                 * (qxxk * gqxx[2]
1002                 + qyyk * gqyy[2]
1003                 + qzzk * gqzz[2]
1004                 + 2.0 * (qxyk * gqxy[2] + qxzk * gqxz[2] + qyzk * gqyz[2]))
1005                 - dyi
1006                 * (qxxk * gqxx[3]
1007                 + qyyk * gqyy[3]
1008                 + qzzk * gqzz[3]
1009                 + 2.0 * (qxyk * gqxy[3] + qxzk * gqxz[3] + qyzk * gqyz[3]))
1010                 - dzi
1011                 * (qxxk * gqxx[4]
1012                 + qyyk * gqyy[4]
1013                 + qzzk * gqzz[4]
1014                 + 2.0 * (qxyk * gqxy[4] + qxzk * gqxz[4] + qyzk * gqyz[4]))
1015                 + dxk
1016                 * (qxxi * gux[5]
1017                 + qyyi * gux[8]
1018                 + qzzi * gux[10]
1019                 + 2.0 * (qxyi * gux[6] + qxzi * gux[7] + qyzi * gux[9]))
1020                 + dyk
1021                 * (qxxi * guy[5]
1022                 + qyyi * guy[8]
1023                 + qzzi * guy[10]
1024                 + 2.0 * (qxyi * guy[6] + qxzi * guy[7] + qyzi * guy[9]))
1025                 + dzk
1026                 * (qxxi * guz[5]
1027                 + qyyi * guz[8]
1028                 + qzzi * guz[10]
1029                 + 2.0 * (qxyi * guz[6] + qxzi * guz[7] + qyzi * guz[9]));
1030         ei = 0.5 * (esymi + 0.5 * (ewii + ewki));
1031       }
1032 
1033       if (i == k) {
1034         e *= 0.5;
1035         ei *= 0.5;
1036         selfEnergy.add(threadID, i, e + ei);
1037       } else {
1038         double half = 0.5 * (e + ei);
1039         crossEnergy.add(threadID, i, half);
1040         crossEnergy.add(threadID, k, half);
1041       }
1042 
1043       gkPermanentEnergy += e;
1044       gkPolarizationEnergy += ei;
1045 
1046       return e + ei;
1047     }
1048 
1049     private void gradientTensors() {
1050       // Born radii gradients of unweighted reaction potential tensor.
1051       gc[21] = b[0][0];
1052       gux[21] = xr * b[1][0];
1053       guy[21] = yr * b[1][0];
1054       guz[21] = zr * b[1][0];
1055       gqxx[21] = xr2 * b[2][0];
1056       gqyy[21] = yr2 * b[2][0];
1057       gqzz[21] = zr2 * b[2][0];
1058       gqxy[21] = xr * yr * b[2][0];
1059       gqxz[21] = xr * zr * b[2][0];
1060       gqyz[21] = yr * zr * b[2][0];
1061 
1062       // Born gradients of the unweighted reaction potential gradient tensor
1063       gc[22] = xr * b[0][1];
1064       gc[23] = yr * b[0][1];
1065       gc[24] = zr * b[0][1];
1066       gux[22] = b[1][0] + xr2 * b[1][1];
1067       gux[23] = xr * yr * b[1][1];
1068       gux[24] = xr * zr * b[1][1];
1069       guy[22] = gux[23];
1070       guy[23] = b[1][0] + yr2 * b[1][1];
1071       guy[24] = yr * zr * b[1][1];
1072       guz[22] = gux[24];
1073       guz[23] = guy[24];
1074       guz[24] = b[1][0] + zr2 * b[1][1];
1075       gqxx[22] = xr * (2.0 * b[2][0] + xr2 * b[2][1]);
1076       gqxx[23] = yr * xr2 * b[2][1];
1077       gqxx[24] = zr * xr2 * b[2][1];
1078       gqyy[22] = xr * yr2 * b[2][1];
1079       gqyy[23] = yr * (2.0 * b[2][0] + yr2 * b[2][1]);
1080       gqyy[24] = zr * yr2 * b[2][1];
1081       gqzz[22] = xr * zr2 * b[2][1];
1082       gqzz[23] = yr * zr2 * b[2][1];
1083       gqzz[24] = zr * (2.0 * b[2][0] + zr2 * b[2][1]);
1084       gqxy[22] = yr * (b[2][0] + xr2 * b[2][1]);
1085       gqxy[23] = xr * (b[2][0] + yr2 * b[2][1]);
1086       gqxy[24] = zr * xr * yr * b[2][1];
1087       gqxz[22] = zr * (b[2][0] + xr2 * b[2][1]);
1088       gqxz[23] = gqxy[24];
1089       gqxz[24] = xr * (b[2][0] + zr2 * b[2][1]);
1090       gqyz[22] = gqxy[24];
1091       gqyz[23] = zr * (b[2][0] + yr2 * b[2][1]);
1092       gqyz[24] = yr * (b[2][0] + zr2 * b[2][1]);
1093 
1094       // Born radii derivatives of the unweighted 2nd reaction potential gradient tensor.
1095       gc[25] = b[0][1] + xr2 * b[0][2];
1096       gc[26] = xr * yr * b[0][2];
1097       gc[27] = xr * zr * b[0][2];
1098       gc[28] = b[0][1] + yr2 * b[0][2];
1099       gc[29] = yr * zr * b[0][2];
1100       gc[30] = b[0][1] + zr2 * b[0][2];
1101       gux[25] = xr * (3.0 * b[1][1] + xr2 * b[1][2]);
1102       gux[26] = yr * (b[1][1] + xr2 * b[1][2]);
1103       gux[27] = zr * (b[1][1] + xr2 * b[1][2]);
1104       gux[28] = xr * (b[1][1] + yr2 * b[1][2]);
1105       gux[29] = zr * xr * yr * b[1][2];
1106       gux[30] = xr * (b[1][1] + zr2 * b[1][2]);
1107       guy[25] = yr * (b[1][1] + xr2 * b[1][2]);
1108       guy[26] = xr * (b[1][1] + yr2 * b[1][2]);
1109       guy[27] = gux[29];
1110       guy[28] = yr * (3.0 * b[1][1] + yr2 * b[1][2]);
1111       guy[29] = zr * (b[1][1] + yr2 * b[1][2]);
1112       guy[30] = yr * (b[1][1] + zr2 * b[1][2]);
1113       guz[25] = zr * (b[1][1] + xr2 * b[1][2]);
1114       guz[26] = gux[29];
1115       guz[27] = xr * (b[1][1] + zr2 * b[1][2]);
1116       guz[28] = zr * (b[1][1] + yr2 * b[1][2]);
1117       guz[29] = yr * (b[1][1] + zr2 * b[1][2]);
1118       guz[30] = zr * (3.0 * b[1][1] + zr2 * b[1][2]);
1119       gqxx[25] = 2.0 * b[2][0] + xr2 * (5.0 * b[2][1] + xr2 * b[2][2]);
1120       gqxx[26] = yr * xr * (2.0 * b[2][1] + xr2 * b[2][2]);
1121       gqxx[27] = zr * xr * (2.0 * b[2][1] + xr2 * b[2][2]);
1122       gqxx[28] = xr2 * (b[2][1] + yr2 * b[2][2]);
1123       gqxx[29] = zr * yr * xr2 * b[2][2];
1124       gqxx[30] = xr2 * (b[2][1] + zr2 * b[2][2]);
1125       gqyy[25] = yr2 * (b[2][1] + xr2 * b[2][2]);
1126       gqyy[26] = xr * yr * (2.0 * b[2][1] + yr2 * b[2][2]);
1127       gqyy[27] = xr * zr * yr2 * b[2][2];
1128       gqyy[28] = 2.0 * b[2][0] + yr2 * (5.0 * b[2][1] + yr2 * b[2][2]);
1129       gqyy[29] = yr * zr * (2.0 * b[2][1] + yr2 * b[2][2]);
1130       gqyy[30] = yr2 * (b[2][1] + zr2 * b[2][2]);
1131       gqzz[25] = zr2 * (b[2][1] + xr2 * b[2][2]);
1132       gqzz[26] = xr * yr * zr2 * b[2][2];
1133       gqzz[27] = xr * zr * (2.0 * b[2][1] + zr2 * b[2][2]);
1134       gqzz[28] = zr2 * (b[2][1] + yr2 * b[2][2]);
1135       gqzz[29] = yr * zr * (2.0 * b[2][1] + zr2 * b[2][2]);
1136       gqzz[30] = 2.0 * b[2][0] + zr2 * (5.0 * b[2][1] + zr2 * b[2][2]);
1137       gqxy[25] = xr * yr * (3.0 * b[2][1] + xr2 * b[2][2]);
1138       gqxy[26] = b[2][0] + (xr2 + yr2) * b[2][1] + xr2 * yr2 * b[2][2];
1139       gqxy[27] = zr * yr * (b[2][1] + xr2 * b[2][2]);
1140       gqxy[28] = xr * yr * (3.0 * b[2][1] + yr2 * b[2][2]);
1141       gqxy[29] = zr * xr * (b[2][1] + yr2 * b[2][2]);
1142       gqxy[30] = xr * yr * (b[2][1] + zr2 * b[2][2]);
1143       gqxz[25] = xr * zr * (3.0 * b[2][1] + xr2 * b[2][2]);
1144       gqxz[26] = yr * zr * (b[2][1] + xr2 * b[2][2]);
1145       gqxz[27] = b[2][0] + (xr2 + zr2) * b[2][1] + xr2 * zr2 * b[2][2];
1146       gqxz[28] = xr * zr * (b[2][1] + yr2 * b[2][2]);
1147       gqxz[29] = xr * yr * (b[2][1] + zr2 * b[2][2]);
1148       gqxz[30] = xr * zr * (3.0 * b[2][1] + zr2 * b[2][2]);
1149       gqyz[25] = zr * yr * (b[2][1] + xr2 * b[2][2]);
1150       gqyz[26] = xr * zr * (b[2][1] + yr2 * b[2][2]);
1151       gqyz[27] = xr * yr * (b[2][1] + zr2 * b[2][2]);
1152       gqyz[28] = yr * zr * (3.0 * b[2][1] + yr2 * b[2][2]);
1153       gqyz[29] = b[2][0] + (yr2 + zr2) * b[2][1] + yr2 * zr2 * b[2][2];
1154       gqyz[30] = yr * zr * (3.0 * b[2][1] + zr2 * b[2][2]);
1155 
1156       // Unweighted 3rd reaction potential gradient tensor.
1157       gc[11] = xr * (3.0 * a[0][2] + xr2 * a[0][3]);
1158       gc[12] = yr * (a[0][2] + xr2 * a[0][3]);
1159       gc[13] = zr * (a[0][2] + xr2 * a[0][3]);
1160       gc[14] = xr * (a[0][2] + yr2 * a[0][3]);
1161       gc[15] = xr * yr * zr * a[0][3];
1162       gc[16] = xr * (a[0][2] + zr2 * a[0][3]);
1163       gc[17] = yr * (3.0 * a[0][2] + yr2 * a[0][3]);
1164       gc[18] = zr * (a[0][2] + yr2 * a[0][3]);
1165       gc[19] = yr * (a[0][2] + zr2 * a[0][3]);
1166       gc[20] = zr * (3.0 * a[0][2] + zr2 * a[0][3]);
1167 
1168       gux[11] = 3.0 * a[1][1] + xr2 * (6.0 * a[1][2] + xr2 * a[1][3]);
1169       gux[12] = xr * yr * (3.0 * a[1][2] + xr2 * a[1][3]);
1170       gux[13] = xr * zr * (3.0 * a[1][2] + xr2 * a[1][3]);
1171       gux[14] = a[1][1] + (xr2 + yr2) * a[1][2] + xr2 * yr2 * a[1][3];
1172       gux[15] = yr * zr * (a[1][2] + xr2 * a[1][3]);
1173       gux[16] = a[1][1] + (xr2 + zr2) * a[1][2] + xr2 * zr2 * a[1][3];
1174       gux[17] = xr * yr * (3.0 * a[1][2] + yr2 * a[1][3]);
1175       gux[18] = xr * zr * (a[1][2] + yr2 * a[1][3]);
1176       gux[19] = xr * yr * (a[1][2] + zr2 * a[1][3]);
1177       gux[20] = xr * zr * (3.0 * a[1][2] + zr2 * a[1][3]);
1178 
1179       guy[11] = gux[12];
1180       guy[12] = gux[14];
1181       guy[13] = gux[15];
1182       guy[14] = gux[17];
1183       guy[15] = gux[18];
1184       guy[16] = gux[19];
1185       guy[17] = 3.0 * a[1][1] + yr2 * (6.0 * a[1][2] + yr2 * a[1][3]);
1186       guy[18] = yr * zr * (3.0 * a[1][2] + yr2 * a[1][3]);
1187       guy[19] = a[1][1] + (yr2 + zr2) * a[1][2] + yr2 * zr2 * a[1][3];
1188       guy[20] = yr * zr * (3.0 * a[1][2] + zr2 * a[1][3]);
1189 
1190       guz[11] = gux[13];
1191       guz[12] = gux[15];
1192       guz[13] = gux[16];
1193       guz[14] = gux[18];
1194       guz[15] = gux[19];
1195       guz[16] = gux[20];
1196       guz[17] = guy[18];
1197       guz[18] = guy[19];
1198       guz[19] = guy[20];
1199       guz[20] = 3.0 * a[1][1] + zr2 * (6.0 * a[1][2] + zr2 * a[1][3]);
1200 
1201       gqxx[11] = xr * (12.0 * a[2][1] + xr2 * (9.0 * a[2][2] + xr2 * a[2][3]));
1202       gqxx[12] = yr * (2.0 * a[2][1] + xr2 * (5.0 * a[2][2] + xr2 * a[2][3]));
1203       gqxx[13] = zr * (2.0 * a[2][1] + xr2 * (5.0 * a[2][2] + xr2 * a[2][3]));
1204       gqxx[14] = xr * (2.0 * a[2][1] + yr2 * 2.0 * a[2][2] + xr2 * (a[2][2] + yr2 * a[2][3]));
1205       gqxx[15] = xr * yr * zr * (2.0 * a[2][2] + xr2 * a[2][3]);
1206       gqxx[16] = xr * (2.0 * a[2][1] + zr2 * 2.0 * a[2][2] + xr2 * (a[2][2] + zr2 * a[2][3]));
1207       gqxx[17] = yr * xr2 * (3.0 * a[2][2] + yr2 * a[2][3]);
1208       gqxx[18] = zr * xr2 * (a[2][2] + yr2 * a[2][3]);
1209       gqxx[19] = yr * xr2 * (a[2][2] + zr2 * a[2][3]);
1210       gqxx[20] = zr * xr2 * (3.0 * a[2][2] + zr2 * a[2][3]);
1211 
1212       gqxy[11] = yr * (3.0 * a[2][1] + xr2 * (6.0 * a[2][2] + xr2 * a[2][3]));
1213       gqxy[12] = xr * (3.0 * (a[2][1] + yr2 * a[2][2]) + xr2 * (a[2][2] + yr2 * a[2][3]));
1214       gqxy[13] = xr * yr * zr * (3.0 * a[2][2] + xr2 * a[2][3]);
1215       gqxy[14] = yr * (3.0 * (a[2][1] + xr2 * a[2][2]) + yr2 * (a[2][2] + xr2 * a[2][3]));
1216       gqxy[15] = zr * (a[2][1] + (yr2 + xr2) * a[2][2] + yr2 * xr2 * a[2][3]);
1217       gqxy[16] = yr * (a[2][1] + (xr2 + zr2) * a[2][2] + xr2 * zr2 * a[2][3]);
1218       gqxy[17] = xr * (3.0 * (a[2][1] + yr2 * a[2][2]) + yr2 * (3.0 * a[2][2] + yr2 * a[2][3]));
1219       gqxy[18] = xr * yr * zr * (3.0 * a[2][2] + yr2 * a[2][3]);
1220       gqxy[19] = xr * (a[2][1] + (yr2 + zr2) * a[2][2] + yr2 * zr2 * a[2][3]);
1221       gqxy[20] = xr * yr * zr * (3.0 * a[2][2] + zr2 * a[2][3]);
1222 
1223       gqxz[11] = zr * (3.0 * a[2][1] + xr2 * (6.0 * a[2][2] + xr2 * a[2][3]));
1224       gqxz[12] = xr * yr * zr * (3.0 * a[2][2] + xr2 * a[2][3]);
1225       gqxz[13] = xr * (3.0 * (a[2][1] + zr2 * a[2][2]) + xr2 * (a[2][2] + zr2 * a[2][3]));
1226       gqxz[14] = zr * (a[2][1] + (xr2 + yr2) * a[2][2] + xr2 * yr2 * a[2][3]);
1227       gqxz[15] = yr * (a[2][1] + (xr2 + zr2) * a[2][2] + zr2 * xr2 * a[2][3]);
1228       gqxz[16] = zr * (3.0 * (a[2][1] + xr2 * a[2][2]) + zr2 * (a[2][2] + xr2 * a[2][3]));
1229       gqxz[17] = xr * yr * zr * (3.0 * a[2][2] + yr2 * a[2][3]);
1230       gqxz[18] = xr * (a[2][1] + (zr2 + yr2) * a[2][2] + zr2 * yr2 * a[2][3]);
1231       gqxz[19] = xr * yr * zr * (3.0 * a[2][2] + zr2 * a[2][3]);
1232       gqxz[20] = xr * (3.0 * a[2][1] + zr2 * (6.0 * a[2][2] + zr2 * a[2][3]));
1233 
1234       gqyy[11] = xr * yr2 * (3.0 * a[2][2] + xr2 * a[2][3]);
1235       gqyy[12] = yr * (2.0 * a[2][1] + xr2 * 2.0 * a[2][2] + yr2 * (a[2][2] + xr2 * a[2][3]));
1236       gqyy[13] = zr * yr2 * (a[2][2] + xr2 * a[2][3]);
1237       gqyy[14] = xr * (2.0 * a[2][1] + yr2 * (5.0 * a[2][2] + yr2 * a[2][3]));
1238       gqyy[15] = xr * yr * zr * (2.0 * a[2][2] + yr2 * a[2][3]);
1239       gqyy[16] = xr * yr2 * (a[2][2] + zr2 * a[2][3]);
1240       gqyy[17] = yr * (12.0 * a[2][1] + yr2 * (9.0 * a[2][2] + yr2 * a[2][3]));
1241       gqyy[18] = zr * (2.0 * a[2][1] + yr2 * (5.0 * a[2][2] + yr2 * a[2][3]));
1242       gqyy[19] = yr * (2.0 * a[2][1] + zr2 * 2.0 * a[2][2] + yr2 * (a[2][2] + zr2 * a[2][3]));
1243       gqyy[20] = zr * yr2 * (3.0 * a[2][2] + zr2 * a[2][3]);
1244 
1245       gqyz[11] = xr * yr * zr * (3.0 * a[2][2] + xr2 * a[2][3]);
1246       gqyz[12] = zr * (a[2][1] + (xr2 + yr2) * a[2][2] + xr2 * yr2 * a[2][3]);
1247       gqyz[13] = yr * (a[2][1] + (xr2 + zr2) * a[2][2] + xr2 * zr2 * a[2][3]);
1248       gqyz[14] = xr * yr * zr * (3.0 * a[2][2] + yr2 * a[2][3]);
1249       gqyz[15] = xr * (a[2][1] + (yr2 + zr2) * a[2][2] + yr2 * zr2 * a[2][3]);
1250       gqyz[16] = xr * yr * zr * (3.0 * a[2][2] + zr2 * a[2][3]);
1251       gqyz[17] = zr * (3.0 * a[2][1] + yr2 * (6.0 * a[2][2] + yr2 * a[2][3]));
1252       gqyz[18] = yr * (3.0 * (a[2][1] + zr2 * a[2][2]) + yr2 * (a[2][2] + zr2 * a[2][3]));
1253       gqyz[19] = zr * (3.0 * (a[2][1] + yr2 * a[2][2]) + zr2 * (a[2][2] + yr2 * a[2][3]));
1254       gqyz[20] = yr * (3.0 * a[2][1] + zr2 * (6.0 * a[2][2] + zr2 * a[2][3]));
1255 
1256       gqzz[11] = xr * zr2 * (3.0 * a[2][2] + xr2 * a[2][3]);
1257       gqzz[12] = yr * (zr2 * a[2][2] + xr2 * (zr2 * a[2][3]));
1258       gqzz[13] = zr * (2.0 * a[2][1] + xr2 * 2.0 * a[2][2] + zr2 * (a[2][2] + xr2 * a[2][3]));
1259       gqzz[14] = xr * zr2 * (a[2][2] + yr2 * a[2][3]);
1260       gqzz[15] = xr * yr * zr * (2.0 * a[2][2] + zr2 * a[2][3]);
1261       gqzz[16] = xr * (2.0 * a[2][1] + zr2 * (5.0 * a[2][2] + zr2 * a[2][3]));
1262       gqzz[17] = yr * zr2 * (3.0 * a[2][2] + yr2 * a[2][3]);
1263       gqzz[18] = zr * (2.0 * a[2][1] + yr2 * 2.0 * a[2][2] + zr2 * (a[2][2] + yr2 * a[2][3]));
1264       gqzz[19] = yr * (2.0 * a[2][1] + zr2 * (5.0 * a[2][2] + zr2 * a[2][3]));
1265       gqzz[20] = zr * (12.0 * a[2][1] + zr2 * (9.0 * a[2][2] + zr2 * a[2][3]));
1266     }
1267 
1268     private void permanentEnergyGradient(int i, int k) {
1269       final double desymdr =
1270           ci * ck * gc[21]
1271               - (uxi * (uxk * gux[22] + uyk * guy[22] + uzk * guz[22])
1272               + uyi * (uxk * gux[23] + uyk * guy[23] + uzk * guz[23])
1273               + uzi * (uxk * gux[24] + uyk * guy[24] + uzk * guz[24]));
1274       final double dewidr =
1275           ci * (uxk * gc[22] + uyk * gc[23] + uzk * gc[24])
1276               - ck * (uxi * gux[21] + uyi * guy[21] + uzi * guz[21])
1277               + ci
1278               * (qxxk * gc[25]
1279               + qyyk * gc[28]
1280               + qzzk * gc[30]
1281               + 2.0 * (qxyk * gc[26] + qxzk * gc[27] + qyzk * gc[29]))
1282               + ck
1283               * (qxxi * gqxx[21]
1284               + qyyi * gqyy[21]
1285               + qzzi * gqzz[21]
1286               + 2.0 * (qxyi * gqxy[21] + qxzi * gqxz[21] + qyzi * gqyz[21]))
1287               - uxi
1288               * (qxxk * gux[25]
1289               + qyyk * gux[28]
1290               + qzzk * gux[30]
1291               + 2.0 * (qxyk * gux[26] + qxzk * gux[27] + qyzk * gux[29]))
1292               - uyi
1293               * (qxxk * guy[25]
1294               + qyyk * guy[28]
1295               + qzzk * guy[30]
1296               + 2.0 * (qxyk * guy[26] + qxzk * guy[27] + qyzk * guy[29]))
1297               - uzi
1298               * (qxxk * guz[25]
1299               + qyyk * guz[28]
1300               + qzzk * guz[30]
1301               + 2.0 * (qxyk * guz[26] + qxzk * guz[27] + qyzk * guz[29]))
1302               + uxk
1303               * (qxxi * gqxx[22]
1304               + qyyi * gqyy[22]
1305               + qzzi * gqzz[22]
1306               + 2.0 * (qxyi * gqxy[22] + qxzi * gqxz[22] + qyzi * gqyz[22]))
1307               + uyk
1308               * (qxxi * gqxx[23]
1309               + qyyi * gqyy[23]
1310               + qzzi * gqzz[23]
1311               + 2.0 * (qxyi * gqxy[23] + qxzi * gqxz[23] + qyzi * gqyz[23]))
1312               + uzk
1313               * (qxxi * gqxx[24]
1314               + qyyi * gqyy[24]
1315               + qzzi * gqzz[24]
1316               + 2.0 * (qxyi * gqxy[24] + qxzi * gqxz[24] + qyzi * gqyz[24]))
1317               + qxxi
1318               * (qxxk * gqxx[25]
1319               + qyyk * gqxx[28]
1320               + qzzk * gqxx[30]
1321               + 2.0 * (qxyk * gqxx[26] + qxzk * gqxx[27] + qyzk * gqxx[29]))
1322               + qyyi
1323               * (qxxk * gqyy[25]
1324               + qyyk * gqyy[28]
1325               + qzzk * gqyy[30]
1326               + 2.0 * (qxyk * gqyy[26] + qxzk * gqyy[27] + qyzk * gqyy[29]))
1327               + qzzi
1328               * (qxxk * gqzz[25]
1329               + qyyk * gqzz[28]
1330               + qzzk * gqzz[30]
1331               + 2.0 * (qxyk * gqzz[26] + qxzk * gqzz[27] + qyzk * gqzz[29]))
1332               + 2.0
1333               * (qxyi
1334               * (qxxk * gqxy[25]
1335               + qyyk * gqxy[28]
1336               + qzzk * gqxy[30]
1337               + 2.0 * (qxyk * gqxy[26] + qxzk * gqxy[27] + qyzk * gqxy[29]))
1338               + qxzi
1339               * (qxxk * gqxz[25]
1340               + qyyk * gqxz[28]
1341               + qzzk * gqxz[30]
1342               + 2.0 * (qxyk * gqxz[26] + qxzk * gqxz[27] + qyzk * gqxz[29]))
1343               + qyzi
1344               * (qxxk * gqyz[25]
1345               + qyyk * gqyz[28]
1346               + qzzk * gqyz[30]
1347               + 2.0 * (qxyk * gqyz[26] + qxzk * gqyz[27] + qyzk * gqyz[29])));
1348       final double dewkdr =
1349           ci * (uxk * gux[21] + uyk * guy[21] + uzk * guz[21])
1350               - ck * (uxi * gc[22] + uyi * gc[23] + uzi * gc[24])
1351               + ci
1352               * (qxxk * gqxx[21]
1353               + qyyk * gqyy[21]
1354               + qzzk * gqzz[21]
1355               + 2.0 * (qxyk * gqxy[21] + qxzk * gqxz[21] + qyzk * gqyz[21]))
1356               + ck
1357               * (qxxi * gc[25]
1358               + qyyi * gc[28]
1359               + qzzi * gc[30]
1360               + 2.0 * (qxyi * gc[26] + qxzi * gc[27] + qyzi * gc[29]))
1361               - uxi
1362               * (qxxk * gqxx[22]
1363               + qyyk * gqyy[22]
1364               + qzzk * gqzz[22]
1365               + 2.0 * (qxyk * gqxy[22] + qxzk * gqxz[22] + qyzk * gqyz[22]))
1366               - uyi
1367               * (qxxk * gqxx[23]
1368               + qyyk * gqyy[23]
1369               + qzzk * gqzz[23]
1370               + 2.0 * (qxyk * gqxy[23] + qxzk * gqxz[23] + qyzk * gqyz[23]))
1371               - uzi
1372               * (qxxk * gqxx[24]
1373               + qyyk * gqyy[24]
1374               + qzzk * gqzz[24]
1375               + 2.0 * (qxyk * gqxy[24] + qxzk * gqxz[24] + qyzk * gqyz[24]))
1376               + uxk
1377               * (qxxi * gux[25]
1378               + qyyi * gux[28]
1379               + qzzi * gux[30]
1380               + 2.0 * (qxyi * gux[26] + qxzi * gux[27] + qyzi * gux[29]))
1381               + uyk
1382               * (qxxi * guy[25]
1383               + qyyi * guy[28]
1384               + qzzi * guy[30]
1385               + 2.0 * (qxyi * guy[26] + qxzi * guy[27] + qyzi * guy[29]))
1386               + uzk
1387               * (qxxi * guz[25]
1388               + qyyi * guz[28]
1389               + qzzi * guz[30]
1390               + 2.0 * (qxyi * guz[26] + qxzi * guz[27] + qyzi * guz[29]))
1391               + qxxi
1392               * (qxxk * gqxx[25]
1393               + qyyk * gqyy[25]
1394               + qzzk * gqzz[25]
1395               + 2.0 * (qxyk * gqxy[25] + qxzk * gqxz[25] + qyzk * gqyz[25]))
1396               + qyyi
1397               * (qxxk * gqxx[28]
1398               + qyyk * gqyy[28]
1399               + qzzk * gqzz[28]
1400               + 2.0 * (qxyk * gqxy[28] + qxzk * gqxz[28] + qyzk * gqyz[28]))
1401               + qzzi
1402               * (qxxk * gqxx[30]
1403               + qyyk * gqyy[30]
1404               + qzzk * gqzz[30]
1405               + 2.0 * (qxyk * gqxy[30] + qxzk * gqxz[30] + qyzk * gqyz[30]))
1406               + 2.0
1407               * (qxyi
1408               * (qxxk * gqxx[26]
1409               + qyyk * gqyy[26]
1410               + qzzk * gqzz[26]
1411               + 2.0 * (qxyk * gqxy[26] + qxzk * gqxz[26] + qyzk * gqyz[26]))
1412               + qxzi
1413               * (qxxk * gqxx[27]
1414               + qyyk * gqyy[27]
1415               + qzzk * gqzz[27]
1416               + 2.0 * (qxyk * gqxy[27] + qxzk * gqxz[27] + qyzk * gqyz[27]))
1417               + qyzi
1418               * (qxxk * gqxx[29]
1419               + qyyk * gqyy[29]
1420               + qzzk * gqzz[29]
1421               + 2.0 * (qxyk * gqxy[29] + qxzk * gqxz[29] + qyzk * gqyz[29])));
1422       final double dsumdr = desymdr + 0.5 * (dewidr + dewkdr);
1423       final double drbi = rbk * dsumdr;
1424       final double drbk = rbi * dsumdr;
1425 
1426       double selfScale = 1.0;
1427       if (i == k) {
1428         if (iSymm == 0) {
1429           sharedBornGrad.add(threadID, i, drbi);
1430           return;
1431         } else {
1432           selfScale = 0.5;
1433         }
1434       }
1435 
1436       // Increment the gradients and Born chain rule term.
1437       final double dedx = selfScale * dEdX();
1438       final double dedy = selfScale * dEdY();
1439       final double dedz = selfScale * dEdZ();
1440       dedxi -= dedx;
1441       dedyi -= dedy;
1442       dedzi -= dedz;
1443       dborni += selfScale * drbi;
1444 
1445       final double dedxk = dedx * transOp[0][0] + dedy * transOp[1][0] + dedz * transOp[2][0];
1446       final double dedyk = dedx * transOp[0][1] + dedy * transOp[1][1] + dedz * transOp[2][1];
1447       final double dedzk = dedx * transOp[0][2] + dedy * transOp[1][2] + dedz * transOp[2][2];
1448       grad.add(threadID, k, dedxk, dedyk, dedzk);
1449       sharedBornGrad.add(threadID, k, selfScale * drbk);
1450       permanentEnergyTorque(i, k);
1451     }
1452 
1453     private double dEdZ() {
1454       final double desymdz =
1455           ci * ck * gc[4]
1456               - (uxi * (uxk * gux[7] + uyk * guy[7] + uzk * guz[7])
1457               + uyi * (uxk * gux[9] + uyk * guy[9] + uzk * guz[9])
1458               + uzi * (uxk * gux[10] + uyk * guy[10] + uzk * guz[10]));
1459       final double dewidz =
1460           ci * (uxk * gc[7] + uyk * gc[9] + uzk * gc[10])
1461               - ck * (uxi * gux[4] + uyi * guy[4] + uzi * guz[4])
1462               + ci
1463               * (qxxk * gc[13]
1464               + qyyk * gc[18]
1465               + qzzk * gc[20]
1466               + 2.0 * (qxyk * gc[15] + qxzk * gc[16] + qyzk * gc[19]))
1467               + ck
1468               * (qxxi * gqxx[4]
1469               + qyyi * gqyy[4]
1470               + qzzi * gqzz[4]
1471               + 2.0 * (qxyi * gqxy[4] + qxzi * gqxz[4] + qyzi * gqyz[4]))
1472               - uxi
1473               * (qxxk * gux[13]
1474               + qyyk * gux[18]
1475               + qzzk * gux[20]
1476               + 2.0 * (qxyk * gux[15] + qxzk * gux[16] + qyzk * gux[19]))
1477               - uyi
1478               * (qxxk * guy[13]
1479               + qyyk * guy[18]
1480               + qzzk * guy[20]
1481               + 2.0 * (qxyk * guy[15] + qxzk * guy[16] + qyzk * guy[19]))
1482               - uzi
1483               * (qxxk * guz[13]
1484               + qyyk * guz[18]
1485               + qzzk * guz[20]
1486               + 2.0 * (qxyk * guz[15] + qxzk * guz[16] + qyzk * guz[19]))
1487               + uxk
1488               * (qxxi * gqxx[7]
1489               + qyyi * gqyy[7]
1490               + qzzi * gqzz[7]
1491               + 2.0 * (qxyi * gqxy[7] + qxzi * gqxz[7] + qyzi * gqyz[7]))
1492               + uyk
1493               * (qxxi * gqxx[9]
1494               + qyyi * gqyy[9]
1495               + qzzi * gqzz[9]
1496               + 2.0 * (qxyi * gqxy[9] + qxzi * gqxz[9] + qyzi * gqyz[9]))
1497               + uzk
1498               * (qxxi * gqxx[10]
1499               + qyyi * gqyy[10]
1500               + qzzi * gqzz[10]
1501               + 2.0 * (qxyi * gqxy[10] + qxzi * gqxz[10] + qyzi * gqyz[10]))
1502               + qxxi
1503               * (qxxk * gqxx[13]
1504               + qyyk * gqxx[18]
1505               + qzzk * gqxx[20]
1506               + 2.0 * (qxyk * gqxx[15] + qxzk * gqxx[16] + qyzk * gqxx[19]))
1507               + qyyi
1508               * (qxxk * gqyy[13]
1509               + qyyk * gqyy[18]
1510               + qzzk * gqyy[20]
1511               + 2.0 * (qxyk * gqyy[15] + qxzk * gqyy[16] + qyzk * gqyy[19]))
1512               + qzzi
1513               * (qxxk * gqzz[13]
1514               + qyyk * gqzz[18]
1515               + qzzk * gqzz[20]
1516               + 2.0 * (qxyk * gqzz[15] + qxzk * gqzz[16] + qyzk * gqzz[19]))
1517               + 2.0
1518               * (qxyi
1519               * (qxxk * gqxy[13]
1520               + qyyk * gqxy[18]
1521               + qzzk * gqxy[20]
1522               + 2.0 * (qxyk * gqxy[15] + qxzk * gqxy[16] + qyzk * gqxy[19]))
1523               + qxzi
1524               * (qxxk * gqxz[13]
1525               + qyyk * gqxz[18]
1526               + qzzk * gqxz[20]
1527               + 2.0 * (qxyk * gqxz[15] + qxzk * gqxz[16] + qyzk * gqxz[19]))
1528               + qyzi
1529               * (qxxk * gqyz[13]
1530               + qyyk * gqyz[18]
1531               + qzzk * gqyz[20]
1532               + 2.0 * (qxyk * gqyz[15] + qxzk * gqyz[16] + qyzk * gqyz[19])));
1533       final double dewkdz =
1534           ci * (uxk * gux[4] + uyk * guy[4] + uzk * guz[4])
1535               - ck * (uxi * gc[7] + uyi * gc[9] + uzi * gc[10])
1536               + ci
1537               * (qxxk * gqxx[4]
1538               + qyyk * gqyy[4]
1539               + qzzk * gqzz[4]
1540               + 2.0 * (qxyk * gqxy[4] + qxzk * gqxz[4] + qyzk * gqyz[4]))
1541               + ck
1542               * (qxxi * gc[13]
1543               + qyyi * gc[18]
1544               + qzzi * gc[20]
1545               + 2.0 * (qxyi * gc[15] + qxzi * gc[16] + qyzi * gc[19]))
1546               - uxi
1547               * (qxxk * gqxx[7]
1548               + qyyk * gqyy[7]
1549               + qzzk * gqzz[7]
1550               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]))
1551               - uyi
1552               * (qxxk * gqxx[9]
1553               + qyyk * gqyy[9]
1554               + qzzk * gqzz[9]
1555               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9]))
1556               - uzi
1557               * (qxxk * gqxx[10]
1558               + qyyk * gqyy[10]
1559               + qzzk * gqzz[10]
1560               + 2.0 * (qxyk * gqxy[10] + qxzk * gqxz[10] + qyzk * gqyz[10]))
1561               + uxk
1562               * (qxxi * gux[13]
1563               + qyyi * gux[18]
1564               + qzzi * gux[20]
1565               + 2.0 * (qxyi * gux[15] + qxzi * gux[16] + qyzi * gux[19]))
1566               + uyk
1567               * (qxxi * guy[13]
1568               + qyyi * guy[18]
1569               + qzzi * guy[20]
1570               + 2.0 * (qxyi * guy[15] + qxzi * guy[16] + qyzi * guy[19]))
1571               + uzk
1572               * (qxxi * guz[13]
1573               + qyyi * guz[18]
1574               + qzzi * guz[20]
1575               + 2.0 * (qxyi * guz[15] + qxzi * guz[16] + qyzi * guz[19]))
1576               + qxxi
1577               * (qxxk * gqxx[13]
1578               + qyyk * gqyy[13]
1579               + qzzk * gqzz[13]
1580               + 2.0 * (qxyk * gqxy[13] + qxzk * gqxz[13] + qyzk * gqyz[13]))
1581               + qyyi
1582               * (qxxk * gqxx[18]
1583               + qyyk * gqyy[18]
1584               + qzzk * gqzz[18]
1585               + 2.0 * (qxyk * gqxy[18] + qxzk * gqxz[18] + qyzk * gqyz[18]))
1586               + qzzi
1587               * (qxxk * gqxx[20]
1588               + qyyk * gqyy[20]
1589               + qzzk * gqzz[20]
1590               + 2.0 * (qxyk * gqxy[20] + qxzk * gqxz[20] + qyzk * gqyz[20]))
1591               + 2.0
1592               * (qxyi
1593               * (qxxk * gqxx[15]
1594               + qyyk * gqyy[15]
1595               + qzzk * gqzz[15]
1596               + 2.0 * (qxyk * gqxy[15] + qxzk * gqxz[15] + qyzk * gqyz[15]))
1597               + qxzi
1598               * (qxxk * gqxx[16]
1599               + qyyk * gqyy[16]
1600               + qzzk * gqzz[16]
1601               + 2.0 * (qxyk * gqxy[16] + qxzk * gqxz[16] + qyzk * gqyz[16]))
1602               + qyzi
1603               * (qxxk * gqxx[19]
1604               + qyyk * gqyy[19]
1605               + qzzk * gqzz[19]
1606               + 2.0 * (qxyk * gqxy[19] + qxzk * gqxz[19] + qyzk * gqyz[19])));
1607       return desymdz + 0.5 * (dewidz + dewkdz);
1608     }
1609 
1610     private double dEdY() {
1611       final double desymdy =
1612           ci * ck * gc[3]
1613               - (uxi * (uxk * gux[6] + uyk * guy[6] + uzk * guz[6])
1614               + uyi * (uxk * gux[8] + uyk * guy[8] + uzk * guz[8])
1615               + uzi * (uxk * gux[9] + uyk * guy[9] + uzk * guz[9]));
1616       final double dewidy =
1617           ci * (uxk * gc[6] + uyk * gc[8] + uzk * gc[9])
1618               - ck * (uxi * gux[3] + uyi * guy[3] + uzi * guz[3])
1619               + ci
1620               * (qxxk * gc[12]
1621               + qyyk * gc[17]
1622               + qzzk * gc[19]
1623               + 2.0 * (qxyk * gc[14] + qxzk * gc[15] + qyzk * gc[18]))
1624               + ck
1625               * (qxxi * gqxx[3]
1626               + qyyi * gqyy[3]
1627               + qzzi * gqzz[3]
1628               + 2.0 * (qxyi * gqxy[3] + qxzi * gqxz[3] + qyzi * gqyz[3]))
1629               - uxi
1630               * (qxxk * gux[12]
1631               + qyyk * gux[17]
1632               + qzzk * gux[19]
1633               + 2.0 * (qxyk * gux[14] + qxzk * gux[15] + qyzk * gux[18]))
1634               - uyi
1635               * (qxxk * guy[12]
1636               + qyyk * guy[17]
1637               + qzzk * guy[19]
1638               + 2.0 * (qxyk * guy[14] + qxzk * guy[15] + qyzk * guy[18]))
1639               - uzi
1640               * (qxxk * guz[12]
1641               + qyyk * guz[17]
1642               + qzzk * guz[19]
1643               + 2.0 * (qxyk * guz[14] + qxzk * guz[15] + qyzk * guz[18]))
1644               + uxk
1645               * (qxxi * gqxx[6]
1646               + qyyi * gqyy[6]
1647               + qzzi * gqzz[6]
1648               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxz[6] + qyzi * gqyz[6]))
1649               + uyk
1650               * (qxxi * gqxx[8]
1651               + qyyi * gqyy[8]
1652               + qzzi * gqzz[8]
1653               + 2.0 * (qxyi * gqxy[8] + qxzi * gqxz[8] + qyzi * gqyz[8]))
1654               + uzk
1655               * (qxxi * gqxx[9]
1656               + qyyi * gqyy[9]
1657               + qzzi * gqzz[9]
1658               + 2.0 * (qxyi * gqxy[9] + qxzi * gqxz[9] + qyzi * gqyz[9]))
1659               + qxxi
1660               * (qxxk * gqxx[12]
1661               + qyyk * gqxx[17]
1662               + qzzk * gqxx[19]
1663               + 2.0 * (qxyk * gqxx[14] + qxzk * gqxx[15] + qyzk * gqxx[18]))
1664               + qyyi
1665               * (qxxk * gqyy[12]
1666               + qyyk * gqyy[17]
1667               + qzzk * gqyy[19]
1668               + 2.0 * (qxyk * gqyy[14] + qxzk * gqyy[15] + qyzk * gqyy[18]))
1669               + qzzi
1670               * (qxxk * gqzz[12]
1671               + qyyk * gqzz[17]
1672               + qzzk * gqzz[19]
1673               + 2.0 * (qxyk * gqzz[14] + qxzk * gqzz[15] + qyzk * gqzz[18]))
1674               + 2.0
1675               * (qxyi
1676               * (qxxk * gqxy[12]
1677               + qyyk * gqxy[17]
1678               + qzzk * gqxy[19]
1679               + 2.0 * (qxyk * gqxy[14] + qxzk * gqxy[15] + qyzk * gqxy[18]))
1680               + qxzi
1681               * (qxxk * gqxz[12]
1682               + qyyk * gqxz[17]
1683               + qzzk * gqxz[19]
1684               + 2.0 * (qxyk * gqxz[14] + qxzk * gqxz[15] + qyzk * gqxz[18]))
1685               + qyzi
1686               * (qxxk * gqyz[12]
1687               + qyyk * gqyz[17]
1688               + qzzk * gqyz[19]
1689               + 2.0 * (qxyk * gqyz[14] + qxzk * gqyz[15] + qyzk * gqyz[18])));
1690       final double dewkdy =
1691           ci * (uxk * gux[3] + uyk * guy[3] + uzk * guz[3])
1692               - ck * (uxi * gc[6] + uyi * gc[8] + uzi * gc[9])
1693               + ci
1694               * (qxxk * gqxx[3]
1695               + qyyk * gqyy[3]
1696               + qzzk * gqzz[3]
1697               + 2.0 * (qxyk * gqxy[3] + qxzk * gqxz[3] + qyzk * gqyz[3]))
1698               + ck
1699               * (qxxi * gc[12]
1700               + qyyi * gc[17]
1701               + qzzi * gc[19]
1702               + 2.0 * (qxyi * gc[14] + qxzi * gc[15] + qyzi * gc[18]))
1703               - uxi
1704               * (qxxk * gqxx[6]
1705               + qyyk * gqyy[6]
1706               + qzzk * gqzz[6]
1707               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]))
1708               - uyi
1709               * (qxxk * gqxx[8]
1710               + qyyk * gqyy[8]
1711               + qzzk * gqzz[8]
1712               + 2.0 * (qxyk * gqxy[8] + qxzk * gqxz[8] + qyzk * gqyz[8]))
1713               - uzi
1714               * (qxxk * gqxx[9]
1715               + qyyk * gqyy[9]
1716               + qzzk * gqzz[9]
1717               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9]))
1718               + uxk
1719               * (qxxi * gux[12]
1720               + qyyi * gux[17]
1721               + qzzi * gux[19]
1722               + 2.0 * (qxyi * gux[14] + qxzi * gux[15] + qyzi * gux[18]))
1723               + uyk
1724               * (qxxi * guy[12]
1725               + qyyi * guy[17]
1726               + qzzi * guy[19]
1727               + 2.0 * (qxyi * guy[14] + qxzi * guy[15] + qyzi * guy[18]))
1728               + uzk
1729               * (qxxi * guz[12]
1730               + qyyi * guz[17]
1731               + qzzi * guz[19]
1732               + 2.0 * (qxyi * guz[14] + qxzi * guz[15] + qyzi * guz[18]))
1733               + qxxi
1734               * (qxxk * gqxx[12]
1735               + qyyk * gqyy[12]
1736               + qzzk * gqzz[12]
1737               + 2.0 * (qxyk * gqxy[12] + qxzk * gqxz[12] + qyzk * gqyz[12]))
1738               + qyyi
1739               * (qxxk * gqxx[17]
1740               + qyyk * gqyy[17]
1741               + qzzk * gqzz[17]
1742               + 2.0 * (qxyk * gqxy[17] + qxzk * gqxz[17] + qyzk * gqyz[17]))
1743               + qzzi
1744               * (qxxk * gqxx[19]
1745               + qyyk * gqyy[19]
1746               + qzzk * gqzz[19]
1747               + 2.0 * (qxyk * gqxy[19] + qxzk * gqxz[19] + qyzk * gqyz[19]))
1748               + 2.0
1749               * (qxyi
1750               * (qxxk * gqxx[14]
1751               + qyyk * gqyy[14]
1752               + qzzk * gqzz[14]
1753               + 2.0 * (qxyk * gqxy[14] + qxzk * gqxz[14] + qyzk * gqyz[14]))
1754               + qxzi
1755               * (qxxk * gqxx[15]
1756               + qyyk * gqyy[15]
1757               + qzzk * gqzz[15]
1758               + 2.0 * (qxyk * gqxy[15] + qxzk * gqxz[15] + qyzk * gqyz[15]))
1759               + qyzi
1760               * (qxxk * gqxx[18]
1761               + qyyk * gqyy[18]
1762               + qzzk * gqzz[18]
1763               + 2.0 * (qxyk * gqxy[18] + qxzk * gqxz[18] + qyzk * gqyz[18])));
1764 
1765       return desymdy + 0.5 * (dewidy + dewkdy);
1766     }
1767 
1768     private double dEdX() {
1769       final double desymdx =
1770           ci * ck * gc[2]
1771               - (uxi * (uxk * gux[5] + uyk * guy[5] + uzk * guz[5])
1772               + uyi * (uxk * gux[6] + uyk * guy[6] + uzk * guz[6])
1773               + uzi * (uxk * gux[7] + uyk * guy[7] + uzk * guz[7]));
1774       final double dewidx =
1775           ci * (uxk * gc[5] + uyk * gc[6] + uzk * gc[7])
1776               - ck * (uxi * gux[2] + uyi * guy[2] + uzi * guz[2])
1777               + ci
1778               * (qxxk * gc[11]
1779               + qyyk * gc[14]
1780               + qzzk * gc[16]
1781               + 2.0 * (qxyk * gc[12] + qxzk * gc[13] + qyzk * gc[15]))
1782               + ck
1783               * (qxxi * gqxx[2]
1784               + qyyi * gqyy[2]
1785               + qzzi * gqzz[2]
1786               + 2.0 * (qxyi * gqxy[2] + qxzi * gqxz[2] + qyzi * gqyz[2]))
1787               - uxi
1788               * (qxxk * gux[11]
1789               + qyyk * gux[14]
1790               + qzzk * gux[16]
1791               + 2.0 * (qxyk * gux[12] + qxzk * gux[13] + qyzk * gux[15]))
1792               - uyi
1793               * (qxxk * guy[11]
1794               + qyyk * guy[14]
1795               + qzzk * guy[16]
1796               + 2.0 * (qxyk * guy[12] + qxzk * guy[13] + qyzk * guy[15]))
1797               - uzi
1798               * (qxxk * guz[11]
1799               + qyyk * guz[14]
1800               + qzzk * guz[16]
1801               + 2.0 * (qxyk * guz[12] + qxzk * guz[13] + qyzk * guz[15]))
1802               + uxk
1803               * (qxxi * gqxx[5]
1804               + qyyi * gqyy[5]
1805               + qzzi * gqzz[5]
1806               + 2.0 * (qxyi * gqxy[5] + qxzi * gqxz[5] + qyzi * gqyz[5]))
1807               + uyk
1808               * (qxxi * gqxx[6]
1809               + qyyi * gqyy[6]
1810               + qzzi * gqzz[6]
1811               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxz[6] + qyzi * gqyz[6]))
1812               + uzk
1813               * (qxxi * gqxx[7]
1814               + qyyi * gqyy[7]
1815               + qzzi * gqzz[7]
1816               + 2.0 * (qxyi * gqxy[7] + qxzi * gqxz[7] + qyzi * gqyz[7]))
1817               + qxxi
1818               * (qxxk * gqxx[11]
1819               + qyyk * gqxx[14]
1820               + qzzk * gqxx[16]
1821               + 2.0 * (qxyk * gqxx[12] + qxzk * gqxx[13] + qyzk * gqxx[15]))
1822               + qyyi
1823               * (qxxk * gqyy[11]
1824               + qyyk * gqyy[14]
1825               + qzzk * gqyy[16]
1826               + 2.0 * (qxyk * gqyy[12] + qxzk * gqyy[13] + qyzk * gqyy[15]))
1827               + qzzi
1828               * (qxxk * gqzz[11]
1829               + qyyk * gqzz[14]
1830               + qzzk * gqzz[16]
1831               + 2.0 * (qxyk * gqzz[12] + qxzk * gqzz[13] + qyzk * gqzz[15]))
1832               + 2.0
1833               * (qxyi
1834               * (qxxk * gqxy[11]
1835               + qyyk * gqxy[14]
1836               + qzzk * gqxy[16]
1837               + 2.0 * (qxyk * gqxy[12] + qxzk * gqxy[13] + qyzk * gqxy[15]))
1838               + qxzi
1839               * (qxxk * gqxz[11]
1840               + qyyk * gqxz[14]
1841               + qzzk * gqxz[16]
1842               + 2.0 * (qxyk * gqxz[12] + qxzk * gqxz[13] + qyzk * gqxz[15]))
1843               + qyzi
1844               * (qxxk * gqyz[11]
1845               + qyyk * gqyz[14]
1846               + qzzk * gqyz[16]
1847               + 2.0 * (qxyk * gqyz[12] + qxzk * gqyz[13] + qyzk * gqyz[15])));
1848       final double dewkdx =
1849           ci * (uxk * gux[2] + uyk * guy[2] + uzk * guz[2])
1850               - ck * (uxi * gc[5] + uyi * gc[6] + uzi * gc[7])
1851               + ci
1852               * (qxxk * gqxx[2]
1853               + qyyk * gqyy[2]
1854               + qzzk * gqzz[2]
1855               + 2.0 * (qxyk * gqxy[2] + qxzk * gqxz[2] + qyzk * gqyz[2]))
1856               + ck
1857               * (qxxi * gc[11]
1858               + qyyi * gc[14]
1859               + qzzi * gc[16]
1860               + 2.0 * (qxyi * gc[12] + qxzi * gc[13] + qyzi * gc[15]))
1861               - uxi
1862               * (qxxk * gqxx[5]
1863               + qyyk * gqyy[5]
1864               + qzzk * gqzz[5]
1865               + 2.0 * (qxyk * gqxy[5] + qxzk * gqxz[5] + qyzk * gqyz[5]))
1866               - uyi
1867               * (qxxk * gqxx[6]
1868               + qyyk * gqyy[6]
1869               + qzzk * gqzz[6]
1870               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]))
1871               - uzi
1872               * (qxxk * gqxx[7]
1873               + qyyk * gqyy[7]
1874               + qzzk * gqzz[7]
1875               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]))
1876               + uxk
1877               * (qxxi * gux[11]
1878               + qyyi * gux[14]
1879               + qzzi * gux[16]
1880               + 2.0 * (qxyi * gux[12] + qxzi * gux[13] + qyzi * gux[15]))
1881               + uyk
1882               * (qxxi * guy[11]
1883               + qyyi * guy[14]
1884               + qzzi * guy[16]
1885               + 2.0 * (qxyi * guy[12] + qxzi * guy[13] + qyzi * guy[15]))
1886               + uzk
1887               * (qxxi * guz[11]
1888               + qyyi * guz[14]
1889               + qzzi * guz[16]
1890               + 2.0 * (qxyi * guz[12] + qxzi * guz[13] + qyzi * guz[15]))
1891               + qxxi
1892               * (qxxk * gqxx[11]
1893               + qyyk * gqyy[11]
1894               + qzzk * gqzz[11]
1895               + 2.0 * (qxyk * gqxy[11] + qxzk * gqxz[11] + qyzk * gqyz[11]))
1896               + qyyi
1897               * (qxxk * gqxx[14]
1898               + qyyk * gqyy[14]
1899               + qzzk * gqzz[14]
1900               + 2.0 * (qxyk * gqxy[14] + qxzk * gqxz[14] + qyzk * gqyz[14]))
1901               + qzzi
1902               * (qxxk * gqxx[16]
1903               + qyyk * gqyy[16]
1904               + qzzk * gqzz[16]
1905               + 2.0 * (qxyk * gqxy[16] + qxzk * gqxz[16] + qyzk * gqyz[16]))
1906               + 2.0
1907               * (qxyi
1908               * (qxxk * gqxx[12]
1909               + qyyk * gqyy[12]
1910               + qzzk * gqzz[12]
1911               + 2.0 * (qxyk * gqxy[12] + qxzk * gqxz[12] + qyzk * gqyz[12]))
1912               + qxzi
1913               * (qxxk * gqxx[13]
1914               + qyyk * gqyy[13]
1915               + qzzk * gqzz[13]
1916               + 2.0 * (qxyk * gqxy[13] + qxzk * gqxz[13] + qyzk * gqyz[13]))
1917               + qyzi
1918               * (qxxk * gqxx[15]
1919               + qyyk * gqyy[15]
1920               + qzzk * gqzz[15]
1921               + 2.0 * (qxyk * gqxy[15] + qxzk * gqxz[15] + qyzk * gqyz[15])));
1922 
1923       return desymdx + 0.5 * (dewidx + dewkdx);
1924     }
1925 
1926     private void permanentEnergyTorque(int i, int k) {
1927       // Torque on permanent dipoles due to permanent reaction field.
1928       final double ix =
1929           uxk * gux[2]
1930               + uyk * gux[3]
1931               + uzk * gux[4]
1932               + 0.5
1933               * (ck * gux[1]
1934               + qxxk * gux[5]
1935               + qyyk * gux[8]
1936               + qzzk * gux[10]
1937               + 2.0 * (qxyk * gux[6] + qxzk * gux[7] + qyzk * gux[9])
1938               + ck * gc[2]
1939               + qxxk * gqxx[2]
1940               + qyyk * gqyy[2]
1941               + qzzk * gqzz[2]
1942               + 2.0 * (qxyk * gqxy[2] + qxzk * gqxz[2] + qyzk * gqyz[2]));
1943       final double iy =
1944           uxk * guy[2]
1945               + uyk * guy[3]
1946               + uzk * guy[4]
1947               + 0.5
1948               * (ck * guy[1]
1949               + qxxk * guy[5]
1950               + qyyk * guy[8]
1951               + qzzk * guy[10]
1952               + 2.0 * (qxyk * guy[6] + qxzk * guy[7] + qyzk * guy[9])
1953               + ck * gc[3]
1954               + qxxk * gqxx[3]
1955               + qyyk * gqyy[3]
1956               + qzzk * gqzz[3]
1957               + 2.0 * (qxyk * gqxy[3] + qxzk * gqxz[3] + qyzk * gqyz[3]));
1958       final double iz =
1959           uxk * guz[2]
1960               + uyk * guz[3]
1961               + uzk * guz[4]
1962               + 0.5
1963               * (ck * guz[1]
1964               + qxxk * guz[5]
1965               + qyyk * guz[8]
1966               + qzzk * guz[10]
1967               + 2.0 * (qxyk * guz[6] + qxzk * guz[7] + qyzk * guz[9])
1968               + ck * gc[4]
1969               + qxxk * gqxx[4]
1970               + qyyk * gqyy[4]
1971               + qzzk * gqzz[4]
1972               + 2.0 * (qxyk * gqxy[4] + qxzk * gqxz[4] + qyzk * gqyz[4]));
1973       final double kx =
1974           uxi * gux[2]
1975               + uyi * gux[3]
1976               + uzi * gux[4]
1977               - 0.5
1978               * (ci * gux[1]
1979               + qxxi * gux[5]
1980               + qyyi * gux[8]
1981               + qzzi * gux[10]
1982               + 2.0 * (qxyi * gux[6] + qxzi * gux[7] + qyzi * gux[9])
1983               + ci * gc[2]
1984               + qxxi * gqxx[2]
1985               + qyyi * gqyy[2]
1986               + qzzi * gqzz[2]
1987               + 2.0 * (qxyi * gqxy[2] + qxzi * gqxz[2] + qyzi * gqyz[2]));
1988       final double ky =
1989           uxi * guy[2]
1990               + uyi * guy[3]
1991               + uzi * guy[4]
1992               - 0.5
1993               * (ci * guy[1]
1994               + qxxi * guy[5]
1995               + qyyi * guy[8]
1996               + qzzi * guy[10]
1997               + 2.0 * (qxyi * guy[6] + qxzi * guy[7] + qyzi * guy[9])
1998               + ci * gc[3]
1999               + qxxi * gqxx[3]
2000               + qyyi * gqyy[3]
2001               + qzzi * gqzz[3]
2002               + 2.0 * (qxyi * gqxy[3] + qxzi * gqxz[3] + qyzi * gqyz[3]));
2003       final double kz =
2004           uxi * guz[2]
2005               + uyi * guz[3]
2006               + uzi * guz[4]
2007               - 0.5
2008               * (ci * guz[1]
2009               + qxxi * guz[5]
2010               + qyyi * guz[8]
2011               + qzzi * guz[10]
2012               + 2.0 * (qxyi * guz[6] + qxzi * guz[7] + qyzi * guz[9])
2013               + ci * gc[4]
2014               + qxxi * gqxx[4]
2015               + qyyi * gqyy[4]
2016               + qzzi * gqzz[4]
2017               + 2.0 * (qxyi * gqxy[4] + qxzi * gqxz[4] + qyzi * gqyz[4]));
2018       double tix = uyi * iz - uzi * iy;
2019       double tiy = uzi * ix - uxi * iz;
2020       double tiz = uxi * iy - uyi * ix;
2021       double tkx = uyk * kz - uzk * ky;
2022       double tky = uzk * kx - uxk * kz;
2023       double tkz = uxk * ky - uyk * kx;
2024 
2025       // Torque on quadrupoles due to permanent reaction field gradient.
2026       final double ixx =
2027           -0.5
2028               * (ck * gqxx[1]
2029               + uxk * gqxx[2]
2030               + uyk * gqxx[3]
2031               + uzk * gqxx[4]
2032               + qxxk * gqxx[5]
2033               + qyyk * gqxx[8]
2034               + qzzk * gqxx[10]
2035               + 2.0 * (qxyk * gqxx[6] + qxzk * gqxx[7] + qyzk * gqxx[9])
2036               + ck * gc[5]
2037               + uxk * gux[5]
2038               + uyk * guy[5]
2039               + uzk * guz[5]
2040               + qxxk * gqxx[5]
2041               + qyyk * gqyy[5]
2042               + qzzk * gqzz[5]
2043               + 2.0 * (qxyk * gqxy[5] + qxzk * gqxz[5] + qyzk * gqyz[5]));
2044       final double ixy =
2045           -0.5
2046               * (ck * gqxy[1]
2047               + uxk * gqxy[2]
2048               + uyk * gqxy[3]
2049               + uzk * gqxy[4]
2050               + qxxk * gqxy[5]
2051               + qyyk * gqxy[8]
2052               + qzzk * gqxy[10]
2053               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxy[7] + qyzk * gqxy[9])
2054               + ck * gc[6]
2055               + uxk * gux[6]
2056               + uyk * guy[6]
2057               + uzk * guz[6]
2058               + qxxk * gqxx[6]
2059               + qyyk * gqyy[6]
2060               + qzzk * gqzz[6]
2061               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]));
2062       final double ixz =
2063           -0.5
2064               * (ck * gqxz[1]
2065               + uxk * gqxz[2]
2066               + uyk * gqxz[3]
2067               + uzk * gqxz[4]
2068               + qxxk * gqxz[5]
2069               + qyyk * gqxz[8]
2070               + qzzk * gqxz[10]
2071               + 2.0 * (qxyk * gqxz[6] + qxzk * gqxz[7] + qyzk * gqxz[9])
2072               + ck * gc[7]
2073               + uxk * gux[7]
2074               + uyk * guy[7]
2075               + uzk * guz[7]
2076               + qxxk * gqxx[7]
2077               + qyyk * gqyy[7]
2078               + qzzk * gqzz[7]
2079               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]));
2080       final double iyy =
2081           -0.5
2082               * (ck * gqyy[1]
2083               + uxk * gqyy[2]
2084               + uyk * gqyy[3]
2085               + uzk * gqyy[4]
2086               + qxxk * gqyy[5]
2087               + qyyk * gqyy[8]
2088               + qzzk * gqyy[10]
2089               + 2.0 * (qxyk * gqyy[6] + qxzk * gqyy[7] + qyzk * gqyy[9])
2090               + ck * gc[8]
2091               + uxk * gux[8]
2092               + uyk * guy[8]
2093               + uzk * guz[8]
2094               + qxxk * gqxx[8]
2095               + qyyk * gqyy[8]
2096               + qzzk * gqzz[8]
2097               + 2.0 * (qxyk * gqxy[8] + qxzk * gqxz[8] + qyzk * gqyz[8]));
2098       final double iyz =
2099           -0.5
2100               * (ck * gqyz[1]
2101               + uxk * gqyz[2]
2102               + uyk * gqyz[3]
2103               + uzk * gqyz[4]
2104               + qxxk * gqyz[5]
2105               + qyyk * gqyz[8]
2106               + qzzk * gqyz[10]
2107               + 2.0 * (qxyk * gqyz[6] + qxzk * gqyz[7] + qyzk * gqyz[9])
2108               + ck * gc[9]
2109               + uxk * gux[9]
2110               + uyk * guy[9]
2111               + uzk * guz[9]
2112               + qxxk * gqxx[9]
2113               + qyyk * gqyy[9]
2114               + qzzk * gqzz[9]
2115               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9]));
2116       final double izz =
2117           -0.5
2118               * (ck * gqzz[1]
2119               + uxk * gqzz[2]
2120               + uyk * gqzz[3]
2121               + uzk * gqzz[4]
2122               + qxxk * gqzz[5]
2123               + qyyk * gqzz[8]
2124               + qzzk * gqzz[10]
2125               + 2.0 * (qxyk * gqzz[6] + qxzk * gqzz[7] + qyzk * gqzz[9])
2126               + ck * gc[10]
2127               + uxk * gux[10]
2128               + uyk * guy[10]
2129               + uzk * guz[10]
2130               + qxxk * gqxx[10]
2131               + qyyk * gqyy[10]
2132               + qzzk * gqzz[10]
2133               + 2.0 * (qxyk * gqxy[10] + qxzk * gqxz[10] + qyzk * gqyz[10]));
2134       final double iyx = ixy;
2135       final double izx = ixz;
2136       final double izy = iyz;
2137       final double kxx =
2138           -0.5
2139               * (ci * gqxx[1]
2140               - uxi * gqxx[2]
2141               - uyi * gqxx[3]
2142               - uzi * gqxx[4]
2143               + qxxi * gqxx[5]
2144               + qyyi * gqxx[8]
2145               + qzzi * gqxx[10]
2146               + 2.0 * (qxyi * gqxx[6] + qxzi * gqxx[7] + qyzi * gqxx[9])
2147               + ci * gc[5]
2148               - uxi * gux[5]
2149               - uyi * guy[5]
2150               - uzi * guz[5]
2151               + qxxi * gqxx[5]
2152               + qyyi * gqyy[5]
2153               + qzzi * gqzz[5]
2154               + 2.0 * (qxyi * gqxy[5] + qxzi * gqxz[5] + qyzi * gqyz[5]));
2155       double kxy =
2156           -0.5
2157               * (ci * gqxy[1]
2158               - uxi * gqxy[2]
2159               - uyi * gqxy[3]
2160               - uzi * gqxy[4]
2161               + qxxi * gqxy[5]
2162               + qyyi * gqxy[8]
2163               + qzzi * gqxy[10]
2164               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxy[7] + qyzi * gqxy[9])
2165               + ci * gc[6]
2166               - uxi * gux[6]
2167               - uyi * guy[6]
2168               - uzi * guz[6]
2169               + qxxi * gqxx[6]
2170               + qyyi * gqyy[6]
2171               + qzzi * gqzz[6]
2172               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxz[6] + qyzi * gqyz[6]));
2173       double kxz =
2174           -0.5
2175               * (ci * gqxz[1]
2176               - uxi * gqxz[2]
2177               - uyi * gqxz[3]
2178               - uzi * gqxz[4]
2179               + qxxi * gqxz[5]
2180               + qyyi * gqxz[8]
2181               + qzzi * gqxz[10]
2182               + 2.0 * (qxyi * gqxz[6] + qxzi * gqxz[7] + qyzi * gqxz[9])
2183               + ci * gc[7]
2184               - uxi * gux[7]
2185               - uyi * guy[7]
2186               - uzi * guz[7]
2187               + qxxi * gqxx[7]
2188               + qyyi * gqyy[7]
2189               + qzzi * gqzz[7]
2190               + 2.0 * (qxyi * gqxy[7] + qxzi * gqxz[7] + qyzi * gqyz[7]));
2191       double kyy =
2192           -0.5
2193               * (ci * gqyy[1]
2194               - uxi * gqyy[2]
2195               - uyi * gqyy[3]
2196               - uzi * gqyy[4]
2197               + qxxi * gqyy[5]
2198               + qyyi * gqyy[8]
2199               + qzzi * gqyy[10]
2200               + 2.0 * (qxyi * gqyy[6] + qxzi * gqyy[7] + qyzi * gqyy[9])
2201               + ci * gc[8]
2202               - uxi * gux[8]
2203               - uyi * guy[8]
2204               - uzi * guz[8]
2205               + qxxi * gqxx[8]
2206               + qyyi * gqyy[8]
2207               + qzzi * gqzz[8]
2208               + 2.0 * (qxyi * gqxy[8] + qxzi * gqxz[8] + qyzi * gqyz[8]));
2209       double kyz =
2210           -0.5
2211               * (ci * gqyz[1]
2212               - uxi * gqyz[2]
2213               - uyi * gqyz[3]
2214               - uzi * gqyz[4]
2215               + qxxi * gqyz[5]
2216               + qyyi * gqyz[8]
2217               + qzzi * gqyz[10]
2218               + 2.0 * (qxyi * gqyz[6] + qxzi * gqyz[7] + qyzi * gqyz[9])
2219               + ci * gc[9]
2220               - uxi * gux[9]
2221               - uyi * guy[9]
2222               - uzi * guz[9]
2223               + qxxi * gqxx[9]
2224               + qyyi * gqyy[9]
2225               + qzzi * gqzz[9]
2226               + 2.0 * (qxyi * gqxy[9] + qxzi * gqxz[9] + qyzi * gqyz[9]));
2227       double kzz =
2228           -0.5
2229               * (ci * gqzz[1]
2230               - uxi * gqzz[2]
2231               - uyi * gqzz[3]
2232               - uzi * gqzz[4]
2233               + qxxi * gqzz[5]
2234               + qyyi * gqzz[8]
2235               + qzzi * gqzz[10]
2236               + 2.0 * (qxyi * gqzz[6] + qxzi * gqzz[7] + qyzi * gqzz[9])
2237               + ci * gc[10]
2238               - uxi * gux[10]
2239               - uyi * guy[10]
2240               - uzi * guz[10]
2241               + qxxi * gqxx[10]
2242               + qyyi * gqyy[10]
2243               + qzzi * gqzz[10]
2244               + 2.0 * (qxyi * gqxy[10] + qxzi * gqxz[10] + qyzi * gqyz[10]));
2245       double kyx = kxy;
2246       double kzx = kxz;
2247       double kzy = kyz;
2248       tix += 2.0 * (qxyi * ixz + qyyi * iyz + qyzi * izz - qxzi * ixy - qyzi * iyy - qzzi * izy);
2249       tiy += 2.0 * (qxzi * ixx + qyzi * iyx + qzzi * izx - qxxi * ixz - qxyi * iyz - qxzi * izz);
2250       tiz += 2.0 * (qxxi * ixy + qxyi * iyy + qxzi * izy - qxyi * ixx - qyyi * iyx - qyzi * izx);
2251       tkx += 2.0 * (qxyk * kxz + qyyk * kyz + qyzk * kzz - qxzk * kxy - qyzk * kyy - qzzk * kzy);
2252       tky += 2.0 * (qxzk * kxx + qyzk * kyx + qzzk * kzx - qxxk * kxz - qxyk * kyz - qxzk * kzz);
2253       tkz += 2.0 * (qxxk * kxy + qxyk * kyy + qxzk * kzy - qxyk * kxx - qyyk * kyx - qyzk * kzx);
2254       if (i == k) {
2255         double selfScale = 0.5;
2256         tix *= selfScale;
2257         tiy *= selfScale;
2258         tiz *= selfScale;
2259         tkx *= selfScale;
2260         tky *= selfScale;
2261         tkz *= selfScale;
2262       }
2263       trqxi += tix;
2264       trqyi += tiy;
2265       trqzi += tiz;
2266 
2267       final double rtkx = tkx * transOp[0][0] + tky * transOp[1][0] + tkz * transOp[2][0];
2268       final double rtky = tkx * transOp[0][1] + tky * transOp[1][1] + tkz * transOp[2][1];
2269       final double rtkz = tkx * transOp[0][2] + tky * transOp[1][2] + tkz * transOp[2][2];
2270       torque.add(threadID, k, rtkx, rtky, rtkz);
2271     }
2272 
2273     private void polarizationEnergyGradient(int i, int k) {
2274       // Electrostatic solvation free energy gradient of the permanent
2275       // multipoles in the reaction potential of the induced dipoles.
2276       final double dpsymdx =
2277           -uxi * (sxk * gux[5] + syk * guy[5] + szk * guz[5])
2278               - uyi * (sxk * gux[6] + syk * guy[6] + szk * guz[6])
2279               - uzi * (sxk * gux[7] + syk * guy[7] + szk * guz[7])
2280               - uxk * (sxi * gux[5] + syi * guy[5] + szi * guz[5])
2281               - uyk * (sxi * gux[6] + syi * guy[6] + szi * guz[6])
2282               - uzk * (sxi * gux[7] + syi * guy[7] + szi * guz[7]);
2283       final double dpwidx =
2284           ci * (sxk * gc[5] + syk * gc[6] + szk * gc[7])
2285               - ck * (sxi * gux[2] + syi * guy[2] + szi * guz[2])
2286               - sxi
2287               * (qxxk * gux[11]
2288               + qyyk * gux[14]
2289               + qzzk * gux[16]
2290               + 2.0 * (qxyk * gux[12] + qxzk * gux[13] + qyzk * gux[15]))
2291               - syi
2292               * (qxxk * guy[11]
2293               + qyyk * guy[14]
2294               + qzzk * guy[16]
2295               + 2.0 * (qxyk * guy[12] + qxzk * guy[13] + qyzk * guy[15]))
2296               - szi
2297               * (qxxk * guz[11]
2298               + qyyk * guz[14]
2299               + qzzk * guz[16]
2300               + 2.0 * (qxyk * guz[12] + qxzk * guz[13] + qyzk * guz[15]))
2301               + sxk
2302               * (qxxi * gqxx[5]
2303               + qyyi * gqyy[5]
2304               + qzzi * gqzz[5]
2305               + 2.0 * (qxyi * gqxy[5] + qxzi * gqxz[5] + qyzi * gqyz[5]))
2306               + syk
2307               * (qxxi * gqxx[6]
2308               + qyyi * gqyy[6]
2309               + qzzi * gqzz[6]
2310               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxz[6] + qyzi * gqyz[6]))
2311               + szk
2312               * (qxxi * gqxx[7]
2313               + qyyi * gqyy[7]
2314               + qzzi * gqzz[7]
2315               + 2.0 * (qxyi * gqxy[7] + qxzi * gqxz[7] + qyzi * gqyz[7]));
2316       final double dpwkdx =
2317           ci * (sxk * gux[2] + syk * guy[2] + szk * guz[2])
2318               - ck * (sxi * gc[5] + syi * gc[6] + szi * gc[7])
2319               - sxi
2320               * (qxxk * gqxx[5]
2321               + qyyk * gqyy[5]
2322               + qzzk * gqzz[5]
2323               + 2.0 * (qxyk * gqxy[5] + qxzk * gqxz[5] + qyzk * gqyz[5]))
2324               - syi
2325               * (qxxk * gqxx[6]
2326               + qyyk * gqyy[6]
2327               + qzzk * gqzz[6]
2328               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]))
2329               - szi
2330               * (qxxk * gqxx[7]
2331               + qyyk * gqyy[7]
2332               + qzzk * gqzz[7]
2333               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]))
2334               + sxk
2335               * (qxxi * gux[11]
2336               + qyyi * gux[14]
2337               + qzzi * gux[16]
2338               + 2.0 * (qxyi * gux[12] + qxzi * gux[13] + qyzi * gux[15]))
2339               + syk
2340               * (qxxi * guy[11]
2341               + qyyi * guy[14]
2342               + qzzi * guy[16]
2343               + 2.0 * (qxyi * guy[12] + qxzi * guy[13] + qyzi * guy[15]))
2344               + szk
2345               * (qxxi * guz[11]
2346               + qyyi * guz[14]
2347               + qzzi * guz[16]
2348               + 2.0 * (qxyi * guz[12] + qxzi * guz[13] + qyzi * guz[15]));
2349       final double dpsymdy =
2350           -uxi * (sxk * gux[6] + syk * guy[6] + szk * guz[6])
2351               - uyi * (sxk * gux[8] + syk * guy[8] + szk * guz[8])
2352               - uzi * (sxk * gux[9] + syk * guy[9] + szk * guz[9])
2353               - uxk * (sxi * gux[6] + syi * guy[6] + szi * guz[6])
2354               - uyk * (sxi * gux[8] + syi * guy[8] + szi * guz[8])
2355               - uzk * (sxi * gux[9] + syi * guy[9] + szi * guz[9]);
2356       final double dpwidy =
2357           ci * (sxk * gc[6] + syk * gc[8] + szk * gc[9])
2358               - ck * (sxi * gux[3] + syi * guy[3] + szi * guz[3])
2359               - sxi
2360               * (qxxk * gux[12]
2361               + qyyk * gux[17]
2362               + qzzk * gux[19]
2363               + 2.0 * (qxyk * gux[14] + qxzk * gux[15] + qyzk * gux[18]))
2364               - syi
2365               * (qxxk * guy[12]
2366               + qyyk * guy[17]
2367               + qzzk * guy[19]
2368               + 2.0 * (qxyk * guy[14] + qxzk * guy[15] + qyzk * guy[18]))
2369               - szi
2370               * (qxxk * guz[12]
2371               + qyyk * guz[17]
2372               + qzzk * guz[19]
2373               + 2.0 * (qxyk * guz[14] + qxzk * guz[15] + qyzk * guz[18]))
2374               + sxk
2375               * (qxxi * gqxx[6]
2376               + qyyi * gqyy[6]
2377               + qzzi * gqzz[6]
2378               + 2.0 * (qxyi * gqxy[6] + qxzi * gqxz[6] + qyzi * gqyz[6]))
2379               + syk
2380               * (qxxi * gqxx[8]
2381               + qyyi * gqyy[8]
2382               + qzzi * gqzz[8]
2383               + 2.0 * (qxyi * gqxy[8] + qxzi * gqxz[8] + qyzi * gqyz[8]))
2384               + szk
2385               * (qxxi * gqxx[9]
2386               + qyyi * gqyy[9]
2387               + qzzi * gqzz[9]
2388               + 2.0 * (qxyi * gqxy[9] + qxzi * gqxz[9] + qyzi * gqyz[9]));
2389       final double dpwkdy =
2390           ci * (sxk * gux[3] + syk * guy[3] + szk * guz[3])
2391               - ck * (sxi * gc[6] + syi * gc[8] + szi * gc[9])
2392               - sxi
2393               * (qxxk * gqxx[6]
2394               + qyyk * gqyy[6]
2395               + qzzk * gqzz[6]
2396               + 2.0 * (qxyk * gqxy[6] + qxzk * gqxz[6] + qyzk * gqyz[6]))
2397               - syi
2398               * (qxxk * gqxx[8]
2399               + qyyk * gqyy[8]
2400               + qzzk * gqzz[8]
2401               + 2.0 * (qxyk * gqxy[8] + qxzk * gqxz[8] + qyzk * gqyz[8]))
2402               - szi
2403               * (qxxk * gqxx[9]
2404               + qyyk * gqyy[9]
2405               + qzzk * gqzz[9]
2406               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9]))
2407               + sxk
2408               * (qxxi * gux[12]
2409               + qyyi * gux[17]
2410               + qzzi * gux[19]
2411               + 2.0 * (qxyi * gux[14] + qxzi * gux[15] + qyzi * gux[18]))
2412               + syk
2413               * (qxxi * guy[12]
2414               + qyyi * guy[17]
2415               + qzzi * guy[19]
2416               + 2.0 * (qxyi * guy[14] + qxzi * guy[15] + qyzi * guy[18]))
2417               + szk
2418               * (qxxi * guz[12]
2419               + qyyi * guz[17]
2420               + qzzi * guz[19]
2421               + 2.0 * (qxyi * guz[14] + qxzi * guz[15] + qyzi * guz[18]));
2422       final double dpsymdz =
2423           -uxi * (sxk * gux[7] + syk * guy[7] + szk * guz[7])
2424               - uyi * (sxk * gux[9] + syk * guy[9] + szk * guz[9])
2425               - uzi * (sxk * gux[10] + syk * guy[10] + szk * guz[10])
2426               - uxk * (sxi * gux[7] + syi * guy[7] + szi * guz[7])
2427               - uyk * (sxi * gux[9] + syi * guy[9] + szi * guz[9])
2428               - uzk * (sxi * gux[10] + syi * guy[10] + szi * guz[10]);
2429       final double dpwidz =
2430           ci * (sxk * gc[7] + syk * gc[9] + szk * gc[10])
2431               - ck * (sxi * gux[4] + syi * guy[4] + szi * guz[4])
2432               - sxi
2433               * (qxxk * gux[13]
2434               + qyyk * gux[18]
2435               + qzzk * gux[20]
2436               + 2.0 * (qxyk * gux[15] + qxzk * gux[16] + qyzk * gux[19]))
2437               - syi
2438               * (qxxk * guy[13]
2439               + qyyk * guy[18]
2440               + qzzk * guy[20]
2441               + 2.0 * (qxyk * guy[15] + qxzk * guy[16] + qyzk * guy[19]))
2442               - szi
2443               * (qxxk * guz[13]
2444               + qyyk * guz[18]
2445               + qzzk * guz[20]
2446               + 2.0 * (qxyk * guz[15] + qxzk * guz[16] + qyzk * guz[19]))
2447               + sxk
2448               * (qxxi * gqxx[7]
2449               + qyyi * gqyy[7]
2450               + qzzi * gqzz[7]
2451               + 2.0 * (qxyi * gqxy[7] + qxzi * gqxz[7] + qyzi * gqyz[7]))
2452               + syk
2453               * (qxxi * gqxx[9]
2454               + qyyi * gqyy[9]
2455               + qzzi * gqzz[9]
2456               + 2.0 * (qxyi * gqxy[9] + qxzi * gqxz[9] + qyzi * gqyz[9]))
2457               + szk
2458               * (qxxi * gqxx[10]
2459               + qyyi * gqyy[10]
2460               + qzzi * gqzz[10]
2461               + 2.0 * (qxyi * gqxy[10] + qxzi * gqxz[10] + qyzi * gqyz[10]));
2462       final double dpwkdz =
2463           ci * (sxk * gux[4] + syk * guy[4] + szk * guz[4])
2464               - ck * (sxi * gc[7] + syi * gc[9] + szi * gc[10])
2465               - sxi
2466               * (qxxk * gqxx[7]
2467               + qyyk * gqyy[7]
2468               + qzzk * gqzz[7]
2469               + 2.0 * (qxyk * gqxy[7] + qxzk * gqxz[7] + qyzk * gqyz[7]))
2470               - syi
2471               * (qxxk * gqxx[9]
2472               + qyyk * gqyy[9]
2473               + qzzk * gqzz[9]
2474               + 2.0 * (qxyk * gqxy[9] + qxzk * gqxz[9] + qyzk * gqyz[9]))
2475               - szi
2476               * (qxxk * gqxx[10]
2477               + qyyk * gqyy[10]
2478               + qzzk * gqzz[10]
2479               + 2.0 * (qxyk * gqxy[10] + qxzk * gqxz[10] + qyzk * gqyz[10]))
2480               + sxk
2481               * (qxxi * gux[13]
2482               + qyyi * gux[18]
2483               + qzzi * gux[20]
2484               + 2.0 * (qxyi * gux[15] + qxzi * gux[16] + qyzi * gux[19]))
2485               + syk
2486               * (qxxi * guy[13]
2487               + qyyi * guy[18]
2488               + qzzi * guy[20]
2489               + 2.0 * (qxyi * guy[15] + qxzi * guy[16] + qyzi * guy[19]))
2490               + szk
2491               * (qxxi * guz[13]
2492               + qyyi * guz[18]
2493               + qzzi * guz[20]
2494               + 2.0 * (qxyi * guz[15] + qxzi * guz[16] + qyzi * guz[19]));
2495 
2496       // Effective radii chain rule terms for the electrostatic solvation free energy
2497       // gradient of the permanent multipoles in the reaction potential of the induced dipoles.
2498       final double dsymdr =
2499           -uxi * (sxk * gux[22] + syk * guy[22] + szk * guz[22])
2500               - uyi * (sxk * gux[23] + syk * guy[23] + szk * guz[23])
2501               - uzi * (sxk * gux[24] + syk * guy[24] + szk * guz[24])
2502               - uxk * (sxi * gux[22] + syi * guy[22] + szi * guz[22])
2503               - uyk * (sxi * gux[23] + syi * guy[23] + szi * guz[23])
2504               - uzk * (sxi * gux[24] + syi * guy[24] + szi * guz[24]);
2505       final double dwipdr =
2506           ci * (sxk * gc[22] + syk * gc[23] + szk * gc[24])
2507               - ck * (sxi * gux[21] + syi * guy[21] + szi * guz[21])
2508               - sxi
2509               * (qxxk * gux[25]
2510               + qyyk * gux[28]
2511               + qzzk * gux[30]
2512               + 2.0 * (qxyk * gux[26] + qxzk * gux[27] + qyzk * gux[29]))
2513               - syi
2514               * (qxxk * guy[25]
2515               + qyyk * guy[28]
2516               + qzzk * guy[30]
2517               + 2.0 * (qxyk * guy[26] + qxzk * guy[27] + qyzk * guy[29]))
2518               - szi
2519               * (qxxk * guz[25]
2520               + qyyk * guz[28]
2521               + qzzk * guz[30]
2522               + 2.0 * (qxyk * guz[26] + qxzk * guz[27] + qyzk * guz[29]))
2523               + sxk
2524               * (qxxi * gqxx[22]
2525               + qyyi * gqyy[22]
2526               + qzzi * gqzz[22]
2527               + 2.0 * (qxyi * gqxy[22] + qxzi * gqxz[22] + qyzi * gqyz[22]))
2528               + syk
2529               * (qxxi * gqxx[23]
2530               + qyyi * gqyy[23]
2531               + qzzi * gqzz[23]
2532               + 2.0 * (qxyi * gqxy[23] + qxzi * gqxz[23] + qyzi * gqyz[23]))
2533               + szk
2534               * (qxxi * gqxx[24]
2535               + qyyi * gqyy[24]
2536               + qzzi * gqzz[24]
2537               + 2.0 * (qxyi * gqxy[24] + qxzi * gqxz[24] + qyzi * gqyz[24]));
2538       final double dwkpdr =
2539           ci * (sxk * gux[21] + syk * guy[21] + szk * guz[21])
2540               - ck * (sxi * gc[22] + syi * gc[23] + szi * gc[24])
2541               - sxi
2542               * (qxxk * gqxx[22]
2543               + qyyk * gqyy[22]
2544               + qzzk * gqzz[22]
2545               + 2.0 * (qxyk * gqxy[22] + qxzk * gqxz[22] + qyzk * gqyz[22]))
2546               - syi
2547               * (qxxk * gqxx[23]
2548               + qyyk * gqyy[23]
2549               + qzzk * gqzz[23]
2550               + 2.0 * (qxyk * gqxy[23] + qxzk * gqxz[23] + qyzk * gqyz[23]))
2551               - szi
2552               * (qxxk * gqxx[24]
2553               + qyyk * gqyy[24]
2554               + qzzk * gqzz[24]
2555               + 2.0 * (qxyk * gqxy[24] + qxzk * gqxz[24] + qyzk * gqyz[24]))
2556               + sxk
2557               * (qxxi * gux[25]
2558               + qyyi * gux[28]
2559               + qzzi * gux[30]
2560               + 2.0 * (qxyi * gux[26] + qxzi * gux[27] + qyzi * gux[29]))
2561               + syk
2562               * (qxxi * guy[25]
2563               + qyyi * guy[28]
2564               + qzzi * guy[30]
2565               + 2.0 * (qxyi * guy[26] + qxzi * guy[27] + qyzi * guy[29]))
2566               + szk
2567               * (qxxi * guz[25]
2568               + qyyi * guz[28]
2569               + qzzi * guz[30]
2570               + 2.0 * (qxyi * guz[26] + qxzi * guz[27] + qyzi * guz[29]));
2571       double dpdx = 0.5 * (dpsymdx + 0.5 * (dpwidx + dpwkdx));
2572       double dpdy = 0.5 * (dpsymdy + 0.5 * (dpwidy + dpwkdy));
2573       double dpdz = 0.5 * (dpsymdz + 0.5 * (dpwidz + dpwkdz));
2574       double dsumdri = dsymdr + 0.5 * (dwipdr + dwkpdr);
2575       double dbi = 0.5 * rbk * dsumdri;
2576       double dbk = 0.5 * rbi * dsumdri;
2577       if (polarization == Polarization.MUTUAL) {
2578         dpdx -=
2579             0.5
2580                 * (dxi * (pxk * gux[5] + pyk * gux[6] + pzk * gux[7])
2581                 + dyi * (pxk * guy[5] + pyk * guy[6] + pzk * guy[7])
2582                 + dzi * (pxk * guz[5] + pyk * guz[6] + pzk * guz[7])
2583                 + dxk * (pxi * gux[5] + pyi * gux[6] + pzi * gux[7])
2584                 + dyk * (pxi * guy[5] + pyi * guy[6] + pzi * guy[7])
2585                 + dzk * (pxi * guz[5] + pyi * guz[6] + pzi * guz[7]));
2586         dpdy -=
2587             0.5
2588                 * (dxi * (pxk * gux[6] + pyk * gux[8] + pzk * gux[9])
2589                 + dyi * (pxk * guy[6] + pyk * guy[8] + pzk * guy[9])
2590                 + dzi * (pxk * guz[6] + pyk * guz[8] + pzk * guz[9])
2591                 + dxk * (pxi * gux[6] + pyi * gux[8] + pzi * gux[9])
2592                 + dyk * (pxi * guy[6] + pyi * guy[8] + pzi * guy[9])
2593                 + dzk * (pxi * guz[6] + pyi * guz[8] + pzi * guz[9]));
2594         dpdz -=
2595             0.5
2596                 * (dxi * (pxk * gux[7] + pyk * gux[9] + pzk * gux[10])
2597                 + dyi * (pxk * guy[7] + pyk * guy[9] + pzk * guy[10])
2598                 + dzi * (pxk * guz[7] + pyk * guz[9] + pzk * guz[10])
2599                 + dxk * (pxi * gux[7] + pyi * gux[9] + pzi * gux[10])
2600                 + dyk * (pxi * guy[7] + pyi * guy[9] + pzi * guy[10])
2601                 + dzk * (pxi * guz[7] + pyi * guz[9] + pzi * guz[10]));
2602         final double duvdr =
2603             dxi * (pxk * gux[22] + pyk * gux[23] + pzk * gux[24])
2604                 + dyi * (pxk * guy[22] + pyk * guy[23] + pzk * guy[24])
2605                 + dzi * (pxk * guz[22] + pyk * guz[23] + pzk * guz[24])
2606                 + dxk * (pxi * gux[22] + pyi * gux[23] + pzi * gux[24])
2607                 + dyk * (pxi * guy[22] + pyi * guy[23] + pzi * guy[24])
2608                 + dzk * (pxi * guz[22] + pyi * guz[23] + pzi * guz[24]);
2609         dbi -= 0.5 * rbk * duvdr;
2610         dbk -= 0.5 * rbi * duvdr;
2611       }
2612 
2613       // Increment the gradients and Born chain rule term.
2614       if (i == k && iSymm == 0) {
2615         dborni += dbi;
2616       } else {
2617         if (i == k) {
2618           dpdx *= 0.5;
2619           dpdy *= 0.5;
2620           dpdz *= 0.5;
2621           dbi *= 0.5;
2622           dbk *= 0.5;
2623         }
2624         dedxi -= dpdx;
2625         dedyi -= dpdy;
2626         dedzi -= dpdz;
2627         dborni += dbi;
2628         final double rdpdx = dpdx * transOp[0][0] + dpdy * transOp[1][0] + dpdz * transOp[2][0];
2629         final double rdpdy = dpdx * transOp[0][1] + dpdy * transOp[1][1] + dpdz * transOp[2][1];
2630         final double rdpdz = dpdx * transOp[0][2] + dpdy * transOp[1][2] + dpdz * transOp[2][2];
2631         grad.add(threadID, k, rdpdx, rdpdy, rdpdz);
2632         sharedBornGrad.add(threadID, k, dbk);
2633       }
2634       polarizationEnergyTorque(i, k);
2635     }
2636 
2637     private void polarizationEnergyTorque(int i, int k) {
2638       double fix = 0.5 * (sxk * gux[2] + syk * guy[2] + szk * guz[2]);
2639       double fiy = 0.5 * (sxk * gux[3] + syk * guy[3] + szk * guz[3]);
2640       double fiz = 0.5 * (sxk * gux[4] + syk * guy[4] + szk * guz[4]);
2641       double fkx = 0.5 * (sxi * gux[2] + syi * guy[2] + szi * guz[2]);
2642       double fky = 0.5 * (sxi * gux[3] + syi * guy[3] + szi * guz[3]);
2643       double fkz = 0.5 * (sxi * gux[4] + syi * guy[4] + szi * guz[4]);
2644       double fixx =
2645           -0.25
2646               * ((sxk * gqxx[2] + syk * gqxx[3] + szk * gqxx[4])
2647               + (sxk * gux[5] + syk * guy[5] + szk * guz[5]));
2648       double fixy =
2649           -0.25
2650               * ((sxk * gqxy[2] + syk * gqxy[3] + szk * gqxy[4])
2651               + (sxk * gux[6] + syk * guy[6] + szk * guz[6]));
2652       double fixz =
2653           -0.25
2654               * ((sxk * gqxz[2] + syk * gqxz[3] + szk * gqxz[4])
2655               + (sxk * gux[7] + syk * guy[7] + szk * guz[7]));
2656       double fiyy =
2657           -0.25
2658               * ((sxk * gqyy[2] + syk * gqyy[3] + szk * gqyy[4])
2659               + (sxk * gux[8] + syk * guy[8] + szk * guz[8]));
2660       double fiyz =
2661           -0.25
2662               * ((sxk * gqyz[2] + syk * gqyz[3] + szk * gqyz[4])
2663               + (sxk * gux[9] + syk * guy[9] + szk * guz[9]));
2664       double fizz =
2665           -0.25
2666               * ((sxk * gqzz[2] + syk * gqzz[3] + szk * gqzz[4])
2667               + (sxk * gux[10] + syk * guy[10] + szk * guz[10]));
2668       double fiyx = fixy;
2669       double fizx = fixz;
2670       double fizy = fiyz;
2671       double fkxx =
2672           0.25
2673               * ((sxi * gqxx[2] + syi * gqxx[3] + szi * gqxx[4])
2674               + (sxi * gux[5] + syi * guy[5] + szi * guz[5]));
2675       double fkxy =
2676           0.25
2677               * ((sxi * gqxy[2] + syi * gqxy[3] + szi * gqxy[4])
2678               + (sxi * gux[6] + syi * guy[6] + szi * guz[6]));
2679       double fkxz =
2680           0.25
2681               * ((sxi * gqxz[2] + syi * gqxz[3] + szi * gqxz[4])
2682               + (sxi * gux[7] + syi * guy[7] + szi * guz[7]));
2683       double fkyy =
2684           0.25
2685               * ((sxi * gqyy[2] + syi * gqyy[3] + szi * gqyy[4])
2686               + (sxi * gux[8] + syi * guy[8] + szi * guz[8]));
2687       double fkyz =
2688           0.25
2689               * ((sxi * gqyz[2] + syi * gqyz[3] + szi * gqyz[4])
2690               + (sxi * gux[9] + syi * guy[9] + szi * guz[9]));
2691       double fkzz =
2692           0.25
2693               * ((sxi * gqzz[2] + syi * gqzz[3] + szi * gqzz[4])
2694               + (sxi * gux[10] + syi * guy[10] + szi * guz[10]));
2695       double fkyx = fkxy;
2696       double fkzx = fkxz;
2697       double fkzy = fkyz;
2698       if (i == k) {
2699         fix *= 0.5;
2700         fiy *= 0.5;
2701         fiz *= 0.5;
2702         fkx *= 0.5;
2703         fky *= 0.5;
2704         fkz *= 0.5;
2705         fixx *= 0.5;
2706         fixy *= 0.5;
2707         fixz *= 0.5;
2708         fiyx *= 0.5;
2709         fiyy *= 0.5;
2710         fiyz *= 0.5;
2711         fizx *= 0.5;
2712         fizy *= 0.5;
2713         fizz *= 0.5;
2714         fkxx *= 0.5;
2715         fkxy *= 0.5;
2716         fkxz *= 0.5;
2717         fkyx *= 0.5;
2718         fkyy *= 0.5;
2719         fkyz *= 0.5;
2720         fkzx *= 0.5;
2721         fkzy *= 0.5;
2722         fkzz *= 0.5;
2723       }
2724 
2725       // Torque due to induced reaction field on permanent dipoles.
2726       double tix = uyi * fiz - uzi * fiy;
2727       double tiy = uzi * fix - uxi * fiz;
2728       double tiz = uxi * fiy - uyi * fix;
2729       double tkx = uyk * fkz - uzk * fky;
2730       double tky = uzk * fkx - uxk * fkz;
2731       double tkz = uxk * fky - uyk * fkx;
2732 
2733       // Torque due to induced reaction field gradient on quadrupoles.
2734       tix +=
2735           2.0 * (qxyi * fixz + qyyi * fiyz + qyzi * fizz - qxzi * fixy - qyzi * fiyy - qzzi * fizy);
2736       tiy +=
2737           2.0 * (qxzi * fixx + qyzi * fiyx + qzzi * fizx - qxxi * fixz - qxyi * fiyz - qxzi * fizz);
2738       tiz +=
2739           2.0 * (qxxi * fixy + qxyi * fiyy + qxzi * fizy - qxyi * fixx - qyyi * fiyx - qyzi * fizx);
2740       tkx +=
2741           2.0 * (qxyk * fkxz + qyyk * fkyz + qyzk * fkzz - qxzk * fkxy - qyzk * fkyy - qzzk * fkzy);
2742       tky +=
2743           2.0 * (qxzk * fkxx + qyzk * fkyx + qzzk * fkzx - qxxk * fkxz - qxyk * fkyz - qxzk * fkzz);
2744       tkz +=
2745           2.0 * (qxxk * fkxy + qxyk * fkyy + qxzk * fkzy - qxyk * fkxx - qyyk * fkyx - qyzk * fkzx);
2746       trqxi += tix;
2747       trqyi += tiy;
2748       trqzi += tiz;
2749 
2750       final double rx = tkx;
2751       final double ry = tky;
2752       final double rz = tkz;
2753       tkx = rx * transOp[0][0] + ry * transOp[1][0] + rz * transOp[2][0];
2754       tky = rx * transOp[0][1] + ry * transOp[1][1] + rz * transOp[2][1];
2755       tkz = rx * transOp[0][2] + ry * transOp[1][2] + rz * transOp[2][2];
2756       torque.add(threadID, k, tkx, tky, tkz);
2757     }
2758   }
2759 
2760   /**
2761    * Compute the GK Energy using a QI frame.
2762    *
2763    * @since 1.0
2764    */
2765   private class GKEnergyLoopQI extends IntegerForLoop {
2766 
2767     private final double[] dx_local;
2768     private final double[] gradI = new double[3];
2769     private final double[] torqueI = new double[3];
2770     private final double[] torqueK = new double[3];
2771     private final double[] gI = new double[3];
2772     private final double[] tI = new double[3];
2773     private final double[] tK = new double[3];
2774 
2775     private double rbi;
2776     PolarizableMultipole mI;
2777     PolarizableMultipole mK;
2778     QIFrame qiFrame;
2779     GKEnergyQI gkEnergyQI;
2780     private double xi, yi, zi;
2781     private double dedxi, dedyi, dedzi;
2782     private double dborni;
2783     private double trqxi, trqyi, trqzi;
2784     private int count;
2785     private int iSymm;
2786     private int threadID;
2787     private final double[][] transOp;
2788     private double gkEnergy;
2789     private double gkPermanentEnergy;
2790     private double gkPolarizationEnergy;
2791 
2792     GKEnergyLoopQI() {
2793       mI = new PolarizableMultipole();
2794       mK = new PolarizableMultipole();
2795       qiFrame = new QIFrame();
2796       dx_local = new double[3];
2797       transOp = new double[3][3];
2798     }
2799 
2800     @Override
2801     public void start() {
2802       gkEnergy = 0.0;
2803       gkPermanentEnergy = 0.0;
2804       gkPolarizationEnergy = 0.0;
2805       count = 0;
2806       threadID = getThreadIndex();
2807       gkEnergyQI = new GKEnergyQI(soluteDielectric, solventDielectric, gkc, gradient);
2808     }
2809 
2810     @Override
2811     public void finish() {
2812       sharedInteractions.addAndGet(count);
2813       sharedGKEnergy.addAndGet(gkEnergy);
2814       sharedPermanentGKEnergy.addAndGet(gkPermanentEnergy);
2815       sharedPolarizationGKEnergy.addAndGet(gkPolarizationEnergy);
2816     }
2817 
2818     @Override
2819     public void run(int lb, int ub) {
2820 
2821       double[] x = sXYZ[0][0];
2822       double[] y = sXYZ[0][1];
2823       double[] z = sXYZ[0][2];
2824 
2825       int nSymm = crystal.spaceGroup.symOps.size();
2826       List<SymOp> symOps = crystal.spaceGroup.symOps;
2827 
2828       for (iSymm = 0; iSymm < nSymm; iSymm++) {
2829         SymOp symOp = symOps.get(iSymm);
2830         crystal.getTransformationOperator(symOp, transOp);
2831         for (int i = lb; i <= ub; i++) {
2832           if (!use[i]) {
2833             continue;
2834           }
2835 
2836           // Zero out force accumulation for atom i.
2837           dedxi = 0.0;
2838           dedyi = 0.0;
2839           dedzi = 0.0;
2840           trqxi = 0.0;
2841           trqyi = 0.0;
2842           trqzi = 0.0;
2843           dborni = 0.0;
2844 
2845           // Collect the coordinates of atom i.
2846           xi = x[i];
2847           yi = y[i];
2848           zi = z[i];
2849           rbi = born[i];
2850           int[] list = neighborLists[iSymm][i];
2851           for (int k : list) {
2852             if (!use[k]) {
2853               continue;
2854             }
2855             interaction(i, k);
2856           }
2857           if (iSymm == 0) {
2858             // Include self-interactions for the asymmetric unit atoms.
2859             interaction(i, i);
2860             /*
2861              Formula for Born energy approximation for cavitation energy is:
2862              e = surfaceTension / 6 * (ri + probe)^2 * (ri/rb)^6.
2863              ri is the base atomic radius the atom.
2864              rb is Born radius of the atom.
2865             */
2866             switch (nonPolarModel) {
2867               case BORN_SOLV:
2868               case BORN_CAV_DISP:
2869                 double r = baseRadius[i] + dOffset + probe;
2870                 double ratio = (baseRadius[i] + dOffset) / born[i];
2871                 ratio *= ratio;
2872                 ratio *= (ratio * ratio);
2873                 double saTerm = surfaceTension * r * r * ratio / 6.0;
2874                 gkEnergy += saTerm;
2875                 sharedBornGrad.sub(threadID, i, 6.0 * saTerm / born[i]);
2876                 break;
2877               default:
2878                 break;
2879             }
2880           }
2881           if (gradient) {
2882             grad.add(threadID, i, dedxi, dedyi, dedzi);
2883             torque.add(threadID, i, trqxi, trqyi, trqzi);
2884             sharedBornGrad.add(threadID, i, dborni);
2885           }
2886         }
2887       }
2888     }
2889 
2890     private void interaction(int i, int k) {
2891       dx_local[0] = sXYZ[iSymm][0][k] - xi;
2892       dx_local[1] = sXYZ[iSymm][1][k] - yi;
2893       dx_local[2] = sXYZ[iSymm][2][k] - zi;
2894       double r2 = crystal.image(dx_local);
2895       if (r2 > cut2) {
2896         return;
2897       }
2898 
2899       // Set the multipole moments for site I.
2900       mI.setPermanentMultipole(globalMultipole[0][i]);
2901       mI.setInducedDipole(inducedDipole[0][i], inducedDipoleCR[0][i]);
2902       // Set the multipole moments for site K.
2903       mK.setPermanentMultipole(globalMultipole[iSymm][k]);
2904       mK.setInducedDipole(inducedDipole[iSymm][k], inducedDipoleCR[iSymm][k]);
2905 
2906       double selfScale = 1.0;
2907       if (i == k) {
2908         selfScale = 0.5;
2909       } else {
2910         qiFrame.setAndRotate(dx_local, mI, mK);
2911       }
2912 
2913       // Set the GK energy tensor.
2914       double rbk = born[k];
2915       gkEnergyQI.initPotential(dx_local, r2, rbi, rbk);
2916 
2917       // Compute the GK permanent multipole interaction.
2918       double eik;
2919       if (!gradient) {
2920         // Compute the GK permanent interaction energy.
2921         eik = electric * selfScale * gkEnergyQI.multipoleEnergy(mI, mK);
2922         gkPermanentEnergy += eik;
2923         if (polarization != Polarization.NONE) {
2924           // Compute the GK polarization interaction energy.
2925           double ep = electric * selfScale * gkEnergyQI.polarizationEnergy(mI, mK);
2926           gkPolarizationEnergy += ep;
2927           eik += ep;
2928         }
2929       } else {
2930         if (i == k) {
2931           // Compute the GK permanent interaction energy.
2932           eik = electric * selfScale * gkEnergyQI.multipoleEnergy(mI, mK);
2933           gkPermanentEnergy += eik;
2934           // There is no dE/dR or torque for the i == k permanent self-energy.
2935           if (polarization != Polarization.NONE) {
2936             // Compute the GK polarization interaction energy.
2937             // There is no dE/dR, but there can be a torque for the i == k polarization self-energy
2938             // if the permanent dipole and induced dipole are not aligned.
2939             double mutualMask = 1.0;
2940             if (polarization == Polarization.DIRECT) {
2941               mutualMask = 0.0;
2942             }
2943             double ep =
2944                 electric * selfScale * gkEnergyQI.polarizationEnergyAndGradient(mI, mK, mutualMask,
2945                     gradI, torqueI, torqueK);
2946             gkPolarizationEnergy += ep;
2947             eik += ep;
2948             // The torque for the i == k polarization self-energy.
2949             trqxi += electric * selfScale * torqueI[0];
2950             trqyi += electric * selfScale * torqueI[1];
2951             trqzi += electric * selfScale * torqueI[2];
2952             double tkx = electric * selfScale * torqueK[0];
2953             double tky = electric * selfScale * torqueK[1];
2954             double tkz = electric * selfScale * torqueK[2];
2955             final double rtkx = tkx * transOp[0][0] + tky * transOp[1][0] + tkz * transOp[2][0];
2956             final double rtky = tkx * transOp[0][1] + tky * transOp[1][1] + tkz * transOp[2][1];
2957             final double rtkz = tkx * transOp[0][2] + tky * transOp[1][2] + tkz * transOp[2][2];
2958             torque.add(threadID, k, rtkx, rtky, rtkz);
2959           }
2960           // Compute the GK permanent Born chain-rule term.
2961           gkEnergyQI.initBorn(dx_local, r2, rbi, rbk);
2962           double db = gkEnergyQI.multipoleEnergyBornGrad(mI, mK);
2963           if (polarization != Polarization.NONE) {
2964             db += gkEnergyQI.polarizationEnergyBornGrad(mI, mK, polarization == Polarization.MUTUAL);
2965           }
2966           dborni += electric * rbi * db;
2967         } else {
2968           // Sum the GK permanent interaction energy.
2969           eik = electric * gkEnergyQI.multipoleEnergyAndGradient(mI, mK, gradI, torqueI, torqueK);
2970           gkPermanentEnergy += eik;
2971           if (polarization != Polarization.NONE) {
2972             double mutualMask = 1.0;
2973             if (polarization == Polarization.DIRECT) {
2974               mutualMask = 0.0;
2975             }
2976             // Sum the GK polarization interaction energy.
2977             double ep =
2978                 electric * gkEnergyQI.polarizationEnergyAndGradient(mI, mK, mutualMask, gI, tI, tK);
2979             eik += ep;
2980             gkPolarizationEnergy += ep;
2981             for (int j = 0; j < 3; j++) {
2982               gradI[j] += gI[j];
2983               torqueI[j] += tI[j];
2984               torqueK[j] += tK[j];
2985             }
2986           }
2987 
2988           // Convert to units of kcal/mol
2989           for (int j = 0; j < 3; j++) {
2990             gradI[j] *= electric;
2991             torqueI[j] *= electric;
2992             torqueK[j] *= electric;
2993           }
2994 
2995           // Rotate gradient and torques from the QI frame into the Global frame.
2996           qiFrame.toGlobal(gradI);
2997           qiFrame.toGlobal(torqueI);
2998           qiFrame.toGlobal(torqueK);
2999 
3000           // Accumulate partial derivatives on site I.
3001           dedxi += gradI[0];
3002           dedyi += gradI[1];
3003           dedzi += gradI[2];
3004           trqxi += torqueI[0];
3005           trqyi += torqueI[1];
3006           trqzi += torqueI[2];
3007 
3008           // Accumulate partial derivatives on site K.
3009           double dedx = -gradI[0];
3010           double dedy = -gradI[1];
3011           double dedz = -gradI[2];
3012           // Handle symmetry mate rotation.
3013           final double dedxk = dedx * transOp[0][0] + dedy * transOp[1][0] + dedz * transOp[2][0];
3014           final double dedyk = dedx * transOp[0][1] + dedy * transOp[1][1] + dedz * transOp[2][1];
3015           final double dedzk = dedx * transOp[0][2] + dedy * transOp[1][2] + dedz * transOp[2][2];
3016           double tkx = torqueK[0];
3017           double tky = torqueK[1];
3018           double tkz = torqueK[2];
3019           final double rtkx = tkx * transOp[0][0] + tky * transOp[1][0] + tkz * transOp[2][0];
3020           final double rtky = tkx * transOp[0][1] + tky * transOp[1][1] + tkz * transOp[2][1];
3021           final double rtkz = tkx * transOp[0][2] + tky * transOp[1][2] + tkz * transOp[2][2];
3022           grad.add(threadID, k, dedxk, dedyk, dedzk);
3023           torque.add(threadID, k, rtkx, rtky, rtkz);
3024 
3025           // Compute the Born-chain rule term.
3026           gkEnergyQI.initBorn(dx_local, r2, rbi, rbk);
3027           double db = gkEnergyQI.multipoleEnergyBornGrad(mI, mK);
3028           if (polarization != Polarization.NONE) {
3029             db += gkEnergyQI.polarizationEnergyBornGrad(mI, mK, polarization == Polarization.MUTUAL);
3030           }
3031           db *= electric;
3032           dborni += rbk * db;
3033           sharedBornGrad.add(threadID, k, rbi * db);
3034         }
3035       }
3036 
3037       if (i == k) {
3038         selfEnergy.add(threadID, i, eik);
3039       } else {
3040         double half = 0.5 * eik;
3041         crossEnergy.add(threadID, i, half);
3042         crossEnergy.add(threadID, k, half);
3043       }
3044 
3045       gkEnergy += eik;
3046       count++;
3047     }
3048   }
3049 
3050   /**
3051    * Compute the GK Energy using a QI frame.
3052    *
3053    * @since 1.0
3054    */
3055   private class GKEnergyLoopQISIMD extends IntegerForLoop {
3056 
3057     private final DoubleVector zero = DoubleVector.zero(SPECIES_PREFERRED);
3058     private final int simdN = zero.length();
3059 
3060     // Arrays used to load SIMD data.
3061     private double[] r2 = new double[simdN];
3062     private double[] dx = new double[simdN];
3063     private double[] dy = new double[simdN];
3064     private double[] dz = new double[simdN];
3065     private double[][] mpoleI = new double[10][simdN];
3066     private double[][] mpoleK = new double[10][simdN];
3067     private double[][] indI = new double[3][simdN];
3068     private double[][] indK = new double[3][simdN];
3069     private double[][] indICR = new double[3][simdN];
3070     private double[][] indKCR = new double[3][simdN];
3071     private double[] bornK = new double[simdN];
3072 
3073     private final double[] dx_local;
3074     private final double[] gradI = new double[3];
3075     private final double[] torqueI = new double[3];
3076     private final double[] torqueK = new double[3];
3077     private final double[] gI = new double[3];
3078     private final double[] tI = new double[3];
3079     private final double[] tK = new double[3];
3080 
3081     private final DoubleVector[] dxVec = new DoubleVector[3];
3082     private DoubleVector rbiVec;
3083 
3084     PolarizableMultipoleSIMD mI;
3085     PolarizableMultipoleSIMD mK;
3086     QIFrameSIMD qiFrame;
3087     GKEnergyQISIMD gkEnergyQI;
3088     private double xi, yi, zi;
3089     private double dedxi, dedyi, dedzi;
3090     private double dborni;
3091     private double trqxi, trqyi, trqzi;
3092     private int count;
3093     private int iSymm;
3094     private int threadID;
3095     private final double[][] transOp;
3096     private double gkEnergy;
3097     private double gkPermanentEnergy;
3098     private double gkPolarizationEnergy;
3099 
3100     GKEnergyLoopQISIMD() {
3101       mI = new PolarizableMultipoleSIMD();
3102       mK = new PolarizableMultipoleSIMD();
3103       qiFrame = new QIFrameSIMD();
3104       dx_local = new double[3];
3105       transOp = new double[3][3];
3106 
3107       logger.info("GK QI SIMD length: " + simdN);
3108     }
3109 
3110     @Override
3111     public void start() {
3112       gkEnergy = 0.0;
3113       gkPermanentEnergy = 0.0;
3114       gkPolarizationEnergy = 0.0;
3115       count = 0;
3116       threadID = getThreadIndex();
3117       gkEnergyQI = new GKEnergyQISIMD(soluteDielectric, solventDielectric, gkc, gradient);
3118     }
3119 
3120     @Override
3121     public void finish() {
3122       sharedInteractions.addAndGet(count);
3123       sharedGKEnergy.addAndGet(gkEnergy);
3124       sharedPermanentGKEnergy.addAndGet(gkPermanentEnergy);
3125       sharedPolarizationGKEnergy.addAndGet(gkPolarizationEnergy);
3126     }
3127 
3128     @Override
3129     public void run(int lb, int ub) {
3130 
3131       double[] x = sXYZ[0][0];
3132       double[] y = sXYZ[0][1];
3133       double[] z = sXYZ[0][2];
3134 
3135       int nSymm = crystal.spaceGroup.symOps.size();
3136       List<SymOp> symOps = crystal.spaceGroup.symOps;
3137 
3138       for (iSymm = 0; iSymm < nSymm; iSymm++) {
3139         SymOp symOp = symOps.get(iSymm);
3140         crystal.getTransformationOperator(symOp, transOp);
3141         for (int i = lb; i <= ub; i++) {
3142           if (!use[i]) {
3143             continue;
3144           }
3145 
3146           // Zero out force accumulation for atom i.
3147           dedxi = 0.0;
3148           dedyi = 0.0;
3149           dedzi = 0.0;
3150           trqxi = 0.0;
3151           trqyi = 0.0;
3152           trqzi = 0.0;
3153           dborni = 0.0;
3154 
3155           // Collect the coordinates of atom i.
3156           xi = x[i];
3157           yi = y[i];
3158           zi = z[i];
3159 
3160           // Load the Born radius and multipole moments for site I.
3161           rbiVec = broadcast(SPECIES_PREFERRED, born[i]);
3162           for (int m = 0; m < 10; m++) {
3163             fill(mpoleI[m], globalMultipole[0][i][m]);
3164           }
3165           for (int m = 0; m < 3; m++) {
3166             fill(indI[m], inducedDipole[0][i][m]);
3167             fill(indICR[m], inducedDipoleCR[0][i][m]);
3168           }
3169 
3170           int[] list = neighborLists[iSymm][i];
3171           int n = list.length;
3172           int slot = 0;
3173 
3174           for (int k : list) {
3175             // Load the interaction data for SIMD processing.
3176             if (load(k, slot)) {
3177               slot++;
3178             }
3179             if (slot == simdN) {
3180               interactions();
3181               slot = 0;
3182             } else if (k == n - 1) {
3183               // Clear the remaining slots.
3184               clearAtomData(slot);
3185               // Process interactions.
3186               interactions();
3187               slot = 0;
3188             }
3189           }
3190 
3191           if (iSymm == 0) {
3192             // Include self-interactions for the asymmetric unit atoms.
3193             // interaction(i, i);
3194 
3195             /*
3196              Formula for Born energy approximation for cavitation energy is:
3197              e = surfaceTension / 6 * (ri + probe)^2 * (ri/rb)^6.
3198              ri is the base atomic radius the atom.
3199              rb is Born radius of the atom.
3200             */
3201             switch (nonPolarModel) {
3202               case BORN_SOLV:
3203               case BORN_CAV_DISP:
3204                 double r = baseRadius[i] + dOffset + probe;
3205                 double ratio = (baseRadius[i] + dOffset) / born[i];
3206                 ratio *= ratio;
3207                 ratio *= (ratio * ratio);
3208                 double saTerm = surfaceTension * r * r * ratio / 6.0;
3209                 gkEnergy += saTerm;
3210                 sharedBornGrad.sub(threadID, i, 6.0 * saTerm / born[i]);
3211                 break;
3212               default:
3213                 break;
3214             }
3215           }
3216           if (gradient) {
3217             grad.add(threadID, i, dedxi, dedyi, dedzi);
3218             torque.add(threadID, i, trqxi, trqyi, trqzi);
3219             sharedBornGrad.add(threadID, i, dborni);
3220           }
3221         }
3222       }
3223     }
3224 
3225     /**
3226      * Clear interaction data.
3227      */
3228     private void clearAtomData(int slot) {
3229       fill(r2, slot, simdN, 2.0);
3230       fill(dx, slot, simdN, 0.0);
3231       fill(dy, slot, simdN, 0.0);
3232       fill(dz, slot, simdN, 2.0);
3233       for (int m = 0; m < 10; m++) {
3234         fill(mpoleK[m], slot, simdN, 0.0);
3235       }
3236       for (int m = 0; m < 3; m++) {
3237         fill(indK[m], slot, simdN, 0.0);
3238         fill(indKCR[m], slot, simdN, 0.0);
3239       }
3240       fill(bornK, slot, simdN, 2.0);
3241     }
3242 
3243     /**
3244      * Load an interaction into an array.
3245      *
3246      * @param k    the index of the atom to load.
3247      * @param slot the slot to load the atom into.
3248      * @return true if the atom was loaded, false if the atom was not loaded.
3249      */
3250     private boolean load(int k, int slot) {
3251       if (!use[k]) {
3252         return false;
3253       }
3254       dx_local[0] = sXYZ[iSymm][0][k] - xi;
3255       dx_local[1] = sXYZ[iSymm][1][k] - yi;
3256       dx_local[2] = sXYZ[iSymm][2][k] - zi;
3257       double rSquared = crystal.image(dx_local);
3258       if (rSquared > cut2) {
3259         return false;
3260       }
3261       // Load the separation vector.
3262       r2[slot] = rSquared;
3263       dx[slot] = dx_local[0];
3264       dy[slot] = dx_local[1];
3265       dz[slot] = dx_local[2];
3266       // Load the permanent multipole.
3267       for (int m = 0; m < 10; m++) {
3268         mpoleK[m][slot] = globalMultipole[iSymm][k][m];
3269       }
3270       // Load the induced dipole.
3271       for (int m = 0; m < 3; m++) {
3272         indK[m][slot] = inducedDipole[iSymm][k][m];
3273         indKCR[m][slot] = inducedDipoleCR[iSymm][k][m];
3274       }
3275       bornK[slot] = born[k];
3276       return true;
3277     }
3278 
3279     private void interactions() {
3280       DoubleVector r2Vec = fromArray(SPECIES_PREFERRED, r2, 0);
3281       dxVec[0] = fromArray(SPECIES_PREFERRED, dx, 0);
3282       dxVec[1] = fromArray(SPECIES_PREFERRED, dy, 0);
3283       dxVec[2] = fromArray(SPECIES_PREFERRED, dz, 0);
3284       DoubleVector rbkVec = fromArray(SPECIES_PREFERRED, bornK, 0);
3285 
3286       // Set the multipole moments for site I.
3287       mI.set(mpoleI, indI, indICR);
3288       mK.set(mpoleK, indK, indKCR);
3289       // Set and rotate into the QI frame.
3290       qiFrame.setAndRotate(dxVec, mI, mK);
3291       // Set the GK energy tensor.
3292       gkEnergyQI.initPotential(dxVec, r2Vec, rbiVec, rbkVec);
3293 
3294       // Compute the GK permanent multipole interaction.
3295       double eik;
3296       // if (!gradient) {
3297       // Compute the GK permanent interaction energy.
3298       eik = electric * gkEnergyQI.multipoleEnergy(mI, mK).reduceLanes(ADD);
3299       gkPermanentEnergy += eik;
3300       if (polarization != Polarization.NONE) {
3301         // Compute the GK polarization interaction energy.
3302         double ep = electric * gkEnergyQI.polarizationEnergy(mI, mK).reduceLanes(ADD);
3303         gkPolarizationEnergy += ep;
3304         eik += ep;
3305       }
3306         /*
3307       } else {
3308 
3309           // Sum the GK permanent interaction energy.
3310           eik = electric * gkEnergyQI.multipoleEnergyAndGradient(mI, mK, gradI, torqueI, torqueK);
3311           gkPermanentEnergy += eik;
3312           if (polarization != Polarization.NONE) {
3313             double mutualMask = 1.0;
3314             if (polarization == Polarization.DIRECT) {
3315               mutualMask = 0.0;
3316             }
3317             // Sum the GK polarization interaction energy.
3318             double ep =
3319                 electric * gkEnergyQI.polarizationEnergyAndGradient(mI, mK, mutualMask, gI, tI, tK);
3320             eik += ep;
3321             gkPolarizationEnergy += ep;
3322             for (int j = 0; j < 3; j++) {
3323               gradI[j] += gI[j];
3324               torqueI[j] += tI[j];
3325               torqueK[j] += tK[j];
3326             }
3327           }
3328 
3329           // Convert to units of kcal/mol
3330           for (int j = 0; j < 3; j++) {
3331             gradI[j] *= electric;
3332             torqueI[j] *= electric;
3333             torqueK[j] *= electric;
3334           }
3335 
3336           // Rotate gradient and torques from the QI frame into the Global frame.
3337           qiFrame.toGlobal(gradI);
3338           qiFrame.toGlobal(torqueI);
3339           qiFrame.toGlobal(torqueK);
3340 
3341           // Accumulate partial derivatives on site I.
3342           dedxi += gradI[0];
3343           dedyi += gradI[1];
3344           dedzi += gradI[2];
3345           trqxi += torqueI[0];
3346           trqyi += torqueI[1];
3347           trqzi += torqueI[2];
3348 
3349           // Accumulate partial derivatives on site K.
3350           double dedx = -gradI[0];
3351           double dedy = -gradI[1];
3352           double dedz = -gradI[2];
3353           // Handle symmetry mate rotation.
3354           final double dedxk = dedx * transOp[0][0] + dedy * transOp[1][0] + dedz * transOp[2][0];
3355           final double dedyk = dedx * transOp[0][1] + dedy * transOp[1][1] + dedz * transOp[2][1];
3356           final double dedzk = dedx * transOp[0][2] + dedy * transOp[1][2] + dedz * transOp[2][2];
3357           double tkx = torqueK[0];
3358           double tky = torqueK[1];
3359           double tkz = torqueK[2];
3360           final double rtkx = tkx * transOp[0][0] + tky * transOp[1][0] + tkz * transOp[2][0];
3361           final double rtky = tkx * transOp[0][1] + tky * transOp[1][1] + tkz * transOp[2][1];
3362           final double rtkz = tkx * transOp[0][2] + tky * transOp[1][2] + tkz * transOp[2][2];
3363           grad.add(threadID, k, dedxk, dedyk, dedzk);
3364           torque.add(threadID, k, rtkx, rtky, rtkz);
3365 
3366           // Compute the Born-chain rule term.
3367           gkEnergyQI.initBorn(dx_local, r2, rbi, rbk);
3368           double db = gkEnergyQI.multipoleEnergyBornGrad(mI, mK);
3369           if (polarization != Polarization.NONE) {
3370             db += gkEnergyQI.polarizationEnergyBornGrad(mI, mK, polarization == Polarization.MUTUAL);
3371           }
3372           db *= electric;
3373           dborni += rbk * db;
3374           sharedBornGrad.add(threadID, k, rbi * db);
3375 
3376       } */
3377 
3378       gkEnergy += eik;
3379       count++;
3380     }
3381   }
3382 }