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