55 dbt_clear, dbt_create, dbt_destroy, dbt_filter, dbt_iterator_blocks_left, &
56 dbt_iterator_next_block, dbt_iterator_start, dbt_iterator_stop, dbt_iterator_type, &
57 dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_type
131#include "base/base_uses.f90"
141 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_utils'
156 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env_for_gw'
160 CALL timeset(routinen, handle)
164 CALL read_gw_input_parameters(bs_env, bs_sec)
166 CALL print_header_and_input_parameters(bs_env)
168 CALL setup_ao_and_ri_basis_set(qs_env, bs_env)
170 CALL get_ri_basis_and_basis_function_indices(qs_env, bs_env)
172 CALL set_heuristic_parameters(bs_env, qs_env)
176 CALL setup_kpoints_chi_eps_w(bs_env, bs_env%kpoints_chi_eps_W)
179 CALL setup_cells_3c(qs_env, bs_env)
182 CALL set_parallelization_parameters(qs_env, bs_env)
184 CALL allocate_matrices(qs_env, bs_env)
186 CALL compute_v_xc(qs_env, bs_env)
188 CALL create_tensors(qs_env, bs_env)
190 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
193 CALL allocate_gw_eigenvalues(bs_env)
195 CALL check_sparsity_3c(qs_env, bs_env)
197 CALL set_sparsity_parallelization_parameters(bs_env)
199 CALL check_for_restart_files(qs_env, bs_env)
203 CALL compute_3c_integrals(qs_env, bs_env)
205 CALL setup_cells_delta_r(bs_env)
207 CALL setup_parallelization_delta_r(bs_env)
209 CALL allocate_matrices_small_cell_full_kp(qs_env, bs_env)
211 CALL trafo_v_xc_r_to_kp(qs_env, bs_env)
213 CALL heuristic_ri_regularization(qs_env, bs_env)
217 CALL setup_time_and_frequency_minimax_grid(bs_env)
225 IF (.NOT. bs_env%do_ldos .AND. .false.)
THEN
229 CALL timestop(handle)
240 CHARACTER(LEN=*),
PARAMETER :: routinen =
'de_init_bs_env'
244 CALL timeset(routinen, handle)
250 IF (
ASSOCIATED(bs_env%nl_3c%ij_list) .AND. (bs_env%rtp_method ==
rtp_method_bse))
THEN
251 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr, *)
"Retaining nl_3c for RTBSE"
258 CALL timestop(handle)
267 SUBROUTINE read_gw_input_parameters(bs_env, bs_sec)
271 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_gw_input_parameters'
276 CALL timeset(routinen, handle)
292 CALL timestop(handle)
294 END SUBROUTINE read_gw_input_parameters
301 SUBROUTINE setup_ao_and_ri_basis_set(qs_env, bs_env)
305 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_AO_and_RI_basis_set'
307 INTEGER :: handle, natom, nkind
309 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
311 CALL timeset(routinen, handle)
314 qs_kind_set=qs_kind_set, &
315 particle_set=particle_set, &
316 natom=natom, nkind=nkind)
319 ALLOCATE (bs_env%sizes_RI(natom), bs_env%sizes_AO(natom))
320 ALLOCATE (bs_env%basis_set_RI(nkind), bs_env%basis_set_AO(nkind))
326 basis=bs_env%basis_set_RI)
328 basis=bs_env%basis_set_AO)
330 CALL timestop(handle)
332 END SUBROUTINE setup_ao_and_ri_basis_set
339 SUBROUTINE get_ri_basis_and_basis_function_indices(qs_env, bs_env)
343 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_RI_basis_and_basis_function_indices'
345 INTEGER :: handle, i_ri, iatom, ikind, iset, &
346 max_ao_bf_per_atom, n_ao_test, n_atom, &
347 n_kind, n_ri, nset, nsgf, u
348 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
349 INTEGER,
DIMENSION(:),
POINTER :: l_max, l_min, nsgf_set
352 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
354 CALL timeset(routinen, handle)
357 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
359 n_kind =
SIZE(qs_kind_set)
360 n_atom = bs_env%n_atom
365 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
367 IF (.NOT.
ASSOCIATED(basis_set_a))
THEN
368 CALL cp_abort(__location__, &
369 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section.")
373 ALLOCATE (bs_env%i_RI_start_from_atom(n_atom))
374 ALLOCATE (bs_env%i_RI_end_from_atom(n_atom))
375 ALLOCATE (bs_env%i_ao_start_from_atom(n_atom))
376 ALLOCATE (bs_env%i_ao_end_from_atom(n_atom))
380 bs_env%i_RI_start_from_atom(iatom) = n_ri + 1
381 ikind = kind_of(iatom)
382 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
384 bs_env%i_RI_end_from_atom(iatom) = n_ri
388 max_ao_bf_per_atom = 0
391 bs_env%i_ao_start_from_atom(iatom) = n_ao_test + 1
392 ikind = kind_of(iatom)
393 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"ORB")
394 n_ao_test = n_ao_test + nsgf
395 bs_env%i_ao_end_from_atom(iatom) = n_ao_test
396 max_ao_bf_per_atom = max(max_ao_bf_per_atom, nsgf)
398 cpassert(n_ao_test == bs_env%n_ao)
399 bs_env%max_AO_bf_per_atom = max_ao_bf_per_atom
401 ALLOCATE (bs_env%l_RI(n_ri))
404 ikind = kind_of(iatom)
406 nset = bs_env%basis_set_RI(ikind)%gto_basis_set%nset
407 l_max => bs_env%basis_set_RI(ikind)%gto_basis_set%lmax
408 l_min => bs_env%basis_set_RI(ikind)%gto_basis_set%lmin
409 nsgf_set => bs_env%basis_set_RI(ikind)%gto_basis_set%nsgf_set
412 cpassert(l_max(iset) == l_min(iset))
413 bs_env%l_RI(i_ri + 1:i_ri + nsgf_set(iset)) = l_max(iset)
414 i_ri = i_ri + nsgf_set(iset)
418 cpassert(i_ri == n_ri)
423 WRITE (u, fmt=
"(T2,A)")
" "
424 WRITE (u, fmt=
"(T2,2A,T75,I8)")
"Number of auxiliary Gaussian basis functions ", &
428 CALL timestop(handle)
430 END SUBROUTINE get_ri_basis_and_basis_function_indices
437 SUBROUTINE setup_kpoints_chi_eps_w(bs_env, kpoints)
442 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_chi_eps_W'
444 INTEGER :: handle, i_dim, n_dim, nkp, nkp_extra, &
446 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
447 REAL(kind=
dp) :: exp_s_p, n_dim_inv
449 CALL timeset(routinen, handle)
455 kpoints%kp_scheme =
"GENERAL"
457 periodic(1:3) = bs_env%periodic(1:3)
459 cpassert(
SIZE(bs_env%nkp_grid_chi_eps_W_input) == 3)
461 IF (bs_env%nkp_grid_chi_eps_W_input(1) > 0 .AND. &
462 bs_env%nkp_grid_chi_eps_W_input(2) > 0 .AND. &
463 bs_env%nkp_grid_chi_eps_W_input(3) > 0)
THEN
466 SELECT CASE (periodic(i_dim))
469 nkp_grid_extra(i_dim) = 1
471 nkp_grid(i_dim) = bs_env%nkp_grid_chi_eps_W_input(i_dim)
472 nkp_grid_extra(i_dim) = nkp_grid(i_dim)*2
474 cpabort(
"Error in periodicity.")
478 ELSE IF (bs_env%nkp_grid_chi_eps_W_input(1) == -1 .AND. &
479 bs_env%nkp_grid_chi_eps_W_input(2) == -1 .AND. &
480 bs_env%nkp_grid_chi_eps_W_input(3) == -1)
THEN
485 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
487 SELECT CASE (periodic(i_dim))
490 nkp_grid_extra(i_dim) = 1
492 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
495 nkp_grid_extra(i_dim) = 6
497 nkp_grid(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*4
498 nkp_grid_extra(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*8
501 cpabort(
"Error in periodicity.")
508 cpabort(
"An error occured when setting up the k-mesh for W.")
512 nkp_orig = max(nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2, 1)
514 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
516 nkp = nkp_orig + nkp_extra
518 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
521 bs_env%nkp_grid_chi_eps_W_orig(1:3) = nkp_grid(1:3)
522 bs_env%nkp_grid_chi_eps_W_extra(1:3) = nkp_grid_extra(1:3)
523 bs_env%nkp_chi_eps_W_orig = nkp_orig
524 bs_env%nkp_chi_eps_W_extra = nkp_extra
525 bs_env%nkp_chi_eps_W_orig_plus_extra = nkp
527 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
528 ALLOCATE (bs_env%wkp_no_extra(nkp), bs_env%wkp_s_p(nkp))
530 CALL compute_xkp(kpoints%xkp, 1, nkp_orig, nkp_grid)
531 CALL compute_xkp(kpoints%xkp, nkp_orig + 1, nkp, nkp_grid_extra)
533 n_dim = sum(periodic)
536 kpoints%wkp(1) = 1.0_dp
537 bs_env%wkp_s_p(1) = 1.0_dp
538 bs_env%wkp_no_extra(1) = 1.0_dp
541 n_dim_inv = 1.0_dp/real(n_dim, kind=
dp)
544 CALL compute_wkp(kpoints%wkp(1:nkp_orig), nkp_orig, nkp_extra, n_dim_inv)
545 CALL compute_wkp(kpoints%wkp(nkp_orig + 1:nkp), nkp_extra, nkp_orig, n_dim_inv)
547 bs_env%wkp_no_extra(1:nkp_orig) = 0.0_dp
548 bs_env%wkp_no_extra(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=
dp)
553 exp_s_p = 2.0_dp*n_dim_inv
554 CALL compute_wkp(bs_env%wkp_s_p(1:nkp_orig), nkp_orig, nkp_extra, exp_s_p)
555 CALL compute_wkp(bs_env%wkp_s_p(nkp_orig + 1:nkp), nkp_extra, nkp_orig, exp_s_p)
557 bs_env%wkp_s_p(1:nkp) = bs_env%wkp_no_extra(1:nkp)
562 IF (bs_env%approx_kp_extrapol)
THEN
563 bs_env%wkp_orig = 1.0_dp/real(nkp_orig, kind=
dp)
569 bs_env%nkp_chi_eps_W_batch = 4
571 bs_env%num_chi_eps_W_batches = (bs_env%nkp_chi_eps_W_orig_plus_extra - 1)/ &
572 bs_env%nkp_chi_eps_W_batch + 1
577 WRITE (u, fmt=
"(T2,A)")
" "
578 WRITE (u, fmt=
"(T2,1A,T71,3I4)") χε
"K-point mesh 1 for , , W", nkp_grid(1:3)
579 WRITE (u, fmt=
"(T2,2A,T71,3I4)") χε
"K-point mesh 2 for , , W ", &
580 "(for k-point extrapolation of W)", nkp_grid_extra(1:3)
581 WRITE (u, fmt=
"(T2,A,T80,L)")
"Approximate the k-point extrapolation", &
582 bs_env%approx_kp_extrapol
585 CALL timestop(handle)
587 END SUBROUTINE setup_kpoints_chi_eps_w
599 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_init_cell_index_simple'
607 CALL timeset(routinen, handle)
609 NULLIFY (dft_control, para_env, sab_orb)
610 CALL get_qs_env(qs_env=qs_env, para_env=para_env, dft_control=dft_control, sab_orb=sab_orb)
613 CALL timestop(handle)
626 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
627 INTEGER :: ikp_start, ikp_end
628 INTEGER,
DIMENSION(3) :: grid
630 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
632 INTEGER :: handle, i, ix, iy, iz
634 CALL timeset(routinen, handle)
641 IF (i > ikp_end) cycle
643 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
644 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
645 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
652 CALL timestop(handle)
663 SUBROUTINE compute_wkp(wkp, nkp_1, nkp_2, exponent)
664 REAL(kind=
dp),
DIMENSION(:) :: wkp
665 INTEGER :: nkp_1, nkp_2
666 REAL(kind=
dp) :: exponent
668 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp'
671 REAL(kind=
dp) :: nkp_ratio
673 CALL timeset(routinen, handle)
675 nkp_ratio = real(nkp_2, kind=
dp)/real(nkp_1, kind=
dp)
677 wkp(:) = 1.0_dp/real(nkp_1, kind=
dp)/(1.0_dp - nkp_ratio**exponent)
679 CALL timestop(handle)
681 END SUBROUTINE compute_wkp
688 SUBROUTINE allocate_matrices(qs_env, bs_env)
692 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices'
694 INTEGER :: handle, i_t
699 CALL timeset(routinen, handle)
701 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
703 fm_struct => bs_env%fm_ks_Gamma(1)%matrix_struct
708 NULLIFY (fm_struct_ri_global)
709 CALL cp_fm_struct_create(fm_struct_ri_global, context=blacs_env, nrow_global=bs_env%n_RI, &
710 ncol_global=bs_env%n_RI, para_env=para_env)
712 CALL cp_fm_create(bs_env%fm_chi_Gamma_freq, fm_struct_ri_global)
713 CALL cp_fm_create(bs_env%fm_W_MIC_freq, fm_struct_ri_global)
714 IF (bs_env%approx_kp_extrapol)
THEN
715 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_extra, fm_struct_ri_global)
716 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_no_extra, fm_struct_ri_global)
723 NULLIFY (blacs_env_tensor)
730 CALL create_mat_munu(bs_env%mat_ao_ao_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
731 blacs_env_tensor, do_ri_aux_basis=.false.)
733 CALL create_mat_munu(bs_env%mat_RI_RI_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
734 blacs_env_tensor, do_ri_aux_basis=.true.)
736 CALL create_mat_munu(bs_env%mat_RI_RI, qs_env, bs_env%eps_atom_grid_2d_mat, &
737 blacs_env, do_ri_aux_basis=.true.)
741 NULLIFY (bs_env%mat_chi_Gamma_tau)
744 DO i_t = 1, bs_env%num_time_freq_points
745 ALLOCATE (bs_env%mat_chi_Gamma_tau(i_t)%matrix)
746 CALL dbcsr_create(bs_env%mat_chi_Gamma_tau(i_t)%matrix, template=bs_env%mat_RI_RI%matrix)
749 CALL timestop(handle)
751 END SUBROUTINE allocate_matrices
757 SUBROUTINE allocate_gw_eigenvalues(bs_env)
760 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_GW_eigenvalues'
764 CALL timeset(routinen, handle)
766 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
767 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
769 CALL timestop(handle)
771 END SUBROUTINE allocate_gw_eigenvalues
778 SUBROUTINE create_tensors(qs_env, bs_env)
782 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors'
786 CALL timeset(routinen, handle)
788 CALL init_interaction_radii(bs_env)
792 CALL create_3c_t(bs_env%t_RI_AO__AO, bs_env%para_env_tensor,
"(RI AO | AO)", [1, 2], [3], &
793 bs_env%sizes_RI, bs_env%sizes_AO, &
794 create_nl_3c=.true., nl_3c=bs_env%nl_3c, qs_env=qs_env)
795 CALL create_3c_t(bs_env%t_RI__AO_AO, bs_env%para_env_tensor,
"(RI | AO AO)", [1], [2, 3], &
796 bs_env%sizes_RI, bs_env%sizes_AO)
798 CALL create_2c_t(bs_env, bs_env%sizes_RI, bs_env%sizes_AO)
800 CALL timestop(handle)
802 END SUBROUTINE create_tensors
809 SUBROUTINE check_sparsity_3c(qs_env, bs_env)
813 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_sparsity_3c'
815 INTEGER :: handle, n_atom_step, ri_atom
816 INTEGER(int_8) :: mem, non_zero_elements_sum, nze
817 REAL(
dp) :: max_dist_ao_atoms, occ, occupation_sum
818 REAL(kind=
dp) :: t1, t2
819 TYPE(dbt_type) :: t_3c_global
820 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_global_array
823 CALL timeset(routinen, handle)
827 CALL create_3c_t(t_3c_global, bs_env%para_env,
"(RI AO | AO)", [1, 2], [3], &
828 bs_env%sizes_RI, bs_env%sizes_AO, &
829 create_nl_3c=.true., nl_3c=nl_3c_global, qs_env=qs_env)
832 CALL bs_env%para_env%max(mem)
834 ALLOCATE (t_3c_global_array(1, 1))
835 CALL dbt_create(t_3c_global, t_3c_global_array(1, 1))
837 CALL bs_env%para_env%sync()
840 occupation_sum = 0.0_dp
841 non_zero_elements_sum = 0
842 max_dist_ao_atoms = 0.0_dp
843 n_atom_step = int(sqrt(real(bs_env%n_atom, kind=
dp)))
845 DO ri_atom = 1, bs_env%n_atom, n_atom_step
851 int_eps=bs_env%eps_filter, &
852 basis_i=bs_env%basis_set_RI, &
853 basis_j=bs_env%basis_set_AO, &
854 basis_k=bs_env%basis_set_AO, &
855 bounds_i=[ri_atom, min(ri_atom + n_atom_step - 1, bs_env%n_atom)], &
856 potential_parameter=bs_env%ri_metric, &
857 desymmetrize=.false.)
859 CALL dbt_filter(t_3c_global_array(1, 1), bs_env%eps_filter)
861 CALL bs_env%para_env%sync()
864 non_zero_elements_sum = non_zero_elements_sum + nze
865 occupation_sum = occupation_sum + occ
867 CALL get_max_dist_ao_atoms(t_3c_global_array(1, 1), max_dist_ao_atoms, qs_env)
869 CALL dbt_clear(t_3c_global_array(1, 1))
875 bs_env%occupation_3c_int = occupation_sum
876 bs_env%max_dist_AO_atoms = max_dist_ao_atoms
878 CALL dbt_destroy(t_3c_global)
879 CALL dbt_destroy(t_3c_global_array(1, 1))
880 DEALLOCATE (t_3c_global_array)
884 IF (bs_env%unit_nr > 0)
THEN
885 WRITE (bs_env%unit_nr,
'(T2,A)')
''
886 WRITE (bs_env%unit_nr,
'(T2,A,F27.1,A)') &
887 µν
'Computed 3-center integrals (|P), execution time', t2 - t1,
' s'
888 WRITE (bs_env%unit_nr,
'(T2,A,F48.3,A)') µν
'Percentage of non-zero (|P)', &
889 occupation_sum*100,
' %'
890 WRITE (bs_env%unit_nr,
'(T2,A,F33.1,A)') µνµν
'Max. distance between , in non-zero (|P)', &
892 WRITE (bs_env%unit_nr,
'(T2,2A,I20,A)')
'Required memory if storing all 3-center ', &
893 µν
'integrals (|P)', int(real(non_zero_elements_sum, kind=
dp)*8.0e-9_dp),
' GB'
896 CALL timestop(handle)
898 END SUBROUTINE check_sparsity_3c
906 SUBROUTINE create_2c_t(bs_env, sizes_RI, sizes_AO)
908 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
910 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_2c_t'
913 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_1, dist_2
914 INTEGER,
DIMENSION(2) :: pdims_2d
915 TYPE(dbt_pgrid_type) :: pgrid_2d
917 CALL timeset(routinen, handle)
922 CALL dbt_pgrid_create(bs_env%para_env_tensor, pdims_2d, pgrid_2d)
924 CALL create_2c_tensor(bs_env%t_G, dist_1, dist_2, pgrid_2d, sizes_ao, sizes_ao, &
926 DEALLOCATE (dist_1, dist_2)
927 CALL create_2c_tensor(bs_env%t_chi, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
929 DEALLOCATE (dist_1, dist_2)
930 CALL create_2c_tensor(bs_env%t_W, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
932 DEALLOCATE (dist_1, dist_2)
933 CALL dbt_pgrid_destroy(pgrid_2d)
935 CALL timestop(handle)
937 END SUBROUTINE create_2c_t
952 SUBROUTINE create_3c_t(tensor, para_env, tensor_name, map1, map2, sizes_RI, sizes_AO, &
953 create_nl_3c, nl_3c, qs_env)
956 CHARACTER(LEN=12) :: tensor_name
957 INTEGER,
DIMENSION(:) :: map1, map2
958 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
959 LOGICAL,
OPTIONAL :: create_nl_3c
963 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_3c_t'
965 INTEGER :: handle, nkind
966 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri
967 INTEGER,
DIMENSION(3) :: pcoord, pdims, pdims_3d
968 LOGICAL :: my_create_nl_3c
969 TYPE(dbt_pgrid_type) :: pgrid_3d
974 CALL timeset(routinen, handle)
977 CALL dbt_pgrid_create(para_env, pdims_3d, pgrid_3d)
979 pgrid_3d, sizes_ri, sizes_ao, sizes_ao, &
980 map1=map1, map2=map2, name=tensor_name)
982 IF (
PRESENT(create_nl_3c))
THEN
983 my_create_nl_3c = create_nl_3c
985 my_create_nl_3c = .false.
988 IF (my_create_nl_3c)
THEN
989 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
990 CALL dbt_mp_environ_pgrid(pgrid_3d, pdims, pcoord)
991 CALL mp_comm_t3c_2%create(pgrid_3d%mp_comm_2d, 3, pdims)
993 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
996 qs_env%bs_env%basis_set_RI, &
997 qs_env%bs_env%basis_set_AO, &
998 qs_env%bs_env%basis_set_AO, &
999 dist_3d, qs_env%bs_env%ri_metric, &
1000 "GW_3c_nl", qs_env, own_dist=.true.)
1003 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
1004 CALL dbt_pgrid_destroy(pgrid_3d)
1006 CALL timestop(handle)
1008 END SUBROUTINE create_3c_t
1014 SUBROUTINE init_interaction_radii(bs_env)
1017 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_interaction_radii'
1019 INTEGER :: handle, ibasis
1022 CALL timeset(routinen, handle)
1024 DO ibasis = 1,
SIZE(bs_env%basis_set_AO)
1026 orb_basis => bs_env%basis_set_AO(ibasis)%gto_basis_set
1029 ri_basis => bs_env%basis_set_RI(ibasis)%gto_basis_set
1034 CALL timestop(handle)
1036 END SUBROUTINE init_interaction_radii
1044 SUBROUTINE get_max_dist_ao_atoms(t_3c_int, max_dist_AO_atoms, qs_env)
1045 TYPE(dbt_type) :: t_3c_int
1046 REAL(kind=
dp) :: max_dist_ao_atoms
1049 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_max_dist_AO_atoms'
1051 INTEGER :: atom_1, atom_2, handle, num_cells
1052 INTEGER,
DIMENSION(3) :: atom_ind
1053 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1054 REAL(kind=
dp) :: abs_rab
1055 REAL(kind=
dp),
DIMENSION(3) :: rab
1057 TYPE(dbt_iterator_type) :: iter
1061 CALL timeset(routinen, handle)
1063 NULLIFY (cell, particle_set, para_env)
1064 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, para_env=para_env)
1069 CALL dbt_iterator_start(iter, t_3c_int)
1070 DO WHILE (dbt_iterator_blocks_left(iter))
1071 CALL dbt_iterator_next_block(iter, atom_ind)
1073 atom_1 = atom_ind(2)
1074 atom_2 = atom_ind(3)
1076 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
1078 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
1080 max_dist_ao_atoms = max(max_dist_ao_atoms, abs_rab)
1083 CALL dbt_iterator_stop(iter)
1086 CALL para_env%max(max_dist_ao_atoms)
1088 CALL timestop(handle)
1090 END SUBROUTINE get_max_dist_ao_atoms
1096 SUBROUTINE set_sparsity_parallelization_parameters(bs_env)
1099 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_sparsity_parallelization_parameters'
1101 INTEGER :: handle, i_ivl, il_ivl, j_ivl, n_atom_per_il_ivl, n_atom_per_ivl, n_intervals_i, &
1102 n_intervals_inner_loop_atoms, n_intervals_j, u
1103 INTEGER(KIND=int_8) :: input_memory_per_proc
1105 CALL timeset(routinen, handle)
1108 bs_env%safety_factor_memory = 0.10_dp
1110 input_memory_per_proc = int(bs_env%input_memory_per_proc_GB*1.0e9_dp, kind=
int_8)
1116 n_atom_per_ivl = int(sqrt(bs_env%safety_factor_memory*input_memory_per_proc &
1117 *bs_env%group_size_tensor/24/bs_env%n_RI &
1118 /sqrt(bs_env%occupation_3c_int)))/bs_env%max_AO_bf_per_atom
1120 n_intervals_i = (bs_env%n_atom_i - 1)/n_atom_per_ivl + 1
1121 n_intervals_j = (bs_env%n_atom_j - 1)/n_atom_per_ivl + 1
1123 bs_env%n_atom_per_interval_ij = n_atom_per_ivl
1124 bs_env%n_intervals_i = n_intervals_i
1125 bs_env%n_intervals_j = n_intervals_j
1127 ALLOCATE (bs_env%i_atom_intervals(2, n_intervals_i))
1128 ALLOCATE (bs_env%j_atom_intervals(2, n_intervals_j))
1130 DO i_ivl = 1, n_intervals_i
1131 bs_env%i_atom_intervals(1, i_ivl) = (i_ivl - 1)*n_atom_per_ivl + bs_env%atoms_i(1)
1132 bs_env%i_atom_intervals(2, i_ivl) = min(i_ivl*n_atom_per_ivl + bs_env%atoms_i(1) - 1, &
1136 DO j_ivl = 1, n_intervals_j
1137 bs_env%j_atom_intervals(1, j_ivl) = (j_ivl - 1)*n_atom_per_ivl + bs_env%atoms_j(1)
1138 bs_env%j_atom_intervals(2, j_ivl) = min(j_ivl*n_atom_per_ivl + bs_env%atoms_j(1) - 1, &
1142 ALLOCATE (bs_env%skip_Sigma_occ(n_intervals_i, n_intervals_j))
1143 ALLOCATE (bs_env%skip_Sigma_vir(n_intervals_i, n_intervals_j))
1144 bs_env%skip_Sigma_occ(:, :) = .false.
1145 bs_env%skip_Sigma_vir(:, :) = .false.
1150 n_atom_per_il_ivl = min(int(bs_env%safety_factor_memory*input_memory_per_proc &
1151 *bs_env%group_size_tensor/n_atom_per_ivl &
1152 /bs_env%max_AO_bf_per_atom &
1153 /bs_env%n_RI/8/sqrt(bs_env%occupation_3c_int) &
1154 /bs_env%max_AO_bf_per_atom), bs_env%n_atom)
1156 n_intervals_inner_loop_atoms = (bs_env%n_atom - 1)/n_atom_per_il_ivl + 1
1158 bs_env%n_atom_per_IL_interval = n_atom_per_il_ivl
1159 bs_env%n_intervals_inner_loop_atoms = n_intervals_inner_loop_atoms
1161 ALLOCATE (bs_env%inner_loop_atom_intervals(2, n_intervals_inner_loop_atoms))
1162 DO il_ivl = 1, n_intervals_inner_loop_atoms
1163 bs_env%inner_loop_atom_intervals(1, il_ivl) = (il_ivl - 1)*n_atom_per_il_ivl + 1
1164 bs_env%inner_loop_atom_intervals(2, il_ivl) = min(il_ivl*n_atom_per_il_ivl, bs_env%n_atom)
1169 WRITE (u,
'(T2,A)')
''
1170 WRITE (u,
'(T2,A,I33)') λντνλτ
'Number of i and j atoms in M_P(), N_Q():', n_atom_per_ivl
1171 WRITE (u,
'(T2,A,I18)') µλνµµνµλ
'Number of inner loop atoms for in M_P = sum_ (|P) G_', &
1175 CALL timestop(handle)
1177 END SUBROUTINE set_sparsity_parallelization_parameters
1184 SUBROUTINE check_for_restart_files(qs_env, bs_env)
1188 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_for_restart_files'
1190 CHARACTER(LEN=9) :: frmt
1191 CHARACTER(LEN=default_string_length) :: f_chi, f_s_n, f_s_p, f_s_x, f_w_t, &
1192 prefix, project_name
1193 INTEGER :: handle, i_spin, i_t_or_w, ind, n_spin, &
1194 num_time_freq_points
1195 LOGICAL :: chi_exists, sigma_neg_time_exists, &
1196 sigma_pos_time_exists, &
1197 sigma_x_spin_exists, w_time_exists
1201 CALL timeset(routinen, handle)
1203 num_time_freq_points = bs_env%num_time_freq_points
1204 n_spin = bs_env%n_spin
1206 ALLOCATE (bs_env%read_chi(num_time_freq_points))
1207 ALLOCATE (bs_env%calc_chi(num_time_freq_points))
1208 ALLOCATE (bs_env%Sigma_c_exists(num_time_freq_points, n_spin))
1216 WRITE (prefix,
'(2A)') trim(project_name),
"-RESTART_"
1217 bs_env%prefix = prefix
1219 bs_env%all_W_exist = .true.
1221 DO i_t_or_w = 1, num_time_freq_points
1223 IF (i_t_or_w < 10)
THEN
1224 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1225 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_0", i_t_or_w,
".matrix"
1226 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_0", i_t_or_w,
".matrix"
1227 ELSE IF (i_t_or_w < 100)
THEN
1228 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1229 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_", i_t_or_w,
".matrix"
1230 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_", i_t_or_w,
".matrix"
1232 cpabort(
'Please implement more than 99 time/frequency points.')
1235 INQUIRE (file=trim(f_chi), exist=chi_exists)
1236 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1238 bs_env%read_chi(i_t_or_w) = chi_exists
1239 bs_env%calc_chi(i_t_or_w) = .NOT. chi_exists
1241 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1244 DO i_spin = 1, n_spin
1246 ind = i_t_or_w + (i_spin - 1)*num_time_freq_points
1249 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1250 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_0", ind,
".matrix"
1251 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_0", ind,
".matrix"
1252 ELSE IF (i_t_or_w < 100)
THEN
1253 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1254 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_", ind,
".matrix"
1255 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_", ind,
".matrix"
1258 INQUIRE (file=trim(f_s_p), exist=sigma_pos_time_exists)
1259 INQUIRE (file=trim(f_s_n), exist=sigma_neg_time_exists)
1261 bs_env%Sigma_c_exists(i_t_or_w, i_spin) = sigma_pos_time_exists .AND. &
1262 sigma_neg_time_exists
1270 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix),
"W_freq_rtp",
"_0", 0,
".matrix"
1271 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1272 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1275 IF (bs_env%all_W_exist)
THEN
1276 bs_env%read_chi(:) = .false.
1277 bs_env%calc_chi(:) = .false.
1280 bs_env%Sigma_x_exists = .true.
1281 DO i_spin = 1, n_spin
1282 WRITE (f_s_x,
'(3A,I1,A)') trim(prefix), bs_env%Sigma_x_name,
"_0", i_spin,
".matrix"
1283 INQUIRE (file=trim(f_s_x), exist=sigma_x_spin_exists)
1284 bs_env%Sigma_x_exists = bs_env%Sigma_x_exists .AND. sigma_x_spin_exists
1287 CALL timestop(handle)
1289 END SUBROUTINE check_for_restart_files
1296 SUBROUTINE set_parallelization_parameters(qs_env, bs_env)
1300 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_parallelization_parameters'
1302 INTEGER :: color_sub, dummy_1, dummy_2, handle, &
1303 num_pe, num_t_groups, u
1304 INTEGER(KIND=int_8) :: mem
1307 CALL timeset(routinen, handle)
1311 num_pe = para_env%num_pe
1314 IF (bs_env%group_size_tensor < 0 .OR. bs_env%group_size_tensor > num_pe) &
1315 bs_env%group_size_tensor = num_pe
1318 IF (
modulo(num_pe, bs_env%group_size_tensor) .NE. 0)
THEN
1319 CALL find_good_group_size(num_pe, bs_env%group_size_tensor)
1323 color_sub = para_env%mepos/bs_env%group_size_tensor
1324 bs_env%tensor_group_color = color_sub
1326 ALLOCATE (bs_env%para_env_tensor)
1327 CALL bs_env%para_env_tensor%from_split(para_env, color_sub)
1329 num_t_groups = para_env%num_pe/bs_env%group_size_tensor
1330 bs_env%num_tensor_groups = num_t_groups
1332 CALL get_i_j_atoms(bs_env%atoms_i, bs_env%atoms_j, bs_env%n_atom_i, bs_env%n_atom_j, &
1335 ALLOCATE (bs_env%atoms_i_t_group(2, num_t_groups))
1336 ALLOCATE (bs_env%atoms_j_t_group(2, num_t_groups))
1337 DO color_sub = 0, num_t_groups - 1
1338 CALL get_i_j_atoms(bs_env%atoms_i_t_group(1:2, color_sub + 1), &
1339 bs_env%atoms_j_t_group(1:2, color_sub + 1), &
1340 dummy_1, dummy_2, color_sub, bs_env)
1344 CALL bs_env%para_env%max(mem)
1348 WRITE (u,
'(T2,A,I47)')
'Group size for tensor operations', bs_env%group_size_tensor
1349 IF (bs_env%group_size_tensor > 1 .AND. bs_env%n_atom < 5)
THEN
1350 WRITE (u,
'(T2,A)')
'The requested group size is > 1 which can lead to bad performance.'
1351 WRITE (u,
'(T2,A)')
'Using more memory per MPI process might improve performance.'
1352 WRITE (u,
'(T2,A)')
'(Also increase MEMORY_PER_PROC when using more memory per process.)'
1356 CALL timestop(handle)
1358 END SUBROUTINE set_parallelization_parameters
1365 SUBROUTINE find_good_group_size(num_pe, group_size)
1367 INTEGER :: num_pe, group_size
1369 CHARACTER(LEN=*),
PARAMETER :: routinen =
'find_good_group_size'
1371 INTEGER :: group_size_minus, group_size_orig, &
1372 group_size_plus, handle, i_diff
1374 CALL timeset(routinen, handle)
1376 group_size_orig = group_size
1378 DO i_diff = 1, num_pe
1380 group_size_minus = group_size - i_diff
1382 IF (
modulo(num_pe, group_size_minus) == 0 .AND. group_size_minus > 0)
THEN
1383 group_size = group_size_minus
1387 group_size_plus = group_size + i_diff
1389 IF (
modulo(num_pe, group_size_plus) == 0 .AND. group_size_plus <= num_pe)
THEN
1390 group_size = group_size_plus
1396 IF (group_size_orig == group_size) cpabort(
"Group size error")
1398 CALL timestop(handle)
1400 END SUBROUTINE find_good_group_size
1411 SUBROUTINE get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
1413 INTEGER,
DIMENSION(2) :: atoms_i, atoms_j
1414 INTEGER :: n_atom_i, n_atom_j, color_sub
1417 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atoms'
1419 INTEGER :: handle, i_atoms_per_group, i_group, &
1420 ipcol, ipcol_loop, iprow, iprow_loop, &
1421 j_atoms_per_group, npcol, nprow
1423 CALL timeset(routinen, handle)
1426 CALL square_mesh(nprow, npcol, bs_env%num_tensor_groups)
1429 DO ipcol_loop = 0, npcol - 1
1430 DO iprow_loop = 0, nprow - 1
1431 IF (i_group == color_sub)
THEN
1435 i_group = i_group + 1
1439 IF (
modulo(bs_env%n_atom, nprow) == 0)
THEN
1440 i_atoms_per_group = bs_env%n_atom/nprow
1442 i_atoms_per_group = bs_env%n_atom/nprow + 1
1445 IF (
modulo(bs_env%n_atom, npcol) == 0)
THEN
1446 j_atoms_per_group = bs_env%n_atom/npcol
1448 j_atoms_per_group = bs_env%n_atom/npcol + 1
1451 atoms_i(1) = iprow*i_atoms_per_group + 1
1452 atoms_i(2) = min((iprow + 1)*i_atoms_per_group, bs_env%n_atom)
1453 n_atom_i = atoms_i(2) - atoms_i(1) + 1
1455 atoms_j(1) = ipcol*j_atoms_per_group + 1
1456 atoms_j(2) = min((ipcol + 1)*j_atoms_per_group, bs_env%n_atom)
1457 n_atom_j = atoms_j(2) - atoms_j(1) + 1
1459 CALL timestop(handle)
1469 SUBROUTINE square_mesh(nprow, npcol, nproc)
1470 INTEGER :: nprow, npcol, nproc
1472 CHARACTER(LEN=*),
PARAMETER :: routinen =
'square_mesh'
1474 INTEGER :: gcd_max, handle, ipe, jpe
1476 CALL timeset(routinen, handle)
1479 DO ipe = 1, ceiling(sqrt(real(nproc,
dp)))
1481 IF (ipe*jpe .NE. nproc) cycle
1482 IF (
gcd(ipe, jpe) >= gcd_max)
THEN
1485 gcd_max =
gcd(ipe, jpe)
1489 CALL timestop(handle)
1491 END SUBROUTINE square_mesh
1498 SUBROUTINE set_heuristic_parameters(bs_env, qs_env)
1502 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
1504 INTEGER :: handle, u
1505 LOGICAL :: do_bvk_cell
1507 CALL timeset(routinen, handle)
1510 bs_env%num_points_per_magnitude = 200
1515 IF (sum(bs_env%periodic) .NE. 0 .OR. bs_env%num_time_freq_points >= 20)
THEN
1516 bs_env%regularization_minimax = 1.0e-6_dp
1518 bs_env%regularization_minimax = 0.0_dp
1521 bs_env%stabilize_exp = 70.0_dp
1522 bs_env%eps_atom_grid_2d_mat = 1.0e-50_dp
1525 bs_env%nparam_pade = 16
1529 bs_env%ri_metric%omega = 0.0_dp
1531 bs_env%ri_metric%filename =
"t_c_g.dat"
1533 bs_env%eps_eigval_mat_RI = 0.0_dp
1535 IF (bs_env%input_regularization_RI > -1.0e-12_dp)
THEN
1536 bs_env%regularization_RI = bs_env%input_regularization_RI
1541 bs_env%regularization_RI = 1.0e-2_dp
1544 IF (sum(bs_env%periodic) == 0) bs_env%regularization_RI = 0.0_dp
1552 rel_cutoff_trunc_coulomb_ri_x=0.5_dp, &
1553 cell_grid=bs_env%cell_grid_scf_desymm, &
1554 do_bvk_cell=do_bvk_cell)
1558 bs_env%heuristic_filter_factor = 1.0e-4
1562 WRITE (u, fmt=
"(T2,2A,F21.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1563 Σ
"operator in ^x:", bs_env%trunc_coulomb%cutoff_radius*
angstrom, Å
" "
1564 WRITE (u, fmt=
"(T2,2A,F15.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1565 "operator in RI metric:", bs_env%ri_metric%cutoff_radius*
angstrom, Å
" "
1566 WRITE (u, fmt=
"(T2,A,ES48.1)")
"Regularization parameter of RI ", bs_env%regularization_RI
1567 WRITE (u, fmt=
"(T2,A,I53)")
"Lattice sum size for V(k):", bs_env%size_lattice_sum_V
1570 CALL timestop(handle)
1572 END SUBROUTINE set_heuristic_parameters
1578 SUBROUTINE print_header_and_input_parameters(bs_env)
1582 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header_and_input_parameters'
1584 INTEGER :: handle, u
1586 CALL timeset(routinen, handle)
1591 WRITE (u,
'(T2,A)')
' '
1592 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1593 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1594 WRITE (u,
'(T2,A,A46,A32)')
'-',
'GW CALCULATION',
'-'
1595 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1596 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1597 WRITE (u,
'(T2,A)')
' '
1598 WRITE (u,
'(T2,A,I45)')
'Input: Number of time/freq. points', bs_env%num_time_freq_points
1599 WRITE (u,
"(T2,A,F44.1,A)") ωΣω
'Input: _max for fitting (i) (eV)', bs_env%freq_max_fit*
evolt
1600 WRITE (u,
'(T2,A,ES27.1)')
'Input: Filter threshold for sparse tensor operations', &
1602 WRITE (u,
"(T2,A,L55)")
'Input: Apply Hedin shift', bs_env%do_hedin_shift
1605 CALL timestop(handle)
1607 END SUBROUTINE print_header_and_input_parameters
1614 SUBROUTINE compute_v_xc(qs_env, bs_env)
1618 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_xc'
1620 INTEGER :: handle, img, ispin, myfun, nimages
1621 LOGICAL :: hf_present
1622 REAL(kind=
dp) :: energy_ex, energy_exc, energy_total, &
1624 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_ks_without_v_xc
1625 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp
1630 CALL timeset(routinen, handle)
1632 CALL get_qs_env(qs_env, input=input, energy=energy, dft_control=dft_control)
1635 nimages = dft_control%nimages
1636 dft_control%nimages = bs_env%nimages_scf
1644 hf_present = .false.
1645 IF (
ASSOCIATED(hf_section))
THEN
1648 IF (hf_present)
THEN
1655 energy_total = energy%total
1656 energy_exc = energy%exc
1657 energy_ex = energy%ex
1659 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1662 NULLIFY (mat_ks_without_v_xc)
1665 DO ispin = 1, bs_env%n_spin
1666 ALLOCATE (mat_ks_without_v_xc(ispin)%matrix)
1667 IF (hf_present)
THEN
1668 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix, &
1669 matrix_type=dbcsr_type_symmetric)
1671 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1677 ext_ks_matrix=mat_ks_without_v_xc)
1679 DO ispin = 1, bs_env%n_spin
1681 CALL cp_fm_create(bs_env%fm_V_xc_Gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1682 CALL copy_dbcsr_to_fm(mat_ks_without_v_xc(ispin)%matrix, bs_env%fm_V_xc_Gamma(ispin))
1686 beta=1.0_dp, matrix_b=bs_env%fm_ks_Gamma(ispin))
1695 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks_kp)
1697 ALLOCATE (bs_env%fm_V_xc_R(dft_control%nimages, bs_env%n_spin))
1698 DO ispin = 1, bs_env%n_spin
1699 DO img = 1, dft_control%nimages
1701 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1702 CALL cp_fm_create(bs_env%fm_V_xc_R(img, ispin), bs_env%fm_work_mo(1)%matrix_struct)
1705 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1712 energy%total = energy_total
1713 energy%exc = energy_exc
1714 energy%ex = energy_ex
1717 dft_control%nimages = nimages
1722 IF (hf_present)
THEN
1730 DO ispin = 1, bs_env%n_spin
1731 DO img = 1, dft_control%nimages
1733 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1736 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1741 CALL timestop(handle)
1743 END SUBROUTINE compute_v_xc
1749 SUBROUTINE setup_time_and_frequency_minimax_grid(bs_env)
1752 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_time_and_frequency_minimax_grid'
1754 INTEGER :: handle, homo, i_w, ierr, ispin, j_w, &
1755 n_mo, num_time_freq_points, u
1756 REAL(kind=
dp) :: e_max, e_max_ispin, e_min, e_min_ispin, &
1757 e_range, max_error_min
1758 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: points_and_weights
1760 CALL timeset(routinen, handle)
1763 num_time_freq_points = bs_env%num_time_freq_points
1765 ALLOCATE (bs_env%imag_freq_points(num_time_freq_points))
1766 ALLOCATE (bs_env%imag_time_points(num_time_freq_points))
1767 ALLOCATE (bs_env%imag_time_weights_freq_zero(num_time_freq_points))
1768 ALLOCATE (bs_env%weights_cos_t_to_w(num_time_freq_points, num_time_freq_points))
1769 ALLOCATE (bs_env%weights_cos_w_to_t(num_time_freq_points, num_time_freq_points))
1770 ALLOCATE (bs_env%weights_sin_t_to_w(num_time_freq_points, num_time_freq_points))
1775 DO ispin = 1, bs_env%n_spin
1776 homo = bs_env%n_occ(ispin)
1777 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1779 e_min_ispin = bs_env%eigenval_scf_Gamma(homo + 1, ispin) - &
1780 bs_env%eigenval_scf_Gamma(homo, ispin)
1781 e_max_ispin = bs_env%eigenval_scf_Gamma(n_mo, ispin) - &
1782 bs_env%eigenval_scf_Gamma(1, ispin)
1784 e_min_ispin = minval(bs_env%eigenval_scf(homo + 1, :, ispin)) - &
1785 maxval(bs_env%eigenval_scf(homo, :, ispin))
1786 e_max_ispin = maxval(bs_env%eigenval_scf(n_mo, :, ispin)) - &
1787 minval(bs_env%eigenval_scf(1, :, ispin))
1789 e_min = min(e_min, e_min_ispin)
1790 e_max = max(e_max, e_max_ispin)
1793 e_range = e_max/e_min
1795 ALLOCATE (points_and_weights(2*num_time_freq_points))
1798 IF (num_time_freq_points .LE. 20)
THEN
1806 bs_env%imag_freq_points(:) = points_and_weights(1:num_time_freq_points)*e_min
1809 bs_env%num_freq_points_fit = 0
1810 DO i_w = 1, num_time_freq_points
1811 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1812 bs_env%num_freq_points_fit = bs_env%num_freq_points_fit + 1
1817 ALLOCATE (bs_env%imag_freq_points_fit(bs_env%num_freq_points_fit))
1819 DO i_w = 1, num_time_freq_points
1820 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1822 bs_env%imag_freq_points_fit(j_w) = bs_env%imag_freq_points(i_w)
1828 IF (bs_env%num_freq_points_fit < bs_env%nparam_pade)
THEN
1829 bs_env%nparam_pade = bs_env%num_freq_points_fit
1833 IF (num_time_freq_points .LE. 20)
THEN
1839 bs_env%imag_time_points(:) = points_and_weights(1:num_time_freq_points)/(2.0_dp*e_min)
1840 bs_env%imag_time_weights_freq_zero(:) = points_and_weights(num_time_freq_points + 1:)/(e_min)
1842 DEALLOCATE (points_and_weights)
1846 WRITE (u,
'(T2,A)')
''
1847 WRITE (u,
'(T2,A,F55.2)')
'SCF direct band gap (eV)', e_min*
evolt
1848 WRITE (u,
'(T2,A,F53.2)')
'Max. SCF eigval diff. (eV)', e_max*
evolt
1849 WRITE (u,
'(T2,A,F55.2)')
'E-Range for minimax grid', e_range
1850 WRITE (u,
'(T2,A,I27)') é
'Number of Pad parameters for analytic continuation:', &
1852 WRITE (u,
'(T2,A)')
''
1862 bs_env%imag_time_points, &
1863 bs_env%weights_cos_t_to_w, &
1864 bs_env%imag_freq_points, &
1865 e_min, e_max, max_error_min, &
1866 bs_env%num_points_per_magnitude, &
1867 bs_env%regularization_minimax)
1871 bs_env%imag_time_points, &
1872 bs_env%weights_cos_w_to_t, &
1873 bs_env%imag_freq_points, &
1874 e_min, e_max, max_error_min, &
1875 bs_env%num_points_per_magnitude, &
1876 bs_env%regularization_minimax)
1880 bs_env%imag_time_points, &
1881 bs_env%weights_sin_t_to_w, &
1882 bs_env%imag_freq_points, &
1883 e_min, e_max, max_error_min, &
1884 bs_env%num_points_per_magnitude, &
1885 bs_env%regularization_minimax)
1887 CALL timestop(handle)
1889 END SUBROUTINE setup_time_and_frequency_minimax_grid
1896 SUBROUTINE setup_cells_3c(qs_env, bs_env)
1901 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_3c'
1903 INTEGER :: atom_i, atom_j, atom_k, block_count, handle, i, i_cell_x, i_cell_x_max, &
1904 i_cell_x_min, i_size, ikind, img, j, j_cell, j_cell_max, j_cell_y, j_cell_y_max, &
1905 j_cell_y_min, j_size, k_cell, k_cell_max, k_cell_z, k_cell_z_max, k_cell_z_min, k_size, &
1906 nimage_pairs_3c, nimages_3c, nimages_3c_max, nkind, u
1907 INTEGER(KIND=int_8) :: mem_occ_per_proc
1908 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, n_other_3c_images_max
1909 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c_max, nblocks_3c_max
1910 INTEGER,
DIMENSION(3) :: cell_index, n_max
1911 REAL(kind=
dp) :: avail_mem_per_proc_gb, cell_dist, cell_radius_3c, dij, dik, djk, eps, &
1912 exp_min_ao, exp_min_ri, frobenius_norm, mem_3c_gb, mem_occ_per_proc_gb, radius_ao, &
1913 radius_ao_product, radius_ri
1914 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exp_ao_kind, exp_ri_kind, &
1916 radius_ao_product_kind, radius_ri_kind
1917 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: int_3c
1918 REAL(kind=
dp),
DIMENSION(3) :: rij, rik, rjk, vec_cell_j, vec_cell_k
1919 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: exp_ao, exp_ri
1924 CALL timeset(routinen, handle)
1926 CALL get_qs_env(qs_env, nkind=nkind, atomic_kind_set=atomic_kind_set, particle_set=particle_set, cell=cell)
1928 ALLOCATE (exp_ao_kind(nkind), exp_ri_kind(nkind), radius_ao_kind(nkind), &
1929 radius_ao_product_kind(nkind), radius_ri_kind(nkind))
1931 exp_min_ri = 10.0_dp
1932 exp_min_ao = 10.0_dp
1933 exp_ri_kind = 10.0_dp
1934 exp_ao_kind = 10.0_dp
1936 eps = bs_env%eps_filter*bs_env%heuristic_filter_factor
1945 DO i = 1,
SIZE(exp_ri, 1)
1946 DO j = 1,
SIZE(exp_ri, 2)
1947 IF (exp_ri(i, j) < exp_min_ri .AND. exp_ri(i, j) > 1e-3_dp) exp_min_ri = exp_ri(i, j)
1948 IF (exp_ri(i, j) < exp_ri_kind(ikind) .AND. exp_ri(i, j) > 1e-3_dp) &
1949 exp_ri_kind(ikind) = exp_ri(i, j)
1952 DO i = 1,
SIZE(exp_ao, 1)
1953 DO j = 1,
SIZE(exp_ao, 2)
1954 IF (exp_ao(i, j) < exp_min_ao .AND. exp_ao(i, j) > 1e-3_dp) exp_min_ao = exp_ao(i, j)
1955 IF (exp_ao(i, j) < exp_ao_kind(ikind) .AND. exp_ao(i, j) > 1e-3_dp) &
1956 exp_ao_kind(ikind) = exp_ao(i, j)
1959 radius_ao_kind(ikind) = sqrt(-log(eps)/exp_ao_kind(ikind))
1960 radius_ao_product_kind(ikind) = sqrt(-log(eps)/(2.0_dp*exp_ao_kind(ikind)))
1961 radius_ri_kind(ikind) = sqrt(-log(eps)/exp_ri_kind(ikind))
1964 radius_ao = sqrt(-log(eps)/exp_min_ao)
1965 radius_ao_product = sqrt(-log(eps)/(2.0_dp*exp_min_ao))
1966 radius_ri = sqrt(-log(eps)/exp_min_ri)
1971 cell_radius_3c = radius_ao_product + radius_ri + bs_env%ri_metric%cutoff_radius
1973 n_max(1:3) = bs_env%periodic(1:3)*30
1984 DO i_cell_x = -n_max(1), n_max(1)
1985 DO j_cell_y = -n_max(2), n_max(2)
1986 DO k_cell_z = -n_max(3), n_max(3)
1988 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
1990 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
1992 IF (cell_dist < cell_radius_3c)
THEN
1993 nimages_3c_max = nimages_3c_max + 1
1994 i_cell_x_min = min(i_cell_x_min, i_cell_x)
1995 i_cell_x_max = max(i_cell_x_max, i_cell_x)
1996 j_cell_y_min = min(j_cell_y_min, j_cell_y)
1997 j_cell_y_max = max(j_cell_y_max, j_cell_y)
1998 k_cell_z_min = min(k_cell_z_min, k_cell_z)
1999 k_cell_z_max = max(k_cell_z_max, k_cell_z)
2008 ALLOCATE (index_to_cell_3c_max(nimages_3c_max, 3))
2011 DO i_cell_x = -n_max(1), n_max(1)
2012 DO j_cell_y = -n_max(2), n_max(2)
2013 DO k_cell_z = -n_max(3), n_max(3)
2015 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2017 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2019 IF (cell_dist < cell_radius_3c)
THEN
2021 index_to_cell_3c_max(img, 1:3) = cell_index(1:3)
2029 ALLOCATE (nblocks_3c_max(nimages_3c_max, nimages_3c_max))
2030 nblocks_3c_max(:, :) = 0
2033 DO j_cell = 1, nimages_3c_max
2034 DO k_cell = 1, nimages_3c_max
2036 DO atom_j = 1, bs_env%n_atom
2037 DO atom_k = 1, bs_env%n_atom
2038 DO atom_i = 1, bs_env%n_atom
2040 block_count = block_count + 1
2041 IF (
modulo(block_count, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2043 CALL scaled_to_real(vec_cell_j, real(index_to_cell_3c_max(j_cell, 1:3), kind=
dp), cell)
2044 CALL scaled_to_real(vec_cell_k, real(index_to_cell_3c_max(k_cell, 1:3), kind=
dp), cell)
2046 rij =
pbc(particle_set(atom_j)%r(:), cell) -
pbc(particle_set(atom_i)%r(:), cell) + vec_cell_j(:)
2047 rjk =
pbc(particle_set(atom_k)%r(:), cell) -
pbc(particle_set(atom_j)%r(:), cell) &
2048 + vec_cell_k(:) - vec_cell_j(:)
2049 rik(:) = rij(:) + rjk(:)
2053 IF (djk > radius_ao_kind(kind_of(atom_j)) + radius_ao_kind(kind_of(atom_k))) cycle
2054 IF (dij > radius_ao_kind(kind_of(atom_j)) + radius_ri_kind(kind_of(atom_i)) &
2055 + bs_env%ri_metric%cutoff_radius) cycle
2056 IF (dik > radius_ri_kind(kind_of(atom_i)) + radius_ao_kind(kind_of(atom_k)) &
2057 + bs_env%ri_metric%cutoff_radius) cycle
2059 j_size = bs_env%i_ao_end_from_atom(atom_j) - bs_env%i_ao_start_from_atom(atom_j) + 1
2060 k_size = bs_env%i_ao_end_from_atom(atom_k) - bs_env%i_ao_start_from_atom(atom_k) + 1
2061 i_size = bs_env%i_RI_end_from_atom(atom_i) - bs_env%i_RI_start_from_atom(atom_i) + 1
2063 ALLOCATE (int_3c(j_size, k_size, i_size))
2068 basis_j=bs_env%basis_set_AO, &
2069 basis_k=bs_env%basis_set_AO, &
2070 basis_i=bs_env%basis_set_RI, &
2071 cell_j=index_to_cell_3c_max(j_cell, 1:3), &
2072 cell_k=index_to_cell_3c_max(k_cell, 1:3), &
2073 atom_k=atom_k, atom_j=atom_j, atom_i=atom_i)
2075 frobenius_norm = sqrt(sum(int_3c(:, :, :)**2))
2081 IF (frobenius_norm > eps)
THEN
2082 nblocks_3c_max(j_cell, k_cell) = nblocks_3c_max(j_cell, k_cell) + 1
2092 CALL bs_env%para_env%sum(nblocks_3c_max)
2094 ALLOCATE (n_other_3c_images_max(nimages_3c_max))
2095 n_other_3c_images_max(:) = 0
2100 DO j_cell = 1, nimages_3c_max
2101 DO k_cell = 1, nimages_3c_max
2102 IF (nblocks_3c_max(j_cell, k_cell) > 0)
THEN
2103 n_other_3c_images_max(j_cell) = n_other_3c_images_max(j_cell) + 1
2104 nimage_pairs_3c = nimage_pairs_3c + 1
2108 IF (n_other_3c_images_max(j_cell) > 0) nimages_3c = nimages_3c + 1
2112 bs_env%nimages_3c = nimages_3c
2113 ALLOCATE (bs_env%index_to_cell_3c(nimages_3c, 3))
2114 ALLOCATE (bs_env%cell_to_index_3c(i_cell_x_min:i_cell_x_max, &
2115 j_cell_y_min:j_cell_y_max, &
2116 k_cell_z_min:k_cell_z_max))
2117 bs_env%cell_to_index_3c(:, :, :) = -1
2119 ALLOCATE (bs_env%nblocks_3c(nimages_3c, nimages_3c))
2120 bs_env%nblocks_3c(nimages_3c, nimages_3c) = 0
2123 DO j_cell_max = 1, nimages_3c_max
2124 IF (n_other_3c_images_max(j_cell_max) == 0) cycle
2126 cell_index(1:3) = index_to_cell_3c_max(j_cell_max, 1:3)
2127 bs_env%index_to_cell_3c(j_cell, 1:3) = cell_index(1:3)
2128 bs_env%cell_to_index_3c(cell_index(1), cell_index(2), cell_index(3)) = j_cell
2131 DO k_cell_max = 1, nimages_3c_max
2132 IF (n_other_3c_images_max(k_cell_max) == 0) cycle
2135 bs_env%nblocks_3c(j_cell, k_cell) = nblocks_3c_max(j_cell_max, k_cell_max)
2141 mem_3c_gb = real(bs_env%n_RI, kind=
dp)*real(bs_env%n_ao, kind=
dp)**2 &
2142 *real(nimage_pairs_3c, kind=
dp)*8e-9_dp
2145 CALL bs_env%para_env%max(mem_occ_per_proc)
2147 mem_occ_per_proc_gb = real(mem_occ_per_proc, kind=
dp)/1.0e9_dp
2150 avail_mem_per_proc_gb = bs_env%input_memory_per_proc_GB - mem_occ_per_proc_gb
2153 bs_env%group_size_tensor = max(int(mem_3c_gb/avail_mem_per_proc_gb + 1.0_dp), 1)
2158 WRITE (u, fmt=
"(T2,A,F52.1,A)")
"Radius of atomic orbitals", radius_ao*
angstrom, Å
" "
2159 WRITE (u, fmt=
"(T2,A,F55.1,A)")
"Radius of RI functions", radius_ri*
angstrom, Å
" "
2160 WRITE (u, fmt=
"(T2,A,I47)")
"Number of cells for 3c integrals", nimages_3c
2161 WRITE (u, fmt=
"(T2,A,I42)")
"Number of cell pairs for 3c integrals", nimage_pairs_3c
2162 WRITE (u,
'(T2,A)')
''
2163 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
2164 bs_env%input_memory_per_proc_GB,
' GB'
2165 WRITE (u,
'(T2,A,F35.1,A)')
'Used memory per MPI process before GW run', &
2166 mem_occ_per_proc_gb,
' GB'
2167 WRITE (u,
'(T2,A,F44.1,A)')
'Memory of three-center integrals', mem_3c_gb,
' GB'
2170 CALL timestop(handle)
2172 END SUBROUTINE setup_cells_3c
2184 SUBROUTINE sum_two_r_grids(index_to_cell_1, index_to_cell_2, nimages_1, nimages_2, &
2185 index_to_cell, cell_to_index, nimages)
2187 INTEGER,
DIMENSION(:, :) :: index_to_cell_1, index_to_cell_2
2188 INTEGER :: nimages_1, nimages_2
2189 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
2190 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2193 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_two_R_grids'
2195 INTEGER :: handle, i_dim, img_1, img_2, nimages_max
2196 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_tmp
2197 INTEGER,
DIMENSION(3) :: cell_1, cell_2, r, r_max, r_min
2199 CALL timeset(routinen, handle)
2202 r_min(i_dim) = minval(index_to_cell_1(:, i_dim)) + minval(index_to_cell_2(:, i_dim))
2203 r_max(i_dim) = maxval(index_to_cell_1(:, i_dim)) + maxval(index_to_cell_2(:, i_dim))
2206 nimages_max = (r_max(1) - r_min(1) + 1)*(r_max(2) - r_min(2) + 1)*(r_max(3) - r_min(3) + 1)
2208 ALLOCATE (index_to_cell_tmp(nimages_max, 3))
2209 index_to_cell_tmp(:, :) = -1
2211 ALLOCATE (cell_to_index(r_min(1):r_max(1), r_min(2):r_max(2), r_min(3):r_max(3)))
2212 cell_to_index(:, :, :) = -1
2216 DO img_1 = 1, nimages_1
2218 DO img_2 = 1, nimages_2
2220 cell_1(1:3) = index_to_cell_1(img_1, 1:3)
2221 cell_2(1:3) = index_to_cell_2(img_2, 1:3)
2223 r(1:3) = cell_1(1:3) + cell_2(1:3)
2226 IF (cell_to_index(r(1), r(2), r(3)) == -1)
THEN
2228 nimages = nimages + 1
2229 cell_to_index(r(1), r(2), r(3)) = nimages
2230 index_to_cell_tmp(nimages, 1:3) = r(1:3)
2238 ALLOCATE (index_to_cell(nimages, 3))
2239 index_to_cell(:, :) = index_to_cell_tmp(1:nimages, 1:3)
2241 CALL timestop(handle)
2243 END SUBROUTINE sum_two_r_grids
2250 SUBROUTINE compute_3c_integrals(qs_env, bs_env)
2255 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
2257 INTEGER :: handle, j_cell, k_cell, nimages_3c
2259 CALL timeset(routinen, handle)
2261 nimages_3c = bs_env%nimages_3c
2262 ALLOCATE (bs_env%t_3c_int(nimages_3c, nimages_3c))
2263 DO j_cell = 1, nimages_3c
2264 DO k_cell = 1, nimages_3c
2265 CALL dbt_create(bs_env%t_RI_AO__AO, bs_env%t_3c_int(j_cell, k_cell))
2270 bs_env%eps_filter, &
2273 int_eps=bs_env%eps_filter*0.05_dp, &
2274 basis_i=bs_env%basis_set_RI, &
2275 basis_j=bs_env%basis_set_AO, &
2276 basis_k=bs_env%basis_set_AO, &
2277 potential_parameter=bs_env%ri_metric, &
2278 desymmetrize=.false., do_kpoints=.true., cell_sym=.true., &
2279 cell_to_index_ext=bs_env%cell_to_index_3c)
2281 CALL bs_env%para_env%sync()
2283 CALL timestop(handle)
2285 END SUBROUTINE compute_3c_integrals
2293 SUBROUTINE get_cell_dist(cell_index, hmat, cell_dist)
2295 INTEGER,
DIMENSION(3) :: cell_index
2296 REAL(kind=
dp) :: hmat(3, 3), cell_dist
2298 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_cell_dist'
2300 INTEGER :: handle, i_dim
2301 INTEGER,
DIMENSION(3) :: cell_index_adj
2302 REAL(kind=
dp) :: cell_dist_3(3)
2304 CALL timeset(routinen, handle)
2309 IF (cell_index(i_dim) > 0) cell_index_adj(i_dim) = cell_index(i_dim) - 1
2310 IF (cell_index(i_dim) < 0) cell_index_adj(i_dim) = cell_index(i_dim) + 1
2311 IF (cell_index(i_dim) == 0) cell_index_adj(i_dim) = cell_index(i_dim)
2314 cell_dist_3(1:3) = matmul(hmat, real(cell_index_adj, kind=
dp))
2316 cell_dist = sqrt(abs(sum(cell_dist_3(1:3)**2)))
2318 CALL timestop(handle)
2320 END SUBROUTINE get_cell_dist
2329 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
2334 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
2336 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
2337 k_cell_z, nimages, nkp, u
2338 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
2343 CALL timeset(routinen, handle)
2348 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
2350 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
2351 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
2355 IF (bs_env%periodic(i_dim) == 1)
THEN
2356 cpassert(nkp_grid(i_dim) > 1)
2360 kpoints%kp_scheme =
"GENERAL"
2361 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
2363 bs_env%nkp_scf_desymm = nkp
2365 ALLOCATE (kpoints%xkp(1:3, nkp))
2368 ALLOCATE (kpoints%wkp(nkp))
2369 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
2373 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
2375 cixd(1:3) = cell_grid(1:3)/2
2377 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
2379 bs_env%nimages_scf_desymm = nimages
2381 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
2382 ALLOCATE (kpoints%index_to_cell(nimages, 3))
2385 DO i_cell_x = -cixd(1), cixd(1)
2386 DO j_cell_y = -cixd(2), cixd(2)
2387 DO k_cell_z = -cixd(3), cixd(3)
2389 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
2390 kpoints%index_to_cell(img, 1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2396 IF (u > 0 .AND. do_print)
THEN
2397 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
2400 CALL timestop(handle)
2402 END SUBROUTINE setup_kpoints_scf_desymm
2408 SUBROUTINE setup_cells_delta_r(bs_env)
2412 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_Delta_R'
2416 CALL timeset(routinen, handle)
2421 CALL sum_two_r_grids(bs_env%index_to_cell_3c, &
2422 bs_env%index_to_cell_3c, &
2423 bs_env%nimages_3c, bs_env%nimages_3c, &
2424 bs_env%index_to_cell_Delta_R, &
2425 bs_env%cell_to_index_Delta_R, &
2426 bs_env%nimages_Delta_R)
2428 IF (bs_env%unit_nr > 0)
THEN
2429 WRITE (bs_env%unit_nr, fmt=
"(T2,A,I61)") Δ
"Number of cells R", bs_env%nimages_Delta_R
2432 CALL timestop(handle)
2434 END SUBROUTINE setup_cells_delta_r
2440 SUBROUTINE setup_parallelization_delta_r(bs_env)
2444 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_parallelization_Delta_R'
2446 INTEGER :: handle, i_cell_delta_r, i_task_local, &
2448 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: i_cell_delta_r_group, &
2449 n_tensor_ops_delta_r
2451 CALL timeset(routinen, handle)
2453 CALL compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_delta_r)
2455 CALL compute_delta_r_dist(bs_env, n_tensor_ops_delta_r, i_cell_delta_r_group, n_tasks_local)
2457 bs_env%n_tasks_Delta_R_local = n_tasks_local
2459 ALLOCATE (bs_env%task_Delta_R(n_tasks_local))
2462 DO i_cell_delta_r = 1, bs_env%nimages_Delta_R
2464 IF (i_cell_delta_r_group(i_cell_delta_r) /= bs_env%tensor_group_color) cycle
2466 i_task_local = i_task_local + 1
2468 bs_env%task_Delta_R(i_task_local) = i_cell_delta_r
2472 ALLOCATE (bs_env%skip_DR_chi(n_tasks_local))
2473 bs_env%skip_DR_chi(:) = .false.
2474 ALLOCATE (bs_env%skip_DR_Sigma(n_tasks_local))
2475 bs_env%skip_DR_Sigma(:) = .false.
2477 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Goccx3c_chi, bs_env)
2478 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Gvirx3c_chi, bs_env)
2479 CALL allocate_skip_3xr(bs_env%skip_DR_R_R2_MxM_chi, bs_env)
2481 CALL allocate_skip_3xr(bs_env%skip_DR_R1_S2_Gx3c_Sigma, bs_env)
2482 CALL allocate_skip_3xr(bs_env%skip_DR_R1_R_MxM_Sigma, bs_env)
2484 CALL timestop(handle)
2486 END SUBROUTINE setup_parallelization_delta_r
2493 SUBROUTINE allocate_skip_3xr(skip, bs_env)
2494 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip
2497 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_skip_3xR'
2501 CALL timeset(routinen, handle)
2503 ALLOCATE (skip(bs_env%n_tasks_Delta_R_local, bs_env%nimages_3c, bs_env%nimages_scf_desymm))
2504 skip(:, :, :) = .false.
2506 CALL timestop(handle)
2508 END SUBROUTINE allocate_skip_3xr
2517 SUBROUTINE compute_delta_r_dist(bs_env, n_tensor_ops_Delta_R, i_cell_Delta_R_group, n_tasks_local)
2519 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r, &
2520 i_cell_delta_r_group
2521 INTEGER :: n_tasks_local
2523 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Delta_R_dist'
2525 INTEGER :: handle, i_delta_r_max_op, i_group_min, &
2527 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r_in_group
2529 CALL timeset(routinen, handle)
2531 nimages_delta_r = bs_env%nimages_Delta_R
2535 IF (u > 0 .AND. nimages_delta_r < bs_env%num_tensor_groups)
THEN
2536 WRITE (u, fmt=
"(T2,A,I5,A,I5,A)")
"There are only ", nimages_delta_r, &
2537 " tasks to work on but there are ", bs_env%num_tensor_groups,
" groups."
2538 WRITE (u, fmt=
"(T2,A)")
"Please reduce the number of MPI processes."
2539 WRITE (u,
'(T2,A)')
''
2542 ALLOCATE (n_tensor_ops_delta_r_in_group(bs_env%num_tensor_groups))
2543 n_tensor_ops_delta_r_in_group(:) = 0
2544 ALLOCATE (i_cell_delta_r_group(nimages_delta_r))
2545 i_cell_delta_r_group(:) = -1
2549 DO WHILE (any(n_tensor_ops_delta_r(:) .NE. 0))
2552 i_delta_r_max_op = maxloc(n_tensor_ops_delta_r, 1)
2555 i_group_min = minloc(n_tensor_ops_delta_r_in_group, 1)
2558 i_cell_delta_r_group(i_delta_r_max_op) = i_group_min - 1
2559 n_tensor_ops_delta_r_in_group(i_group_min) = n_tensor_ops_delta_r_in_group(i_group_min) + &
2560 n_tensor_ops_delta_r(i_delta_r_max_op)
2563 n_tensor_ops_delta_r(i_delta_r_max_op) = 0
2565 IF (bs_env%tensor_group_color == i_group_min - 1) n_tasks_local = n_tasks_local + 1
2569 CALL timestop(handle)
2571 END SUBROUTINE compute_delta_r_dist
2578 SUBROUTINE compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_Delta_R)
2580 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r
2582 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_n_tensor_ops_Delta_R'
2584 INTEGER :: handle, i_cell_delta_r, i_cell_r, i_cell_r1, i_cell_r1_minus_r, i_cell_r2, &
2585 i_cell_r2_m_r1, i_cell_s1, i_cell_s1_m_r1_p_r2, i_cell_s1_minus_r, i_cell_s2, &
2587 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, cell_r1_minus_r, cell_r2, &
2588 cell_r2_m_r1, cell_s1, cell_s1_m_r2_p_r1, cell_s1_minus_r, cell_s1_p_s2_m_r1, cell_s2
2589 LOGICAL :: cell_found
2591 CALL timeset(routinen, handle)
2593 nimages_delta_r = bs_env%nimages_Delta_R
2595 ALLOCATE (n_tensor_ops_delta_r(nimages_delta_r))
2596 n_tensor_ops_delta_r(:) = 0
2599 DO i_cell_delta_r = 1, nimages_delta_r
2601 IF (
modulo(i_cell_delta_r, bs_env%num_tensor_groups) /= bs_env%tensor_group_color) cycle
2603 DO i_cell_r1 = 1, bs_env%nimages_3c
2605 cell_r1(1:3) = bs_env%index_to_cell_3c(i_cell_r1, 1:3)
2606 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(i_cell_delta_r, 1:3)
2609 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
2610 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
2611 IF (.NOT. cell_found) cycle
2613 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
2615 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r2, 1:3)
2618 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
2619 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
2620 IF (.NOT. cell_found) cycle
2623 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
2624 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
2625 IF (.NOT. cell_found) cycle
2627 n_tensor_ops_delta_r(i_cell_delta_r) = n_tensor_ops_delta_r(i_cell_delta_r) + 1
2631 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
2633 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_s2, 1:3)
2634 cell_m_r1(1:3) = -cell_r1(1:3)
2635 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
2638 IF (.NOT. cell_found) cycle
2641 IF (.NOT. cell_found) cycle
2645 DO i_cell_r = 1, bs_env%nimages_scf_desymm
2647 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r, 1:3)
2650 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
2651 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
2652 IF (.NOT. cell_found) cycle
2655 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
2656 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
2657 IF (.NOT. cell_found) cycle
2665 CALL bs_env%para_env%sum(n_tensor_ops_delta_r)
2667 CALL timestop(handle)
2669 END SUBROUTINE compute_n_tensor_ops_delta_r
2681 SUBROUTINE add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, &
2682 cell_to_index, i_cell_1_plus_2)
2684 INTEGER,
DIMENSION(3) :: cell_1, cell_2
2685 INTEGER,
DIMENSION(:, :) :: index_to_cell
2686 INTEGER,
DIMENSION(3) :: cell_1_plus_2
2687 LOGICAL :: cell_found
2688 INTEGER,
DIMENSION(:, :, :),
INTENT(IN), &
2689 OPTIONAL,
POINTER :: cell_to_index
2690 INTEGER,
INTENT(OUT),
OPTIONAL :: i_cell_1_plus_2
2692 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_R'
2696 CALL timeset(routinen, handle)
2698 cell_1_plus_2(1:3) = cell_1(1:3) + cell_2(1:3)
2702 IF (
PRESENT(i_cell_1_plus_2))
THEN
2703 IF (cell_found)
THEN
2704 cpassert(
PRESENT(cell_to_index))
2705 i_cell_1_plus_2 = cell_to_index(cell_1_plus_2(1), cell_1_plus_2(2), cell_1_plus_2(3))
2707 i_cell_1_plus_2 = -1000
2711 CALL timestop(handle)
2713 END SUBROUTINE add_r
2722 INTEGER,
DIMENSION(3) :: cell
2723 INTEGER,
DIMENSION(:, :) :: index_to_cell
2724 LOGICAL :: cell_found
2726 CHARACTER(LEN=*),
PARAMETER :: routinen =
'is_cell_in_index_to_cell'
2728 INTEGER :: handle, i_cell, nimg
2729 INTEGER,
DIMENSION(3) :: cell_i
2731 CALL timeset(routinen, handle)
2733 nimg =
SIZE(index_to_cell, 1)
2735 cell_found = .false.
2739 cell_i(1:3) = index_to_cell(i_cell, 1:3)
2741 IF (cell_i(1) == cell(1) .AND. cell_i(2) == cell(2) .AND. cell_i(3) == cell(3))
THEN
2747 CALL timestop(handle)
2756 SUBROUTINE allocate_matrices_small_cell_full_kp(qs_env, bs_env)
2760 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_small_cell_full_kp'
2762 INTEGER :: handle, i_spin, i_t, img, n_spin, &
2763 nimages_scf, num_time_freq_points
2767 CALL timeset(routinen, handle)
2769 nimages_scf = bs_env%nimages_scf_desymm
2770 num_time_freq_points = bs_env%num_time_freq_points
2771 n_spin = bs_env%n_spin
2773 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2775 ALLOCATE (bs_env%fm_G_S(nimages_scf))
2776 ALLOCATE (bs_env%fm_Sigma_x_R(nimages_scf))
2777 ALLOCATE (bs_env%fm_chi_R_t(nimages_scf, num_time_freq_points))
2778 ALLOCATE (bs_env%fm_MWM_R_t(nimages_scf, num_time_freq_points))
2779 ALLOCATE (bs_env%fm_Sigma_c_R_neg_tau(nimages_scf, num_time_freq_points, n_spin))
2780 ALLOCATE (bs_env%fm_Sigma_c_R_pos_tau(nimages_scf, num_time_freq_points, n_spin))
2781 DO img = 1, nimages_scf
2782 CALL cp_fm_create(bs_env%fm_G_S(img), bs_env%fm_work_mo(1)%matrix_struct)
2783 CALL cp_fm_create(bs_env%fm_Sigma_x_R(img), bs_env%fm_work_mo(1)%matrix_struct)
2784 DO i_t = 1, num_time_freq_points
2785 CALL cp_fm_create(bs_env%fm_chi_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2786 CALL cp_fm_create(bs_env%fm_MWM_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2788 DO i_spin = 1, n_spin
2789 CALL cp_fm_create(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), &
2790 bs_env%fm_work_mo(1)%matrix_struct)
2791 CALL cp_fm_create(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), &
2792 bs_env%fm_work_mo(1)%matrix_struct)
2793 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), 0.0_dp)
2794 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), 0.0_dp)
2799 CALL timestop(handle)
2801 END SUBROUTINE allocate_matrices_small_cell_full_kp
2808 SUBROUTINE trafo_v_xc_r_to_kp(qs_env, bs_env)
2812 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_V_xc_R_to_kp'
2814 INTEGER :: handle, ikp, img, ispin, n_ao
2815 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2816 TYPE(
cp_cfm_type) :: cfm_mo_coeff, cfm_tmp, cfm_v_xc
2818 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
2823 CALL timeset(routinen, handle)
2827 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints_scf)
2830 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2832 CALL cp_cfm_create(cfm_v_xc, bs_env%cfm_work_mo%matrix_struct)
2833 CALL cp_cfm_create(cfm_mo_coeff, bs_env%cfm_work_mo%matrix_struct)
2834 CALL cp_cfm_create(cfm_tmp, bs_env%cfm_work_mo%matrix_struct)
2835 CALL cp_fm_create(fm_v_xc_re, bs_env%cfm_work_mo%matrix_struct)
2837 DO img = 1, bs_env%nimages_scf
2838 DO ispin = 1, bs_env%n_spin
2840 CALL dbcsr_set(matrix_ks(ispin, img)%matrix, 0.0_dp)
2841 CALL copy_fm_to_dbcsr(bs_env%fm_V_xc_R(img, ispin), matrix_ks(ispin, img)%matrix)
2845 ALLOCATE (bs_env%v_xc_n(n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
2847 DO ispin = 1, bs_env%n_spin
2848 DO ikp = 1, bs_env%nkp_bs_and_DOS
2851 CALL rsmat_to_kp(matrix_ks, ispin, bs_env%kpoints_DOS%xkp(1:3, ikp), &
2852 cell_to_index_scf, sab_nl, bs_env, cfm_v_xc)
2855 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
2879 CALL timestop(handle)
2881 END SUBROUTINE trafo_v_xc_r_to_kp
2888 SUBROUTINE heuristic_ri_regularization(qs_env, bs_env)
2892 CHARACTER(LEN=*),
PARAMETER :: routinen =
'heuristic_RI_regularization'
2894 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m
2895 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
2897 REAL(kind=
dp) :: cond_nr, cond_nr_max, max_ev, &
2898 max_ev_ikp, min_ev, min_ev_ikp
2899 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
2901 CALL timeset(routinen, handle)
2904 CALL get_v_tr_r(m_r, bs_env%ri_metric, 0.0_dp, bs_env, qs_env)
2906 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
2912 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2913 nkp_local = nkp_local + 1
2916 ALLOCATE (m(n_ri, n_ri, nkp_local))
2919 cond_nr_max = 0.0_dp
2926 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2928 ikp_local = ikp_local + 1
2932 bs_env%kpoints_scf_desymm%index_to_cell, &
2933 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
2936 CALL power(m(:, :, ikp_local), 1.0_dp, 0.0_dp, cond_nr, min_ev_ikp, max_ev_ikp)
2938 IF (cond_nr > cond_nr_max) cond_nr_max = cond_nr
2939 IF (max_ev_ikp > max_ev) max_ev = max_ev_ikp
2940 IF (min_ev_ikp < min_ev) min_ev = min_ev_ikp
2944 CALL bs_env%para_env%max(cond_nr_max)
2948 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Min. abs. eigenvalue of RI metric matrix M(k)", min_ev
2949 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Max. abs. eigenvalue of RI metric matrix M(k)", max_ev
2950 WRITE (u, fmt=
"(T2,A,ES50.1)")
"Max. condition number of M(k)", cond_nr_max
2953 CALL timestop(handle)
2955 END SUBROUTINE heuristic_ri_regularization
2965 SUBROUTINE get_v_tr_r(V_tr_R, pot_type, regularization_RI, bs_env, qs_env)
2966 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: v_tr_r
2968 REAL(kind=
dp) :: regularization_ri
2972 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_V_tr_R'
2974 INTEGER :: handle, img, nimages_scf_desymm
2975 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
2976 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
2978 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_v_tr_r
2980 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_v_tr_r
2985 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2987 CALL timeset(routinen, handle)
2989 NULLIFY (sab_ri, dist_2d)
2992 blacs_env=blacs_env, &
2993 distribution_2d=dist_2d, &
2994 qs_kind_set=qs_kind_set, &
2995 particle_set=particle_set)
2997 ALLOCATE (sizes_ri(bs_env%n_atom))
2998 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=bs_env%basis_set_RI)
3000 pot_type,
"2c_nl_RI", qs_env, sym_ij=.false., &
3003 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
3004 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
3005 row_bsize(:) = sizes_ri
3006 col_bsize(:) = sizes_ri
3008 nimages_scf_desymm = bs_env%nimages_scf_desymm
3009 ALLOCATE (mat_v_tr_r(nimages_scf_desymm))
3010 CALL dbcsr_create(mat_v_tr_r(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_no_symmetry, &
3011 row_bsize, col_bsize)
3012 DEALLOCATE (row_bsize, col_bsize)
3014 DO img = 2, nimages_scf_desymm
3015 CALL dbcsr_create(mat_v_tr_r(img), template=mat_v_tr_r(1))
3019 bs_env%basis_set_RI, pot_type, do_kpoints=.true., &
3020 ext_kpoints=bs_env%kpoints_scf_desymm, &
3021 regularization_ri=regularization_ri)
3023 ALLOCATE (fm_v_tr_r(nimages_scf_desymm))
3024 DO img = 1, nimages_scf_desymm
3025 CALL cp_fm_create(fm_v_tr_r(img), bs_env%fm_RI_RI%matrix_struct)
3030 IF (.NOT.
ALLOCATED(v_tr_r))
THEN
3031 ALLOCATE (v_tr_r(bs_env%n_RI, bs_env%n_RI, nimages_scf_desymm))
3040 CALL timestop(handle)
3053 SUBROUTINE power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
3054 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
3055 REAL(kind=
dp) :: exponent, eps
3056 REAL(kind=
dp),
OPTIONAL :: cond_nr, min_ev, max_ev
3058 CHARACTER(len=*),
PARAMETER :: routinen =
'power'
3060 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenvectors
3061 INTEGER :: handle, i, n
3062 REAL(kind=
dp) :: pos_eval
3063 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
3065 CALL timeset(routinen, handle)
3068 matrix(:, :) = 0.5_dp*(matrix(:, :) + conjg(transpose(matrix(:, :))))
3071 ALLOCATE (eigenvalues(n), eigenvectors(n, n))
3074 IF (
PRESENT(cond_nr)) cond_nr = maxval(abs(eigenvalues))/minval(abs(eigenvalues))
3075 IF (
PRESENT(min_ev)) min_ev = minval(abs(eigenvalues))
3076 IF (
PRESENT(max_ev)) max_ev = maxval(abs(eigenvalues))
3079 IF (eps < eigenvalues(i))
THEN
3080 pos_eval = (eigenvalues(i))**(0.5_dp*exponent)
3084 eigenvectors(:, i) = eigenvectors(:, i)*pos_eval
3087 CALL zgemm(
"N",
"C", n, n, n,
z_one, eigenvectors, n, eigenvectors, n,
z_zero, matrix, n)
3089 DEALLOCATE (eigenvalues, eigenvectors)
3091 CALL timestop(handle)
3093 END SUBROUTINE power
3104 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_n_time, sigma_c_n_freq
3107 CHARACTER(LEN=*),
PARAMETER :: routinen =
'time_to_freq'
3109 INTEGER :: handle, i_t, j_w, n_occ
3110 REAL(kind=
dp) :: freq_j, time_i, w_cos_ij, w_sin_ij
3111 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sigma_c_n_cos_time, sigma_c_n_sin_time
3113 CALL timeset(routinen, handle)
3115 ALLOCATE (sigma_c_n_cos_time(bs_env%n_ao, bs_env%num_time_freq_points))
3116 ALLOCATE (sigma_c_n_sin_time(bs_env%n_ao, bs_env%num_time_freq_points))
3118 sigma_c_n_cos_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) + sigma_c_n_time(:, :, 2))
3119 sigma_c_n_sin_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) - sigma_c_n_time(:, :, 2))
3121 sigma_c_n_freq(:, :, :) = 0.0_dp
3123 DO i_t = 1, bs_env%num_time_freq_points
3125 DO j_w = 1, bs_env%num_time_freq_points
3127 freq_j = bs_env%imag_freq_points(j_w)
3128 time_i = bs_env%imag_time_points(i_t)
3130 w_cos_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(freq_j*time_i)
3131 w_sin_ij = bs_env%weights_sin_t_to_w(j_w, i_t)*sin(freq_j*time_i)
3134 sigma_c_n_freq(:, j_w, 1) = sigma_c_n_freq(:, j_w, 1) + &
3135 w_cos_ij*sigma_c_n_cos_time(:, i_t)
3138 sigma_c_n_freq(:, j_w, 2) = sigma_c_n_freq(:, j_w, 2) + &
3139 w_sin_ij*sigma_c_n_sin_time(:, i_t)
3148 n_occ = bs_env%n_occ(ispin)
3149 sigma_c_n_freq(1:n_occ, :, 2) = -sigma_c_n_freq(1:n_occ, :, 2)
3151 CALL timestop(handle)
3166 eigenval_scf, ikp, ispin)
3169 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq
3170 REAL(kind=
dp),
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf
3171 INTEGER :: ikp, ispin
3173 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyt_conti_and_print'
3175 CHARACTER(len=3) :: occ_vir
3176 CHARACTER(len=default_string_length) :: fname
3177 INTEGER :: handle, i_mo, ikp_for_print, iunit, &
3179 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
3181 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dummy, sigma_c_ikp_n_qp
3183 CALL timeset(routinen, handle)
3186 ALLOCATE (dummy(n_mo), sigma_c_ikp_n_qp(n_mo))
3187 sigma_c_ikp_n_qp(:) = 0.0_dp
3192 IF (
modulo(i_mo, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3195 bs_env%imag_freq_points_fit, dummy, dummy, &
3196 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 1)*
z_one + &
3197 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 2)*
gaussi, &
3198 sigma_x_ikp_n(:) - v_xc_ikp_n(:), &
3199 eigenval_scf(:), eigenval_scf(:), &
3200 bs_env%do_hedin_shift, &
3201 i_mo, bs_env%n_occ(ispin), bs_env%n_vir(ispin), &
3202 bs_env%nparam_pade, bs_env%num_freq_points_fit, &
3204 0.0_dp, .true., .false., 1, e_fermi_ext=bs_env%e_fermi(ispin))
3207 CALL bs_env%para_env%sum(sigma_c_ikp_n_qp)
3209 CALL correct_obvious_fitting_fails(sigma_c_ikp_n_qp, ispin, bs_env)
3211 bs_env%eigenval_G0W0(:, ikp, ispin) = eigenval_scf(:) + &
3212 sigma_c_ikp_n_qp(:) + &
3213 sigma_x_ikp_n(:) - &
3216 bs_env%eigenval_HF(:, ikp, ispin) = eigenval_scf(:) + sigma_x_ikp_n(:) - v_xc_ikp_n(:)
3219 print_dos_kpoints = (bs_env%nkp_only_bs .LE. 0)
3221 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
3222 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
3224 IF (bs_env%para_env%is_source() .AND. print_ikp)
THEN
3226 IF (print_dos_kpoints)
THEN
3227 nkp = bs_env%nkp_only_DOS
3230 nkp = bs_env%nkp_only_bs
3231 ikp_for_print = ikp - bs_env%nkp_only_DOS
3234 fname =
"bandstructure_SCF_and_G0W0"
3236 IF (ikp_for_print == 1)
THEN
3237 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
3238 file_action=
"WRITE")
3240 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
3241 file_action=
"WRITE", file_position=
"APPEND")
3244 WRITE (iunit,
"(A)")
" "
3245 WRITE (iunit,
"(A10,I7,A25,3F10.4)")
"kpoint: ", ikp_for_print,
"coordinate: ", &
3246 bs_env%kpoints_DOS%xkp(:, ikp)
3247 WRITE (iunit,
"(A)")
" "
3248 WRITE (iunit,
"(A5,A12,3A17,A16,A18)")
"n",
"k", ϵ
"_nk^DFT (eV)", Σ
"^c_nk (eV)", &
3249 Σ
"^x_nk (eV)",
"v_nk^xc (eV)", ϵ
"_nk^G0W0 (eV)"
3250 WRITE (iunit,
"(A)")
" "
3253 IF (i_mo .LE. bs_env%n_occ(ispin)) occ_vir =
'occ'
3254 IF (i_mo > bs_env%n_occ(ispin)) occ_vir =
'vir'
3255 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', ikp_for_print, &
3256 eigenval_scf(i_mo)*
evolt, &
3257 sigma_c_ikp_n_qp(i_mo)*
evolt, &
3258 sigma_x_ikp_n(i_mo)*
evolt, &
3259 v_xc_ikp_n(i_mo)*
evolt, &
3260 bs_env%eigenval_G0W0(i_mo, ikp, ispin)*
evolt
3263 WRITE (iunit,
"(A)")
" "
3269 CALL timestop(handle)
3279 SUBROUTINE correct_obvious_fitting_fails(Sigma_c_ikp_n_qp, ispin, bs_env)
3280 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_c_ikp_n_qp
3284 CHARACTER(LEN=*),
PARAMETER :: routinen =
'correct_obvious_fitting_fails'
3286 INTEGER :: handle, homo, i_mo, j_mo, &
3287 n_levels_scissor, n_mo
3288 LOGICAL :: is_occ, is_vir
3289 REAL(kind=
dp) :: sum_sigma_c
3291 CALL timeset(routinen, handle)
3294 homo = bs_env%n_occ(ispin)
3299 IF (abs(sigma_c_ikp_n_qp(i_mo)) > 13.0_dp/
evolt)
THEN
3301 is_occ = (i_mo .LE. homo)
3302 is_vir = (i_mo > homo)
3304 n_levels_scissor = 0
3305 sum_sigma_c = 0.0_dp
3311 IF (is_occ .AND. j_mo > homo) cycle
3312 IF (is_vir .AND. j_mo .LE. homo) cycle
3313 IF (abs(i_mo - j_mo) > 10) cycle
3314 IF (i_mo == j_mo) cycle
3316 n_levels_scissor = n_levels_scissor + 1
3317 sum_sigma_c = sum_sigma_c + sigma_c_ikp_n_qp(j_mo)
3322 sigma_c_ikp_n_qp(i_mo) = sum_sigma_c/real(n_levels_scissor, kind=
dp)
3328 CALL timestop(handle)
3330 END SUBROUTINE correct_obvious_fitting_fails
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
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_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public graml2024
Handles all functions related to the CELL.
subroutine, public scaled_to_real(r, s, cell)
Transform scaled cell coordinates real coordinates. r=h*s.
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
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_distribution_release(dist)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
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.
basic linear algebra operations for full matrices
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
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...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
This is the start of a dbt_api, all publically needed functions are exported here....
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
subroutine, public fm_to_local_array(fm_s, array_s, weight, add)
...
Utility method to build 3-center integrals for small cell GW.
subroutine, public build_3c_integral_block(int_3c, qs_env, potential_parameter, basis_j, basis_k, basis_i, cell_j, cell_k, cell_i, atom_j, atom_k, atom_i, j_bf_start_from_atom, k_bf_start_from_atom, i_bf_start_from_atom)
...
subroutine, public trafo_rs_to_ikp(array_rs, array_kp, index_to_cell, xkp)
...
subroutine, public get_v_tr_r(v_tr_r, pot_type, regularization_ri, bs_env, qs_env)
...
subroutine, public time_to_freq(bs_env, sigma_c_n_time, sigma_c_n_freq, ispin)
...
subroutine, public de_init_bs_env(bs_env)
...
subroutine, public compute_xkp(xkp, ikp_start, ikp_end, grid)
...
subroutine, public analyt_conti_and_print(bs_env, sigma_c_ikp_n_freq, sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf, ikp, ispin)
...
subroutine, public create_and_init_bs_env_for_gw(qs_env, bs_env, bs_sec)
...
subroutine, public add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, cell_to_index, i_cell_1_plus_2)
...
subroutine, public kpoint_init_cell_index_simple(kpoints, qs_env)
...
subroutine, public get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
...
subroutine, public power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
...
subroutine, public is_cell_in_index_to_cell(cell, index_to_cell, cell_found)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
Routines needed for kpoint calculation.
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
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 kpoint_create(kpoint)
Create a kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Interface to the Libint-Library or a c++ wrapper.
subroutine, public cp_libint_static_cleanup()
subroutine, public cp_libint_static_init()
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
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
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
subroutine, public diag_complex(matrix, eigenvectors, eigenvalues)
Diagonalizes a local complex Hermitian matrix using LAPACK. Based on cp_cfm_heevd.
elemental integer function, public gcd(a, b)
computes the greatest common divisor of two number
Interface to the message passing library MPI.
Routines to calculate the minimax coefficients in order to approximate 1/x as a sum over exponential ...
subroutine, public get_exp_minimax_coeff_gw(k, e_range, aw)
...
Routines to calculate the minimax coefficients in order to approximate 1/x as a sum over exponential ...
subroutine, public get_exp_minimax_coeff(k, rc, aw, mm_error, which_coeffs)
Get best minimax approximation for given input parameters. Automatically chooses the most exact set o...
Routines to calculate the minimax coefficients for approximating 1/x as 1/x ~ 1/pi SUM_{i}^{K} w_i x^...
subroutine, public get_rpa_minimax_coeff_larger_grid(k, e_range, aw)
...
subroutine, public get_rpa_minimax_coeff(k, e_range, aw, ierr, print_warning)
The a_i and w_i coefficient are stored in aw such that the first 1:K elements correspond to a_i and t...
Calls routines to get RI integrals and calculate total energies.
subroutine, public create_mat_munu(mat_munu, qs_env, eps_grid, blacs_env_sub, do_ri_aux_basis, do_mixed_basis, group_size_prim, do_alloc_blocks_from_nbl, do_kpoints, sab_orb_sub, dbcsr_sym_type)
Encapsulate the building of dbcsr_matrix mat_munu.
Routines to calculate frequency and time grids (integration points and weights) for correlation metho...
subroutine, public get_l_sq_wghts_cos_tf_w_to_t(num_integ_points, tau_tj, weights_cos_tf_w_to_t, omega_tj, e_min, e_max, max_error, num_points_per_magnitude, regularization)
...
subroutine, public get_l_sq_wghts_cos_tf_t_to_w(num_integ_points, tau_tj, weights_cos_tf_t_to_w, omega_tj, e_min, e_max, max_error, num_points_per_magnitude, regularization)
Calculate integration weights for the tau grid (in dependency of the omega node)
subroutine, public get_l_sq_wghts_sin_tf_t_to_w(num_integ_points, tau_tj, weights_sin_tf_t_to_w, omega_tj, e_min, e_max, max_error, num_points_per_magnitude, regularization)
Calculate integration weights for the tau grid (in dependency of the omega node)
Framework for 2c-integrals for RI.
subroutine, public trunc_coulomb_for_exchange(qs_env, trunc_coulomb, rel_cutoff_trunc_coulomb_ri_x, cell_grid, do_bvk_cell)
...
basic linear algebra operations for full matrixes
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
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 rsmat_to_kp(mat_rs, ispin, xkp, cell_to_index_scf, sab_nl, bs_env, cfm_kp, imag_rs_mat)
...
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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
subroutine, public qs_env_part_release(qs_env)
releases part of the given qs_env in order to save memory
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, print_active, ext_ks_matrix)
routine where the real calculations are made: the KS matrix is calculated
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Utility methods to build 3-center integral tensors of various types.
subroutine, public distribution_3d_create(dist_3d, dist1, dist2, dist3, nkind, particle_set, mp_comm_3d, own_comm)
Create a 3d distribution.
subroutine, public create_2c_tensor(t2c, dist_1, dist_2, pgrid, sizes_1, sizes_2, order, name)
...
subroutine, public create_3c_tensor(t3c, dist_1, dist_2, dist_3, pgrid, sizes_1, sizes_2, sizes_3, map1, map2, name)
...
Utility methods to build 3-center integral tensors of various types.
subroutine, public build_2c_integrals(t2c, filter_eps, qs_env, nl_2c, basis_i, basis_j, potential_parameter, do_kpoints, do_hfx_kpoints, ext_kpoints, regularization_ri)
...
subroutine, public build_2c_neighbor_lists(ij_list, basis_i, basis_j, potential_parameter, name, qs_env, sym_ij, molecular, dist_2d, pot_to_rad)
Build 2-center neighborlists adapted to different operators This mainly wraps build_neighbor_lists fo...
subroutine, public build_3c_integrals(t3c, filter_eps, qs_env, nl_3c, basis_i, basis_j, basis_k, potential_parameter, int_eps, op_pos, do_kpoints, do_hfx_kpoints, desymmetrize, cell_sym, bounds_i, bounds_j, bounds_k, ri_range, img_to_ri_cell, cell_to_index_ext)
Build 3-center integral tensor.
subroutine, public neighbor_list_3c_destroy(ijk_list)
Destroy 3c neighborlist.
subroutine, public get_tensor_occupancy(tensor, nze, occ)
...
subroutine, public build_3c_neighbor_lists(ijk_list, basis_i, basis_j, basis_k, dist_3d, potential_parameter, name, qs_env, sym_ij, sym_jk, sym_ik, molecular, op_pos, own_dist)
Build a 3-center neighbor list.
Routines for GW, continuous development [Jan Wilhelm].
subroutine, public continuation_pade(vec_gw_energ, vec_omega_fit_gw, z_value, m_value, vec_sigma_c_gw, vec_sigma_x_minus_vxc_gw, eigenval, eigenval_scf, do_hedin_shift, n_level_gw, gw_corr_lev_occ, gw_corr_lev_vir, nparam_pade, num_fit_points, crossing_search, homo, fermi_level_offset, do_gw_im_time, print_self_energy, count_ev_sc_gw, vec_gw_dos, dos_lower_bound, dos_precision, ndos, min_level_self_energy, max_level_self_energy, dos_eta, dos_min, dos_max, e_fermi_ext)
perform analytic continuation with pade approximation
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
type of a logger, at the moment it contains just a print level starting at which level it should be l...
distributes pairs on a 2d grid of processors
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.