26 template<
class T, u32 low_order, u32 high_order>
29 const sycl::vec<T, 3> &offset) {
33 static constexpr T inv_factorial_0 = 1. / 1;
34 static constexpr T inv_factorial_1 = 1. / 1;
35 static constexpr T inv_factorial_2 = 1. / 2;
36 static constexpr T inv_factorial_3 = 1. / 6;
37 static constexpr T inv_factorial_4 = 1. / 24;
38 static constexpr T inv_factorial_5 = 1. / 120;
40 if constexpr (low_order == 0 && high_order == 5) {
60 auto &dM_ret_0 = dM_ret.t0;
61 auto &dM_ret_1 = dM_ret.t1;
62 auto &dM_ret_2 = dM_ret.t2;
63 auto &dM_ret_3 = dM_ret.t3;
64 auto &dM_ret_4 = dM_ret.t4;
65 auto &dM_ret_5 = dM_ret.t5;
69 dM_ret_0 = inv_factorial_0 * h_0 * dM_0 + inv_factorial_1 * h_1 * dM_1
70 + inv_factorial_2 * h_2 * dM_2 + inv_factorial_3 * h_3 * dM_3
71 + inv_factorial_4 * h_4 * dM_4 + inv_factorial_5 * h_5 * dM_5;
73 dM_ret_1 = inv_factorial_0 * h_0 * dM_1 + inv_factorial_1 * h_1 * dM_2
74 + inv_factorial_2 * h_2 * dM_3 + inv_factorial_3 * h_3 * dM_4
75 + inv_factorial_4 * h_4 * dM_5;
77 dM_ret_2 = inv_factorial_0 * h_0 * dM_2 + inv_factorial_1 * h_1 * dM_3
78 + inv_factorial_2 * h_2 * dM_4 + inv_factorial_3 * h_3 * dM_5;
80 dM_ret_3 = inv_factorial_0 * h_0 * dM_3 + inv_factorial_1 * h_1 * dM_4
81 + inv_factorial_2 * h_2 * dM_5;
83 dM_ret_4 = inv_factorial_0 * h_0 * dM_4 + inv_factorial_1 * h_1 * dM_5;
84 dM_ret_5 = inv_factorial_0 * h_0 * dM_5;
87 }
else if constexpr (low_order == 1 && high_order == 5) {
106 auto &dM_ret_1 = dM_ret.t1;
107 auto &dM_ret_2 = dM_ret.t2;
108 auto &dM_ret_3 = dM_ret.t3;
109 auto &dM_ret_4 = dM_ret.t4;
110 auto &dM_ret_5 = dM_ret.t5;
114 dM_ret_1 = inv_factorial_0 * h_0 * dM_1 + inv_factorial_1 * h_1 * dM_2
115 + inv_factorial_2 * h_2 * dM_3 + inv_factorial_3 * h_3 * dM_4
116 + inv_factorial_4 * h_4 * dM_5;
118 dM_ret_2 = inv_factorial_0 * h_0 * dM_2 + inv_factorial_1 * h_1 * dM_3
119 + inv_factorial_2 * h_2 * dM_4 + inv_factorial_3 * h_3 * dM_5;
121 dM_ret_3 = inv_factorial_0 * h_0 * dM_3 + inv_factorial_1 * h_1 * dM_4
122 + inv_factorial_2 * h_2 * dM_5;
124 dM_ret_4 = inv_factorial_0 * h_0 * dM_4 + inv_factorial_1 * h_1 * dM_5;
125 dM_ret_5 = inv_factorial_0 * h_0 * dM_5;
128 }
else if constexpr (low_order == 1 && high_order == 4) {
145 auto &dM_ret_1 = dM_ret.t1;
146 auto &dM_ret_2 = dM_ret.t2;
147 auto &dM_ret_3 = dM_ret.t3;
148 auto &dM_ret_4 = dM_ret.t4;
152 dM_ret_1 = inv_factorial_0 * h_0 * dM_1 + inv_factorial_1 * h_1 * dM_2
153 + inv_factorial_2 * h_2 * dM_3 + inv_factorial_3 * h_3 * dM_4;
155 dM_ret_2 = inv_factorial_0 * h_0 * dM_2 + inv_factorial_1 * h_1 * dM_3
156 + inv_factorial_2 * h_2 * dM_4;
158 dM_ret_3 = inv_factorial_0 * h_0 * dM_3 + inv_factorial_1 * h_1 * dM_4;
160 dM_ret_4 = inv_factorial_0 * h_0 * dM_4;
163 }
else if constexpr (low_order == 1 && high_order == 3) {
178 auto &dM_ret_1 = dM_ret.t1;
179 auto &dM_ret_2 = dM_ret.t2;
180 auto &dM_ret_3 = dM_ret.t3;
184 dM_ret_1 = inv_factorial_0 * h_0 * dM_1 + inv_factorial_1 * h_1 * dM_2
185 + inv_factorial_2 * h_2 * dM_3;
187 dM_ret_2 = inv_factorial_0 * h_0 * dM_2 + inv_factorial_1 * h_1 * dM_3;
189 dM_ret_3 = inv_factorial_0 * h_0 * dM_3;
192 }
else if constexpr (low_order == 1 && high_order == 2) {
204 auto &dM_ret_1 = dM_ret.t1;
205 auto &dM_ret_2 = dM_ret.t2;
209 dM_ret_1 = inv_factorial_0 * h_0 * dM_1 + inv_factorial_1 * h_1 * dM_2;
211 dM_ret_2 = inv_factorial_0 * h_0 * dM_2;
214 }
else if constexpr (low_order == 1 && high_order == 1) {
221 auto &dM_ret_1 = dM_ret.t1;
225 dM_ret_1 = inv_factorial_0 * h_0 * dM_1;
234 template<
class T, u32 low_order, u32 high_order>
237 const sycl::vec<T, 3> &from,
238 const sycl::vec<T, 3> &to) {
239 return offset_dM_mat_delta(dM, to - from);
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
namespace for math utility