From 19a0747aeb697b26450f252d1fcdc6971baba33b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 22:15:29 -0400 Subject: [PATCH] add unit test for MLIAP unified --- unittest/force-styles/CMakeLists.txt | 8 ++ .../force-styles/test_mliappy_unified.cpp | 116 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 unittest/force-styles/test_mliappy_unified.cpp diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index d2345ceaa7..66c4ddd2ce 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -251,3 +251,11 @@ foreach(TEST ${IMPROPER_TESTS}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() + +if(MLIAP_ENABLE_PYTHON AND (NOT WIN32)) + add_executable(test_mliappy_unified test_mliappy_unified.cpp) + target_link_libraries(test_mliappy_unified PRIVATE lammps GTest::GMockMain) + add_test(NAME TestMliapPyUnified COMMAND test_mliappy_unified) + set_tests_properties(TestMliapPyUnified PROPERTIES ENVIRONMENT "PYTHONPATH=${LAMMPS_PYTHON_DIR}:${LAMMPS_LIB_DIR}/cython") +endif() + diff --git a/unittest/force-styles/test_mliappy_unified.cpp b/unittest/force-styles/test_mliappy_unified.cpp new file mode 100644 index 0000000000..1eb800a954 --- /dev/null +++ b/unittest/force-styles/test_mliappy_unified.cpp @@ -0,0 +1,116 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "library.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +const char pickle[] = "python create_pickle here \"\"\"\n" + "import lammps\n" + "import lammps.mliap\n" + "from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ\n" + "def create_pickle():\n" + " unified = MLIAPUnifiedLJ(['Ar'])\n" + " unified.pickle('mliap_unified_lj_Ar.pkl')\n" + "\"\"\"\n"; + +const char first[] = "units lj\n" + "atom_style atomic\n" + "lattice fcc 0.8442\n" + "region box block 0 2 0 2 0 2\n" + "create_box 1 box\n" + "create_atoms 1 box\n" + "mass 1 1.0\n" + "velocity all create 3.0 87287 loop geom\n"; + +const char second[] = "neighbor 0.3 bin\n" + "neigh_modify every 20 delay 0 check no\n" + "fix 1 all nve\n" + "run 2 post no\n"; + +namespace LAMMPS_NS { + +TEST(MliapUnified, VersusLJMelt) +{ + const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; + int lmpargc = sizeof(lmpargv) / sizeof(const char *); + + void *ljmelt = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + void *mliap = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + + lammps_commands_string(ljmelt, first); + lammps_command(ljmelt, "pair_style lj/cut 2.5"); + lammps_command(ljmelt, "pair_coeff * * 1.0 1.0"); + lammps_commands_string(ljmelt, second); + + lammps_command(mliap, pickle); + lammps_command(mliap, "python create_pickle invoke"); + + lammps_commands_string(mliap, first); + lammps_command(mliap, "pair_style mliap unified mliap_unified_lj_Ar.pkl 0"); + lammps_command(mliap, "pair_coeff * * Ar"); + lammps_commands_string(mliap, second); + + double lj_pe = lammps_get_thermo(ljmelt, "pe"); + double ml_pe = lammps_get_thermo(mliap, "pe"); + EXPECT_NEAR(lj_pe, ml_pe, 1.0e-14); + double lj_ke = lammps_get_thermo(ljmelt, "ke"); + double ml_ke = lammps_get_thermo(mliap, "ke"); + EXPECT_NEAR(lj_ke, ml_ke, 1.0e-14); + double lj_press = lammps_get_thermo(ljmelt, "press"); + double ml_press = lammps_get_thermo(mliap, "press"); + EXPECT_NEAR(lj_press, ml_press, 1.0e-14); + + lammps_command(mliap, "shell rm mliap_unified_lj_Ar.pkl"); + lammps_close(ljmelt); + lammps_close(mliap); +} + +TEST(MliapUnified, VersusLJMeltGhost) +{ + const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; + int lmpargc = sizeof(lmpargv) / sizeof(const char *); + + void *ljmelt = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + void *mliap = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + + lammps_commands_string(ljmelt, first); + lammps_command(ljmelt, "pair_style lj/cut 2.5"); + lammps_command(ljmelt, "pair_coeff * * 1.0 1.0"); + lammps_commands_string(ljmelt, second); + + lammps_command(mliap, pickle); + lammps_command(mliap, "python create_pickle invoke"); + + lammps_commands_string(mliap, first); + lammps_command(mliap, "pair_style mliap unified mliap_unified_lj_Ar.pkl 1"); + lammps_command(mliap, "pair_coeff * * Ar"); + lammps_commands_string(mliap, second); + + double lj_pe = lammps_get_thermo(ljmelt, "pe"); + double ml_pe = lammps_get_thermo(mliap, "pe"); + EXPECT_NEAR(lj_pe, ml_pe, 1.0e-14); + double lj_ke = lammps_get_thermo(ljmelt, "ke"); + double ml_ke = lammps_get_thermo(mliap, "ke"); + EXPECT_NEAR(lj_ke, ml_ke, 1.0e-14); + double lj_press = lammps_get_thermo(ljmelt, "press"); + double ml_press = lammps_get_thermo(mliap, "press"); + EXPECT_NEAR(lj_press, ml_press, 1.0e-14); + + lammps_command(mliap, "shell rm mliap_unified_lj_Ar.pkl"); + lammps_close(ljmelt); + lammps_close(mliap); +} + +} // namespace LAMMPS_NS