37 constexpr Tscal _2pi = 2 * shambase::constants::pi<Tscal>;
40 Tscal inclination = inclination_;
41 Tscal posangle = posangle_;
44 auto &pdl = sched.pdl_old();
47 = tmp.get_field_buf_ref<Tvec>(pdl.get_field_idx<Tvec>(
"vxyz"));
49 auto &q = shamsys::instance::get_compute_scheduler().
get_queue();
55 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
56 shambase::parallel_for(cgh, tmp.get_obj_cnt(),
"Warp", [=](
i32 id_a) {
57 Tvec &xyz_a = acc_xyz[id_a];
58 Tvec &vxyz_a = acc_vxyz[id_a];
60 Tscal r = sycl::sqrt(sycl::dot(xyz_a, xyz_a));
62 Tvec k = Tvec(-sycl::sin(posangle), sycl::cos(posangle), 0.);
66 Tscal incl_rad = inclination * shambase::constants::pi<Tscal> / 180.;
69 if (r < Rwarp - Hwarp) {
71 }
else if (r < Rwarp + Hwarp && r > Rwarp - Hwarp) {
72 effective_inc = sycl::asin(
74 * (1. + sycl::sin(shambase::constants::pi<Tscal> / (2. * Hwarp) * (r - Rwarp)))
75 * sycl::sin(incl_rad));
76 psi = shambase::constants::pi<Tscal> * Rwarp / (4. * Hwarp) * sycl::sin(incl_rad)
77 / sycl::sqrt(1. - (0.5 * sycl::pown(sycl::sin(incl_rad), 2)));
78 Tscal psimax = sycl::max(psimax, psi);
80 effective_inc = incl_rad;
83 Tvec w = sycl::cross(k, xyz_a);
84 Tvec wv = sycl::cross(k, vxyz_a);
86 xyz_a = xyz_a * sycl::cos(effective_inc) + w * sycl::sin(effective_inc)
87 + k * sycl::dot(k, xyz_a) * (1. - sycl::cos(effective_inc));
88 vxyz_a = vxyz_a * sycl::cos(effective_inc) + wv * sycl::sin(effective_inc)
89 + k * sycl::dot(k, vxyz_a) * (1. - sycl::cos(effective_inc));
93 buf_xyz.complete_event_state(e);
94 buf_vxyz.complete_event_state(e);
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...