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 public DoubleVector[] getSource() {
423 source(work);
424 return work;
425 }
426
427
428
429
430
431
432
433 protected final DoubleVector multipoleEnergy(PolarizableMultipoleSIMD m) {
434 DoubleVector total = m.q.mul(E000);
435 total = m.dx.fma(E100, total);
436 total = m.dy.fma(E010, total);
437 total = m.dz.fma(E001, total);
438 total = m.qxx.fma(E200, total);
439 total = m.qyy.fma(E020, total);
440 total = m.qzz.fma(E002, total);
441 total = m.qxy.fma(E110, total);
442 total = m.qxz.fma(E101, total);
443 total = m.qyz.fma(E011, total);
444 return total;
445 }
446
447 public DoubleVector multipoleEnergy(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK) {
448 multipoleIPotentialAtK(mI, 2);
449 return multipoleEnergy(mK);
450 }
451
452
453
454
455
456
457
458 protected final void multipoleGradient(PolarizableMultipoleSIMD m, DoubleVector[] g) {
459
460 DoubleVector total = m.q.mul(E100);
461 total = m.dx.fma(E200, total);
462 total = m.dy.fma(E110, total);
463 total = m.dz.fma(E101, total);
464 total = m.qxx.fma(E300, total);
465 total = m.qyy.fma(E120, total);
466 total = m.qzz.fma(E102, total);
467 total = m.qxy.fma(E210, total);
468 total = m.qxz.fma(E201, total);
469 total = m.qyz.fma(E111, total);
470 g[0] = total;
471
472
473 total = m.q.mul(E010);
474 total = m.dx.fma(E110, total);
475 total = m.dy.fma(E020, total);
476 total = m.dz.fma(E011, total);
477 total = m.qxx.fma(E210, total);
478 total = m.qyy.fma(E030, total);
479 total = m.qzz.fma(E012, total);
480 total = m.qxy.fma(E120, total);
481 total = m.qxz.fma(E111, total);
482 total = m.qyz.fma(E021, total);
483 g[1] = total;
484
485
486 total = m.q.mul(E001);
487 total = m.dx.fma(E101, total);
488 total = m.dy.fma(E011, total);
489 total = m.dz.fma(E002, total);
490 total = m.qxx.fma(E201, total);
491 total = m.qyy.fma(E021, total);
492 total = m.qzz.fma(E003, total);
493 total = m.qxy.fma(E111, total);
494 total = m.qxz.fma(E102, total);
495 total = m.qyz.fma(E012, total);
496 g[2] = total;
497 }
498
499
500
501
502
503
504
505 protected final void multipoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
506
507 DoubleVector dx = m.dy.mul(E001).sub(m.dz.mul(E010));
508 DoubleVector dy = m.dz.mul(E100).sub(m.dx.mul(E001));
509 DoubleVector dz = m.dx.mul(E010).sub(m.dy.mul(E100));
510
511
512 DoubleVector qx = m.qxy.mul(E101).add(m.qyy.mul(E011).mul(2.0)).add(m.qyz.mul(E002))
513 .sub(m.qxz.mul(E110).add(m.qyz.mul(E020)).add(m.qzz.mul(E011).mul(2.0)));
514 DoubleVector qy = m.qxz.mul(E200).add(m.qyz.mul(E110)).add(m.qzz.mul(E101).mul(2.0))
515 .sub(m.qxx.mul(E101).mul(2.0).add(m.qxy.mul(E011)).add(m.qxz.mul(E002)));
516 DoubleVector qz = m.qxx.mul(E110).mul(2.0).add(m.qxy.mul(E020)).add(m.qxz.mul(E011))
517 .sub(m.qxy.mul(E200).add(m.qyy.mul(E110).mul(2.0)).add(m.qyz.mul(E101)));
518
519
520 torque[0] = torque[0].sub(dx.add(qx));
521 torque[1] = torque[1].sub(dy.add(qy));
522 torque[2] = torque[2].sub(dz.add(qz));
523 }
524
525
526
527
528
529
530
531 protected final void dipoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
532
533 DoubleVector dx = m.dy.mul(E001).sub(m.dz.mul(E010));
534 DoubleVector dy = m.dz.mul(E100).sub(m.dx.mul(E001));
535 DoubleVector dz = m.dx.mul(E010).sub(m.dy.mul(E100));
536
537
538 torque[0] = torque[0].sub(dx);
539 torque[1] = torque[1].sub(dy);
540 torque[2] = torque[2].sub(dz);
541 }
542
543
544
545
546
547
548
549 protected final void quadrupoleTorque(PolarizableMultipoleSIMD m, DoubleVector[] torque) {
550
551 DoubleVector qx = m.qxy.mul(E101).add(m.qyy.mul(E011).mul(2.0)).add(m.qyz.mul(E002))
552 .sub(m.qxz.mul(E110).add(m.qyz.mul(E020)).add(m.qzz.mul(E011).mul(2.0)));
553 DoubleVector qy = m.qxz.mul(E200).add(m.qyz.mul(E110)).add(m.qzz.mul(E101).mul(2.0))
554 .sub(m.qxx.mul(E101).mul(2.0).add(m.qxy.mul(E011)).add(m.qxz.mul(E002)));
555 DoubleVector qz = m.qxx.mul(E110).mul(2.0).add(m.qxy.mul(E020)).add(m.qxz.mul(E011))
556 .sub(m.qxy.mul(E200).add(m.qyy.mul(E110).mul(2.0)).add(m.qyz.mul(E101)));
557
558
559 torque[0] = torque[0].sub(qx);
560 torque[1] = torque[1].sub(qy);
561 torque[2] = torque[2].sub(qz);
562 }
563
564
565
566
567
568
569
570 protected final DoubleVector polarizationEnergy(PolarizableMultipoleSIMD m) {
571
572
573 return (m.ux.mul(E100).add(m.uy.mul(E010)).add(m.uz.mul(E001))).mul(.5);
574 }
575
576
577
578
579
580
581
582 protected final DoubleVector polarizationEnergyS(PolarizableMultipoleSIMD m) {
583
584
585 return (m.sx.mul(E100).add(m.sy.mul(E010)).add(m.sz.mul(E001))).mul(.5);
586 }
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601 public DoubleVector polarizationEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
602 DoubleVector inductionMask, DoubleVector energyMask, DoubleVector mutualMask,
603 DoubleVector[] Gi, DoubleVector[] Ti, DoubleVector[] Tk) {
604
605
606 mI.applyMasks(inductionMask, energyMask);
607 mK.applyMasks(inductionMask, energyMask);
608
609
610 multipoleIPotentialAtK(mI, 2);
611
612
613 DoubleVector eK = polarizationEnergy(mK);
614
615 Gi[0] = mK.sx.mul(E200).add(mK.sy.mul(E110)).add(mK.sz.mul(E101)).neg();
616 Gi[1] = mK.sx.mul(E110).add(mK.sy.mul(E020)).add(mK.sz.mul(E011)).neg();
617 Gi[2] = mK.sx.mul(E101).add(mK.sy.mul(E011)).add(mK.sz.mul(E002)).neg();
618
619
620 multipoleKPotentialAtI(mK, 2);
621
622 DoubleVector eI = polarizationEnergy(mI);
623
624 Gi[0] = Gi[0].add(mI.sx.mul(E200).add(mI.sy.mul(E110)).add(mI.sz.mul(E101)));
625 Gi[1] = Gi[1].add(mI.sx.mul(E110).add(mI.sy.mul(E020)).add(mI.sz.mul(E011)));
626 Gi[2] = Gi[2].add(mI.sx.mul(E101).add(mI.sy.mul(E011)).add(mI.sz.mul(E002)));
627
628
629 DoubleVector energy = eI.add(eK).mul(energyMask);
630
631
632
633
634
635 dipoleIPotentialAtK(mI.ux, mI.uy, mI.uz, 2);
636 Gi[0] = Gi[0].sub(mK.px.mul(E200).add(mK.py.mul(E110)).add(mK.pz.mul(E101)).mul(0.5).mul(mutualMask));
637 Gi[1] = Gi[1].sub(mK.px.mul(E110).add(mK.py.mul(E020)).add(mK.pz.mul(E011)).mul(0.5).mul(mutualMask));
638 Gi[2] = Gi[2].sub(mK.px.mul(E101).add(mK.py.mul(E011)).add(mK.pz.mul(E002)).mul(0.5).mul(mutualMask));
639
640
641 dipoleKPotentialAtI(mK.ux, mK.uy, mK.uz, 2);
642 Gi[0] = Gi[0].add(mI.px.mul(E200).add(mI.py.mul(E110)).add(mI.pz.mul(E101)).mul(0.5).mul(mutualMask));
643 Gi[1] = Gi[1].add(mI.px.mul(E110).add(mI.py.mul(E020)).add(mI.pz.mul(E011)).mul(0.5).mul(mutualMask));
644 Gi[2] = Gi[2].add(mI.px.mul(E101).add(mI.py.mul(E011)).add(mI.pz.mul(E002)).mul(0.5).mul(mutualMask));
645
646
647 dipoleIPotentialAtK(mI.sx, mI.sy, mI.sz, 2);
648 multipoleTorque(mK, Tk);
649
650
651 dipoleKPotentialAtI(mK.sx, mK.sy, mK.sz, 2);
652 multipoleTorque(mI, Ti);
653
654 return energy;
655 }
656
657
658
659
660
661
662
663
664
665
666
667
668 public DoubleVector multipoleEnergyAndGradient(PolarizableMultipoleSIMD mI, PolarizableMultipoleSIMD mK,
669 DoubleVector[] Gi, DoubleVector[] Gk, DoubleVector[] Ti, DoubleVector[] Tk) {
670 multipoleIPotentialAtK(mI, 3);
671 DoubleVector energy = multipoleEnergy(mK);
672 multipoleGradient(mK, Gk);
673 Gi[0] = Gi[0].sub(Gk[0]);
674 Gi[1] = Gi[1].sub(Gk[1]);
675 Gi[2] = Gi[2].sub(Gk[2]);
676
677
678 multipoleTorque(mK, Tk);
679 multipoleKPotentialAtI(mK, 2);
680 multipoleTorque(mI, Ti);
681
682
683
684
685
686
687
688 return energy;
689 }
690
691
692
693
694
695
696 protected abstract void source(DoubleVector[] T000);
697
698
699
700
701 protected abstract void order1();
702
703
704
705
706 protected abstract void order2();
707
708
709
710
711 protected abstract void order3();
712
713
714
715
716 protected abstract void order4();
717
718
719
720
721
722
723 protected abstract void order5();
724
725
726
727
728
729
730 protected abstract void order6();
731
732 @SuppressWarnings("fallthrough")
733 protected abstract void multipoleIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
734
735 @SuppressWarnings("fallthrough")
736 protected abstract void multipoleKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
737
738
739
740
741
742
743
744 protected abstract void chargeKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
745
746
747
748
749
750
751
752
753
754 protected abstract void dipoleKPotentialAtI(DoubleVector uxk, DoubleVector uyk, DoubleVector uzk, int order);
755
756
757
758
759
760
761
762 protected abstract void quadrupoleKPotentialAtI(PolarizableMultipoleSIMD mK, int order);
763
764
765
766
767
768
769
770 protected abstract void chargeIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
771
772
773
774
775
776
777
778
779
780 protected abstract void dipoleIPotentialAtK(DoubleVector uxi, DoubleVector uyi, DoubleVector uzi, int order);
781
782
783
784
785
786
787
788 protected abstract void quadrupoleIPotentialAtK(PolarizableMultipoleSIMD mI, int order);
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815 protected final int ti(int dx, int dy, int dz) {
816 return MultipoleUtilities.ti(dx, dy, dz, order);
817 }
818
819
820
821
822
823 protected final int t000;
824
825
826
827
828 protected final int t100;
829
830
831
832 protected final int t010;
833
834
835
836 protected final int t001;
837
838
839
840
841 protected final int t200;
842
843
844
845 protected final int t020;
846
847
848
849 protected final int t002;
850
851
852
853 protected final int t110;
854
855
856
857 protected final int t101;
858
859
860
861 protected final int t011;
862
863
864
865
866 protected final int t300;
867
868
869
870 protected final int t030;
871
872
873
874 protected final int t003;
875
876
877
878 protected final int t210;
879
880
881
882 protected final int t201;
883
884
885
886 protected final int t120;
887
888
889
890 protected final int t021;
891
892
893
894 protected final int t102;
895
896
897
898 protected final int t012;
899
900
901
902 protected final int t111;
903
904
905
906
907 protected final int t400;
908
909
910
911 protected final int t040;
912
913
914
915 protected final int t004;
916
917
918
919 protected final int t310;
920
921
922
923 protected final int t301;
924
925
926
927 protected final int t130;
928
929
930
931 protected final int t031;
932
933
934
935 protected final int t103;
936
937
938
939 protected final int t013;
940
941
942
943 protected final int t220;
944
945
946
947 protected final int t202;
948
949
950
951 protected final int t022;
952
953
954
955 protected final int t211;
956
957
958
959 protected final int t121;
960
961
962
963 protected final int t112;
964
965
966
967
968
969 protected final int t500;
970
971
972
973 protected final int t050;
974
975
976
977 protected final int t005;
978
979
980
981 protected final int t410;
982
983
984
985 protected final int t401;
986
987
988
989 protected final int t140;
990
991
992
993 protected final int t041;
994
995
996
997 protected final int t104;
998
999
1000
1001 protected final int t014;
1002
1003
1004
1005 protected final int t320;
1006
1007
1008
1009 protected final int t302;
1010
1011
1012
1013 protected final int t230;
1014
1015
1016
1017 protected final int t032;
1018
1019
1020
1021 protected final int t203;
1022
1023
1024
1025 protected final int t023;
1026
1027
1028
1029 protected final int t311;
1030
1031
1032
1033 protected final int t131;
1034
1035
1036
1037 protected final int t113;
1038
1039
1040
1041 protected final int t221;
1042
1043
1044
1045 protected final int t212;
1046
1047
1048
1049 protected final int t122;
1050
1051
1052
1053
1054
1055 protected final int t600;
1056
1057
1058
1059 protected final int t060;
1060
1061
1062
1063 protected final int t006;
1064
1065
1066
1067 protected final int t510;
1068
1069
1070
1071 protected final int t501;
1072
1073
1074
1075 protected final int t150;
1076
1077
1078
1079 protected final int t051;
1080
1081
1082
1083 protected final int t105;
1084
1085
1086
1087 protected final int t015;
1088
1089
1090
1091 protected final int t420;
1092
1093
1094
1095 protected final int t402;
1096
1097
1098
1099 protected final int t240;
1100
1101
1102
1103 protected final int t042;
1104
1105
1106
1107 protected final int t204;
1108
1109
1110
1111 protected final int t024;
1112
1113
1114
1115 protected final int t411;
1116
1117
1118
1119 protected final int t141;
1120
1121
1122
1123 protected final int t114;
1124
1125
1126
1127 protected final int t330;
1128
1129
1130
1131 protected final int t303;
1132
1133
1134
1135 protected final int t033;
1136
1137
1138
1139 protected final int t321;
1140
1141
1142
1143 protected final int t231;
1144
1145
1146
1147 protected final int t213;
1148
1149
1150
1151 protected final int t312;
1152
1153
1154
1155 protected final int t132;
1156
1157
1158
1159 protected final int t123;
1160
1161
1162
1163 protected final int t222;
1164
1165 }