53#include "./base/base_uses.f90"
59 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'kpoint_types'
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.
100 LOGICAL :: mos_prefilled = .false.
105 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: ot_hmat => null()
115 REAL(
dp),
ALLOCATABLE :: lowdin_sqrt(:)
129 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rmat => null()
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()
159 TYPE kpoint_sym_p_type
161 END TYPE kpoint_sym_p_type
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.
204 LOGICAL :: symmetry = .false.
205 LOGICAL :: full_grid = .false.
207 LOGICAL :: inversion_symmetry_only = .false.
210 LOGICAL :: verbose = .false.
211 REAL(kind=
dp) :: eps_geo = 0.0_dp
212 INTEGER :: parallel_group_size = -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()
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
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()
235 POINTER :: kp_env => null()
237 POINTER :: kp_aux_env => null()
239 TYPE(kpoint_sym_p_type),
DIMENSION(:), &
240 POINTER :: kp_sym => null()
241 INTEGER,
DIMENSION(:),
POINTER :: atype => null()
242 INTEGER,
DIMENSION(:),
POINTER :: ibrot => null()
244 POINTER :: kind_rotmat => null()
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.
269 cpassert(.NOT.
ASSOCIATED(kpoint))
273 kpoint%kp_scheme =
""
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.
281 kpoint%inversion_symmetry_only = .false.
284 kpoint%use_real_wfn = .false.
285 kpoint%eps_geo = 1.0e-6_dp
286 kpoint%parallel_group_size = -1
290 NULLIFY (kpoint%xkp, kpoint%wkp)
291 NULLIFY (kpoint%xkp_input, kpoint%wkp_input)
292 NULLIFY (kpoint%kp_dist)
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.
302 NULLIFY (kpoint%kp_env)
303 NULLIFY (kpoint%mpools)
305 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
306 kpoint%cell_to_index(:, :, :) = 1
308 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
309 kpoint%index_to_cell(:, :) = 0
323 IF (
ASSOCIATED(kpoint))
THEN
326 IF (
ASSOCIATED(kpoint%xkp))
THEN
327 DEALLOCATE (kpoint%xkp)
329 IF (
ASSOCIATED(kpoint%wkp))
THEN
330 DEALLOCATE (kpoint%wkp)
332 IF (
ASSOCIATED(kpoint%xkp_input))
THEN
333 DEALLOCATE (kpoint%xkp_input)
335 IF (
ASSOCIATED(kpoint%wkp_input))
THEN
336 DEALLOCATE (kpoint%wkp_input)
338 IF (
ASSOCIATED(kpoint%kp_dist))
THEN
339 DEALLOCATE (kpoint%kp_dist)
352 IF (
ASSOCIATED(kpoint%cell_to_index))
DEALLOCATE (kpoint%cell_to_index)
353 IF (
ASSOCIATED(kpoint%index_to_cell))
DEALLOCATE (kpoint%index_to_cell)
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)
359 DEALLOCATE (kpoint%kp_env)
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)
366 DEALLOCATE (kpoint%kp_aux_env)
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)
373 DEALLOCATE (kpoint%kp_sym)
376 IF (
ASSOCIATED(kpoint%atype))
DEALLOCATE (kpoint%atype)
377 IF (
ASSOCIATED(kpoint%ibrot))
DEALLOCATE (kpoint%ibrot)
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)
387 DEALLOCATE (kpoint%kind_rotmat)
390 IF (
ASSOCIATED(kpoint%scf_diis_buffer))
THEN
392 DEALLOCATE (kpoint%scf_diis_buffer)
410 IF (
ALLOCATED(kpoint%scf_smat))
THEN
411 DO ikp = 1,
SIZE(kpoint%scf_smat)
414 DEALLOCATE (kpoint%scf_smat)
430 IF (
ALLOCATED(kpoint%lowdin_orbitals))
THEN
431 DEALLOCATE (kpoint%lowdin_orbitals, kpoint%lowdin_q, kpoint%lowdin_q_new, kpoint%lowdin_v)
433 kpoint%lowdin_density_ready = .false.
434 kpoint%lowdin_population_ready = .false.
436 IF (
ASSOCIATED(kpoint%xkp))
THEN
437 DEALLOCATE (kpoint%xkp)
440 IF (
ASSOCIATED(kpoint%wkp))
THEN
441 DEALLOCATE (kpoint%wkp)
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)
451 IF (
ASSOCIATED(kpoint%kp_dist))
THEN
452 DEALLOCATE (kpoint%kp_dist)
453 NULLIFY (kpoint%kp_dist)
466 IF (
ASSOCIATED(kpoint%cell_to_index))
THEN
467 DEALLOCATE (kpoint%cell_to_index)
468 NULLIFY (kpoint%cell_to_index)
470 IF (
ASSOCIATED(kpoint%index_to_cell))
THEN
471 DEALLOCATE (kpoint%index_to_cell)
472 NULLIFY (kpoint%index_to_cell)
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)
479 DEALLOCATE (kpoint%kp_env)
480 NULLIFY (kpoint%kp_env)
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)
487 DEALLOCATE (kpoint%kp_aux_env)
488 NULLIFY (kpoint%kp_aux_env)
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)
495 DEALLOCATE (kpoint%kp_sym)
496 NULLIFY (kpoint%kp_sym)
499 IF (
ASSOCIATED(kpoint%atype))
THEN
500 DEALLOCATE (kpoint%atype)
501 NULLIFY (kpoint%atype)
503 IF (
ASSOCIATED(kpoint%ibrot))
THEN
504 DEALLOCATE (kpoint%ibrot)
505 NULLIFY (kpoint%ibrot)
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)
517 DEALLOCATE (kpoint%kind_rotmat)
518 NULLIFY (kpoint%kind_rotmat)
521 IF (
ASSOCIATED(kpoint%scf_diis_buffer))
THEN
523 DEALLOCATE (kpoint%scf_diis_buffer)
524 NULLIFY (kpoint%scf_diis_buffer)
527 NULLIFY (kpoint%sab_nl)
528 NULLIFY (kpoint%sab_nl_nosym)
530 ALLOCATE (kpoint%cell_to_index(0:0, 0:0, 0:0))
531 kpoint%cell_to_index(:, :, :) = 1
533 ALLOCATE (kpoint%index_to_cell(0:0, 0:0))
534 kpoint%index_to_cell(:, :) = 0
536 IF (.NOT.
ASSOCIATED(kpoint%wkp)) kpoint%nkp = 0
537 kpoint%nkp_groups = 0
539 kpoint%iogrp = .false.
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)
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
604 POINTER :: kp_env, kp_aux_env
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
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
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
633 IF (
PRESENT(eps_geo)) eps_geo = kpoint%eps_geo
634 IF (
PRESENT(parallel_group_size)) parallel_group_size = kpoint%parallel_group_size
636 IF (
PRESENT(nkp)) nkp = kpoint%nkp
637 IF (
PRESENT(wkp)) wkp => kpoint%wkp
638 IF (
PRESENT(xkp)) xkp => kpoint%xkp
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
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
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
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
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)
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
722 POINTER :: kp_env, kp_aux_env
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
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
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
749 IF (
PRESENT(eps_geo)) kpoint%eps_geo = eps_geo
750 IF (
PRESENT(parallel_group_size)) kpoint%parallel_group_size = parallel_group_size
752 IF (
PRESENT(nkp)) kpoint%nkp = nkp
753 IF (
PRESENT(wkp)) kpoint%wkp => wkp
754 IF (
PRESENT(xkp)) kpoint%xkp => xkp
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
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
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
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
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
796 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN) :: a_vec
797 TYPE(
cell_type),
OPTIONAL,
POINTER :: cell
799 REAL(kind=
dp),
PARAMETER :: eps_cell = 1.0e-14_dp
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, &
809 REAL(kind=
dp),
DIMENSION(3, 3) :: cart_a_vec
810 REAL(kind=
dp),
DIMENSION(:),
POINTER :: reallist
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(:, :)
822 nval =
SIZE(tmpstringlist)
824 kpoint%kp_scheme = tmpstringlist(1)
828 SELECT CASE (kpoint%kp_scheme)
833 CASE (
"MONKHORST-PACK")
836 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
841 READ (tmpstringlist(i), *) kpoint%nkp_grid(i - 1)
844 READ (tmpstringlist(i), *) kpoint%kp_shift(i - 4)
851 IF (
ASSOCIATED(kpoint%xkp_input))
THEN
852 DEALLOCATE (kpoint%xkp_input)
853 NULLIFY (kpoint%xkp_input)
855 IF (
ASSOCIATED(kpoint%wkp_input))
THEN
856 DEALLOCATE (kpoint%wkp_input)
857 NULLIFY (kpoint%wkp_input)
859 ALLOCATE (kpoint%xkp(3, n_rep), kpoint%wkp(n_rep))
863 nval =
SIZE(reallist)
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) + &
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
877 cpabort(
"Unknown Unit for kpoint definition")
879 kpoint%wkp(i) = reallist(4)
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)
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)//
">")
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")
907 l_val=kpoint%inversion_symmetry_only)
909 i_val=kpoint%symmetry_backend, explicit=backend_explicit)
911 i_val=kpoint%symmetry_reduction_method, explicit=reduction_explicit)
912 CALL resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
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.")
930 i_val=kpoint%parallel_group_size)
931 SELECT CASE (wfntype)
933 kpoint%use_real_wfn = .true.
935 kpoint%use_real_wfn = .false.
937 cpabort(
"The WAVEFUNCTIONS option should be either REAL or COMPLEX")
941 kpoint%kp_scheme =
"NONE"
952 SUBROUTINE resolve_kpoint_symmetry_settings(kpoint, backend_explicit, reduction_explicit)
954 LOGICAL,
INTENT(IN) :: backend_explicit, reduction_explicit
956 IF (backend_explicit .AND. .NOT. reduction_explicit)
THEN
957 SELECT CASE (kpoint%symmetry_backend)
963 cpabort(
"Unknown k-point symmetry backend")
969 CALL cp_abort(__location__, &
970 "SYMMETRY_BACKEND SPGLIB requires SYMMETRY_REDUCTION_METHOD SPGLIB")
973 END SUBROUTINE resolve_kpoint_symmetry_settings
984 INTEGER,
INTENT(IN),
OPTIONAL :: iounit
993 IF (
PRESENT(dft_section))
THEN
995 ELSE IF (
PRESENT(iounit))
THEN
1003 IF (kpoint%kp_scheme /=
"NONE")
THEN
1004 WRITE (punit,
'(/," ",79("*"),/,T37,A,/," ",79("*"))')
"Kpoints"
1006 SELECT CASE (kpoint%kp_scheme)
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'
1017 WRITE (punit,
'(A,T66,G15.6)') &
1018 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
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'
1026 WRITE (punit,
'(A,T66,G15.6)') &
1027 ' BRILLOUIN| K-point symmetry accuracy', kpoint%eps_geo
1029 WRITE (punit,
'(A,T71,A10)')
' BRILLOUIN| K-point scheme ',
' General'
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)//
">")
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'
1041 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| K-Point point group symmetrization',
' OFF'
1043 IF (kpoint%inversion_symmetry_only)
THEN
1044 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Restrict symmetry to inversion',
' ON'
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'
1056 cpabort(
"Unknown k-point symmetry backend")
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'
1064 cpabort(
"Unknown k-point symmetry reduction method")
1067 IF (kpoint%use_real_wfn)
THEN
1068 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Wavefunction type',
' REAL'
1070 WRITE (punit,
'(A,T73,A)')
' BRILLOUIN| Wavefunction type',
' COMPLEX'
1072 IF (kpoint%full_grid)
THEN
1073 WRITE (punit,
'(A,T76,A)')
' BRILLOUIN| Use full k-point grid '
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)
1084 WRITE (punit,
'(" ",79("*"))')
1089 IF (
PRESENT(dft_section))
THEN
1103 cpassert(.NOT.
ASSOCIATED(kp_env))
1110 kp_env%is_local = .false.
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)
1126 SUBROUTINE kpoint_env_release(kp_env)
1131 IF (
ASSOCIATED(kp_env))
THEN
1133 IF (
ASSOCIATED(kp_env%mos))
THEN
1134 DO is = 1,
SIZE(kp_env%mos)
1137 DEALLOCATE (kp_env%mos)
1157 CALL kp_env%lowdin_gemm%destroy()
1163 END SUBROUTINE kpoint_env_release
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
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
1199 cpassert(.NOT.
ASSOCIATED(kp_sym))
1205 kp_sym%apply_symmetry = .false.
1207 NULLIFY (kp_sym%rot)
1208 NULLIFY (kp_sym%xkp)
1209 NULLIFY (kp_sym%rotp)
1211 NULLIFY (kp_sym%fcell)
1212 NULLIFY (kp_sym%fcell_gauge)
1213 NULLIFY (kp_sym%phase_mode)
1214 NULLIFY (kp_sym%kgphase)
1223 SUBROUTINE kpoint_sym_release(kp_sym)
1226 IF (
ASSOCIATED(kp_sym))
THEN
1228 IF (
ASSOCIATED(kp_sym%rot))
THEN
1229 DEALLOCATE (kp_sym%rot)
1231 IF (
ASSOCIATED(kp_sym%xkp))
THEN
1232 DEALLOCATE (kp_sym%xkp)
1234 IF (
ASSOCIATED(kp_sym%f0))
THEN
1235 DEALLOCATE (kp_sym%f0)
1237 IF (
ASSOCIATED(kp_sym%fcell))
THEN
1238 DEALLOCATE (kp_sym%fcell)
1240 IF (
ASSOCIATED(kp_sym%fcell_gauge))
THEN
1241 DEALLOCATE (kp_sym%fcell_gauge)
1243 IF (
ASSOCIATED(kp_sym%phase_mode))
THEN
1244 DEALLOCATE (kp_sym%phase_mode)
1246 IF (
ASSOCIATED(kp_sym%kgphase))
THEN
1247 DEALLOCATE (kp_sym%kgphase)
1249 IF (
ASSOCIATED(kp_sym%rotp))
THEN
1250 DEALLOCATE (kp_sym%rotp)
1257 END SUBROUTINE kpoint_sym_release
1267 INTEGER,
INTENT(IN) :: rotp
1269 INTEGER :: irot, rot_abs
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
Handles all functions related to the CELL.
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 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:
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.
Type defining parameters related to the simulation cell.
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