add extract_pair_dimension and extract_pair for fortran module
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user