23namespace integ = shamrock::integrators;
24namespace util = shamrock::utilities;
30template<
class flt,
class T>
35 sycl::range<1> elem_range,
43 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
44 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
45 u32 gid = (
u32) item.get_id();
46 acc_u[item] = acc_u[item] + (dt) *acc_du[item];
59 sycl::range<1> elem_range,
66 sycl::range<1> elem_range,
73 sycl::range<1> elem_range,
80 sycl::range<1> elem_range,
87template<
class flt,
class T>
94 sycl::range<1> elem_range,
104 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
105 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
106 u32 gid = (
u32) item.get_id();
108 T incr = (hdt) * (acc_du[item] - acc_du_old[item]);
110 acc_u[item] = acc_u[item] + incr;
111 acc_epsilon_sq[item] = sycl::dot(incr, incr);
121template<
class flt,
class T>
122void integ::leapfrog_corrector_positive_only(
128 sycl::range<1> elem_range,
138 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
139 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
140 u32 gid = (
u32) item.get_id();
142 T incr = (hdt) * (acc_du[item] - acc_du_old[item]);
144 acc_u[item] = sham::max(acc_u[item] + incr, 0.0);
145 acc_epsilon_sq[item] = sycl::dot(incr, incr);
162 sycl::range<1> elem_range,
171 sycl::range<1> elem_range,
180 sycl::range<1> elem_range,
189 sycl::range<1> elem_range,
192template void integ::leapfrog_corrector_positive_only(
198 sycl::range<1> elem_range,
210 sycl::range<1> elem_range,
211 std::pair<T, T> box) {
216 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
217 T box_min = std::get<0>(box);
218 T box_max = std::get<1>(box);
219 T delt = box_max - box_min;
221 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
222 u32 gid = (
u32) item.get_id();
224 T r = xyz[gid] - box_min;
226 r = sycl::fmod(r, delt);
228 r = sycl::fmod(r, delt);
242 sycl::range<1> elem_range,
243 std::pair<f32_3, f32_3> box);
248 sycl::range<1> elem_range,
249 std::pair<f64_3, f64_3> box);
260 sycl::range<1> elem_range,
264 shambase::VecComponent<T> shear_value,
265 shambase::VecComponent<T> shear_speed) {
272 = queue.
submit(depends_list, [&, shear_base, shear_value, shear_speed](sycl::handler &cgh) {
273 T box_min = std::get<0>(box);
274 T box_max = std::get<1>(box);
275 T delt = box_max - box_min;
277 cgh.parallel_for(elem_range, [=](sycl::item<1> item) {
278 u32 gid = (
u32) item.get_id();
280 T r = xyz[gid] - box_min;
289 auto cnt_per = [](shambase::VecComponent<T> v) ->
int {
290 return (v >= 0) ? int(v) : (int(v) - 1);
293 i32 xoff = cnt_per(roff.x());
294 i32 yoff = cnt_per(roff.y());
295 i32 zoff = cnt_per(roff.z());
297 i32 dx = xoff * shear_base.x();
298 i32 dy = yoff * shear_base.y();
299 i32 dz = zoff * shear_base.z();
301 i32 d = dx + dy + dz;
305 = {(d * shear_dir.x()) * shear_value,
306 (d * shear_dir.y()) * shear_value,
307 (d * shear_dir.z()) * shear_value};
310 = {(d * shear_dir.x()) * shear_speed,
311 (d * shear_dir.y()) * shear_speed,
312 (d * shear_dir.z()) * shear_speed};
314 vxyz[gid] -= shift_speed;
317 r = sycl::fmod(r, delt);
319 r = sycl::fmod(r, delt);
335 sycl::range<1> elem_range,
336 std::pair<f32_3, f32_3> box,
346 sycl::range<1> elem_range,
347 std::pair<f64_3, f64_3> box,
365 auto e = queue.
submit(depends_list, [&](sycl::handler &cgh) {
366 cgh.parallel_for(sycl::range<1>{cnt}, [=](sycl::item<1> item) {
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.