示例#1
0
TEST(Gfs, MPI_multivar) {

 mpi::communicator world;

 int nw = 2, nbw = 10;
 double beta = 10;
 clef::placeholder<0> k_;
 clef::placeholder<1> q_;
 clef::placeholder<2> r_;
 clef::placeholder<3> iw_;
 clef::placeholder<4> inu_;
 clef::placeholder<5> inup_;

 auto g = gf3_s{{{beta, Boson, nbw}, {beta, Fermion, nw}, {beta, Fermion, nw}}};
 g(iw_, inu_, inup_) << inu_ + 10 * inup_ + 100 * iw_;
 
 auto g2 = g;
 g2 = mpi_reduce(g, world);
 if (world.rank() == 0) EXPECT_ARRAY_NEAR(g2.data(), g.data() * world.size());

 mpi_broadcast(g2, world);
 if (world.rank() == 1) EXPECT_ARRAY_NEAR(g2.data(), g.data()* world.size());

 gf3_s g3 = mpi_all_reduce(g, world);
 EXPECT_ARRAY_NEAR(g3.data(), g.data() * world.size());

 gf3_s g4 = mpi_scatter(g);
 g2(iw_, inu_, inup_) << g2(iw_, inu_, inup_) * (1 + world.rank());
 g4 = mpi_gather(g2);
 // Test the result ?


 auto G = make_block_gf<cartesian_product<imfreq, imfreq, imfreq>, scalar_valued>({g});
 auto g0 = gf<imfreq, scalar_valued>{{beta, Boson, nbw}};
 auto G2 = make_block_gf<imfreq, scalar_valued>({g0});

 mpi_broadcast(G, world);
 mpi_broadcast(G2, world);
}
示例#2
0
 friend void mpi_broadcast(block_matrix &m, mpi::communicator c = {}, int root = 0) {
  mpi_broadcast(m.block_names, c, root);
  mpi_broadcast(m.matrix_vec, c, root);
 }
示例#3
0
文件: mpi.hpp 项目: TRIQS/triqs
 template <typename T>[[gnu::always_inline]] inline decltype(auto) broadcast(T &&x, communicator c = {}, int root = 0) {
   return mpi_broadcast(std::forward<T>(x), c, root);
 }
示例#4
0
文件: vector.hpp 项目: Titan-C/triqs
 template <typename T> void mpi_broadcast(std::vector<T> &v, communicator c, int root, std::false_type) {
  size_t s = v.size();
  mpi_broadcast(s, c, root);
  if (c.rank() != root) v.resize(s);
  for (auto &x : v) mpi_broadcast(x, c, root);
 }
示例#5
0
文件: vector.hpp 项目: Titan-C/triqs
 template <typename T> void mpi_broadcast(std::vector<T> &a, communicator c, int root, std::true_type) {
  size_t s = a.size();
  mpi_broadcast(s, c, root);
  if (c.rank() != root) a.resize(s);
  MPI_Bcast(a.data(), a.size(), mpi_datatype<T>(), root, c.get());
 }
示例#6
0
文件: vector.hpp 项目: Titan-C/triqs
 template <typename T> void mpi_broadcast(std::vector<T> &a, communicator c={}, int root=0) {
  mpi_broadcast(a, c, root, is_basic<T>{});
 }