Implemented, tested, and documented gather_atoms and variants; added RST docs for lammps_scatter_atoms and lammps_gather_atoms and variants (library.cpp); checked for missing atom map in lammps_gather_atoms_subset; fixed bug in keepstuff.f90; fixed docs for extract_variable
This commit is contained in:
@ -74,6 +74,10 @@ if(CMAKE_Fortran_COMPILER)
|
||||
target_link_libraries(test_fortran_extract_variable PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain)
|
||||
add_test(NAME FortranExtractVariable COMMAND test_fortran_extract_variable)
|
||||
|
||||
add_executable(test_fortran_gather_scatter wrap_gather_scatter.cpp test_fortran_gather_scatter.f90)
|
||||
target_link_libraries(test_fortran_gather_scatter PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain)
|
||||
add_test(NAME FortranGatherScatter COMMAND test_fortran_gather_scatter)
|
||||
|
||||
else()
|
||||
message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler")
|
||||
endif()
|
||||
|
||||
@ -3,24 +3,26 @@ MODULE keepstuff
|
||||
IMPLICIT NONE
|
||||
TYPE(LAMMPS) :: lmp
|
||||
INTEGER :: mycomm
|
||||
CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'region box block 0 $x 0 2 0 2', &
|
||||
'create_box 1 box', &
|
||||
'create_atoms 1 single 1.0 1.0 ${zpos}' ]
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: big_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'region box block 0 $x 0 3 0 4', &
|
||||
'create_box 1 box', &
|
||||
'create_atoms 1 single 1.0 1.0 ${zpos}' ]
|
||||
CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'create_atoms 1 single &', &
|
||||
' 0.2 0.1 0.1' ]
|
||||
CHARACTER(LEN=40), DIMENSION(1), PARAMETER :: more_input = &
|
||||
[ CHARACTER(LEN=40) :: 'create_atoms 1 single 0.5 0.5 0.5' ]
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'pair_style lj/cut 2.5', &
|
||||
'pair_coeff 1 1 1.0 1.0', &
|
||||
'mass 1 1.0' ]
|
||||
'mass 1 2.0' ]
|
||||
END MODULE keepstuff
|
||||
|
||||
|
||||
@ -1,26 +1,7 @@
|
||||
MODULE keepatom
|
||||
USE liblammps
|
||||
TYPE(LAMMPS) :: lmp
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
'region box block 0 $x 0 3 0 4', &
|
||||
'create_box 1 box', &
|
||||
'create_atoms 1 single 1.0 1.0 ${zpos}' ]
|
||||
CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
'create_atoms 1 single &', &
|
||||
' 0.2 0.1 0.1' ]
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'pair_style lj/cut 2.5', &
|
||||
'pair_coeff 1 1 1.0 1.0', &
|
||||
'mass 1 2.0' ]
|
||||
END MODULE keepatom
|
||||
|
||||
FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args")
|
||||
USE ISO_C_BINDING, ONLY: c_ptr
|
||||
USE liblammps
|
||||
USE keepatom, ONLY: lmp
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
TYPE(c_ptr) :: f_lammps_with_args
|
||||
CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = &
|
||||
@ -34,7 +15,7 @@ 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 keepatom, ONLY: lmp
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%close()
|
||||
@ -43,19 +24,18 @@ END SUBROUTINE f_lammps_close
|
||||
|
||||
SUBROUTINE f_lammps_setup_extract_atom () BIND(C)
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp, demo_input, cont_input, pair_input
|
||||
USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%commands_list(demo_input)
|
||||
CALL lmp%commands_list(big_input)
|
||||
CALL lmp%commands_list(cont_input)
|
||||
CALL lmp%commands_list(pair_input)
|
||||
! CALL lmp%command('run 0')
|
||||
END SUBROUTINE f_lammps_setup_extract_atom
|
||||
|
||||
FUNCTION f_lammps_extract_atom_mass () BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
REAL(C_double) :: f_lammps_extract_atom_mass
|
||||
REAL(C_double), DIMENSION(:), POINTER :: mass => NULL()
|
||||
@ -67,7 +47,7 @@ END FUNCTION f_lammps_extract_atom_mass
|
||||
FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(C_int) :: f_lammps_extract_atom_tag_int
|
||||
@ -80,7 +60,7 @@ END FUNCTION f_lammps_extract_atom_tag_int
|
||||
FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int64_t), INTENT(IN), VALUE :: i
|
||||
INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64
|
||||
@ -93,7 +73,7 @@ END FUNCTION f_lammps_extract_atom_tag_int64
|
||||
FUNCTION f_lammps_extract_atom_type(i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(C_int) :: f_lammps_extract_atom_type
|
||||
@ -106,7 +86,7 @@ END FUNCTION f_lammps_extract_atom_type
|
||||
FUNCTION f_lammps_extract_atom_mask(i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(C_int) :: f_lammps_extract_atom_mask
|
||||
@ -119,7 +99,7 @@ END FUNCTION f_lammps_extract_atom_mask
|
||||
SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
REAL(C_double), DIMENSION(3) :: x
|
||||
@ -132,7 +112,7 @@ END SUBROUTINE f_lammps_extract_atom_x
|
||||
SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepatom, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
REAL(C_double), DIMENSION(3) :: v
|
||||
|
||||
@ -1,27 +1,7 @@
|
||||
MODULE keepcompute
|
||||
USE liblammps
|
||||
TYPE(LAMMPS) :: lmp
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
'region box block 0 $x 0 3 0 4', &
|
||||
'create_box 1 box', &
|
||||
'create_atoms 1 single 1.0 1.0 ${zpos}' ]
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = &
|
||||
[ CHARACTER(len=40) :: &
|
||||
'create_atoms 1 single &', &
|
||||
' 0.2 0.1 0.1', &
|
||||
'create_atoms 1 single 0.5 0.5 0.5' ]
|
||||
CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = &
|
||||
[ CHARACTER(LEN=40) :: &
|
||||
'pair_style lj/cut 2.5', &
|
||||
'pair_coeff 1 1 1.0 1.0', &
|
||||
'mass 1 2.0' ]
|
||||
END MODULE keepcompute
|
||||
|
||||
FUNCTION f_lammps_with_args() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_ptr
|
||||
USE liblammps
|
||||
USE keepcompute, ONLY: lmp
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
TYPE(c_ptr) :: f_lammps_with_args
|
||||
CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = &
|
||||
@ -35,7 +15,7 @@ END FUNCTION f_lammps_with_args
|
||||
SUBROUTINE f_lammps_close() BIND(C)
|
||||
USE ISO_C_BINDING, ONLY: c_null_ptr
|
||||
USE liblammps
|
||||
USE keepcompute, ONLY: lmp
|
||||
USE keepstuff, ONLY: lmp
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%close()
|
||||
@ -44,11 +24,12 @@ END SUBROUTINE f_lammps_close
|
||||
|
||||
SUBROUTINE f_lammps_setup_extract_compute () BIND(C)
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp, demo_input, cont_input, pair_input
|
||||
USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input
|
||||
IMPLICIT NONE
|
||||
|
||||
CALL lmp%commands_list(demo_input)
|
||||
CALL lmp%commands_list(big_input)
|
||||
CALL lmp%commands_list(cont_input)
|
||||
CALL lmp%commands_list(more_input)
|
||||
CALL lmp%commands_list(pair_input)
|
||||
CALL lmp%command("compute peratompe all pe/atom") ! per-atom vector
|
||||
call lmp%command("compute stress all stress/atom thermo_temp") ! per-atom array
|
||||
@ -64,7 +45,7 @@ END SUBROUTINE f_lammps_setup_extract_compute
|
||||
FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i
|
||||
REAL(C_double) :: f_lammps_extract_compute_peratom_vector
|
||||
@ -77,7 +58,7 @@ END FUNCTION f_lammps_extract_compute_peratom_vector
|
||||
FUNCTION f_lammps_extract_compute_peratom_array (i,j) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(C_int), INTENT(IN), VALUE :: i, j
|
||||
REAL(C_double) :: f_lammps_extract_compute_peratom_array
|
||||
@ -90,7 +71,7 @@ END FUNCTION f_lammps_extract_compute_peratom_array
|
||||
FUNCTION f_lammps_extract_compute_global_scalar () BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
REAL(C_double) :: f_lammps_extract_compute_global_scalar
|
||||
REAL(C_double), POINTER :: scalar
|
||||
@ -102,7 +83,7 @@ END FUNCTION f_lammps_extract_compute_global_scalar
|
||||
FUNCTION f_lammps_extract_compute_global_vector (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
REAL(C_double) :: f_lammps_extract_compute_global_vector
|
||||
@ -115,7 +96,7 @@ END FUNCTION f_lammps_extract_compute_global_vector
|
||||
FUNCTION f_lammps_extract_compute_global_array (i,j) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i, j
|
||||
REAL(C_double) :: f_lammps_extract_compute_global_array
|
||||
@ -128,7 +109,7 @@ END FUNCTION f_lammps_extract_compute_global_array
|
||||
FUNCTION f_lammps_extract_compute_local_vector (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
REAL(C_double) :: f_lammps_extract_compute_local_vector
|
||||
@ -141,7 +122,7 @@ END FUNCTION f_lammps_extract_compute_local_vector
|
||||
FUNCTION f_lammps_extract_compute_local_array (i, j) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int
|
||||
USE LIBLAMMPS
|
||||
USE keepcompute, ONLY : lmp
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i, j
|
||||
REAL(C_double) :: f_lammps_extract_compute_local_array
|
||||
|
||||
143
unittest/fortran/test_fortran_gather_scatter.f90
Normal file
143
unittest/fortran/test_fortran_gather_scatter.f90
Normal file
@ -0,0 +1,143 @@
|
||||
FUNCTION f_lammps_with_args() BIND(C)
|
||||
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)
|
||||
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_gather_scatter () BIND(C)
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp, big_input, cont_input, more_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(more_input)
|
||||
END SUBROUTINE f_lammps_setup_gather_scatter
|
||||
|
||||
FUNCTION f_lammps_gather_mask (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(c_int) :: f_lammps_gather_mask
|
||||
INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask
|
||||
|
||||
CALL lmp%gather_atoms('mask', 1_c_int, mask)
|
||||
f_lammps_gather_mask = mask(i)
|
||||
END FUNCTION f_lammps_gather_mask
|
||||
|
||||
FUNCTION f_lammps_gather_position (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
REAL(c_double) :: f_lammps_gather_position
|
||||
REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions
|
||||
|
||||
CALL lmp%gather_atoms('x', 3_c_int, positions)
|
||||
f_lammps_gather_position = positions(i)
|
||||
END FUNCTION f_lammps_gather_position
|
||||
|
||||
FUNCTION f_lammps_gather_concat_mask (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(c_int) :: f_lammps_gather_concat_mask
|
||||
INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask, tag
|
||||
INTEGER :: j
|
||||
|
||||
CALL lmp%gather_atoms_concat('mask', 1_c_int, mask)
|
||||
CALL lmp%gather_atoms_concat('id', 1_c_int, tag)
|
||||
DO j = 1, SIZE(tag)
|
||||
IF ( tag(j) == i ) THEN
|
||||
f_lammps_gather_concat_mask = mask(j)
|
||||
RETURN
|
||||
END IF
|
||||
END DO
|
||||
f_lammps_gather_concat_mask = -1
|
||||
END FUNCTION f_lammps_gather_concat_mask
|
||||
|
||||
FUNCTION f_lammps_gather_concat_position (xyz, id) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: id, xyz
|
||||
REAL(c_double) :: f_lammps_gather_concat_position
|
||||
REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions
|
||||
INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: tag
|
||||
INTEGER :: j
|
||||
|
||||
CALL lmp%gather_atoms_concat('x', 3_c_int, positions)
|
||||
CALL lmp%gather_atoms_concat('id', 1_c_int, tag)
|
||||
DO j = 1, SIZE(tag)
|
||||
IF ( tag(j) == id ) THEN
|
||||
f_lammps_gather_concat_position = positions((j-1)*3 + xyz)
|
||||
END IF
|
||||
END DO
|
||||
END FUNCTION f_lammps_gather_concat_position
|
||||
|
||||
FUNCTION f_lammps_gather_subset_mask (i) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: i
|
||||
INTEGER(c_int) :: f_lammps_gather_subset_mask
|
||||
INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask
|
||||
INTEGER :: j
|
||||
INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2]
|
||||
|
||||
CALL lmp%gather_atoms_subset('mask', 1_c_int, tag, mask)
|
||||
DO j = 1, SIZE(tag)
|
||||
IF ( tag(j) == i ) THEN
|
||||
f_lammps_gather_subset_mask = mask(j)
|
||||
RETURN
|
||||
END IF
|
||||
END DO
|
||||
f_lammps_gather_subset_mask = -1
|
||||
END FUNCTION f_lammps_gather_subset_mask
|
||||
|
||||
FUNCTION f_lammps_gather_subset_position (xyz,id) BIND(C)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double
|
||||
USE LIBLAMMPS
|
||||
USE keepstuff, ONLY : lmp
|
||||
IMPLICIT NONE
|
||||
INTEGER(c_int), INTENT(IN), VALUE :: id, xyz
|
||||
REAL(c_double) :: f_lammps_gather_subset_position
|
||||
REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions
|
||||
INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2]
|
||||
INTEGER :: j
|
||||
|
||||
CALL lmp%gather_atoms_subset('x', 3_c_int, tag, positions)
|
||||
DO j = 1, SIZE(tag)
|
||||
IF ( tag(j) == id ) THEN
|
||||
f_lammps_gather_subset_position = positions((j-1)*3 + xyz)
|
||||
RETURN
|
||||
END IF
|
||||
END DO
|
||||
f_lammps_gather_subset_position = -1.0D0
|
||||
END FUNCTION f_lammps_gather_subset_position
|
||||
140
unittest/fortran/wrap_gather_scatter.cpp
Normal file
140
unittest/fortran/wrap_gather_scatter.cpp
Normal file
@ -0,0 +1,140 @@
|
||||
// unit tests for gathering and scattering data from a LAMMPS instance through
|
||||
// the Fortran wrapper
|
||||
|
||||
#include "lammps.h"
|
||||
#include "library.h"
|
||||
#include <mpi.h>
|
||||
#include <string>
|
||||
#include <cstdlib>
|
||||
#include <cstdint>
|
||||
|
||||
#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_gather_scatter();
|
||||
int f_lammps_gather_mask(int);
|
||||
double f_lammps_gather_position(int);
|
||||
int f_lammps_gather_concat_mask(int);
|
||||
double f_lammps_gather_concat_position(int,int);
|
||||
int f_lammps_gather_subset_mask(int);
|
||||
double f_lammps_gather_subset_position(int,int);
|
||||
}
|
||||
|
||||
class LAMMPS_gather_scatter : public ::testing::Test {
|
||||
protected:
|
||||
LAMMPS_NS::LAMMPS *lmp;
|
||||
LAMMPS_gather_scatter() = default;
|
||||
~LAMMPS_gather_scatter() 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_gather_scatter, gather_masks)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
EXPECT_EQ(f_lammps_gather_mask(1), 1);
|
||||
EXPECT_EQ(f_lammps_gather_mask(2), 1);
|
||||
EXPECT_EQ(f_lammps_gather_mask(3), 1);
|
||||
lammps_command(lmp, "group special id 1");
|
||||
lammps_command(lmp, "group other id 2");
|
||||
lammps_command(lmp, "group spiffy id 3");
|
||||
EXPECT_EQ(f_lammps_gather_mask(1), 3);
|
||||
EXPECT_EQ(f_lammps_gather_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_mask(3), 9);
|
||||
lammps_command(lmp, "group other id 1");
|
||||
EXPECT_EQ(f_lammps_gather_mask(1), 7);
|
||||
EXPECT_EQ(f_lammps_gather_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_mask(3), 9);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_gather_scatter, gather_positions)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
EXPECT_EQ(f_lammps_gather_position(1), 1.0);
|
||||
EXPECT_EQ(f_lammps_gather_position(2), 1.0);
|
||||
EXPECT_EQ(f_lammps_gather_position(3), 1.5);
|
||||
EXPECT_EQ(f_lammps_gather_position(4), 0.2);
|
||||
EXPECT_EQ(f_lammps_gather_position(5), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_position(6), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_position(7), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_position(8), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_position(9), 0.5);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_gather_scatter, gather_masks_concat)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(1), 1);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(2), 1);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(3), 1);
|
||||
lammps_command(lmp, "group special id 1");
|
||||
lammps_command(lmp, "group other id 2");
|
||||
lammps_command(lmp, "group spiffy id 3");
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(1), 3);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(3), 9);
|
||||
lammps_command(lmp, "group other id 1");
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(1), 7);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_concat_mask(3), 9);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_gather_scatter, gather_positions_concat)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(1,1), 1.0);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(2,1), 1.0);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(3,1), 1.5);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(1,2), 0.2);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(2,2), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(3,2), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(1,3), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(2,3), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_concat_position(3,3), 0.5);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_gather_scatter, gather_masks_subset)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(2), 1);
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(3), 1);
|
||||
lammps_command(lmp, "group special id 1");
|
||||
lammps_command(lmp, "group other id 2");
|
||||
lammps_command(lmp, "group spiffy id 3");
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(3), 9);
|
||||
lammps_command(lmp, "group other id 3");
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(2), 5);
|
||||
EXPECT_EQ(f_lammps_gather_subset_mask(3), 13);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_gather_scatter, gather_positions_subset)
|
||||
{
|
||||
f_lammps_setup_gather_scatter();
|
||||
// EXPECT_EQ(f_lammps_gather_subset_position(1,1), 1.0);
|
||||
// EXPECT_EQ(f_lammps_gather_subset_position(2,1), 1.0);
|
||||
// EXPECT_EQ(f_lammps_gather_subset_position(3,1), 1.5);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(1,2), 0.2);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(2,2), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(3,2), 0.1);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(1,3), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(2,3), 0.5);
|
||||
EXPECT_EQ(f_lammps_gather_subset_position(3,3), 0.5);
|
||||
};
|
||||
Reference in New Issue
Block a user