58 auto const &box_geo = *system.box_geo;
59 auto &cell_structure = *system.cell_structure;
62 std::unordered_set<int> visited_pids;
63 std::vector<std::pair<int, Utils::Vector3d>> local_pid_pos;
64 for (
auto const &[pid1, pid2] : m_pairs) {
65 for (
auto const pid : {pid1, pid2}) {
66 if (not visited_pids.contains(pid)) {
67 auto const *p = cell_structure.get_local_particle(pid);
68 if (p and not p->is_ghost()) {
69 local_pid_pos.emplace_back(pid, p->pos());
71 visited_pids.emplace(pid);
77 std::vector<std::vector<std::pair<int, Utils::Vector3d>>> all_pid_pos;
78 boost::mpi::gather(comm, local_pid_pos, all_pid_pos, 0);
80 if (comm.rank() != 0) {
85 std::unordered_map<int, Utils::Vector3d> pos_map;
86 for (
auto const &rank_data : all_pid_pos) {
87 for (
auto const &[pid, pos] : rank_data) {
88 pos_map.emplace(pid, pos);
92 std::vector<double> pairwise_distances;
93 pairwise_distances.reserve(m_pairs.size());
94 for (
auto const &[pid1, pid2] : m_pairs) {
96 box_geo.get_mi_vector(pos_map.at(pid1), pos_map.at(pid2)).norm();
97 pairwise_distances.emplace_back(dist);
99 return pairwise_distances;