89 if (m_type_index.empty())
92 auto const local_forces = local_type_forces(particles);
93 auto const local_masses = local_type_masses(particles);
96 std::vector<Utils::Vector3d> forces(m_type_index.size(),
Utils::Vector3d{});
97 std::vector<double> masses(m_type_index.size(), 0.0);
100 boost::mpi::all_reduce(
::comm_cart, local_forces.data(),
101 static_cast<int>(local_forces.size()), forces.data(),
102 std::plus<Utils::Vector3d>{});
103 boost::mpi::all_reduce(
::comm_cart, local_masses.data(),
104 static_cast<int>(local_masses.size()), masses.data(),
105 std::plus<double>{});
107 for (
auto &p : particles) {
109 auto it = m_type_index.find(p.type());
110 if (it != m_type_index.end()) {
111 auto const mass_frac = p.mass() / masses[it->second];
112 auto const &type_force = forces[it->second];
113 for (
unsigned int i = 0u; i < 3u; i++) {
114 p.force()[i] -= mass_frac * type_force[i];