24template<
class Tvec,
class Tgr
idVec>
28 using namespace shamrock::patch;
48 return storage.merged_patchdata_ghost.get().get(id).total_elements;
56 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
61 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
81 auto cell_max = buf_cell_max.get_read_access(depends_list);
83 auto rho_xm = buf_rho_xm.get_read_access(depends_list);
93 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
94 shambase::parallel_for(
95 cgh, mpdat.total_elements * Block::block_size,
"compute grad p", [=](
u64 id_a) {
96 u32 block_id = id_a / Block::block_size;
98 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
102 Tscal rho_i_j_k = rho[id_a];
103 Tscal rho_im1_j_k = rho_xm[id_a];
104 Tscal rho_i_jm1_k = rho_ym[id_a];
105 Tscal rho_i_j_km1 = rho_zm[id_a];
107 Tscal p_i_j_k = press[id_a];
108 Tscal p_im1_j_k = p_xm[id_a];
109 Tscal p_i_jm1_k = p_ym[id_a];
110 Tscal p_i_j_km1 = p_zm[id_a];
120 rho_i_j_k + rho_im1_j_k,
121 rho_i_j_k + rho_i_jm1_k,
122 rho_i_j_k + rho_i_j_km1
125 Tvec grad_p_source_term = dp / (avg_rho * d_cell);
133 grad_p[id_a] = -grad_p_source_term;
138 buf_cell_min.complete_event_state(e);
139 buf_cell_max.complete_event_state(e);
140 buf_rho.complete_event_state(e);
141 buf_rho_xm.complete_event_state(e);
142 buf_rho_ym.complete_event_state(e);
143 buf_rho_zm.complete_event_state(e);
144 buf_p.complete_event_state(e);
145 buf_p_xm.complete_event_state(e);
146 buf_p_ym.complete_event_state(e);
147 buf_p_zm.complete_event_state(e);
149 forces_buf.complete_event_state(e);
153 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
162 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact;
168 auto cell_max = buf_cell_max.get_read_access(depends_list);
169 auto forces = forces_buf.get_write_access(depends_list);
172 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
173 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"add ext force", [=](
u64 id_a) {
174 Tvec block_min = cell_min[id_a].template convert<Tscal>();
175 Tvec block_max = cell_max[id_a].template convert<Tscal>();
176 Tvec delta_cell = (block_max - block_min) / Block::side_size;
177 Tvec delta_cell_h = delta_cell * Tscal(0.5);
179 Block::for_each_cell_in_block(delta_cell, [=](u32 lid, Tvec delta) {
180 auto get_ext_force = [](Tvec r) {
181 Tscal d = sycl::length(r);
182 return r / (d * d * d + 1e-5);
192 buf_cell_max.complete_event_state(e);
193 forces_buf.complete_event_state(e);
196 if (storage.forces.get().get_field(p.id_patch).has_nan()) {
197 logger::err_ln(
"[Zeus]",
"nan detected in forces");
204template<
class Tvec,
class Tgr
idVec>
208 using namespace shamrock::patch;
222 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
234 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
235 shambase::parallel_for(
236 cgh, mpdat.total_elements * Block::block_size,
"add ext force", [=](
u64 id_a) {
237 vel[id_a] += dt * forces[id_a];
247 storage.forces.reset();
250template<
class Tvec,
class Tgr
idVec>
254 using namespace shamrock::patch;
268 return storage.merged_patchdata_ghost.get().get(id).total_elements;
277 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
282 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
298 auto cell_max = buf_cell_max.get_read_access(depends_list);
300 auto vel = buf_vel.get_read_access(depends_list);
306 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
307 shambase::parallel_for(
308 cgh, mpdat.total_elements * Block::block_size,
"compute AV", [=](
u64 id_a) {
309 u32 block_id = id_a / Block::block_size;
311 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
315 Tscal rho_i_j_k = rho[id_a];
317 Tvec vel_i_j_k = vel[id_a];
318 Tvec vel_ip1_j_k = vel_xp[id_a];
319 Tvec vel_i_jp1_k = vel_yp[id_a];
320 Tvec vel_i_j_kp1 = vel_zp[id_a];
323 vel_ip1_j_k.x() - vel_i_j_k.x(),
324 vel_i_jp1_k.y() - vel_i_j_k.y(),
325 vel_i_j_kp1.z() - vel_i_j_k.z()
328 dv = sham::negative_part(dv);
330 constexpr Tscal
C2 = 3;
332 q_AV[id_a] =
C2*rho_i_j_k*(dv*dv);
338 buf_cell_max.complete_event_state(e);
340 buf_vel.complete_event_state(e);
341 buf_vel_xp.complete_event_state(e);
342 buf_vel_yp.complete_event_state(e);
343 buf_vel_zp.complete_event_state(e);
344 q_AV_buf.complete_event_state(e);
348template<
class Tvec,
class Tgr
idVec>
352 using namespace shamrock::patch;
357 using Block =
typename Config::AMRBlock;
380 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
385 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
408 auto cell_max = buf_cell_max.get_read_access(depends_list);
417 auto vel = buf_vel.get_write_access(depends_list);
419 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
420 shambase::parallel_for(
421 cgh, mpdat.total_elements * Block::block_size,
"add vel AV", [=](
u64 id_a) {
422 u32 block_id = id_a / Block::block_size;
424 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
428 Tscal rho_i_j_k = rho[id_a];
429 Tscal rho_im1_j_k = rho_xm[id_a];
430 Tscal rho_i_jm1_k = rho_ym[id_a];
431 Tscal rho_i_j_km1 = rho_zm[id_a];
433 Tvec q_i_j_k = q_AV[id_a];
434 Tvec q_im1_j_k = q_AV_xm[id_a];
435 Tvec q_i_jm1_k = q_AV_ym[id_a];
436 Tvec q_i_j_km1 = q_AV_zm[id_a];
440 rho_i_j_k + rho_im1_j_k,
441 rho_i_j_k + rho_i_jm1_k,
442 rho_i_j_k + rho_i_j_km1
446 q_i_j_k.x()-q_im1_j_k.x(),
447 q_i_j_k.y()-q_i_jm1_k.y(),
448 q_i_j_k.z()-q_i_j_km1.z()
451 vel[id_a] += - dt*(dq)/ (avg_rho * d_cell);
457 buf_cell_max.complete_event_state(e);
466 buf_vel.complete_event_state(e);
470 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
475 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
493 auto cell_max = buf_cell_max.get_read_access(depends_list);
494 auto vel = buf_vel.get_read_access(depends_list);
504 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
505 shambase::parallel_for(
506 cgh, pdat.get_obj_cnt() * Block::block_size,
"add eint AV", [=](
u64 id_a) {
507 u32 block_id = id_a / Block::block_size;
509 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
513 Tvec vel_i_j_k = vel[id_a];
514 Tvec vel_ip1_j_k = vel_xp[id_a];
515 Tvec vel_i_jp1_k = vel_yp[id_a];
516 Tvec vel_i_j_kp1 = vel_zp[id_a];
518 Tvec q_i_j_k = q_AV[id_a];
521 vel_ip1_j_k.x() - vel_i_j_k.x(),
522 vel_i_jp1_k.y() - vel_i_j_k.y(),
523 vel_i_j_kp1.z() - vel_i_j_k.z()
526 eint[id_a] += -dt*sycl::dot(q_i_j_k,dv/ d_cell);
532 buf_cell_max.complete_event_state(e);
533 buf_vel.complete_event_state(e);
545template<
class Tvec,
class Tgr
idVec>
548 using namespace shamrock::patch;
553 using Flagger = FaceFlagger<Tvec, TgridVec>;
555 using Block =
typename Config::AMRBlock;
559 utility.make_compute_field<Tscal>(
"div_v_n", Block::block_size, [&](
u64 id) {
560 return storage.merged_patchdata_ghost.get().get(id).total_elements;
571 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
576 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
589 auto cell_max = buf_cell_max.get_read_access(depends_list);
598 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
599 shambase::parallel_for(
600 cgh, pdat.get_obj_cnt() * Block::block_size,
"compute divv", [=](
u64 id_a) {
601 u32 block_id = id_a / Block::block_size;
603 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
607 Tvec vel_i_j_k = vel[id_a];
608 Tvec vel_ip1_j_k = vel_xp[id_a];
609 Tvec vel_i_jp1_k = vel_yp[id_a];
610 Tvec vel_i_j_kp1 = vel_zp[id_a];
613 vel_ip1_j_k.x() - vel_i_j_k.x(),
614 vel_i_jp1_k.y() - vel_i_j_k.y(),
615 vel_i_j_kp1.z() - vel_i_j_k.z()
618 divv[id_a] += sycl::dot(dv,Tvec{1,1,1}/ d_cell);
624 buf_cell_max.complete_event_state(e);
633template<
class Tvec,
class Tgr
idVec>
637 using namespace shamrock::patch;
642 using Block =
typename Config::AMRBlock;
653 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
658 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
668 auto cell_max = buf_cell_max.get_read_access(depends_list);
670 auto divv = buf_divv.get_read_access(depends_list);
673 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
674 Tscal fact = (dt / 2.) * (solver_config.eos_gamma - 1);
676 shambase::parallel_for(
677 cgh, pdat.get_obj_cnt() * Block::block_size,
"evolve eint", [=](
u64 id_a) {
678 u32 block_id = id_a / Block::block_size;
680 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
683 Tscal factdivv = divv[id_a] * fact;
685 eint[id_a] *= (1 - factdivv) / (1 + factdivv);
690 buf_cell_max.complete_event_state(e);
691 buf_divv.complete_event_state(e);
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned 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.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
Class to manage a list of SYCL events.
flag faces with a lookup index for the orientation
void compute_forces()
compute general forces (pressure + external and store them into SolverStorage::forces)
void apply_force(Tscal dt)
apply the generalized forces
void compute_AV()
Compute the values of the artificial viscosity terms ( equations 33,34)
ComputeField< T > make_compute_field(std::string new_name, u32 nvar)
create a compute field and init it to zeros
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.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
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
utility class to handle AMR blocks
Patch object that contain generic patch information.