24template<
class Tvec,
template<
class>
class SPHKernel>
28 shamlog_debug_ln(
"SPH",
"Updating divv");
30 Tscal gpart_mass = solver_config.gpart_mass;
33 using namespace shamrock::patch;
39 auto &merged_xyzh = storage.merged_xyzh.get();
53 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
60 sycl::range range_npart{pdat.get_obj_cnt()};
74 auto hpart = buf_hpart.get_read_access(depends_list);
75 auto omega = buf_omega.get_read_access(depends_list);
76 auto divv = buf_divv.get_write_access(depends_list);
77 auto ploop_ptrs = pcache.get_read_access(depends_list);
81 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
82 const Tscal pmass = gpart_mass;
86 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
88 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute divv", [=](
i32 id_a) {
89 using namespace shamrock::sph;
91 Tvec sum_axyz = {0, 0, 0};
93 Tscal h_a =
hpart[id_a];
94 Tvec xyz_a =
xyz[id_a];
95 Tvec vxyz_a =
vxyz[id_a];
96 Tscal omega_a =
omega[id_a];
98 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
101 Tscal inv_rho_omega_a = 1. / (omega_a * rho_a);
103 Tscal sum_nabla_v = 0;
105 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
107 Tvec dr = xyz_a -
xyz[id_b];
108 Tscal rab2 = sycl::dot(dr, dr);
109 Tscal h_b =
hpart[id_b];
111 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
115 Tscal rab = sycl::sqrt(rab2);
116 Tvec vxyz_b =
vxyz[id_b];
117 Tvec v_ab = vxyz_a - vxyz_b;
119 Tvec r_ab_unit = dr / rab;
122 r_ab_unit = {0, 0, 0};
125 Tvec dWab_a = Kernel::dW_3d(rab, h_a) * r_ab_unit;
127 sum_nabla_v += pmass * sycl::dot(v_ab, dWab_a);
130 divv[id_a] = -inv_rho_omega_a * sum_nabla_v;
136 buf_hpart.complete_event_state(e);
137 buf_omega.complete_event_state(e);
138 buf_divv.complete_event_state(e);
142 pcache.complete_event_state(resulting_events);
147template<
class Tvec,
template<
class>
class SPHKernel>
151 shamlog_debug_ln(
"SPH",
"Updating curlv");
153 Tscal gpart_mass = solver_config.gpart_mass;
156 using namespace shamrock::patch;
162 auto &merged_xyzh = storage.merged_xyzh.get();
176 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
183 sycl::range range_npart{pdat.get_obj_cnt()};
196 auto hpart = buf_hpart.get_read_access(depends_list);
197 auto omega = buf_omega.get_read_access(depends_list);
198 auto curlv = buf_curlv.get_write_access(depends_list);
199 auto ploop_ptrs = pcache.get_read_access(depends_list);
203 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
204 const Tscal pmass = gpart_mass;
208 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
210 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute curlv", [=](
i32 id_a) {
211 using namespace shamrock::sph;
213 Tvec sum_axyz = {0, 0, 0};
215 Tscal h_a =
hpart[id_a];
216 Tvec xyz_a =
xyz[id_a];
217 Tvec vxyz_a =
vxyz[id_a];
218 Tscal omega_a =
omega[id_a];
220 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
223 Tscal inv_rho_omega_a = 1. / (omega_a * rho_a);
225 Tvec sum_nabla_cross_v{};
227 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
229 Tvec dr = xyz_a -
xyz[id_b];
230 Tscal rab2 = sycl::dot(dr, dr);
231 Tscal h_b =
hpart[id_b];
233 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
237 Tscal rab = sycl::sqrt(rab2);
238 Tvec vxyz_b =
vxyz[id_b];
239 Tvec v_ab = vxyz_a - vxyz_b;
241 Tvec r_ab_unit = dr / rab;
244 r_ab_unit = {0, 0, 0};
247 Tvec dWab_a = Kernel::dW_3d(rab, h_a) * r_ab_unit;
249 sum_nabla_cross_v += pmass * sycl::cross(v_ab, dWab_a);
252 curlv[id_a] = -inv_rho_omega_a * sum_nabla_cross_v;
258 buf_hpart.complete_event_state(e);
259 buf_omega.complete_event_state(e);
260 buf_curlv.complete_event_state(e);
264 pcache.complete_event_state(resulting_events);
constexpr const char * vxyz
3-velocity field
constexpr const char * xyz
Position field (3D coordinates)
constexpr const char * hpart
Smoothing length field.
constexpr const char * omega
Grad-h correction factor \Omega.
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.
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.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
Class to manage a list of SYCL events.
void add_event(sycl::event e)
Add an event to the list of events.
Represents a collection of objects distributed across patches identified by a u64 id.
T & get(u64 id)
Returns a reference to an object in the collection.
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
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...
namespace for math utility
namespace for the main framework
This file contains the definition for the stacktrace related functionality.
Patch object that contain generic patch information.
u64 id_patch
unique key that identify the patch