add extract_pair_dimension and extract_pair for fortran module

This commit is contained in:
Axel Kohlmeyer
2024-07-18 07:39:15 -04:00
parent 85beac7107
commit 3b022e86db

View File

@ -113,6 +113,8 @@ MODULE LIBLAMMPS
PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm
PROCEDURE :: extract_setting => lmp_extract_setting
PROCEDURE :: extract_global => lmp_extract_global
PROCEDURE :: extract_pair_dimension => lmp_extract_pair_dimension
PROCEDURE :: extract_pair => lmp_extract_pair
PROCEDURE, PRIVATE :: lmp_map_atom_int
PROCEDURE, PRIVATE :: lmp_map_atom_big
GENERIC :: map_atom => lmp_map_atom_int, lmp_map_atom_big
@ -511,6 +513,20 @@ MODULE LIBLAMMPS
TYPE(c_ptr) :: lammps_extract_global
END FUNCTION lammps_extract_global
FUNCTION lammps_extract_pair_dimension(handle,name) BIND(C)
IMPORT :: c_ptr, c_int
IMPLICIT NONE
TYPE(c_ptr), INTENT(IN), VALUE :: handle, name
INTEGER(c_int) :: lammps_extract_pair_dimension
END FUNCTION lammps_extract_pair_dimension
FUNCTION lammps_extract_pair(handle, name) BIND(C)
IMPORT :: c_ptr
IMPLICIT NONE
TYPE(c_ptr), INTENT(IN), VALUE :: handle, name
TYPE(c_ptr) :: lammps_extract_pair
END FUNCTION lammps_extract_pair
FUNCTION lammps_map_atom(handle, tag) BIND(C)
IMPORT :: c_ptr, c_int
IMPLICIT NONE
@ -1333,6 +1349,55 @@ CONTAINS
END SELECT
END FUNCTION
! equivalent function to lammps_extract_pair_dimension
FUNCTION lmp_extract_pair_dimension(self, name) RESULT(dim)
CLASS(lammps), INTENT(IN), TARGET :: self
CHARACTER(LEN=*), INTENT(IN) :: name
INTEGER(c_int) :: dim
TYPE(c_ptr) :: Cname
Cname = f2c_string(name)
dim = lammps_extract_pair_dimension(self%handle, Cname)
CALL lammps_free(Cname)
END FUNCTION
! equivalent function to lammps_extract_pair
! the assignment is actually overloaded so as to bind the pointers to
! lammps data based on the information available from LAMMPS
FUNCTION lmp_extract_pair(self, name) RESULT(pair_data)
CLASS(lammps), INTENT(IN), TARGET :: self
CHARACTER(LEN=*), INTENT(IN) :: name
TYPE(lammps_data) :: pair_data
INTEGER(c_int) :: dim
TYPE(c_ptr) :: Cname, Cptr
INTEGER(c_size_t) :: length
! Determine extracted arrays length and dimension
length = lmp_extract_setting(self, 'ntypes') + 1
Cname = f2c_string(name)
dim = lammps_extract_pair_dimension(self%handle, Cname)
! above could be c_null_ptr in place of self%handle...doesn't matter
Cptr = lammps_extract_pair(self%handle, Cname)
CALL lammps_free(Cname)
pair_data%lammps_instance => self
SELECT CASE (dim)
CASE (0)
pair_data%datatype = DATA_DOUBLE
CALL C_F_POINTER(Cptr, pair_data%r64)
CASE (1)
pair_data%datatype = DATA_DOUBLE_1D
CALL C_F_POINTER(Cptr, pair_data%r64_vec, [length])
CASE (2)
pair_data%datatype = DATA_DOUBLE_2D
CALL C_F_POINTER(Cptr, pair_data%r64_mat, [length, length])
CASE (-1)
CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, &
'Unknown property ' // name // ' in extract_pair')
END SELECT
END FUNCTION
! equivalent function to lammps_map_atom (for 32-bit integer tags)
INTEGER FUNCTION lmp_map_atom_int(self, id)
CLASS(lammps), INTENT(IN) :: self