Implemented lmp_gather_bonds, lmp_find_*_neighlist, lmp_neighlist_num_elements, and their unit tests and documentation
This commit is contained in:
@ -86,6 +86,10 @@ if(CMAKE_Fortran_COMPILER)
|
||||
target_link_libraries(test_fortran_configuration PRIVATE flammps lammps MPI::MPI_Fortran GTest::GMockMain)
|
||||
add_test(NAME FortranConfiguration COMMAND test_fortran_configuration)
|
||||
|
||||
add_executable(test_fortran_neighlist wrap_neighlist.cpp test_fortran_neighlist.f90)
|
||||
target_link_libraries(test_fortran_neighlist PRIVATE flammps lammps MPI::MPI_Fortran GTest::GMockMain)
|
||||
add_test(NAME FortranNeighlist COMMAND test_fortran_neighlist)
|
||||
|
||||
else()
|
||||
message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler")
|
||||
endif()
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
FUNCTION f_lammps_with_args() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_ptr
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
@ -13,7 +13,7 @@ FUNCTION f_lammps_with_args() BIND(C)
|
||||
END FUNCTION f_lammps_with_args
|
||||
|
||||
SUBROUTINE f_lammps_close() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_null_ptr
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_null_ptr
|
||||
USE liblammps
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
@ -34,7 +34,7 @@ SUBROUTINE f_lammps_setup_create_atoms() BIND(C)
|
||||
END SUBROUTINE f_lammps_setup_create_atoms
|
||||
|
||||
SUBROUTINE f_lammps_create_three_atoms() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
@ -73,7 +73,7 @@ SUBROUTINE f_lammps_create_three_atoms() BIND(C)
|
||||
END SUBROUTINE f_lammps_create_three_atoms
|
||||
|
||||
SUBROUTINE f_lammps_create_two_more() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
@ -87,7 +87,7 @@ SUBROUTINE f_lammps_create_two_more() BIND(C)
|
||||
END SUBROUTINE f_lammps_create_two_more
|
||||
|
||||
SUBROUTINE f_lammps_create_two_more_small() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
@ -105,7 +105,7 @@ SUBROUTINE f_lammps_create_two_more_small() BIND(C)
|
||||
END SUBROUTINE f_lammps_create_two_more_small
|
||||
|
||||
SUBROUTINE f_lammps_create_two_more_big() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
@ -123,7 +123,7 @@ SUBROUTINE f_lammps_create_two_more_big() BIND(C)
|
||||
END SUBROUTINE f_lammps_create_two_more_big
|
||||
|
||||
SUBROUTINE f_lammps_create_two_more_small2() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
@ -139,7 +139,7 @@ SUBROUTINE f_lammps_create_two_more_small2() BIND(C)
|
||||
END SUBROUTINE f_lammps_create_two_more_small2
|
||||
|
||||
SUBROUTINE f_lammps_create_two_more_big2() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double, c_int, c_int64_t
|
||||
USE keepstuff, ONLY : lmp
|
||||
USE LIBLAMMPS
|
||||
IMPLICIT NONE
|
||||
|
||||
86
unittest/fortran/test_fortran_neighlist.f90
Normal file
86
unittest/fortran/test_fortran_neighlist.f90
Normal file
@ -0,0 +1,86 @@
|
||||
FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args")
|
||||
USE ISO_C_BINDING, ONLY: c_ptr
|
||||
USE liblammps
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
TYPE(c_ptr) :: f_lammps_with_args
|
||||
CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = &
|
||||
[ CHARACTER(len=12) :: 'liblammps', '-log', 'none', &
|
||||
'-echo','screen','-nocite','-var','zpos','1.5','-var','x','2']
|
||||
|
||||
lmp = lammps(args)
|
||||
f_lammps_with_args = lmp%handle
|
||||
END FUNCTION f_lammps_with_args
|
||||
|
||||
SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close")
|
||||
USE ISO_C_BINDING, ONLY: c_null_ptr
|
||||
USE liblammps
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%close()
|
||||
lmp%handle = c_null_ptr
|
||||
END SUBROUTINE f_lammps_close
|
||||
|
||||
SUBROUTINE f_lammps_setup_neigh_tests() BIND(C)
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%command('atom_modify map array')
|
||||
CALL lmp%commands_list(big_input)
|
||||
CALL lmp%commands_list(cont_input)
|
||||
CALL lmp%commands_list(pair_input)
|
||||
CALL lmp%command('compute c all rdf 100')
|
||||
! We create one of the fixes that requests a neighbor list, none of which
|
||||
! is part of LAMMPS without additional packages; as such, we only do this
|
||||
! if REPLICA is included
|
||||
IF (lmp%config_has_package('REPLICA')) THEN
|
||||
CALL lmp%command('fix f all hyper/global 1.0 0.3 0.8 300.0')
|
||||
CALL lmp%command('compute event all event/displace 1.0')
|
||||
CALL lmp%command('hyper 0 100 f event') ! using "run 0" here segfaults (?)
|
||||
ELSE
|
||||
CALL lmp%command('run 0 post no') ! otherwise neighlists won't be requested
|
||||
END IF
|
||||
END SUBROUTINE f_lammps_setup_neigh_tests
|
||||
|
||||
FUNCTION f_lammps_pair_neighlist_test() BIND(C) RESULT(nlist_id)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int) :: nlist_id
|
||||
|
||||
nlist_id = lmp%find_pair_neighlist('lj/cut',.TRUE., 0, 0)
|
||||
END FUNCTION f_lammps_pair_neighlist_test
|
||||
|
||||
FUNCTION f_lammps_fix_neighlist_test() BIND(C) RESULT(nlist_id)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int) :: nlist_id
|
||||
|
||||
nlist_id = lmp%find_fix_neighlist('f',0)
|
||||
END FUNCTION f_lammps_fix_neighlist_test
|
||||
|
||||
FUNCTION f_lammps_compute_neighlist_test() BIND(C) RESULT(nlist_id)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int) :: nlist_id
|
||||
|
||||
nlist_id = lmp%find_compute_neighlist('c',0)
|
||||
END FUNCTION f_lammps_compute_neighlist_test
|
||||
|
||||
FUNCTION f_lammps_neighlist_num_elements(id) BIND(C) RESULT(nelements)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: id
|
||||
INTEGER(c_int) :: nelements
|
||||
|
||||
nelements = lmp%neighlist_num_elements(id)
|
||||
END FUNCTION f_lammps_neighlist_num_elements
|
||||
123
unittest/fortran/wrap_neighlist.cpp
Normal file
123
unittest/fortran/wrap_neighlist.cpp
Normal file
@ -0,0 +1,123 @@
|
||||
// unit tests for accessing neighbor lists in a LAMMPS instance through the Fortran wrapper
|
||||
|
||||
#include "lammps.h"
|
||||
#include "library.h"
|
||||
#include "force.h"
|
||||
#include "modify.h"
|
||||
#include "neighbor.h"
|
||||
#include "neigh_list.h"
|
||||
#include "info.h"
|
||||
//#include <cstdint>
|
||||
//#include <cstdlib>
|
||||
#include <mpi.h>
|
||||
#include <string>
|
||||
|
||||
#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_neigh_tests();
|
||||
int f_lammps_pair_neighlist_test();
|
||||
int f_lammps_fix_neighlist_test();
|
||||
int f_lammps_compute_neighlist_test();
|
||||
int f_lammps_neighlist_num_elements(int);
|
||||
}
|
||||
|
||||
namespace LAMMPS_NS {
|
||||
|
||||
class LAMMPS_neighbors : public ::testing::Test {
|
||||
protected:
|
||||
LAMMPS_NS::LAMMPS *lmp;
|
||||
LAMMPS_neighbors() = default;
|
||||
~LAMMPS_neighbors() 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_neighbors, pair)
|
||||
{
|
||||
f_lammps_setup_neigh_tests();
|
||||
int pair_neighlist = f_lammps_pair_neighlist_test();
|
||||
Pair *pair = lmp->force->pair_match("lj/cut",1,0);
|
||||
int index = -2;
|
||||
if (pair != nullptr) {
|
||||
for (int i = 0; i < lmp->neighbor->nlist; i++) {
|
||||
NeighList *list = lmp->neighbor->lists[i];
|
||||
if ((list->requestor_type == NeighList::PAIR)
|
||||
and (pair == list->requestor)
|
||||
and (list->id == 0)) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(index, pair_neighlist);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_neighbors, fix)
|
||||
{
|
||||
if (not Info::has_package("REPLICA")) GTEST_SKIP();
|
||||
f_lammps_setup_neigh_tests();
|
||||
auto fix = lmp->modify->get_fix_by_id("f");
|
||||
EXPECT_NE(fix, nullptr);
|
||||
int ilist = -2;
|
||||
for (int i = 0; i < lmp->neighbor->nlist; i++) {
|
||||
NeighList *list = lmp->neighbor->lists[i];
|
||||
if ( (list->requestor_type == NeighList::FIX)
|
||||
and (fix == list->requestor) and (list->id == 0) ) {
|
||||
ilist = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(ilist, f_lammps_fix_neighlist_test());
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_neighbors, compute)
|
||||
{
|
||||
f_lammps_setup_neigh_tests();
|
||||
auto compute = lmp->modify->get_compute_by_id("c");
|
||||
EXPECT_NE(compute,nullptr);
|
||||
int ilist = -2;
|
||||
for (int i=0; i < lmp->neighbor->nlist; i++) {
|
||||
NeighList *list = lmp->neighbor->lists[i];
|
||||
if ( (list->requestor_type == NeighList::COMPUTE)
|
||||
and (compute == list->requestor) and (list->id == 0) ) {
|
||||
ilist = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(ilist, f_lammps_compute_neighlist_test());
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_neighbors, numelements)
|
||||
{
|
||||
f_lammps_setup_neigh_tests();
|
||||
int num_neigh = 0;
|
||||
int pair_id = f_lammps_pair_neighlist_test();
|
||||
num_neigh = f_lammps_neighlist_num_elements(pair_id);
|
||||
EXPECT_EQ(num_neigh, lammps_neighlist_num_elements(lmp, pair_id));
|
||||
if (Info::has_package("REPLICA")) {
|
||||
int fix_id = f_lammps_fix_neighlist_test();
|
||||
num_neigh = f_lammps_neighlist_num_elements(fix_id);
|
||||
EXPECT_EQ(num_neigh, lammps_neighlist_num_elements(lmp, fix_id));
|
||||
}
|
||||
int compute_id = f_lammps_compute_neighlist_test();
|
||||
num_neigh = f_lammps_neighlist_num_elements(compute_id);
|
||||
EXPECT_EQ(num_neigh, lammps_neighlist_num_elements(lmp, compute_id));
|
||||
};
|
||||
|
||||
} // LAMMPS_NS
|
||||
Reference in New Issue
Block a user