make Force::special_lj and Force::special_coul accessible through the library interface

This commit is contained in:
Axel Kohlmeyer
2023-03-15 18:39:32 -04:00
parent 88c8781396
commit fa9062a87e
4 changed files with 41 additions and 1 deletions

View File

@ -814,7 +814,8 @@ class lammps(object):
# set length of vector for items that are not a scalar
vec_dict = { 'boxlo':3, 'boxhi':3, 'sublo':3, 'subhi':3,
'sublo_lambda':3, 'subhi_lambda':3, 'periodicity':3 }
'sublo_lambda':3, 'subhi_lambda':3, 'periodicity':3,
'special_lj':4, 'special_coul':4 }
if name in vec_dict:
veclen = vec_dict[name]
elif name == 'respa_dt':

View File

@ -1232,6 +1232,8 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name)
if (strcmp(name,"nghost") == 0) return LAMMPS_INT;
if (strcmp(name,"nmax") == 0) return LAMMPS_INT;
if (strcmp(name,"ntypes") == 0) return LAMMPS_INT;
if (strcmp(name,"special_lj") == 0) return LAMMPS_DOUBLE;
if (strcmp(name,"special_coul") == 0) return LAMMPS_DOUBLE;
if (strcmp(name,"q_flag") == 0) return LAMMPS_INT;
@ -1470,6 +1472,14 @@ report the "native" data type. The following tables are provided:
- int
- 1
- maximum of nlocal+nghost across all MPI ranks (for per-atom data array size).
* - special_lj
- double
- 4
- special :doc:`pair weighting factors <special_bonds>` for LJ interactions (first element is always 1.0)
* - special_coul
- double
- 4
- special :doc:`pair weighting factors <special_bonds>` for Coulomb interactions (first element is always 1.0)
* - q_flag
- int
- 1
@ -1625,6 +1635,8 @@ void *lammps_extract_global(void *handle, const char *name)
if (strcmp(name,"nlocal") == 0) return (void *) &lmp->atom->nlocal;
if (strcmp(name,"nghost") == 0) return (void *) &lmp->atom->nghost;
if (strcmp(name,"nmax") == 0) return (void *) &lmp->atom->nmax;
if (strcmp(name,"special_lj") == 0) return (void *) lmp->force->special_lj;
if (strcmp(name,"special_coul") == 0) return (void *) lmp->force->special_coul;
if (strcmp(name,"q_flag") == 0) return (void *) &lmp->atom->q_flag;

View File

@ -297,6 +297,7 @@ TEST_F(LibraryProperties, global)
std::string input = path_join(INPUT_DIR, "in.fourmol");
if (!verbose) ::testing::internal::CaptureStdout();
lammps_command(lmp, "special_bonds lj 0.0 0.5 0.8 coul 0.1 0.5 1.0");
lammps_file(lmp, input.c_str());
lammps_command(lmp, "run 2 post no");
if (!verbose) ::testing::internal::GetCapturedStdout();
@ -321,6 +322,26 @@ TEST_F(LibraryProperties, global)
EXPECT_EQ(lammps_extract_global_datatype(lmp, "dt"), LAMMPS_DOUBLE);
double *d_ptr = (double *)lammps_extract_global(lmp, "dt");
EXPECT_DOUBLE_EQ((*d_ptr), 0.1);
EXPECT_EQ(lammps_extract_global_datatype(lmp, "special_lj"), LAMMPS_DOUBLE);
EXPECT_EQ(lammps_extract_global_datatype(lmp, "special_coul"), LAMMPS_DOUBLE);
double *special_lj = (double *)lammps_extract_global(lmp, "special_lj");
double *special_coul= (double *)lammps_extract_global(lmp, "special_coul");
EXPECT_DOUBLE_EQ(special_lj[0], 1.0);
EXPECT_DOUBLE_EQ(special_lj[1], 0.0);
EXPECT_DOUBLE_EQ(special_lj[2], 0.5);
EXPECT_DOUBLE_EQ(special_lj[3], 0.8);
EXPECT_DOUBLE_EQ(special_coul[0], 1.0);
EXPECT_DOUBLE_EQ(special_coul[1], 0.1);
EXPECT_DOUBLE_EQ(special_coul[2], 0.5);
EXPECT_DOUBLE_EQ(special_coul[3], 1.0);
lammps_command(lmp, "special_bonds lj/coul 1.0 1.0 1.0");
EXPECT_DOUBLE_EQ(special_lj[1], 1.0);
EXPECT_DOUBLE_EQ(special_lj[2], 1.0);
EXPECT_DOUBLE_EQ(special_lj[3], 1.0);
EXPECT_DOUBLE_EQ(special_coul[1], 1.0);
EXPECT_DOUBLE_EQ(special_coul[2], 1.0);
EXPECT_DOUBLE_EQ(special_coul[3], 1.0);
};
TEST_F(LibraryProperties, neighlist)

View File

@ -536,6 +536,7 @@ create_atoms 1 single &
def test_extract_global(self):
self.lmp.command("region box block -1 1 -2 2 -3 3")
self.lmp.command("create_box 1 box")
self.lmp.command("special_bonds lj 0.0 0.5 0.8 coul 0.1 0.5 1.0")
self.assertEqual(self.lmp.extract_global("units"), "lj")
self.assertEqual(self.lmp.extract_global("ntimestep"), 0)
self.assertEqual(self.lmp.extract_global("dt"), 0.005)
@ -552,10 +553,15 @@ create_atoms 1 single &
self.assertEqual(self.lmp.extract_global("subhi"), [1.0, 2.0, 3.0])
self.assertEqual(self.lmp.extract_global("periodicity"), [1,1,1])
self.assertEqual(self.lmp.extract_global("triclinic"), 0)
self.assertEqual(self.lmp.extract_global("special_lj"), [1.0, 0.0, 0.5, 0.8])
self.assertEqual(self.lmp.extract_global("special_coul"), [1.0, 0.1, 0.5, 1.0])
self.assertEqual(self.lmp.extract_global("sublo_lambda"), None)
self.assertEqual(self.lmp.extract_global("subhi_lambda"), None)
self.assertEqual(self.lmp.extract_global("respa_levels"), None)
self.assertEqual(self.lmp.extract_global("respa_dt"), None)
self.lmp.command("special_bonds lj/coul 0.0 1.0 1.0")
self.assertEqual(self.lmp.extract_global("special_lj"), [1.0, 0.0, 1.0, 1.0])
self.assertEqual(self.lmp.extract_global("special_coul"), [1.0, 0.0, 1.0, 1.0])
# set and initialize r-RESPA
self.lmp.command("run_style respa 3 5 2 pair 2 kspace 3")