36 template<
class T, u32 low_order, u32 high_order>
40 const sycl::vec<T, 3> &r);
43 template<
class T, u32 low_order, u32 high_order>
45 const sycl::vec<T, 3> &r) {
56 class GreenFuncGravCartesian<T, 0, 5> {
59 const sycl::vec<T, 3> &r) {
66 T r1pow2 = r.x() * r.x();
67 T r2pow2 = r.y() * r.y();
68 T r3pow2 = r.z() * r.z();
70 T r1pow3 = r.x() * r1pow2;
71 T r2pow3 = r.y() * r2pow2;
72 T r3pow3 = r.z() * r3pow2;
74 T r1pow4 = r.x() * r1pow3;
75 T r2pow4 = r.y() * r2pow3;
76 T r3pow4 = r.z() * r3pow3;
78 T r1pow5 = r.x() * r1pow4;
79 T r2pow5 = r.y() * r2pow4;
80 T r3pow5 = r.z() * r3pow4;
82 T rsq = r1pow2 + r2pow2 + r3pow2;
84 T rnorm = sycl::sqrt(rsq);
96 15 * g3 * r1 + 10 * g4 * r1pow3 + g5 * r1pow5,
97 (3 * g3 + 6 * g4 * r1pow2 + g5 * r1pow4) * r2,
98 (3 * g3 + 6 * g4 * r1pow2 + g5 * r1pow4) * r3,
99 3 * g3 * r1 + g4 * r1pow3 + 3 * g4 * r1 * r2pow2 + g5 * r1pow3 * r2pow2,
100 (3 * g4 * r1 + g5 * r1pow3) * r2 * r3,
101 3 * g3 * r1 + g4 * r1pow3 + 3 * g4 * r1 * r3pow2 + g5 * r1pow3 * r3pow2,
102 3 * g3 * r2 + 3 * g4 * r1pow2 * r2 + g4 * r2pow3 + g5 * r1pow2 * r2pow3,
103 (g3 + g4 * r1pow2 + g4 * r2pow2 + g5 * r1pow2 * r2pow2) * r3,
104 r2 * (g3 + g4 * r1pow2 + g4 * r3pow2 + g5 * r1pow2 * r3pow2),
105 3 * g3 * r3 + 3 * g4 * r1pow2 * r3 + g4 * r3pow3 + g5 * r1pow2 * r3pow3,
106 r1 * (3 * g3 + 6 * g4 * r2pow2 + g5 * r2pow4),
107 r1 * (3 * g4 * r2 + g5 * r2pow3) * r3,
108 r1 * (g3 + g4 * r2pow2 + g4 * r3pow2 + g5 * r2pow2 * r3pow2),
109 r1 * r2 * (3 * g4 * r3 + g5 * r3pow3),
110 r1 * (3 * g3 + 6 * g4 * r3pow2 + g5 * r3pow4),
111 15 * g3 * r2 + 10 * g4 * r2pow3 + g5 * r2pow5,
112 (3 * g3 + 6 * g4 * r2pow2 + g5 * r2pow4) * r3,
113 3 * g3 * r2 + g4 * r2pow3 + 3 * g4 * r2 * r3pow2 + g5 * r2pow3 * r3pow2,
114 3 * g3 * r3 + 3 * g4 * r2pow2 * r3 + g4 * r3pow3 + g5 * r2pow2 * r3pow3,
115 r2 * (3 * g3 + 6 * g4 * r3pow2 + g5 * r3pow4),
116 15 * g3 * r3 + 10 * g4 * r3pow3 + g5 * r3pow5};
119 3 * g2 + 6 * g3 * r1pow2 + g4 * r1pow4,
120 3 * g3 * r1 * r2 + g4 * r1pow3 * r2,
121 3 * g3 * r1 * r3 + g4 * r1pow3 * r3,
122 g2 + g3 * r1pow2 + g3 * r2pow2 + g4 * r1pow2 * r2pow2,
123 (g3 + g4 * r1pow2) * r2 * r3,
124 g2 + g3 * r1pow2 + g3 * r3pow2 + g4 * r1pow2 * r3pow2,
125 3 * g3 * r1 * r2 + g4 * r1 * r2pow3,
126 r1 * (g3 + g4 * r2pow2) * r3,
127 r1 * r2 * (g3 + g4 * r3pow2),
128 3 * g3 * r1 * r3 + g4 * r1 * r3pow3,
129 3 * g2 + 6 * g3 * r2pow2 + g4 * r2pow4,
130 3 * g3 * r2 * r3 + g4 * r2pow3 * r3,
131 g2 + g3 * r2pow2 + g3 * r3pow2 + g4 * r2pow2 * r3pow2,
132 3 * g3 * r2 * r3 + g4 * r2 * r3pow3,
133 3 * g2 + 6 * g3 * r3pow2 + g4 * r3pow4};
136 3 * g2 * r1 + g3 * r1pow3,
137 g2 * r2 + g3 * r1pow2 * r2,
138 g2 * r3 + g3 * r1pow2 * r3,
139 g2 * r1 + g3 * r1 * r2pow2,
141 g2 * r1 + g3 * r1 * r3pow2,
142 3 * g2 * r2 + g3 * r2pow3,
143 g2 * r3 + g3 * r2pow2 * r3,
144 g2 * r2 + g3 * r2 * r3pow2,
145 3 * g2 * r3 + g3 * r3pow3};
164 class GreenFuncGravCartesian<T, 0, 4> {
167 const sycl::vec<T, 3> &r) {
173 T r1pow2 = r.x() * r.x();
174 T r2pow2 = r.y() * r.y();
175 T r3pow2 = r.z() * r.z();
177 T r1pow3 = r.x() * r1pow2;
178 T r2pow3 = r.y() * r2pow2;
179 T r3pow3 = r.z() * r3pow2;
181 T r1pow4 = r.x() * r1pow3;
182 T r2pow4 = r.y() * r2pow3;
183 T r3pow4 = r.z() * r3pow3;
185 T rsq = r1pow2 + r2pow2 + r3pow2;
187 T rnorm = sycl::sqrt(rsq);
192 T g1 = -1 * rm2 * g0;
193 T g2 = -3 * rm2 * g1;
194 T g3 = -5 * rm2 * g2;
195 T g4 = -7 * rm2 * g3;
198 3 * g2 + 6 * g3 * r1pow2 + g4 * r1pow4,
199 3 * g3 * r1 * r2 + g4 * r1pow3 * r2,
200 3 * g3 * r1 * r3 + g4 * r1pow3 * r3,
201 g2 + g3 * r1pow2 + g3 * r2pow2 + g4 * r1pow2 * r2pow2,
202 (g3 + g4 * r1pow2) * r2 * r3,
203 g2 + g3 * r1pow2 + g3 * r3pow2 + g4 * r1pow2 * r3pow2,
204 3 * g3 * r1 * r2 + g4 * r1 * r2pow3,
205 r1 * (g3 + g4 * r2pow2) * r3,
206 r1 * r2 * (g3 + g4 * r3pow2),
207 3 * g3 * r1 * r3 + g4 * r1 * r3pow3,
208 3 * g2 + 6 * g3 * r2pow2 + g4 * r2pow4,
209 3 * g3 * r2 * r3 + g4 * r2pow3 * r3,
210 g2 + g3 * r2pow2 + g3 * r3pow2 + g4 * r2pow2 * r3pow2,
211 3 * g3 * r2 * r3 + g4 * r2 * r3pow3,
212 3 * g2 + 6 * g3 * r3pow2 + g4 * r3pow4};
215 3 * g2 * r1 + g3 * r1pow3,
216 g2 * r2 + g3 * r1pow2 * r2,
217 g2 * r3 + g3 * r1pow2 * r3,
218 g2 * r1 + g3 * r1 * r2pow2,
220 g2 * r1 + g3 * r1 * r3pow2,
221 3 * g2 * r2 + g3 * r2pow3,
222 g2 * r3 + g3 * r2pow2 * r3,
223 g2 * r2 + g3 * r2 * r3pow2,
224 3 * g2 * r3 + g3 * r3pow3};
243 class GreenFuncGravCartesian<T, 0, 3> {
246 const sycl::vec<T, 3> &r) {
253 T r1pow2 = r.x() * r.x();
254 T r2pow2 = r.y() * r.y();
255 T r3pow2 = r.z() * r.z();
257 T r1pow3 = r.x() * r1pow2;
258 T r2pow3 = r.y() * r2pow2;
259 T r3pow3 = r.z() * r3pow2;
261 T rsq = r1pow2 + r2pow2 + r3pow2;
263 T rnorm = sycl::sqrt(rsq);
268 T g1 = -1 * rm2 * g0;
269 T g2 = -3 * rm2 * g1;
270 T g3 = -5 * rm2 * g2;
273 3 * g2 * r1 + g3 * r1pow3,
274 g2 * r2 + g3 * r1pow2 * r2,
275 g2 * r3 + g3 * r1pow2 * r3,
276 g2 * r1 + g3 * r1 * r2pow2,
278 g2 * r1 + g3 * r1 * r3pow2,
279 3 * g2 * r2 + g3 * r2pow3,
280 g2 * r3 + g3 * r2pow2 * r3,
281 g2 * r2 + g3 * r2 * r3pow2,
282 3 * g2 * r3 + g3 * r3pow3};
301 class GreenFuncGravCartesian<T, 0, 2> {
304 const sycl::vec<T, 3> &r) {
312 T r1pow2 = r.x() * r.x();
313 T r2pow2 = r.y() * r.y();
314 T r3pow2 = r.z() * r.z();
316 T r1pow3 = r.x() * r1pow2;
317 T r2pow3 = r.y() * r2pow2;
318 T r3pow3 = r.z() * r3pow2;
320 T rsq = r1pow2 + r2pow2 + r3pow2;
322 T rnorm = sycl::sqrt(rsq);
327 T g1 = -1 * rm2 * g0;
328 T g2 = -3 * rm2 * g1;
347 class GreenFuncGravCartesian<T, 0, 1> {
350 const sycl::vec<T, 3> &r) {
356 T r1pow2 = r.x() * r.x();
357 T r2pow2 = r.y() * r.y();
358 T r3pow2 = r.z() * r.z();
360 T r1pow3 = r.x() * r1pow2;
361 T r2pow3 = r.y() * r2pow2;
362 T r3pow3 = r.z() * r3pow2;
364 T rsq = r1pow2 + r2pow2 + r3pow2;
366 T rnorm = sycl::sqrt(rsq);
371 T g1 = -1 * rm2 * g0;
382 class GreenFuncGravCartesian<T, 0, 0> {
385 const sycl::vec<T, 3> &r) {
391 T r1pow2 = r.x() * r.x();
392 T r2pow2 = r.y() * r.y();
393 T r3pow2 = r.z() * r.z();
395 T r1pow3 = r.x() * r1pow2;
396 T r2pow3 = r.y() * r2pow2;
397 T r3pow3 = r.z() * r3pow2;
399 T rsq = r1pow2 + r2pow2 + r3pow2;
401 T rnorm = sycl::sqrt(rsq);
406 T g1 = -1 * rm2 * g0;
415 class GreenFuncGravCartesian<T, 1, 5> {
418 const sycl::vec<T, 3> &r) {
424 T r1pow2 = r.x() * r.x();
425 T r2pow2 = r.y() * r.y();
426 T r3pow2 = r.z() * r.z();
428 T r1pow3 = r.x() * r1pow2;
429 T r2pow3 = r.y() * r2pow2;
430 T r3pow3 = r.z() * r3pow2;
432 T r1pow4 = r.x() * r1pow3;
433 T r2pow4 = r.y() * r2pow3;
434 T r3pow4 = r.z() * r3pow3;
436 T r1pow5 = r.x() * r1pow4;
437 T r2pow5 = r.y() * r2pow4;
438 T r3pow5 = r.z() * r3pow4;
440 T rsq = r1pow2 + r2pow2 + r3pow2;
442 T rnorm = sycl::sqrt(rsq);
447 T g1 = -1 * rm2 * g0;
448 T g2 = -3 * rm2 * g1;
449 T g3 = -5 * rm2 * g2;
450 T g4 = -7 * rm2 * g3;
451 T g5 = -9 * rm2 * g4;
454 15 * g3 * r1 + 10 * g4 * r1pow3 + g5 * r1pow5,
455 (3 * g3 + 6 * g4 * r1pow2 + g5 * r1pow4) * r2,
456 (3 * g3 + 6 * g4 * r1pow2 + g5 * r1pow4) * r3,
457 3 * g3 * r1 + g4 * r1pow3 + 3 * g4 * r1 * r2pow2 + g5 * r1pow3 * r2pow2,
458 (3 * g4 * r1 + g5 * r1pow3) * r2 * r3,
459 3 * g3 * r1 + g4 * r1pow3 + 3 * g4 * r1 * r3pow2 + g5 * r1pow3 * r3pow2,
460 3 * g3 * r2 + 3 * g4 * r1pow2 * r2 + g4 * r2pow3 + g5 * r1pow2 * r2pow3,
461 (g3 + g4 * r1pow2 + g4 * r2pow2 + g5 * r1pow2 * r2pow2) * r3,
462 r2 * (g3 + g4 * r1pow2 + g4 * r3pow2 + g5 * r1pow2 * r3pow2),
463 3 * g3 * r3 + 3 * g4 * r1pow2 * r3 + g4 * r3pow3 + g5 * r1pow2 * r3pow3,
464 r1 * (3 * g3 + 6 * g4 * r2pow2 + g5 * r2pow4),
465 r1 * (3 * g4 * r2 + g5 * r2pow3) * r3,
466 r1 * (g3 + g4 * r2pow2 + g4 * r3pow2 + g5 * r2pow2 * r3pow2),
467 r1 * r2 * (3 * g4 * r3 + g5 * r3pow3),
468 r1 * (3 * g3 + 6 * g4 * r3pow2 + g5 * r3pow4),
469 15 * g3 * r2 + 10 * g4 * r2pow3 + g5 * r2pow5,
470 (3 * g3 + 6 * g4 * r2pow2 + g5 * r2pow4) * r3,
471 3 * g3 * r2 + g4 * r2pow3 + 3 * g4 * r2 * r3pow2 + g5 * r2pow3 * r3pow2,
472 3 * g3 * r3 + 3 * g4 * r2pow2 * r3 + g4 * r3pow3 + g5 * r2pow2 * r3pow3,
473 r2 * (3 * g3 + 6 * g4 * r3pow2 + g5 * r3pow4),
474 15 * g3 * r3 + 10 * g4 * r3pow3 + g5 * r3pow5};
477 3 * g2 + 6 * g3 * r1pow2 + g4 * r1pow4,
478 3 * g3 * r1 * r2 + g4 * r1pow3 * r2,
479 3 * g3 * r1 * r3 + g4 * r1pow3 * r3,
480 g2 + g3 * r1pow2 + g3 * r2pow2 + g4 * r1pow2 * r2pow2,
481 (g3 + g4 * r1pow2) * r2 * r3,
482 g2 + g3 * r1pow2 + g3 * r3pow2 + g4 * r1pow2 * r3pow2,
483 3 * g3 * r1 * r2 + g4 * r1 * r2pow3,
484 r1 * (g3 + g4 * r2pow2) * r3,
485 r1 * r2 * (g3 + g4 * r3pow2),
486 3 * g3 * r1 * r3 + g4 * r1 * r3pow3,
487 3 * g2 + 6 * g3 * r2pow2 + g4 * r2pow4,
488 3 * g3 * r2 * r3 + g4 * r2pow3 * r3,
489 g2 + g3 * r2pow2 + g3 * r3pow2 + g4 * r2pow2 * r3pow2,
490 3 * g3 * r2 * r3 + g4 * r2 * r3pow3,
491 3 * g2 + 6 * g3 * r3pow2 + g4 * r3pow4};
494 3 * g2 * r1 + g3 * r1pow3,
495 g2 * r2 + g3 * r1pow2 * r2,
496 g2 * r3 + g3 * r1pow2 * r3,
497 g2 * r1 + g3 * r1 * r2pow2,
499 g2 * r1 + g3 * r1 * r3pow2,
500 3 * g2 * r2 + g3 * r2pow3,
501 g2 * r3 + g3 * r2pow2 * r3,
502 g2 * r2 + g3 * r2 * r3pow2,
503 3 * g2 * r3 + g3 * r3pow3};
520 class GreenFuncGravCartesian<T, 1, 4> {
523 const sycl::vec<T, 3> &r) {
531 T r1pow2 = r.x() * r.x();
532 T r2pow2 = r.y() * r.y();
533 T r3pow2 = r.z() * r.z();
535 T r1pow3 = r.x() * r1pow2;
536 T r2pow3 = r.y() * r2pow2;
537 T r3pow3 = r.z() * r3pow2;
539 T r1pow4 = r.x() * r1pow3;
540 T r2pow4 = r.y() * r2pow3;
541 T r3pow4 = r.z() * r3pow3;
543 T rsq = r1pow2 + r2pow2 + r3pow2;
545 T rnorm = sycl::sqrt(rsq);
550 T g1 = -1 * rm2 * g0;
551 T g2 = -3 * rm2 * g1;
552 T g3 = -5 * rm2 * g2;
553 T g4 = -7 * rm2 * g3;
556 3 * g2 + 6 * g3 * r1pow2 + g4 * r1pow4,
557 3 * g3 * r1 * r2 + g4 * r1pow3 * r2,
558 3 * g3 * r1 * r3 + g4 * r1pow3 * r3,
559 g2 + g3 * r1pow2 + g3 * r2pow2 + g4 * r1pow2 * r2pow2,
560 (g3 + g4 * r1pow2) * r2 * r3,
561 g2 + g3 * r1pow2 + g3 * r3pow2 + g4 * r1pow2 * r3pow2,
562 3 * g3 * r1 * r2 + g4 * r1 * r2pow3,
563 r1 * (g3 + g4 * r2pow2) * r3,
564 r1 * r2 * (g3 + g4 * r3pow2),
565 3 * g3 * r1 * r3 + g4 * r1 * r3pow3,
566 3 * g2 + 6 * g3 * r2pow2 + g4 * r2pow4,
567 3 * g3 * r2 * r3 + g4 * r2pow3 * r3,
568 g2 + g3 * r2pow2 + g3 * r3pow2 + g4 * r2pow2 * r3pow2,
569 3 * g3 * r2 * r3 + g4 * r2 * r3pow3,
570 3 * g2 + 6 * g3 * r3pow2 + g4 * r3pow4};
573 3 * g2 * r1 + g3 * r1pow3,
574 g2 * r2 + g3 * r1pow2 * r2,
575 g2 * r3 + g3 * r1pow2 * r3,
576 g2 * r1 + g3 * r1 * r2pow2,
578 g2 * r1 + g3 * r1 * r3pow2,
579 3 * g2 * r2 + g3 * r2pow3,
580 g2 * r3 + g3 * r2pow2 * r3,
581 g2 * r2 + g3 * r2 * r3pow2,
582 3 * g2 * r3 + g3 * r3pow3};
599 class GreenFuncGravCartesian<T, 1, 3> {
602 const sycl::vec<T, 3> &r) {
610 T r1pow2 = r.x() * r.x();
611 T r2pow2 = r.y() * r.y();
612 T r3pow2 = r.z() * r.z();
614 T r1pow3 = r.x() * r1pow2;
615 T r2pow3 = r.y() * r2pow2;
616 T r3pow3 = r.z() * r3pow2;
618 T rsq = r1pow2 + r2pow2 + r3pow2;
620 T rnorm = sycl::sqrt(rsq);
625 T g1 = -1 * rm2 * g0;
626 T g2 = -3 * rm2 * g1;
627 T g3 = -5 * rm2 * g2;
630 3 * g2 * r1 + g3 * r1pow3,
631 g2 * r2 + g3 * r1pow2 * r2,
632 g2 * r3 + g3 * r1pow2 * r3,
633 g2 * r1 + g3 * r1 * r2pow2,
635 g2 * r1 + g3 * r1 * r3pow2,
636 3 * g2 * r2 + g3 * r2pow3,
637 g2 * r3 + g3 * r2pow2 * r3,
638 g2 * r2 + g3 * r2 * r3pow2,
639 3 * g2 * r3 + g3 * r3pow3};
656 class GreenFuncGravCartesian<T, 1, 2> {
659 const sycl::vec<T, 3> &r) {
667 T r1pow2 = r.x() * r.x();
668 T r2pow2 = r.y() * r.y();
669 T r3pow2 = r.z() * r.z();
671 T r1pow3 = r.x() * r1pow2;
672 T r2pow3 = r.y() * r2pow2;
673 T r3pow3 = r.z() * r3pow2;
675 T rsq = r1pow2 + r2pow2 + r3pow2;
677 T rnorm = sycl::sqrt(rsq);
682 T g1 = -1 * rm2 * g0;
683 T g2 = -3 * rm2 * g1;
700 class GreenFuncGravCartesian<T, 1, 1> {
703 const sycl::vec<T, 3> &r) {
709 T r1pow2 = r.x() * r.x();
710 T r2pow2 = r.y() * r.y();
711 T r3pow2 = r.z() * r.z();
713 T r1pow3 = r.x() * r1pow2;
714 T r2pow3 = r.y() * r2pow2;
715 T r3pow3 = r.z() * r3pow2;
717 T rsq = r1pow2 + r2pow2 + r3pow2;
719 T rnorm = sycl::sqrt(rsq);
724 T g1 = -1 * rm2 * g0;
Utility to get the derivatives of the Green function for gravity in Cartesian coordinates.
namespace for math utility