37 dbcsr_type, dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, dbcsr_type_symmetric
108#include "base/base_uses.f90"
119 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'post_scf_bandstructure_utils'
134 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env'
138 CALL timeset(routinen, handle)
142 CALL print_header(bs_env)
144 CALL read_bandstructure_input_parameters(bs_env, post_scf_bandstructure_section)
146 CALL get_parameters_from_qs_env(qs_env, bs_env)
148 CALL set_heuristic_parameters(bs_env)
150 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
153 CALL setup_kpoints_dos_large_cell_gamma(qs_env, bs_env, bs_env%kpoints_DOS)
155 CALL allocate_and_fill_fm_ks_fm_s(qs_env, bs_env)
157 CALL diagonalize_ks_matrix(bs_env)
159 CALL check_positive_definite_overlap_mat(bs_env, qs_env)
163 CALL setup_kpoints_scf_desymm(qs_env, bs_env, bs_env%kpoints_scf_desymm, .true.)
164 CALL setup_kpoints_scf_desymm(qs_env, bs_env, bs_env%kpoints_scf_desymm_2, .false.)
166 CALL setup_kpoints_dos_small_cell_full_kp(bs_env, bs_env%kpoints_DOS)
168 CALL allocate_and_fill_fm_ks_fm_s(qs_env, bs_env)
170 CALL compute_cfm_mo_coeff_kp_and_eigenval_scf_kp(qs_env, bs_env)
174 CALL timestop(handle)
183 SUBROUTINE read_bandstructure_input_parameters(bs_env, bs_sec)
187 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_bandstructure_input_parameters'
189 CHARACTER(LEN=default_string_length), &
190 DIMENSION(:),
POINTER :: string_ptr
191 CHARACTER(LEN=max_line_length) :: error_msg
192 INTEGER :: handle, i, ikp
196 CALL timeset(routinen, handle)
202 NULLIFY (gw_ri_rs_sec)
207 CALL section_vals_val_get(gw_ri_rs_sec,
"CHUNK_SIZE_DBCSR", i_val=bs_env%ri_rs%chunk_size_dbcsr)
208 CALL section_vals_val_get(gw_ri_rs_sec,
"CUTOFF_RADIUS_RI_RS", r_val=bs_env%ri_rs%cutoff_radius_ri_rs)
234 ALLOCATE (bs_env%xkp_special(3, bs_env%input_kp_bs_n_sp_pts))
235 DO ikp = 1, bs_env%input_kp_bs_n_sp_pts
237 cpassert(
SIZE(string_ptr(:), 1) == 4)
240 IF (len_trim(error_msg) > 0) cpabort(trim(error_msg))
244 CALL timestop(handle)
246 END SUBROUTINE read_bandstructure_input_parameters
252 SUBROUTINE print_header(bs_env)
256 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header'
260 CALL timeset(routinen, handle)
267 WRITE (u,
'(T2,A)')
' '
268 WRITE (u,
'(T2,A)') repeat(
'-', 79)
269 WRITE (u,
'(T2,A,A78)')
'-',
'-'
270 WRITE (u,
'(T2,A,A51,A27)')
'-',
'BANDSTRUCTURE CALCULATION',
'-'
271 WRITE (u,
'(T2,A,A78)')
'-',
'-'
272 WRITE (u,
'(T2,A)') repeat(
'-', 79)
273 WRITE (u,
'(T2,A)')
' '
276 CALL timestop(handle)
278 END SUBROUTINE print_header
286 SUBROUTINE setup_kpoints_dos_large_cell_gamma(qs_env, bs_env, kpoints)
292 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_DOS_large_cell_Gamma'
294 INTEGER :: handle, i_dim, i_kp_in_line, &
295 i_special_kp, ikk, n_kp_in_line, &
296 n_special_kp, nkp, nkp_only_bs, &
298 INTEGER,
DIMENSION(3) :: nkp_grid, periodic
300 CALL timeset(routinen, handle)
306 kpoints%kp_scheme =
"GENERAL"
308 n_special_kp = bs_env%input_kp_bs_n_sp_pts
309 n_kp_in_line = bs_env%input_kp_bs_npoints
311 periodic(1:3) = bs_env%periodic(1:3)
315 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
317 IF (bs_env%nkp_grid_DOS_input(i_dim) < 0)
THEN
318 IF (periodic(i_dim) == 1) nkp_grid(i_dim) = 2
319 IF (periodic(i_dim) == 0) nkp_grid(i_dim) = 1
321 nkp_grid(i_dim) = bs_env%nkp_grid_DOS_input(i_dim)
327 IF (nkp_grid(1) > 1)
THEN
328 nkp_only_dos = (nkp_grid(1) + 1)/2*nkp_grid(2)*nkp_grid(3)
329 ELSE IF (nkp_grid(2) > 1)
THEN
330 nkp_only_dos = nkp_grid(1)*(nkp_grid(2) + 1)/2*nkp_grid(3)
331 ELSE IF (nkp_grid(3) > 1)
THEN
332 nkp_only_dos = nkp_grid(1)*nkp_grid(2)*(nkp_grid(3) + 1)/2
339 IF (n_special_kp > 0)
THEN
340 nkp_only_bs = n_kp_in_line*(n_special_kp - 1) + 1
345 nkp = nkp_only_dos + nkp_only_bs
347 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
350 bs_env%nkp_bs_and_DOS = nkp
351 bs_env%nkp_only_bs = nkp_only_bs
352 bs_env%nkp_only_DOS = nkp_only_dos
354 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
355 kpoints%wkp(1:nkp_only_dos) = 1.0_dp/real(nkp_only_dos, kind=
dp)
357 CALL compute_xkp(kpoints%xkp, 1, nkp_only_dos, nkp_grid)
359 IF (n_special_kp > 0)
THEN
360 kpoints%xkp(1:3, nkp_only_dos + 1) = bs_env%xkp_special(1:3, 1)
361 ikk = nkp_only_dos + 1
362 DO i_special_kp = 2, n_special_kp
363 DO i_kp_in_line = 1, n_kp_in_line
365 kpoints%xkp(1:3, ikk) = bs_env%xkp_special(1:3, i_special_kp - 1) + &
366 REAL(i_kp_in_line, kind=
dp)/real(n_kp_in_line, kind=
dp)* &
367 (bs_env%xkp_special(1:3, i_special_kp) - &
368 bs_env%xkp_special(1:3, i_special_kp - 1))
369 kpoints%wkp(ikk) = 0.0_dp
379 IF (nkp_only_bs > 0)
THEN
380 WRITE (u, fmt=
"(T2,1A,T77,I4)") &
381 "Number of special k-points for the bandstructure", n_special_kp
382 WRITE (u, fmt=
"(T2,1A,T77,I4)")
"Number of k-points for the bandstructure", nkp
383 WRITE (u, fmt=
"(T2,1A,T69,3I4)") &
384 "K-point mesh for the density of states (DOS)", nkp_grid(1:3)
386 WRITE (u, fmt=
"(T2,1A,T69,3I4)") &
387 "K-point mesh for the density of states (DOS) and the self-energy", nkp_grid(1:3)
391 CALL timestop(handle)
393 END SUBROUTINE setup_kpoints_dos_large_cell_gamma
402 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
407 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
409 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
410 k_cell_z, nimages, nkp, u
411 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
416 CALL timeset(routinen, handle)
421 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
423 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
424 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
428 IF (bs_env%periodic(i_dim) == 1)
THEN
429 cpassert(nkp_grid(i_dim) >= 4)
433 kpoints%kp_scheme =
"GENERAL"
434 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
436 bs_env%nkp_scf_desymm = nkp
438 ALLOCATE (kpoints%xkp(1:3, nkp))
441 ALLOCATE (kpoints%wkp(nkp))
442 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
446 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
449 cixd(1:3) = cell_grid(1:3)/2
451 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
453 bs_env%nimages_scf_desymm = nimages
454 bs_env%cell_grid_scf_desymm(1:3) = cell_grid(1:3)
456 IF (
ASSOCIATED(kpoints%index_to_cell))
DEALLOCATE (kpoints%index_to_cell)
457 IF (
ASSOCIATED(kpoints%cell_to_index))
DEALLOCATE (kpoints%cell_to_index)
459 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
460 ALLOCATE (kpoints%index_to_cell(3, nimages))
463 DO i_cell_x = -cixd(1), cixd(1)
464 DO j_cell_y = -cixd(2), cixd(2)
465 DO k_cell_z = -cixd(3), cixd(3)
467 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
468 kpoints%index_to_cell(1:3, img) = [i_cell_x, j_cell_y, k_cell_z]
474 IF (u > 0 .AND. do_print)
THEN
475 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
478 CALL timestop(handle)
480 END SUBROUTINE setup_kpoints_scf_desymm
487 SUBROUTINE setup_kpoints_dos_small_cell_full_kp(bs_env, kpoints)
492 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_DOS_small_cell_full_kp'
494 INTEGER :: handle, i_kp_in_line, i_special_kp, ikk, &
495 n_kp_in_line, n_special_kp, nkp, &
496 nkp_only_bs, nkp_scf_desymm, u
498 CALL timeset(routinen, handle)
504 n_special_kp = bs_env%input_kp_bs_n_sp_pts
505 n_kp_in_line = bs_env%input_kp_bs_npoints
506 nkp_scf_desymm = bs_env%nkp_scf_desymm
510 IF (n_special_kp > 0)
THEN
511 nkp_only_bs = n_kp_in_line*(n_special_kp - 1) + 1
515 nkp = nkp_only_bs + nkp_scf_desymm
517 ALLOCATE (kpoints%xkp(3, nkp))
518 ALLOCATE (kpoints%wkp(nkp))
522 bs_env%nkp_bs_and_DOS = nkp
523 bs_env%nkp_only_bs = nkp_only_bs
524 bs_env%nkp_only_DOS = nkp_scf_desymm
526 kpoints%xkp(1:3, 1:nkp_scf_desymm) = bs_env%kpoints_scf_desymm%xkp(1:3, 1:nkp_scf_desymm)
527 kpoints%wkp(1:nkp_scf_desymm) = 1.0_dp/real(nkp_scf_desymm, kind=
dp)
529 IF (n_special_kp > 0)
THEN
530 kpoints%xkp(1:3, nkp_scf_desymm + 1) = bs_env%xkp_special(1:3, 1)
531 ikk = nkp_scf_desymm + 1
532 DO i_special_kp = 2, n_special_kp
533 DO i_kp_in_line = 1, n_kp_in_line
535 kpoints%xkp(1:3, ikk) = bs_env%xkp_special(1:3, i_special_kp - 1) + &
536 REAL(i_kp_in_line, kind=
dp)/real(n_kp_in_line, kind=
dp)* &
537 (bs_env%xkp_special(1:3, i_special_kp) - &
538 bs_env%xkp_special(1:3, i_special_kp - 1))
539 kpoints%wkp(ikk) = 0.0_dp
544 IF (
ASSOCIATED(kpoints%index_to_cell))
DEALLOCATE (kpoints%index_to_cell)
546 ALLOCATE (kpoints%index_to_cell(3, bs_env%nimages_scf_desymm))
547 kpoints%index_to_cell(:, :) = bs_env%kpoints_scf_desymm%index_to_cell(:, :)
552 WRITE (u, fmt=
"(T2,1A,T77,I4)")
"Number of special k-points for the bandstructure", &
554 WRITE (u, fmt=
"(T2,1A,T77,I4)")
"Number of k-points for the bandstructure", nkp
557 CALL timestop(handle)
559 END SUBROUTINE setup_kpoints_dos_small_cell_full_kp
566 SUBROUTINE compute_cfm_mo_coeff_kp_and_eigenval_scf_kp(qs_env, bs_env)
570 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_cfm_mo_coeff_kp_and_eigenval_scf_kp'
572 INTEGER :: handle, ikp, ispin, nkp_bs_and_dos
573 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
574 REAL(kind=
dp) :: cbm, vbm
575 REAL(kind=
dp),
DIMENSION(3) :: xkp
577 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
582 CALL timeset(routinen, handle)
585 matrix_ks_kp=matrix_ks, &
586 matrix_s_kp=matrix_s, &
590 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
594 CALL cp_cfm_create(cfm_mos, bs_env%cfm_work_mo%matrix_struct)
597 nkp_bs_and_dos = bs_env%nkp_bs_and_DOS
599 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, nkp_bs_and_dos, bs_env%n_spin))
600 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, nkp_bs_and_dos, bs_env%n_spin))
601 ALLOCATE (bs_env%cfm_mo_coeff_kp(nkp_bs_and_dos, bs_env%n_spin))
602 ALLOCATE (bs_env%cfm_ks_kp(nkp_bs_and_dos, bs_env%n_spin))
603 ALLOCATE (bs_env%cfm_s_kp(nkp_bs_and_dos))
604 DO ikp = 1, nkp_bs_and_dos
605 DO ispin = 1, bs_env%n_spin
606 CALL cp_cfm_create(bs_env%cfm_mo_coeff_kp(ikp, ispin), bs_env%cfm_work_mo%matrix_struct)
607 CALL cp_cfm_create(bs_env%cfm_ks_kp(ikp, ispin), bs_env%cfm_work_mo%matrix_struct)
609 CALL cp_cfm_create(bs_env%cfm_s_kp(ikp), bs_env%cfm_work_mo%matrix_struct)
612 DO ispin = 1, bs_env%n_spin
613 DO ikp = 1, nkp_bs_and_dos
615 xkp(1:3) = bs_env%kpoints_DOS%xkp(1:3, ikp)
618 CALL rsmat_to_kp(matrix_ks, ispin, xkp, cell_to_index_scf, sab_nl, bs_env, cfm_ks)
621 CALL rsmat_to_kp(matrix_s, 1, xkp, cell_to_index_scf, sab_nl, bs_env, cfm_s)
631 bs_env%eigenval_scf(:, ikp, ispin), &
632 bs_env%cfm_work_mo, bs_env%eps_eigval_mat_s)
636 CALL cp_cfm_to_cfm(cfm_mos, bs_env%cfm_mo_coeff_kp(ikp, ispin))
640 vbm = maxval(bs_env%eigenval_scf(bs_env%n_occ(ispin), :, ispin))
641 cbm = minval(bs_env%eigenval_scf(bs_env%n_occ(ispin) + 1, :, ispin))
643 bs_env%e_fermi(ispin) = 0.5_dp*(vbm + cbm)
653 CALL timestop(handle)
655 END SUBROUTINE compute_cfm_mo_coeff_kp_and_eigenval_scf_kp
668 SUBROUTINE rsmat_to_kp(mat_rs, ispin, xkp, cell_to_index_scf, sab_nl, bs_env, cfm_kp, imag_rs_mat)
671 REAL(kind=
dp),
DIMENSION(3) :: xkp
672 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
677 LOGICAL,
OPTIONAL :: imag_rs_mat
679 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rsmat_to_kp'
682 LOGICAL :: imag_rs_mat_private
683 TYPE(
dbcsr_type),
POINTER :: cmat, nsmat, rmat
685 CALL timeset(routinen, handle)
687 ALLOCATE (rmat, cmat, nsmat)
689 imag_rs_mat_private = .false.
690 IF (
PRESENT(imag_rs_mat)) imag_rs_mat_private = imag_rs_mat
692 IF (imag_rs_mat_private)
THEN
693 CALL dbcsr_create(rmat, template=mat_rs(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
694 CALL dbcsr_create(cmat, template=mat_rs(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
696 CALL dbcsr_create(rmat, template=mat_rs(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
697 CALL dbcsr_create(cmat, template=mat_rs(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
699 CALL dbcsr_create(nsmat, template=mat_rs(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
705 CALL rskp_transform(rmatrix=rmat, cmatrix=cmat, rsmat=mat_rs, ispin=ispin, &
706 xkp=xkp, cell_to_index=cell_to_index_scf, sab_nl=sab_nl)
712 CALL cp_fm_to_cfm(bs_env%fm_work_mo(1), bs_env%fm_work_mo(2), cfm_kp)
718 CALL timestop(handle)
726 SUBROUTINE diagonalize_ks_matrix(bs_env)
729 CHARACTER(LEN=*),
PARAMETER :: routinen =
'diagonalize_ks_matrix'
731 INTEGER :: handle, ispin
732 REAL(kind=
dp) :: cbm, vbm
734 CALL timeset(routinen, handle)
736 ALLOCATE (bs_env%eigenval_scf_Gamma(bs_env%n_ao, bs_env%n_spin))
738 DO ispin = 1, bs_env%n_spin
741 CALL cp_fm_to_fm(bs_env%fm_ks_Gamma(ispin), bs_env%fm_work_mo(1))
742 CALL cp_fm_to_fm(bs_env%fm_s_Gamma, bs_env%fm_work_mo(2))
747 bs_env%fm_work_mo(2), &
748 bs_env%fm_mo_coeff_Gamma(ispin), &
749 bs_env%eigenval_scf_Gamma(:, ispin), &
750 bs_env%fm_work_mo(3), &
751 bs_env%eps_eigval_mat_s)
753 vbm = bs_env%eigenval_scf_Gamma(bs_env%n_occ(ispin), ispin)
754 cbm = bs_env%eigenval_scf_Gamma(bs_env%n_occ(ispin) + 1, ispin)
756 bs_env%band_edges_scf_Gamma(ispin)%VBM = vbm
757 bs_env%band_edges_scf_Gamma(ispin)%CBM = cbm
758 bs_env%e_fermi(ispin) = 0.5_dp*(vbm + cbm)
762 CALL timestop(handle)
764 END SUBROUTINE diagonalize_ks_matrix
771 SUBROUTINE check_positive_definite_overlap_mat(bs_env, qs_env)
775 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_positive_definite_overlap_mat'
777 INTEGER :: handle, ikp, info, u
780 CALL timeset(routinen, handle)
782 DO ikp = 1, bs_env%kpoints_DOS%nkp
786 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
797 WRITE (u, fmt=
"(T2,A)")
""
798 WRITE (u, fmt=
"(T2,A)")
"ERROR: The Cholesky decomposition "// &
799 "of the k-point overlap matrix failed. This is"
800 WRITE (u, fmt=
"(T2,A)")
"because the algorithm is "// &
801 "only correct in the limit of large cells. The cell of "
802 WRITE (u, fmt=
"(T2,A)")
"the calculation is too small. "// &
803 "Use MULTIPLE_UNIT_CELL to create a larger cell "
804 WRITE (u, fmt=
"(T2,A)")
"and to prevent this error."
807 CALL bs_env%para_env%sync()
808 cpabort(
"Please see information on the error above.")
816 CALL timestop(handle)
818 END SUBROUTINE check_positive_definite_overlap_mat
825 SUBROUTINE get_parameters_from_qs_env(qs_env, bs_env)
829 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_parameters_from_qs_env'
831 INTEGER :: color_sub, handle, homo, n_ao, n_atom, u
832 INTEGER,
DIMENSION(3) :: periodic
833 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
842 CALL timeset(routinen, handle)
845 dft_control=dft_control, &
846 scf_control=scf_control, &
849 bs_env%n_spin = dft_control%nspins
850 IF (bs_env%n_spin == 1) bs_env%spin_degeneracy = 2.0_dp
851 IF (bs_env%n_spin == 2) bs_env%spin_degeneracy = 1.0_dp
853 CALL get_mo_set(mo_set=mos(1), nao=n_ao, homo=homo)
855 bs_env%n_occ(1:2) = homo
856 bs_env%n_vir(1:2) = n_ao - homo
858 IF (bs_env%n_spin == 2)
THEN
860 bs_env%n_occ(2) = homo
861 bs_env%n_vir(2) = n_ao - homo
864 bs_env%eps_eigval_mat_s = scf_control%eps_eigval
869 ALLOCATE (bs_env%para_env)
870 CALL bs_env%para_env%from_split(para_env, color_sub)
872 CALL get_qs_env(qs_env, particle_set=particle_set)
874 n_atom =
SIZE(particle_set)
875 bs_env%n_atom = n_atom
878 CALL get_cell(cell=cell, periodic=periodic, h=hmat)
879 bs_env%periodic(1:3) = periodic(1:3)
880 bs_env%hmat(1:3, 1:3) = hmat
881 bs_env%nimages_scf = dft_control%nimages
882 IF (dft_control%nimages == 1)
THEN
883 IF (bs_env%do_gw_ri_rs)
THEN
884 IF (any(periodic /= 0))
THEN
885 cpabort(
"RI-RS Not Implemented for Periodic Calculations")
892 ELSE IF (dft_control%nimages > 1)
THEN
893 IF (bs_env%do_gw_ri_rs)
THEN
894 cpabort(
"RI-RS Not Implemented for K-point Calculations")
899 cpabort(
"Wrong number of cells from DFT calculation.")
906 CALL section_vals_val_get(input,
"DFT%REAL_TIME_PROPAGATION%RTBSE%_SECTION_PARAMETERS_", i_val=bs_env%rtp_method)
909 WRITE (u, fmt=
"(T2,2A,T73,I8)")
"Number of occupied molecular orbitals (MOs) ", &
910 "= Number of occupied bands", homo
911 WRITE (u, fmt=
"(T2,2A,T73,I8)")
"Number of unoccupied (= virtual) MOs ", &
912 "= Number of unoccupied bands", n_ao - homo
913 WRITE (u, fmt=
"(T2,A,T73,I8)")
"Number of Gaussian basis functions for MOs", n_ao
915 WRITE (u, fmt=
"(T2,2A,T73,I8)")
"Number of cells considered in the DFT ", &
916 "calculation", bs_env%nimages_scf
920 CALL timestop(handle)
922 END SUBROUTINE get_parameters_from_qs_env
928 SUBROUTINE set_heuristic_parameters(bs_env)
931 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
935 CALL timeset(routinen, handle)
937 bs_env%n_bins_max_for_printing = 5000
939 CALL timestop(handle)
941 END SUBROUTINE set_heuristic_parameters
948 SUBROUTINE allocate_and_fill_fm_ks_fm_s(qs_env, bs_env)
952 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_and_fill_fm_ks_fm_s'
954 INTEGER :: handle, i_work, ispin
957 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
960 CALL timeset(routinen, handle)
964 blacs_env=blacs_env, &
965 matrix_ks_kp=matrix_ks, &
966 matrix_s_kp=matrix_s)
970 ncol_global=bs_env%n_ao, para_env=para_env)
972 DO i_work = 1,
SIZE(bs_env%fm_work_mo)
982 DO ispin = 1, bs_env%n_spin
984 CALL copy_dbcsr_to_fm(matrix_ks(ispin, 1)%matrix, bs_env%fm_ks_Gamma(ispin))
985 CALL cp_fm_create(bs_env%fm_mo_coeff_Gamma(ispin), fm_struct)
990 NULLIFY (bs_env%mat_ao_ao%matrix)
991 ALLOCATE (bs_env%mat_ao_ao%matrix)
992 CALL dbcsr_create(bs_env%mat_ao_ao%matrix, template=matrix_s(1, 1)%matrix, &
993 matrix_type=dbcsr_type_no_symmetry)
995 ALLOCATE (bs_env%eigenval_scf(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
997 CALL timestop(handle)
999 END SUBROUTINE allocate_and_fill_fm_ks_fm_s
1010 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dos_pdos_ldos'
1012 INTEGER :: handle, homo, homo_1, homo_2, &
1013 homo_spinor, ikp, ikp_for_file, ispin, &
1014 n_ao, n_e, nkind, nkp
1015 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
1017 REAL(kind=
dp) :: broadening, e_max, e_max_g0w0, e_min, &
1018 e_min_g0w0, e_total_window, &
1019 energy_step_dos, energy_window_dos, t1
1020 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dos_g0w0, dos_g0w0_soc, dos_scf, dos_scf_soc, &
1021 eigenval, eigenval_spinor, eigenval_spinor_g0w0, eigenval_spinor_no_soc
1022 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pdos_g0w0, pdos_g0w0_soc, pdos_scf, &
1023 pdos_scf_soc, proj_mo_on_kind
1024 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ldos_g0w0_2d, ldos_scf_2d, &
1027 band_edges_scf, band_edges_scf_guess, &
1029 TYPE(
cp_cfm_type) :: cfm_ks_ikp, cfm_ks_ikp_spinor, cfm_mos_ikp_spinor, cfm_s_ikp, &
1030 cfm_s_ikp_copy, cfm_s_ikp_spinor, cfm_s_ikp_spinor_copy, cfm_soc_ikp_spinor, &
1031 cfm_spinor_wf_ikp, cfm_work_ikp, cfm_work_ikp_spinor
1034 CALL timeset(routinen, handle)
1038 energy_window_dos = bs_env%energy_window_DOS
1039 energy_step_dos = bs_env%energy_step_DOS
1040 broadening = bs_env%broadening_DOS
1043 IF (bs_env%do_gw .OR. &
1045 band_edges_scf = bs_env%band_edges_scf
1046 band_edges_scf_guess = band_edges_scf
1049 IF (bs_env%n_spin == 1)
THEN
1050 homo = bs_env%n_occ(1)
1051 band_edges_scf_guess%VBM = bs_env%eigenval_scf_Gamma(homo, 1)
1052 band_edges_scf_guess%CBM = bs_env%eigenval_scf_Gamma(homo + 1, 1)
1054 homo_1 = bs_env%n_occ(1)
1055 homo_2 = bs_env%n_occ(2)
1056 band_edges_scf_guess%VBM = max(bs_env%eigenval_scf_Gamma(homo_1, 1), &
1057 bs_env%eigenval_scf_Gamma(homo_2, 2))
1058 band_edges_scf_guess%CBM = min(bs_env%eigenval_scf_Gamma(homo_1 + 1, 1), &
1059 bs_env%eigenval_scf_Gamma(homo_2 + 1, 2))
1063 band_edges_scf%VBM = -1000.0_dp
1064 band_edges_scf%CBM = 1000.0_dp
1065 band_edges_scf%DBG = 1000.0_dp
1068 e_min = band_edges_scf_guess%VBM - 0.5_dp*energy_window_dos
1069 e_max = band_edges_scf_guess%CBM + 0.5_dp*energy_window_dos
1071 IF (bs_env%do_gw)
THEN
1072 band_edges_g0w0 = bs_env%band_edges_G0W0
1073 e_min_g0w0 = band_edges_g0w0%VBM - 0.5_dp*energy_window_dos
1074 e_max_g0w0 = band_edges_g0w0%CBM + 0.5_dp*energy_window_dos
1075 e_min = min(e_min, e_min_g0w0)
1076 e_max = max(e_max, e_max_g0w0)
1079 e_total_window = e_max - e_min
1081 n_e = int(e_total_window/energy_step_dos)
1083 ALLOCATE (dos_scf(n_e))
1085 ALLOCATE (dos_scf_soc(n_e))
1086 dos_scf_soc(:) = 0.0_dp
1090 ALLOCATE (pdos_scf(n_e, nkind))
1091 pdos_scf(:, :) = 0.0_dp
1092 ALLOCATE (pdos_scf_soc(n_e, nkind))
1093 pdos_scf_soc(:, :) = 0.0_dp
1095 ALLOCATE (proj_mo_on_kind(n_ao, nkind))
1096 proj_mo_on_kind(:, :) = 0.0_dp
1098 ALLOCATE (eigenval(n_ao))
1099 ALLOCATE (eigenval_spinor(2*n_ao))
1100 ALLOCATE (eigenval_spinor_no_soc(2*n_ao))
1101 ALLOCATE (eigenval_spinor_g0w0(2*n_ao))
1103 IF (bs_env%do_gw)
THEN
1105 ALLOCATE (dos_g0w0(n_e))
1106 dos_g0w0(:) = 0.0_dp
1107 ALLOCATE (dos_g0w0_soc(n_e))
1108 dos_g0w0_soc(:) = 0.0_dp
1110 ALLOCATE (pdos_g0w0(n_e, nkind))
1111 pdos_g0w0(:, :) = 0.0_dp
1112 ALLOCATE (pdos_g0w0_soc(n_e, nkind))
1113 pdos_g0w0_soc(:, :) = 0.0_dp
1117 CALL cp_cfm_create(cfm_mos_ikp(1), bs_env%fm_ks_Gamma(1)%matrix_struct)
1118 CALL cp_cfm_create(cfm_mos_ikp(2), bs_env%fm_ks_Gamma(1)%matrix_struct)
1119 CALL cp_cfm_create(cfm_work_ikp, bs_env%fm_ks_Gamma(1)%matrix_struct)
1120 CALL cp_cfm_create(cfm_s_ikp_copy, bs_env%fm_ks_Gamma(1)%matrix_struct)
1122 IF (bs_env%do_soc)
THEN
1124 CALL cp_cfm_create(cfm_mos_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1125 CALL cp_cfm_create(cfm_work_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1126 CALL cp_cfm_create(cfm_s_ikp_spinor_copy, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1127 CALL cp_cfm_create(cfm_ks_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1128 CALL cp_cfm_create(cfm_soc_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1129 CALL cp_cfm_create(cfm_s_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1130 CALL cp_cfm_create(cfm_spinor_wf_ikp, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1132 homo_spinor = bs_env%n_occ(1) + bs_env%n_occ(bs_env%n_spin)
1134 band_edges_scf_soc%VBM = -1000.0_dp
1135 band_edges_scf_soc%CBM = 1000.0_dp
1136 band_edges_scf_soc%DBG = 1000.0_dp
1138 IF (bs_env%do_gw)
THEN
1139 band_edges_g0w0_soc%VBM = -1000.0_dp
1140 band_edges_g0w0_soc%CBM = 1000.0_dp
1141 band_edges_g0w0_soc%DBG = 1000.0_dp
1144 IF (bs_env%unit_nr > 0)
THEN
1145 WRITE (bs_env%unit_nr,
'(A)')
''
1146 WRITE (bs_env%unit_nr,
'(T2,A,F43.1,A)')
'SOC requested, SOC energy window:', &
1147 bs_env%energy_window_soc*
evolt,
' eV'
1152 IF (bs_env%do_ldos)
THEN
1156 IF (bs_env%unit_nr > 0)
THEN
1157 WRITE (bs_env%unit_nr,
'(A)')
''
1161 CALL cp_cfm_create(cfm_ks_ikp, bs_env%cfm_ks_kp(1, 1)%matrix_struct)
1162 CALL cp_cfm_create(cfm_s_ikp, bs_env%cfm_ks_kp(1, 1)%matrix_struct)
1165 DO ikp = 1, bs_env%nkp_bs_and_DOS
1169 DO ispin = 1, bs_env%n_spin
1171 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1176 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
1180 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
1184 CALL cp_cfm_geeig(cfm_ks_ikp, cfm_s_ikp_copy, cfm_mos_ikp(ispin), &
1185 eigenval, cfm_work_ikp)
1190 CALL cp_cfm_to_cfm(bs_env%cfm_ks_kp(ikp, ispin), cfm_ks_ikp)
1196 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mos_ikp(ispin))
1197 eigenval(:) = bs_env%eigenval_scf(:, ikp, ispin)
1203 CALL compute_proj_mo_on_kind(proj_mo_on_kind, qs_env, cfm_mos_ikp(ispin), cfm_s_ikp)
1206 CALL add_to_dos_pdos(dos_scf, pdos_scf, eigenval, ikp, bs_env, n_e, e_min, &
1208 IF (bs_env%do_gw)
THEN
1209 CALL add_to_dos_pdos(dos_g0w0, pdos_g0w0, bs_env%eigenval_G0W0(:, ikp, ispin), &
1210 ikp, bs_env, n_e, e_min, proj_mo_on_kind)
1213 IF (bs_env%do_ldos)
THEN
1214 CALL add_to_ldos_2d(ldos_scf_2d, qs_env, ikp, bs_env, cfm_mos_ikp(ispin), &
1215 eigenval(:), band_edges_scf_guess)
1217 IF (bs_env%do_gw)
THEN
1218 CALL add_to_ldos_2d(ldos_g0w0_2d, qs_env, ikp, bs_env, cfm_mos_ikp(ispin), &
1219 bs_env%eigenval_G0W0(:, ikp, 1), band_edges_g0w0)
1224 homo = bs_env%n_occ(ispin)
1226 band_edges_scf%VBM = max(band_edges_scf%VBM, eigenval(homo))
1227 band_edges_scf%CBM = min(band_edges_scf%CBM, eigenval(homo + 1))
1228 band_edges_scf%DBG = min(band_edges_scf%DBG, eigenval(homo + 1) - eigenval(homo))
1233 IF (bs_env%do_soc)
THEN
1236 print_dos_kpoints = (bs_env%nkp_only_bs <= 0)
1238 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
1239 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
1241 IF (print_dos_kpoints)
THEN
1242 nkp = bs_env%nkp_only_DOS
1245 nkp = bs_env%nkp_only_bs
1246 ikp_for_file = ikp - bs_env%nkp_only_DOS
1250 CALL soc_ev(bs_env, qs_env, ikp, bs_env%eigenval_scf, band_edges_scf, &
1251 e_min, cfm_mos_ikp, dos_scf_soc, pdos_scf_soc, &
1252 band_edges_scf_soc, eigenval_spinor, cfm_spinor_wf_ikp)
1254 IF (.NOT. bs_env%do_gw .AND. print_ikp)
THEN
1255 CALL write_soc_eigenvalues(eigenval_spinor, ikp_for_file, ikp, bs_env)
1258 IF (bs_env%do_ldos)
THEN
1259 CALL add_to_ldos_2d(ldos_scf_2d_soc, qs_env, ikp, bs_env, cfm_spinor_wf_ikp, &
1260 eigenval_spinor, band_edges_scf_guess, .true., cfm_work_ikp)
1263 IF (bs_env%do_gw)
THEN
1266 CALL soc_ev(bs_env, qs_env, ikp, bs_env%eigenval_G0W0, band_edges_g0w0, &
1267 e_min, cfm_mos_ikp, dos_g0w0_soc, pdos_g0w0_soc, &
1268 band_edges_g0w0_soc, eigenval_spinor_g0w0, cfm_spinor_wf_ikp)
1273 CALL write_soc_eigenvalues(eigenval_spinor, ikp_for_file, ikp, bs_env, &
1274 eigenval_spinor_g0w0)
1281 IF (bs_env%unit_nr > 0 .AND.
m_walltime() - t1 > 20.0_dp)
THEN
1282 WRITE (bs_env%unit_nr,
'(T2,A,T43,I5,A,I3,A,F7.1,A)') &
1283 'Compute DOS, LDOS for k-point ', ikp,
' /', bs_env%nkp_bs_and_DOS, &
1289 band_edges_scf%IDBG = band_edges_scf%CBM - band_edges_scf%VBM
1290 IF (bs_env%do_soc)
THEN
1291 band_edges_scf_soc%IDBG = band_edges_scf_soc%CBM - band_edges_scf_soc%VBM
1292 IF (bs_env%do_gw)
THEN
1293 band_edges_g0w0_soc%IDBG = band_edges_g0w0_soc%CBM - band_edges_g0w0_soc%VBM
1297 CALL write_band_edges(band_edges_scf,
"SCF", bs_env)
1298 CALL write_dos_pdos(dos_scf, pdos_scf, bs_env, qs_env,
"SCF", e_min, band_edges_scf%VBM)
1299 IF (bs_env%do_ldos)
THEN
1300 CALL print_ldos_main(ldos_scf_2d, bs_env, band_edges_scf,
"SCF")
1303 IF (bs_env%do_soc)
THEN
1304 CALL write_band_edges(band_edges_scf_soc,
"SCF+SOC", bs_env)
1305 CALL write_dos_pdos(dos_scf_soc, pdos_scf_soc, bs_env, qs_env,
"SCF_SOC", &
1306 e_min, band_edges_scf_soc%VBM)
1307 IF (bs_env%do_ldos)
THEN
1310 CALL print_ldos_main(ldos_scf_2d_soc, bs_env, band_edges_scf, &
1315 IF (bs_env%do_gw)
THEN
1316 CALL write_band_edges(band_edges_g0w0,
"G0W0", bs_env)
1317 CALL write_band_edges(bs_env%band_edges_HF,
"Hartree-Fock with SCF orbitals", bs_env)
1318 CALL write_dos_pdos(dos_g0w0, pdos_g0w0, bs_env, qs_env,
"G0W0", e_min, &
1319 band_edges_g0w0%VBM)
1320 IF (bs_env%do_ldos)
THEN
1321 CALL print_ldos_main(ldos_g0w0_2d, bs_env, band_edges_g0w0,
"G0W0")
1325 IF (bs_env%do_soc .AND. bs_env%do_gw)
THEN
1326 CALL write_band_edges(band_edges_g0w0_soc,
"G0W0+SOC", bs_env)
1327 CALL write_dos_pdos(dos_g0w0_soc, pdos_g0w0_soc, bs_env, qs_env,
"G0W0_SOC", e_min, &
1328 band_edges_g0w0_soc%VBM)
1346 CALL timestop(handle)
1357 SUBROUTINE print_ldos_main(LDOS_2d, bs_env, band_edges, scf_gw_soc)
1358 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ldos_2d
1361 CHARACTER(LEN=*) :: scf_gw_soc
1363 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_LDOS_main'
1365 INTEGER :: handle, i_x, i_x_bin, i_x_end, i_x_end_bin, i_x_end_glob, i_x_start, &
1366 i_x_start_bin, i_x_start_glob, i_y, i_y_bin, i_y_end, i_y_end_bin, i_y_end_glob, &
1367 i_y_start, i_y_start_bin, i_y_start_glob, n_e
1368 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: n_sum_for_bins
1369 INTEGER,
DIMENSION(2) :: bin_mesh
1370 LOGICAL :: do_xy_bins
1371 REAL(kind=
dp) :: e_min, energy_step, energy_window
1372 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ldos_2d_bins
1374 CALL timeset(routinen, handle)
1376 n_e =
SIZE(ldos_2d, 3)
1378 energy_window = bs_env%energy_window_DOS
1379 energy_step = bs_env%energy_step_DOS
1380 e_min = band_edges%VBM - 0.5_dp*energy_window
1382 bin_mesh(1:2) = bs_env%bin_mesh(1:2)
1383 do_xy_bins = (bin_mesh(1) > 0 .AND. bin_mesh(2) > 0)
1385 i_x_start = lbound(ldos_2d, 1)
1386 i_x_end = ubound(ldos_2d, 1)
1387 i_y_start = lbound(ldos_2d, 2)
1388 i_y_end = ubound(ldos_2d, 2)
1390 IF (do_xy_bins)
THEN
1392 i_x_end_bin = bin_mesh(1)
1394 i_y_end_bin = bin_mesh(2)
1396 i_x_start_bin = i_x_start
1397 i_x_end_bin = i_x_end
1398 i_y_start_bin = i_y_start
1399 i_y_end_bin = i_y_end
1402 ALLOCATE (ldos_2d_bins(i_x_start_bin:i_x_end_bin, i_y_start_bin:i_y_end_bin, n_e))
1403 ldos_2d_bins(:, :, :) = 0.0_dp
1405 IF (do_xy_bins)
THEN
1407 i_x_start_glob = i_x_start
1408 i_x_end_glob = i_x_end
1409 i_y_start_glob = i_y_start
1410 i_y_end_glob = i_y_end
1412 CALL bs_env%para_env%min(i_x_start_glob)
1413 CALL bs_env%para_env%max(i_x_end_glob)
1414 CALL bs_env%para_env%min(i_y_start_glob)
1415 CALL bs_env%para_env%max(i_y_end_glob)
1417 ALLOCATE (n_sum_for_bins(bin_mesh(1), bin_mesh(2)), source=0)
1420 DO i_y = i_y_start, i_y_end
1421 DO i_x = i_x_start, i_x_end
1422 i_x_bin = bin_mesh(1)*(i_x - i_x_start_glob)/(i_x_end_glob - i_x_start_glob + 1) + 1
1423 i_y_bin = bin_mesh(2)*(i_y - i_y_start_glob)/(i_y_end_glob - i_y_start_glob + 1) + 1
1424 ldos_2d_bins(i_x_bin, i_y_bin, :) = ldos_2d_bins(i_x_bin, i_y_bin, :) + &
1425 ldos_2d(i_x, i_y, :)
1426 n_sum_for_bins(i_x_bin, i_y_bin) = n_sum_for_bins(i_x_bin, i_y_bin) + 1
1430 CALL bs_env%para_env%sum(ldos_2d_bins)
1431 CALL bs_env%para_env%sum(n_sum_for_bins)
1434 DO i_y_bin = 1, bin_mesh(2)
1435 DO i_x_bin = 1, bin_mesh(1)
1436 ldos_2d_bins(i_x_bin, i_y_bin, :) = ldos_2d_bins(i_x_bin, i_y_bin, :)/ &
1437 REAL(n_sum_for_bins(i_x_bin, i_y_bin), kind=
dp)
1443 ldos_2d_bins(:, :, :) = ldos_2d(:, :, :)
1447 IF (bin_mesh(1)*bin_mesh(2) < bs_env%n_bins_max_for_printing)
THEN
1448 CALL print_ldos_2d_bins(ldos_2d_bins, bs_env, e_min, scf_gw_soc)
1450 cpwarn(
"The number of bins for the LDOS is too large. Decrease BIN_MESH.")
1453 CALL timestop(handle)
1455 END SUBROUTINE print_ldos_main
1464 SUBROUTINE print_ldos_2d_bins(LDOS_2d_bins, bs_env, E_min, scf_gw_soc)
1465 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ldos_2d_bins
1467 REAL(kind=
dp) :: e_min
1468 CHARACTER(LEN=*) :: scf_gw_soc
1470 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_LDOS_2d_bins'
1472 CHARACTER(LEN=18) :: print_format
1473 CHARACTER(LEN=4) :: print_format_1, print_format_2
1474 CHARACTER(len=default_string_length) :: fname
1475 INTEGER :: handle, i_e, i_x, i_x_end, i_x_start, &
1476 i_y, i_y_end, i_y_start, iunit, n_e, &
1478 REAL(kind=
dp) :: energy
1479 REAL(kind=
dp),
DIMENSION(3) :: coord,
idx
1481 CALL timeset(routinen, handle)
1483 i_x_start = lbound(ldos_2d_bins, 1)
1484 i_x_end = ubound(ldos_2d_bins, 1)
1485 i_y_start = lbound(ldos_2d_bins, 2)
1486 i_y_end = ubound(ldos_2d_bins, 2)
1487 n_e =
SIZE(ldos_2d_bins, 3)
1489 n_x = i_x_end - i_x_start + 1
1490 n_y = i_y_end - i_y_start + 1
1492 IF (bs_env%para_env%is_source())
THEN
1494 DO i_y = i_y_start, i_y_end
1495 DO i_x = i_x_start, i_x_end
1497 idx(1) = (real(i_x, kind=
dp) - 0.5_dp)/real(n_x, kind=
dp)
1498 idx(2) = (real(i_y, kind=
dp) - 0.5_dp)/real(n_y, kind=
dp)
1500 coord(1:3) = matmul(bs_env%hmat,
idx)
1502 CALL get_print_format(coord(1), print_format_1)
1503 CALL get_print_format(coord(2), print_format_2)
1505 print_format =
"(3A,"//print_format_1//
",A,"//print_format_2//
",A)"
1507 WRITE (fname, print_format)
"LDOS_", scf_gw_soc, &
1510 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
1511 file_action=
"WRITE")
1513 WRITE (iunit,
"(2A)") Å
" Energy E (eV) average LDOS(x,y,E) (1/(eV*^2), ", &
1514 "integrated over z, averaged inside bin)"
1517 energy = e_min + i_e*bs_env%energy_step_DOS
1518 WRITE (iunit,
"(2F17.3)") energy*
evolt, &
1519 ldos_2d_bins(i_x, i_y, i_e)* &
1520 bs_env%unit_ldos_int_z_inv_Ang2_eV
1530 CALL timestop(handle)
1532 END SUBROUTINE print_ldos_2d_bins
1539 SUBROUTINE get_print_format(coord, print_format)
1540 REAL(kind=
dp) :: coord
1541 CHARACTER(LEN=4) :: print_format
1543 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_print_format'
1547 CALL timeset(routinen, handle)
1550 print_format =
"F9.2"
1551 ELSE IF (coord < -1000/
angstrom)
THEN
1552 print_format =
"F8.2"
1553 ELSE IF (coord < -100/
angstrom)
THEN
1554 print_format =
"F7.2"
1555 ELSE IF (coord < -10/
angstrom)
THEN
1556 print_format =
"F6.2"
1558 print_format =
"F5.2"
1560 print_format =
"F4.2"
1561 ELSE IF (coord < 100/
angstrom)
THEN
1562 print_format =
"F5.2"
1563 ELSE IF (coord < 1000/
angstrom)
THEN
1564 print_format =
"F6.2"
1565 ELSE IF (coord < 10000/
angstrom)
THEN
1566 print_format =
"F7.2"
1568 print_format =
"F8.2"
1571 CALL timestop(handle)
1573 END SUBROUTINE get_print_format
1590 SUBROUTINE soc_ev(bs_env, qs_env, ikp, eigenval_no_SOC, band_edges_no_SOC, E_min, cfm_mos_ikp, &
1591 DOS, PDOS, band_edges, eigenval_spinor, cfm_spinor_wf_ikp)
1596 REAL(kind=
dp),
DIMENSION(:, :, :) :: eigenval_no_soc
1598 REAL(kind=
dp) :: e_min
1600 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dos
1601 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pdos
1603 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenval_spinor
1606 CHARACTER(LEN=*),
PARAMETER :: routinen =
'SOC_ev'
1608 INTEGER :: handle, homo_spinor, n_ao, n_e, nkind
1609 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenval_spinor_no_soc
1610 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: proj_mo_on_kind_spinor
1612 cfm_ks_ikp_spinor, cfm_mos_ikp_spinor, &
1613 cfm_soc_ikp_spinor, cfm_work_ikp_spinor
1615 CALL timeset(routinen, handle)
1618 homo_spinor = bs_env%n_occ(1) + bs_env%n_occ(bs_env%n_spin)
1620 nkind =
SIZE(pdos, 2)
1622 CALL cp_cfm_create(cfm_ks_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1623 CALL cp_cfm_create(cfm_soc_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1624 CALL cp_cfm_create(cfm_mos_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1625 CALL cp_cfm_create(cfm_work_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1626 CALL cp_cfm_create(cfm_eigenvec_ikp_spinor, bs_env%cfm_SOC_spinor_ao(1)%matrix_struct)
1628 ALLOCATE (eigenval_spinor_no_soc(2*n_ao))
1629 ALLOCATE (proj_mo_on_kind_spinor(2*n_ao, nkind))
1631 proj_mo_on_kind_spinor(:, :) = 0.0_dp
1634 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1638 CALL cfm_ikp_from_cfm_spinor_gamma(cfm_soc_ikp_spinor, &
1639 bs_env%cfm_SOC_spinor_ao(1), &
1640 bs_env%fm_s_Gamma%matrix_struct, &
1641 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
1646 CALL cp_cfm_to_cfm(bs_env%cfm_SOC_spinor_ao(ikp), cfm_soc_ikp_spinor)
1656 CALL add_cfm_submat(cfm_mos_ikp_spinor, cfm_mos_ikp(bs_env%n_spin), n_ao + 1, n_ao + 1)
1660 cfm_mos_ikp_spinor, cfm_soc_ikp_spinor, &
1661 z_zero, cfm_work_ikp_spinor)
1665 cfm_work_ikp_spinor, cfm_mos_ikp_spinor, &
1666 z_zero, cfm_ks_ikp_spinor)
1671 eigenval_spinor_no_soc(1:n_ao) = eigenval_no_soc(1:n_ao, ikp, 1)
1672 eigenval_spinor_no_soc(n_ao + 1:) = eigenval_no_soc(1:n_ao, ikp, bs_env%n_spin)
1673 IF (bs_env%energy_window_soc > 0.0_dp)
THEN
1675 bs_env%energy_window_soc, &
1676 eigenval_spinor_no_soc, &
1677 band_edges_no_soc%VBM, &
1678 band_edges_no_soc%CBM)
1685 CALL cp_cfm_heevd(cfm_ks_ikp_spinor, cfm_eigenvec_ikp_spinor, eigenval_spinor)
1688 CALL add_to_dos_pdos(dos, pdos, eigenval_spinor, &
1689 ikp, bs_env, n_e, e_min, proj_mo_on_kind_spinor)
1692 band_edges%VBM = max(band_edges%VBM, eigenval_spinor(homo_spinor))
1693 band_edges%CBM = min(band_edges%CBM, eigenval_spinor(homo_spinor + 1))
1694 band_edges%DBG = min(band_edges%DBG, eigenval_spinor(homo_spinor + 1) &
1695 - eigenval_spinor(homo_spinor))
1699 cfm_mos_ikp_spinor, cfm_eigenvec_ikp_spinor, &
1700 z_zero, cfm_spinor_wf_ikp)
1708 CALL timestop(handle)
1710 END SUBROUTINE soc_ev
1723 SUBROUTINE add_to_dos_pdos(DOS, PDOS, eigenval, ikp, bs_env, n_E, E_min, proj_mo_on_kind)
1725 REAL(kind=
dp),
DIMENSION(:) :: dos
1726 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pdos
1727 REAL(kind=
dp),
DIMENSION(:) :: eigenval
1731 REAL(kind=
dp) :: e_min
1732 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: proj_mo_on_kind
1734 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_to_DOS_PDOS'
1736 INTEGER :: handle, i_e, i_kind, i_mo, n_mo, nkind
1737 REAL(kind=
dp) :: broadening, energy, energy_step_dos, wkp
1739 CALL timeset(routinen, handle)
1741 energy_step_dos = bs_env%energy_step_DOS
1742 broadening = bs_env%broadening_DOS
1744 n_mo =
SIZE(eigenval)
1745 nkind =
SIZE(proj_mo_on_kind, 2)
1748 wkp = bs_env%kpoints_DOS%wkp(ikp)*bs_env%spin_degeneracy
1750 energy = e_min + i_e*energy_step_dos
1753 dos(i_e) = dos(i_e) + wkp*
gaussian(energy - eigenval(i_mo), broadening)
1756 DO i_kind = 1, nkind
1757 IF (proj_mo_on_kind(i_mo, i_kind) > 0.0_dp)
THEN
1758 pdos(i_e, i_kind) = pdos(i_e, i_kind) + &
1759 proj_mo_on_kind(i_mo, i_kind)*wkp* &
1760 gaussian(energy - eigenval(i_mo), broadening)
1766 CALL timestop(handle)
1768 END SUBROUTINE add_to_dos_pdos
1782 SUBROUTINE add_to_ldos_2d(LDOS_2d, qs_env, ikp, bs_env, cfm_mos_ikp, eigenval, &
1783 band_edges, do_spinor, cfm_non_spinor)
1784 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ldos_2d
1789 REAL(kind=
dp),
DIMENSION(:) :: eigenval
1791 LOGICAL,
OPTIONAL :: do_spinor
1794 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_to_LDOS_2d'
1796 INTEGER :: handle, i_e, i_x_end, i_x_start, i_y_end, i_y_start, i_z, i_z_end, i_z_start, &
1797 j_col, j_mo, n_e, n_mo, n_z, ncol_local, nimages, z_end_global, z_start_global
1798 INTEGER,
DIMENSION(:),
POINTER :: col_indices
1799 LOGICAL :: is_any_weight_non_zero, my_do_spinor
1800 REAL(kind=
dp) :: broadening, e_max, e_min, &
1801 e_total_window, energy, energy_step, &
1802 energy_window, spin_degeneracy, weight
1803 TYPE(
cp_cfm_type) :: cfm_weighted_dm_ikp, cfm_work
1804 TYPE(
cp_fm_type) :: fm_non_spinor, fm_weighted_dm_mic
1805 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: weighted_dm_mic
1813 CALL timeset(routinen, handle)
1815 my_do_spinor = .false.
1816 IF (
PRESENT(do_spinor)) my_do_spinor = do_spinor
1818 CALL get_qs_env(qs_env, ks_env=ks_env, pw_env=pw_env, dft_control=dft_control)
1821 nimages = dft_control%nimages
1822 dft_control%nimages = bs_env%nimages_scf
1824 energy_window = bs_env%energy_window_DOS
1825 energy_step = bs_env%energy_step_DOS
1826 broadening = bs_env%broadening_DOS
1828 e_min = band_edges%VBM - 0.5_dp*energy_window
1829 e_max = band_edges%CBM + 0.5_dp*energy_window
1830 e_total_window = e_max - e_min
1832 n_e = int(e_total_window/energy_step)
1834 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1836 CALL auxbas_pw_pool%create_pw(ldos_3d)
1837 CALL auxbas_pw_pool%create_pw(rho_g)
1839 i_x_start = lbound(ldos_3d%array, 1)
1840 i_x_end = ubound(ldos_3d%array, 1)
1841 i_y_start = lbound(ldos_3d%array, 2)
1842 i_y_end = ubound(ldos_3d%array, 2)
1843 i_z_start = lbound(ldos_3d%array, 3)
1844 i_z_end = ubound(ldos_3d%array, 3)
1846 z_start_global = i_z_start
1847 z_end_global = i_z_end
1849 CALL bs_env%para_env%min(z_start_global)
1850 CALL bs_env%para_env%max(z_end_global)
1851 n_z = z_end_global - z_start_global + 1
1853 IF (any(abs(bs_env%hmat(1:2, 3)) > 1.0e-6_dp) .OR. any(abs(bs_env%hmat(3, 1:2)) > 1.0e-6_dp)) &
1854 cpabort(°
"Please choose a cell that has 90 angles to the z-direction.")
1856 bs_env%unit_ldos_int_z_inv_Ang2_eV = bs_env%hmat(3, 3)/real(n_z, kind=
dp)/
evolt/
angstrom**2
1859 ALLOCATE (ldos_2d(i_x_start:i_x_end, i_y_start:i_y_end, n_e))
1860 ldos_2d(:, :, :) = 0.0_dp
1864 CALL cp_cfm_create(cfm_weighted_dm_ikp, cfm_mos_ikp%matrix_struct)
1865 CALL cp_fm_create(fm_weighted_dm_mic, cfm_mos_ikp%matrix_struct)
1866 IF (my_do_spinor)
THEN
1867 CALL cp_fm_create(fm_non_spinor, cfm_non_spinor%matrix_struct)
1872 ncol_local=ncol_local, &
1873 col_indices=col_indices)
1875 NULLIFY (weighted_dm_mic)
1877 ALLOCATE (weighted_dm_mic(1)%matrix)
1878 CALL dbcsr_create(weighted_dm_mic(1)%matrix, template=bs_env%mat_ao_ao%matrix, &
1879 matrix_type=dbcsr_type_symmetric)
1883 energy = e_min + i_e*energy_step
1885 is_any_weight_non_zero = .false.
1887 DO j_col = 1, ncol_local
1889 j_mo = col_indices(j_col)
1891 IF (my_do_spinor)
THEN
1892 spin_degeneracy = 1.0_dp
1894 spin_degeneracy = bs_env%spin_degeneracy
1897 weight =
gaussian(energy - eigenval(j_mo), broadening)*spin_degeneracy
1899 cfm_work%local_data(:, j_col) = cfm_mos_ikp%local_data(:, j_col)*weight
1901 IF (weight > 1.0e-5_dp) is_any_weight_non_zero = .true.
1905 CALL bs_env%para_env%sync()
1906 CALL bs_env%para_env%sum(is_any_weight_non_zero)
1907 CALL bs_env%para_env%sync()
1910 IF (is_any_weight_non_zero)
THEN
1913 cfm_mos_ikp, cfm_work,
z_zero, cfm_weighted_dm_ikp)
1915 IF (my_do_spinor)
THEN
1921 cfm_non_spinor, ikp, bs_env%kpoints_DOS, &
1922 "ORB", bs_env%kpoints_DOS%wkp(ikp))
1925 CALL get_cfm_submat(cfm_non_spinor, cfm_weighted_dm_ikp, n_mo/2, n_mo/2)
1927 cfm_non_spinor, ikp, bs_env%kpoints_DOS, &
1928 "ORB", bs_env%kpoints_DOS%wkp(ikp))
1930 keep_sparsity=.false.)
1934 cfm_weighted_dm_ikp, ikp, bs_env%kpoints_DOS, &
1935 "ORB", bs_env%kpoints_DOS%wkp(ikp))
1937 keep_sparsity=.false.)
1940 ldos_3d%array(:, :, :) = 0.0_dp
1947 DO i_z = i_z_start, i_z_end
1948 ldos_2d(:, :, i_e) = ldos_2d(:, :, i_e) + ldos_3d%array(:, :, i_z)
1956 dft_control%nimages = nimages
1958 CALL auxbas_pw_pool%give_back_pw(ldos_3d)
1959 CALL auxbas_pw_pool%give_back_pw(rho_g)
1968 IF (my_do_spinor)
THEN
1972 CALL timestop(handle)
1974 END SUBROUTINE add_to_ldos_2d
1984 SUBROUTINE write_soc_eigenvalues(eigenval_spinor, ikp_for_file, ikp, bs_env, eigenval_spinor_G0W0)
1986 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenval_spinor
1987 INTEGER :: ikp_for_file, ikp
1989 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:),
OPTIONAL :: eigenval_spinor_g0w0
1991 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_SOC_eigenvalues'
1993 CHARACTER(len=3) :: occ_vir
1994 CHARACTER(LEN=default_string_length) :: fname
1995 INTEGER :: handle, i_mo, iunit, n_occ_spinor
1997 CALL timeset(routinen, handle)
1999 fname =
"bandstructure_SCF_and_G0W0_plus_SOC"
2001 IF (bs_env%para_env%is_source())
THEN
2003 IF (ikp_for_file == 1)
THEN
2004 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
2005 file_action=
"WRITE")
2007 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
2008 file_action=
"WRITE", file_position=
"APPEND")
2011 WRITE (iunit,
"(A)")
" "
2012 WRITE (iunit,
"(A10,I7,A25,3F10.4)")
"kpoint: ", ikp_for_file,
"coordinate: ", &
2013 bs_env%kpoints_DOS%xkp(:, ikp)
2014 WRITE (iunit,
"(A)")
" "
2016 IF (
PRESENT(eigenval_spinor_g0w0))
THEN
2018 WRITE (iunit,
"(A5,A12,2A22)")
"n",
"k", ϵ
"_nk^DFT+SOC (eV)", ϵ
"_nk^G0W0+SOC (eV)"
2021 WRITE (iunit,
"(A5,A12,A22)")
"n",
"k", ϵ
"_nk^DFT+SOC (eV)"
2024 n_occ_spinor = bs_env%n_occ(1) + bs_env%n_occ(bs_env%n_spin)
2026 DO i_mo = 1,
SIZE(eigenval_spinor)
2027 IF (i_mo <= n_occ_spinor) occ_vir =
'occ'
2028 IF (i_mo > n_occ_spinor) occ_vir =
'vir'
2029 IF (
PRESENT(eigenval_spinor_g0w0))
THEN
2031 WRITE (iunit,
"(I5,3A,I5,4F16.3,2F17.3)") i_mo,
' (', occ_vir,
') ', &
2032 ikp_for_file, eigenval_spinor(i_mo)*
evolt, eigenval_spinor_g0w0(i_mo)*
evolt
2035 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', &
2036 ikp_for_file, eigenval_spinor(i_mo)*
evolt
2044 CALL timestop(handle)
2046 END SUBROUTINE write_soc_eigenvalues
2053 PURE FUNCTION count_digits(int_number)
2055 INTEGER,
INTENT(IN) :: int_number
2056 INTEGER :: count_digits
2058 INTEGER :: digitcount, tempint
2062 tempint = int_number
2064 DO WHILE (tempint /= 0)
2065 tempint = tempint/10
2066 digitcount = digitcount + 1
2069 count_digits = digitcount
2071 END FUNCTION count_digits
2079 SUBROUTINE write_band_edges(band_edges, scf_gw_soc, bs_env)
2082 CHARACTER(LEN=*) :: scf_gw_soc
2085 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_band_edges'
2087 CHARACTER(LEN=17) :: print_format
2088 INTEGER :: handle, u
2090 CALL timeset(routinen, handle)
2093 print_format =
"(T2,2A,T61,F20.3)"
2097 WRITE (u,
'(T2,A)')
''
2098 WRITE (u, print_format) scf_gw_soc,
' valence band maximum (eV):', band_edges%VBM*
evolt
2099 WRITE (u, print_format) scf_gw_soc,
' conduction band minimum (eV):', band_edges%CBM*
evolt
2100 WRITE (u, print_format) scf_gw_soc,
' indirect band gap (eV):', band_edges%IDBG*
evolt
2101 WRITE (u, print_format) scf_gw_soc,
' direct band gap (eV):', band_edges%DBG*
evolt
2104 CALL timestop(handle)
2106 END SUBROUTINE write_band_edges
2118 SUBROUTINE write_dos_pdos(DOS, PDOS, bs_env, qs_env, scf_gw_soc, E_min, E_VBM)
2119 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dos
2120 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pdos
2123 CHARACTER(LEN=*) :: scf_gw_soc
2124 REAL(kind=
dp) :: e_min, e_vbm
2126 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_dos_pdos'
2128 CHARACTER(LEN=3),
DIMENSION(100) :: elements
2129 CHARACTER(LEN=default_string_length) :: atom_name, fname, output_string
2130 INTEGER :: handle, i_e, i_kind, iatom, iunit, n_a, &
2132 REAL(kind=
dp) :: energy
2135 CALL timeset(routinen, handle)
2137 WRITE (fname,
"(3A)")
"DOS_PDOS_", scf_gw_soc,
".out"
2140 nkind =
SIZE(pdos, 2)
2141 CALL get_qs_env(qs_env, particle_set=particle_set)
2143 IF (bs_env%para_env%is_source())
THEN
2145 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", file_action=
"WRITE")
2149 DO iatom = 1, bs_env%n_atom
2151 kind_number=i_kind, name=atom_name)
2152 elements(i_kind) = atom_name(1:3)
2155 WRITE (output_string,
"(A,I1,A)")
"(", n_a,
"A)"
2157 WRITE (iunit, trim(output_string))
"Energy-E_F (eV) DOS (1/eV) PDOS (1/eV) ", &
2158 " of atom type ", elements(1:nkind)
2160 WRITE (output_string,
"(A,I1,A)")
"(", n_a,
"F13.5)"
2164 energy = e_min + i_e*bs_env%energy_step_DOS - e_vbm
2165 WRITE (iunit, trim(output_string)) energy*
evolt, dos(i_e)/
evolt, pdos(i_e, :)/
evolt
2172 CALL timestop(handle)
2174 END SUBROUTINE write_dos_pdos
2182 PURE FUNCTION gaussian(energy, broadening)
2184 REAL(kind=
dp),
INTENT(IN) :: energy, broadening
2187 IF (abs(energy) < 5*broadening)
THEN
2188 gaussian = 1.0_dp/broadening/sqrt(
twopi)*exp(-0.5_dp*energy**2/broadening**2)
2202 SUBROUTINE compute_proj_mo_on_kind(proj_mo_on_kind, qs_env, cfm_mos, cfm_s)
2203 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: proj_mo_on_kind
2207 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_proj_mo_on_kind'
2209 INTEGER :: handle, i_atom, i_global, i_kind, i_row, &
2210 j_col, n_ao, n_mo, ncol_local, nkind, &
2212 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_from_bf, kind_of
2213 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
2215 TYPE(
cp_cfm_type) :: cfm_proj, cfm_s_i_kind, cfm_work
2218 CALL timeset(routinen, handle)
2220 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, nkind=nkind)
2225 nrow_local=nrow_local, &
2226 ncol_local=ncol_local, &
2227 row_indices=row_indices, &
2228 col_indices=col_indices)
2230 n_ao = qs_env%bs_env%n_ao
2232 ALLOCATE (atom_from_bf(n_ao))
2235 proj_mo_on_kind(:, :) = 0.0_dp
2243 DO i_kind = 1, nkind
2248 DO j_col = 1, ncol_local
2249 DO i_row = 1, nrow_local
2251 i_global = row_indices(i_row)
2253 IF (i_global <= n_ao)
THEN
2254 i_atom = atom_from_bf(i_global)
2255 ELSE IF (i_global <= 2*n_ao)
THEN
2256 i_atom = atom_from_bf(i_global - n_ao)
2258 cpabort(
"Wrong indices.")
2261 IF (i_kind /= kind_of(i_atom))
THEN
2262 cfm_s_i_kind%local_data(i_row, j_col) =
z_zero
2269 cfm_s_i_kind, cfm_mos,
z_zero, cfm_work)
2271 cfm_mos, cfm_work,
z_zero, cfm_proj)
2286 CALL timestop(handle)
2288 END SUBROUTINE compute_proj_mo_on_kind
2300 SUBROUTINE cfm_ikp_from_cfm_spinor_gamma(cfm_spinor_ikp, cfm_spinor_Gamma, fm_struct_non_spinor, &
2301 ikp, qs_env, kpoints, basis_type)
2302 TYPE(
cp_cfm_type) :: cfm_spinor_ikp, cfm_spinor_gamma
2307 CHARACTER(LEN=*) :: basis_type
2309 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cfm_ikp_from_cfm_spinor_Gamma'
2311 INTEGER :: handle, i_block, i_offset, j_block, &
2313 TYPE(
cp_cfm_type) :: cfm_non_spinor_gamma, cfm_non_spinor_ikp
2314 TYPE(
cp_fm_type) :: fm_non_spinor_gamma_im, &
2315 fm_non_spinor_gamma_re
2317 CALL timeset(routinen, handle)
2319 CALL cp_cfm_create(cfm_non_spinor_gamma, fm_struct_non_spinor)
2320 CALL cp_cfm_create(cfm_non_spinor_ikp, fm_struct_non_spinor)
2321 CALL cp_fm_create(fm_non_spinor_gamma_re, fm_struct_non_spinor)
2322 CALL cp_fm_create(fm_non_spinor_gamma_im, fm_struct_non_spinor)
2330 i_offset = i_block*n_ao + 1
2331 j_offset = j_block*n_ao + 1
2332 CALL get_cfm_submat(cfm_non_spinor_gamma, cfm_spinor_gamma, i_offset, j_offset)
2333 CALL cp_cfm_to_fm(cfm_non_spinor_gamma, fm_non_spinor_gamma_re, fm_non_spinor_gamma_im)
2337 ikp, qs_env, kpoints, basis_type)
2338 CALL add_cfm_submat(cfm_spinor_ikp, cfm_non_spinor_ikp, i_offset, j_offset)
2342 ikp, qs_env, kpoints, basis_type)
2353 CALL timestop(handle)
2355 END SUBROUTINE cfm_ikp_from_cfm_spinor_gamma
2372 CHARACTER(LEN=*) :: basis_type
2374 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cfm_ikp_from_fm_Gamma'
2376 INTEGER :: col_global, handle, i_atom, i_atom_old, i_cell, i_mic_cell, i_row, j_atom, &
2377 j_atom_old, j_cell, j_col, n_bf, ncol_local, nrow_local, num_cells, row_global
2378 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_from_bf
2379 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
2380 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
2381 LOGICAL :: i_cell_is_the_minimum_image_cell
2382 REAL(kind=
dp) :: abs_rab_cell_i, abs_rab_cell_j, arg
2383 REAL(kind=
dp),
DIMENSION(3) :: cell_vector, cell_vector_j, rab_cell_i, &
2385 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
2389 CALL timeset(routinen, handle)
2391 IF (.NOT.
ASSOCIATED(cfm_ikp%local_data))
THEN
2397 nrow_local=nrow_local, &
2398 ncol_local=ncol_local, &
2399 row_indices=row_indices, &
2400 col_indices=col_indices)
2403 IF (basis_type ==
"ORB")
THEN
2404 n_bf = qs_env%bs_env%n_ao
2405 ELSE IF (basis_type ==
"RI_AUX")
THEN
2406 n_bf = qs_env%bs_env%n_RI
2408 cpabort(
"Only ORB and RI_AUX basis implemented.")
2411 ALLOCATE (atom_from_bf(n_bf))
2414 NULLIFY (cell, particle_set)
2415 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
2418 index_to_cell => kpoints%index_to_cell
2420 num_cells =
SIZE(index_to_cell, 2)
2424 DO j_col = 1, ncol_local
2425 DO i_row = 1, nrow_local
2427 row_global = row_indices(i_row)
2428 col_global = col_indices(j_col)
2430 i_atom = atom_from_bf(row_global)
2431 j_atom = atom_from_bf(col_global)
2434 IF (i_atom /= i_atom_old .OR. j_atom /= j_atom_old)
THEN
2435 DO i_cell = 1, num_cells
2438 IF (any(abs(index_to_cell(1:3, i_cell)) > 1)) cycle
2440 cell_vector(1:3) = matmul(hmat, real(index_to_cell(1:3, i_cell),
dp))
2442 rab_cell_i(1:3) =
pbc(particle_set(i_atom)%r(1:3), cell) - &
2443 (
pbc(particle_set(j_atom)%r(1:3), cell) + cell_vector(1:3))
2444 abs_rab_cell_i = sqrt(rab_cell_i(1)**2 + rab_cell_i(2)**2 + rab_cell_i(3)**2)
2447 i_cell_is_the_minimum_image_cell = .true.
2448 DO j_cell = 1, num_cells
2449 cell_vector_j(1:3) = matmul(hmat, real(index_to_cell(1:3, j_cell),
dp))
2450 rab_cell_j(1:3) =
pbc(particle_set(i_atom)%r(1:3), cell) - &
2451 (
pbc(particle_set(j_atom)%r(1:3), cell) + cell_vector_j(1:3))
2452 abs_rab_cell_j = sqrt(rab_cell_j(1)**2 + rab_cell_j(2)**2 + rab_cell_j(3)**2)
2454 IF (abs_rab_cell_i > abs_rab_cell_j + 1.0e-6_dp)
THEN
2455 i_cell_is_the_minimum_image_cell = .false.
2459 IF (i_cell_is_the_minimum_image_cell)
THEN
2466 arg = real(index_to_cell(1, i_mic_cell),
dp)*kpoints%xkp(1, ikp) + &
2467 REAL(index_to_cell(2, i_mic_cell),
dp)*kpoints%xkp(2, ikp) + &
2468 REAL(index_to_cell(3, i_mic_cell),
dp)*kpoints%xkp(3, ikp)
2470 cfm_ikp%local_data(i_row, j_col) = cos(
twopi*arg)*fm_gamma%local_data(i_row, j_col)*
z_one + &
2471 sin(
twopi*arg)*fm_gamma%local_data(i_row, j_col)*
gaussi
2479 CALL timestop(handle)
2495 cfm_W_ikp_freq_j, ikp, kpoints, basis_type, wkp_ext)
2500 INTEGER,
INTENT(IN) :: ikp
2502 CHARACTER(LEN=*) :: basis_type
2503 REAL(kind=
dp),
OPTIONAL :: wkp_ext
2505 CHARACTER(LEN=*),
PARAMETER :: routinen =
'MIC_contribution_from_ikp'
2507 INTEGER :: handle, i_bf, iatom, iatom_old, irow, &
2508 j_bf, jatom, jatom_old, jcol, n_bf, &
2509 ncol_local, nrow_local, num_cells
2510 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_from_bf_index
2511 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
2512 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
2513 REAL(kind=
dp) :: contribution, weight_im, weight_re, &
2515 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
2516 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp
2517 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
2521 CALL timeset(routinen, handle)
2524 IF (basis_type ==
"ORB")
THEN
2525 n_bf = qs_env%bs_env%n_ao
2526 ELSE IF (basis_type ==
"RI_AUX")
THEN
2527 n_bf = qs_env%bs_env%n_RI
2529 cpabort(
"Only ORB and RI_AUX basis implemented.")
2532 ALLOCATE (atom_from_bf_index(n_bf))
2535 NULLIFY (cell, particle_set)
2536 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
2540 nrow_local=nrow_local, &
2541 ncol_local=ncol_local, &
2542 row_indices=row_indices, &
2543 col_indices=col_indices)
2546 index_to_cell => kpoints%index_to_cell
2547 num_cells =
SIZE(index_to_cell, 2)
2552 DO jcol = 1, ncol_local
2553 DO irow = 1, nrow_local
2555 i_bf = row_indices(irow)
2556 j_bf = col_indices(jcol)
2558 iatom = atom_from_bf_index(i_bf)
2559 jatom = atom_from_bf_index(j_bf)
2561 IF (
PRESENT(wkp_ext))
THEN
2562 wkp_of_ikp = wkp_ext
2564 SELECT CASE (bs_env%l_RI(i_bf) + bs_env%l_RI(j_bf))
2567 wkp_of_ikp = wkp(ikp)
2570 wkp_of_ikp = bs_env%wkp_s_p(ikp)
2573 wkp_of_ikp = bs_env%wkp_no_extra(ikp)
2577 IF (iatom /= iatom_old .OR. jatom /= jatom_old)
THEN
2580 num_cells, iatom, jatom, xkp(1:3, ikp), wkp_of_ikp, &
2581 cell, index_to_cell, hmat, particle_set)
2588 contribution = weight_re*real(cfm_w_ikp_freq_j%local_data(irow, jcol)) + &
2589 weight_im*aimag(cfm_w_ikp_freq_j%local_data(irow, jcol))
2591 fm_w_mic_freq_j%local_data(irow, jcol) = fm_w_mic_freq_j%local_data(irow, jcol) &
2597 CALL timestop(handle)
2610 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
2611 INTEGER :: ikp_start, ikp_end
2612 INTEGER,
DIMENSION(3) :: grid
2614 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
2616 INTEGER :: handle, i, ix, iy, iz
2618 CALL timeset(routinen, handle)
2625 IF (i > ikp_end) cycle
2627 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
2628 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
2629 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
2636 CALL timestop(handle)
2650 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_init_cell_index_simple'
2652 INTEGER :: handle, nimages
2657 CALL timeset(routinen, handle)
2659 NULLIFY (para_env, sab_orb)
2660 CALL get_qs_env(qs_env=qs_env, para_env=para_env, sab_orb=sab_orb)
2663 CALL timestop(handle)
2672 SUBROUTINE soc(qs_env, bs_env)
2676 CHARACTER(LEN=*),
PARAMETER :: routinen =
'soc'
2680 CALL timeset(routinen, handle)
2688 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
2692 CALL h_ks_spinor_gamma(bs_env)
2697 CALL h_ks_spinor_kp(qs_env, bs_env)
2701 CALL timestop(handle)
2709 SUBROUTINE h_ks_spinor_gamma(bs_env)
2713 CHARACTER(LEN=*),
PARAMETER :: routinen =
'H_KS_spinor_Gamma'
2715 INTEGER :: handle, nao, s
2718 CALL timeset(routinen, handle)
2722 ALLOCATE (bs_env%cfm_SOC_spinor_ao(1))
2723 CALL create_cfm_double(bs_env%cfm_SOC_spinor_ao(1), fm_orig=bs_env%fm_ks_Gamma(1))
2726 str => bs_env%fm_ks_Gamma(1)%matrix_struct
2732 CALL add_dbcsr_submat(bs_env%cfm_SOC_spinor_ao(1), bs_env%mat_V_SOC_xyz(1, 1)%matrix, &
2733 str, s, 1,
z_one, .true.)
2734 CALL add_dbcsr_submat(bs_env%cfm_SOC_spinor_ao(1), bs_env%mat_V_SOC_xyz(2, 1)%matrix, &
2735 str, s, 1,
gaussi, .true.)
2736 CALL add_dbcsr_submat(bs_env%cfm_SOC_spinor_ao(1), bs_env%mat_V_SOC_xyz(3, 1)%matrix, &
2737 str, 1, 1,
z_one, .false.)
2738 CALL add_dbcsr_submat(bs_env%cfm_SOC_spinor_ao(1), bs_env%mat_V_SOC_xyz(3, 1)%matrix, &
2739 str, s, s, -
z_one, .false.)
2741 CALL timestop(handle)
2743 END SUBROUTINE h_ks_spinor_gamma
2750 SUBROUTINE h_ks_spinor_kp(qs_env, bs_env)
2754 CHARACTER(LEN=*),
PARAMETER :: routinen =
'H_KS_spinor_kp'
2756 INTEGER :: handle, i_dim, ikp, n_spin, &
2758 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2759 REAL(kind=
dp),
DIMENSION(3) :: xkp
2766 CALL timeset(routinen, handle)
2768 nkp_bs_and_dos = bs_env%nkp_bs_and_DOS
2769 n_spin = bs_env%n_spin
2771 str => bs_env%cfm_ks_kp(1, 1)%matrix_struct
2773 CALL cp_cfm_create(cfm_v_soc_xyz_ikp, bs_env%cfm_work_mo%matrix_struct)
2775 CALL alloc_cfm_double_array_1d(bs_env%cfm_SOC_spinor_ao, bs_env%cfm_ks_kp(1, 1), nkp_bs_and_dos)
2780 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2784 DO ikp = 1, nkp_bs_and_dos
2786 xkp(1:3) = bs_env%kpoints_DOS%xkp(1:3, ikp)
2790 CALL rsmat_to_kp(bs_env%mat_V_SOC_xyz, i_dim, xkp, cell_to_index_scf, &
2791 sab_nl, bs_env, cfm_v_soc_xyz_ikp, imag_rs_mat=.true.)
2799 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, 1, s)
2800 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, s, 1)
2804 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, 1, s)
2806 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, s, 1)
2809 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, 1, 1)
2811 CALL add_cfm_submat(bs_env%cfm_SOC_spinor_ao(ikp), cfm_v_soc_xyz_ikp, s, s)
2820 CALL timestop(handle)
2822 END SUBROUTINE h_ks_spinor_kp
2830 SUBROUTINE alloc_cfm_double_array_1d(cfm_array, cfm_template, n)
2831 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: cfm_array
2835 CHARACTER(LEN=*),
PARAMETER :: routinen =
'alloc_cfm_double_array_1d'
2837 INTEGER :: handle, i
2839 CALL timeset(routinen, handle)
2841 ALLOCATE (cfm_array(n))
2847 CALL timestop(handle)
2849 END SUBROUTINE alloc_cfm_double_array_1d
2859 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_all_VBM_CBM_bandgaps'
2863 CALL timeset(routinen, handle)
2869 CALL timestop(handle)
2881 REAL(kind=
dp),
DIMENSION(:, :, :) :: ev
2884 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_VBM_CBM_bandgaps'
2886 INTEGER :: handle, homo, homo_1, homo_2, ikp, &
2887 ispin, lumo, lumo_1, lumo_2, n_mo
2888 REAL(kind=
dp) :: e_dbg_at_ikp
2890 CALL timeset(routinen, handle)
2894 band_edges%DBG = 1000.0_dp
2896 SELECT CASE (bs_env%n_spin)
2898 homo = bs_env%n_occ(1)
2900 band_edges%VBM = maxval(ev(1:homo, :, 1))
2901 band_edges%CBM = minval(ev(homo + 1:n_mo, :, 1))
2903 homo_1 = bs_env%n_occ(1)
2905 homo_2 = bs_env%n_occ(2)
2907 band_edges%VBM = max(maxval(ev(1:homo_1, :, 1)), maxval(ev(1:homo_2, :, 2)))
2908 band_edges%CBM = min(minval(ev(homo_1 + 1:n_mo, :, 1)), minval(ev(homo_2 + 1:n_mo, :, 2)))
2910 cpabort(
"Error with number of spins.")
2913 band_edges%IDBG = band_edges%CBM - band_edges%VBM
2915 DO ispin = 1, bs_env%n_spin
2917 homo = bs_env%n_occ(ispin)
2919 DO ikp = 1, bs_env%nkp_bs_and_DOS
2921 e_dbg_at_ikp = -maxval(ev(1:homo, ikp, ispin)) + minval(ev(homo + 1:n_mo, ikp, ispin))
2923 IF (e_dbg_at_ikp < band_edges%DBG) band_edges%DBG = e_dbg_at_ikp
2929 CALL timestop(handle)
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
static GRID_HOST_DEVICE int idx(const orbital a)
Return coset index of given orbital angular momentum.
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
methods related to the blacs parallel environment
Basic linear algebra operations for complex full matrices.
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
subroutine, public cp_cfm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical orthogonalization.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_set(matrix, alpha)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical diagonalization : U*s**(-1/2)
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Utility routines to read data from files. Kept as close as possible to the old parser because.
elemental subroutine, public read_float_object(string, object, error_message)
Returns a floating point number read from a string including fraction like z1/z2.
Defines the basic variable types.
integer, parameter, public max_line_length
integer, parameter, public dp
integer, parameter, public default_string_length
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, nimages)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
Types and basic routines needed for a kpoint calculation.
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 kpoint_create(kpoint)
Create a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
subroutine, public dos_pdos_ldos(qs_env, bs_env)
...
subroutine, public rsmat_to_kp(mat_rs, ispin, xkp, cell_to_index_scf, sab_nl, bs_env, cfm_kp, imag_rs_mat)
...
subroutine, public kpoint_init_cell_index_simple(kpoints, qs_env)
...
subroutine, public cfm_ikp_from_fm_gamma(cfm_ikp, fm_gamma, ikp, qs_env, kpoints, basis_type)
...
subroutine, public get_all_vbm_cbm_bandgaps(bs_env)
...
subroutine, public soc(qs_env, bs_env)
...
subroutine, public mic_contribution_from_ikp(bs_env, qs_env, fm_w_mic_freq_j, cfm_w_ikp_freq_j, ikp, kpoints, basis_type, wkp_ext)
...
subroutine, public compute_xkp(xkp, ikp_start, ikp_end, grid)
...
subroutine, public create_and_init_bs_env(qs_env, bs_env, post_scf_bandstructure_section)
...
subroutine, public get_vbm_cbm_bandgaps(band_edges, ev, bs_env)
...
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Utility routines for GW with imaginary time.
subroutine, public compute_weight_re_im(weight_re, weight_im, num_cells, iatom, jatom, xkp, wkp_w, cell, index_to_cell, hmat, particle_set)
...
subroutine, public get_atom_index_from_basis_function_index(qs_env, atom_from_basis_index, basis_size, basis_type, first_bf_from_atom)
...
parameters that control an scf iteration
subroutine, public v_soc_xyz_from_pseudopotential(qs_env, mat_v_soc_xyz)
V^SOC_µν^(α),R = ħ/2 < ϕ_µ cell O | sum_ℓ ΔV_ℓ^SO(r,r') L^(α) | ϕ_ν cell R>, α = x,...
subroutine, public remove_soc_outside_energy_window_mo(cfm_ks_spinor, e_win, eigenval, e_homo, e_lumo)
...
subroutine, public create_cfm_double(cfm_double, fm_orig, cfm_orig)
...
subroutine, public add_dbcsr_submat(cfm_mat_target, mat_source, fm_struct_source, nstart_row, nstart_col, factor, add_also_herm_conj)
...
subroutine, public add_cfm_submat(cfm_mat_target, cfm_mat_source, nstart_row, nstart_col, factor)
...
subroutine, public get_cfm_submat(cfm_mat_target, cfm_mat_source, nstart_row, nstart_col)
...
subroutine, public cfm_add_on_diag(cfm, alpha)
...
Provides all information about an atomic kind.
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.
keeps the information about the structure of a full matrix
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...