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