50#include "./base/base_uses.f90"
56 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'kpoint_types'
83 INTEGER :: nkpoint = -1
84 REAL(kind=
dp) :: wkp = 0.0_dp
85 REAL(kind=
dp),
DIMENSION(3) :: xkp = 0.0_dp
86 LOGICAL :: is_local = .false.
88 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: pmat => null()
89 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: wmat => null()
90 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: smat => null()
91 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: amat => null()
106 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rmat => null()
121 LOGICAL :: apply_symmetry = .false.
122 INTEGER :: nwght = -1
123 INTEGER :: nwred = -1
124 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp => null()
125 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rot => null()
126 INTEGER,
DIMENSION(:),
POINTER :: rotp => null()
127 INTEGER,
DIMENSION(:, :),
POINTER :: f0 => null()
128 INTEGER,
DIMENSION(:, :, :),
POINTER :: fcell => null()
129 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kgphase => null()
132 TYPE kpoint_sym_p_type
134 END TYPE kpoint_sym_p_type
171 CHARACTER(LEN=default_string_length) :: kp_scheme =
""
172 INTEGER,
DIMENSION(3) :: nkp_grid = -1
173 REAL(kind=
dp),
DIMENSION(3) :: kp_shift = 0.0_dp
174 LOGICAL :: gamma_centered = .false.
176 LOGICAL :: symmetry = .false.
177 LOGICAL :: full_grid = .false.
178 LOGICAL :: inversion_symmetry_only = .false.
181 LOGICAL :: verbose = .false.
182 REAL(kind=
dp) :: eps_geo = 0.0_dp
183 INTEGER :: parallel_group_size = -1
185 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp => null()
186 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp => null()
187 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp_input => null()
188 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp_input => null()
193 para_env_inter_kp => null()
194 LOGICAL :: iogrp = .false.
195 INTEGER :: nkp_groups = -1
196 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist => null()
197 INTEGER,
DIMENSION(2) :: kp_range = -1
199 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index => null()
200 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell => null()
202 DIMENSION(:),
POINTER :: sab_nl => null(), &
203 sab_nl_nosym => null()
206 POINTER :: kp_env => null()
208 POINTER :: kp_aux_env => null()
210 TYPE(kpoint_sym_p_type),
DIMENSION(:), &
211 POINTER :: kp_sym => null()
212 INTEGER,
DIMENSION(:),
POINTER :: atype => null()
213 INTEGER,
DIMENSION(:),
POINTER :: ibrot => null()
215 POINTER :: kind_rotmat => null()
234 cpassert(.NOT.
ASSOCIATED(kpoint))
238 kpoint%kp_scheme =
""
240 kpoint%kp_shift = 0.0_dp
241 kpoint%gamma_centered = .false.
242 kpoint%symmetry = .false.
243 kpoint%verbose = .false.
244 kpoint%full_grid = .false.
245 kpoint%inversion_symmetry_only = .false.
248 kpoint%use_real_wfn = .false.
249 kpoint%eps_geo = 1.0e-6_dp
250 kpoint%parallel_group_size = -1
254 NULLIFY (kpoint%xkp, kpoint%wkp)
255 NULLIFY (kpoint%xkp_input, kpoint%wkp_input)
256 NULLIFY (kpoint%kp_dist)
258 NULLIFY (kpoint%para_env)
259 NULLIFY (kpoint%blacs_env_all)
260 NULLIFY (kpoint%para_env_kp, kpoint%para_env_inter_kp)
261 NULLIFY (kpoint%blacs_env)
262 kpoint%nkp_groups = 0
263 kpoint%iogrp = .false.
266 NULLIFY (kpoint%kp_env)
267 NULLIFY (kpoint%mpools)
269 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
270 kpoint%cell_to_index(:, :, :) = 1
272 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
273 kpoint%index_to_cell(:, :) = 0
287 IF (
ASSOCIATED(kpoint))
THEN
289 IF (
ASSOCIATED(kpoint%xkp))
THEN
290 DEALLOCATE (kpoint%xkp)
292 IF (
ASSOCIATED(kpoint%wkp))
THEN
293 DEALLOCATE (kpoint%wkp)
295 IF (
ASSOCIATED(kpoint%xkp_input))
THEN
296 DEALLOCATE (kpoint%xkp_input)
298 IF (
ASSOCIATED(kpoint%wkp_input))
THEN
299 DEALLOCATE (kpoint%wkp_input)
301 IF (
ASSOCIATED(kpoint%kp_dist))
THEN
302 DEALLOCATE (kpoint%kp_dist)
315 IF (
ASSOCIATED(kpoint%cell_to_index))
DEALLOCATE (kpoint%cell_to_index)
316 IF (
ASSOCIATED(kpoint%index_to_cell))
DEALLOCATE (kpoint%index_to_cell)
318 IF (
ASSOCIATED(kpoint%kp_env))
THEN
319 DO ik = 1,
SIZE(kpoint%kp_env)
320 CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
322 DEALLOCATE (kpoint%kp_env)
325 IF (
ASSOCIATED(kpoint%kp_aux_env))
THEN
326 DO ik = 1,
SIZE(kpoint%kp_aux_env)
327 CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
329 DEALLOCATE (kpoint%kp_aux_env)
332 IF (
ASSOCIATED(kpoint%kp_sym))
THEN
333 DO ik = 1,
SIZE(kpoint%kp_sym)
334 CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
336 DEALLOCATE (kpoint%kp_sym)
339 IF (
ASSOCIATED(kpoint%atype))
DEALLOCATE (kpoint%atype)
340 IF (
ASSOCIATED(kpoint%ibrot))
DEALLOCATE (kpoint%ibrot)
342 IF (
ASSOCIATED(kpoint%kind_rotmat))
THEN
343 DO i = 1,
SIZE(kpoint%kind_rotmat, 1)
344 DO j = 1,
SIZE(kpoint%kind_rotmat, 2)
345 IF (
ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat))
THEN
346 DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
350 DEALLOCATE (kpoint%kind_rotmat)
353 IF (
ASSOCIATED(kpoint%scf_diis_buffer))
THEN
355 DEALLOCATE (kpoint%scf_diis_buffer)
374 IF (
ASSOCIATED(kpoint%xkp))
THEN
375 DEALLOCATE (kpoint%xkp)
378 IF (
ASSOCIATED(kpoint%wkp))
THEN
379 DEALLOCATE (kpoint%wkp)
382 IF (kpoint%kp_scheme ==
"GENERAL" .AND.
ASSOCIATED(kpoint%xkp_input) .AND. &
383 ASSOCIATED(kpoint%wkp_input))
THEN
384 kpoint%nkp =
SIZE(kpoint%wkp_input)
385 ALLOCATE (kpoint%xkp(3, kpoint%nkp), kpoint%wkp(kpoint%nkp))
386 kpoint%xkp(1:3, 1:kpoint%nkp) = kpoint%xkp_input(1:3, 1:kpoint%nkp)
387 kpoint%wkp(1:kpoint%nkp) = kpoint%wkp_input(1:kpoint%nkp)
389 IF (
ASSOCIATED(kpoint%kp_dist))
THEN
390 DEALLOCATE (kpoint%kp_dist)
391 NULLIFY (kpoint%kp_dist)
404 IF (
ASSOCIATED(kpoint%cell_to_index))
THEN
405 DEALLOCATE (kpoint%cell_to_index)
406 NULLIFY (kpoint%cell_to_index)
408 IF (
ASSOCIATED(kpoint%index_to_cell))
THEN
409 DEALLOCATE (kpoint%index_to_cell)
410 NULLIFY (kpoint%index_to_cell)
413 IF (
ASSOCIATED(kpoint%kp_env))
THEN
414 DO ik = 1,
SIZE(kpoint%kp_env)
415 CALL kpoint_env_release(kpoint%kp_env(ik)%kpoint_env)
417 DEALLOCATE (kpoint%kp_env)
418 NULLIFY (kpoint%kp_env)
421 IF (
ASSOCIATED(kpoint%kp_aux_env))
THEN
422 DO ik = 1,
SIZE(kpoint%kp_aux_env)
423 CALL kpoint_env_release(kpoint%kp_aux_env(ik)%kpoint_env)
425 DEALLOCATE (kpoint%kp_aux_env)
426 NULLIFY (kpoint%kp_aux_env)
429 IF (
ASSOCIATED(kpoint%kp_sym))
THEN
430 DO ik = 1,
SIZE(kpoint%kp_sym)
431 CALL kpoint_sym_release(kpoint%kp_sym(ik)%kpoint_sym)
433 DEALLOCATE (kpoint%kp_sym)
434 NULLIFY (kpoint%kp_sym)
437 IF (
ASSOCIATED(kpoint%atype))
THEN
438 DEALLOCATE (kpoint%atype)
439 NULLIFY (kpoint%atype)
441 IF (
ASSOCIATED(kpoint%ibrot))
THEN
442 DEALLOCATE (kpoint%ibrot)
443 NULLIFY (kpoint%ibrot)
446 IF (
ASSOCIATED(kpoint%kind_rotmat))
THEN
447 DO i = 1,
SIZE(kpoint%kind_rotmat, 1)
448 DO j = 1,
SIZE(kpoint%kind_rotmat, 2)
449 IF (
ASSOCIATED(kpoint%kind_rotmat(i, j)%rmat))
THEN
450 DEALLOCATE (kpoint%kind_rotmat(i, j)%rmat)
451 NULLIFY (kpoint%kind_rotmat(i, j)%rmat)
455 DEALLOCATE (kpoint%kind_rotmat)
456 NULLIFY (kpoint%kind_rotmat)
459 IF (
ASSOCIATED(kpoint%scf_diis_buffer))
THEN
461 DEALLOCATE (kpoint%scf_diis_buffer)
462 NULLIFY (kpoint%scf_diis_buffer)
465 NULLIFY (kpoint%sab_nl)
466 NULLIFY (kpoint%sab_nl_nosym)
468 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
469 kpoint%cell_to_index(:, :, :) = 1
471 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
472 kpoint%index_to_cell(:, :) = 0
474 IF (.NOT.
ASSOCIATED(kpoint%wkp)) kpoint%nkp = 0
475 kpoint%nkp_groups = 0
477 kpoint%iogrp = .false.
518 SUBROUTINE get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
519 full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
520 para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
521 kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
522 sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
523 symmetry_reduction_method, gamma_centered)
525 CHARACTER(LEN=*),
OPTIONAL :: kp_scheme
526 INTEGER,
DIMENSION(3),
OPTIONAL :: nkp_grid
527 REAL(kind=
dp),
DIMENSION(3),
OPTIONAL :: kp_shift
528 LOGICAL,
OPTIONAL :: symmetry, verbose, full_grid, &
530 REAL(kind=
dp),
OPTIONAL :: eps_geo
531 INTEGER,
OPTIONAL :: parallel_group_size
532 INTEGER,
DIMENSION(2),
OPTIONAL :: kp_range
533 INTEGER,
OPTIONAL :: nkp
534 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: xkp
535 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: wkp
541 POINTER :: kp_env, kp_aux_env
543 LOGICAL,
OPTIONAL :: iogrp
544 INTEGER,
OPTIONAL :: nkp_groups
545 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: kp_dist
546 INTEGER,
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: cell_to_index
547 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: index_to_cell
549 OPTIONAL,
POINTER :: sab_nl, sab_nl_nosym
550 LOGICAL,
OPTIONAL :: inversion_symmetry_only
551 INTEGER,
OPTIONAL :: symmetry_backend, &
552 symmetry_reduction_method
553 LOGICAL,
OPTIONAL :: gamma_centered
555 IF (
PRESENT(kp_scheme)) kp_scheme = kpoint%kp_scheme
556 IF (
PRESENT(nkp_grid)) nkp_grid = kpoint%nkp_grid
557 IF (
PRESENT(kp_shift)) kp_shift = kpoint%kp_shift
558 IF (
PRESENT(gamma_centered)) gamma_centered = kpoint%gamma_centered
559 IF (
PRESENT(symmetry)) symmetry = kpoint%symmetry
560 IF (
PRESENT(verbose)) verbose = kpoint%verbose
561 IF (
PRESENT(full_grid)) full_grid = kpoint%full_grid
562 IF (
PRESENT(inversion_symmetry_only)) inversion_symmetry_only = kpoint%inversion_symmetry_only
563 IF (
PRESENT(symmetry_backend)) symmetry_backend = kpoint%symmetry_backend
564 IF (
PRESENT(symmetry_reduction_method)) &
565 symmetry_reduction_method = kpoint%symmetry_reduction_method
567 IF (
PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
568 IF (
PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
570 IF (
PRESENT(nkp)) nkp = kpoint%nkp
571 IF (
PRESENT(wkp)) wkp => kpoint%wkp
572 IF (
PRESENT(xkp)) xkp => kpoint%xkp
574 IF (
PRESENT(para_env)) para_env => kpoint%para_env
575 IF (
PRESENT(para_env_kp)) para_env_kp => kpoint%para_env_kp
576 IF (
PRESENT(para_env_inter_kp)) para_env_inter_kp => kpoint%para_env_inter_kp
577 IF (
PRESENT(blacs_env_all)) blacs_env_all => kpoint%blacs_env_all
578 IF (
PRESENT(blacs_env)) blacs_env => kpoint%blacs_env
580 IF (
PRESENT(iogrp)) iogrp = kpoint%iogrp
581 IF (
PRESENT(kp_range)) kp_range = kpoint%kp_range
582 IF (
PRESENT(nkp_groups)) nkp_groups = kpoint%nkp_groups
583 IF (
PRESENT(kp_dist)) kp_dist => kpoint%kp_dist
585 IF (
PRESENT(kp_env)) kp_env => kpoint%kp_env
586 IF (
PRESENT(kp_aux_env)) kp_aux_env => kpoint%kp_aux_env
587 IF (
PRESENT(mpools)) mpools => kpoint%mpools
589 IF (
PRESENT(cell_to_index)) cell_to_index => kpoint%cell_to_index
590 IF (
PRESENT(index_to_cell)) index_to_cell => kpoint%index_to_cell
591 IF (
PRESENT(sab_nl)) sab_nl => kpoint%sab_nl
592 IF (
PRESENT(sab_nl_nosym)) sab_nl_nosym => kpoint%sab_nl_nosym
633 SUBROUTINE set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, &
634 full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, &
635 para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, &
636 kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, &
637 sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, &
638 symmetry_reduction_method, gamma_centered)
640 CHARACTER(LEN=*),
OPTIONAL :: kp_scheme
641 INTEGER,
DIMENSION(3),
OPTIONAL :: nkp_grid
642 REAL(kind=
dp),
DIMENSION(3),
OPTIONAL :: kp_shift
643 LOGICAL,
OPTIONAL :: symmetry, verbose, full_grid, &
645 REAL(kind=
dp),
OPTIONAL :: eps_geo
646 INTEGER,
OPTIONAL :: parallel_group_size
647 INTEGER,
DIMENSION(2),
OPTIONAL :: kp_range
648 INTEGER,
OPTIONAL :: nkp
649 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: xkp
650 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: wkp
656 POINTER :: kp_env, kp_aux_env
658 LOGICAL,
OPTIONAL :: iogrp
659 INTEGER,
OPTIONAL :: nkp_groups
660 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: kp_dist
661 INTEGER,
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: cell_to_index
662 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: index_to_cell
664 OPTIONAL,
POINTER :: sab_nl, sab_nl_nosym
665 LOGICAL,
OPTIONAL :: inversion_symmetry_only
666 INTEGER,
OPTIONAL :: symmetry_backend, &
667 symmetry_reduction_method
668 LOGICAL,
OPTIONAL :: gamma_centered
670 IF (
PRESENT(kp_scheme)) kpoint%kp_scheme = kp_scheme
671 IF (
PRESENT(nkp_grid)) kpoint%nkp_grid = nkp_grid
672 IF (
PRESENT(kp_shift)) kpoint%kp_shift = kp_shift
673 IF (
PRESENT(gamma_centered)) kpoint%gamma_centered = gamma_centered
674 IF (
PRESENT(symmetry)) kpoint%symmetry = symmetry
675 IF (
PRESENT(verbose)) kpoint%verbose = verbose
676 IF (
PRESENT(full_grid)) kpoint%full_grid = full_grid
677 IF (
PRESENT(inversion_symmetry_only)) kpoint%inversion_symmetry_only = inversion_symmetry_only
678 IF (
PRESENT(symmetry_backend)) kpoint%symmetry_backend = symmetry_backend
679 IF (
PRESENT(symmetry_reduction_method)) &
680 kpoint%symmetry_reduction_method = symmetry_reduction_method
682 IF (
PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
683 IF (
PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
685 IF (
PRESENT(nkp)) kpoint%nkp = nkp
686 IF (
PRESENT(wkp)) kpoint%wkp => wkp
687 IF (
PRESENT(xkp)) kpoint%xkp => xkp
689 IF (
PRESENT(para_env)) kpoint%para_env => para_env
690 IF (
PRESENT(para_env_kp)) kpoint%para_env_kp => para_env_kp
691 IF (
PRESENT(para_env_inter_kp)) kpoint%para_env_inter_kp => para_env_inter_kp
692 IF (
PRESENT(blacs_env_all)) kpoint%blacs_env_all => blacs_env_all
693 IF (
PRESENT(blacs_env)) kpoint%blacs_env => blacs_env
695 IF (
PRESENT(iogrp)) kpoint%iogrp = iogrp
696 IF (
PRESENT(kp_range)) kpoint%kp_range = kp_range
697 IF (
PRESENT(nkp_groups)) kpoint%nkp_groups = nkp_groups
698 IF (
PRESENT(kp_dist)) kpoint%kp_dist => kp_dist
700 IF (
PRESENT(kp_env)) kpoint%kp_env => kp_env
701 IF (
PRESENT(kp_env)) kpoint%kp_aux_env => kp_aux_env
702 IF (
PRESENT(mpools)) kpoint%mpools => mpools
703 IF (
PRESENT(sab_nl)) kpoint%sab_nl => sab_nl
704 IF (
PRESENT(sab_nl_nosym)) kpoint%sab_nl_nosym => sab_nl_nosym
706 IF (
PRESENT(cell_to_index))
THEN
707 IF (
ASSOCIATED(kpoint%cell_to_index))
DEALLOCATE (kpoint%cell_to_index)
708 kpoint%cell_to_index => cell_to_index
711 IF (
PRESENT(index_to_cell))
THEN
712 IF (
ASSOCIATED(kpoint%index_to_cell))
DEALLOCATE (kpoint%index_to_cell)
713 kpoint%index_to_cell => index_to_cell
728 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN) :: a_vec
730 CHARACTER(LEN=default_string_length) :: ustr
731 CHARACTER(LEN=default_string_length), &
732 DIMENSION(:),
POINTER :: tmpstringlist
733 INTEGER :: i, n_rep, nval, wfntype
734 LOGICAL :: available, backend_explicit, &
737 REAL(kind=
dp),
DIMENSION(:),
POINTER :: reallist
743 nval =
SIZE(tmpstringlist)
745 kpoint%kp_scheme = tmpstringlist(1)
749 SELECT CASE (kpoint%kp_scheme)
754 CASE (
"MONKHORST-PACK")
757 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
762 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
765 READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
772 IF (
ASSOCIATED(kpoint%xkp_input))
THEN
773 DEALLOCATE (kpoint%xkp_input)
774 NULLIFY (kpoint%xkp_input)
776 IF (
ASSOCIATED(kpoint%wkp_input))
THEN
777 DEALLOCATE (kpoint%wkp_input)
778 NULLIFY (kpoint%wkp_input)
780 ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
784 nval =
SIZE(reallist)
788 kpoint%xkp(1:3, i) = reallist(1:3)
789 CASE (
"CART_ANGSTROM")
790 kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
791 reallist(2)*a_vec(2, 1:3) + &
794 kpoint%xkp(1:3, i) = (reallist(1)*a_vec(1, 1:3) + &
795 reallist(2)*a_vec(2, 1:3) + &
796 reallist(3)*a_vec(3, 1:3))/
twopi
798 cpabort(
"Unknown Unit for kpoint definition")
800 kpoint%wkp(i) = reallist(4)
802 ff = 1.0_dp/sum(kpoint%wkp(:))
803 kpoint%wkp(:) = ff*kpoint%wkp(:)
804 ALLOCATE (kpoint%xkp_input(3, n_rep), kpoint%wkp_input(n_rep))
805 kpoint%xkp_input(1:3, 1:n_rep) = kpoint%xkp(1:3, 1:n_rep)
806 kpoint%wkp_input(1:n_rep) = kpoint%wkp(1:n_rep)
812 IF (kpoint%gamma_centered .AND. kpoint%kp_scheme /=
"MONKHORST-PACK" .AND. &
813 kpoint%kp_scheme /=
"MACDONALD")
THEN
814 CALL cp_abort(__location__, &
815 "KPOINTS%GAMMA_CENTERED is only supported with SCHEME MONKHORST-PACK or MACDONALD")
823 l_val=kpoint%inversion_symmetry_only)
825 i_val=kpoint%symmetry_backend, explicit=backend_explicit)
827 i_val=kpoint%symmetry_reduction_method, explicit=reduction_explicit)
828 CALL resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
831 i_val=kpoint%parallel_group_size)
832 SELECT CASE (wfntype)
834 kpoint%use_real_wfn = .true.
836 kpoint%use_real_wfn = .false.
842 kpoint%kp_scheme =
"NONE"
853 SUBROUTINE resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
855 LOGICAL,
INTENT(IN) :: backend_explicit, reduction_explicit
857 IF (backend_explicit .AND. .NOT. reduction_explicit)
THEN
858 SELECT CASE (kpoint%symmetry_backend)
864 cpabort(
"Unknown k-point symmetry backend")
870 CALL cp_abort(__location__, &
871 "SYMMETRY_BACKEND SPGLIB requires SYMMETRY_REDUCTION_METHOD SPGLIB")
874 END SUBROUTINE resolve_kpoint_symmetry_settings
885 INTEGER,
INTENT(IN),
OPTIONAL :: iounit
894 IF (
PRESENT(dft_section))
THEN
896 ELSE IF (
PRESENT(iounit))
THEN
904 IF (kpoint%kp_scheme /=
"NONE")
THEN
905 WRITE (punit,
'(/," ",79("*"),/,T37,A,/," ",79("*"))')
"Kpoints"
907 SELECT CASE (kpoint%kp_scheme)
911 WRITE (punit,
'(A,T57,A)')
' BRILLOUIN|',
' Gamma-point calculation'
912 CASE (
"MONKHORST-PACK")
913 WRITE (punit,
'(A,T61,A20)')
' BRILLOUIN| K-point scheme ',
' Monkhorst-Pack'
914 WRITE (punit,
'(A,T66,3I5)')
' BRILLOUIN| K-Point grid', kpoint%nkp_grid
915 IF (kpoint%gamma_centered)
THEN
916 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Gamma-centered k-point mesh',
' ON'
918 WRITE (punit,
'(A,T66,G15.6)') &
919 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
921 WRITE (punit,
'(A,T71,A10)')
' BRILLOUIN| K-point scheme ',
' MacDonald'
922 WRITE (punit,
'(A,T66,3I5)')
' BRILLOUIN| K-Point grid', kpoint%nkp_grid
923 WRITE (punit,
'(A,T51,3F10.4)')
' BRILLOUIN| K-Point shift', kpoint%kp_shift
924 IF (kpoint%gamma_centered)
THEN
925 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Gamma-centered k-point mesh',
' ON'
927 WRITE (punit,
'(A,T66,G15.6)') &
928 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
930 WRITE (punit,
'(A,T71,A10)')
' BRILLOUIN| K-point scheme ',
' General'
934 IF (kpoint%kp_scheme /=
"NONE")
THEN
935 IF (kpoint%symmetry)
THEN
936 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| K-Point point group symmetrization',
' ON'
938 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| K-Point point group symmetrization',
' OFF'
940 IF (kpoint%inversion_symmetry_only)
THEN
941 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Restrict symmetry to inversion',
' ON'
943 IF (kpoint%symmetry .AND. .NOT. kpoint%full_grid .AND. &
944 .NOT. kpoint%inversion_symmetry_only .AND. &
945 (kpoint%kp_scheme ==
"MONKHORST-PACK" .OR. kpoint%kp_scheme ==
"MACDONALD" .OR. &
946 kpoint%kp_scheme ==
"GENERAL"))
THEN
947 SELECT CASE (kpoint%symmetry_backend)
949 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Symmetry backend',
' K290'
951 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Symmetry backend',
' SPGLIB'
953 cpabort(
"Unknown k-point symmetry backend")
955 SELECT CASE (kpoint%symmetry_reduction_method)
957 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Symmetry reduction method',
' K290'
959 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Symmetry reduction method',
' SPGLIB'
961 cpabort(
"Unknown k-point symmetry reduction method")
964 IF (kpoint%use_real_wfn)
THEN
965 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Wavefunction type',
' REAL'
967 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Wavefunction type',
' COMPLEX'
969 IF (kpoint%full_grid)
THEN
970 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Use full k-point grid '
972 IF (kpoint%kp_scheme /=
"GAMMA")
THEN
973 WRITE (punit,
'(A,T71,I10)')
' BRILLOUIN| List of Kpoints [2 Pi/Bohr]', kpoint%nkp
974 WRITE (punit,
'(A,T30,A,T48,A,T63,A,T78,A)') &
975 ' BRILLOUIN| Number ',
'Weight',
'X',
'Y',
'Z'
977 WRITE (punit,
'(A,I5,3X,4F15.5)')
' BRILLOUIN| ', i, kpoint%wkp(i), &
978 kpoint%xkp(1, i), kpoint%xkp(2, i), kpoint%xkp(3, i)
981 WRITE (punit,
'(" ",79("*"))')
986 IF (
PRESENT(dft_section))
THEN
1000 cpassert(.NOT.
ASSOCIATED(kp_env))
1007 kp_env%is_local = .false.
1009 NULLIFY (kp_env%mos)
1010 NULLIFY (kp_env%pmat)
1011 NULLIFY (kp_env%wmat)
1012 NULLIFY (kp_env%smat)
1013 NULLIFY (kp_env%amat)
1022 SUBROUTINE kpoint_env_release(kp_env)
1027 IF (
ASSOCIATED(kp_env))
THEN
1029 IF (
ASSOCIATED(kp_env%mos))
THEN
1030 DO is = 1,
SIZE(kp_env%mos, 2)
1031 DO ic = 1,
SIZE(kp_env%mos, 1)
1035 DEALLOCATE (kp_env%mos)
1050 END SUBROUTINE kpoint_env_release
1064 INTEGER,
OPTIONAL :: nkpoint
1065 REAL(kind=
dp),
OPTIONAL :: wkp
1066 REAL(kind=
dp),
DIMENSION(3),
OPTIONAL :: xkp
1067 LOGICAL,
OPTIONAL :: is_local
1071 IF (
PRESENT(nkpoint)) nkpoint = kpoint_env%nkpoint
1072 IF (
PRESENT(wkp)) wkp = kpoint_env%wkp
1073 IF (
PRESENT(xkp)) xkp = kpoint_env%xkp
1074 IF (
PRESENT(is_local)) is_local = kpoint_env%is_local
1075 IF (
PRESENT(mos)) mos => kpoint_env%mos
1087 cpassert(.NOT.
ASSOCIATED(kp_sym))
1093 kp_sym%apply_symmetry = .false.
1095 NULLIFY (kp_sym%rot)
1096 NULLIFY (kp_sym%xkp)
1097 NULLIFY (kp_sym%rotp)
1099 NULLIFY (kp_sym%fcell)
1100 NULLIFY (kp_sym%kgphase)
1109 SUBROUTINE kpoint_sym_release(kp_sym)
1112 IF (
ASSOCIATED(kp_sym))
THEN
1114 IF (
ASSOCIATED(kp_sym%rot))
THEN
1115 DEALLOCATE (kp_sym%rot)
1117 IF (
ASSOCIATED(kp_sym%xkp))
THEN
1118 DEALLOCATE (kp_sym%xkp)
1120 IF (
ASSOCIATED(kp_sym%f0))
THEN
1121 DEALLOCATE (kp_sym%f0)
1123 IF (
ASSOCIATED(kp_sym%fcell))
THEN
1124 DEALLOCATE (kp_sym%fcell)
1126 IF (
ASSOCIATED(kp_sym%kgphase))
THEN
1127 DEALLOCATE (kp_sym%kgphase)
1129 IF (
ASSOCIATED(kp_sym%rotp))
THEN
1130 DEALLOCATE (kp_sym%rotp)
1137 END SUBROUTINE kpoint_sym_release
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
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,...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Types and basic routines needed for a kpoint calculation.
subroutine, public read_kpoint_section(kpoint, kpoint_section, a_vec)
Read the kpoint input section.
subroutine, public kpoint_sym_create(kp_sym)
Create a single kpoint symmetry environment.
subroutine, public set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Set information in a kpoint environment.
subroutine, public get_kpoint_env(kpoint_env, nkpoint, wkp, xkp, is_local, mos)
Get information from a single kpoint environment.
subroutine, public kpoint_reset_initialization(kpoint)
Reset all data derived from a concrete k-point initialization. Input options such as the scheme,...
subroutine, public kpoint_env_create(kp_env)
Create a single kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
subroutine, public write_kpoint_info(kpoint, iounit, dft_section)
Write information on the kpoints to output.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
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:
real(kind=dp), parameter, public angstrom
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.
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.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex 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