29namespace shamrock::patch {
31 PatchDataLayer PatchDataLayer::mock_patchdata(
32 u64 seed,
u32 obj_cnt,
const std::shared_ptr<PatchDataLayerLayout> &pdl) {
33 PatchDataLayer pdat{pdl};
37 pdat.pdl().for_each_field_any([&](
auto &field) {
38 using f_t =
typename std::remove_reference<
decltype(field)>::type;
39 using base_t =
typename f_t::field_T;
41 pdat.fields.push_back(
48 void PatchDataLayer::init_fields() {
50 pdl().for_each_field_any([&](
auto &field) {
51 using f_t =
typename std::remove_reference<
decltype(field)>::type;
52 using base_t =
typename f_t::field_T;
61 for (
u32 idx = 0; idx < fields.size(); idx++) {
64 [&](
auto &field,
auto &out_field) {
65 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
67 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
69 if constexpr (std::is_same<t1, t2>::value) {
70 field.extract_element(pidx, out_field);
76 out_pdat.fields[idx].value);
80 void PatchDataLayer::extract_elements(
84 for (
u32 idx = 0; idx < fields.size(); idx++) {
87 [&](
auto &field,
auto &out_field) {
88 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
90 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
92 if constexpr (std::is_same<t1, t2>::value) {
93 field.extract_elements(idxs, out_field);
99 out_pdat.fields[idx].value);
103 void PatchDataLayer::insert_elements(
const PatchDataLayer &pdat) {
107 for (
u32 idx = 0; idx < fields.size(); idx++) {
110 [&](
auto &field,
auto &out_field) {
111 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
113 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
115 if constexpr (std::is_same<t1, t2>::value) {
116 field.insert(out_field);
122 pdat.fields[idx].value);
126 void PatchDataLayer::overwrite(PatchDataLayer &pdat,
u32 obj_cnt) {
129 for (
u32 idx = 0; idx < fields.size(); idx++) {
132 [&](
auto &field,
auto &out_field) {
133 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
135 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
137 if constexpr (std::is_same<t1, t2>::value) {
138 field.overwrite(out_field, obj_cnt);
144 pdat.fields[idx].value);
148 void PatchDataLayer::resize(
u32 new_obj_cnt) {
150 for (
auto &field_var : fields) {
151 field_var.visit([&](
auto &field) {
152 field.resize(new_obj_cnt);
157 void PatchDataLayer::reserve(
u32 new_obj_cnt) {
159 for (
auto &field_var : fields) {
160 field_var.visit([&](
auto &field) {
161 field.reserve(new_obj_cnt);
166 void PatchDataLayer::expand(
u32 new_obj_cnt) {
168 for (
auto &field_var : fields) {
169 field_var.visit([&](
auto &field) {
170 field.expand(new_obj_cnt);
178 index_map, len, shamsys::instance::get_compute_scheduler_ptr());
180 for (
auto &field_var : fields) {
181 field_var.visit([&](
auto &field) {
182 field.index_remap(dev_index_map, len);
189 index_map, len, shamsys::instance::get_compute_scheduler_ptr());
191 for (
auto &field_var : fields) {
192 field_var.visit([&](
auto &field) {
193 field.index_remap_resize(dev_index_map, len);
199 for (
auto &field_var : fields) {
200 field_var.visit([&](
auto &field) {
201 field.index_remap_resize(index_map, len);
206 void PatchDataLayer::keep_ids(sycl::buffer<u32> &index_map,
u32 len) {
215 for (
auto &field_var : fields) {
216 field_var.visit([&](
auto &field) {
217 field.remove_ids(indexes, len);
222 void PatchDataLayer::append_subset_to(
226 for (
u32 idx = 0; idx < fields.size(); idx++) {
229 [&](
auto &field,
auto &out_field) {
230 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
232 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
234 if constexpr (std::is_same<t1, t2>::value) {
235 field.append_subset_to(idxs_buf, sz, out_field);
241 pdat.fields[idx].value);
245 void PatchDataLayer::append_subset_to(
const std::vector<u32> &idxs, PatchDataLayer &pdat) {
248 for (
u32 idx = 0; idx < fields.size(); idx++) {
251 [&](
auto &field,
auto &out_field) {
252 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
254 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
256 if constexpr (std::is_same<t1, t2>::value) {
257 field.append_subset_to(idxs, out_field);
263 pdat.fields[idx].value);
267 void PatchDataLayer::append_subset_to(
271 for (
u32 idx = 0; idx < fields.size(); idx++) {
274 [&](
auto &field,
auto &out_field) {
275 using t1 =
typename std::remove_reference<
decltype(field)>::type::Field_type;
277 typename std::remove_reference<
decltype(out_field)>::type::Field_type;
279 if constexpr (std::is_same<t1, t2>::value) {
280 field.append_subset_to(idxs_buf, sz, out_field);
284 "Mismatch in layout\n source layout = {}\n dest layout = {}",
285 pdl().get_description_str(),
286 pdat.pdl().get_description_str()));
290 pdat.fields[idx].value);
296 for_each_field_any([&](
auto &f) {
297 f.serialize_buf(serializer);
303 for_each_field_any([&](
auto &f) {
304 sum += f.serialize_buf_byte_size();
309 PatchDataLayer PatchDataLayer::deserialize_buf(
313 return PatchDataLayer{pdl, [&](
auto &pdat_fields) {
314 pdl->for_each_field_any([&](
auto &field) {
316 typename std::remove_reference<
decltype(field)>::type;
317 using base_t =
typename f_t::field_T;
319 pdat_fields.push_back(
321 serializer, field.name, field.nvar)});
326 void PatchDataLayer::fields_raz() {
327 for_each_field_any([&](
auto &f) {
333 void PatchDataLayer::split_patchdata(
334 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
335 std::array<T, 8> min_box,
336 std::array<T, 8> max_box) {
351 auto get_vec_idx = [&](T vmin, T vmax) -> std::vector<u32> {
353 [&](
const auto &acc,
u32 idx, T vmin, T vmax) {
361 std::vector<u32> idx_p0 = get_vec_idx(min_box[0], max_box[0]);
362 std::vector<u32> idx_p1 = get_vec_idx(min_box[1], max_box[1]);
363 std::vector<u32> idx_p2 = get_vec_idx(min_box[2], max_box[2]);
364 std::vector<u32> idx_p3 = get_vec_idx(min_box[3], max_box[3]);
365 std::vector<u32> idx_p4 = get_vec_idx(min_box[4], max_box[4]);
366 std::vector<u32> idx_p5 = get_vec_idx(min_box[5], max_box[5]);
367 std::vector<u32> idx_p6 = get_vec_idx(min_box[6], max_box[6]);
368 std::vector<u32> idx_p7 = get_vec_idx(min_box[7], max_box[7]);
370 u32 el_cnt_new = idx_p0.size() + idx_p1.size() + idx_p2.size() + idx_p3.size()
371 + idx_p4.size() + idx_p5.size() + idx_p6.size() + idx_p7.size();
373 if (get_obj_cnt() != el_cnt_new) {
377 "error in patchdata split, the new element count doesn't match the old one");
379 logger::err_ln(
"PatchData", min_box[0], max_box[0]);
380 logger::err_ln(
"PatchData", min_box[1], max_box[1]);
381 logger::err_ln(
"PatchData", min_box[2], max_box[2]);
382 logger::err_ln(
"PatchData", min_box[3], max_box[3]);
383 logger::err_ln(
"PatchData", min_box[4], max_box[4]);
384 logger::err_ln(
"PatchData", min_box[5], max_box[5]);
385 logger::err_ln(
"PatchData", min_box[6], max_box[6]);
386 logger::err_ln(
"PatchData", min_box[7], max_box[7]);
388 T vmin = sham::min(min_box[0], min_box[1]);
389 vmin = sham::min(vmin, min_box[2]);
390 vmin = sham::min(vmin, min_box[3]);
391 vmin = sham::min(vmin, min_box[4]);
392 vmin = sham::min(vmin, min_box[5]);
393 vmin = sham::min(vmin, min_box[6]);
394 vmin = sham::min(vmin, min_box[7]);
396 T vmax = sham::max(max_box[0], max_box[1]);
397 vmax = sham::max(vmax, max_box[2]);
398 vmax = sham::max(vmax, max_box[3]);
399 vmax = sham::max(vmax, max_box[4]);
400 vmax = sham::max(vmax, max_box[5]);
401 vmax = sham::max(vmax, max_box[6]);
402 vmax = sham::max(vmax, max_box[7]);
404 main_field.check_err_range(
405 [&](T val, T vmin, T vmax) {
414 append_subset_to(idx_p0, pdats[0].get());
415 append_subset_to(idx_p1, pdats[1].get());
416 append_subset_to(idx_p2, pdats[2].get());
417 append_subset_to(idx_p3, pdats[3].get());
418 append_subset_to(idx_p4, pdats[4].get());
419 append_subset_to(idx_p5, pdats[5].get());
420 append_subset_to(idx_p6, pdats[6].get());
421 append_subset_to(idx_p7, pdats[7].get());
425 template void PatchDataLayer::split_patchdata(
426 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
427 std::array<f32_3, 8> min_box,
428 std::array<f32_3, 8> max_box);
429 template void PatchDataLayer::split_patchdata(
430 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
431 std::array<f64_3, 8> min_box,
432 std::array<f64_3, 8> max_box);
433 template void PatchDataLayer::split_patchdata(
434 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
435 std::array<u32_3, 8> min_box,
436 std::array<u32_3, 8> max_box);
437 template void PatchDataLayer::split_patchdata(
438 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
439 std::array<u64_3, 8> min_box,
440 std::array<u64_3, 8> max_box);
441 template void PatchDataLayer::split_patchdata(
442 std::array<std::reference_wrapper<PatchDataLayer>, 8> pdats,
443 std::array<i64_3, 8> min_box,
444 std::array<i64_3, 8> max_box);
Header file for the patch struct and related function.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
static PatchDataField deserialize_buf(shamalgs::SerializeHelper &serializer, std::string field_name, u32 nvar)
deserialize a field inverse of serialize_buf
std::vector< u32 > get_ids_vec_where(Lambdacd &&cd_true, Args &&...args)
Same function as.
A buffer allocated in USM (Unified Shared Memory)
PatchDataLayer container class, the layout is described in patchdata_layout.
void index_remap(sycl::buffer< u32 > &index_map, u32 len)
this function remaps the patchdatafield like so val[id] = val[index_map[id]] This function can be use...
void index_remap_resize(sycl::buffer< u32 > &index_map, u32 len)
this function remaps the patchdatafield like so val[id] = val[index_map[id]] This function can be use...
void remove_ids(const sham::DeviceBuffer< u32 > &indexes, u32 len)
remove some particles ids
void extract_element(u32 pidx, PatchDataLayer &out_pdat)
extract particle at index pidx and insert it in the provided vectors
This header file contains utility functions related to exception handling in the code.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
This file contains the definition for the stacktrace related functionality.
static bool is_in_patch_converted(sycl::vec< T, 3 > val, sycl::vec< T, 3 > min_val, sycl::vec< T, 3 > max_val)
check if particle is in the asked range, given the output of @convert_coord
header file to manage sycl