// unit tests for extracting compute data from a LAMMPS instance through the // Fortran wrapper #include "lammps.h" #include "library.h" #include #include #include #include #include "gtest/gtest.h" // prototypes for Fortran reverse wrapper functions extern "C" { void *f_lammps_with_args(); void f_lammps_close(); void f_lammps_setup_extract_compute(); double f_lammps_extract_compute_peratom_vector(int); double f_lammps_extract_compute_peratom_array(int,int); double f_lammps_extract_compute_global_scalar(); double f_lammps_extract_compute_global_vector(int); double f_lammps_extract_compute_global_array(int,int); double f_lammps_extract_compute_local_vector(int); double f_lammps_extract_compute_local_array(int,int); } class LAMMPS_extract_compute : public ::testing::Test { protected: LAMMPS_NS::LAMMPS *lmp; LAMMPS_extract_compute() = default; ~LAMMPS_extract_compute() override = default; void SetUp() override { ::testing::internal::CaptureStdout(); lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); } void TearDown() override { ::testing::internal::CaptureStdout(); f_lammps_close(); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); lmp = nullptr; } }; TEST_F(LAMMPS_extract_compute, peratom_vector) { f_lammps_setup_extract_compute(); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(1), -0.599703102447981); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(2), 391.817623795857); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(3), 391.430665759871); }; TEST_F(LAMMPS_extract_compute, peratom_array) { f_lammps_setup_extract_compute(); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,1), 0.8837067009319107); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,1), 0.3588584939803668); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,1), 1.2799807127711049); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,1), 0.20477632346642258); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,1), 0.400429511840588); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,1), 0.673995757699694); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,2), -1070.0291234709418); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,2), -1903.651817128683); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,2), -1903.5121520875714); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,2), -1427.867483013); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,2), -1427.8560790941347); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,2), -1903.5971655908565); }; TEST_F(LAMMPS_extract_compute, global_scalar) { f_lammps_setup_extract_compute(); double *scalar; scalar = (double*) lammps_extract_compute(lmp, "totalpe", LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR); //EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), 782.64858645328); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), *scalar); }; TEST_F(LAMMPS_extract_compute, global_vector) { f_lammps_setup_extract_compute(); double *vector; vector = (double*) lammps_extract_compute(lmp, "COM", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(1), vector[0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(2), vector[1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(3), vector[2]); }; TEST_F(LAMMPS_extract_compute, global_array) { f_lammps_setup_extract_compute(); double **array; array = (double**) lammps_extract_compute(lmp, "RDF", LMP_STYLE_GLOBAL, LMP_TYPE_ARRAY); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,1), array[0][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,1), array[0][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,2), array[1][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,2), array[1][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,3), array[2][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,4), array[3][0]); }; TEST_F(LAMMPS_extract_compute, local_vector) { f_lammps_setup_extract_compute(); double *vector; vector = (double*) lammps_extract_compute(lmp, "pairdist", LMP_STYLE_LOCAL, LMP_TYPE_VECTOR); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(1), vector[0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(2), vector[1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(3), vector[2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(4), vector[3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(5), vector[4]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(6), vector[5]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(7), vector[6]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(8), vector[7]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(9), vector[8]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(10), vector[9]); }; TEST_F(LAMMPS_extract_compute, local_array) { f_lammps_setup_extract_compute(); double **array; array = (double**) lammps_extract_compute(lmp, "pairlocal", LMP_STYLE_LOCAL, LMP_TYPE_ARRAY); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,1), array[0][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,1), array[0][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,1), array[0][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,1), array[0][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,2), array[1][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,2), array[1][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,2), array[1][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,2), array[1][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,3), array[2][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,3), array[2][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,3), array[2][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,3), array[2][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,4), array[3][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,4), array[3][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,4), array[3][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,4), array[3][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,5), array[4][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,5), array[4][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,5), array[4][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,5), array[4][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,6), array[5][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,6), array[5][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,6), array[5][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,6), array[5][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,7), array[6][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,7), array[6][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,7), array[6][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,7), array[6][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,8), array[7][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,8), array[7][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,8), array[7][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,8), array[7][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,9), array[8][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,9), array[8][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,9), array[8][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,9), array[8][3]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,10), array[9][0]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,10), array[9][1]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,10), array[9][2]); EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,10), array[9][3]); };