diff --git a/unittest/c-library/test_library_mpi.cpp b/unittest/c-library/test_library_mpi.cpp index f6aca0d89b..029af72c84 100644 --- a/unittest/c-library/test_library_mpi.cpp +++ b/unittest/c-library/test_library_mpi.cpp @@ -115,6 +115,78 @@ TEST(MPI, sub_box) ::testing::internal::GetCapturedStdout(); }; +TEST(MPI, split_comm) +{ + int nprocs, me, color, key; + MPI_Comm newcomm; + lammps_mpi_init(); + MPI_Comm_size(MPI_COMM_WORLD, &nprocs); + MPI_Comm_rank(MPI_COMM_WORLD, &me); + color = me % 2; + key = me; + + MPI_Comm_split(MPI_COMM_WORLD, color, key, &newcomm); + + const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite"}; + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + void *lmp = lammps_open(argc, argv, newcomm, nullptr); + lammps_command(lmp, "units lj"); + lammps_command(lmp, "atom_style atomic"); + lammps_command(lmp, "region box block 0 2 0 2 0 2"); + lammps_command(lmp, "create_box 1 box"); + + MPI_Comm_size(newcomm, &nprocs); + MPI_Comm_rank(newcomm, &me); + EXPECT_EQ(nprocs, 2); + EXPECT_GT(me, -1); + EXPECT_LT(me, 2); + EXPECT_EQ(lammps_extract_setting(lmp, "universe_size"), nprocs); + EXPECT_EQ(lammps_extract_setting(lmp, "universe_rank"), me); + EXPECT_EQ(lammps_extract_setting(lmp, "world_size"), nprocs); + EXPECT_EQ(lammps_extract_setting(lmp, "world_rank"), me); + + lammps_close(lmp); +}; + +TEST(MPI, multi_partition) +{ + FILE *fp; + int nprocs, me; + lammps_mpi_init(); + MPI_Comm_size(MPI_COMM_WORLD, &nprocs); + MPI_Comm_rank(MPI_COMM_WORLD, &me); + fp = fopen("in.mp_dummy", "w"); + fclose(fp); + + const char *args[] = {"LAMMPS_test", "-log", "none", "-partition", "2x2", + "-echo", "screen", "-nocite", "-in", "in.mp_dummy"}; + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + void *lmp = lammps_open(argc, argv, MPI_COMM_WORLD, nullptr); + + lammps_command(lmp, "units lj"); + lammps_command(lmp, "atom_style atomic"); + lammps_command(lmp, "region box block 0 2 0 2 0 2"); + lammps_command(lmp, "create_box 1 box"); + lammps_command(lmp, "variable partition universe 1 2"); + + EXPECT_EQ(lammps_extract_setting(lmp, "universe_size"), nprocs); + EXPECT_EQ(lammps_extract_setting(lmp, "universe_rank"), me); + EXPECT_EQ(lammps_extract_setting(lmp, "world_size"), nprocs / 2); + EXPECT_EQ(lammps_extract_setting(lmp, "world_rank"), me % 2); + + char *part_id = (char *)lammps_extract_variable(lmp, "partition", nullptr); + if (me < 2) { + ASSERT_THAT(part_id, StrEq("1")); + } else { + ASSERT_THAT(part_id, StrEq("2")); + } + + lammps_close(lmp); + unlink("in.mp_dummy"); +}; + class MPITest : public ::testing::Test { public: void command(const std::string &line) { lammps_command(lmp, line.c_str()); } @@ -164,6 +236,16 @@ protected: } }; +TEST_F(MPITest, size_rank) +{ + int nprocs, me; + MPI_Comm_size(MPI_COMM_WORLD, &nprocs); + MPI_Comm_rank(MPI_COMM_WORLD, &me); + + EXPECT_EQ(nprocs, lammps_extract_setting(lmp, "world_size")); + EXPECT_EQ(me, lammps_extract_setting(lmp, "world_rank")); +} + #if !defined(LAMMPS_BIGBIG) TEST_F(MPITest, gather) diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 8f5d3284a1..9ec87b9234 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -199,6 +199,12 @@ TEST_F(LibraryProperties, setting) lammps_command(lmp, "dimension 3"); if (!verbose) ::testing::internal::GetCapturedStdout(); + EXPECT_EQ(lammps_extract_setting(lmp, "world_size"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "world_rank"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "universe_size"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "universe_rank"), 0); + EXPECT_GT(lammps_extract_setting(lmp, "nthreads"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "ntypes"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "nbondtypes"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "nangletypes"), 0);