implemented create_atoms and encode_image_flags and unit tests for them; added IMGMASK and friends to extract_setting and unit tests for them; wrote documentation for them

This commit is contained in:
Karl Hammond
2022-10-19 18:40:12 -05:00
parent 9a732ba513
commit b51c50294e
7 changed files with 578 additions and 53 deletions

View File

@ -24,7 +24,7 @@ END SUBROUTINE f_lammps_close
SUBROUTINE f_lammps_setup_create_atoms() BIND(C)
USE LIBLAMMPS
USE keepstuff, ONLY : lmp, big_input, cont_input, more_input
USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input
IMPLICIT NONE
!CALL lmp%command('atom_modify map array')
@ -35,7 +35,7 @@ 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 keepstuff, ONLY : lmp, big_input, cont_input, more_input
USE keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(3) :: new_ids, new_images, new_types
@ -46,8 +46,16 @@ SUBROUTINE f_lammps_create_three_atoms() BIND(C)
new_ids = [4, 6, 5]
new_big_ids = [4, 6, 5]
new_images = [0, 0, 1]
new_big_images = [0, 0, 1]
tagint_size = lmp%extract_setting('tagint')
IF ( tagint_size == 4_c_int ) THEN
new_images(1) = lmp%encode_image_flags(1, -1, 3)
new_images(2) = lmp%encode_image_flags(-2, 0, 0)
new_images(3) = lmp%encode_image_flags(-2, -2, 1)
ELSE
new_big_images(1) = lmp%encode_image_flags(1, -1, 3)
new_big_images(2) = lmp%encode_image_flags(-2, 0, 0)
new_big_images(3) = lmp%encode_image_flags(-2, -2, 1)
END IF
new_types = [1, 1, 1]
new_x = [ 1.0_c_double, 1.8_c_double, 2.718281828_c_double, &
0.6_c_double, 0.8_c_double, 2.2_c_double, &
@ -56,7 +64,6 @@ SUBROUTINE f_lammps_create_three_atoms() BIND(C)
0.1_c_double, 0.2_c_double, -0.2_c_double, &
1.0_c_double, -1.0_c_double, 3.0_c_double ]
wrap = .FALSE.
tagint_size = lmp%extract_setting('tagint')
IF ( tagint_size == 4_c_int ) THEN
CALL lmp%create_atoms(new_ids, new_types, new_x, new_v, new_images, wrap)
ELSE
@ -65,4 +72,86 @@ SUBROUTINE f_lammps_create_three_atoms() BIND(C)
END IF
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 keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(2) :: new_types
REAL(c_double), DIMENSION(6) :: new_x
new_types = [1_c_int, 1_c_int]
new_x = [0.1_c_double, 1.9_c_double, 3.8_c_double, &
1.2_c_double, 2.1_c_double, 1.25_c_double]
CALL lmp%create_atoms(type=new_types, x=new_x)
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 keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(2) :: new_types
REAL(c_double), DIMENSION(6) :: new_x
INTEGER(c_int), DIMENSION(2) :: new_id, new_image
new_types = [1_c_int, 1_c_int]
new_x = [0.1_c_double, 1.9_c_double, 3.8_c_double, &
1.2_c_double, 2.1_c_double, 1.25_c_double]
new_id = [8_c_int, 7_c_int]
new_image(1) = lmp%encode_image_flags(1,0,0)
new_image(2) = lmp%encode_image_flags(-1,0,0)
CALL lmp%create_atoms(id=new_id, image=new_image, type=new_types, x=new_x)
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 keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(2) :: new_types
REAL(c_double), DIMENSION(6) :: new_x
INTEGER(c_int64_t), DIMENSION(2) :: new_id, new_image
new_types = [1_c_int, 1_c_int]
new_x = [0.1_c_double, 1.9_c_double, 3.8_c_double, &
1.2_c_double, 2.1_c_double, 1.25_c_double]
new_id = [8_c_int64_t, 7_c_int64_t]
new_image(1) = lmp%encode_image_flags(1,0,0)
new_image(2) = lmp%encode_image_flags(-1,0,0)
CALL lmp%create_atoms(id=new_id, image=new_image, type=new_types, x=new_x)
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 keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(2) :: new_types
REAL(c_double), DIMENSION(6) :: new_x
INTEGER(c_int), DIMENSION(2) :: new_id
new_types = [1_c_int, 1_c_int]
new_x = [0.1_c_double, 1.9_c_double, 3.8_c_double, &
1.2_c_double, 2.1_c_double, 1.25_c_double]
new_id = [8_c_int, 7_c_int]
CALL lmp%create_atoms(id=new_id, type=new_types, x=new_x)
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 keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), DIMENSION(2) :: new_types
REAL(c_double), DIMENSION(6) :: new_x
INTEGER(c_int64_t), DIMENSION(2) :: new_id
new_types = [1_c_int, 1_c_int]
new_x = [0.1_c_double, 1.9_c_double, 3.8_c_double, &
1.2_c_double, 2.1_c_double, 1.25_c_double]
new_id = [8_c_int64_t, 7_c_int64_t]
CALL lmp%create_atoms(id=new_id, type=new_types, x=new_x)
END SUBROUTINE f_lammps_create_two_more_big2
! vim: ts=2 sts=2 sw=2 et

View File

@ -29,7 +29,7 @@ FUNCTION f_lammps_get_mpi_comm() BIND(C)
END FUNCTION f_lammps_get_mpi_comm
FUNCTION f_lammps_extract_setting(Cstr) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char, c_null_char
USE keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
@ -39,7 +39,7 @@ FUNCTION f_lammps_extract_setting(Cstr) BIND(C)
CHARACTER(LEN=:), ALLOCATABLE :: Fstr
i = 1
DO WHILE (Cstr(i) /= ACHAR(0))
DO WHILE (Cstr(i) /= c_null_char)
i = i + 1
END DO
strlen = i
@ -66,7 +66,8 @@ FUNCTION f_lammps_has_error() BIND(C)
END FUNCTION f_lammps_has_error
FUNCTION f_lammps_get_last_error_message(errmesg, errlen) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char, c_ptr, C_F_POINTER
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char, c_ptr, C_F_POINTER, &
c_null_char
USE keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
@ -83,7 +84,29 @@ FUNCTION f_lammps_get_last_error_message(errmesg, errlen) BIND(C)
! and copy to C style string
DO i=1, errlen
errmesg(i) = buffer(i:i)
IF (buffer(i:i) == ACHAR(0)) EXIT
IF (buffer(i:i) == c_null_char) EXIT
END DO
DEALLOCATE(buffer)
END FUNCTION f_lammps_get_last_error_message
FUNCTION f_lammps_get_image_flags_int(ix, iy, iz) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int
USE keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), INTENT(IN), VALUE :: ix, iy, iz
INTEGER(c_int) :: f_lammps_get_image_flags_int
f_lammps_get_image_flags_int = lmp%encode_image_flags(ix, iy, iz)
END FUNCTION f_lammps_get_image_flags_int
FUNCTION f_lammps_get_image_flags_bigint(ix, iy, iz) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_int64_t
USE keepstuff, ONLY : lmp
USE LIBLAMMPS
IMPLICIT NONE
INTEGER(c_int), INTENT(IN), VALUE :: ix, iy, iz
INTEGER(c_int64_t) :: f_lammps_get_image_flags_bigint
f_lammps_get_image_flags_bigint = lmp%encode_image_flags(ix, iy, iz)
END FUNCTION f_lammps_get_image_flags_bigint

View File

@ -16,6 +16,11 @@ void *f_lammps_with_args();
void f_lammps_close();
void f_lammps_setup_create_atoms();
void f_lammps_create_three_atoms();
void f_lammps_create_two_more();
void f_lammps_create_two_more_small();
void f_lammps_create_two_more_big();
void f_lammps_create_two_more_small2();
void f_lammps_create_two_more_big2();
}
class LAMMPS_create_atoms : public ::testing::Test {
@ -41,7 +46,7 @@ protected:
}
};
TEST_F(LAMMPS_create_atoms, create_two)
TEST_F(LAMMPS_create_atoms, create_three)
{
f_lammps_setup_create_atoms();
#ifdef LAMMPS_BIGBIG
@ -61,7 +66,7 @@ TEST_F(LAMMPS_create_atoms, create_two)
EXPECT_EQ(lmp->atom->nlocal, 6);
for (int i = 0; i < lmp->atom->nlocal; i++) {
if (tag[i] == 4) {
EXPECT_EQ(image[i],0);
EXPECT_EQ(image[i],lammps_encode_image_flags(1,-1,3));
EXPECT_DOUBLE_EQ(x[i][0],1.0);
EXPECT_DOUBLE_EQ(x[i][1],1.8);
EXPECT_DOUBLE_EQ(x[i][2],2.718281828);
@ -70,7 +75,7 @@ TEST_F(LAMMPS_create_atoms, create_two)
EXPECT_DOUBLE_EQ(v[i][2],-1.0);
}
if (tag[i] == 5) {
EXPECT_EQ(image[i],1);
EXPECT_EQ(image[i],lammps_encode_image_flags(-2,-2,1));
EXPECT_DOUBLE_EQ(x[i][0],1.8);
EXPECT_DOUBLE_EQ(x[i][1],0.1);
EXPECT_DOUBLE_EQ(x[i][2],1.8);
@ -79,7 +84,7 @@ TEST_F(LAMMPS_create_atoms, create_two)
EXPECT_DOUBLE_EQ(v[i][2],3.0);
}
if (tag[i] == 6) {
EXPECT_EQ(image[i],0);
EXPECT_EQ(image[i],lammps_encode_image_flags(-2,0,0));
EXPECT_DOUBLE_EQ(x[i][0],0.6);
EXPECT_DOUBLE_EQ(x[i][1],0.8);
EXPECT_DOUBLE_EQ(x[i][2],2.2);
@ -89,3 +94,134 @@ TEST_F(LAMMPS_create_atoms, create_two)
}
}
};
TEST_F(LAMMPS_create_atoms, create_two_more)
{
f_lammps_setup_create_atoms();
#ifdef LAMMPS_BIGBIG
int64_t *tag, *image;
#else
int *tag, *image;
#endif
int *type;
double **x, **v;
f_lammps_create_three_atoms();
EXPECT_EQ(lmp->atom->nlocal, 6);
f_lammps_create_two_more();
EXPECT_EQ(lmp->atom->nlocal, 8);
tag = lmp->atom->tag;
image = lmp->atom->image;
x = lmp->atom->x;
v = lmp->atom->v;
type = lmp->atom->type;
for (int i = 0; i < lmp->atom->nlocal; i++) {
if (tag[i] == 7) {
EXPECT_EQ(image[i],lammps_encode_image_flags(0,0,0));
EXPECT_DOUBLE_EQ(x[i][0],0.1);
EXPECT_DOUBLE_EQ(x[i][1],1.9);
EXPECT_DOUBLE_EQ(x[i][2],3.8);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
if (tag[i] == 8) {
EXPECT_EQ(image[i],lammps_encode_image_flags(0,0,0));
EXPECT_DOUBLE_EQ(x[i][0],1.2);
EXPECT_DOUBLE_EQ(x[i][1],2.1);
EXPECT_DOUBLE_EQ(x[i][2],1.25);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
}
};
TEST_F(LAMMPS_create_atoms, create_two_more_bigsmall)
{
f_lammps_setup_create_atoms();
#ifdef LAMMPS_BIGBIG
int64_t *tag, *image;
#else
int *tag, *image;
#endif
int *type;
double **x, **v;
f_lammps_create_three_atoms();
EXPECT_EQ(lmp->atom->nlocal, 6);
#ifdef LAMMPS_BIGBIG
f_lammps_create_two_more_big();
#else
f_lammps_create_two_more_small();
#endif
EXPECT_EQ(lmp->atom->nlocal, 8);
tag = lmp->atom->tag;
image = lmp->atom->image;
x = lmp->atom->x;
v = lmp->atom->v;
type = lmp->atom->type;
for (int i = 0; i < lmp->atom->nlocal; i++) {
if (tag[i] == 7) {
EXPECT_EQ(image[i],lammps_encode_image_flags(-1,0,0));
EXPECT_DOUBLE_EQ(x[i][0],1.2);
EXPECT_DOUBLE_EQ(x[i][1],2.1);
EXPECT_DOUBLE_EQ(x[i][2],1.25);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
if (tag[i] == 8) {
EXPECT_EQ(image[i],lammps_encode_image_flags(1,0,0));
EXPECT_DOUBLE_EQ(x[i][0],0.1);
EXPECT_DOUBLE_EQ(x[i][1],1.9);
EXPECT_DOUBLE_EQ(x[i][2],3.8);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
}
};
TEST_F(LAMMPS_create_atoms, create_two_more_bigsmall2)
{
f_lammps_setup_create_atoms();
#ifdef LAMMPS_BIGBIG
int64_t *tag, *image;
#else
int *tag, *image;
#endif
int *type;
double **x, **v;
f_lammps_create_three_atoms();
EXPECT_EQ(lmp->atom->nlocal, 6);
#ifdef LAMMPS_BIGBIG
f_lammps_create_two_more_big2();
#else
f_lammps_create_two_more_small2();
#endif
EXPECT_EQ(lmp->atom->nlocal, 8);
tag = lmp->atom->tag;
image = lmp->atom->image;
x = lmp->atom->x;
v = lmp->atom->v;
type = lmp->atom->type;
for (int i = 0; i < lmp->atom->nlocal; i++) {
if (tag[i] == 7) {
EXPECT_EQ(image[i],lammps_encode_image_flags(0,0,0));
EXPECT_DOUBLE_EQ(x[i][0],1.2);
EXPECT_DOUBLE_EQ(x[i][1],2.1);
EXPECT_DOUBLE_EQ(x[i][2],1.25);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
if (tag[i] == 8) {
EXPECT_EQ(image[i],lammps_encode_image_flags(0,0,0));
EXPECT_DOUBLE_EQ(x[i][0],0.1);
EXPECT_DOUBLE_EQ(x[i][1],1.9);
EXPECT_DOUBLE_EQ(x[i][2],3.8);
EXPECT_DOUBLE_EQ(v[i][0],0.0);
EXPECT_DOUBLE_EQ(v[i][1],0.0);
EXPECT_DOUBLE_EQ(v[i][2],0.0);
}
}
};

View File

@ -3,6 +3,7 @@
#include "lammps.h"
#include "library.h"
#include <cstdint>
#include <string>
#include "gmock/gmock.h"
@ -18,6 +19,8 @@ int f_lammps_get_mpi_comm();
int f_lammps_extract_setting(const char *);
int f_lammps_has_error();
int f_lammps_get_last_error_message(char *, int);
int f_lammps_get_image_flags_int(int, int, int);
int64_t f_lammps_get_image_flags_bigint(int, int, int);
}
namespace LAMMPS_NS {
@ -85,9 +88,17 @@ TEST_F(LAMMPS_properties, extract_setting)
#if defined(LAMMPS_BIGBIG)
EXPECT_EQ(f_lammps_extract_setting("tagint"), 8);
EXPECT_EQ(f_lammps_extract_setting("imageint"), 8);
EXPECT_EQ(f_lammps_extract_setting("IMGMASK"), 2097151);
EXPECT_EQ(f_lammps_extract_setting("IMGMAX"), 1048576);
EXPECT_EQ(f_lammps_extract_setting("IMGBITS"), 21);
EXPECT_EQ(f_lammps_extract_setting("IMG2BITS"), 42);
#else
EXPECT_EQ(f_lammps_extract_setting("tagint"), 4);
EXPECT_EQ(f_lammps_extract_setting("imageint"), 4);
EXPECT_EQ(f_lammps_extract_setting("IMGMASK"), 1023);
EXPECT_EQ(f_lammps_extract_setting("IMGMAX"), 512);
EXPECT_EQ(f_lammps_extract_setting("IMGBITS"), 10);
EXPECT_EQ(f_lammps_extract_setting("IMG2BITS"), 20);
#endif
EXPECT_EQ(f_lammps_extract_setting("box_exist"), 0);
@ -141,4 +152,24 @@ TEST_F(LAMMPS_properties, has_error)
EXPECT_EQ(err, 0);
EXPECT_THAT(errmsg, ContainsRegex(" "));
};
TEST_F(LAMMPS_properties, get_image_flags)
{
#ifdef LAMMPS_BIGBIG
int64_t image = f_lammps_get_image_flags_bigint(0,0,0);
int64_t Cimage = lammps_encode_image_flags(0,0,0);
EXPECT_EQ(image, Cimage);
image = f_lammps_get_image_flags_bigint(1,-1,1);
Cimage = lammps_encode_image_flags(1,-1,1);
EXPECT_EQ(image, Cimage);
#else
int image = f_lammps_get_image_flags_int(0,0,0);
int Cimage = lammps_encode_image_flags(0,0,0);
EXPECT_EQ(image, Cimage);
image = f_lammps_get_image_flags_int(1,-1,1);
Cimage = lammps_encode_image_flags(1,-1,1);
EXPECT_EQ(image, Cimage);
#endif
}
} // namespace LAMMPS_NS