1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.potential.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
87
88
89
90
91 public class GKEnergyRegion extends ParallelRegion {
92
93 private static final Logger logger = Logger.getLogger(GKEnergyRegion.class.getName());
94
95
96
97 protected static final double oneThird = 1.0 / 3.0;
98
99
100
101 protected final double electric;
102
103
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
113
114
115
116
117 protected final double dOffset = 0.09;
118
119
120
121 protected final double surfaceTension;
122
123
124
125 protected final double gkc;
126
127
128
129 private final double fc;
130
131
132
133 private final double fd;
134
135
136
137 private final double fq;
138
139
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
149
150 private Atom[] atoms;
151
152
153
154 private double[][][] inducedDipole;
155
156
157
158 private double[][][] inducedDipoleCR;
159
160
161
162 private double[][][] globalMultipole;
163
164
165
166 private Crystal crystal;
167
168
169
170 private double[][][] sXYZ;
171
172
173
174 private int[][][] neighborLists;
175
176
177
178 private boolean[] use = null;
179
180
181
182 private double cut2;
183
184
185
186 private double[] baseRadius;
187
188
189
190 private double[] born;
191
192 private boolean gradient = false;
193
194
195
196 private AtomicDoubleArray3D grad;
197
198
199
200 private AtomicDoubleArray3D torque;
201
202
203
204 private AtomicDoubleArray sharedBornGrad;
205
206
207
208 private AtomicDoubleArray selfEnergy;
209
210
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
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
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
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
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
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
361
362
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
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
481 interaction(i, i);
482
483
484
485
486
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
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
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
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
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
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
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
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
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
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
655 energyTensors();
656
657
658 double eik = energy(i, k);
659 gkEnergy += eik;
660 count++;
661
662
663
664
665
666
667
668
669
670
671 if (gradient) {
672
673 gradientTensors();
674
675
676 permanentEnergyGradient(i, k);
677
678 if (polarization != Polarization.NONE) {
679
680 polarizationEnergyGradient(i, k);
681 }
682 }
683 }
684
685 private void energyTensors() {
686
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
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
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
795
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
953
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
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
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
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
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
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
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
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
2273
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
2495
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
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
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
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
2760
2761
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
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
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
2857 interaction(i, i);
2858
2859
2860
2861
2862
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
2898 mI.setPermanentMultipole(globalMultipole[0][i]);
2899 mI.setInducedDipole(inducedDipole[0][i], inducedDipoleCR[0][i]);
2900
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
2912 double rbk = born[k];
2913 gkEnergyQI.initPotential(dx_local, r2, rbi, rbk);
2914
2915
2916 double eik;
2917 if (!gradient) {
2918
2919 eik = electric * selfScale * gkEnergyQI.multipoleEnergy(mI, mK);
2920 gkPermanentEnergy += eik;
2921 if (polarization != Polarization.NONE) {
2922
2923 double ep = electric * selfScale * gkEnergyQI.polarizationEnergy(mI, mK);
2924 gkPolarizationEnergy += ep;
2925 eik += ep;
2926 }
2927 } else {
2928 if (i == k) {
2929
2930 eik = electric * selfScale * gkEnergyQI.multipoleEnergy(mI, mK);
2931 gkPermanentEnergy += eik;
2932
2933 if (polarization != Polarization.NONE) {
2934
2935
2936
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
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
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
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
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
2987 for (int j = 0; j < 3; j++) {
2988 gradI[j] *= electric;
2989 torqueI[j] *= electric;
2990 torqueK[j] *= electric;
2991 }
2992
2993
2994 qiFrame.toGlobal(gradI);
2995 qiFrame.toGlobal(torqueI);
2996 qiFrame.toGlobal(torqueK);
2997
2998
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
3007 double dedx = -gradI[0];
3008 double dedy = -gradI[1];
3009 double dedz = -gradI[2];
3010
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
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
3050
3051
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
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
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
3154 xi = x[i];
3155 yi = y[i];
3156 zi = z[i];
3157
3158
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
3174 if (load(k, slot)) {
3175 slot++;
3176 }
3177 if (slot == simdN) {
3178 interactions();
3179 slot = 0;
3180 } else if (k == n - 1) {
3181
3182 clearAtomData(slot);
3183
3184 interactions();
3185 slot = 0;
3186 }
3187 }
3188
3189 if (iSymm == 0) {
3190
3191
3192
3193
3194
3195
3196
3197
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
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
3243
3244
3245
3246
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
3260 r2[slot] = rSquared;
3261 dx[slot] = dx_local[0];
3262 dy[slot] = dx_local[1];
3263 dz[slot] = dx_local[2];
3264
3265 for (int m = 0; m < 10; m++) {
3266 mpoleK[m][slot] = globalMultipole[iSymm][k][m];
3267 }
3268
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
3285 mI.set(mpoleI, indI, indICR);
3286 mK.set(mpoleK, indK, indKCR);
3287
3288 qiFrame.setAndRotate(dxVec, mI, mK);
3289
3290 gkEnergyQI.initPotential(dxVec, r2Vec, rbiVec, rbkVec);
3291
3292
3293 double eik;
3294
3295
3296 eik = electric * gkEnergyQI.multipoleEnergy(mI, mK).reduceLanes(ADD);
3297 gkPermanentEnergy += eik;
3298 if (polarization != Polarization.NONE) {
3299
3300 double ep = electric * gkEnergyQI.polarizationEnergy(mI, mK).reduceLanes(ADD);
3301 gkPolarizationEnergy += ep;
3302 eik += ep;
3303 }
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376 gkEnergy += eik;
3377 count++;
3378 }
3379 }
3380 }