15 #include "eckit/exception/Exceptions.h"
22 const eckit::mpi::Comm &
world() {
23 return eckit::mpi::comm();
29 return eckit::mpi::self();
34 void gather(
const eckit::mpi::Comm & comm,
const std::vector<double> &
send,
35 std::vector<double> & recv,
const size_t root) {
36 int ntasks = comm.size();
38 int mysize =
send.size();
39 std::vector<int> sizes(ntasks);
40 comm.allGather(mysize, sizes.begin(), sizes.end());
41 std::vector<int> displs(ntasks);
42 size_t rcvsz = sizes[0];
44 for (
size_t jj = 1; jj < ntasks; ++jj) {
45 displs[jj] = displs[jj - 1] + sizes[jj - 1];
48 if (comm.rank() == root) recv.resize(rcvsz);
50 comm.gatherv(
send, recv, sizes, displs, root);
59 const Eigen::VectorXd & sendbuf, std::vector<Eigen::VectorXd> & recvbuf) {
60 const int ntasks = comm.size();
61 int buf_size = sendbuf.size();
63 std::vector<double> vbuf(sendbuf.data(), sendbuf.data() + buf_size);
64 std::vector<double> vbuf_total(ntasks * buf_size);
66 std::vector<int> recvcounts(ntasks);
67 for (
int ii = 0; ii < ntasks; ++ii) recvcounts[ii] = buf_size;
69 std::vector<int> displs(ntasks);
70 for (
int ii = 0; ii < ntasks; ++ii) displs[ii] = ii * buf_size;
72 comm.allGatherv(vbuf.begin(), vbuf.end(),
73 vbuf_total.begin(), recvcounts.data(), displs.data());
75 for (
int ii = 0; ii < ntasks; ++ii) {
76 std::vector<double> vloc(vbuf_total.begin() + ii * buf_size,
77 vbuf_total.begin() + (ii + 1) * buf_size);
78 Eigen::VectorXd my_vect = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(vloc.data(),
80 recvbuf[ii] = my_vect;