Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Types and basic routines needed for a kpoint calculation
10 : !> \par History
11 : !> 2014.07 created [JGH]
12 : !> 2014.11 unified k-point and gamma-point code [Ole Schuett]
13 : !> \author JGH
14 : ! **************************************************************************************************
15 : MODULE kpoint_types
16 : USE cp_blacs_env, ONLY: cp_blacs_env_release,&
17 : cp_blacs_env_type
18 : USE cp_cfm_types, ONLY: cp_cfm_release,&
19 : cp_cfm_type
20 : USE cp_fm_types, ONLY: cp_fm_release,&
21 : cp_fm_type
22 : USE cp_log_handling, ONLY: cp_get_default_logger,&
23 : cp_logger_get_default_unit_nr,&
24 : cp_logger_type
25 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
26 : cp_print_key_unit_nr
27 : USE input_cp2k_kpoints, ONLY: use_complex_wfn,&
28 : use_real_wfn
29 : USE input_section_types, ONLY: section_vals_get,&
30 : section_vals_type,&
31 : section_vals_val_get
32 : USE kinds, ONLY: default_string_length,&
33 : dp
34 : USE mathconstants, ONLY: twopi
35 : USE message_passing, ONLY: mp_para_env_release,&
36 : mp_para_env_type
37 : USE physcon, ONLY: angstrom
38 : USE qs_diis_types, ONLY: qs_diis_b_release_kp,&
39 : qs_diis_buffer_type_kp
40 : USE qs_matrix_pools, ONLY: mpools_release,&
41 : qs_matrix_pools_type
42 : USE qs_mo_types, ONLY: deallocate_mo_set,&
43 : mo_set_type
44 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
45 : USE string_utilities, ONLY: uppercase
46 : #include "./base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 :
50 : PRIVATE
51 :
52 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
53 :
54 : PUBLIC :: kpoint_type
55 : PUBLIC :: kpoint_create, kpoint_release, get_kpoint_info, set_kpoint_info
56 : PUBLIC :: read_kpoint_section, write_kpoint_info
57 : PUBLIC :: kpoint_env_type, kpoint_env_p_type
58 : PUBLIC :: kpoint_env_create, get_kpoint_env
59 : PUBLIC :: kind_rotmat_type
60 : PUBLIC :: kpoint_sym_type
61 : PUBLIC :: kpoint_sym_create
62 :
63 : ! **************************************************************************************************
64 : !> \brief Keeps information about a specific k-point
65 : !> \param nkpoint the kpoint index
66 : !> \param wkp weight of this kpoint
67 : !> \param xkp kpoint coordinates in units of b-vector
68 : !> \param is_local if this kpoint is calculated on a single thread
69 : !> \param mos associated MOs (r/i,spin)
70 : !> \param pmat associated density matrix (r/i,spin)
71 : !> \param wmat associated energy weighted density matrix (r/i,spin)
72 : !> \param smat associated overlap matrix (for ADMM) (r/i,spin)
73 : !> \param amat associated ADMM basis projection matrix (r/i,spin)
74 : !> \param shalf S(K)^(1/2) DFT+U Lowdin method (real wfn)
75 : !> \param cshalf S(K)^(1/2) DFT+U Lowdin method (complex wfn)
76 : !> \author JGH
77 : ! **************************************************************************************************
78 : TYPE kpoint_env_type
79 : INTEGER :: nkpoint = -1
80 : REAL(KIND=dp) :: wkp = 0.0_dp
81 : REAL(KIND=dp), DIMENSION(3) :: xkp = 0.0_dp
82 : LOGICAL :: is_local = .FALSE.
83 : TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos => NULL()
84 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: pmat => NULL()
85 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: wmat => NULL()
86 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: smat => NULL()
87 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: amat => NULL()
88 : TYPE(cp_fm_type) :: shalf
89 : TYPE(cp_cfm_type) :: cshalf
90 : END TYPE kpoint_env_type
91 :
92 : TYPE kpoint_env_p_type
93 : TYPE(kpoint_env_type), POINTER :: kpoint_env => NULL()
94 : END TYPE kpoint_env_p_type
95 :
96 : ! **************************************************************************************************
97 : !> \brief Rotation matrices for basis sets
98 : !> \param rmat atom basis function rotation matrix
99 : !> \author JGH
100 : ! **************************************************************************************************
101 : TYPE kind_rotmat_type
102 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: rmat => NULL()
103 : END TYPE kind_rotmat_type
104 :
105 : ! **************************************************************************************************
106 : !> \brief Keeps symmetry information about a specific k-point
107 : !> \param apply_symmetry ...
108 : !> \param nwght kpoint multiplicity
109 : !> \param xkp kpoint coordinates
110 : !> \param rot rotation matrices
111 : !> \param f0 atom permutation
112 : !> \author JGH
113 : ! **************************************************************************************************
114 : TYPE kpoint_sym_type
115 : LOGICAL :: apply_symmetry = .FALSE.
116 : INTEGER :: nwght = -1
117 : INTEGER :: nwred = -1
118 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => NULL()
119 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: rot => NULL()
120 : INTEGER, DIMENSION(:), POINTER :: rotp => NULL()
121 : INTEGER, DIMENSION(:, :), POINTER :: f0 => NULL()
122 : END TYPE kpoint_sym_type
123 :
124 : TYPE kpoint_sym_p_type
125 : TYPE(kpoint_sym_type), POINTER :: kpoint_sym => NULL()
126 : END TYPE kpoint_sym_p_type
127 :
128 : ! **************************************************************************************************
129 : !> \brief Contains information about kpoints
130 : !> \par History
131 : !> 2014.07 created [JGH]
132 : !> \param kp_scheme [input] Type of kpoint grid
133 : !> \param nkp_grid [input] Grid points
134 : !> \param kp_shift [input] Shift of the grid
135 : !> \param use_real_wfn [input] real/complex wfn
136 : !> \param symmetry [input] use symmetry (atoms) to reduce kpoints
137 : !> \param full_grid [input] don't reduce kpoints at all
138 : !> \param verbose [input] more output information
139 : !> \param eps_geo [input] accuracy of atom symmetry detection
140 : !> \param parallel_group_size [input] kpoint group size
141 : !> \param nkp number of kpoints
142 : !> \param xkp kpoint coordinates
143 : !> \param wkp kpoint weights
144 : !> \param para_env 'global' parallel environment
145 : !> \param para_env_kp parallel environment of the kpoint calculation
146 : !> \param para_env_inter_kp parallel environment between kpoints
147 : !> \param iogrp this kpoint group has the IO processor
148 : !> \param nkp_groups number of kpoint groups
149 : !> \param kp_dist kpoints distribution on groups
150 : !> \param kp_range kpoints distribution for local processor
151 : !> \param blacs_env BLACS env for the kpoint group
152 : !> \param opmats Operator matrices
153 : !> \param kp_env Information for each kpoint
154 : !> \param mpools FM matrix pools for kpoint groups
155 : !> \author JGH
156 : ! **************************************************************************************************
157 : TYPE kpoint_type
158 : CHARACTER(LEN=default_string_length) :: kp_scheme = ""
159 : INTEGER, DIMENSION(3) :: nkp_grid = -1
160 : REAL(KIND=dp), DIMENSION(3) :: kp_shift = 0.0_dp
161 : LOGICAL :: use_real_wfn = .FALSE.
162 : LOGICAL :: symmetry = .FALSE.
163 : LOGICAL :: full_grid = .FALSE.
164 : LOGICAL :: verbose = .FALSE.
165 : REAL(KIND=dp) :: eps_geo = 0.0_dp
166 : INTEGER :: parallel_group_size = -1
167 : INTEGER :: nkp = -1
168 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp => Null()
169 : REAL(KIND=dp), DIMENSION(:), POINTER :: wkp => Null()
170 : ! parallel environment
171 : TYPE(mp_para_env_type), POINTER :: para_env => Null()
172 : TYPE(cp_blacs_env_type), POINTER :: blacs_env_all => Null()
173 : TYPE(mp_para_env_type), POINTER :: para_env_kp => Null(), &
174 : para_env_inter_kp => Null()
175 : LOGICAL :: iogrp = .FALSE.
176 : INTEGER :: nkp_groups = -1
177 : INTEGER, DIMENSION(:, :), POINTER :: kp_dist => Null()
178 : INTEGER, DIMENSION(2) :: kp_range = -1
179 : TYPE(cp_blacs_env_type), POINTER :: blacs_env => Null()
180 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index => Null()
181 : INTEGER, DIMENSION(:, :), POINTER :: index_to_cell => Null()
182 : TYPE(neighbor_list_set_p_type), &
183 : DIMENSION(:), POINTER :: sab_nl => Null(), &
184 : sab_nl_nosym => Null()
185 : ! environment
186 : TYPE(kpoint_env_p_type), DIMENSION(:), &
187 : POINTER :: kp_env => Null()
188 : TYPE(kpoint_env_p_type), DIMENSION(:), &
189 : POINTER :: kp_aux_env => Null()
190 : ! symmetry
191 : TYPE(kpoint_sym_p_type), DIMENSION(:), &
192 : POINTER :: kp_sym => Null()
193 : INTEGER, DIMENSION(:), POINTER :: atype => Null()
194 : INTEGER, DIMENSION(:), POINTER :: ibrot => Null()
195 : TYPE(kind_rotmat_type), DIMENSION(:, :), &
196 : POINTER :: kind_rotmat => Null()
197 : ! pools
198 : TYPE(qs_matrix_pools_type), POINTER :: mpools => Null()
199 : TYPE(qs_diis_buffer_type_kp), POINTER :: scf_diis_buffer => Null()
200 : TYPE(qs_matrix_pools_type), POINTER :: mpools_aux_fit => Null()
201 : END TYPE kpoint_type
202 :
203 : ! **************************************************************************************************
204 :
205 : CONTAINS
206 :
207 : ! **************************************************************************************************
208 : !> \brief Create a kpoint environment
209 : !> \param kpoint All the kpoint information
210 : !> \author JGH
211 : ! **************************************************************************************************
212 7858 : SUBROUTINE kpoint_create(kpoint)
213 : TYPE(kpoint_type), POINTER :: kpoint
214 :
215 7858 : CPASSERT(.NOT. ASSOCIATED(kpoint))
216 :
217 86438 : ALLOCATE (kpoint)
218 :
219 7858 : kpoint%kp_scheme = ""
220 31432 : kpoint%nkp_grid = 0
221 31432 : kpoint%kp_shift = 0.0_dp
222 7858 : kpoint%symmetry = .FALSE.
223 7858 : kpoint%verbose = .FALSE.
224 7858 : kpoint%full_grid = .FALSE.
225 7858 : kpoint%use_real_wfn = .FALSE.
226 7858 : kpoint%eps_geo = 1.0e-6_dp
227 7858 : kpoint%parallel_group_size = -1
228 :
229 7858 : kpoint%nkp = 0
230 :
231 7858 : NULLIFY (kpoint%xkp, kpoint%wkp)
232 7858 : NULLIFY (kpoint%kp_dist)
233 :
234 7858 : NULLIFY (kpoint%para_env)
235 7858 : NULLIFY (kpoint%blacs_env_all)
236 7858 : NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
237 7858 : NULLIFY (kpoint%blacs_env)
238 7858 : kpoint%nkp_groups = 0
239 7858 : kpoint%iogrp = .FALSE.
240 23574 : kpoint%kp_range = 0
241 :
242 7858 : NULLIFY (kpoint%kp_env)
243 7858 : NULLIFY (kpoint%mpools)
244 :
245 7858 : ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
246 31432 : kpoint%cell_to_index(:, :, :) = 1
247 :
248 7858 : ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
249 23574 : kpoint%index_to_cell(:, :) = 0
250 :
251 7858 : END SUBROUTINE kpoint_create
252 :
253 : ! **************************************************************************************************
254 : !> \brief Release a kpoint environment, deallocate all data
255 : !> \param kpoint The kpoint environment
256 : !> \author JGH
257 : ! **************************************************************************************************
258 15571 : SUBROUTINE kpoint_release(kpoint)
259 : TYPE(kpoint_type), POINTER :: kpoint
260 :
261 : INTEGER :: i, ik, j
262 :
263 15571 : IF (ASSOCIATED(kpoint)) THEN
264 :
265 7858 : IF (ASSOCIATED(kpoint%xkp)) THEN
266 344 : DEALLOCATE (kpoint%xkp)
267 : END IF
268 7858 : IF (ASSOCIATED(kpoint%wkp)) THEN
269 344 : DEALLOCATE (kpoint%wkp)
270 : END IF
271 7858 : IF (ASSOCIATED(kpoint%kp_dist)) THEN
272 252 : DEALLOCATE (kpoint%kp_dist)
273 : END IF
274 :
275 7858 : CALL mpools_release(kpoint%mpools)
276 7858 : CALL mpools_release(kpoint%mpools_aux_fit)
277 :
278 7858 : CALL cp_blacs_env_release(kpoint%blacs_env)
279 7858 : CALL cp_blacs_env_release(kpoint%blacs_env_all)
280 :
281 7858 : CALL mp_para_env_release(kpoint%para_env)
282 7858 : CALL mp_para_env_release(kpoint%para_env_kp)
283 7858 : CALL mp_para_env_release(kpoint%para_env_inter_kp)
284 :
285 7858 : IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
286 7858 : IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
287 :
288 7858 : IF (ASSOCIATED(kpoint%kp_env)) THEN
289 1968 : DO ik = 1, SIZE(kpoint%kp_env)
290 1968 : CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
291 : END DO
292 252 : DEALLOCATE (kpoint%kp_env)
293 : END IF
294 :
295 7858 : IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
296 244 : DO ik = 1, SIZE(kpoint%kp_aux_env)
297 244 : CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
298 : END DO
299 30 : DEALLOCATE (kpoint%kp_aux_env)
300 : END IF
301 :
302 7858 : IF (ASSOCIATED(kpoint%kp_sym)) THEN
303 13566 : DO ik = 1, SIZE(kpoint%kp_sym)
304 13566 : CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
305 : END DO
306 260 : DEALLOCATE (kpoint%kp_sym)
307 : END IF
308 :
309 7858 : IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
310 7858 : IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
311 :
312 7858 : IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
313 64 : DO i = 1, SIZE(kpoint%kind_rotmat, 1)
314 64 : DO j = 1, SIZE(kpoint%kind_rotmat, 2)
315 0 : IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
316 0 : DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
317 : END IF
318 : END DO
319 : END DO
320 64 : DEALLOCATE (kpoint%kind_rotmat)
321 : END IF
322 :
323 7858 : IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
324 138 : CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
325 138 : DEALLOCATE (kpoint%scf_diis_buffer)
326 : END IF
327 :
328 7858 : DEALLOCATE (kpoint)
329 :
330 : END IF
331 :
332 15571 : END SUBROUTINE kpoint_release
333 :
334 : ! **************************************************************************************************
335 : !> \brief Retrieve information from a kpoint environment
336 : !> \param kpoint The kpoint environment
337 : !> \param kp_scheme Type of kpoint grid
338 : !> \param nkp_grid Grid points
339 : !> \param kp_shift Shift of the grid
340 : !> \param symmetry use symmetry (atoms) to reduce kpoints
341 : !> \param verbose more output information
342 : !> \param full_grid don't reduce kpoints at all
343 : !> \param use_real_wfn real/complex wfn
344 : !> \param eps_geo accuracy of atom symmetry detection
345 : !> \param parallel_group_size kpoint group size
346 : !> \param kp_range kpoints distribution for local processor
347 : !> \param nkp number of kpoints
348 : !> \param xkp kpoint coordinates in units of b-vector
349 : !> \param wkp kpoint weights
350 : !> \param para_env 'global' parallel environment
351 : !> \param blacs_env_all BLACS env for the total environment
352 : !> \param para_env_kp parallel environment of the kpoint calculation
353 : !> \param para_env_inter_kp parallel environment between kpoints
354 : !> \param blacs_env BLACS env for the kpoint group
355 : !> \param kp_env Information for each kpoint
356 : !> \param kp_aux_env ...
357 : !> \param mpools FM matrix pools for kpoint groups
358 : !> \param iogrp this kpoint group has the IO processor
359 : !> \param nkp_groups number of kpoint groups
360 : !> \param kp_dist kpoints distribution on groups
361 : !> \param cell_to_index given a cell triple, returns the real space index
362 : !> \param index_to_cell ...
363 : !> \param sab_nl neighbourlist that defines real space matrices
364 : !> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
365 : !> \author JGH
366 : ! **************************************************************************************************
367 1487693 : SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
368 : full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
369 : para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
370 : kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
371 : sab_nl, sab_nl_nosym)
372 : TYPE(kpoint_type), INTENT(IN) :: kpoint
373 : CHARACTER(LEN=*), OPTIONAL :: kp_scheme
374 : INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
375 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: kp_shift
376 : LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
377 : use_real_wfn
378 : REAL(KIND=dp), OPTIONAL :: eps_geo
379 : INTEGER, OPTIONAL :: parallel_group_size
380 : INTEGER, DIMENSION(2), OPTIONAL :: kp_range
381 : INTEGER, OPTIONAL :: nkp
382 : REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
383 : REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
384 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
385 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
386 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
387 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
388 : TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
389 : POINTER :: kp_env, kp_aux_env
390 : TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
391 : LOGICAL, OPTIONAL :: iogrp
392 : INTEGER, OPTIONAL :: nkp_groups
393 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
394 : INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
395 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
396 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
397 : OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
398 :
399 0 : IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
400 1488357 : IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
401 1487693 : IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
402 1487693 : IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
403 1487693 : IF (PRESENT(verbose)) verbose = kpoint%verbose
404 1487693 : IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
405 1487693 : IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
406 1487693 : IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
407 1487693 : IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
408 :
409 1487693 : IF (PRESENT(nkp)) nkp = kpoint%nkp
410 1487693 : IF (PRESENT(wkp)) wkp => kpoint%wkp
411 1487693 : IF (PRESENT(xkp)) xkp => kpoint%xkp
412 :
413 1487693 : IF (PRESENT(para_env)) para_env => kpoint%para_env
414 1487693 : IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
415 1487693 : IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
416 1487693 : IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
417 1487693 : IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
418 :
419 1487693 : IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
420 1541141 : IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
421 1487693 : IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
422 1487693 : IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
423 :
424 1487693 : IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
425 1487693 : IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
426 1487693 : IF (PRESENT(mpools)) mpools => kpoint%mpools
427 :
428 1487693 : IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
429 1487693 : IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
430 1487693 : IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
431 1487693 : IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
432 :
433 1487693 : END SUBROUTINE get_kpoint_info
434 :
435 : ! **************************************************************************************************
436 : !> \brief Set information in a kpoint environment
437 : !> \param kpoint The kpoint environment
438 : !> \param kp_scheme Type of kpoint grid
439 : !> \param nkp_grid Grid points
440 : !> \param kp_shift Shift of the grid
441 : !> \param symmetry use symmetry (atoms) to reduce kpoints
442 : !> \param verbose more output information
443 : !> \param full_grid don't reduce kpoints at all
444 : !> \param use_real_wfn real/complex wfn
445 : !> \param eps_geo accuracy of atom symmetry detection
446 : !> \param parallel_group_size kpoint group size
447 : !> \param kp_range kpoints distribution for local processor
448 : !> \param nkp number of kpoints
449 : !> \param xkp kpoint coordinates
450 : !> \param wkp kpoint weights
451 : !> \param para_env 'global' parallel environment
452 : !> \param blacs_env_all BLACS env for the total environment
453 : !> \param para_env_kp parallel environment of the kpoint calculation
454 : !> \param para_env_inter_kp parallel environment between kpoints
455 : !> \param blacs_env BLACS env for the kpoint group
456 : !> \param kp_env Information for each kpoint
457 : !> \param kp_aux_env ...
458 : !> \param mpools FM matrix pools for kpoint groups
459 : !> \param iogrp this kpoint group has the IO processor
460 : !> \param nkp_groups number of kpoint groups
461 : !> \param kp_dist kpoints distribution on groups
462 : !> \param cell_to_index given a cell triple, returns the real space index
463 : !> \param index_to_cell ...
464 : !> \param sab_nl neighbourlist that defines real space matrices
465 : !> \param sab_nl_nosym neighbourlist that defines real space matrices
466 : !> \author JGH
467 : ! **************************************************************************************************
468 974 : SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
469 : full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
470 : para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
471 : kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
472 : sab_nl, sab_nl_nosym)
473 : TYPE(kpoint_type), INTENT(INOUT) :: kpoint
474 : CHARACTER(LEN=*), OPTIONAL :: kp_scheme
475 : INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
476 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: kp_shift
477 : LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
478 : use_real_wfn
479 : REAL(KIND=dp), OPTIONAL :: eps_geo
480 : INTEGER, OPTIONAL :: parallel_group_size
481 : INTEGER, DIMENSION(2), OPTIONAL :: kp_range
482 : INTEGER, OPTIONAL :: nkp
483 : REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
484 : REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
485 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
486 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
487 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
488 : TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
489 : TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
490 : POINTER :: kp_env, kp_aux_env
491 : TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
492 : LOGICAL, OPTIONAL :: iogrp
493 : INTEGER, OPTIONAL :: nkp_groups
494 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
495 : INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
496 : INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
497 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
498 : OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
499 :
500 0 : IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
501 974 : IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
502 974 : IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
503 974 : IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
504 974 : IF (PRESENT(verbose)) kpoint%verbose = verbose
505 974 : IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
506 974 : IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
507 974 : IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
508 974 : IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
509 :
510 974 : IF (PRESENT(nkp)) kpoint%nkp = nkp
511 974 : IF (PRESENT(wkp)) kpoint%wkp => wkp
512 974 : IF (PRESENT(xkp)) kpoint%xkp => xkp
513 :
514 974 : IF (PRESENT(para_env)) kpoint%para_env => para_env
515 974 : IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
516 974 : IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
517 974 : IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
518 974 : IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
519 :
520 974 : IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
521 974 : IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
522 974 : IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
523 974 : IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
524 :
525 974 : IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
526 0 : IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
527 974 : IF (PRESENT(mpools)) kpoint%mpools => mpools
528 974 : IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
529 974 : IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
530 :
531 974 : IF (PRESENT(cell_to_index)) THEN
532 0 : IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
533 0 : kpoint%cell_to_index => cell_to_index
534 : END IF
535 :
536 974 : IF (PRESENT(index_to_cell)) THEN
537 0 : IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
538 0 : kpoint%index_to_cell => index_to_cell
539 : END IF
540 :
541 974 : END SUBROUTINE set_kpoint_info
542 :
543 : ! **************************************************************************************************
544 : !> \brief Read the kpoint input section
545 : !> \param kpoint The kpoint environment
546 : !> \param kpoint_section The input section
547 : !> \param a_vec ...
548 : !> \author JGH
549 : ! **************************************************************************************************
550 7704 : SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec)
551 : TYPE(kpoint_type), INTENT(INOUT) :: kpoint
552 : TYPE(section_vals_type), POINTER :: kpoint_section
553 : REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN) :: a_vec
554 :
555 : CHARACTER(LEN=default_string_length) :: ustr
556 : CHARACTER(LEN=default_string_length), &
557 7704 : DIMENSION(:), POINTER :: tmpstringlist
558 : INTEGER :: i, n_rep, nval, wfntype
559 : LOGICAL :: available
560 : REAL(KIND=dp) :: ff
561 7704 : REAL(KIND=dp), DIMENSION(:), POINTER :: reallist
562 :
563 7704 : CALL section_vals_get(kpoint_section, explicit=available)
564 :
565 7704 : IF (available) THEN
566 216 : CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
567 216 : nval = SIZE(tmpstringlist)
568 216 : CPASSERT(nval >= 1)
569 216 : kpoint%kp_scheme = tmpstringlist(1)
570 216 : CALL uppercase(kpoint%kp_scheme)
571 :
572 : ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
573 176 : SELECT CASE (kpoint%kp_scheme)
574 : CASE ("NONE")
575 : ! do nothing
576 : CASE ("GAMMA")
577 : ! do nothing
578 : CASE ("MONKHORST-PACK")
579 176 : CPASSERT(nval >= 4)
580 704 : DO i = 2, 4
581 704 : READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
582 : END DO
583 : CASE ("MACDONALD")
584 0 : CPASSERT(nval >= 7)
585 0 : DO i = 2, 4
586 0 : READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
587 : END DO
588 0 : DO i = 5, 7
589 0 : READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
590 : END DO
591 : CASE ("GENERAL")
592 4 : CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
593 4 : CALL uppercase(ustr)
594 4 : CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
595 4 : kpoint%nkp = n_rep
596 20 : ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
597 12 : DO i = 1, n_rep
598 : CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
599 8 : r_vals=reallist)
600 8 : nval = SIZE(reallist)
601 8 : CPASSERT(nval >= 4)
602 8 : SELECT CASE (ustr)
603 : CASE ("B_VECTOR")
604 32 : kpoint%xkp(1:3, i) = reallist(1:3)
605 : CASE ("CART_ANGSTROM")
606 : kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
607 : reallist(2)*a_vec(2, 1:3) + &
608 0 : reallist(3)*a_vec(3, 1:3))/twopi*angstrom
609 : CASE ("CART_BOHR")
610 : kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
611 : reallist(2)*a_vec(2, 1:3) + &
612 0 : reallist(3)*a_vec(3, 1:3))/twopi
613 : CASE DEFAULT
614 8 : CPABORT("Unknown Unit for kpoint definition")
615 : END SELECT
616 12 : kpoint%wkp(i) = reallist(4)
617 : END DO
618 12 : ff = 1.0_dp/SUM(kpoint%wkp(:))
619 16 : kpoint%wkp(:) = ff*kpoint%wkp(:)
620 : CASE DEFAULT
621 216 : CPABORT("")
622 : END SELECT
623 :
624 216 : CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
625 216 : CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
626 216 : CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
627 216 : CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
628 216 : CALL section_vals_val_get(kpoint_section, "EPS_GEO", r_val=kpoint%eps_geo)
629 : CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
630 216 : i_val=kpoint%parallel_group_size)
631 10 : SELECT CASE (wfntype)
632 : CASE (use_real_wfn)
633 10 : kpoint%use_real_wfn = .TRUE.
634 : CASE (use_complex_wfn)
635 206 : kpoint%use_real_wfn = .FALSE.
636 : CASE DEFAULT
637 216 : CPABORT("")
638 : END SELECT
639 :
640 : ELSE
641 7488 : kpoint%kp_scheme = "NONE"
642 : END IF
643 :
644 7704 : END SUBROUTINE read_kpoint_section
645 :
646 : ! **************************************************************************************************
647 : !> \brief Write information on the kpoints to output
648 : !> \param kpoint The kpoint environment
649 : !> \param iounit output unit
650 : !> \param dft_section DFT section information for output unit
651 : !> \author JGH
652 : ! **************************************************************************************************
653 7702 : SUBROUTINE write_kpoint_info(kpoint, iounit, dft_section)
654 : TYPE(kpoint_type), INTENT(IN) :: kpoint
655 : INTEGER, INTENT(IN), OPTIONAL :: iounit
656 : TYPE(section_vals_type), INTENT(IN), OPTIONAL :: dft_section
657 :
658 : INTEGER :: i, punit
659 : TYPE(cp_logger_type), POINTER :: logger
660 :
661 7702 : NULLIFY (logger)
662 7702 : logger => cp_get_default_logger()
663 :
664 7702 : IF (PRESENT(dft_section)) THEN
665 7702 : punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
666 0 : ELSE IF (PRESENT(iounit)) THEN
667 0 : punit = iounit
668 : ELSE
669 0 : punit = cp_logger_get_default_unit_nr(logger)
670 : END IF
671 :
672 7702 : IF (punit > 0) THEN
673 :
674 1898 : IF (kpoint%kp_scheme /= "NONE") THEN
675 36 : WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
676 : END IF
677 1 : SELECT CASE (kpoint%kp_scheme)
678 : CASE ("NONE")
679 : ! be silent
680 : CASE ("GAMMA")
681 1 : WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
682 : CASE ("MONKHORST-PACK")
683 35 : WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', ' Monkhorst-Pack'
684 35 : WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
685 35 : WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
686 : CASE ("MACDONALD")
687 0 : WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
688 0 : WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
689 0 : WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
690 0 : WRITE (punit, '(A,T66,G15.6)') ' BRILLOUIN| Accuracy in Symmetry determination', kpoint%eps_geo
691 : CASE ("GENERAL")
692 0 : WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' General'
693 : CASE DEFAULT
694 1898 : CPABORT("")
695 : END SELECT
696 1898 : IF (kpoint%kp_scheme /= "NONE") THEN
697 36 : IF (kpoint%symmetry) THEN
698 7 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' ON'
699 : ELSE
700 29 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' OFF'
701 : END IF
702 36 : IF (kpoint%use_real_wfn) THEN
703 0 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
704 : ELSE
705 36 : WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
706 : END IF
707 36 : IF (kpoint%full_grid) THEN
708 7 : WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid '
709 : END IF
710 36 : IF (kpoint%kp_scheme /= "GAMMA") THEN
711 35 : WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
712 : WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
713 35 : ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
714 575 : DO i = 1, kpoint%nkp
715 540 : WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
716 1115 : kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
717 : END DO
718 : END IF
719 36 : WRITE (punit, '(" ",79("*"))')
720 : END IF
721 :
722 : END IF
723 :
724 7702 : IF (PRESENT(dft_section)) THEN
725 7702 : CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
726 : END IF
727 :
728 7702 : END SUBROUTINE write_kpoint_info
729 :
730 : ! **************************************************************************************************
731 : !> \brief Create a single kpoint environment
732 : !> \param kp_env Single kpoint environment
733 : !> \author JGH
734 : ! **************************************************************************************************
735 1930 : SUBROUTINE kpoint_env_create(kp_env)
736 : TYPE(kpoint_env_type), POINTER :: kp_env
737 :
738 1930 : CPASSERT(.NOT. ASSOCIATED(kp_env))
739 :
740 9650 : ALLOCATE (kp_env)
741 :
742 1930 : kp_env%nkpoint = 0
743 : kp_env%wkp = 0.0_dp
744 7720 : kp_env%xkp = 0.0_dp
745 1930 : kp_env%is_local = .FALSE.
746 :
747 1930 : NULLIFY (kp_env%mos)
748 1930 : NULLIFY (kp_env%pmat)
749 1930 : NULLIFY (kp_env%wmat)
750 1930 : NULLIFY (kp_env%smat)
751 1930 : NULLIFY (kp_env%amat)
752 :
753 1930 : END SUBROUTINE kpoint_env_create
754 :
755 : ! **************************************************************************************************
756 : !> \brief Release a single kpoint environment
757 : !> \param kp_env Single kpoint environment
758 : !> \author JGH
759 : ! **************************************************************************************************
760 1930 : SUBROUTINE kpoint_env_release(kp_env)
761 : TYPE(kpoint_env_type), POINTER :: kp_env
762 :
763 : INTEGER :: ic, is
764 :
765 1930 : IF (ASSOCIATED(kp_env)) THEN
766 :
767 1930 : IF (ASSOCIATED(kp_env%mos)) THEN
768 4124 : DO is = 1, SIZE(kp_env%mos, 2)
769 8498 : DO ic = 1, SIZE(kp_env%mos, 1)
770 6568 : CALL deallocate_mo_set(kp_env%mos(ic, is))
771 : END DO
772 : END DO
773 1930 : DEALLOCATE (kp_env%mos)
774 : END IF
775 :
776 1930 : CALL cp_fm_release(kp_env%pmat)
777 1930 : CALL cp_fm_release(kp_env%wmat)
778 1930 : CALL cp_fm_release(kp_env%smat)
779 1930 : CALL cp_fm_release(kp_env%amat)
780 :
781 1930 : CALL cp_fm_release(kp_env%shalf)
782 1930 : CALL cp_cfm_release(kp_env%cshalf)
783 :
784 1930 : DEALLOCATE (kp_env)
785 :
786 : END IF
787 :
788 1930 : END SUBROUTINE kpoint_env_release
789 :
790 : ! **************************************************************************************************
791 : !> \brief Get information from a single kpoint environment
792 : !> \param kpoint_env Single kpoint environment
793 : !> \param nkpoint Index of kpoint
794 : !> \param wkp Weight of kpoint
795 : !> \param xkp Coordinates of kpoint
796 : !> \param is_local Is this kpoint local (single cpu group)
797 : !> \param mos MOs of this kpoint
798 : !> \author JGH
799 : ! **************************************************************************************************
800 7484 : SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
801 : TYPE(kpoint_env_type), INTENT(IN) :: kpoint_env
802 : INTEGER, OPTIONAL :: nkpoint
803 : REAL(KIND=dp), OPTIONAL :: wkp
804 : REAL(KIND=dp), DIMENSION(3), OPTIONAL :: xkp
805 : LOGICAL, OPTIONAL :: is_local
806 : TYPE(mo_set_type), DIMENSION(:, :), OPTIONAL, &
807 : POINTER :: mos
808 :
809 7484 : IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
810 7484 : IF (PRESENT(wkp)) wkp = kpoint_env%wkp
811 7484 : IF (PRESENT(xkp)) xkp = kpoint_env%xkp
812 7484 : IF (PRESENT(is_local)) is_local = kpoint_env%is_local
813 7484 : IF (PRESENT(mos)) mos => kpoint_env%mos
814 :
815 7484 : END SUBROUTINE get_kpoint_env
816 :
817 : ! **************************************************************************************************
818 : !> \brief Create a single kpoint symmetry environment
819 : !> \param kp_sym ...
820 : !> \author JGH
821 : ! **************************************************************************************************
822 13306 : SUBROUTINE kpoint_sym_create(kp_sym)
823 : TYPE(kpoint_sym_type), POINTER :: kp_sym
824 :
825 13306 : CPASSERT(.NOT. ASSOCIATED(kp_sym))
826 :
827 13306 : ALLOCATE (kp_sym)
828 :
829 13306 : kp_sym%nwght = 0
830 13306 : kp_sym%nwred = 0
831 : kp_sym%apply_symmetry = .FALSE.
832 :
833 : NULLIFY (kp_sym%rot)
834 : NULLIFY (kp_sym%xkp)
835 : NULLIFY (kp_sym%rotp)
836 : NULLIFY (kp_sym%f0)
837 :
838 13306 : END SUBROUTINE kpoint_sym_create
839 :
840 : ! **************************************************************************************************
841 : !> \brief Release a single kpoint symmetry environment
842 : !> \param kp_sym ...
843 : !> \author JGH
844 : ! **************************************************************************************************
845 13306 : SUBROUTINE kpoint_sym_release(kp_sym)
846 : TYPE(kpoint_sym_type), POINTER :: kp_sym
847 :
848 13306 : IF (ASSOCIATED(kp_sym)) THEN
849 :
850 13306 : IF (ASSOCIATED(kp_sym%rot)) THEN
851 0 : DEALLOCATE (kp_sym%rot)
852 : END IF
853 13306 : IF (ASSOCIATED(kp_sym%xkp)) THEN
854 0 : DEALLOCATE (kp_sym%xkp)
855 : END IF
856 13306 : IF (ASSOCIATED(kp_sym%f0)) THEN
857 0 : DEALLOCATE (kp_sym%f0)
858 : END IF
859 13306 : IF (ASSOCIATED(kp_sym%rotp)) THEN
860 0 : DEALLOCATE (kp_sym%rotp)
861 : END IF
862 :
863 13306 : DEALLOCATE (kp_sym)
864 :
865 : END IF
866 :
867 13306 : END SUBROUTINE kpoint_sym_release
868 :
869 : ! **************************************************************************************************
870 :
871 0 : END MODULE kpoint_types
|