22namespace integ = shamrock::integrators;
23namespace util = shamrock::utilities;
29template<
class flt,
class T>
34 sycl::range<1> elem_range,
42 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
43 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
44 u32 gid = (
u32) item.get_id();
45 acc_u[item] = acc_u[item] + (dt) *acc_du[item];
54template void integ::forward_euler(
58 sycl::range<1> elem_range,
61template void integ::forward_euler(
65 sycl::range<1> elem_range,
68template void integ::forward_euler(
72 sycl::range<1> elem_range,
75template void integ::forward_euler(
79 sycl::range<1> elem_range,
86template<
class flt,
class T>
93 sycl::range<1> elem_range,
103 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
104 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
105 u32 gid = (
u32) item.get_id();
107 T incr = (hdt) * (acc_du[item] - acc_du_old[item]);
109 acc_u[item] = acc_u[item] + incr;
110 acc_epsilon_sq[item] = sycl::dot(incr, incr);
121template void integ::leapfrog_corrector(
127 sycl::range<1> elem_range,
130template void integ::leapfrog_corrector(
136 sycl::range<1> elem_range,
139template void integ::leapfrog_corrector(
145 sycl::range<1> elem_range,
148template void integ::leapfrog_corrector(
154 sycl::range<1> elem_range,
165 sycl::range<1> elem_range,
166 std::pair<T, T> box) {
171 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
172 T box_min = std::get<0>(box);
173 T box_max = std::get<1>(box);
174 T delt = box_max - box_min;
176 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
177 u32 gid = (
u32) item.get_id();
179 T r = xyz[gid] - box_min;
181 r = sycl::fmod(r, delt);
183 r = sycl::fmod(r, delt);
194template void util::sycl_position_modulo(
197 sycl::range<1> elem_range,
198 std::pair<f32_3, f32_3> box);
200template void util::sycl_position_modulo(
203 sycl::range<1> elem_range,
204 std::pair<f64_3, f64_3> box);
215 sycl::range<1> elem_range,
219 shambase::VecComponent<T> shear_value,
220 shambase::VecComponent<T> shear_speed) {
227 = queue.
submit(depends_list, [&, shear_base, shear_value, shear_speed](sycl::handler &cgh) {
228 T box_min = std::get<0>(box);
229 T box_max = std::get<1>(box);
230 T delt = box_max - box_min;
232 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
233 u32 gid = (
u32) item.get_id();
235 T r = xyz[gid] - box_min;
244 auto cnt_per = [](shambase::VecComponent<T> v) ->
int {
245 return (v >= 0) ? int(v) : (int(v) - 1);
248 i32 xoff = cnt_per(roff.x());
249 i32 yoff = cnt_per(roff.y());
250 i32 zoff = cnt_per(roff.z());
252 i32 dx = xoff * shear_base.x();
253 i32 dy = yoff * shear_base.y();
254 i32 dz = zoff * shear_base.z();
256 i32 d = dx + dy + dz;
260 = {(d * shear_dir.x()) * shear_value,
261 (d * shear_dir.y()) * shear_value,
262 (d * shear_dir.z()) * shear_value};
265 = {(d * shear_dir.x()) * shear_speed,
266 (d * shear_dir.y()) * shear_speed,
267 (d * shear_dir.z()) * shear_speed};
269 vxyz[gid] -= shift_speed;
272 r = sycl::fmod(r, delt);
274 r = sycl::fmod(r, delt);
286template void util::sycl_position_sheared_modulo(
290 sycl::range<1> elem_range,
291 std::pair<f32_3, f32_3> box,
297template void util::sycl_position_sheared_modulo(
301 sycl::range<1> elem_range,
302 std::pair<f64_3, f64_3> box,
320 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
321 cgh.parallel_for(sycl::range<1>{cnt}, [=](sycl::item<1> item) {
335template void util::swap_fields(
341template void util::swap_fields(
344template void util::swap_fields(
350template void util::swap_fields(
double f64
Alias for double.
float f32
Alias for float.
std::uint32_t u32
32 bit unsigned integer
std::int32_t i32
32 bit integer
A buffer allocated in USM (Unified Shared Memory)
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
T * get_write_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{})
Get a read-write pointer to the buffer's data.
const T * get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const
Get a read-only pointer to the buffer's data.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
Class to manage a list of SYCL events.
This header file contains utility functions related to exception handling in the code.
void forward_euler(sham::DeviceQueue &queue, sham::DeviceBuffer< T > &buf_val, sham::DeviceBuffer< T > &buf_der, sycl::range< 1 > elem_range, flt dt)
Perform forward Euler integration step.
void sycl_position_sheared_modulo(sham::DeviceQueue &queue, sham::DeviceBuffer< T > &buf_xyz, sham::DeviceBuffer< T > &buf_vxyz, sycl::range< 1 > elem_range, std::pair< T, T > box, i32_3 shear_base, i32_3 shear_dir, shambase::VecComponent< T > shear_value, shambase::VecComponent< T > shear_speed)
Apply periodic boundary conditions with shearing.
void sycl_position_modulo(sham::DeviceQueue &queue, sham::DeviceBuffer< T > &buf_xyz, sycl::range< 1 > elem_range, std::pair< T, T > box)
Apply periodic boundary conditions to positions.
void leapfrog_corrector(sham::DeviceQueue &queue, sham::DeviceBuffer< T > &buf_val, sham::DeviceBuffer< T > &buf_der, sham::DeviceBuffer< T > &buf_der_old, sham::DeviceBuffer< flt > &buf_eps_sq, sycl::range< 1 > elem_range, flt hdt)
Perform leapfrog corrector step with adaptive softening.
void swap_fields(sham::DeviceQueue &queue, sham::DeviceBuffer< T > &b1, sham::DeviceBuffer< T > &b2, u32 cnt)
Swap contents of two buffers.