60 using Config =
typename CfgClass::Variant;
66 using flt = shambase::VecComponent<vec>;
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) {}
166 if (build_table.ids_interf.
get_size() == 0) {
167 throw shambase::make_except_with_loc<std::runtime_error>(
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) {
201 throw shambase::make_except_with_loc<std::runtime_error>(
202 "their is an empty id table in the interface, it should have been removed");
205 vecarg.push_back({sender,receiver,build_table});
211 InterfaceIdTable &build_table = vecarg[i].build_table;
215 build_table.build_infos,
216 build_table.ids_interf,
217 build_table.ids_interf.get_size(),
251 std::vector<Args> vecarg;
255 if (!
bool(build_table.ids_interf)) {
257 "their is an empty id table in the interface, it should have been removed");
260 vecarg.push_back({sender, receiver, build_table});
265 build_table.build_infos,
266 *build_table.ids_interf,
267 build_table.ids_interf->size());
277 build_table.build_infos,
278 *build_table.ids_interf,
279 build_table.ids_interf->size(),
296 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
298 return build_interface_native<shamrock::patch::PatchDataLayer>(
302 InterfaceBuildInfos binfo,
305 using namespace shamrock::patch;
311 sender_pdat.get_field<vec>(0).append_subset_to(
312 buf_idx, cnt, ret.get_field<vec>(0));
313 sender_pdat.get_field<flt>(ihpart).append_subset_to(
314 buf_idx, cnt, ret.get_field<flt>(1));
316 ret.get_field<vec>(0).apply_offset(binfo.offset);
323 const std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &pdl_ptr,
325 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> exchange_gz_node,
326 bool show_debug_infos) {
331 std::shared_ptr<shamrock::solvergraph::PatchDataLayerDDShared> exchange_gz_edge
332 = std::make_shared<shamrock::solvergraph::PatchDataLayerDDShared>(
"",
"");
334 exchange_gz_edge->patchdatas
335 = std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
338 if (show_debug_infos) {
339 std::shared_ptr<shamrock::solvergraph::ScalarsEdge<u64>> object_counts
340 = std::make_shared<shamrock::solvergraph::ScalarsEdge<u64>>(
341 "object_counts",
"object_counts");
342 sched.for_each_patchdata_nonempty(
344 object_counts->values.add_obj(p.id_patch, pdat.get_obj_cnt());
346 auto exchange_gz_node_debug
347 = std::make_shared<shamrock::solvergraph::ExchangeGhostLayerDebugDotGraph>();
348 exchange_gz_node_debug->set_edges(object_counts, exchange_gz_edge);
349 exchange_gz_node_debug->evaluate();
352 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
354 exchange_gz_node->evaluate();
361 shamalgs::collective::serialize_sparse_comm<shamrock::patch::PatchDataLayer>(
362 shamsys::instance::get_compute_scheduler_ptr(),
367 return sched.get_patch_rank_owner(
id);
371 ser.allocate(pdat.serialize_buf_byte_size());
372 pdat.serialize_buf(ser);
373 return ser.finalize();
378 shamsys::instance::get_compute_scheduler_ptr(),
380 return shamrock::patch::PatchDataLayer::deserialize_buf(ser, pdl_ptr);
383 recv_dat = std::move(exchange_gz_edge->patchdatas);
398 std::shared_ptr<shamrock::solvergraph::PatchDataFieldDDShared<T>> exchange_gz_edge
399 = std::make_shared<shamrock::solvergraph::PatchDataFieldDDShared<T>>(
"",
"");
401 exchange_gz_edge->patchdata_fields
402 = std::forward<shambase::DistributedDataShared<PatchDataField<T>>>(interf);
404 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
406 exchange_gz_node->evaluate();
413 shamalgs::collective::serialize_sparse_comm<PatchDataField<T>>(
414 shamsys::instance::get_compute_scheduler_ptr(),
415 std::forward<shambase::DistributedDataShared<PatchDataField<T>>>(interf),
418 return sched.get_patch_rank_owner(
id);
422 ser.allocate(pdat.serialize_full_byte_size());
423 pdat.serialize_full(ser);
424 return ser.finalize();
429 shamsys::instance::get_compute_scheduler_ptr(),
434 recv_dat = std::move(exchange_gz_edge->patchdata_fields);
441 build_communicate_positions(
443 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> &exchange_gz_positions,
444 bool show_debug_infos) {
445 auto pos_interf = build_position_interf_field(builder);
446 return communicate_pdat(
447 xyzh_ghost_layout, std::move(pos_interf), exchange_gz_positions, show_debug_infos);
450 template<
class T,
class Tmerged>
455 std::function<
void(Tmerged &, T &)> appender) {
461 sched.for_each_patchdata_nonempty(
463 Tmerged tmp_merge = init(p, pdat);
465 interfs.for_each([&](
u64 sender,
u64 receiver, T &interface) {
466 if (receiver == p.id_patch) {
467 appender(tmp_merge, interface);
471 merge_f.
add_obj(p.id_patch, std::move(tmp_merge));
481 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
483 return merge_native<shamrock::patch::PatchDataLayer, shamrock::patch::PatchDataLayer>(
492 ret.get_field<vec>(0).insert(pos);
493 ret.get_field<flt>(1).insert(hpart);
494 ret.check_field_obj_cnt_match();
499 merged.insert_elements(pint);
506 build_comm_merge_positions(
508 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> &exchange_gz_positions,
509 bool show_debug_infos) {
510 auto pos_interf = build_position_interf_field(builder);
511 return merge_position_buf(communicate_pdat(
512 xyzh_ghost_layout, std::move(pos_interf), exchange_gz_positions, show_debug_infos));