TEST(Array, Algebra) { array<int, 1> A(3), B(3), C; array<double, 1> D; B() = 2; A() = 3; C = A + B; EXPECT_ARRAY_NEAR(C, array<int, 1>{5, 5, 5}); C = A * B; EXPECT_ARRAY_NEAR(C, array<int, 1>{6, 6, 6}); C = 2 * B; EXPECT_ARRAY_NEAR(C, array<int, 1>{4, 4, 4}); C = 2 * B; EXPECT_ARRAY_NEAR(C, array<int, 1>{4, 4, 4}); D = 2.3 * B; EXPECT_ARRAY_NEAR(D, array<double, 1>{4.6, 4.6, 4.6}); D = A + B / 1.2; EXPECT_ARRAY_NEAR(D, array<double, 1>{4.66666666666667, 4.66666666666667, 4.66666666666667}); auto x = A + B + 2 * A; EXPECT_PRINT("(([3,3,3] + [2,2,2]) + (2 * [3,3,3]))", x); C = A + 2 * A + 3 * A - 2 * A + A - A + A + A * 3 + A + A + A + A + A + A + A + A + A + A + A + A + A; EXPECT_ARRAY_NEAR(C, array<int, 1>{63, 63, 63}); }
TEST(GfCartesian, H5_RW_EvaluatorM) { double beta = 1; auto g = gf<cartesian_product<imfreq, imfreq>, matrix_valued>{{{beta, Fermion, 5}, {beta, Boson, 5}}, {1, 1}}; g() = 2; h5::file file("g_nu_nuph5", H5F_ACC_TRUNC); h5_write(file, "g", g); gf<cartesian_product<imfreq, imfreq>, matrix_valued> g2{}; h5_read(file, "g", g2); EXPECT_ARRAY_NEAR(g.data(), g2.data()); //EXPECT_GF_NEAR(g, g2); auto w0 = matsubara_freq(0, beta, Fermion); auto W10 = matsubara_freq(10, beta, Boson); auto W0 = matsubara_freq(0, beta, Boson); EXPECT_ARRAY_NEAR(g(w0, W0), g2(w0, W0)); EXPECT_ARRAY_NEAR(g(w0, W10), g2(w0, W10)); }
TEST(Array, InverseTensor) { array<dcomplex, 3> a(2, 2, 2); a() = a() + 2; a() = inverse(a); array<dcomplex, 3> r(2, 2, 2); r() = 0.5; EXPECT_ARRAY_NEAR(r, a); }
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); }
// ------------------ TEST(Array, CrossConstruct2) { array<long, 2> A(2, 3); for (int i = 0; i < 2; ++i) for (int j = 0; j < 3; ++j) A(i, j) = 10 * i + j; std::vector<array<long, 2>> V(3, A); std::vector<array_view<long, 2>> W; for (auto& x : V) W.push_back(x); std::vector<array_view<long, 2>> W2(W); for (int i = 1; i < 3; ++i) V[i] *= i; for (int i = 1; i < 3; ++i) EXPECT_ARRAY_NEAR(W2[i], i * A); }
TEST(Array, CrossConstruct1) { vector<int> Vi(3); Vi() = 3; vector<double> Vd(Vi); EXPECT_ARRAY_NEAR(Vd, Vi); }