(git:867b985)
Loading...
Searching...
No Matches
kpoint_types.F
Go to the documentation of this file.
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! **************************************************************************************************
16 USE cell_types, ONLY: cell_type
19 USE cp_cfm_types, ONLY: cp_cfm_release,&
21 USE cp_fm_types, ONLY: cp_fm_release,&
37 USE kinds, ONLY: default_string_length,&
38 dp
39 USE mathconstants, ONLY: twopi
42 USE physcon, ONLY: angstrom
51#include "./base/base_uses.f90"
52
53 IMPLICIT NONE
54
55 PRIVATE
56
57 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kpoint_types'
58
59 PUBLIC :: kpoint_type
64 PUBLIC :: kind_rotmat_type
65 PUBLIC :: kpoint_sym_type
66 PUBLIC :: kpoint_sym_create
67
68! **************************************************************************************************
69!> \brief Keeps information about a specific k-point
70!> \param nkpoint the kpoint index
71!> \param wkp weight of this kpoint
72!> \param xkp kpoint coordinates in units of b-vector
73!> \param is_local if this kpoint is calculated on a single thread
74!> \param mos associated MOs (r/i,spin)
75!> \param pmat associated density matrix (r/i,spin)
76!> \param wmat associated energy weighted density matrix (r/i,spin)
77!> \param smat associated overlap matrix (for ADMM) (r/i,spin)
78!> \param amat associated ADMM basis projection matrix (r/i,spin)
79!> \param shalf S(K)^(1/2) DFT+U Lowdin method (real wfn)
80!> \param cshalf S(K)^(1/2) DFT+U Lowdin method (complex wfn)
81!> \author JGH
82! **************************************************************************************************
84 INTEGER :: nkpoint = -1
85 REAL(kind=dp) :: wkp = 0.0_dp
86 REAL(kind=dp), DIMENSION(3) :: xkp = 0.0_dp
87 LOGICAL :: is_local = .false.
88 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos => null()
89 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: pmat => null()
90 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: wmat => null()
91 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: smat => null()
92 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: amat => null()
93 TYPE(cp_fm_type) :: shalf
94 TYPE(cp_cfm_type) :: cshalf
95 END TYPE kpoint_env_type
96
98 TYPE(kpoint_env_type), POINTER :: kpoint_env => null()
99 END TYPE kpoint_env_p_type
100
101! **************************************************************************************************
102!> \brief Rotation matrices for basis sets
103!> \param rmat atom basis function rotation matrix
104!> \author JGH
105! **************************************************************************************************
107 REAL(kind=dp), DIMENSION(:, :), POINTER :: rmat => null()
108 END TYPE kind_rotmat_type
109
110! **************************************************************************************************
111!> \brief Keeps symmetry information about a specific k-point
112!> \param apply_symmetry ...
113!> \param nwght kpoint multiplicity
114!> \param xkp kpoint coordinates
115!> \param rot rotation matrices
116!> \param f0 atom permutation
117!> \param fcell atom cell shifts generated by the symmetry operation
118!> \param kgphase atom Bloch gauge from reciprocal-lattice folding of the mapped k-point
119!> \author JGH
120! **************************************************************************************************
122 LOGICAL :: apply_symmetry = .false.
123 INTEGER :: nwght = -1
124 INTEGER :: nwred = -1
125 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp => null()
126 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: rot => null()
127 INTEGER, DIMENSION(:), POINTER :: rotp => null()
128 INTEGER, DIMENSION(:, :), POINTER :: f0 => null()
129 INTEGER, DIMENSION(:, :, :), POINTER :: fcell => null()
130 REAL(kind=dp), DIMENSION(:, :), POINTER :: kgphase => null()
131 END TYPE kpoint_sym_type
132
133 TYPE kpoint_sym_p_type
134 TYPE(kpoint_sym_type), POINTER :: kpoint_sym => null()
135 END TYPE kpoint_sym_p_type
136
137! **************************************************************************************************
138!> \brief Contains information about kpoints
139!> \par History
140!> 2014.07 created [JGH]
141!> \param kp_scheme [input] Type of kpoint grid
142!> \param nkp_grid [input] Grid points
143!> \param kp_shift [input] Shift of the grid
144!> \param use_real_wfn [input] real/complex wfn
145!> \param symmetry [input] use symmetry (atoms) to reduce kpoints
146!> \param full_grid [input] don't reduce kpoints at all
147!> \param inversion_symmetry_only [input] reduce kpoints only by inversion symmetry
148!> \param symmetry_backend [input] k-point symmetry backend
149!> \param symmetry_reduction_method [input] k-point symmetry reduction method
150!> \param verbose [input] more output information
151!> \param eps_geo [input] accuracy of atom symmetry detection
152!> \param parallel_group_size [input] kpoint group size
153!> \param nkp number of kpoints
154!> \param xkp kpoint coordinates
155!> \param wkp kpoint weights
156!> \param xkp_input explicit GENERAL kpoint coordinates as read from the input
157!> \param wkp_input explicit GENERAL kpoint weights as read from the input
158!> \param para_env 'global' parallel environment
159!> \param para_env_kp parallel environment of the kpoint calculation
160!> \param para_env_inter_kp parallel environment between kpoints
161!> \param iogrp this kpoint group has the IO processor
162!> \param nkp_groups number of kpoint groups
163!> \param kp_dist kpoints distribution on groups
164!> \param kp_range kpoints distribution for local processor
165!> \param blacs_env BLACS env for the kpoint group
166!> \param opmats Operator matrices
167!> \param kp_env Information for each kpoint
168!> \param mpools FM matrix pools for kpoint groups
169!> \author JGH
170! **************************************************************************************************
172 CHARACTER(LEN=default_string_length) :: kp_scheme = ""
173 INTEGER, DIMENSION(3) :: nkp_grid = -1
174 REAL(kind=dp), DIMENSION(3) :: kp_shift = 0.0_dp
175 LOGICAL :: gamma_centered = .false.
176 LOGICAL :: use_real_wfn = .false.
177 LOGICAL :: symmetry = .false.
178 LOGICAL :: full_grid = .false.
179 LOGICAL :: inversion_symmetry_only = .false.
180 INTEGER :: symmetry_backend = use_k290_kpoint_backend
181 INTEGER :: symmetry_reduction_method = use_k290_kpoint_symmetry
182 LOGICAL :: verbose = .false.
183 REAL(kind=dp) :: eps_geo = 0.0_dp
184 INTEGER :: parallel_group_size = -1
185 INTEGER :: nkp = -1
186 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp => null()
187 REAL(kind=dp), DIMENSION(:), POINTER :: wkp => null()
188 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp_input => null()
189 REAL(kind=dp), DIMENSION(:), POINTER :: wkp_input => null()
190 ! parallel environment
191 TYPE(mp_para_env_type), POINTER :: para_env => null()
192 TYPE(cp_blacs_env_type), POINTER :: blacs_env_all => null()
193 TYPE(mp_para_env_type), POINTER :: para_env_kp => null(), &
194 para_env_inter_kp => null()
195 LOGICAL :: iogrp = .false.
196 INTEGER :: nkp_groups = -1
197 INTEGER, DIMENSION(:, :), POINTER :: kp_dist => null()
198 INTEGER, DIMENSION(2) :: kp_range = -1
199 TYPE(cp_blacs_env_type), POINTER :: blacs_env => null()
200 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index => null()
201 INTEGER, DIMENSION(:, :), POINTER :: index_to_cell => null()
203 DIMENSION(:), POINTER :: sab_nl => null(), &
204 sab_nl_nosym => null()
205 ! environment
206 TYPE(kpoint_env_p_type), DIMENSION(:), &
207 POINTER :: kp_env => null()
208 TYPE(kpoint_env_p_type), DIMENSION(:), &
209 POINTER :: kp_aux_env => null()
210 ! symmetry
211 TYPE(kpoint_sym_p_type), DIMENSION(:), &
212 POINTER :: kp_sym => null()
213 INTEGER, DIMENSION(:), POINTER :: atype => null()
214 INTEGER, DIMENSION(:), POINTER :: ibrot => null()
215 TYPE(kind_rotmat_type), DIMENSION(:, :), &
216 POINTER :: kind_rotmat => null()
217 ! pools
218 TYPE(qs_matrix_pools_type), POINTER :: mpools => null()
219 TYPE(qs_diis_buffer_type_kp), POINTER :: scf_diis_buffer => null()
220 TYPE(qs_matrix_pools_type), POINTER :: mpools_aux_fit => null()
221 END TYPE kpoint_type
222
223! **************************************************************************************************
224
225CONTAINS
226
227! **************************************************************************************************
228!> \brief Create a kpoint environment
229!> \param kpoint All the kpoint information
230!> \author JGH
231! **************************************************************************************************
232 SUBROUTINE kpoint_create(kpoint)
233 TYPE(kpoint_type), POINTER :: kpoint
234
235 cpassert(.NOT. ASSOCIATED(kpoint))
236
237 ALLOCATE (kpoint)
238
239 kpoint%kp_scheme = ""
240 kpoint%nkp_grid = 0
241 kpoint%kp_shift = 0.0_dp
242 kpoint%gamma_centered = .false.
243 kpoint%symmetry = .false.
244 kpoint%verbose = .false.
245 kpoint%full_grid = .false.
246 kpoint%inversion_symmetry_only = .false.
247 kpoint%symmetry_backend = use_k290_kpoint_backend
248 kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
249 kpoint%use_real_wfn = .false.
250 kpoint%eps_geo = 1.0e-6_dp
251 kpoint%parallel_group_size = -1
252
253 kpoint%nkp = 0
254
255 NULLIFY (kpoint%xkp, kpoint%wkp)
256 NULLIFY (kpoint%xkp_input, kpoint%wkp_input)
257 NULLIFY (kpoint%kp_dist)
258
259 NULLIFY (kpoint%para_env)
260 NULLIFY (kpoint%blacs_env_all)
261 NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
262 NULLIFY (kpoint%blacs_env)
263 kpoint%nkp_groups = 0
264 kpoint%iogrp = .false.
265 kpoint%kp_range = 0
266
267 NULLIFY (kpoint%kp_env)
268 NULLIFY (kpoint%mpools)
269
270 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
271 kpoint%cell_to_index(:, :, :) = 1
272
273 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
274 kpoint%index_to_cell(:, :) = 0
275
276 END SUBROUTINE kpoint_create
277
278! **************************************************************************************************
279!> \brief Release a kpoint environment, deallocate all data
280!> \param kpoint The kpoint environment
281!> \author JGH
282! **************************************************************************************************
283 SUBROUTINE kpoint_release(kpoint)
284 TYPE(kpoint_type), POINTER :: kpoint
285
286 INTEGER :: i, ik, j
287
288 IF (ASSOCIATED(kpoint)) THEN
289
290 IF (ASSOCIATED(kpoint%xkp)) THEN
291 DEALLOCATE (kpoint%xkp)
292 END IF
293 IF (ASSOCIATED(kpoint%wkp)) THEN
294 DEALLOCATE (kpoint%wkp)
295 END IF
296 IF (ASSOCIATED(kpoint%xkp_input)) THEN
297 DEALLOCATE (kpoint%xkp_input)
298 END IF
299 IF (ASSOCIATED(kpoint%wkp_input)) THEN
300 DEALLOCATE (kpoint%wkp_input)
301 END IF
302 IF (ASSOCIATED(kpoint%kp_dist)) THEN
303 DEALLOCATE (kpoint%kp_dist)
304 END IF
305
306 CALL mpools_release(kpoint%mpools)
307 CALL mpools_release(kpoint%mpools_aux_fit)
308
309 CALL cp_blacs_env_release(kpoint%blacs_env)
310 CALL cp_blacs_env_release(kpoint%blacs_env_all)
311
312 CALL mp_para_env_release(kpoint%para_env)
313 CALL mp_para_env_release(kpoint%para_env_kp)
314 CALL mp_para_env_release(kpoint%para_env_inter_kp)
315
316 IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
317 IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
318
319 IF (ASSOCIATED(kpoint%kp_env)) THEN
320 DO ik = 1, SIZE(kpoint%kp_env)
321 CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
322 END DO
323 DEALLOCATE (kpoint%kp_env)
324 END IF
325
326 IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
327 DO ik = 1, SIZE(kpoint%kp_aux_env)
328 CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
329 END DO
330 DEALLOCATE (kpoint%kp_aux_env)
331 END IF
332
333 IF (ASSOCIATED(kpoint%kp_sym)) THEN
334 DO ik = 1, SIZE(kpoint%kp_sym)
335 CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
336 END DO
337 DEALLOCATE (kpoint%kp_sym)
338 END IF
339
340 IF (ASSOCIATED(kpoint%atype)) DEALLOCATE (kpoint%atype)
341 IF (ASSOCIATED(kpoint%ibrot)) DEALLOCATE (kpoint%ibrot)
342
343 IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
344 DO i = 1, SIZE(kpoint%kind_rotmat, 1)
345 DO j = 1, SIZE(kpoint%kind_rotmat, 2)
346 IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
347 DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
348 END IF
349 END DO
350 END DO
351 DEALLOCATE (kpoint%kind_rotmat)
352 END IF
353
354 IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
355 CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
356 DEALLOCATE (kpoint%scf_diis_buffer)
357 END IF
358
359 DEALLOCATE (kpoint)
360
361 END IF
362
363 END SUBROUTINE kpoint_release
364
365! **************************************************************************************************
366!> \brief Reset all data derived from a concrete k-point initialization.
367!> Input options such as the scheme, grid, shifts and symmetry settings are kept.
368!> \param kpoint The kpoint environment
369! **************************************************************************************************
371 TYPE(kpoint_type), INTENT(INOUT) :: kpoint
372
373 INTEGER :: i, ik, j
374
375 IF (ASSOCIATED(kpoint%xkp)) THEN
376 DEALLOCATE (kpoint%xkp)
377 NULLIFY (kpoint%xkp)
378 END IF
379 IF (ASSOCIATED(kpoint%wkp)) THEN
380 DEALLOCATE (kpoint%wkp)
381 NULLIFY (kpoint%wkp)
382 END IF
383 IF (kpoint%kp_scheme == "GENERAL" .AND. ASSOCIATED(kpoint%xkp_input) .AND. &
384 ASSOCIATED(kpoint%wkp_input)) THEN
385 kpoint%nkp = SIZE(kpoint%wkp_input)
386 ALLOCATE (kpoint%xkp(3, kpoint%nkp), kpoint%wkp(kpoint%nkp))
387 kpoint%xkp(1:3, 1:kpoint%nkp) = kpoint%xkp_input(1:3, 1:kpoint%nkp)
388 kpoint%wkp(1:kpoint%nkp) = kpoint%wkp_input(1:kpoint%nkp)
389 END IF
390 IF (ASSOCIATED(kpoint%kp_dist)) THEN
391 DEALLOCATE (kpoint%kp_dist)
392 NULLIFY (kpoint%kp_dist)
393 END IF
394
395 CALL mpools_release(kpoint%mpools)
396 CALL mpools_release(kpoint%mpools_aux_fit)
397
398 CALL cp_blacs_env_release(kpoint%blacs_env)
399 CALL cp_blacs_env_release(kpoint%blacs_env_all)
400
401 CALL mp_para_env_release(kpoint%para_env)
402 CALL mp_para_env_release(kpoint%para_env_kp)
403 CALL mp_para_env_release(kpoint%para_env_inter_kp)
404
405 IF (ASSOCIATED(kpoint%cell_to_index)) THEN
406 DEALLOCATE (kpoint%cell_to_index)
407 NULLIFY (kpoint%cell_to_index)
408 END IF
409 IF (ASSOCIATED(kpoint%index_to_cell)) THEN
410 DEALLOCATE (kpoint%index_to_cell)
411 NULLIFY (kpoint%index_to_cell)
412 END IF
413
414 IF (ASSOCIATED(kpoint%kp_env)) THEN
415 DO ik = 1, SIZE(kpoint%kp_env)
416 CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
417 END DO
418 DEALLOCATE (kpoint%kp_env)
419 NULLIFY (kpoint%kp_env)
420 END IF
421
422 IF (ASSOCIATED(kpoint%kp_aux_env)) THEN
423 DO ik = 1, SIZE(kpoint%kp_aux_env)
424 CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
425 END DO
426 DEALLOCATE (kpoint%kp_aux_env)
427 NULLIFY (kpoint%kp_aux_env)
428 END IF
429
430 IF (ASSOCIATED(kpoint%kp_sym)) THEN
431 DO ik = 1, SIZE(kpoint%kp_sym)
432 CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
433 END DO
434 DEALLOCATE (kpoint%kp_sym)
435 NULLIFY (kpoint%kp_sym)
436 END IF
437
438 IF (ASSOCIATED(kpoint%atype)) THEN
439 DEALLOCATE (kpoint%atype)
440 NULLIFY (kpoint%atype)
441 END IF
442 IF (ASSOCIATED(kpoint%ibrot)) THEN
443 DEALLOCATE (kpoint%ibrot)
444 NULLIFY (kpoint%ibrot)
445 END IF
446
447 IF (ASSOCIATED(kpoint%kind_rotmat)) THEN
448 DO i = 1, SIZE(kpoint%kind_rotmat, 1)
449 DO j = 1, SIZE(kpoint%kind_rotmat, 2)
450 IF (ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat)) THEN
451 DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
452 NULLIFY (kpoint%kind_rotmat(i, j)%rmat)
453 END IF
454 END DO
455 END DO
456 DEALLOCATE (kpoint%kind_rotmat)
457 NULLIFY (kpoint%kind_rotmat)
458 END IF
459
460 IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
461 CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
462 DEALLOCATE (kpoint%scf_diis_buffer)
463 NULLIFY (kpoint%scf_diis_buffer)
464 END IF
465
466 NULLIFY (kpoint%sab_nl)
467 NULLIFY (kpoint%sab_nl_nosym)
468
469 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
470 kpoint%cell_to_index(:, :, :) = 1
471
472 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
473 kpoint%index_to_cell(:, :) = 0
474
475 IF (.NOT. ASSOCIATED(kpoint%wkp)) kpoint%nkp = 0
476 kpoint%nkp_groups = 0
477 kpoint%kp_range = 0
478 kpoint%iogrp = .false.
479
480 END SUBROUTINE kpoint_reset_initialization
481
482! **************************************************************************************************
483!> \brief Retrieve information from a kpoint environment
484!> \param kpoint The kpoint environment
485!> \param kp_scheme Type of kpoint grid
486!> \param nkp_grid Grid points
487!> \param kp_shift Shift of the grid
488!> \param symmetry use symmetry (atoms) to reduce kpoints
489!> \param verbose more output information
490!> \param full_grid don't reduce kpoints at all
491!> \param use_real_wfn real/complex wfn
492!> \param eps_geo accuracy of atom symmetry detection
493!> \param parallel_group_size kpoint group size
494!> \param kp_range kpoints distribution for local processor
495!> \param nkp number of kpoints
496!> \param xkp kpoint coordinates in units of b-vector
497!> \param wkp kpoint weights
498!> \param para_env 'global' parallel environment
499!> \param blacs_env_all BLACS env for the total environment
500!> \param para_env_kp parallel environment of the kpoint calculation
501!> \param para_env_inter_kp parallel environment between kpoints
502!> \param blacs_env BLACS env for the kpoint group
503!> \param kp_env Information for each kpoint
504!> \param kp_aux_env ...
505!> \param mpools FM matrix pools for kpoint groups
506!> \param iogrp this kpoint group has the IO processor
507!> \param nkp_groups number of kpoint groups
508!> \param kp_dist kpoints distribution on groups
509!> \param cell_to_index given a cell triple, returns the real space index
510!> \param index_to_cell ...
511!> \param sab_nl neighbourlist that defines real space matrices
512!> \param sab_nl_nosym neighbourlist that defines real space matrices, non-symmetric
513!> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
514!> \param symmetry_backend k-point symmetry backend
515!> \param symmetry_reduction_method k-point symmetry reduction method
516!> \param gamma_centered ...
517!> \author JGH
518! **************************************************************************************************
519 SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
520 full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
521 para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
522 kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
523 sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
524 symmetry_reduction_method, gamma_centered)
525 TYPE(kpoint_type), INTENT(IN) :: kpoint
526 CHARACTER(LEN=*), OPTIONAL :: kp_scheme
527 INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
528 REAL(kind=dp), DIMENSION(3), OPTIONAL :: kp_shift
529 LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
531 REAL(kind=dp), OPTIONAL :: eps_geo
532 INTEGER, OPTIONAL :: parallel_group_size
533 INTEGER, DIMENSION(2), OPTIONAL :: kp_range
534 INTEGER, OPTIONAL :: nkp
535 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
536 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
537 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
538 TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
539 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
540 TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
541 TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
542 POINTER :: kp_env, kp_aux_env
543 TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
544 LOGICAL, OPTIONAL :: iogrp
545 INTEGER, OPTIONAL :: nkp_groups
546 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
547 INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
548 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
549 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
550 OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
551 LOGICAL, OPTIONAL :: inversion_symmetry_only
552 INTEGER, OPTIONAL :: symmetry_backend, &
553 symmetry_reduction_method
554 LOGICAL, OPTIONAL :: gamma_centered
555
556 IF (PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
557 IF (PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
558 IF (PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
559 IF (PRESENT(gamma_centered)) gamma_centered = kpoint%gamma_centered
560 IF (PRESENT(symmetry)) symmetry = kpoint%symmetry
561 IF (PRESENT(verbose)) verbose = kpoint%verbose
562 IF (PRESENT(full_grid)) full_grid = kpoint%full_grid
563 IF (PRESENT(inversion_symmetry_only)) inversion_symmetry_only = kpoint%inversion_symmetry_only
564 IF (PRESENT(symmetry_backend)) symmetry_backend = kpoint%symmetry_backend
565 IF (PRESENT(symmetry_reduction_method)) &
566 symmetry_reduction_method = kpoint%symmetry_reduction_method
567 IF (PRESENT(use_real_wfn)) use_real_wfn = kpoint%use_real_wfn
568 IF (PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
569 IF (PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
570
571 IF (PRESENT(nkp)) nkp = kpoint%nkp
572 IF (PRESENT(wkp)) wkp => kpoint%wkp
573 IF (PRESENT(xkp)) xkp => kpoint%xkp
574
575 IF (PRESENT(para_env)) para_env => kpoint%para_env
576 IF (PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
577 IF (PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
578 IF (PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
579 IF (PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
580
581 IF (PRESENT(iogrp)) iogrp = kpoint%iogrp
582 IF (PRESENT(kp_range)) kp_range = kpoint%kp_range
583 IF (PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
584 IF (PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
585
586 IF (PRESENT(kp_env)) kp_env => kpoint%kp_env
587 IF (PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
588 IF (PRESENT(mpools)) mpools => kpoint%mpools
589
590 IF (PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
591 IF (PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
592 IF (PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
593 IF (PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
594
595 END SUBROUTINE get_kpoint_info
596
597! **************************************************************************************************
598!> \brief Set information in a kpoint environment
599!> \param kpoint The kpoint environment
600!> \param kp_scheme Type of kpoint grid
601!> \param nkp_grid Grid points
602!> \param kp_shift Shift of the grid
603!> \param symmetry use symmetry (atoms) to reduce kpoints
604!> \param verbose more output information
605!> \param full_grid don't reduce kpoints at all
606!> \param use_real_wfn real/complex wfn
607!> \param eps_geo accuracy of atom symmetry detection
608!> \param parallel_group_size kpoint group size
609!> \param kp_range kpoints distribution for local processor
610!> \param nkp number of kpoints
611!> \param xkp kpoint coordinates
612!> \param wkp kpoint weights
613!> \param para_env 'global' parallel environment
614!> \param blacs_env_all BLACS env for the total environment
615!> \param para_env_kp parallel environment of the kpoint calculation
616!> \param para_env_inter_kp parallel environment between kpoints
617!> \param blacs_env BLACS env for the kpoint group
618!> \param kp_env Information for each kpoint
619!> \param kp_aux_env ...
620!> \param mpools FM matrix pools for kpoint groups
621!> \param iogrp this kpoint group has the IO processor
622!> \param nkp_groups number of kpoint groups
623!> \param kp_dist kpoints distribution on groups
624!> \param cell_to_index given a cell triple, returns the real space index
625!> \param index_to_cell ...
626!> \param sab_nl neighbourlist that defines real space matrices
627!> \param sab_nl_nosym neighbourlist that defines real space matrices
628!> \param inversion_symmetry_only reduce kpoints only by inversion symmetry
629!> \param symmetry_backend k-point symmetry backend
630!> \param symmetry_reduction_method k-point symmetry reduction method
631!> \param gamma_centered ...
632!> \author JGH
633! **************************************************************************************************
634 SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
635 full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
636 para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
637 kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
638 sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
639 symmetry_reduction_method, gamma_centered)
640 TYPE(kpoint_type), INTENT(INOUT) :: kpoint
641 CHARACTER(LEN=*), OPTIONAL :: kp_scheme
642 INTEGER, DIMENSION(3), OPTIONAL :: nkp_grid
643 REAL(kind=dp), DIMENSION(3), OPTIONAL :: kp_shift
644 LOGICAL, OPTIONAL :: symmetry, verbose, full_grid, &
646 REAL(kind=dp), OPTIONAL :: eps_geo
647 INTEGER, OPTIONAL :: parallel_group_size
648 INTEGER, DIMENSION(2), OPTIONAL :: kp_range
649 INTEGER, OPTIONAL :: nkp
650 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: xkp
651 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
652 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
653 TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env_all
654 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_kp, para_env_inter_kp
655 TYPE(cp_blacs_env_type), OPTIONAL, POINTER :: blacs_env
656 TYPE(kpoint_env_p_type), DIMENSION(:), OPTIONAL, &
657 POINTER :: kp_env, kp_aux_env
658 TYPE(qs_matrix_pools_type), OPTIONAL, POINTER :: mpools
659 LOGICAL, OPTIONAL :: iogrp
660 INTEGER, OPTIONAL :: nkp_groups
661 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: kp_dist
662 INTEGER, DIMENSION(:, :, :), OPTIONAL, POINTER :: cell_to_index
663 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: index_to_cell
664 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
665 OPTIONAL, POINTER :: sab_nl, sab_nl_nosym
666 LOGICAL, OPTIONAL :: inversion_symmetry_only
667 INTEGER, OPTIONAL :: symmetry_backend, &
668 symmetry_reduction_method
669 LOGICAL, OPTIONAL :: gamma_centered
670
671 IF (PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
672 IF (PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
673 IF (PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
674 IF (PRESENT(gamma_centered)) kpoint%gamma_centered = gamma_centered
675 IF (PRESENT(symmetry)) kpoint%symmetry = symmetry
676 IF (PRESENT(verbose)) kpoint%verbose = verbose
677 IF (PRESENT(full_grid)) kpoint%full_grid = full_grid
678 IF (PRESENT(inversion_symmetry_only)) kpoint%inversion_symmetry_only = inversion_symmetry_only
679 IF (PRESENT(symmetry_backend)) kpoint%symmetry_backend = symmetry_backend
680 IF (PRESENT(symmetry_reduction_method)) &
681 kpoint%symmetry_reduction_method = symmetry_reduction_method
682 IF (PRESENT(use_real_wfn)) kpoint%use_real_wfn = use_real_wfn
683 IF (PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
684 IF (PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
685
686 IF (PRESENT(nkp)) kpoint%nkp = nkp
687 IF (PRESENT(wkp)) kpoint%wkp => wkp
688 IF (PRESENT(xkp)) kpoint%xkp => xkp
689
690 IF (PRESENT(para_env)) kpoint%para_env => para_env
691 IF (PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
692 IF (PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
693 IF (PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
694 IF (PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
695
696 IF (PRESENT(iogrp)) kpoint%iogrp = iogrp
697 IF (PRESENT(kp_range)) kpoint%kp_range = kp_range
698 IF (PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
699 IF (PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
700
701 IF (PRESENT(kp_env)) kpoint%kp_env => kp_env
702 IF (PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
703 IF (PRESENT(mpools)) kpoint%mpools => mpools
704 IF (PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
705 IF (PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
706
707 IF (PRESENT(cell_to_index)) THEN
708 IF (ASSOCIATED(kpoint%cell_to_index)) DEALLOCATE (kpoint%cell_to_index)
709 kpoint%cell_to_index => cell_to_index
710 END IF
711
712 IF (PRESENT(index_to_cell)) THEN
713 IF (ASSOCIATED(kpoint%index_to_cell)) DEALLOCATE (kpoint%index_to_cell)
714 kpoint%index_to_cell => index_to_cell
715 END IF
716
717 END SUBROUTINE set_kpoint_info
718
719! **************************************************************************************************
720!> \brief Read the kpoint input section
721!> \param kpoint The kpoint environment
722!> \param kpoint_section The input section
723!> \param a_vec ...
724!> \param cell ...
725!> \author JGH
726! **************************************************************************************************
727 SUBROUTINE read_kpoint_section(kpoint, kpoint_section, a_vec, cell)
728 TYPE(kpoint_type), INTENT(INOUT) :: kpoint
729 TYPE(section_vals_type), POINTER :: kpoint_section
730 REAL(kind=dp), DIMENSION(3, 3), INTENT(IN) :: a_vec
731 TYPE(cell_type), OPTIONAL, POINTER :: cell
732
733 REAL(kind=dp), PARAMETER :: eps_cell = 1.0e-14_dp
734
735 CHARACTER(LEN=default_string_length) :: ustr
736 CHARACTER(LEN=default_string_length), &
737 DIMENSION(:), POINTER :: tmpstringlist
738 INTEGER :: i, n_rep, nval, wfntype
739 LOGICAL :: available, backend_explicit, &
740 non_lower_triangular_cell, &
741 non_orthogonal_cell, reduction_explicit
742 REAL(kind=dp) :: ff
743 REAL(kind=dp), DIMENSION(3, 3) :: cart_a_vec
744 REAL(kind=dp), DIMENSION(:), POINTER :: reallist
745
746 CALL section_vals_get(kpoint_section, explicit=available)
747 cart_a_vec(:, :) = a_vec(:, :)
748 IF (PRESENT(cell)) THEN
749 IF (ASSOCIATED(cell)) THEN
750 IF (cell%input_cell_canonicalized) cart_a_vec(:, :) = cell%input_hmat(:, :)
751 END IF
752 END IF
753
754 IF (available) THEN
755 CALL section_vals_val_get(kpoint_section, "SCHEME", c_vals=tmpstringlist)
756 nval = SIZE(tmpstringlist)
757 cpassert(nval >= 1)
758 kpoint%kp_scheme = tmpstringlist(1)
759 CALL uppercase(kpoint%kp_scheme)
760
761 ! SCHEME [None, Gamma, Monkhorst-Pack, MacDonald, General]
762 SELECT CASE (kpoint%kp_scheme)
763 CASE ("NONE")
764 ! do nothing
765 CASE ("GAMMA")
766 ! do nothing
767 CASE ("MONKHORST-PACK")
768 cpassert(nval >= 4)
769 DO i = 2, 4
770 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
771 END DO
772 CASE ("MACDONALD")
773 cpassert(nval >= 7)
774 DO i = 2, 4
775 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
776 END DO
777 DO i = 5, 7
778 READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
779 END DO
780 CASE ("GENERAL")
781 CALL section_vals_val_get(kpoint_section, "UNITS", c_val=ustr)
782 CALL uppercase(ustr)
783 CALL section_vals_val_get(kpoint_section, "KPOINT", n_rep_val=n_rep)
784 kpoint%nkp = n_rep
785 IF (ASSOCIATED(kpoint%xkp_input)) THEN
786 DEALLOCATE (kpoint%xkp_input)
787 NULLIFY (kpoint%xkp_input)
788 END IF
789 IF (ASSOCIATED(kpoint%wkp_input)) THEN
790 DEALLOCATE (kpoint%wkp_input)
791 NULLIFY (kpoint%wkp_input)
792 END IF
793 ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
794 DO i = 1, n_rep
795 CALL section_vals_val_get(kpoint_section, "KPOINT", i_rep_val=i, &
796 r_vals=reallist)
797 nval = SIZE(reallist)
798 cpassert(nval >= 4)
799 SELECT CASE (ustr)
800 CASE ("B_VECTOR")
801 kpoint%xkp(1:3, i) = reallist(1:3)
802 CASE ("CART_ANGSTROM")
803 kpoint%xkp(1:3, i) = (reallist(1)*cart_a_vec(1, 1:3) + &
804 reallist(2)*cart_a_vec(2, 1:3) + &
805 reallist(3)*cart_a_vec(3, 1:3))/twopi*angstrom
806 CASE ("CART_BOHR")
807 kpoint%xkp(1:3, i) = (reallist(1)*cart_a_vec(1, 1:3) + &
808 reallist(2)*cart_a_vec(2, 1:3) + &
809 reallist(3)*cart_a_vec(3, 1:3))/twopi
810 CASE DEFAULT
811 cpabort("Unknown Unit for kpoint definition")
812 END SELECT
813 kpoint%wkp(i) = reallist(4)
814 END DO
815 ff = 1.0_dp/sum(kpoint%wkp(:))
816 kpoint%wkp(:) = ff*kpoint%wkp(:)
817 ALLOCATE (kpoint%xkp_input(3, n_rep), kpoint%wkp_input(n_rep))
818 kpoint%xkp_input(1:3, 1:n_rep) = kpoint%xkp(1:3, 1:n_rep)
819 kpoint%wkp_input(1:n_rep) = kpoint%wkp(1:n_rep)
820 CASE DEFAULT
821 CALL cp_abort(__location__, &
822 "<NONE>, <GAMMA>, <MONKHORST-PACK>, <MACDONALD>, "// &
823 "<GENERAL> are supported as the <kpoint%kp_scheme> for "// &
824 "read_kpoint_section, found unknown option "// &
825 "<"//trim(kpoint%kp_scheme)//">")
826 END SELECT
827
828 CALL section_vals_val_get(kpoint_section, "GAMMA_CENTERED", l_val=kpoint%gamma_centered)
829 IF (kpoint%gamma_centered .AND. kpoint%kp_scheme /= "MONKHORST-PACK" .AND. &
830 kpoint%kp_scheme /= "MACDONALD") THEN
831 CALL cp_abort(__location__, &
832 "KPOINTS%GAMMA_CENTERED is only supported with SCHEME MONKHORST-PACK or MACDONALD")
833 END IF
834
835 CALL section_vals_val_get(kpoint_section, "SYMMETRY", l_val=kpoint%symmetry)
836 CALL section_vals_val_get(kpoint_section, "WAVEFUNCTIONS", i_val=wfntype)
837 CALL section_vals_val_get(kpoint_section, "VERBOSE", l_val=kpoint%verbose)
838 CALL section_vals_val_get(kpoint_section, "FULL_GRID", l_val=kpoint%full_grid)
839 CALL section_vals_val_get(kpoint_section, "INVERSION_SYMMETRY_ONLY", &
840 l_val=kpoint%inversion_symmetry_only)
841 CALL section_vals_val_get(kpoint_section, "SYMMETRY_BACKEND", &
842 i_val=kpoint%symmetry_backend, explicit=backend_explicit)
843 CALL section_vals_val_get(kpoint_section, "SYMMETRY_REDUCTION_METHOD", &
844 i_val=kpoint%symmetry_reduction_method, explicit=reduction_explicit)
845 CALL resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
846 CALL section_vals_val_get(kpoint_section, "EPS_SYMMETRY", r_val=kpoint%eps_geo)
847 IF ((kpoint%kp_scheme == "MONKHORST-PACK" .OR. kpoint%kp_scheme == "MACDONALD") .AND. &
848 kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
849 .NOT. kpoint%inversion_symmetry_only) THEN
850 non_lower_triangular_cell = (abs(a_vec(2, 1)) > eps_cell) .OR. &
851 (abs(a_vec(3, 1)) > eps_cell) .OR. &
852 (abs(a_vec(3, 2)) > eps_cell)
853 non_orthogonal_cell = (abs(dot_product(a_vec(:, 1), a_vec(:, 2))) > eps_cell) .OR. &
854 (abs(dot_product(a_vec(:, 1), a_vec(:, 3))) > eps_cell) .OR. &
855 (abs(dot_product(a_vec(:, 2), a_vec(:, 3))) > eps_cell)
856 ! The full point-group density-matrix transform is not charge-conserving for skew cells.
857 IF (non_orthogonal_cell) THEN
858 kpoint%inversion_symmetry_only = .true.
859 CALL cp_warn(__location__, &
860 "Full atomic k-point symmetry was requested for a non-orthogonal cell. "// &
861 "Falling back to KPOINTS%INVERSION_SYMMETRY_ONLY because the full "// &
862 "point-group density-matrix symmetrization is only charge-conserving for "// &
863 "orthogonal cell matrices.")
864 ELSEIF (non_lower_triangular_cell) THEN
865 kpoint%inversion_symmetry_only = .true.
866 CALL cp_warn(__location__, &
867 "Full atomic k-point symmetry was requested for a cell matrix that does "// &
868 "not follow the CP2K lower-triangular convention. Falling back to "// &
869 "KPOINTS%INVERSION_SYMMETRY_ONLY. Use ABC/ALPHA_BETA_GAMMA or canonical "// &
870 "A/B/C vectors to enable full point-group k-point reduction.")
871 END IF
872 END IF
873 CALL section_vals_val_get(kpoint_section, "PARALLEL_GROUP_SIZE", &
874 i_val=kpoint%parallel_group_size)
875 SELECT CASE (wfntype)
876 CASE (use_real_wfn)
877 kpoint%use_real_wfn = .true.
878 CASE (use_complex_wfn)
879 kpoint%use_real_wfn = .false.
880 CASE DEFAULT
881 cpabort("The WAVEFUNCTIONS option should be either REAL or COMPLEX")
882 END SELECT
883
884 ELSE
885 kpoint%kp_scheme = "NONE"
886 END IF
887
888 END SUBROUTINE read_kpoint_section
889
890! **************************************************************************************************
891!> \brief Resolve legacy and backend k-point symmetry settings
892!> \param kpoint ...
893!> \param backend_explicit whether SYMMETRY_BACKEND was given
894!> \param reduction_explicit whether SYMMETRY_REDUCTION_METHOD was given
895! **************************************************************************************************
896 SUBROUTINE resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
897 TYPE(kpoint_type), INTENT(INOUT) :: kpoint
898 LOGICAL, INTENT(IN) :: backend_explicit, reduction_explicit
899
900 IF (backend_explicit .AND. .NOT. reduction_explicit) THEN
901 SELECT CASE (kpoint%symmetry_backend)
903 kpoint%symmetry_reduction_method = use_k290_kpoint_symmetry
905 kpoint%symmetry_reduction_method = use_spglib_kpoint_symmetry
906 CASE DEFAULT
907 cpabort("Unknown k-point symmetry backend")
908 END SELECT
909 END IF
910
911 IF (kpoint%symmetry_backend == use_spglib_kpoint_backend .AND. &
912 kpoint%symmetry_reduction_method /= use_spglib_kpoint_symmetry) THEN
913 CALL cp_abort(__location__, &
914 "SYMMETRY_BACKEND SPGLIB requires SYMMETRY_REDUCTION_METHOD SPGLIB")
915 END IF
916
917 END SUBROUTINE resolve_kpoint_symmetry_settings
918
919! **************************************************************************************************
920!> \brief Write information on the kpoints to output
921!> \param kpoint The kpoint environment
922!> \param iounit output unit
923!> \param dft_section DFT section information for output unit
924!> \author JGH
925! **************************************************************************************************
926 SUBROUTINE write_kpoint_info(kpoint, iounit, dft_section)
927 TYPE(kpoint_type), INTENT(IN) :: kpoint
928 INTEGER, INTENT(IN), OPTIONAL :: iounit
929 TYPE(section_vals_type), INTENT(IN), OPTIONAL :: dft_section
930
931 INTEGER :: i, punit
932 TYPE(cp_logger_type), POINTER :: logger
933
934 NULLIFY (logger)
935 logger => cp_get_default_logger()
936
937 IF (PRESENT(dft_section)) THEN
938 punit = cp_print_key_unit_nr(logger, dft_section, "PRINT%KPOINTS", extension=".Log")
939 ELSE IF (PRESENT(iounit)) THEN
940 punit = iounit
941 ELSE
942 punit = cp_logger_get_default_unit_nr(logger)
943 END IF
944
945 IF (punit > 0) THEN
946
947 IF (kpoint%kp_scheme /= "NONE") THEN
948 WRITE (punit, '(/," ",79("*"),/,T37,A,/," ",79("*"))') "Kpoints"
949 END IF
950 SELECT CASE (kpoint%kp_scheme)
951 CASE ("NONE")
952 ! be silent
953 CASE ("GAMMA")
954 WRITE (punit, '(A,T57,A)') ' BRILLOUIN|', ' Gamma-point calculation'
955 CASE ("MONKHORST-PACK")
956 WRITE (punit, '(A,T61,A20)') ' BRILLOUIN| K-point scheme ', ' Monkhorst-Pack'
957 WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
958 IF (kpoint%gamma_centered) THEN
959 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Gamma-centered k-point mesh', ' ON'
960 END IF
961 WRITE (punit, '(A,T66,G15.6)') &
962 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
963 CASE ("MACDONALD")
964 WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' MacDonald'
965 WRITE (punit, '(A,T66,3I5)') ' BRILLOUIN| K-Point grid', kpoint%nkp_grid
966 WRITE (punit, '(A,T51,3F10.4)') ' BRILLOUIN| K-Point shift', kpoint%kp_shift
967 IF (kpoint%gamma_centered) THEN
968 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Gamma-centered k-point mesh', ' ON'
969 END IF
970 WRITE (punit, '(A,T66,G15.6)') &
971 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
972 CASE ("GENERAL")
973 WRITE (punit, '(A,T71,A10)') ' BRILLOUIN| K-point scheme ', ' General'
974 CASE DEFAULT
975 CALL cp_abort(__location__, &
976 "<NONE>, <GAMMA>, <MONKHORST-PACK>, <MACDONALD>, "// &
977 "<GENERAL> are supported as the <kpoint%kp_scheme> for "// &
978 "write_kpoint_info, found unknown option "// &
979 "<"//trim(kpoint%kp_scheme)//">")
980 END SELECT
981 IF (kpoint%kp_scheme /= "NONE") THEN
982 IF (kpoint%symmetry) THEN
983 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' ON'
984 ELSE
985 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| K-Point point group symmetrization', ' OFF'
986 END IF
987 IF (kpoint%inversion_symmetry_only) THEN
988 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Restrict symmetry to inversion', ' ON'
989 END IF
990 IF (kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
991 .NOT. kpoint%inversion_symmetry_only .AND. &
992 (kpoint%kp_scheme == "MONKHORST-PACK" .OR. kpoint%kp_scheme == "MACDONALD" .OR. &
993 kpoint%kp_scheme == "GENERAL")) THEN
994 SELECT CASE (kpoint%symmetry_backend)
996 WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', ' K290'
998 WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry backend', ' SPGLIB'
999 CASE DEFAULT
1000 cpabort("Unknown k-point symmetry backend")
1001 END SELECT
1002 SELECT CASE (kpoint%symmetry_reduction_method)
1004 WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', ' K290'
1006 WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Symmetry reduction method', ' SPGLIB'
1007 CASE DEFAULT
1008 cpabort("Unknown k-point symmetry reduction method")
1009 END SELECT
1010 END IF
1011 IF (kpoint%use_real_wfn) THEN
1012 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Wavefunction type', ' REAL'
1013 ELSE
1014 WRITE (punit, '(A,T73,A)') ' BRILLOUIN| Wavefunction type', ' COMPLEX'
1015 END IF
1016 IF (kpoint%full_grid) THEN
1017 WRITE (punit, '(A,T76,A)') ' BRILLOUIN| Use full k-point grid '
1018 END IF
1019 IF (kpoint%kp_scheme /= "GAMMA") THEN
1020 WRITE (punit, '(A,T71,I10)') ' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
1021 WRITE (punit, '(A,T30,A,T48,A,T63,A,T78,A)') &
1022 ' BRILLOUIN| Number ', 'Weight', 'X', 'Y', 'Z'
1023 DO i = 1, kpoint%nkp
1024 WRITE (punit, '(A,I5,3X,4F15.5)') ' BRILLOUIN| ', i, kpoint%wkp(i), &
1025 kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
1026 END DO
1027 END IF
1028 WRITE (punit, '(" ",79("*"))')
1029 END IF
1030
1031 END IF
1032
1033 IF (PRESENT(dft_section)) THEN
1034 CALL cp_print_key_finished_output(punit, logger, dft_section, "PRINT%KPOINTS")
1035 END IF
1036
1037 END SUBROUTINE write_kpoint_info
1038
1039! **************************************************************************************************
1040!> \brief Create a single kpoint environment
1041!> \param kp_env Single kpoint environment
1042!> \author JGH
1043! **************************************************************************************************
1044 SUBROUTINE kpoint_env_create(kp_env)
1045 TYPE(kpoint_env_type), POINTER :: kp_env
1046
1047 cpassert(.NOT. ASSOCIATED(kp_env))
1048
1049 ALLOCATE (kp_env)
1050
1051 kp_env%nkpoint = 0
1052 kp_env%wkp = 0.0_dp
1053 kp_env%xkp = 0.0_dp
1054 kp_env%is_local = .false.
1055
1056 NULLIFY (kp_env%mos)
1057 NULLIFY (kp_env%pmat)
1058 NULLIFY (kp_env%wmat)
1059 NULLIFY (kp_env%smat)
1060 NULLIFY (kp_env%amat)
1061
1062 END SUBROUTINE kpoint_env_create
1063
1064! **************************************************************************************************
1065!> \brief Release a single kpoint environment
1066!> \param kp_env Single kpoint environment
1067!> \author JGH
1068! **************************************************************************************************
1069 SUBROUTINE kpoint_env_release(kp_env)
1070 TYPE(kpoint_env_type), POINTER :: kp_env
1071
1072 INTEGER :: ic, is
1073
1074 IF (ASSOCIATED(kp_env)) THEN
1075
1076 IF (ASSOCIATED(kp_env%mos)) THEN
1077 DO is = 1, SIZE(kp_env%mos, 2)
1078 DO ic = 1, SIZE(kp_env%mos, 1)
1079 CALL deallocate_mo_set(kp_env%mos(ic, is))
1080 END DO
1081 END DO
1082 DEALLOCATE (kp_env%mos)
1083 END IF
1084
1085 CALL cp_fm_release(kp_env%pmat)
1086 CALL cp_fm_release(kp_env%wmat)
1087 CALL cp_fm_release(kp_env%smat)
1088 CALL cp_fm_release(kp_env%amat)
1089
1090 CALL cp_fm_release(kp_env%shalf)
1091 CALL cp_cfm_release(kp_env%cshalf)
1092
1093 DEALLOCATE (kp_env)
1094
1095 END IF
1096
1097 END SUBROUTINE kpoint_env_release
1098
1099! **************************************************************************************************
1100!> \brief Get information from a single kpoint environment
1101!> \param kpoint_env Single kpoint environment
1102!> \param nkpoint Index of kpoint
1103!> \param wkp Weight of kpoint
1104!> \param xkp Coordinates of kpoint
1105!> \param is_local Is this kpoint local (single cpu group)
1106!> \param mos MOs of this kpoint
1107!> \author JGH
1108! **************************************************************************************************
1109 SUBROUTINE get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
1110 TYPE(kpoint_env_type), INTENT(IN) :: kpoint_env
1111 INTEGER, OPTIONAL :: nkpoint
1112 REAL(kind=dp), OPTIONAL :: wkp
1113 REAL(kind=dp), DIMENSION(3), OPTIONAL :: xkp
1114 LOGICAL, OPTIONAL :: is_local
1115 TYPE(mo_set_type), DIMENSION(:, :), OPTIONAL, &
1116 POINTER :: mos
1117
1118 IF (PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
1119 IF (PRESENT(wkp)) wkp = kpoint_env%wkp
1120 IF (PRESENT(xkp)) xkp = kpoint_env%xkp
1121 IF (PRESENT(is_local)) is_local = kpoint_env%is_local
1122 IF (PRESENT(mos)) mos => kpoint_env%mos
1123
1124 END SUBROUTINE get_kpoint_env
1125
1126! **************************************************************************************************
1127!> \brief Create a single kpoint symmetry environment
1128!> \param kp_sym ...
1129!> \author JGH
1130! **************************************************************************************************
1131 SUBROUTINE kpoint_sym_create(kp_sym)
1132 TYPE(kpoint_sym_type), POINTER :: kp_sym
1133
1134 cpassert(.NOT. ASSOCIATED(kp_sym))
1135
1136 ALLOCATE (kp_sym)
1137
1138 kp_sym%nwght = 0
1139 kp_sym%nwred = 0
1140 kp_sym%apply_symmetry = .false.
1141
1142 NULLIFY (kp_sym%rot)
1143 NULLIFY (kp_sym%xkp)
1144 NULLIFY (kp_sym%rotp)
1145 NULLIFY (kp_sym%f0)
1146 NULLIFY (kp_sym%fcell)
1147 NULLIFY (kp_sym%kgphase)
1148
1149 END SUBROUTINE kpoint_sym_create
1150
1151! **************************************************************************************************
1152!> \brief Release a single kpoint symmetry environment
1153!> \param kp_sym ...
1154!> \author JGH
1155! **************************************************************************************************
1156 SUBROUTINE kpoint_sym_release(kp_sym)
1157 TYPE(kpoint_sym_type), POINTER :: kp_sym
1158
1159 IF (ASSOCIATED(kp_sym)) THEN
1160
1161 IF (ASSOCIATED(kp_sym%rot)) THEN
1162 DEALLOCATE (kp_sym%rot)
1163 END IF
1164 IF (ASSOCIATED(kp_sym%xkp)) THEN
1165 DEALLOCATE (kp_sym%xkp)
1166 END IF
1167 IF (ASSOCIATED(kp_sym%f0)) THEN
1168 DEALLOCATE (kp_sym%f0)
1169 END IF
1170 IF (ASSOCIATED(kp_sym%fcell)) THEN
1171 DEALLOCATE (kp_sym%fcell)
1172 END IF
1173 IF (ASSOCIATED(kp_sym%kgphase)) THEN
1174 DEALLOCATE (kp_sym%kgphase)
1175 END IF
1176 IF (ASSOCIATED(kp_sym%rotp)) THEN
1177 DEALLOCATE (kp_sym%rotp)
1178 END IF
1179
1180 DEALLOCATE (kp_sym)
1181
1182 END IF
1183
1184 END SUBROUTINE kpoint_sym_release
1185
1186! **************************************************************************************************
1187
1188END MODULE kpoint_types
Handles all functions related to the CELL.
Definition cell_types.F:15
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
function that build the kpoints section of the input
integer, parameter, public use_spglib_kpoint_symmetry
integer, parameter, public use_k290_kpoint_symmetry
integer, parameter, public use_real_wfn
integer, parameter, public use_spglib_kpoint_backend
integer, parameter, public use_k290_kpoint_backend
integer, parameter, public use_complex_wfn
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_sym_create(kp_sym)
Create a single kpoint symmetry environment.
subroutine, public set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Set information in a kpoint environment.
subroutine, public get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
Get information from a single kpoint environment.
subroutine, public kpoint_reset_initialization(kpoint)
Reset all data derived from a concrete k-point initialization. Input options such as the scheme,...
subroutine, public kpoint_env_create(kp_env)
Create a single kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
subroutine, public write_kpoint_info(kpoint, iounit, dft_section)
Write information on the kpoints to output.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
subroutine, public read_kpoint_section(kpoint, kpoint_section, a_vec, cell)
Read the kpoint input section.
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
buffer for the diis of the scf
subroutine, public qs_diis_b_release_kp(diis_buffer)
releases the given diis KP buffer
wrapper for the pools of matrixes
subroutine, public mpools_release(mpools)
releases the given mpools
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
Define the neighbor list data types and the corresponding functionality.
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Rotation matrices for basis sets.
Keeps information about a specific k-point.
Keeps symmetry information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
build arrau of pointers to diis buffers in the k-point (complex full matrices) case
container for the pools of matrixes used by qs