From 7ec7745640d9f14e2ddb08a422b1bef912a44fca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 May 2025 05:21:18 -0400 Subject: [PATCH] make neighbor list settings, status, and bond/angle/dihedral/improper lists available to library interface --- src/library.cpp | 77 +++++++++++++++++++ src/neighbor.cpp | 2 +- .../c-library/test_library_properties.cpp | 39 +++++++++- 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 1e4243c59d..ad2699b41c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1255,6 +1255,7 @@ be called without a valid LAMMPS object handle (it is ignored). * :ref:`Image masks ` * :ref:`System status ` * :ref:`System sizes ` +* :ref:`Neigbor list settings ` * :ref:`Atom style flags ` .. _extract_integer_sizes: @@ -1395,6 +1396,31 @@ internally by the :doc:`Fortran interface ` and are not likely to be us * - nbodies - number of atoms that have body data (see :doc:`the Body particle HowTo `) +.. _extract_neighbor_settings: + +**Neigbor list settings** + +.. list-table:: + :header-rows: 1 + :widths: 17 83 + + * - neigh_every + - neighbor lists are rebuild every this many steps + * - neigh_delay + - neighbor lists are rebuild delayed this many steps + * - neigh_dist_check + - 0 if always rebuild, 1 rebuild after 1/2 skin + * - neigh_ago + - neighbor lists were rebuilt this many steps ago + * - nbondlist + - number of entries in bondlist (get list with :ref:`lammps_extract_global() `) + * - nanglelist + - number of entries in anglelist (get list with :ref:`lammps_extract_global() `) + * - ndihedrallist + - number of entries in dihedrallist (get list with :ref:`lammps_extract_global() `) + * - nimproperlist + - number of entries in improperlist (get list with :ref:`lammps_extract_global() `) + .. _extract_atom_flags: **Atom style flags** @@ -1484,6 +1510,15 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"ntris") == 0) return lmp->atom->ntris; if (strcmp(keyword,"nbodies") == 0) return lmp->atom->nbodies; + if (strcmp(keyword,"neigh_every") == 0) return lmp->neighbor->every; + if (strcmp(keyword,"neigh_delay") == 0) return lmp->neighbor->delay; + if (strcmp(keyword,"neigh_dist_check") == 0) return lmp->neighbor->dist_check; + if (strcmp(keyword,"neigh_ago") == 0) return lmp->neighbor->ago; + if (strcmp(keyword,"nbondlist") == 0) return lmp->neighbor->nbondlist; + if (strcmp(keyword,"nanglelist") == 0) return lmp->neighbor->nanglelist; + if (strcmp(keyword,"ndihedrallist") == 0) return lmp->neighbor->ndihedrallist; + if (strcmp(keyword,"nimproperlist") == 0) return lmp->neighbor->nimproperlist; + if (strcmp(keyword,"molecule_flag") == 0) return lmp->atom->molecule_flag; if (strcmp(keyword,"q_flag") == 0) return lmp->atom->q_flag; if (strcmp(keyword,"mu_flag") == 0) return lmp->atom->mu_flag; @@ -1567,6 +1602,11 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name) if (strcmp(name,"special_lj") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"special_coul") == 0) return LAMMPS_DOUBLE; + if (strcmp(name,"neigh_bondlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_anglelist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_dihedrallist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_improperlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"map_style") == 0) return LAMMPS_INT; #if defined(LAMMPS_BIGBIG) if (strcmp(name,"map_tag_max") == 0) return LAMMPS_BIGINT; @@ -1651,6 +1691,7 @@ report the "native" data type. The following tables are provided: * :ref:`Timestep settings ` * :ref:`Simulation box settings ` * :ref:`System property settings ` +* :ref:`Neighbor topology data ` * :ref:`Git revision and version settings ` * :ref:`Unit settings ` @@ -1897,6 +1938,37 @@ report the "native" data type. The following tables are provided: - 1 - string with the current KSpace style. +.. _extract_neighbor_lists: + +**Neighbor topology data** + +Get length of lists with :ref:`lammps_extract_setting() `. + +.. list-table:: + :header-rows: 1 + :widths: 20 12 16 52 + + * - Name + - Type + - Length + - Description + * - neigh_bondlist + - 2d int + - nbondlist + - list of bonds (atom1, atom2, type) + * - neigh_anglelist + - 2d int + - nanglelist + - list of angles (atom1, atom2, atom3, type) + * - neigh_dihedrallist + - 2d int + - ndihedrallist + - list of dihedrals (atom1, atom2, atom3, atom4, type) + * - neigh_improperlist + - 2d int + - nimproperlist + - list of impropers (atom1, atom2, atom3, atom4, type) + .. _extract_git_settings: **Git revision and version settings** @@ -2107,6 +2179,11 @@ void *lammps_extract_global(void *handle, const char *name) if (strcmp(name,"q_flag") == 0) return (void *) &lmp->atom->q_flag; + if (strcmp(name,"neigh_bondlist") == 0) return lmp->neighbor->bondlist; + if (strcmp(name,"neigh_anglelist") == 0) return lmp->neighbor->anglelist; + if (strcmp(name,"neigh_dihedrallist") == 0) return lmp->neighbor->dihedrallist; + if (strcmp(name,"neigh_improperlist") == 0) return lmp->neighbor->improperlist; + if (strcmp(name,"map_style") == 0) return (void *) &lmp->atom->map_style; if (strcmp(name,"map_tag_max") == 0) return (void *) &lmp->atom->map_tag_max; if (strcmp(name,"sametag") == 0) return (void *) lmp->atom->sametag; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index a2aa3f411b..fcedfd7613 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -188,8 +188,8 @@ pairclass(nullptr), pairnames(nullptr), pairmasks(nullptr) // topology lists + nbondlist = nanglelist = ndihedrallist = nimproperlist = 0; bondwhich = anglewhich = dihedralwhich = improperwhich = NONE; - neigh_bond = nullptr; neigh_angle = nullptr; neigh_dihedral = nullptr; diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 3878b13774..e2149d98e6 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -303,6 +303,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), -1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -313,7 +322,7 @@ TEST_F(LibraryProperties, setting) std::string input = path_join(INPUT_DIR, "in.fourmol"); if (!verbose) ::testing::internal::CaptureStdout(); lammps_file(lmp, input.c_str()); - lammps_command(lmp, "run 2 post no"); + lammps_command(lmp, "run 3 post no"); if (!verbose) ::testing::internal::GetCapturedStdout(); EXPECT_EQ(lammps_extract_setting(lmp, "triclinic"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "box_exist"), 1); @@ -328,6 +337,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 5); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 24); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 30); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 31); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -584,17 +602,36 @@ TEST_F(LibraryProperties, neighlist) EXPECT_DOUBLE_EQ(minval, 1.0); EXPECT_DOUBLE_EQ(maxval, 2.1); + char errbuf[128]; + lammps_set_show_error(lmp, 0); const int nlocal = lammps_extract_setting(lmp, "nlocal"); EXPECT_EQ(nlocal, numatoms); EXPECT_NE(lammps_find_pair_neighlist(lmp, "sw", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "morse", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 1, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 2, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[69] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_pair_neighlist(): Pair style lj/cut does not exist")); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "hybrid/overlay", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_compute_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_fix_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_compute_neighlist(lmp, "xxx", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[66] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_compute_neighlist(): Compute xxx does not exist")); // full neighbor list for 4 type 1 atoms // all have 3 type 1 atom neighbors