31 return Qt1 + Qt0 * dt1;
52 dt1.v_0 * Qn1.v_0 + Qt1.v_0 * dt1.v_0 + Qt2.v_00,
53 dt1.v_0 * Qn1.v_1 + Qt1.v_0 * dt1.v_1 + Qt2.v_01,
54 dt1.v_0 * Qn1.v_2 + Qt1.v_0 * dt1.v_2 + Qt2.v_02,
55 dt1.v_1 * Qn1.v_1 + Qt1.v_1 * dt1.v_1 + Qt2.v_11,
56 dt1.v_1 * Qn1.v_2 + Qt1.v_1 * dt1.v_2 + Qt2.v_12,
57 dt1.v_2 * Qn1.v_2 + Qt1.v_2 * dt1.v_2 + Qt2.v_22};
90 dt1.v_0 * Qn2.v_00 + dt1.v_0 * (Qn2.v_00 - dt1.v_0 * Qn1.v_0) + Qt2.v_00 * dt1.v_0
92 dt1.v_0 * Qn2.v_01 + dt1.v_0 * (Qn2.v_01 - dt1.v_0 * Qn1.v_1) + Qt2.v_00 * dt1.v_1
94 dt1.v_0 * Qn2.v_02 + dt1.v_0 * (Qn2.v_02 - dt1.v_0 * Qn1.v_2) + Qt2.v_00 * dt1.v_2
96 dt1.v_0 * Qn2.v_11 + dt1.v_1 * (Qn2.v_01 - dt1.v_0 * Qn1.v_1) + Qt2.v_01 * dt1.v_1
98 dt1.v_0 * Qn2.v_12 + dt1.v_1 * (Qn2.v_02 - dt1.v_0 * Qn1.v_2) + Qt2.v_01 * dt1.v_2
100 dt1.v_0 * Qn2.v_22 + dt1.v_2 * (Qn2.v_02 - dt1.v_0 * Qn1.v_2) + Qt2.v_02 * dt1.v_2
102 dt1.v_1 * Qn2.v_11 + dt1.v_1 * (Qn2.v_11 - dt1.v_1 * Qn1.v_1) + Qt2.v_11 * dt1.v_1
104 dt1.v_1 * Qn2.v_12 + dt1.v_1 * (Qn2.v_12 - dt1.v_1 * Qn1.v_2) + Qt2.v_11 * dt1.v_2
106 dt1.v_1 * Qn2.v_22 + dt1.v_2 * (Qn2.v_12 - dt1.v_1 * Qn1.v_2) + Qt2.v_12 * dt1.v_2
108 dt1.v_2 * Qn2.v_22 + dt1.v_2 * (Qn2.v_22 - dt1.v_2 * Qn1.v_2) + Qt2.v_22 * dt1.v_2
171 dt1.v_0 * Qn3.v_000 + dt1.v_0 * (Qn3.v_000 - dt1.v_0 * Qn2.v_00)
172 + dt2.v_00 * Qt2.v_00 + dt1.v_0 * Qt3.v_000 + dt1.v_0 * Qt3.v_000 + Qt4.v_0000,
173 dt1.v_0 * Qn3.v_001 + dt1.v_0 * (Qn3.v_001 - dt1.v_0 * Qn2.v_01)
174 + dt2.v_01 * Qt2.v_00 + dt1.v_1 * Qt3.v_000 + dt1.v_0 * Qt3.v_001 + Qt4.v_0001,
175 dt1.v_0 * Qn3.v_002 + dt1.v_0 * (Qn3.v_002 - dt1.v_0 * Qn2.v_02)
176 + dt2.v_02 * Qt2.v_00 + dt1.v_2 * Qt3.v_000 + dt1.v_0 * Qt3.v_002 + Qt4.v_0002,
177 dt1.v_0 * Qn3.v_011 + dt1.v_1 * (Qn3.v_001 - dt1.v_0 * Qn2.v_01)
178 + dt2.v_01 * Qt2.v_01 + dt1.v_1 * Qt3.v_001 + dt1.v_0 * Qt3.v_011 + Qt4.v_0011,
179 dt1.v_0 * Qn3.v_012 + dt1.v_1 * (Qn3.v_002 - dt1.v_0 * Qn2.v_02)
180 + dt2.v_02 * Qt2.v_01 + dt1.v_2 * Qt3.v_001 + dt1.v_0 * Qt3.v_012 + Qt4.v_0012,
181 dt1.v_0 * Qn3.v_022 + dt1.v_2 * (Qn3.v_002 - dt1.v_0 * Qn2.v_02)
182 + dt2.v_02 * Qt2.v_02 + dt1.v_2 * Qt3.v_002 + dt1.v_0 * Qt3.v_022 + Qt4.v_0022,
183 dt1.v_0 * Qn3.v_111 + dt1.v_1 * (Qn3.v_011 - dt1.v_0 * Qn2.v_11)
184 + dt2.v_11 * Qt2.v_01 + dt1.v_1 * Qt3.v_011 + dt1.v_1 * Qt3.v_011 + Qt4.v_0111,
185 dt1.v_0 * Qn3.v_112 + dt1.v_1 * (Qn3.v_012 - dt1.v_0 * Qn2.v_12)
186 + dt2.v_12 * Qt2.v_01 + dt1.v_2 * Qt3.v_011 + dt1.v_1 * Qt3.v_012 + Qt4.v_0112,
187 dt1.v_0 * Qn3.v_122 + dt1.v_2 * (Qn3.v_012 - dt1.v_0 * Qn2.v_12)
188 + dt2.v_12 * Qt2.v_02 + dt1.v_2 * Qt3.v_012 + dt1.v_1 * Qt3.v_022 + Qt4.v_0122,
189 dt1.v_0 * Qn3.v_222 + dt1.v_2 * (Qn3.v_022 - dt1.v_0 * Qn2.v_22)
190 + dt2.v_22 * Qt2.v_02 + dt1.v_2 * Qt3.v_022 + dt1.v_2 * Qt3.v_022 + Qt4.v_0222,
191 dt1.v_1 * Qn3.v_111 + dt1.v_1 * (Qn3.v_111 - dt1.v_1 * Qn2.v_11)
192 + dt2.v_11 * Qt2.v_11 + dt1.v_1 * Qt3.v_111 + dt1.v_1 * Qt3.v_111 + Qt4.v_1111,
193 dt1.v_1 * Qn3.v_112 + dt1.v_1 * (Qn3.v_112 - dt1.v_1 * Qn2.v_12)
194 + dt2.v_12 * Qt2.v_11 + dt1.v_2 * Qt3.v_111 + dt1.v_1 * Qt3.v_112 + Qt4.v_1112,
195 dt1.v_1 * Qn3.v_122 + dt1.v_2 * (Qn3.v_112 - dt1.v_1 * Qn2.v_12)
196 + dt2.v_12 * Qt2.v_12 + dt1.v_2 * Qt3.v_112 + dt1.v_1 * Qt3.v_122 + Qt4.v_1122,
197 dt1.v_1 * Qn3.v_222 + dt1.v_2 * (Qn3.v_122 - dt1.v_1 * Qn2.v_22)
198 + dt2.v_22 * Qt2.v_12 + dt1.v_2 * Qt3.v_122 + dt1.v_2 * Qt3.v_122 + Qt4.v_1222,
199 dt1.v_2 * Qn3.v_222 + dt1.v_2 * (Qn3.v_222 - dt1.v_2 * Qn2.v_22)
200 + dt2.v_22 * Qt2.v_22 + dt1.v_2 * Qt3.v_222 + dt1.v_2 * Qt3.v_222 + Qt4.v_2222};
223 dt1.v_0 * Qn4.v_0000 + dt1.v_0 * (Qn4.v_0000 - dt1.v_0 * Qn3.v_000)
224 + Qt2.v_00 * dt3.v_000 + Qt3.v_000 * dt2.v_00 + Qt3.v_000 * dt2.v_00
225 + Qt4.v_0000 * dt1.v_0 + Qt3.v_000 * dt2.v_00 + Qt4.v_0000 * dt1.v_0
226 + Qt4.v_0000 * dt1.v_0 + Qt5.v_00000,
227 dt1.v_0 * Qn4.v_0001 + dt1.v_0 * (Qn4.v_0001 - dt1.v_0 * Qn3.v_001)
228 + Qt2.v_00 * dt3.v_001 + Qt3.v_001 * dt2.v_00 + Qt3.v_000 * dt2.v_01
229 + Qt4.v_0001 * dt1.v_0 + Qt3.v_000 * dt2.v_01 + Qt4.v_0001 * dt1.v_0
230 + Qt4.v_0000 * dt1.v_1 + Qt5.v_00001,
231 dt1.v_0 * Qn4.v_0002 + dt1.v_0 * (Qn4.v_0002 - dt1.v_0 * Qn3.v_002)
232 + Qt2.v_00 * dt3.v_002 + Qt3.v_002 * dt2.v_00 + Qt3.v_000 * dt2.v_02
233 + Qt4.v_0002 * dt1.v_0 + Qt3.v_000 * dt2.v_02 + Qt4.v_0002 * dt1.v_0
234 + Qt4.v_0000 * dt1.v_2 + Qt5.v_00002,
235 dt1.v_0 * Qn4.v_0011 + dt1.v_0 * (Qn4.v_0011 - dt1.v_0 * Qn3.v_011)
236 + Qt2.v_00 * dt3.v_011 + Qt3.v_001 * dt2.v_01 + Qt3.v_000 * dt2.v_11
237 + Qt4.v_0001 * dt1.v_1 + Qt3.v_001 * dt2.v_01 + Qt4.v_0011 * dt1.v_0
238 + Qt4.v_0001 * dt1.v_1 + Qt5.v_00011,
239 dt1.v_0 * Qn4.v_0012 + dt1.v_0 * (Qn4.v_0012 - dt1.v_0 * Qn3.v_012)
240 + Qt2.v_00 * dt3.v_012 + Qt3.v_002 * dt2.v_01 + Qt3.v_000 * dt2.v_12
241 + Qt4.v_0002 * dt1.v_1 + Qt3.v_001 * dt2.v_02 + Qt4.v_0012 * dt1.v_0
242 + Qt4.v_0001 * dt1.v_2 + Qt5.v_00012,
243 dt1.v_0 * Qn4.v_0022 + dt1.v_0 * (Qn4.v_0022 - dt1.v_0 * Qn3.v_022)
244 + Qt2.v_00 * dt3.v_022 + Qt3.v_002 * dt2.v_02 + Qt3.v_000 * dt2.v_22
245 + Qt4.v_0002 * dt1.v_2 + Qt3.v_002 * dt2.v_02 + Qt4.v_0022 * dt1.v_0
246 + Qt4.v_0002 * dt1.v_2 + Qt5.v_00022,
247 dt1.v_0 * Qn4.v_0111 + dt1.v_0 * (Qn4.v_0111 - dt1.v_0 * Qn3.v_111)
248 + Qt2.v_00 * dt3.v_111 + Qt3.v_001 * dt2.v_11 + Qt3.v_001 * dt2.v_11
249 + Qt4.v_0011 * dt1.v_1 + Qt3.v_001 * dt2.v_11 + Qt4.v_0011 * dt1.v_1
250 + Qt4.v_0011 * dt1.v_1 + Qt5.v_00111,
251 dt1.v_0 * Qn4.v_0112 + dt1.v_0 * (Qn4.v_0112 - dt1.v_0 * Qn3.v_112)
252 + Qt2.v_00 * dt3.v_112 + Qt3.v_002 * dt2.v_11 + Qt3.v_001 * dt2.v_12
253 + Qt4.v_0012 * dt1.v_1 + Qt3.v_001 * dt2.v_12 + Qt4.v_0012 * dt1.v_1
254 + Qt4.v_0011 * dt1.v_2 + Qt5.v_00112,
255 dt1.v_0 * Qn4.v_0122 + dt1.v_0 * (Qn4.v_0122 - dt1.v_0 * Qn3.v_122)
256 + Qt2.v_00 * dt3.v_122 + Qt3.v_002 * dt2.v_12 + Qt3.v_001 * dt2.v_22
257 + Qt4.v_0012 * dt1.v_2 + Qt3.v_002 * dt2.v_12 + Qt4.v_0022 * dt1.v_1
258 + Qt4.v_0012 * dt1.v_2 + Qt5.v_00122,
259 dt1.v_0 * Qn4.v_0222 + dt1.v_0 * (Qn4.v_0222 - dt1.v_0 * Qn3.v_222)
260 + Qt2.v_00 * dt3.v_222 + Qt3.v_002 * dt2.v_22 + Qt3.v_002 * dt2.v_22
261 + Qt4.v_0022 * dt1.v_2 + Qt3.v_002 * dt2.v_22 + Qt4.v_0022 * dt1.v_2
262 + Qt4.v_0022 * dt1.v_2 + Qt5.v_00222,
263 dt1.v_0 * Qn4.v_1111 + dt1.v_1 * (Qn4.v_0111 - dt1.v_0 * Qn3.v_111)
264 + Qt2.v_01 * dt3.v_111 + Qt3.v_011 * dt2.v_11 + Qt3.v_011 * dt2.v_11
265 + Qt4.v_0111 * dt1.v_1 + Qt3.v_011 * dt2.v_11 + Qt4.v_0111 * dt1.v_1
266 + Qt4.v_0111 * dt1.v_1 + Qt5.v_01111,
267 dt1.v_0 * Qn4.v_1112 + dt1.v_1 * (Qn4.v_0112 - dt1.v_0 * Qn3.v_112)
268 + Qt2.v_01 * dt3.v_112 + Qt3.v_012 * dt2.v_11 + Qt3.v_011 * dt2.v_12
269 + Qt4.v_0112 * dt1.v_1 + Qt3.v_011 * dt2.v_12 + Qt4.v_0112 * dt1.v_1
270 + Qt4.v_0111 * dt1.v_2 + Qt5.v_01112,
271 dt1.v_0 * Qn4.v_1122 + dt1.v_1 * (Qn4.v_0122 - dt1.v_0 * Qn3.v_122)
272 + Qt2.v_01 * dt3.v_122 + Qt3.v_012 * dt2.v_12 + Qt3.v_011 * dt2.v_22
273 + Qt4.v_0112 * dt1.v_2 + Qt3.v_012 * dt2.v_12 + Qt4.v_0122 * dt1.v_1
274 + Qt4.v_0112 * dt1.v_2 + Qt5.v_01122,
275 dt1.v_0 * Qn4.v_1222 + dt1.v_1 * (Qn4.v_0222 - dt1.v_0 * Qn3.v_222)
276 + Qt2.v_01 * dt3.v_222 + Qt3.v_012 * dt2.v_22 + Qt3.v_012 * dt2.v_22
277 + Qt4.v_0122 * dt1.v_2 + Qt3.v_012 * dt2.v_22 + Qt4.v_0122 * dt1.v_2
278 + Qt4.v_0122 * dt1.v_2 + Qt5.v_01222,
279 dt1.v_0 * Qn4.v_2222 + dt1.v_2 * (Qn4.v_0222 - dt1.v_0 * Qn3.v_222)
280 + Qt2.v_02 * dt3.v_222 + Qt3.v_022 * dt2.v_22 + Qt3.v_022 * dt2.v_22
281 + Qt4.v_0222 * dt1.v_2 + Qt3.v_022 * dt2.v_22 + Qt4.v_0222 * dt1.v_2
282 + Qt4.v_0222 * dt1.v_2 + Qt5.v_02222,
283 dt1.v_1 * Qn4.v_1111 + dt1.v_1 * (Qn4.v_1111 - dt1.v_1 * Qn3.v_111)
284 + Qt2.v_11 * dt3.v_111 + Qt3.v_111 * dt2.v_11 + Qt3.v_111 * dt2.v_11
285 + Qt4.v_1111 * dt1.v_1 + Qt3.v_111 * dt2.v_11 + Qt4.v_1111 * dt1.v_1
286 + Qt4.v_1111 * dt1.v_1 + Qt5.v_11111,
287 dt1.v_1 * Qn4.v_1112 + dt1.v_1 * (Qn4.v_1112 - dt1.v_1 * Qn3.v_112)
288 + Qt2.v_11 * dt3.v_112 + Qt3.v_112 * dt2.v_11 + Qt3.v_111 * dt2.v_12
289 + Qt4.v_1112 * dt1.v_1 + Qt3.v_111 * dt2.v_12 + Qt4.v_1112 * dt1.v_1
290 + Qt4.v_1111 * dt1.v_2 + Qt5.v_11112,
291 dt1.v_1 * Qn4.v_1122 + dt1.v_1 * (Qn4.v_1122 - dt1.v_1 * Qn3.v_122)
292 + Qt2.v_11 * dt3.v_122 + Qt3.v_112 * dt2.v_12 + Qt3.v_111 * dt2.v_22
293 + Qt4.v_1112 * dt1.v_2 + Qt3.v_112 * dt2.v_12 + Qt4.v_1122 * dt1.v_1
294 + Qt4.v_1112 * dt1.v_2 + Qt5.v_11122,
295 dt1.v_1 * Qn4.v_1222 + dt1.v_1 * (Qn4.v_1222 - dt1.v_1 * Qn3.v_222)
296 + Qt2.v_11 * dt3.v_222 + Qt3.v_112 * dt2.v_22 + Qt3.v_112 * dt2.v_22
297 + Qt4.v_1122 * dt1.v_2 + Qt3.v_112 * dt2.v_22 + Qt4.v_1122 * dt1.v_2
298 + Qt4.v_1122 * dt1.v_2 + Qt5.v_11222,
299 dt1.v_1 * Qn4.v_2222 + dt1.v_2 * (Qn4.v_1222 - dt1.v_1 * Qn3.v_222)
300 + Qt2.v_12 * dt3.v_222 + Qt3.v_122 * dt2.v_22 + Qt3.v_122 * dt2.v_22
301 + Qt4.v_1222 * dt1.v_2 + Qt3.v_122 * dt2.v_22 + Qt4.v_1222 * dt1.v_2
302 + Qt4.v_1222 * dt1.v_2 + Qt5.v_12222,
303 dt1.v_2 * Qn4.v_2222 + dt1.v_2 * (Qn4.v_2222 - dt1.v_2 * Qn3.v_222)
304 + Qt2.v_22 * dt3.v_222 + Qt3.v_222 * dt2.v_22 + Qt3.v_222 * dt2.v_22
305 + Qt4.v_2222 * dt1.v_2 + Qt3.v_222 * dt2.v_22 + Qt4.v_2222 * dt1.v_2
306 + Qt4.v_2222 * dt1.v_2 + Qt5.v_22222};
394 template<
class T, u32 low_order, u32 high_order>
397 const sycl::vec<T, 3> &offset) {
400 using namespace shamphys::details;
402 if constexpr (low_order == 0 && high_order == 5) {
405 auto Qn1 = offset_multipole_1(Q.t0, Q.t1, d.t1);
407 auto Qn2 = offset_multipole_2(Qn1, Q.t1, Q.t2, d.t1);
409 auto Qn3 = offset_multipole_3(Qn1, Qn2, Q.t2, Q.t3, d.t1);
411 auto Qn4 = offset_multipole_4(Qn2, Qn3, Q.t2, Q.t3, Q.t4, d.t1, d.t2);
413 auto Qn5 = offset_multipole_5(Qn3, Qn4, Q.t2, Q.t3, Q.t4, Q.t5, d.t1, d.t2, d.t3);
415 return {Q.t0, Qn1, Qn2, Qn3, Qn4, Qn5};
416 }
else if constexpr (low_order == 0 && high_order == 4) {
420 auto Qn1 = offset_multipole_1(Q.t0, Q.t1, d.t1);
422 auto Qn2 = offset_multipole_2(Qn1, Q.t1, Q.t2, d.t1);
424 auto Qn3 = offset_multipole_3(Qn1, Qn2, Q.t2, Q.t3, d.t1);
426 auto Qn4 = offset_multipole_4(Qn2, Qn3, Q.t2, Q.t3, Q.t4, d.t1, d.t2);
428 return {Q.t0, Qn1, Qn2, Qn3, Qn4};
429 }
else if constexpr (low_order == 0 && high_order == 3) {
433 auto Qn1 = offset_multipole_1(Q.t0, Q.t1, d.t1);
435 auto Qn2 = offset_multipole_2(Qn1, Q.t1, Q.t2, d.t1);
437 auto Qn3 = offset_multipole_3(Qn1, Qn2, Q.t2, Q.t3, d.t1);
439 return {Q.t0, Qn1, Qn2, Qn3};
440 }
else if constexpr (low_order == 0 && high_order == 2) {
444 auto Qn1 = offset_multipole_1(Q.t0, Q.t1, d.t1);
446 auto Qn2 = offset_multipole_2(Qn1, Q.t1, Q.t2, d.t1);
448 return {Q.t0, Qn1, Qn2};
449 }
else if constexpr (low_order == 0 && high_order == 1) {
453 auto Qn1 = offset_multipole_1(Q.t0, Q.t1, d.t1);
456 }
else if constexpr (low_order == 0 && high_order == 0) {
463 template<
class T, u32 low_order, u32 high_order>
466 const sycl::vec<T, 3> &from,
467 const sycl::vec<T, 3> &to) {
468 return offset_multipole_delta(Q_old, from - to);
Namespace for internal details of the logs module.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
namespace for math utility
shammath::SymTensorCollection< T, low_order, high_order > offset_multipole_delta(const shammath::SymTensorCollection< T, low_order, high_order > &Q, const sycl::vec< T, 3 > &offset)
utility to offset a multipole, see PHD