56 class GSPHGhostHandler {
59 using Config =
typename CfgClass::Variant;
65 using flt = shambase::VecComponent<vec>;
66 static constexpr u32 dim = shambase::VectorProperties<vec>::dimension;
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,
128 if (build_table.ids_interf.get_size() == 0) {
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(
144 shambase::DistributedDataShared<InterfaceIdTable> &builder,
145 shambase::DistributedDataShared<T> &mod,
153 InterfaceIdTable &build_table;
156 std::vector<Args> vecarg;
159 if (build_table.ids_interf.get_size() == 0) {
161 "there is an empty id table in the interface, it should have been removed");
164 vecarg.push_back({sender, receiver, build_table});
173 build_table.build_infos,
174 build_table.ids_interf,
175 build_table.ids_interf.get_size(),
186 inline shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>
187 build_position_interf_field(shambase::DistributedDataShared<InterfaceIdTable> &builder) {
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](
203 sham::DeviceBuffer<u32> &buf_idx,
205 using namespace shamrock::patch;
207 PatchDataLayer &sender_pdat = sched.patch_data.get_pdat(sender);
209 shamrock::patch::PatchDataLayer ret(xyzh_ghost_layout);
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);
222 inline shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> communicate_pdat(
223 const std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &pdl_ptr,
224 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> &&interf) {
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();
240 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> recv_dat;
241 recv_dat = std::move(exchange_gz_edge->patchdatas);
247 inline shambase::DistributedDataShared<PatchDataField<T>> communicate_pdatfield(
248 shambase::DistributedDataShared<PatchDataField<T>> &&interf,
u32 nvar) {
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();
263 shambase::DistributedDataShared<PatchDataField<T>> recv_dat;
264 recv_dat = std::move(exchange_gz_edge->patchdata_fields);
269 inline shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>
270 build_communicate_positions(shambase::DistributedDataShared<InterfaceIdTable> &builder) {
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>
276 inline shambase::DistributedData<Tmerged> merge_native(
277 shambase::DistributedDataShared<T> &&interfs,
279 Tmerged(
const shamrock::patch::Patch, shamrock::patch::PatchDataLayer &pdat)> init,
280 std::function<
void(Tmerged &, T &)> appender) {
284 shambase::DistributedData<Tmerged> merge_f;
286 sched.for_each_patchdata_nonempty(
287 [&](
const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) {
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));
302 inline shambase::DistributedData<shamrock::patch::PatchDataLayer> merge_position_buf(
303 shambase::DistributedDataShared<shamrock::patch::PatchDataLayer> &&positioninterfs) {
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>(
314 std::forward<shambase::DistributedDataShared<shamrock::patch::PatchDataLayer>>(
316 [=,
this](
const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) {
317 PatchDataField<vec> &pos = pdat.get_field<vec>(ixyz);
318 PatchDataField<flt> &
hpart = pdat.get_field<flt>(ihpart);
320 shamrock::patch::PatchDataLayer ret(xyzh_ghost_layout);
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();
328 [](shamrock::patch::PatchDataLayer &merged, shamrock::patch::PatchDataLayer &pint) {
329 merged.insert_elements(pint);
335 inline shambase::DistributedData<shamrock::patch::PatchDataLayer>
336 build_comm_merge_positions(shambase::DistributedDataShared<InterfaceIdTable> &builder) {
337 auto pos_interf = build_position_interf_field(builder);
338 return merge_position_buf(communicate_pdat(xyzh_ghost_layout, std::move(pos_interf)));