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.numerics.multipole;
39
40 import jdk.incubator.vector.DoubleVector;
41
42 import java.util.logging.Level;
43 import java.util.logging.Logger;
44
45 import static ffx.numerics.math.ScalarMath.doubleFactorial;
46 import static org.apache.commons.math3.util.FastMath.pow;
47
48
49
50
51
52
53
54
55
56
57
58
59 public abstract class MultipoleTensorSIMD {
60
61
62
63
64 private static final Logger logger = Logger.getLogger(MultipoleTensorSIMD.class.getName());
65
66
67
68
69 protected final int order;
70
71
72
73
74 protected final int o1;
75
76
77
78
79 protected final int il;
80
81
82
83
84 protected final int im;
85
86
87
88
89 protected final int in;
90
91
92
93
94 protected final int size;
95
96
97
98
99 protected Operator operator;
100
101
102
103
104 protected final double[] coulombSource;
105
106
107
108
109 protected final CoordinateSystem coordinates;
110
111
112
113
114 protected DoubleVector R;
115
116
117
118
119 protected DoubleVector r2;
120
121
122
123
124 protected DoubleVector x;
125
126
127
128
129 protected DoubleVector y;
130
131
132
133
134 protected DoubleVector z;
135
136
137
138
139 protected final DoubleVector[] work;
140
141
142 protected DoubleVector R000;
143
144 protected DoubleVector R100;
145 protected DoubleVector R010;
146 protected DoubleVector R001;
147
148 protected DoubleVector R200;
149 protected DoubleVector R020;
150 protected DoubleVector R002;
151 protected DoubleVector R110;
152 protected DoubleVector R101;
153 protected DoubleVector R011;
154
155 protected DoubleVector R300;
156 protected DoubleVector R030;
157 protected DoubleVector R003;
158 protected DoubleVector R210;
159 protected DoubleVector R201;
160 protected DoubleVector R120;
161 protected DoubleVector R021;
162 protected DoubleVector R102;
163 protected DoubleVector R012;
164 protected DoubleVector R111;
165
166 protected DoubleVector R400;
167 protected DoubleVector R040;
168 protected DoubleVector R004;
169 protected DoubleVector R310;
170 protected DoubleVector R301;
171 protected DoubleVector R130;
172 protected DoubleVector R031;
173 protected DoubleVector R103;
174 protected DoubleVector R013;
175 protected DoubleVector R220;
176 protected DoubleVector R202;
177 protected DoubleVector R022;
178 protected DoubleVector R211;
179 protected DoubleVector R121;
180 protected DoubleVector R112;
181
182 protected DoubleVector R500;
183 protected DoubleVector R050;
184 protected DoubleVector R005;
185 protected DoubleVector R410;
186 protected DoubleVector R401;
187 protected DoubleVector R140;
188 protected DoubleVector R041;
189 protected DoubleVector R104;
190 protected DoubleVector R014;
191 protected DoubleVector R320;
192 protected DoubleVector R302;
193 protected DoubleVector R230;
194 protected DoubleVector R032;
195 protected DoubleVector R203;
196 protected DoubleVector R023;
197 protected DoubleVector R311;
198 protected DoubleVector R131;
199 protected DoubleVector R113;
200 protected DoubleVector R221;
201 protected DoubleVector R212;
202 protected DoubleVector R122;
203
204 protected DoubleVector R006;
205 protected DoubleVector R402;
206 protected DoubleVector R042;
207 protected DoubleVector R204;
208 protected DoubleVector R024;
209 protected DoubleVector R222;
210 protected DoubleVector R600;
211 protected DoubleVector R060;
212 protected DoubleVector R510;
213 protected DoubleVector R501;
214 protected DoubleVector R150;
215 protected DoubleVector R051;
216 protected DoubleVector R105;
217 protected DoubleVector R015;
218 protected DoubleVector R420;
219 protected DoubleVector R240;
220 protected DoubleVector R411;
221 protected DoubleVector R141;
222 protected DoubleVector R114;
223 protected DoubleVector R330;
224 protected DoubleVector R303;
225 protected DoubleVector R033;
226 protected DoubleVector R321;
227 protected DoubleVector R231;
228 protected DoubleVector R213;
229 protected DoubleVector R312;
230 protected DoubleVector R132;
231 protected DoubleVector R123;
232
233
234 protected DoubleVector E000;
235
236 protected DoubleVector E100;
237 protected DoubleVector E010;
238 protected DoubleVector E001;
239
240 protected DoubleVector E200;
241 protected DoubleVector E020;
242 protected DoubleVector E002;
243 protected DoubleVector E110;
244 protected DoubleVector E101;
245 protected DoubleVector E011;
246
247 protected DoubleVector E300;
248 protected DoubleVector E030;
249 protected DoubleVector E003;
250 protected DoubleVector E210;
251 protected DoubleVector E201;
252 protected DoubleVector E120;
253 protected DoubleVector E021;
254 protected DoubleVector E102;
255 protected DoubleVector E012;
256 protected DoubleVector E111;
257
258
259
260
261
262
263
264 public MultipoleTensorSIMD(CoordinateSystem coordinates, int order) {
265 assert (order > 0);
266 o1 = order + 1;
267 il = o1;
268 im = il * o1;
269 in = im * o1;
270 size = (order + 1) * (order + 2) * (order + 3) / 6;
271
272 this.order = order;
273 this.coordinates = coordinates;
274 this.operator = Operator.COULOMB;
275
276
277 coulombSource = new double[o1];
278 for (short n = 0; n <= order; n++) {
279
280
281
282
283
284 coulombSource[n] = pow(-1, n) * doubleFactorial(2 * n - 1);
285 }
286
287 work = new DoubleVector[in * o1];
288
289
290 t000 = MultipoleUtilities.ti(0, 0, 0, order);
291
292 t100 = MultipoleUtilities.ti(1, 0, 0, order);
293 t010 = MultipoleUtilities.ti(0, 1, 0, order);
294 t001 = MultipoleUtilities.ti(0, 0, 1, order);
295
296 t200 = MultipoleUtilities.ti(2, 0, 0, order);
297 t020 = MultipoleUtilities.ti(0, 2, 0, order);
298 t002 = MultipoleUtilities.ti(0, 0, 2, order);
299 t110 = MultipoleUtilities.ti(1, 1, 0, order);
300 t101 = MultipoleUtilities.ti(1, 0, 1, order);
301 t011 = MultipoleUtilities.ti(0, 1, 1, order);
302
303 t300 = MultipoleUtilities.ti(3, 0, 0, order);
304 t030 = MultipoleUtilities.ti(0, 3, 0, order);
305 t003 = MultipoleUtilities.ti(0, 0, 3, order);
306 t210 = MultipoleUtilities.ti(2, 1, 0, order);
307 t201 = MultipoleUtilities.ti(2, 0, 1, order);
308 t120 = MultipoleUtilities.ti(1, 2, 0, order);
309 t021 = MultipoleUtilities.ti(0, 2, 1, order);
310 t102 = MultipoleUtilities.ti(1, 0, 2, order);
311 t012 = MultipoleUtilities.ti(0, 1, 2, order);
312 t111 = MultipoleUtilities.ti(1, 1, 1, order);
313
314 t400 = MultipoleUtilities.ti(4, 0, 0, order);
315 t040 = MultipoleUtilities.ti(0, 4, 0, order);
316 t004 = MultipoleUtilities.ti(0, 0, 4, order);
317 t310 = MultipoleUtilities.ti(3, 1, 0, order);
318 t301 = MultipoleUtilities.ti(3, 0, 1, order);
319 t130 = MultipoleUtilities.ti(1, 3, 0, order);
320 t031 = MultipoleUtilities.ti(0, 3, 1, order);
321 t103 = MultipoleUtilities.ti(1, 0, 3, order);
322 t013 = MultipoleUtilities.ti(0, 1, 3, order);
323 t220 = MultipoleUtilities.ti(2, 2, 0, order);
324 t202 = MultipoleUtilities.ti(2, 0, 2, order);
325 t022 = MultipoleUtilities.ti(0, 2, 2, order);
326 t211 = MultipoleUtilities.ti(2, 1, 1, order);
327 t121 = MultipoleUtilities.ti(1, 2, 1, order);
328 t112 = MultipoleUtilities.ti(1, 1, 2, order);
329
330 t500 = MultipoleUtilities.ti(5, 0, 0, order);
331 t050 = MultipoleUtilities.ti(0, 5, 0, order);
332 t005 = MultipoleUtilities.ti(0, 0, 5, order);
333 t410 = MultipoleUtilities.ti(4, 1, 0, order);
334 t401 = MultipoleUtilities.ti(4, 0, 1, order);
335 t140 = MultipoleUtilities.ti(1, 4, 0, order);
336 t041 = MultipoleUtilities.ti(0, 4, 1, order);
337 t104 = MultipoleUtilities.ti(1, 0, 4, order);
338 t014 = MultipoleUtilities.ti(0, 1, 4, order);
339 t320 = MultipoleUtilities.ti(3, 2, 0, order);
340 t302 = MultipoleUtilities.ti(3, 0, 2, order);
341 t230 = MultipoleUtilities.ti(2, 3, 0, order);
342 t032 = MultipoleUtilities.ti(0, 3, 2, order);
343 t203 = MultipoleUtilities.ti(2, 0, 3, order);
344 t023 = MultipoleUtilities.ti(0, 2, 3, order);
345 t311 = MultipoleUtilities.ti(3, 1, 1, order);
346 t131 = MultipoleUtilities.ti(1, 3, 1, order);
347 t113 = MultipoleUtilities.ti(1, 1, 3, order);
348 t221 = MultipoleUtilities.ti(2, 2, 1, order);
349 t212 = MultipoleUtilities.ti(2, 1, 2, order);
350 t122 = MultipoleUtilities.ti(1, 2, 2, order);
351
352 t600 = MultipoleUtilities.ti(6, 0, 0, order);
353 t060 = MultipoleUtilities.ti(0, 6, 0, order);
354 t006 = MultipoleUtilities.ti(0, 0, 6, order);
355 t510 = MultipoleUtilities.ti(5, 1, 0, order);
356 t501 = MultipoleUtilities.ti(5, 0, 1, order);
357 t150 = MultipoleUtilities.ti(1, 5, 0, order);
358 t051 = MultipoleUtilities.ti(0, 5, 1, order);
359 t105 = MultipoleUtilities.ti(1, 0, 5, order);
360 t015 = MultipoleUtilities.ti(0, 1, 5, order);
361 t420 = MultipoleUtilities.ti(4, 2, 0, order);
362 t402 = MultipoleUtilities.ti(4, 0, 2, order);
363 t240 = MultipoleUtilities.ti(2, 4, 0, order);
364 t042 = MultipoleUtilities.ti(0, 4, 2, order);
365 t204 = MultipoleUtilities.ti(2, 0, 4, order);
366 t024 = MultipoleUtilities.ti(0, 2, 4, order);
367 t411 = MultipoleUtilities.ti(4, 1, 1, order);
368 t141 = MultipoleUtilities.ti(1, 4, 1, order);
369 t114 = MultipoleUtilities.ti(1, 1, 4, order);
370 t330 = MultipoleUtilities.ti(3, 3, 0, order);
371 t303 = MultipoleUtilities.ti(3, 0, 3, order);
372 t033 = MultipoleUtilities.ti(0, 3, 3, order);
373 t321 = MultipoleUtilities.ti(3, 2, 1, order);
374 t231 = MultipoleUtilities.ti(2, 3, 1, order);
375 t213 = MultipoleUtilities.ti(2, 1, 3, order);
376 t312 = MultipoleUtilities.ti(3, 1, 2, order);
377 t132 = MultipoleUtilities.ti(1, 3, 2, order);
378 t123 = MultipoleUtilities.ti(1, 2, 3, order);
379 t222 = MultipoleUtilities.ti(2, 2, 2, order);
380 }
381
382
383
384
385
386
387 public final void setR(DoubleVector[] r) {
388 setR(r[0], r[1], r[2]);
389 }
390
391
392
393
394
395
396
397
398 public abstract void setR(DoubleVector dx, DoubleVector dy, DoubleVector dz);
399
400
401
402
403 public void generateTensor() {
404 switch (order) {
405 case 1 -> order1();
406 case 2 -> order2();
407 case 3 -> order3();
408 case 4 -> order4();
409 case 5 -> order5();
410 case 6 -> order6();
411 default -> {
412 if (logger.isLoggable(Level.WARNING)) {
413 logger.severe("Order " + order + " not supported.");
414 }
415 }
416 }
417 }
418
419
420
421
422
423
424 public DoubleVector[] getSource() {
425 source(work);
426 return work;
427 }
428
429
430
431
432
433
434
435 protected final DoubleVector multipoleEnergy(PolarizableMultipoleSIMD m) {
436 DoubleVector total = m.q.mul(E000);
437 total = m.dx.fma(E100, total);
438 total = m.dy.fma(E010, total);
439 total = m.dz.fma(E001, total);
440 total = m.qxx.fma(E200, total);
441 total = m.qyy.fma(E020, total);
442 total = m.qzz.fma(E002, total);
443 total = m.qxy.fma(E110, total);
444 total = m.qxz.fma(E101, total);
445 total = m.qyz.fma(E011, total);
446 return total;
447 }
448
449
450
451
452
453
454
455
456 public DoubleVector multipoleEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
457 multipoleIPotentialAtK(mI, 2);
458 return multipoleEnergy(mK);
459 }
460
461
462
463
464
465
466
467 protected final void multipoleGradient(PolarizableMultipoleSIMD m, DoubleVector[] g) {
468
469 DoubleVector total = m.q.mul(E100);
470 total = m.dx.fma(E200, total);
471 total = m.dy.fma(E110, total);
472 total = m.dz.fma(E101, total);
473 total = m.qxx.fma(E300, total);
474 total = m.qyy.fma(E120, total);
475 total = m.qzz.fma(E102, total);
476 total = m.qxy.fma(E210, total);
477 total = m.qxz.fma(E201, total);
478 total = m.qyz.fma(E111, total);
479 g[0] = total;
480
481
482 total = m.q.mul(E010);
483 total = m.dx.fma(E110, total);
484 total = m.dy.fma(E020, total);
485 total = m.dz.fma(E011, total);
486 total = m.qxx.fma(E210, total);
487 total = m.qyy.fma(E030, total);
488 total = m.qzz.fma(E012, total);
489 total = m.qxy.fma(E120, total);
490 total = m.qxz.fma(E111, total);
491 total = m.qyz.fma(E021, total);
492 g[1] = total;
493
494
495 total = m.q.mul(E001);
496 total = m.dx.fma(E101, total);
497 total = m.dy.fma(E011, total);
498 total = m.dz.fma(E002, total);
499 total = m.qxx.fma(E201, total);
500 total = m.qyy.fma(E021, total);
501 total = m.qzz.fma(E003, total);
502 total = m.qxy.fma(E111, total);
503 total = m.qxz.fma(E102, total);
504 total = m.qyz.fma(E012, total);
505 g[2] = total;
506 }
507
508
509
510
511
512
513
514 protected final void multipoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
515
516 DoubleVector dx = m.dy.mul(E001).sub(m.dz.mul(E010));
517 DoubleVector dy = m.dz.mul(E100).sub(m.dx.mul(E001));
518 DoubleVector dz = m.dx.mul(E010).sub(m.dy.mul(E100));
519
520
521 DoubleVector qx = m.qxy.mul(E101).add(m.qyy.mul(E011).mul(2.0)).add(m.qyz.mul(E002))
522 .sub(m.qxz.mul(E110).add(m.qyz.mul(E020)).add(m.qzz.mul(E011).mul(2.0)));
523 DoubleVector qy = m.qxz.mul(E200).add(m.qyz.mul(E110)).add(m.qzz.mul(E101).mul(2.0))
524 .sub(m.qxx.mul(E101).mul(2.0).add(m.qxy.mul(E011)).add(m.qxz.mul(E002)));
525 DoubleVector qz = m.qxx.mul(E110).mul(2.0).add(m.qxy.mul(E020)).add(m.qxz.mul(E011))
526 .sub(m.qxy.mul(E200).add(m.qyy.mul(E110).mul(2.0)).add(m.qyz.mul(E101)));
527
528
529 torque[0] = torque[0].sub(dx.add(qx));
530 torque[1] = torque[1].sub(dy.add(qy));
531 torque[2] = torque[2].sub(dz.add(qz));
532 }
533
534
535
536
537
538
539
540 protected final void dipoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
541
542 DoubleVector dx = m.dy.mul(E001).sub(m.dz.mul(E010));
543 DoubleVector dy = m.dz.mul(E100).sub(m.dx.mul(E001));
544 DoubleVector dz = m.dx.mul(E010).sub(m.dy.mul(E100));
545
546
547 torque[0] = torque[0].sub(dx);
548 torque[1] = torque[1].sub(dy);
549 torque[2] = torque[2].sub(dz);
550 }
551
552
553
554
555
556
557
558 protected final void quadrupoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
559
560 DoubleVector qx = m.qxy.mul(E101).add(m.qyy.mul(E011).mul(2.0)).add(m.qyz.mul(E002))
561 .sub(m.qxz.mul(E110).add(m.qyz.mul(E020)).add(m.qzz.mul(E011).mul(2.0)));
562 DoubleVector qy = m.qxz.mul(E200).add(m.qyz.mul(E110)).add(m.qzz.mul(E101).mul(2.0))
563 .sub(m.qxx.mul(E101).mul(2.0).add(m.qxy.mul(E011)).add(m.qxz.mul(E002)));
564 DoubleVector qz = m.qxx.mul(E110).mul(2.0).add(m.qxy.mul(E020)).add(m.qxz.mul(E011))
565 .sub(m.qxy.mul(E200).add(m.qyy.mul(E110).mul(2.0)).add(m.qyz.mul(E101)));
566
567
568 torque[0] = torque[0].sub(qx);
569 torque[1] = torque[1].sub(qy);
570 torque[2] = torque[2].sub(qz);
571 }
572
573
574
575
576
577
578
579 protected final DoubleVector polarizationEnergy(PolarizableMultipoleSIMD m) {
580
581
582 return (m.ux.mul(E100).add(m.uy.mul(E010)).add(m.uz.mul(E001))).mul(.5);
583 }
584
585
586
587
588
589
590
591 protected final DoubleVector polarizationEnergyS(PolarizableMultipoleSIMD m) {
592
593
594 return (m.sx.mul(E100).add(m.sy.mul(E010)).add(m.sz.mul(E001))).mul(.5);
595 }
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610 public DoubleVector polarizationEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
611 DoubleVector inductionMask, DoubleVector energyMask, DoubleVector mutualMask,
612 DoubleVector[] Gi, DoubleVector[] Ti, DoubleVector[] Tk) {
613
614
615 mI.applyMasks(inductionMask, energyMask);
616 mK.applyMasks(inductionMask, energyMask);
617
618
619 multipoleIPotentialAtK(mI, 2);
620
621
622 DoubleVector eK = polarizationEnergy(mK);
623
624 Gi[0] = mK.sx.mul(E200).add(mK.sy.mul(E110)).add(mK.sz.mul(E101)).neg();
625 Gi[1] = mK.sx.mul(E110).add(mK.sy.mul(E020)).add(mK.sz.mul(E011)).neg();
626 Gi[2] = mK.sx.mul(E101).add(mK.sy.mul(E011)).add(mK.sz.mul(E002)).neg();
627
628
629 multipoleKPotentialAtI(mK, 2);
630
631 DoubleVector eI = polarizationEnergy(mI);
632
633 Gi[0] = Gi[0].add(mI.sx.mul(E200).add(mI.sy.mul(E110)).add(mI.sz.mul(E101)));
634 Gi[1] = Gi[1].add(mI.sx.mul(E110).add(mI.sy.mul(E020)).add(mI.sz.mul(E011)));
635 Gi[2] = Gi[2].add(mI.sx.mul(E101).add(mI.sy.mul(E011)).add(mI.sz.mul(E002)));
636
637
638 DoubleVector energy = eI.add(eK).mul(energyMask);
639
640
641
642
643
644 dipoleIPotentialAtK(mI.ux, mI.uy, mI.uz, 2);
645 Gi[0] = Gi[0].sub(mK.px.mul(E200).add(mK.py.mul(E110)).add(mK.pz.mul(E101)).mul(0.5).mul(mutualMask));
646 Gi[1] = Gi[1].sub(mK.px.mul(E110).add(mK.py.mul(E020)).add(mK.pz.mul(E011)).mul(0.5).mul(mutualMask));
647 Gi[2] = Gi[2].sub(mK.px.mul(E101).add(mK.py.mul(E011)).add(mK.pz.mul(E002)).mul(0.5).mul(mutualMask));
648
649
650 dipoleKPotentialAtI(mK.ux, mK.uy, mK.uz, 2);
651 Gi[0] = Gi[0].add(mI.px.mul(E200).add(mI.py.mul(E110)).add(mI.pz.mul(E101)).mul(0.5).mul(mutualMask));
652 Gi[1] = Gi[1].add(mI.px.mul(E110).add(mI.py.mul(E020)).add(mI.pz.mul(E011)).mul(0.5).mul(mutualMask));
653 Gi[2] = Gi[2].add(mI.px.mul(E101).add(mI.py.mul(E011)).add(mI.pz.mul(E002)).mul(0.5).mul(mutualMask));
654
655
656 dipoleIPotentialAtK(mI.sx, mI.sy, mI.sz, 2);
657 multipoleTorque(mK, Tk);
658
659
660 dipoleKPotentialAtI(mK.sx, mK.sy, mK.sz, 2);
661 multipoleTorque(mI, Ti);
662
663 return energy;
664 }
665
666
667
668
669
670
671
672
673
674
675
676
677 public DoubleVector multipoleEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
678 DoubleVector[] Gi, DoubleVector[] Gk, DoubleVector[] Ti, DoubleVector[] Tk) {
679 multipoleIPotentialAtK(mI, 3);
680 DoubleVector energy = multipoleEnergy(mK);
681 multipoleGradient(mK, Gk);
682 Gi[0] = Gi[0].sub(Gk[0]);
683 Gi[1] = Gi[1].sub(Gk[1]);
684 Gi[2] = Gi[2].sub(Gk[2]);
685
686
687 multipoleTorque(mK, Tk);
688 multipoleKPotentialAtI(mK, 2);
689 multipoleTorque(mI, Ti);
690
691
692
693
694
695
696
697 return energy;
698 }
699
700
701
702
703
704
705 protected abstract void source(DoubleVector[] T000);
706
707
708
709
710 protected abstract void order1();
711
712
713
714
715 protected abstract void order2();
716
717
718
719
720 protected abstract void order3();
721
722
723
724
725 protected abstract void order4();
726
727
728
729
730
731
732 protected abstract void order5();
733
734
735
736
737
738
739 protected abstract void order6();
740
741
742
743
744
745
746
747 @SuppressWarnings("fallthrough")
748 protected abstract void multipoleIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
749
750
751
752
753
754
755
756 @SuppressWarnings("fallthrough")
757 protected abstract void multipoleKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
758
759
760
761
762
763
764
765 protected abstract void chargeKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
766
767
768
769
770
771
772
773
774
775 protected abstract void dipoleKPotentialAtI(DoubleVector uxk, DoubleVector uyk, DoubleVector uzk, int order);
776
777
778
779
780
781
782
783 protected abstract void quadrupoleKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
784
785
786
787
788
789
790
791 protected abstract void chargeIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
792
793
794
795
796
797
798
799
800
801 protected abstract void dipoleIPotentialAtK(DoubleVector uxi, DoubleVector uyi, DoubleVector uzi, int order);
802
803
804
805
806
807
808
809 protected abstract void quadrupoleIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836 protected final int ti(int dx, int dy, int dz) {
837 return MultipoleUtilities.ti(dx, dy, dz, order);
838 }
839
840
841
842
843
844 protected final int t000;
845
846
847
848
849 protected final int t100;
850
851
852
853 protected final int t010;
854
855
856
857 protected final int t001;
858
859
860
861
862 protected final int t200;
863
864
865
866 protected final int t020;
867
868
869
870 protected final int t002;
871
872
873
874 protected final int t110;
875
876
877
878 protected final int t101;
879
880
881
882 protected final int t011;
883
884
885
886
887 protected final int t300;
888
889
890
891 protected final int t030;
892
893
894
895 protected final int t003;
896
897
898
899 protected final int t210;
900
901
902
903 protected final int t201;
904
905
906
907 protected final int t120;
908
909
910
911 protected final int t021;
912
913
914
915 protected final int t102;
916
917
918
919 protected final int t012;
920
921
922
923 protected final int t111;
924
925
926
927
928 protected final int t400;
929
930
931
932 protected final int t040;
933
934
935
936 protected final int t004;
937
938
939
940 protected final int t310;
941
942
943
944 protected final int t301;
945
946
947
948 protected final int t130;
949
950
951
952 protected final int t031;
953
954
955
956 protected final int t103;
957
958
959
960 protected final int t013;
961
962
963
964 protected final int t220;
965
966
967
968 protected final int t202;
969
970
971
972 protected final int t022;
973
974
975
976 protected final int t211;
977
978
979
980 protected final int t121;
981
982
983
984 protected final int t112;
985
986
987
988
989
990 protected final int t500;
991
992
993
994 protected final int t050;
995
996
997
998 protected final int t005;
999
1000
1001
1002 protected final int t410;
1003
1004
1005
1006 protected final int t401;
1007
1008
1009
1010 protected final int t140;
1011
1012
1013
1014 protected final int t041;
1015
1016
1017
1018 protected final int t104;
1019
1020
1021
1022 protected final int t014;
1023
1024
1025
1026 protected final int t320;
1027
1028
1029
1030 protected final int t302;
1031
1032
1033
1034 protected final int t230;
1035
1036
1037
1038 protected final int t032;
1039
1040
1041
1042 protected final int t203;
1043
1044
1045
1046 protected final int t023;
1047
1048
1049
1050 protected final int t311;
1051
1052
1053
1054 protected final int t131;
1055
1056
1057
1058 protected final int t113;
1059
1060
1061
1062 protected final int t221;
1063
1064
1065
1066 protected final int t212;
1067
1068
1069
1070 protected final int t122;
1071
1072
1073
1074
1075
1076 protected final int t600;
1077
1078
1079
1080 protected final int t060;
1081
1082
1083
1084 protected final int t006;
1085
1086
1087
1088 protected final int t510;
1089
1090
1091
1092 protected final int t501;
1093
1094
1095
1096 protected final int t150;
1097
1098
1099
1100 protected final int t051;
1101
1102
1103
1104 protected final int t105;
1105
1106
1107
1108 protected final int t015;
1109
1110
1111
1112 protected final int t420;
1113
1114
1115
1116 protected final int t402;
1117
1118
1119
1120 protected final int t240;
1121
1122
1123
1124 protected final int t042;
1125
1126
1127
1128 protected final int t204;
1129
1130
1131
1132 protected final int t024;
1133
1134
1135
1136 protected final int t411;
1137
1138
1139
1140 protected final int t141;
1141
1142
1143
1144 protected final int t114;
1145
1146
1147
1148 protected final int t330;
1149
1150
1151
1152 protected final int t303;
1153
1154
1155
1156 protected final int t033;
1157
1158
1159
1160 protected final int t321;
1161
1162
1163
1164 protected final int t231;
1165
1166
1167
1168 protected final int t213;
1169
1170
1171
1172 protected final int t312;
1173
1174
1175
1176 protected final int t132;
1177
1178
1179
1180 protected final int t123;
1181
1182
1183
1184 protected final int t222;
1185
1186 }