59 using Config =
typename CfgClass::Variant;
65 using flt = shambase::VecComponent<vec>;
67 using per_index = sycl::vec<i32, dim>;
72 per_index periodicity_index;
85 std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &xyzh_ghost_layout;
87 std::shared_ptr<shamrock::solvergraph::RankGetter> patch_rank_owner;
92 std::shared_ptr<shamrock::solvergraph::RankGetter> patch_rank_owner,
93 std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &xyzh_ghost_layout)
94 : sched(sched), ghost_config(ghost_config),
95 patch_rank_owner(
std::move(patch_rank_owner)), xyzh_ghost_layout(xyzh_ghost_layout) {}
97 GeneratorMap find_interfaces(
109 CacheMap make_interface_cache(
115 return gen_id_table_interfaces(
116 find_interfaces(sptree, int_range_max_tree, int_range_max));
125 return builder.template map<T>([&](
u64 sender,
127 InterfaceIdTable &build_table) {
128 if (build_table.ids_interf.get_size() == 0) {
129 throw shambase::make_except_with_loc<std::runtime_error>(
130 "there is an empty id table in the interface, it should have been removed");
136 build_table.build_infos,
137 build_table.ids_interf,
138 build_table.ids_interf.get_size());
143 void modify_interface_native(
153 InterfaceIdTable &build_table;
156 std::vector<Args> vecarg;
158 builder.
for_each([&](
u64 sender,
u64 receiver, InterfaceIdTable &build_table) {
159 if (build_table.ids_interf.get_size() == 0) {
160 throw shambase::make_except_with_loc<std::runtime_error>(
161 "there is an empty id table in the interface, it should have been removed");
164 vecarg.push_back({sender, receiver, build_table});
169 InterfaceIdTable &build_table = vecarg[i].build_table;
173 build_table.build_infos,
174 build_table.ids_interf,
175 build_table.ids_interf.get_size(),
190 const u32 ixyz = sched.pdl_old().template get_field_idx<vec>(
"xyz");
191 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
194 const u32 ixyz_ghost = xyzh_ghost_layout->template get_field_idx<vec>(
"xyz");
195 const u32 ihpart_ghost = xyzh_ghost_layout->template get_field_idx<flt>(
"hpart");
197 return build_interface_native<shamrock::patch::PatchDataLayer>(
199 [&, ixyz_ghost, ihpart_ghost](
202 InterfaceBuildInfos binfo,
205 using namespace shamrock::patch;
212 buf_idx, cnt, ret.get_field<vec>(ixyz_ghost));
214 buf_idx, cnt, ret.get_field<flt>(ihpart_ghost));
216 ret.get_field<vec>(ixyz_ghost).apply_offset(binfo.offset);
223 const std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &pdl_ptr,
227 std::shared_ptr<shamrock::solvergraph::PatchDataLayerDDShared> exchange_gz_edge
228 = std::make_shared<shamrock::solvergraph::PatchDataLayerDDShared>(
"",
"");
230 exchange_gz_edge->patchdatas
231 = std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
234 std::shared_ptr<shamrock::solvergraph::ExchangeGhostLayer> exchange_gz_node
235 = std::make_shared<shamrock::solvergraph::ExchangeGhostLayer>(pdl_ptr);
236 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
238 exchange_gz_node->evaluate();
241 recv_dat = std::move(exchange_gz_edge->patchdatas);
251 std::shared_ptr<shamrock::solvergraph::PatchDataFieldDDShared<T>> exchange_gz_edge
252 = std::make_shared<shamrock::solvergraph::PatchDataFieldDDShared<T>>(
"",
"");
254 exchange_gz_edge->patchdata_fields
255 = std::forward<shambase::DistributedDataShared<PatchDataField<T>>>(interf);
257 std::shared_ptr<shamrock::solvergraph::ExchangeGhostField<T>> exchange_gz_node
258 = std::make_shared<shamrock::solvergraph::ExchangeGhostField<T>>();
259 exchange_gz_node->set_edges(this->patch_rank_owner, exchange_gz_edge);
261 exchange_gz_node->evaluate();
264 recv_dat = std::move(exchange_gz_edge->patchdata_fields);
271 auto pos_interf = build_position_interf_field(builder);
272 return communicate_pdat(xyzh_ghost_layout, std::move(pos_interf));
275 template<
class T,
class Tmerged>
280 std::function<
void(Tmerged &, T &)> appender) {
286 sched.for_each_patchdata_nonempty(
288 Tmerged tmp_merge = init(p, pdat);
290 interfs.for_each([&](
u64 sender,
u64 receiver, T &interface) {
291 if (receiver == p.id_patch) {
292 appender(tmp_merge, interface);
296 merge_f.
add_obj(p.id_patch, std::move(tmp_merge));
306 const u32 ixyz = sched.pdl_old().template get_field_idx<vec>(
"xyz");
307 const u32 ihpart = sched.pdl_old().template get_field_idx<flt>(
"hpart");
310 const u32 ixyz_ghost = xyzh_ghost_layout->template get_field_idx<vec>(
"xyz");
311 const u32 ihpart_ghost = xyzh_ghost_layout->template get_field_idx<flt>(
"hpart");
313 return merge_native<shamrock::patch::PatchDataLayer, shamrock::patch::PatchDataLayer>(
322 ret.get_field<vec>(ixyz_ghost).insert(pos);
323 ret.get_field<flt>(ihpart_ghost).insert(hpart);
324 ret.check_field_obj_cnt_match();
329 merged.insert_elements(pint);
337 auto pos_interf = build_position_interf_field(builder);
338 return merge_position_buf(communicate_pdat(xyzh_ghost_layout, std::move(pos_interf)));