1!--------------------------------------------------------------------------------------------------! 2! CP2K: A general program to perform molecular dynamics simulations ! 3! Copyright (C) 2000 - 2019 CP2K developers group ! 4!--------------------------------------------------------------------------------------------------! 5 6! ************************************************************************************************** 7!> \brief CP2K transport environment and related C-interoperable types 8!> \par History 9!> 05.2013 created C-interoperable matrices [Hossein Bani-Hashemian] 10!> 07.2013 created transport_env [Hossein Bani-Hashemian] 11!> 11.2014 revised into CSR matrices [Hossein Bani-Hashemian] 12!> 12.2014 merged csr_interop and transport [Hossein Bani-Hashemian] 13!> \author Mohammad Hossein Bani-Hashemian 14! ************************************************************************************************** 15MODULE transport_env_types 16 17 USE ISO_C_BINDING, ONLY: & 18 C_ASSOCIATED, C_BOOL, C_DOUBLE, C_FUNPTR, C_F_POINTER, C_INT, C_NULL_FUNPTR, C_NULL_PTR, & 19 C_PTR 20 USE dbcsr_api, ONLY: dbcsr_csr_destroy,& 21 dbcsr_csr_type,& 22 dbcsr_deallocate_matrix,& 23 dbcsr_release,& 24 dbcsr_type 25 USE kinds, ONLY: dp 26#include "./base/base_uses.f90" 27 28 IMPLICIT NONE 29 30 PRIVATE 31 32 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'transport_env_types' 33 34 PUBLIC :: transport_env_type, cp2k_transport_parameters 35 PUBLIC :: cp2k_csr_interop_type 36 37! DO NOT change the ORDERING or the NAMES in the following data type 38 TYPE, BIND(C) :: cp2k_transport_parameters 39 INTEGER(C_INT) :: n_occ 40 INTEGER(C_INT) :: n_atoms 41 REAL(C_DOUBLE) :: energy_diff 42 REAL(C_DOUBLE) :: evoltfactor 43 REAL(C_DOUBLE) :: e_charge 44 REAL(C_DOUBLE) :: boltzmann 45 REAL(C_DOUBLE) :: h_bar 46 INTEGER(C_INT) :: iscf 47 INTEGER(C_INT) :: method 48 INTEGER(C_INT) :: qt_formalism 49 INTEGER(C_INT) :: injection_method 50 INTEGER(C_INT) :: rlaxis_integration_method 51 INTEGER(C_INT) :: linear_solver 52 INTEGER(C_INT) :: matrixinv_method 53 INTEGER(C_INT) :: transport_neutral 54 INTEGER(C_INT) :: num_pole 55 INTEGER(C_INT) :: ordering 56 INTEGER(C_INT) :: row_ordering 57 INTEGER(C_INT) :: verbosity 58 INTEGER(C_INT) :: pexsi_np_symb_fact 59 INTEGER(C_INT) :: n_kpoint 60 INTEGER(C_INT) :: num_interval 61 INTEGER(C_INT) :: num_contacts 62 INTEGER(C_INT) :: stride_contacts 63 INTEGER(C_INT) :: tasks_per_energy_point 64 INTEGER(C_INT) :: tasks_per_pole 65 INTEGER(C_INT) :: gpus_per_point 66 INTEGER(C_INT) :: n_points_beyn 67 INTEGER(C_INT) :: ncrc_beyn 68 INTEGER(C_INT) :: tasks_per_integration_point 69 INTEGER(C_INT) :: n_points_inv 70 INTEGER(C_INT) :: cutout(2) 71 REAL(C_DOUBLE) :: colzero_threshold 72 REAL(C_DOUBLE) :: eps_limit 73 REAL(C_DOUBLE) :: eps_limit_cc 74 REAL(C_DOUBLE) :: eps_decay 75 REAL(C_DOUBLE) :: eps_singularity_curvatures 76 REAL(C_DOUBLE) :: eps_mu 77 REAL(C_DOUBLE) :: eps_eigval_degen 78 REAL(C_DOUBLE) :: eps_fermi 79 REAL(C_DOUBLE) :: energy_interval 80 REAL(C_DOUBLE) :: min_interval 81 REAL(C_DOUBLE) :: temperature 82 REAL(C_DOUBLE) :: dens_mixing 83 REAL(C_DOUBLE) :: n_rand_beyn 84 REAL(C_DOUBLE) :: n_rand_cc_beyn 85 REAL(C_DOUBLE) :: svd_cutoff 86 TYPE(C_PTR) :: contacts_data 87 TYPE(C_PTR) :: nsgf 88 TYPE(C_PTR) :: zeff 89 LOGICAL(C_BOOL) :: obc_equilibrium 90 LOGICAL(C_BOOL) :: extra_scf 91 END TYPE cp2k_transport_parameters 92 93 TYPE transport_env_type 94 TYPE(C_FUNPTR) :: ext_c_method_ptr = C_NULL_FUNPTR 95 TYPE(cp2k_transport_parameters) :: params 96 TYPE(dbcsr_type) :: template_matrix_sym 97 TYPE(dbcsr_type) :: template_matrix_nosym 98 TYPE(dbcsr_type) :: csr_sparsity 99 TYPE(dbcsr_type), POINTER :: dm_imag => NULL() 100 TYPE(dbcsr_csr_type) :: s_matrix 101 TYPE(dbcsr_csr_type) :: ks_matrix 102 TYPE(dbcsr_csr_type) :: p_matrix 103 TYPE(dbcsr_csr_type) :: imagp_matrix 104 LOGICAL :: csr_screening 105 INTEGER, DIMENSION(:), POINTER :: contacts_data => NULL() 106 INTEGER, DIMENSION(:), POINTER :: nsgf => NULL() 107 REAL(dp), DIMENSION(:), POINTER :: zeff => NULL() 108 END TYPE transport_env_type 109 110! DO NOT change the ORDERING or the NAMES in the following data type 111 TYPE, BIND(C) :: cp2k_csr_interop_type 112 INTEGER(C_INT) :: nrows_total 113 INTEGER(C_INT) :: ncols_total 114 INTEGER(C_INT) :: nze_total 115 INTEGER(C_INT) :: nze_local 116 INTEGER(C_INT) :: nrows_local 117 INTEGER(C_INT) :: data_type 118 INTEGER(C_INT) :: first_row 119 TYPE(C_PTR) :: rowptr_local 120 TYPE(C_PTR) :: colind_local 121 TYPE(C_PTR) :: nzerow_local 122 TYPE(C_PTR) :: nzvals_local 123 ENDTYPE cp2k_csr_interop_type 124 125 PUBLIC :: csr_interop_nullify, & 126 csr_interop_matrix_get_info 127 PUBLIC :: transport_env_release 128 129CONTAINS 130 131! ************************************************************************************************** 132!> \brief releases the transport_env 133!> \param[inout] transport_env the transport_env to be released 134!> \author Mohammad Hossein Bani-Hashemian 135! ************************************************************************************************** 136 SUBROUTINE transport_env_release(transport_env) 137 TYPE(transport_env_type), POINTER :: transport_env 138 139 CHARACTER(len=*), PARAMETER :: routineN = 'transport_env_release', & 140 routineP = moduleN//':'//routineN 141 142 INTEGER :: handle 143 144 CALL timeset(routineN, handle) 145 146 CPASSERT(ASSOCIATED(transport_env)) 147 148 IF (C_ASSOCIATED(transport_env%ext_c_method_ptr)) THEN 149 CALL dbcsr_csr_destroy(transport_env%s_matrix) 150 CALL dbcsr_csr_destroy(transport_env%ks_matrix) 151 CALL dbcsr_csr_destroy(transport_env%p_matrix) 152 CALL dbcsr_csr_destroy(transport_env%imagp_matrix) 153 CALL dbcsr_release(transport_env%template_matrix_sym) 154 CALL dbcsr_release(transport_env%template_matrix_nosym) 155 CALL dbcsr_release(transport_env%csr_sparsity) 156 CALL dbcsr_deallocate_matrix(transport_env%dm_imag) 157 END IF 158 159 transport_env%ext_c_method_ptr = C_NULL_FUNPTR 160 161 IF (ASSOCIATED(transport_env%contacts_data)) DEALLOCATE (transport_env%contacts_data) 162 IF (ASSOCIATED(transport_env%nsgf)) DEALLOCATE (transport_env%nsgf) 163 IF (ASSOCIATED(transport_env%zeff)) DEALLOCATE (transport_env%zeff) 164 165 DEALLOCATE (transport_env) 166 167 CALL timestop(handle) 168 169 END SUBROUTINE transport_env_release 170 171! ************************************************************************************************** 172!> \brief nullifies (and zeroizes) a C-interoperable CSR matrix 173!> \param[inout] csr_interop_mat the matrix to be nullified 174!> \author Mohammad Hossein Bani-Hashemian 175! ************************************************************************************************** 176 SUBROUTINE csr_interop_nullify(csr_interop_mat) 177 178 TYPE(cp2k_csr_interop_type), INTENT(INOUT) :: csr_interop_mat 179 180 CHARACTER(LEN=*), PARAMETER :: routineN = 'csr_interop_nullify', & 181 routineP = moduleN//':'//routineN 182 183 INTEGER :: handle 184 185 CALL timeset(routineN, handle) 186 187 csr_interop_mat%nrows_total = 0 188 csr_interop_mat%ncols_total = 0 189 csr_interop_mat%nze_total = 0 190 csr_interop_mat%nze_local = 0 191 csr_interop_mat%nrows_local = 0 192 csr_interop_mat%data_type = 0 193 csr_interop_mat%first_row = 0 194 csr_interop_mat%rowptr_local = C_NULL_PTR 195 csr_interop_mat%colind_local = C_NULL_PTR 196 csr_interop_mat%nzerow_local = C_NULL_PTR 197 csr_interop_mat%nzvals_local = C_NULL_PTR 198 199 CALL timestop(handle) 200 201 END SUBROUTINE csr_interop_nullify 202 203! ************************************************************************************************** 204!> \brief gets the fields of a C-interoperable CSR matrix 205!> \param[in] csr_interop_mat C-interoperable CSR matrix 206!> \param[out] nrows_total total number of rows 207!> \param[out] ncols_total total number of columns 208!> \param[out] nze_local number of local nonzero elements 209!> \param[out] nze_total total number of nonzero elements 210!> \param[out] nrows_local number of local rows 211!> \param[out] data_type data type 212!> \param[out] first_row index of the first row (C indexing) 213!> \param[out] rowptr_local row pointer (local - Fortran indexing) 214!> \param[out] colind_local column index (local - Fortran indexing) 215!> \param[out] nzerow_local number of nunzeros per row (index-i, local - Fortran indexing) 216!> \param[out] nzvals_local nonzero elements (local) 217!> \author Mohammad Hossein Bani-Hashemian 218! ************************************************************************************************** 219 SUBROUTINE csr_interop_matrix_get_info(csr_interop_mat, & 220 nrows_total, ncols_total, nze_local, nze_total, nrows_local, data_type, & 221 first_row, rowptr_local, colind_local, nzerow_local, nzvals_local) 222 223 TYPE(cp2k_csr_interop_type), INTENT(IN) :: csr_interop_mat 224 INTEGER, INTENT(OUT), OPTIONAL :: nrows_total, ncols_total, nze_local, & 225 nze_total, nrows_local, data_type, & 226 first_row 227 INTEGER, DIMENSION(:), INTENT(OUT), OPTIONAL, & 228 POINTER :: rowptr_local, colind_local, nzerow_local 229 REAL(dp), DIMENSION(:), INTENT(OUT), OPTIONAL, & 230 POINTER :: nzvals_local 231 232 CHARACTER(LEN=*), PARAMETER :: routineN = 'csr_interop_matrix_get_info', & 233 routineP = moduleN//':'//routineN 234 235 INTEGER :: handle 236 237 CALL timeset(routineN, handle) 238 239 IF (PRESENT(nrows_total)) nrows_total = csr_interop_mat%nrows_total 240 IF (PRESENT(ncols_total)) ncols_total = csr_interop_mat%ncols_total 241 IF (PRESENT(nze_local)) nze_local = csr_interop_mat%nze_local 242 IF (PRESENT(nze_total)) nze_total = csr_interop_mat%nze_total 243 IF (PRESENT(nrows_local)) nrows_local = csr_interop_mat%nrows_local 244 IF (PRESENT(data_type)) data_type = csr_interop_mat%data_type 245 IF (PRESENT(first_row)) first_row = csr_interop_mat%first_row 246 247 IF (PRESENT(rowptr_local)) CALL C_F_POINTER(csr_interop_mat%rowptr_local, rowptr_local, [nrows_local + 1]) 248 IF (PRESENT(colind_local)) CALL C_F_POINTER(csr_interop_mat%colind_local, colind_local, [nze_local]) 249 IF (PRESENT(nzerow_local)) CALL C_F_POINTER(csr_interop_mat%nzerow_local, nzerow_local, [nrows_local]) 250 IF (PRESENT(nzvals_local)) CALL C_F_POINTER(csr_interop_mat%nzvals_local, nzvals_local, [nze_local]) 251 252 CALL timestop(handle) 253 254 END SUBROUTINE csr_interop_matrix_get_info 255 256END MODULE transport_env_types 257 258