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