(git:34ef472)
transport_env_types.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief CP2K transport environment and related C-interoperable types
10 !> \par History
11 !> 05.2013 created C-interoperable matrices [Hossein Bani-Hashemian]
12 !> 07.2013 created transport_env [Hossein Bani-Hashemian]
13 !> 11.2014 revised into CSR matrices [Hossein Bani-Hashemian]
14 !> 12.2014 merged csr_interop and transport [Hossein Bani-Hashemian]
15 !> \author Mohammad Hossein Bani-Hashemian
16 ! **************************************************************************************************
18 
19  USE iso_c_binding, ONLY: &
20  c_associated, c_bool, c_double, c_funptr, c_f_pointer, c_int, c_null_funptr, c_null_ptr, &
21  c_ptr
22  USE dbcsr_api, ONLY: dbcsr_csr_destroy,&
23  dbcsr_csr_type,&
24  dbcsr_deallocate_matrix,&
25  dbcsr_release,&
26  dbcsr_type
27  USE kinds, ONLY: dp
28 #include "./base/base_uses.f90"
29 
30  IMPLICIT NONE
31 
32  PRIVATE
33 
34  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'transport_env_types'
35 
36  PUBLIC :: transport_env_type, cp2k_transport_parameters
37  PUBLIC :: cp2k_csr_interop_type
38 
39 ! DO NOT change the ORDERING or the NAMES in the following data type
40  TYPE, BIND(C) :: cp2k_transport_parameters
41  INTEGER(C_INT) :: n_occ
42  INTEGER(C_INT) :: n_atoms
43  REAL(C_DOUBLE) :: energy_diff
44  REAL(C_DOUBLE) :: evoltfactor
45  REAL(C_DOUBLE) :: e_charge
46  REAL(C_DOUBLE) :: boltzmann
47  REAL(C_DOUBLE) :: h_bar
48  INTEGER(C_INT) :: iscf
49  INTEGER(C_INT) :: method
50  INTEGER(C_INT) :: qt_formalism
51  INTEGER(C_INT) :: injection_method
52  INTEGER(C_INT) :: rlaxis_integration_method
53  INTEGER(C_INT) :: linear_solver
54  INTEGER(C_INT) :: matrixinv_method
55  INTEGER(C_INT) :: transport_neutral
56  INTEGER(C_INT) :: num_pole
57  INTEGER(C_INT) :: ordering
58  INTEGER(C_INT) :: row_ordering
59  INTEGER(C_INT) :: verbosity
60  INTEGER(C_INT) :: pexsi_np_symb_fact
61  INTEGER(C_INT) :: n_kpoint
62  INTEGER(C_INT) :: num_interval
63  INTEGER(C_INT) :: num_contacts
64  INTEGER(C_INT) :: stride_contacts
65  INTEGER(C_INT) :: tasks_per_energy_point
66  INTEGER(C_INT) :: tasks_per_pole
67  INTEGER(C_INT) :: gpus_per_point
68  INTEGER(C_INT) :: n_points_beyn
69  INTEGER(C_INT) :: ncrc_beyn
70  INTEGER(C_INT) :: tasks_per_integration_point
71  INTEGER(C_INT) :: n_points_inv
72  INTEGER(C_INT) :: cutout(2)
73  REAL(C_DOUBLE) :: colzero_threshold
74  REAL(C_DOUBLE) :: eps_limit
75  REAL(C_DOUBLE) :: eps_limit_cc
76  REAL(C_DOUBLE) :: eps_decay
77  REAL(C_DOUBLE) :: eps_singularity_curvatures
78  REAL(C_DOUBLE) :: eps_mu
79  REAL(C_DOUBLE) :: eps_eigval_degen
80  REAL(C_DOUBLE) :: eps_fermi
81  REAL(C_DOUBLE) :: energy_interval
82  REAL(C_DOUBLE) :: min_interval
83  REAL(C_DOUBLE) :: temperature
84  REAL(C_DOUBLE) :: dens_mixing
85  REAL(C_DOUBLE) :: n_rand_beyn
86  REAL(C_DOUBLE) :: n_rand_cc_beyn
87  REAL(C_DOUBLE) :: svd_cutoff
88  TYPE(C_PTR) :: contacts_data
89  TYPE(C_PTR) :: nsgf
90  TYPE(C_PTR) :: zeff
91  LOGICAL(C_BOOL) :: obc_equilibrium
92  LOGICAL(C_BOOL) :: extra_scf
94 
95  TYPE transport_env_type
96  TYPE(C_FUNPTR) :: ext_c_method_ptr = c_null_funptr
97  TYPE(cp2k_transport_parameters) :: params
98  TYPE(dbcsr_type) :: template_matrix_sym
99  TYPE(dbcsr_type) :: template_matrix_nosym
100  TYPE(dbcsr_type) :: csr_sparsity
101  TYPE(dbcsr_type), POINTER :: dm_imag => null()
102  TYPE(dbcsr_csr_type) :: s_matrix
103  TYPE(dbcsr_csr_type) :: ks_matrix
104  TYPE(dbcsr_csr_type) :: p_matrix
105  TYPE(dbcsr_csr_type) :: imagp_matrix
106  LOGICAL :: csr_screening
107  INTEGER, DIMENSION(:), POINTER :: contacts_data => null()
108  INTEGER, DIMENSION(:), POINTER :: nsgf => null()
109  REAL(dp), DIMENSION(:), POINTER :: zeff => null()
110  END TYPE transport_env_type
111 
112 ! DO NOT change the ORDERING or the NAMES in the following data type
113  TYPE, BIND(C) :: cp2k_csr_interop_type
114  INTEGER(C_INT) :: nrows_total
115  INTEGER(C_INT) :: ncols_total
116  INTEGER(C_INT) :: nze_total
117  INTEGER(C_INT) :: nze_local
118  INTEGER(C_INT) :: nrows_local
119  INTEGER(C_INT) :: data_type
120  INTEGER(C_INT) :: first_row
121  TYPE(C_PTR) :: rowptr_local
122  TYPE(C_PTR) :: colind_local
123  TYPE(C_PTR) :: nzerow_local
124  TYPE(C_PTR) :: nzvals_local
125  END TYPE cp2k_csr_interop_type
126 
127  PUBLIC :: csr_interop_nullify, &
129  PUBLIC :: transport_env_release
130 
131 CONTAINS
132 
133 ! **************************************************************************************************
134 !> \brief releases the transport_env
135 !> \param[inout] transport_env the transport_env to be released
136 !> \author Mohammad Hossein Bani-Hashemian
137 ! **************************************************************************************************
138  SUBROUTINE transport_env_release(transport_env)
139  TYPE(transport_env_type), POINTER :: transport_env
140 
141  CHARACTER(len=*), PARAMETER :: routinen = 'transport_env_release'
142 
143  INTEGER :: handle
144 
145  CALL timeset(routinen, handle)
146 
147  cpassert(ASSOCIATED(transport_env))
148 
149  IF (c_associated(transport_env%ext_c_method_ptr)) THEN
150  CALL dbcsr_csr_destroy(transport_env%s_matrix)
151  CALL dbcsr_csr_destroy(transport_env%ks_matrix)
152  CALL dbcsr_csr_destroy(transport_env%p_matrix)
153  CALL dbcsr_csr_destroy(transport_env%imagp_matrix)
154  CALL dbcsr_release(transport_env%template_matrix_sym)
155  CALL dbcsr_release(transport_env%template_matrix_nosym)
156  CALL dbcsr_release(transport_env%csr_sparsity)
157  CALL dbcsr_deallocate_matrix(transport_env%dm_imag)
158  END IF
159 
160  transport_env%ext_c_method_ptr = c_null_funptr
161 
162  IF (ASSOCIATED(transport_env%contacts_data)) DEALLOCATE (transport_env%contacts_data)
163  IF (ASSOCIATED(transport_env%nsgf)) DEALLOCATE (transport_env%nsgf)
164  IF (ASSOCIATED(transport_env%zeff)) DEALLOCATE (transport_env%zeff)
165 
166  DEALLOCATE (transport_env)
167 
168  CALL timestop(handle)
169 
170  END SUBROUTINE transport_env_release
171 
172 ! **************************************************************************************************
173 !> \brief nullifies (and zeroizes) a C-interoperable CSR matrix
174 !> \param[inout] csr_interop_mat the matrix to be nullified
175 !> \author Mohammad Hossein Bani-Hashemian
176 ! **************************************************************************************************
177  SUBROUTINE csr_interop_nullify(csr_interop_mat)
178 
179  TYPE(cp2k_csr_interop_type), INTENT(INOUT) :: csr_interop_mat
180 
181  CHARACTER(LEN=*), PARAMETER :: routinen = 'csr_interop_nullify'
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 
234  INTEGER :: handle
235 
236  CALL timeset(routinen, handle)
237 
238  IF (PRESENT(nrows_total)) nrows_total = csr_interop_mat%nrows_total
239  IF (PRESENT(ncols_total)) ncols_total = csr_interop_mat%ncols_total
240  IF (PRESENT(nze_local)) nze_local = csr_interop_mat%nze_local
241  IF (PRESENT(nze_total)) nze_total = csr_interop_mat%nze_total
242  IF (PRESENT(nrows_local)) nrows_local = csr_interop_mat%nrows_local
243  IF (PRESENT(data_type)) data_type = csr_interop_mat%data_type
244  IF (PRESENT(first_row)) first_row = csr_interop_mat%first_row
245 
246  IF (PRESENT(rowptr_local)) CALL c_f_pointer(csr_interop_mat%rowptr_local, rowptr_local, [nrows_local + 1])
247  IF (PRESENT(colind_local)) CALL c_f_pointer(csr_interop_mat%colind_local, colind_local, [nze_local])
248  IF (PRESENT(nzerow_local)) CALL c_f_pointer(csr_interop_mat%nzerow_local, nzerow_local, [nrows_local])
249  IF (PRESENT(nzvals_local)) CALL c_f_pointer(csr_interop_mat%nzvals_local, nzvals_local, [nze_local])
250 
251  CALL timestop(handle)
252 
253  END SUBROUTINE csr_interop_matrix_get_info
254 
255 END MODULE transport_env_types
256 
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
CP2K transport environment and related C-interoperable types.
subroutine, public csr_interop_nullify(csr_interop_mat)
nullifies (and zeroizes) a C-interoperable CSR matrix
subroutine, public transport_env_release(transport_env)
releases the transport_env
subroutine, public csr_interop_matrix_get_info(csr_interop_mat, nrows_total, ncols_total, nze_local, nze_total, nrows_local, data_type, first_row, rowptr_local, colind_local, nzerow_local, nzvals_local)
gets the fields of a C-interoperable CSR matrix
CP2K's C-interoperable CSR matrix This definition matches the respective type definition in the trans...
Definition: libcp2k.h:268
Transport parameters read from a CP2K input file. This definition matches the respective type definit...
Definition: libcp2k.h:208