57 class BasicSPHGhostHandler {
60 using Config =
typename CfgClass::Variant;
66 using flt = shambase::VecComponent<vec>;
67 static constexpr u32 dim = shambase::VectorProperties<vec>::dimension;
68 using per_index = sycl::vec<i32, dim>;
73 per_index periodicity_index;
86 std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &xyzh_ghost_layout;
88 std::shared_ptr<shamrock::solvergraph::RankGetter> patch_rank_owner;
93 std::shared_ptr<shamrock::solvergraph::RankGetter> patch_rank_owner,
94 std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &xyzh_ghost_layout)
95 : sched(sched), ghost_config(ghost_config),
96 patch_rank_owner(std::move(patch_rank_owner)), xyzh_ghost_layout(xyzh_ghost_layout) {}
165 return builder.template map<T>([&](
u64 sender,
u64 receiver, InterfaceIdTable &build_table) {
166 if (build_table.ids_interf.
get_size() == 0) {
168 "their is an empty id table in the interface, it should have been removed");
174 build_table.build_infos,
175 build_table.ids_interf,
183 void modify_interface_native(
193 InterfaceIdTable &build_table;
196 std::vector<Args> vecarg;
199 builder.
for_each([&](
u64 sender,
u64 receiver, InterfaceIdTable &build_table) {
200 if (build_table.ids_interf.get_size() == 0) {
202 "their is an empty id table in the interface, it should have been removed");
205 vecarg.push_back({.sender = sender, .receiver = receiver, .build_table = build_table});
215 build_table.build_infos,
216 build_table.ids_interf,
217 build_table.ids_interf.get_size(),
239 std::function<T(
u64,
u64, InterfaceBuildInfos, sycl::buffer<u32> &,
u32)> gen_1,
240 std::function<
void(
u64,
u64, InterfaceBuildInfos, sycl::buffer<u32> &,
u32, T &)>
248 InterfaceIdTable &build_table;
251 std::vector<Args> vecarg;
254 T>([&](
u64 sender,
u64 receiver, InterfaceIdTable &build_table) {
255 if (!
bool(build_table.ids_interf)) {
257 "their is an empty id table in the interface, it should have been removed");
261 {.sender = sender, .receiver = receiver, .build_table = build_table});
266 build_table.build_infos,
267 *build_table.ids_interf,
268 build_table.ids_interf->size());
273 InterfaceIdTable &build_table = vecarg[i].build_table;
278 build_table.build_infos,
279 *build_table.ids_interf,
280 build_table.ids_interf->size(),
297 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
303 InterfaceBuildInfos binfo,
306 using namespace shamrock::patch;
312 sender_pdat.get_field<vec>(0).append_subset_to(
313 buf_idx, cnt, ret.get_field<vec>(0));
314 sender_pdat.get_field<flt>(ihpart).append_subset_to(
315 buf_idx, cnt, ret.get_field<flt>(1));
317 ret.get_field<vec>(0).apply_offset(binfo.offset);
323 inline shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> communicate_pdat(
324 const std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &pdl_ptr,
325 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> &&interf,
326 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> exchange_gz_node,
327 bool show_debug_infos) {
332 std::shared_ptr<shamrock::solvergraph::PatchDataLayerDDShared> exchange_gz_edge
333 = std::make_shared<shamrock::solvergraph::PatchDataLayerDDShared>(
"",
"");
335 exchange_gz_edge->patchdatas
336 = std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
339 if (show_debug_infos) {
340 std::shared_ptr<shamrock::solvergraph::ScalarsEdge<u64>> object_counts
341 = std::make_shared<shamrock::solvergraph::ScalarsEdge<u64>>(
342 "object_counts",
"object_counts");
343 sched.for_each_patchdata_nonempty(
344 [&](
const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) {
345 object_counts->values.add_obj(p.id_patch, pdat.get_obj_cnt());
347 auto exchange_gz_node_debug
348 = std::make_shared<shamrock::solvergraph::ExchangeGhostLayerDebugDotGraph>();
349 exchange_gz_node_debug->set_edges(object_counts, exchange_gz_edge);
350 exchange_gz_node_debug->evaluate();
353 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
355 exchange_gz_node->evaluate();
359 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> recv_dat;
362 shamalgs::collective::serialize_sparse_comm<shamrock::patch::PatchDataLayer>(
363 shamsys::instance::get_compute_scheduler_ptr(),
364 std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
368 return sched.get_patch_rank_owner(
id);
370 [](shamrock::patch::PatchDataLayer &pdat) {
371 shamalgs::SerializeHelper ser(shamsys::instance::get_compute_scheduler_ptr());
372 ser.allocate(pdat.serialize_buf_byte_size());
373 pdat.serialize_buf(ser);
374 return ser.finalize();
376 [&](sham::DeviceBuffer<u8> &&buf) {
378 shamalgs::SerializeHelper ser(
379 shamsys::instance::get_compute_scheduler_ptr(),
380 std::forward<sham::DeviceBuffer<u8>>(buf));
381 return shamrock::patch::PatchDataLayer::deserialize_buf(ser, pdl_ptr);
384 recv_dat = std::move(exchange_gz_edge->patchdatas);
391 inline shambase::DistributedDataShared<PatchDataField<T>> communicate_pdatfield(
392 shambase::DistributedDataShared<PatchDataField<T>> &&interf,
394 std::shared_ptr<shamrock::solvergraph::ExchangeGhostField<T>> exchange_gz_node) {
399 std::shared_ptr<shamrock::solvergraph::PatchDataFieldDDShared<T>> exchange_gz_edge
400 = std::make_shared<shamrock::solvergraph::PatchDataFieldDDShared<T>>(
"",
"");
402 exchange_gz_edge->patchdata_fields
403 = std::forward<shambase::DistributedDataShared<PatchDataField<T>>>(interf);
405 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
407 exchange_gz_node->evaluate();
411 shambase::DistributedDataShared<PatchDataField<T>> recv_dat;
414 shamalgs::collective::serialize_sparse_comm<PatchDataField<T>>(
415 shamsys::instance::get_compute_scheduler_ptr(),
416 std::forward<shambase::DistributedDataShared<PatchDataField<T>>>(interf),
419 return sched.get_patch_rank_owner(
id);
421 [](PatchDataField<T> &pdat) {
422 shamalgs::SerializeHelper ser(shamsys::instance::get_compute_scheduler_ptr());
423 ser.allocate(pdat.serialize_full_byte_size());
424 pdat.serialize_full(ser);
425 return ser.finalize();
427 [&](sham::DeviceBuffer<u8> &&buf) {
429 shamalgs::SerializeHelper ser(
430 shamsys::instance::get_compute_scheduler_ptr(),
431 std::forward<sham::DeviceBuffer<u8>>(buf));
435 recv_dat = std::move(exchange_gz_edge->patchdata_fields);
441 inline shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>
442 build_communicate_positions(
443 shambase::DistributedDataShared<InterfaceIdTable> &builder,
444 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> &exchange_gz_positions,
445 bool show_debug_infos) {
446 auto pos_interf = build_position_interf_field(builder);
447 return communicate_pdat(
448 xyzh_ghost_layout, std::move(pos_interf), exchange_gz_positions, show_debug_infos);
451 template<
class T,
class Tmerged>
452 inline shambase::DistributedData<Tmerged> merge_native(
453 shambase::DistributedDataShared<T> &&interfs,
455 Tmerged(
const shamrock::patch::Patch, shamrock::patch::PatchDataLayer &pdat)> init,
456 std::function<
void(Tmerged &, T &)> appender) {
460 shambase::DistributedData<Tmerged> merge_f;
462 sched.for_each_patchdata_nonempty(
463 [&](
const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) {
464 Tmerged tmp_merge = init(p, pdat);
466 interfs.for_each([&](
u64 sender,
u64 receiver, T &interface) {
467 if (receiver == p.id_patch) {
468 appender(tmp_merge, interface);
472 merge_f.
add_obj(p.id_patch, std::move(tmp_merge));
478 inline shambase::DistributedData<shamrock::patch::PatchDataLayer> merge_position_buf(
479 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> &&positioninterfs) {
482 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
484 return merge_native<shamrock::patch::PatchDataLayer, shamrock::patch::PatchDataLayer>(
485 std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
487 [=,
this](
const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) {
488 PatchDataField<vec> &pos = pdat.get_field<vec>(0);
489 PatchDataField<flt> &
hpart = pdat.get_field<flt>(ihpart);
491 shamrock::patch::PatchDataLayer ret(xyzh_ghost_layout);
493 ret.get_field<vec>(0).insert(pos);
494 ret.get_field<flt>(1).insert(hpart);
495 ret.check_field_obj_cnt_match();
499 [](shamrock::patch::PatchDataLayer &merged, shamrock::patch::PatchDataLayer &pint) {
500 merged.insert_elements(pint);
506 inline shambase::DistributedData<shamrock::patch::PatchDataLayer>
507 build_comm_merge_positions(
508 shambase::DistributedDataShared<InterfaceIdTable> &builder,
509 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> &exchange_gz_positions,
510 bool show_debug_infos) {
511 auto pos_interf = build_position_interf_field(builder);
512 return merge_position_buf(communicate_pdat(
513 xyzh_ghost_layout, std::move(pos_interf), exchange_gz_positions, show_debug_infos));