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