void flush() { if(state_index_ > last_update_sent_) { for(subscriber_list_type::iterator it = subscriber_list_.begin(); it != subscriber_list_.end(); it++) { send_updates(*it); } last_update_sent_ = state_index_; added_list_.clear(); removed_list_.clear(); } }
static void lb_migrate_points(const par::communicator& comm, list_type& pl, LBData& lbd) { const unsigned int num_proc = comm.size(); const unsigned int dim = point_type::dim; // Sendcounts should be already filled // Perform alltoall for recvcounts from sendcounts lbd.recvcounts.resize(num_proc); comm.alltoall(lbd.sendcounts.data(), 1, lbd.recvcounts.data(), 1); // Resize the send buffer lbd.send.resize(pl.size() * dim); // Pack up the send buffer { unsigned int i = 0; for (const point_type& p : pl) for (unsigned int d=0; d<dim; d++, i++) lbd.send[i] = p[d]; } // Offsets in memory (for alltoallv) lbd.sdispls[0] = 0; for (unsigned int i=1; i<num_proc; i++) lbd.sdispls[i] = lbd.sdispls[i-1] + lbd.sendcounts[i-1]; lbd.rdispls[0] = 0; for (unsigned int i=1; i<num_proc; i++) lbd.rdispls[i] = lbd.rdispls[i-1] + lbd.recvcounts[i-1]; // Create receive buffer const int total_recv = std::accumulate(lbd.recvcounts.begin(), lbd.recvcounts.end(), 0); lbd.recv.resize(total_recv); // Communicate points (alltoallv) comm.alltoallv(lbd.send.data(), lbd.sendcounts.data(), lbd.sdispls.data(), lbd.recv.data(), lbd.recvcounts.data(), lbd.rdispls.data()); // Clear out current points and reload from the receive buffer pl.clear(); for (unsigned int i=0; i<lbd.recv.size(); i+=dim) pl.emplace_back(point_type(lbd.recv[i], lbd.recv[i+1])); }
void clear() { list_.clear(); }