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