54 dbt_clear, dbt_create, dbt_destroy, dbt_filter, dbt_iterator_blocks_left, &
55 dbt_iterator_next_block, dbt_iterator_start, dbt_iterator_stop, dbt_iterator_type, &
56 dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_type
130#include "base/base_uses.f90"
140 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_utils'
155 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env_for_gw'
159 CALL timeset(routinen, handle)
163 CALL read_gw_input_parameters(bs_env, bs_sec)
165 CALL print_header_and_input_parameters(bs_env)
167 CALL setup_ao_and_ri_basis_set(qs_env, bs_env)
169 CALL get_ri_basis_and_basis_function_indices(qs_env, bs_env)
171 CALL set_heuristic_parameters(bs_env, qs_env)
175 CALL setup_kpoints_chi_eps_w(bs_env, bs_env%kpoints_chi_eps_W)
178 CALL setup_cells_3c(qs_env, bs_env)
181 CALL set_parallelization_parameters(qs_env, bs_env)
183 CALL allocate_matrices(qs_env, bs_env)
185 CALL compute_v_xc(qs_env, bs_env)
187 CALL create_tensors(qs_env, bs_env)
189 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
192 CALL allocate_gw_eigenvalues(bs_env)
194 CALL check_sparsity_3c(qs_env, bs_env)
196 CALL set_sparsity_parallelization_parameters(bs_env)
198 CALL check_for_restart_files(qs_env, bs_env)
202 CALL compute_3c_integrals(qs_env, bs_env)
204 CALL setup_cells_delta_r(bs_env)
206 CALL setup_parallelization_delta_r(bs_env)
208 CALL allocate_matrices_small_cell_full_kp(qs_env, bs_env)
210 CALL trafo_v_xc_r_to_kp(qs_env, bs_env)
212 CALL heuristic_ri_regularization(qs_env, bs_env)
216 CALL setup_time_and_frequency_minimax_grid(bs_env)
224 IF (.NOT. bs_env%do_ldos .AND. .false.)
THEN
228 CALL timestop(handle)
239 CHARACTER(LEN=*),
PARAMETER :: routinen =
'de_init_bs_env'
243 CALL timeset(routinen, handle)
249 IF (
ASSOCIATED(bs_env%nl_3c%ij_list) .AND. (bs_env%rtp_method ==
rtp_method_bse))
THEN
250 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr, *)
"Retaining nl_3c for RTBSE"
257 CALL timestop(handle)
266 SUBROUTINE read_gw_input_parameters(bs_env, bs_sec)
270 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_gw_input_parameters'
275 CALL timeset(routinen, handle)
291 CALL timestop(handle)
293 END SUBROUTINE read_gw_input_parameters
300 SUBROUTINE setup_ao_and_ri_basis_set(qs_env, bs_env)
304 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_AO_and_RI_basis_set'
306 INTEGER :: handle, natom, nkind
308 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
310 CALL timeset(routinen, handle)
313 qs_kind_set=qs_kind_set, &
314 particle_set=particle_set, &
315 natom=natom, nkind=nkind)
318 ALLOCATE (bs_env%sizes_RI(natom), bs_env%sizes_AO(natom))
319 ALLOCATE (bs_env%basis_set_RI(nkind), bs_env%basis_set_AO(nkind))
325 basis=bs_env%basis_set_RI)
327 basis=bs_env%basis_set_AO)
329 CALL timestop(handle)
331 END SUBROUTINE setup_ao_and_ri_basis_set
338 SUBROUTINE get_ri_basis_and_basis_function_indices(qs_env, bs_env)
342 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_RI_basis_and_basis_function_indices'
344 INTEGER :: handle, i_ri, iatom, ikind, iset, &
345 max_ao_bf_per_atom, n_ao_test, n_atom, &
346 n_kind, n_ri, nset, nsgf, u
347 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
348 INTEGER,
DIMENSION(:),
POINTER :: l_max, l_min, nsgf_set
351 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
353 CALL timeset(routinen, handle)
356 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
358 n_kind =
SIZE(qs_kind_set)
359 n_atom = bs_env%n_atom
364 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
366 IF (.NOT.
ASSOCIATED(basis_set_a))
THEN
367 CALL cp_abort(__location__, &
368 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section.")
372 ALLOCATE (bs_env%i_RI_start_from_atom(n_atom))
373 ALLOCATE (bs_env%i_RI_end_from_atom(n_atom))
374 ALLOCATE (bs_env%i_ao_start_from_atom(n_atom))
375 ALLOCATE (bs_env%i_ao_end_from_atom(n_atom))
379 bs_env%i_RI_start_from_atom(iatom) = n_ri + 1
380 ikind = kind_of(iatom)
381 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
383 bs_env%i_RI_end_from_atom(iatom) = n_ri
387 max_ao_bf_per_atom = 0
390 bs_env%i_ao_start_from_atom(iatom) = n_ao_test + 1
391 ikind = kind_of(iatom)
392 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"ORB")
393 n_ao_test = n_ao_test + nsgf
394 bs_env%i_ao_end_from_atom(iatom) = n_ao_test
395 max_ao_bf_per_atom = max(max_ao_bf_per_atom, nsgf)
397 cpassert(n_ao_test == bs_env%n_ao)
398 bs_env%max_AO_bf_per_atom = max_ao_bf_per_atom
400 ALLOCATE (bs_env%l_RI(n_ri))
403 ikind = kind_of(iatom)
405 nset = bs_env%basis_set_RI(ikind)%gto_basis_set%nset
406 l_max => bs_env%basis_set_RI(ikind)%gto_basis_set%lmax
407 l_min => bs_env%basis_set_RI(ikind)%gto_basis_set%lmin
408 nsgf_set => bs_env%basis_set_RI(ikind)%gto_basis_set%nsgf_set
411 cpassert(l_max(iset) == l_min(iset))
412 bs_env%l_RI(i_ri + 1:i_ri + nsgf_set(iset)) = l_max(iset)
413 i_ri = i_ri + nsgf_set(iset)
417 cpassert(i_ri == n_ri)
422 WRITE (u, fmt=
"(T2,A)")
" "
423 WRITE (u, fmt=
"(T2,2A,T75,I8)")
"Number of auxiliary Gaussian basis functions ", &
427 CALL timestop(handle)
429 END SUBROUTINE get_ri_basis_and_basis_function_indices
436 SUBROUTINE setup_kpoints_chi_eps_w(bs_env, kpoints)
441 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_chi_eps_W'
443 INTEGER :: handle, i_dim, n_dim, nkp, nkp_extra, &
445 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
446 REAL(kind=
dp) :: exp_s_p, n_dim_inv
448 CALL timeset(routinen, handle)
454 kpoints%kp_scheme =
"GENERAL"
456 periodic(1:3) = bs_env%periodic(1:3)
458 cpassert(
SIZE(bs_env%nkp_grid_chi_eps_W_input) == 3)
460 IF (bs_env%nkp_grid_chi_eps_W_input(1) > 0 .AND. &
461 bs_env%nkp_grid_chi_eps_W_input(2) > 0 .AND. &
462 bs_env%nkp_grid_chi_eps_W_input(3) > 0)
THEN
465 SELECT CASE (periodic(i_dim))
468 nkp_grid_extra(i_dim) = 1
470 nkp_grid(i_dim) = bs_env%nkp_grid_chi_eps_W_input(i_dim)
471 nkp_grid_extra(i_dim) = nkp_grid(i_dim)*2
473 cpabort(
"Error in periodicity.")
477 ELSE IF (bs_env%nkp_grid_chi_eps_W_input(1) == -1 .AND. &
478 bs_env%nkp_grid_chi_eps_W_input(2) == -1 .AND. &
479 bs_env%nkp_grid_chi_eps_W_input(3) == -1)
THEN
484 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
486 SELECT CASE (periodic(i_dim))
489 nkp_grid_extra(i_dim) = 1
491 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
494 nkp_grid_extra(i_dim) = 6
496 nkp_grid(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*4
497 nkp_grid_extra(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*8
500 cpabort(
"Error in periodicity.")
507 cpabort(
"An error occured when setting up the k-mesh for W.")
511 nkp_orig = max(nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2, 1)
513 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
515 nkp = nkp_orig + nkp_extra
517 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
520 bs_env%nkp_grid_chi_eps_W_orig(1:3) = nkp_grid(1:3)
521 bs_env%nkp_grid_chi_eps_W_extra(1:3) = nkp_grid_extra(1:3)
522 bs_env%nkp_chi_eps_W_orig = nkp_orig
523 bs_env%nkp_chi_eps_W_extra = nkp_extra
524 bs_env%nkp_chi_eps_W_orig_plus_extra = nkp
526 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
527 ALLOCATE (bs_env%wkp_no_extra(nkp), bs_env%wkp_s_p(nkp))
529 CALL compute_xkp(kpoints%xkp, 1, nkp_orig, nkp_grid)
530 CALL compute_xkp(kpoints%xkp, nkp_orig + 1, nkp, nkp_grid_extra)
532 n_dim = sum(periodic)
535 kpoints%wkp(1) = 1.0_dp
536 bs_env%wkp_s_p(1) = 1.0_dp
537 bs_env%wkp_no_extra(1) = 1.0_dp
540 n_dim_inv = 1.0_dp/real(n_dim, kind=
dp)
543 CALL compute_wkp(kpoints%wkp(1:nkp_orig), nkp_orig, nkp_extra, n_dim_inv)
544 CALL compute_wkp(kpoints%wkp(nkp_orig + 1:nkp), nkp_extra, nkp_orig, n_dim_inv)
546 bs_env%wkp_no_extra(1:nkp_orig) = 0.0_dp
547 bs_env%wkp_no_extra(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=
dp)
552 exp_s_p = 2.0_dp*n_dim_inv
553 CALL compute_wkp(bs_env%wkp_s_p(1:nkp_orig), nkp_orig, nkp_extra, exp_s_p)
554 CALL compute_wkp(bs_env%wkp_s_p(nkp_orig + 1:nkp), nkp_extra, nkp_orig, exp_s_p)
556 bs_env%wkp_s_p(1:nkp) = bs_env%wkp_no_extra(1:nkp)
561 IF (bs_env%approx_kp_extrapol)
THEN
562 bs_env%wkp_orig = 1.0_dp/real(nkp_orig, kind=
dp)
568 bs_env%nkp_chi_eps_W_batch = 4
570 bs_env%num_chi_eps_W_batches = (bs_env%nkp_chi_eps_W_orig_plus_extra - 1)/ &
571 bs_env%nkp_chi_eps_W_batch + 1
576 WRITE (u, fmt=
"(T2,A)")
" "
577 WRITE (u, fmt=
"(T2,1A,T71,3I4)") χε
"K-point mesh 1 for , , W", nkp_grid(1:3)
578 WRITE (u, fmt=
"(T2,2A,T71,3I4)") χε
"K-point mesh 2 for , , W ", &
579 "(for k-point extrapolation of W)", nkp_grid_extra(1:3)
580 WRITE (u, fmt=
"(T2,A,T80,L)")
"Approximate the k-point extrapolation", &
581 bs_env%approx_kp_extrapol
584 CALL timestop(handle)
586 END SUBROUTINE setup_kpoints_chi_eps_w
598 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_init_cell_index_simple'
606 CALL timeset(routinen, handle)
608 NULLIFY (dft_control, para_env, sab_orb)
609 CALL get_qs_env(qs_env=qs_env, para_env=para_env, dft_control=dft_control, sab_orb=sab_orb)
612 CALL timestop(handle)
625 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
626 INTEGER :: ikp_start, ikp_end
627 INTEGER,
DIMENSION(3) :: grid
629 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
631 INTEGER :: handle, i, ix, iy, iz
633 CALL timeset(routinen, handle)
640 IF (i > ikp_end) cycle
642 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
643 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
644 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
651 CALL timestop(handle)
662 SUBROUTINE compute_wkp(wkp, nkp_1, nkp_2, exponent)
663 REAL(kind=
dp),
DIMENSION(:) :: wkp
664 INTEGER :: nkp_1, nkp_2
665 REAL(kind=
dp) :: exponent
667 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp'
670 REAL(kind=
dp) :: nkp_ratio
672 CALL timeset(routinen, handle)
674 nkp_ratio = real(nkp_2, kind=
dp)/real(nkp_1, kind=
dp)
676 wkp(:) = 1.0_dp/real(nkp_1, kind=
dp)/(1.0_dp - nkp_ratio**exponent)
678 CALL timestop(handle)
680 END SUBROUTINE compute_wkp
687 SUBROUTINE allocate_matrices(qs_env, bs_env)
691 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices'
693 INTEGER :: handle, i_t
698 CALL timeset(routinen, handle)
700 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
702 fm_struct => bs_env%fm_ks_Gamma(1)%matrix_struct
707 NULLIFY (fm_struct_ri_global)
708 CALL cp_fm_struct_create(fm_struct_ri_global, context=blacs_env, nrow_global=bs_env%n_RI, &
709 ncol_global=bs_env%n_RI, para_env=para_env)
711 CALL cp_fm_create(bs_env%fm_chi_Gamma_freq, fm_struct_ri_global)
712 CALL cp_fm_create(bs_env%fm_W_MIC_freq, fm_struct_ri_global)
713 IF (bs_env%approx_kp_extrapol)
THEN
714 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_extra, fm_struct_ri_global)
715 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_no_extra, fm_struct_ri_global)
722 NULLIFY (blacs_env_tensor)
729 CALL create_mat_munu(bs_env%mat_ao_ao_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
730 blacs_env_tensor, do_ri_aux_basis=.false.)
732 CALL create_mat_munu(bs_env%mat_RI_RI_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
733 blacs_env_tensor, do_ri_aux_basis=.true.)
735 CALL create_mat_munu(bs_env%mat_RI_RI, qs_env, bs_env%eps_atom_grid_2d_mat, &
736 blacs_env, do_ri_aux_basis=.true.)
740 NULLIFY (bs_env%mat_chi_Gamma_tau)
743 DO i_t = 1, bs_env%num_time_freq_points
744 ALLOCATE (bs_env%mat_chi_Gamma_tau(i_t)%matrix)
745 CALL dbcsr_create(bs_env%mat_chi_Gamma_tau(i_t)%matrix, template=bs_env%mat_RI_RI%matrix)
748 CALL timestop(handle)
750 END SUBROUTINE allocate_matrices
756 SUBROUTINE allocate_gw_eigenvalues(bs_env)
759 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_GW_eigenvalues'
763 CALL timeset(routinen, handle)
765 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
766 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
768 CALL timestop(handle)
770 END SUBROUTINE allocate_gw_eigenvalues
777 SUBROUTINE create_tensors(qs_env, bs_env)
781 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors'
785 CALL timeset(routinen, handle)
787 CALL init_interaction_radii(bs_env)
791 CALL create_3c_t(bs_env%t_RI_AO__AO, bs_env%para_env_tensor,
"(RI AO | AO)", [1, 2], [3], &
792 bs_env%sizes_RI, bs_env%sizes_AO, &
793 create_nl_3c=.true., nl_3c=bs_env%nl_3c, qs_env=qs_env)
794 CALL create_3c_t(bs_env%t_RI__AO_AO, bs_env%para_env_tensor,
"(RI | AO AO)", [1], [2, 3], &
795 bs_env%sizes_RI, bs_env%sizes_AO)
797 CALL create_2c_t(bs_env, bs_env%sizes_RI, bs_env%sizes_AO)
799 CALL timestop(handle)
801 END SUBROUTINE create_tensors
808 SUBROUTINE check_sparsity_3c(qs_env, bs_env)
812 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_sparsity_3c'
814 INTEGER :: handle, n_atom_step, ri_atom
815 INTEGER(int_8) :: mem, non_zero_elements_sum, nze
816 REAL(
dp) :: max_dist_ao_atoms, occ, occupation_sum
817 REAL(kind=
dp) :: t1, t2
818 TYPE(dbt_type) :: t_3c_global
819 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_global_array
822 CALL timeset(routinen, handle)
826 CALL create_3c_t(t_3c_global, bs_env%para_env,
"(RI AO | AO)", [1, 2], [3], &
827 bs_env%sizes_RI, bs_env%sizes_AO, &
828 create_nl_3c=.true., nl_3c=nl_3c_global, qs_env=qs_env)
831 CALL bs_env%para_env%max(mem)
833 ALLOCATE (t_3c_global_array(1, 1))
834 CALL dbt_create(t_3c_global, t_3c_global_array(1, 1))
836 CALL bs_env%para_env%sync()
839 occupation_sum = 0.0_dp
840 non_zero_elements_sum = 0
841 max_dist_ao_atoms = 0.0_dp
842 n_atom_step = int(sqrt(real(bs_env%n_atom, kind=
dp)))
844 DO ri_atom = 1, bs_env%n_atom, n_atom_step
850 int_eps=bs_env%eps_filter, &
851 basis_i=bs_env%basis_set_RI, &
852 basis_j=bs_env%basis_set_AO, &
853 basis_k=bs_env%basis_set_AO, &
854 bounds_i=[ri_atom, min(ri_atom + n_atom_step - 1, bs_env%n_atom)], &
855 potential_parameter=bs_env%ri_metric, &
856 desymmetrize=.false.)
858 CALL dbt_filter(t_3c_global_array(1, 1), bs_env%eps_filter)
860 CALL bs_env%para_env%sync()
863 non_zero_elements_sum = non_zero_elements_sum + nze
864 occupation_sum = occupation_sum + occ
866 CALL get_max_dist_ao_atoms(t_3c_global_array(1, 1), max_dist_ao_atoms, qs_env)
868 CALL dbt_clear(t_3c_global_array(1, 1))
874 bs_env%occupation_3c_int = occupation_sum
875 bs_env%max_dist_AO_atoms = max_dist_ao_atoms
877 CALL dbt_destroy(t_3c_global)
878 CALL dbt_destroy(t_3c_global_array(1, 1))
879 DEALLOCATE (t_3c_global_array)
883 IF (bs_env%unit_nr > 0)
THEN
884 WRITE (bs_env%unit_nr,
'(T2,A)')
''
885 WRITE (bs_env%unit_nr,
'(T2,A,F27.1,A)') &
886 µν
'Computed 3-center integrals (|P), execution time', t2 - t1,
' s'
887 WRITE (bs_env%unit_nr,
'(T2,A,F48.3,A)') µν
'Percentage of non-zero (|P)', &
888 occupation_sum*100,
' %'
889 WRITE (bs_env%unit_nr,
'(T2,A,F33.1,A)') µνµν
'Max. distance between , in non-zero (|P)', &
891 WRITE (bs_env%unit_nr,
'(T2,2A,I20,A)')
'Required memory if storing all 3-center ', &
892 µν
'integrals (|P)', int(real(non_zero_elements_sum, kind=
dp)*8.0e-9_dp),
' GB'
895 CALL timestop(handle)
897 END SUBROUTINE check_sparsity_3c
905 SUBROUTINE create_2c_t(bs_env, sizes_RI, sizes_AO)
907 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
909 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_2c_t'
912 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_1, dist_2
913 INTEGER,
DIMENSION(2) :: pdims_2d
914 TYPE(dbt_pgrid_type) :: pgrid_2d
916 CALL timeset(routinen, handle)
921 CALL dbt_pgrid_create(bs_env%para_env_tensor, pdims_2d, pgrid_2d)
923 CALL create_2c_tensor(bs_env%t_G, dist_1, dist_2, pgrid_2d, sizes_ao, sizes_ao, &
925 DEALLOCATE (dist_1, dist_2)
926 CALL create_2c_tensor(bs_env%t_chi, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
928 DEALLOCATE (dist_1, dist_2)
929 CALL create_2c_tensor(bs_env%t_W, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
931 DEALLOCATE (dist_1, dist_2)
932 CALL dbt_pgrid_destroy(pgrid_2d)
934 CALL timestop(handle)
936 END SUBROUTINE create_2c_t
951 SUBROUTINE create_3c_t(tensor, para_env, tensor_name, map1, map2, sizes_RI, sizes_AO, &
952 create_nl_3c, nl_3c, qs_env)
955 CHARACTER(LEN=12) :: tensor_name
956 INTEGER,
DIMENSION(:) :: map1, map2
957 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
958 LOGICAL,
OPTIONAL :: create_nl_3c
962 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_3c_t'
964 INTEGER :: handle, nkind
965 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri
966 INTEGER,
DIMENSION(3) :: pcoord, pdims, pdims_3d
967 LOGICAL :: my_create_nl_3c
968 TYPE(dbt_pgrid_type) :: pgrid_3d
973 CALL timeset(routinen, handle)
976 CALL dbt_pgrid_create(para_env, pdims_3d, pgrid_3d)
978 pgrid_3d, sizes_ri, sizes_ao, sizes_ao, &
979 map1=map1, map2=map2, name=tensor_name)
981 IF (
PRESENT(create_nl_3c))
THEN
982 my_create_nl_3c = create_nl_3c
984 my_create_nl_3c = .false.
987 IF (my_create_nl_3c)
THEN
988 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
989 CALL dbt_mp_environ_pgrid(pgrid_3d, pdims, pcoord)
990 CALL mp_comm_t3c_2%create(pgrid_3d%mp_comm_2d, 3, pdims)
992 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
995 qs_env%bs_env%basis_set_RI, &
996 qs_env%bs_env%basis_set_AO, &
997 qs_env%bs_env%basis_set_AO, &
998 dist_3d, qs_env%bs_env%ri_metric, &
999 "GW_3c_nl", qs_env, own_dist=.true.)
1002 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
1003 CALL dbt_pgrid_destroy(pgrid_3d)
1005 CALL timestop(handle)
1007 END SUBROUTINE create_3c_t
1013 SUBROUTINE init_interaction_radii(bs_env)
1016 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_interaction_radii'
1018 INTEGER :: handle, ibasis
1021 CALL timeset(routinen, handle)
1023 DO ibasis = 1,
SIZE(bs_env%basis_set_AO)
1025 orb_basis => bs_env%basis_set_AO(ibasis)%gto_basis_set
1028 ri_basis => bs_env%basis_set_RI(ibasis)%gto_basis_set
1033 CALL timestop(handle)
1035 END SUBROUTINE init_interaction_radii
1043 SUBROUTINE get_max_dist_ao_atoms(t_3c_int, max_dist_AO_atoms, qs_env)
1044 TYPE(dbt_type) :: t_3c_int
1045 REAL(kind=
dp) :: max_dist_ao_atoms
1048 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_max_dist_AO_atoms'
1050 INTEGER :: atom_1, atom_2, handle, num_cells
1051 INTEGER,
DIMENSION(3) :: atom_ind
1052 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1053 REAL(kind=
dp) :: abs_rab
1054 REAL(kind=
dp),
DIMENSION(3) :: rab
1056 TYPE(dbt_iterator_type) :: iter
1060 CALL timeset(routinen, handle)
1062 NULLIFY (cell, particle_set, para_env)
1063 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, para_env=para_env)
1068 CALL dbt_iterator_start(iter, t_3c_int)
1069 DO WHILE (dbt_iterator_blocks_left(iter))
1070 CALL dbt_iterator_next_block(iter, atom_ind)
1072 atom_1 = atom_ind(2)
1073 atom_2 = atom_ind(3)
1075 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
1077 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
1079 max_dist_ao_atoms = max(max_dist_ao_atoms, abs_rab)
1082 CALL dbt_iterator_stop(iter)
1085 CALL para_env%max(max_dist_ao_atoms)
1087 CALL timestop(handle)
1089 END SUBROUTINE get_max_dist_ao_atoms
1095 SUBROUTINE set_sparsity_parallelization_parameters(bs_env)
1098 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_sparsity_parallelization_parameters'
1100 INTEGER :: handle, i_ivl, il_ivl, j_ivl, n_atom_per_il_ivl, n_atom_per_ivl, n_intervals_i, &
1101 n_intervals_inner_loop_atoms, n_intervals_j, u
1102 INTEGER(KIND=int_8) :: input_memory_per_proc
1104 CALL timeset(routinen, handle)
1107 bs_env%safety_factor_memory = 0.10_dp
1109 input_memory_per_proc = int(bs_env%input_memory_per_proc_GB*1.0e9_dp, kind=
int_8)
1115 n_atom_per_ivl = int(sqrt(bs_env%safety_factor_memory*input_memory_per_proc &
1116 *bs_env%group_size_tensor/24/bs_env%n_RI &
1117 /sqrt(bs_env%occupation_3c_int)))/bs_env%max_AO_bf_per_atom
1119 n_intervals_i = (bs_env%n_atom_i - 1)/n_atom_per_ivl + 1
1120 n_intervals_j = (bs_env%n_atom_j - 1)/n_atom_per_ivl + 1
1122 bs_env%n_atom_per_interval_ij = n_atom_per_ivl
1123 bs_env%n_intervals_i = n_intervals_i
1124 bs_env%n_intervals_j = n_intervals_j
1126 ALLOCATE (bs_env%i_atom_intervals(2, n_intervals_i))
1127 ALLOCATE (bs_env%j_atom_intervals(2, n_intervals_j))
1129 DO i_ivl = 1, n_intervals_i
1130 bs_env%i_atom_intervals(1, i_ivl) = (i_ivl - 1)*n_atom_per_ivl + bs_env%atoms_i(1)
1131 bs_env%i_atom_intervals(2, i_ivl) = min(i_ivl*n_atom_per_ivl + bs_env%atoms_i(1) - 1, &
1135 DO j_ivl = 1, n_intervals_j
1136 bs_env%j_atom_intervals(1, j_ivl) = (j_ivl - 1)*n_atom_per_ivl + bs_env%atoms_j(1)
1137 bs_env%j_atom_intervals(2, j_ivl) = min(j_ivl*n_atom_per_ivl + bs_env%atoms_j(1) - 1, &
1141 ALLOCATE (bs_env%skip_Sigma_occ(n_intervals_i, n_intervals_j))
1142 ALLOCATE (bs_env%skip_Sigma_vir(n_intervals_i, n_intervals_j))
1143 bs_env%skip_Sigma_occ(:, :) = .false.
1144 bs_env%skip_Sigma_vir(:, :) = .false.
1149 n_atom_per_il_ivl = min(int(bs_env%safety_factor_memory*input_memory_per_proc &
1150 *bs_env%group_size_tensor/n_atom_per_ivl &
1151 /bs_env%max_AO_bf_per_atom &
1152 /bs_env%n_RI/8/sqrt(bs_env%occupation_3c_int) &
1153 /bs_env%max_AO_bf_per_atom), bs_env%n_atom)
1155 n_intervals_inner_loop_atoms = (bs_env%n_atom - 1)/n_atom_per_il_ivl + 1
1157 bs_env%n_atom_per_IL_interval = n_atom_per_il_ivl
1158 bs_env%n_intervals_inner_loop_atoms = n_intervals_inner_loop_atoms
1160 ALLOCATE (bs_env%inner_loop_atom_intervals(2, n_intervals_inner_loop_atoms))
1161 DO il_ivl = 1, n_intervals_inner_loop_atoms
1162 bs_env%inner_loop_atom_intervals(1, il_ivl) = (il_ivl - 1)*n_atom_per_il_ivl + 1
1163 bs_env%inner_loop_atom_intervals(2, il_ivl) = min(il_ivl*n_atom_per_il_ivl, bs_env%n_atom)
1168 WRITE (u,
'(T2,A)')
''
1169 WRITE (u,
'(T2,A,I33)') λντνλτ
'Number of i and j atoms in M_P(), N_Q():', n_atom_per_ivl
1170 WRITE (u,
'(T2,A,I18)') µλνµµνµλ
'Number of inner loop atoms for in M_P = sum_ (|P) G_', &
1174 CALL timestop(handle)
1176 END SUBROUTINE set_sparsity_parallelization_parameters
1183 SUBROUTINE check_for_restart_files(qs_env, bs_env)
1187 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_for_restart_files'
1189 CHARACTER(LEN=9) :: frmt
1190 CHARACTER(LEN=default_string_length) :: f_chi, f_s_n, f_s_p, f_s_x, f_w_t, &
1191 prefix, project_name
1192 INTEGER :: handle, i_spin, i_t_or_w, ind, n_spin, &
1193 num_time_freq_points
1194 LOGICAL :: chi_exists, sigma_neg_time_exists, &
1195 sigma_pos_time_exists, &
1196 sigma_x_spin_exists, w_time_exists
1200 CALL timeset(routinen, handle)
1202 num_time_freq_points = bs_env%num_time_freq_points
1203 n_spin = bs_env%n_spin
1205 ALLOCATE (bs_env%read_chi(num_time_freq_points))
1206 ALLOCATE (bs_env%calc_chi(num_time_freq_points))
1207 ALLOCATE (bs_env%Sigma_c_exists(num_time_freq_points, n_spin))
1215 WRITE (prefix,
'(2A)') trim(project_name),
"-RESTART_"
1216 bs_env%prefix = prefix
1218 bs_env%all_W_exist = .true.
1220 DO i_t_or_w = 1, num_time_freq_points
1222 IF (i_t_or_w < 10)
THEN
1223 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1224 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_0", i_t_or_w,
".matrix"
1225 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_0", i_t_or_w,
".matrix"
1226 ELSE IF (i_t_or_w < 100)
THEN
1227 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1228 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_", i_t_or_w,
".matrix"
1229 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_", i_t_or_w,
".matrix"
1231 cpabort(
'Please implement more than 99 time/frequency points.')
1234 INQUIRE (file=trim(f_chi), exist=chi_exists)
1235 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1237 bs_env%read_chi(i_t_or_w) = chi_exists
1238 bs_env%calc_chi(i_t_or_w) = .NOT. chi_exists
1240 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1243 DO i_spin = 1, n_spin
1245 ind = i_t_or_w + (i_spin - 1)*num_time_freq_points
1248 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1249 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_0", ind,
".matrix"
1250 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_0", ind,
".matrix"
1251 ELSE IF (i_t_or_w < 100)
THEN
1252 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1253 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_", ind,
".matrix"
1254 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_", ind,
".matrix"
1257 INQUIRE (file=trim(f_s_p), exist=sigma_pos_time_exists)
1258 INQUIRE (file=trim(f_s_n), exist=sigma_neg_time_exists)
1260 bs_env%Sigma_c_exists(i_t_or_w, i_spin) = sigma_pos_time_exists .AND. &
1261 sigma_neg_time_exists
1269 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix),
"W_freq_rtp",
"_0", 0,
".matrix"
1270 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1271 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1274 IF (bs_env%all_W_exist)
THEN
1275 bs_env%read_chi(:) = .false.
1276 bs_env%calc_chi(:) = .false.
1279 bs_env%Sigma_x_exists = .true.
1280 DO i_spin = 1, n_spin
1281 WRITE (f_s_x,
'(3A,I1,A)') trim(prefix), bs_env%Sigma_x_name,
"_0", i_spin,
".matrix"
1282 INQUIRE (file=trim(f_s_x), exist=sigma_x_spin_exists)
1283 bs_env%Sigma_x_exists = bs_env%Sigma_x_exists .AND. sigma_x_spin_exists
1286 CALL timestop(handle)
1288 END SUBROUTINE check_for_restart_files
1295 SUBROUTINE set_parallelization_parameters(qs_env, bs_env)
1299 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_parallelization_parameters'
1301 INTEGER :: color_sub, dummy_1, dummy_2, handle, &
1302 num_pe, num_t_groups, u
1303 INTEGER(KIND=int_8) :: mem
1306 CALL timeset(routinen, handle)
1310 num_pe = para_env%num_pe
1313 IF (bs_env%group_size_tensor < 0 .OR. bs_env%group_size_tensor > num_pe) &
1314 bs_env%group_size_tensor = num_pe
1317 IF (
modulo(num_pe, bs_env%group_size_tensor) .NE. 0)
THEN
1318 CALL find_good_group_size(num_pe, bs_env%group_size_tensor)
1322 color_sub = para_env%mepos/bs_env%group_size_tensor
1323 bs_env%tensor_group_color = color_sub
1325 ALLOCATE (bs_env%para_env_tensor)
1326 CALL bs_env%para_env_tensor%from_split(para_env, color_sub)
1328 num_t_groups = para_env%num_pe/bs_env%group_size_tensor
1329 bs_env%num_tensor_groups = num_t_groups
1331 CALL get_i_j_atoms(bs_env%atoms_i, bs_env%atoms_j, bs_env%n_atom_i, bs_env%n_atom_j, &
1334 ALLOCATE (bs_env%atoms_i_t_group(2, num_t_groups))
1335 ALLOCATE (bs_env%atoms_j_t_group(2, num_t_groups))
1336 DO color_sub = 0, num_t_groups - 1
1337 CALL get_i_j_atoms(bs_env%atoms_i_t_group(1:2, color_sub + 1), &
1338 bs_env%atoms_j_t_group(1:2, color_sub + 1), &
1339 dummy_1, dummy_2, color_sub, bs_env)
1343 CALL bs_env%para_env%max(mem)
1347 WRITE (u,
'(T2,A,I47)')
'Group size for tensor operations', bs_env%group_size_tensor
1348 IF (bs_env%group_size_tensor > 1 .AND. bs_env%n_atom < 5)
THEN
1349 WRITE (u,
'(T2,A)')
'The requested group size is > 1 which can lead to bad performance.'
1350 WRITE (u,
'(T2,A)')
'Using more memory per MPI process might improve performance.'
1351 WRITE (u,
'(T2,A)')
'(Also increase MEMORY_PER_PROC when using more memory per process.)'
1355 CALL timestop(handle)
1357 END SUBROUTINE set_parallelization_parameters
1364 SUBROUTINE find_good_group_size(num_pe, group_size)
1366 INTEGER :: num_pe, group_size
1368 CHARACTER(LEN=*),
PARAMETER :: routinen =
'find_good_group_size'
1370 INTEGER :: group_size_minus, group_size_orig, &
1371 group_size_plus, handle, i_diff
1373 CALL timeset(routinen, handle)
1375 group_size_orig = group_size
1377 DO i_diff = 1, num_pe
1379 group_size_minus = group_size - i_diff
1381 IF (
modulo(num_pe, group_size_minus) == 0 .AND. group_size_minus > 0)
THEN
1382 group_size = group_size_minus
1386 group_size_plus = group_size + i_diff
1388 IF (
modulo(num_pe, group_size_plus) == 0 .AND. group_size_plus <= num_pe)
THEN
1389 group_size = group_size_plus
1395 IF (group_size_orig == group_size) cpabort(
"Group size error")
1397 CALL timestop(handle)
1399 END SUBROUTINE find_good_group_size
1410 SUBROUTINE get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
1412 INTEGER,
DIMENSION(2) :: atoms_i, atoms_j
1413 INTEGER :: n_atom_i, n_atom_j, color_sub
1416 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atoms'
1418 INTEGER :: handle, i_atoms_per_group, i_group, &
1419 ipcol, ipcol_loop, iprow, iprow_loop, &
1420 j_atoms_per_group, npcol, nprow
1422 CALL timeset(routinen, handle)
1425 CALL square_mesh(nprow, npcol, bs_env%num_tensor_groups)
1428 DO ipcol_loop = 0, npcol - 1
1429 DO iprow_loop = 0, nprow - 1
1430 IF (i_group == color_sub)
THEN
1434 i_group = i_group + 1
1438 IF (
modulo(bs_env%n_atom, nprow) == 0)
THEN
1439 i_atoms_per_group = bs_env%n_atom/nprow
1441 i_atoms_per_group = bs_env%n_atom/nprow + 1
1444 IF (
modulo(bs_env%n_atom, npcol) == 0)
THEN
1445 j_atoms_per_group = bs_env%n_atom/npcol
1447 j_atoms_per_group = bs_env%n_atom/npcol + 1
1450 atoms_i(1) = iprow*i_atoms_per_group + 1
1451 atoms_i(2) = min((iprow + 1)*i_atoms_per_group, bs_env%n_atom)
1452 n_atom_i = atoms_i(2) - atoms_i(1) + 1
1454 atoms_j(1) = ipcol*j_atoms_per_group + 1
1455 atoms_j(2) = min((ipcol + 1)*j_atoms_per_group, bs_env%n_atom)
1456 n_atom_j = atoms_j(2) - atoms_j(1) + 1
1458 CALL timestop(handle)
1468 SUBROUTINE square_mesh(nprow, npcol, nproc)
1469 INTEGER :: nprow, npcol, nproc
1471 CHARACTER(LEN=*),
PARAMETER :: routinen =
'square_mesh'
1473 INTEGER :: gcd_max, handle, ipe, jpe
1475 CALL timeset(routinen, handle)
1478 DO ipe = 1, ceiling(sqrt(real(nproc,
dp)))
1480 IF (ipe*jpe .NE. nproc) cycle
1481 IF (
gcd(ipe, jpe) >= gcd_max)
THEN
1484 gcd_max =
gcd(ipe, jpe)
1488 CALL timestop(handle)
1490 END SUBROUTINE square_mesh
1497 SUBROUTINE set_heuristic_parameters(bs_env, qs_env)
1501 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
1503 INTEGER :: handle, u
1504 LOGICAL :: do_bvk_cell
1506 CALL timeset(routinen, handle)
1509 bs_env%num_points_per_magnitude = 200
1514 IF (sum(bs_env%periodic) .NE. 0 .OR. bs_env%num_time_freq_points >= 20)
THEN
1515 bs_env%regularization_minimax = 1.0e-6_dp
1517 bs_env%regularization_minimax = 0.0_dp
1520 bs_env%stabilize_exp = 70.0_dp
1521 bs_env%eps_atom_grid_2d_mat = 1.0e-50_dp
1524 bs_env%nparam_pade = 16
1528 bs_env%ri_metric%omega = 0.0_dp
1530 bs_env%ri_metric%filename =
"t_c_g.dat"
1532 bs_env%eps_eigval_mat_RI = 0.0_dp
1534 IF (bs_env%input_regularization_RI > -1.0e-12_dp)
THEN
1535 bs_env%regularization_RI = bs_env%input_regularization_RI
1540 bs_env%regularization_RI = 1.0e-2_dp
1543 IF (sum(bs_env%periodic) == 0) bs_env%regularization_RI = 0.0_dp
1551 rel_cutoff_trunc_coulomb_ri_x=0.5_dp, &
1552 cell_grid=bs_env%cell_grid_scf_desymm, &
1553 do_bvk_cell=do_bvk_cell)
1557 bs_env%heuristic_filter_factor = 1.0e-4
1561 WRITE (u, fmt=
"(T2,2A,F21.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1562 Σ
"operator in ^x:", bs_env%trunc_coulomb%cutoff_radius*
angstrom, Å
" "
1563 WRITE (u, fmt=
"(T2,2A,F15.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1564 "operator in RI metric:", bs_env%ri_metric%cutoff_radius*
angstrom, Å
" "
1565 WRITE (u, fmt=
"(T2,A,ES48.1)")
"Regularization parameter of RI ", bs_env%regularization_RI
1566 WRITE (u, fmt=
"(T2,A,I53)")
"Lattice sum size for V(k):", bs_env%size_lattice_sum_V
1569 CALL timestop(handle)
1571 END SUBROUTINE set_heuristic_parameters
1577 SUBROUTINE print_header_and_input_parameters(bs_env)
1581 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header_and_input_parameters'
1583 INTEGER :: handle, u
1585 CALL timeset(routinen, handle)
1590 WRITE (u,
'(T2,A)')
' '
1591 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1592 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1593 WRITE (u,
'(T2,A,A46,A32)')
'-',
'GW CALCULATION',
'-'
1594 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1595 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1596 WRITE (u,
'(T2,A)')
' '
1597 WRITE (u,
'(T2,A,I45)')
'Input: Number of time/freq. points', bs_env%num_time_freq_points
1598 WRITE (u,
"(T2,A,F44.1,A)") ωΣω
'Input: _max for fitting (i) (eV)', bs_env%freq_max_fit*
evolt
1599 WRITE (u,
'(T2,A,ES27.1)')
'Input: Filter threshold for sparse tensor operations', &
1601 WRITE (u,
"(T2,A,L55)")
'Input: Apply Hedin shift', bs_env%do_hedin_shift
1604 CALL timestop(handle)
1606 END SUBROUTINE print_header_and_input_parameters
1613 SUBROUTINE compute_v_xc(qs_env, bs_env)
1617 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_xc'
1619 INTEGER :: handle, img, ispin, myfun, nimages
1620 LOGICAL :: hf_present
1621 REAL(kind=
dp) :: energy_ex, energy_exc, energy_total, &
1623 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_ks_without_v_xc
1624 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp
1629 CALL timeset(routinen, handle)
1631 CALL get_qs_env(qs_env, input=input, energy=energy, dft_control=dft_control)
1634 nimages = dft_control%nimages
1635 dft_control%nimages = bs_env%nimages_scf
1643 hf_present = .false.
1644 IF (
ASSOCIATED(hf_section))
THEN
1647 IF (hf_present)
THEN
1654 energy_total = energy%total
1655 energy_exc = energy%exc
1656 energy_ex = energy%ex
1658 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1661 NULLIFY (mat_ks_without_v_xc)
1664 DO ispin = 1, bs_env%n_spin
1665 ALLOCATE (mat_ks_without_v_xc(ispin)%matrix)
1666 IF (hf_present)
THEN
1667 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix, &
1668 matrix_type=dbcsr_type_symmetric)
1670 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1676 ext_ks_matrix=mat_ks_without_v_xc)
1678 DO ispin = 1, bs_env%n_spin
1680 CALL cp_fm_create(bs_env%fm_V_xc_Gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1681 CALL copy_dbcsr_to_fm(mat_ks_without_v_xc(ispin)%matrix, bs_env%fm_V_xc_Gamma(ispin))
1685 beta=1.0_dp, matrix_b=bs_env%fm_ks_Gamma(ispin))
1694 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks_kp)
1696 ALLOCATE (bs_env%fm_V_xc_R(dft_control%nimages, bs_env%n_spin))
1697 DO ispin = 1, bs_env%n_spin
1698 DO img = 1, dft_control%nimages
1700 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1701 CALL cp_fm_create(bs_env%fm_V_xc_R(img, ispin), bs_env%fm_work_mo(1)%matrix_struct)
1704 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1711 energy%total = energy_total
1712 energy%exc = energy_exc
1713 energy%ex = energy_ex
1716 dft_control%nimages = nimages
1721 IF (hf_present)
THEN
1729 DO ispin = 1, bs_env%n_spin
1730 DO img = 1, dft_control%nimages
1732 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1735 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1740 CALL timestop(handle)
1742 END SUBROUTINE compute_v_xc
1748 SUBROUTINE setup_time_and_frequency_minimax_grid(bs_env)
1751 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_time_and_frequency_minimax_grid'
1753 INTEGER :: handle, homo, i_w, ierr, ispin, j_w, &
1754 n_mo, num_time_freq_points, u
1755 REAL(kind=
dp) :: e_max, e_max_ispin, e_min, e_min_ispin, &
1756 e_range, max_error_min
1757 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: points_and_weights
1759 CALL timeset(routinen, handle)
1762 num_time_freq_points = bs_env%num_time_freq_points
1764 ALLOCATE (bs_env%imag_freq_points(num_time_freq_points))
1765 ALLOCATE (bs_env%imag_time_points(num_time_freq_points))
1766 ALLOCATE (bs_env%imag_time_weights_freq_zero(num_time_freq_points))
1767 ALLOCATE (bs_env%weights_cos_t_to_w(num_time_freq_points, num_time_freq_points))
1768 ALLOCATE (bs_env%weights_cos_w_to_t(num_time_freq_points, num_time_freq_points))
1769 ALLOCATE (bs_env%weights_sin_t_to_w(num_time_freq_points, num_time_freq_points))
1774 DO ispin = 1, bs_env%n_spin
1775 homo = bs_env%n_occ(ispin)
1776 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1778 e_min_ispin = bs_env%eigenval_scf_Gamma(homo + 1, ispin) - &
1779 bs_env%eigenval_scf_Gamma(homo, ispin)
1780 e_max_ispin = bs_env%eigenval_scf_Gamma(n_mo, ispin) - &
1781 bs_env%eigenval_scf_Gamma(1, ispin)
1783 e_min_ispin = minval(bs_env%eigenval_scf(homo + 1, :, ispin)) - &
1784 maxval(bs_env%eigenval_scf(homo, :, ispin))
1785 e_max_ispin = maxval(bs_env%eigenval_scf(n_mo, :, ispin)) - &
1786 minval(bs_env%eigenval_scf(1, :, ispin))
1788 e_min = min(e_min, e_min_ispin)
1789 e_max = max(e_max, e_max_ispin)
1792 e_range = e_max/e_min
1794 ALLOCATE (points_and_weights(2*num_time_freq_points))
1797 IF (num_time_freq_points .LE. 20)
THEN
1805 bs_env%imag_freq_points(:) = points_and_weights(1:num_time_freq_points)*e_min
1808 bs_env%num_freq_points_fit = 0
1809 DO i_w = 1, num_time_freq_points
1810 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1811 bs_env%num_freq_points_fit = bs_env%num_freq_points_fit + 1
1816 ALLOCATE (bs_env%imag_freq_points_fit(bs_env%num_freq_points_fit))
1818 DO i_w = 1, num_time_freq_points
1819 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1821 bs_env%imag_freq_points_fit(j_w) = bs_env%imag_freq_points(i_w)
1827 IF (bs_env%num_freq_points_fit < bs_env%nparam_pade)
THEN
1828 bs_env%nparam_pade = bs_env%num_freq_points_fit
1832 IF (num_time_freq_points .LE. 20)
THEN
1838 bs_env%imag_time_points(:) = points_and_weights(1:num_time_freq_points)/(2.0_dp*e_min)
1839 bs_env%imag_time_weights_freq_zero(:) = points_and_weights(num_time_freq_points + 1:)/(e_min)
1841 DEALLOCATE (points_and_weights)
1845 WRITE (u,
'(T2,A)')
''
1846 WRITE (u,
'(T2,A,F55.2)')
'SCF direct band gap (eV)', e_min*
evolt
1847 WRITE (u,
'(T2,A,F53.2)')
'Max. SCF eigval diff. (eV)', e_max*
evolt
1848 WRITE (u,
'(T2,A,F55.2)')
'E-Range for minimax grid', e_range
1849 WRITE (u,
'(T2,A,I27)') é
'Number of Pad parameters for analytic continuation:', &
1851 WRITE (u,
'(T2,A)')
''
1861 bs_env%imag_time_points, &
1862 bs_env%weights_cos_t_to_w, &
1863 bs_env%imag_freq_points, &
1864 e_min, e_max, max_error_min, &
1865 bs_env%num_points_per_magnitude, &
1866 bs_env%regularization_minimax)
1870 bs_env%imag_time_points, &
1871 bs_env%weights_cos_w_to_t, &
1872 bs_env%imag_freq_points, &
1873 e_min, e_max, max_error_min, &
1874 bs_env%num_points_per_magnitude, &
1875 bs_env%regularization_minimax)
1879 bs_env%imag_time_points, &
1880 bs_env%weights_sin_t_to_w, &
1881 bs_env%imag_freq_points, &
1882 e_min, e_max, max_error_min, &
1883 bs_env%num_points_per_magnitude, &
1884 bs_env%regularization_minimax)
1886 CALL timestop(handle)
1888 END SUBROUTINE setup_time_and_frequency_minimax_grid
1895 SUBROUTINE setup_cells_3c(qs_env, bs_env)
1900 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_3c'
1902 INTEGER :: atom_i, atom_j, atom_k, cell_pair_count, handle, i, i_cell_x, i_cell_x_max, &
1903 i_cell_x_min, i_size, ikind, img, j, j_cell, j_cell_max, j_cell_y, j_cell_y_max, &
1904 j_cell_y_min, j_size, k_cell, k_cell_max, k_cell_z, k_cell_z_max, k_cell_z_min, k_size, &
1905 nimage_pairs_3c, nimages_3c, nimages_3c_max, nkind, u
1906 INTEGER(KIND=int_8) :: mem_occ_per_proc
1907 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_other_3c_images_max
1908 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c_max, nblocks_3c_max
1909 INTEGER,
DIMENSION(3) :: cell_index, n_max
1910 REAL(kind=
dp) :: avail_mem_per_proc_gb, cell_dist, cell_radius_3c, eps, exp_min_ao, &
1911 exp_min_ri, frobenius_norm, mem_3c_gb, mem_occ_per_proc_gb, radius_ao, radius_ao_product, &
1913 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: int_3c
1914 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: exp_ao, exp_ri
1916 CALL timeset(routinen, handle)
1920 exp_min_ri = 10.0_dp
1921 exp_min_ao = 10.0_dp
1930 DO i = 1,
SIZE(exp_ri, 1)
1931 DO j = 1,
SIZE(exp_ri, 2)
1932 IF (exp_ri(i, j) < exp_min_ri .AND. exp_ri(i, j) > 1e-3_dp) exp_min_ri = exp_ri(i, j)
1935 DO i = 1,
SIZE(exp_ao, 1)
1936 DO j = 1,
SIZE(exp_ao, 2)
1937 IF (exp_ao(i, j) < exp_min_ao .AND. exp_ao(i, j) > 1e-3_dp) exp_min_ao = exp_ao(i, j)
1943 eps = bs_env%eps_filter*bs_env%heuristic_filter_factor
1945 radius_ao = sqrt(-log(eps)/exp_min_ao)
1946 radius_ao_product = sqrt(-log(eps)/(2.0_dp*exp_min_ao))
1947 radius_ri = sqrt(-log(eps)/exp_min_ri)
1950 cell_radius_3c = radius_ao_product + radius_ri + bs_env%ri_metric%cutoff_radius
1952 n_max(1:3) = bs_env%periodic(1:3)*30
1963 DO i_cell_x = -n_max(1), n_max(1)
1964 DO j_cell_y = -n_max(2), n_max(2)
1965 DO k_cell_z = -n_max(3), n_max(3)
1967 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
1969 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
1971 IF (cell_dist < cell_radius_3c)
THEN
1972 nimages_3c_max = nimages_3c_max + 1
1973 i_cell_x_min = min(i_cell_x_min, i_cell_x)
1974 i_cell_x_max = max(i_cell_x_max, i_cell_x)
1975 j_cell_y_min = min(j_cell_y_min, j_cell_y)
1976 j_cell_y_max = max(j_cell_y_max, j_cell_y)
1977 k_cell_z_min = min(k_cell_z_min, k_cell_z)
1978 k_cell_z_max = max(k_cell_z_max, k_cell_z)
1987 ALLOCATE (index_to_cell_3c_max(nimages_3c_max, 3))
1990 DO i_cell_x = -n_max(1), n_max(1)
1991 DO j_cell_y = -n_max(2), n_max(2)
1992 DO k_cell_z = -n_max(3), n_max(3)
1994 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
1996 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
1998 IF (cell_dist < cell_radius_3c)
THEN
2000 index_to_cell_3c_max(img, 1:3) = cell_index(1:3)
2008 ALLOCATE (nblocks_3c_max(nimages_3c_max, nimages_3c_max))
2009 nblocks_3c_max(:, :) = 0
2012 DO j_cell = 1, nimages_3c_max
2013 DO k_cell = 1, nimages_3c_max
2015 cell_pair_count = cell_pair_count + 1
2018 IF (
modulo(cell_pair_count, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2020 DO atom_j = 1, bs_env%n_atom
2021 DO atom_k = 1, bs_env%n_atom
2022 DO atom_i = 1, bs_env%n_atom
2024 j_size = bs_env%i_ao_end_from_atom(atom_j) - bs_env%i_ao_start_from_atom(atom_j) + 1
2025 k_size = bs_env%i_ao_end_from_atom(atom_k) - bs_env%i_ao_start_from_atom(atom_k) + 1
2026 i_size = bs_env%i_RI_end_from_atom(atom_i) - bs_env%i_RI_start_from_atom(atom_i) + 1
2028 ALLOCATE (int_3c(j_size, k_size, i_size))
2033 basis_j=bs_env%basis_set_AO, &
2034 basis_k=bs_env%basis_set_AO, &
2035 basis_i=bs_env%basis_set_RI, &
2036 cell_j=index_to_cell_3c_max(j_cell, 1:3), &
2037 cell_k=index_to_cell_3c_max(k_cell, 1:3), &
2038 atom_k=atom_k, atom_j=atom_j, atom_i=atom_i)
2040 frobenius_norm = sqrt(sum(int_3c(:, :, :)**2))
2046 IF (frobenius_norm > eps)
THEN
2047 nblocks_3c_max(j_cell, k_cell) = nblocks_3c_max(j_cell, k_cell) + 1
2057 CALL bs_env%para_env%sum(nblocks_3c_max)
2059 ALLOCATE (n_other_3c_images_max(nimages_3c_max))
2060 n_other_3c_images_max(:) = 0
2065 DO j_cell = 1, nimages_3c_max
2066 DO k_cell = 1, nimages_3c_max
2067 IF (nblocks_3c_max(j_cell, k_cell) > 0)
THEN
2068 n_other_3c_images_max(j_cell) = n_other_3c_images_max(j_cell) + 1
2069 nimage_pairs_3c = nimage_pairs_3c + 1
2073 IF (n_other_3c_images_max(j_cell) > 0) nimages_3c = nimages_3c + 1
2077 bs_env%nimages_3c = nimages_3c
2078 ALLOCATE (bs_env%index_to_cell_3c(nimages_3c, 3))
2079 ALLOCATE (bs_env%cell_to_index_3c(i_cell_x_min:i_cell_x_max, &
2080 j_cell_y_min:j_cell_y_max, &
2081 k_cell_z_min:k_cell_z_max))
2082 bs_env%cell_to_index_3c(:, :, :) = -1
2084 ALLOCATE (bs_env%nblocks_3c(nimages_3c, nimages_3c))
2085 bs_env%nblocks_3c(nimages_3c, nimages_3c) = 0
2088 DO j_cell_max = 1, nimages_3c_max
2089 IF (n_other_3c_images_max(j_cell_max) == 0) cycle
2091 cell_index(1:3) = index_to_cell_3c_max(j_cell_max, 1:3)
2092 bs_env%index_to_cell_3c(j_cell, 1:3) = cell_index(1:3)
2093 bs_env%cell_to_index_3c(cell_index(1), cell_index(2), cell_index(3)) = j_cell
2096 DO k_cell_max = 1, nimages_3c_max
2097 IF (n_other_3c_images_max(k_cell_max) == 0) cycle
2100 bs_env%nblocks_3c(j_cell, k_cell) = nblocks_3c_max(j_cell_max, k_cell_max)
2106 mem_3c_gb = real(bs_env%n_RI, kind=
dp)*real(bs_env%n_ao, kind=
dp)**2 &
2107 *real(nimage_pairs_3c, kind=
dp)*8e-9_dp
2110 CALL bs_env%para_env%max(mem_occ_per_proc)
2112 mem_occ_per_proc_gb = real(mem_occ_per_proc, kind=
dp)/1.0e9_dp
2115 avail_mem_per_proc_gb = bs_env%input_memory_per_proc_GB - mem_occ_per_proc_gb
2118 bs_env%group_size_tensor = max(int(mem_3c_gb/avail_mem_per_proc_gb + 1.0_dp), 1)
2123 WRITE (u, fmt=
"(T2,A,F52.1,A)")
"Radius of atomic orbitals", radius_ao*
angstrom, Å
" "
2124 WRITE (u, fmt=
"(T2,A,F55.1,A)")
"Radius of RI functions", radius_ri*
angstrom, Å
" "
2125 WRITE (u, fmt=
"(T2,A,I47)")
"Number of cells for 3c integrals", nimages_3c
2126 WRITE (u, fmt=
"(T2,A,I42)")
"Number of cell pairs for 3c integrals", nimage_pairs_3c
2127 WRITE (u,
'(T2,A)')
''
2128 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
2129 bs_env%input_memory_per_proc_GB,
' GB'
2130 WRITE (u,
'(T2,A,F35.1,A)')
'Used memory per MPI process before GW run', &
2131 mem_occ_per_proc_gb,
' GB'
2132 WRITE (u,
'(T2,A,F44.1,A)')
'Memory of three-center integrals', mem_3c_gb,
' GB'
2135 CALL timestop(handle)
2137 END SUBROUTINE setup_cells_3c
2149 SUBROUTINE sum_two_r_grids(index_to_cell_1, index_to_cell_2, nimages_1, nimages_2, &
2150 index_to_cell, cell_to_index, nimages)
2152 INTEGER,
DIMENSION(:, :) :: index_to_cell_1, index_to_cell_2
2153 INTEGER :: nimages_1, nimages_2
2154 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
2155 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2158 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_two_R_grids'
2160 INTEGER :: handle, i_dim, img_1, img_2, nimages_max
2161 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_tmp
2162 INTEGER,
DIMENSION(3) :: cell_1, cell_2, r, r_max, r_min
2164 CALL timeset(routinen, handle)
2167 r_min(i_dim) = minval(index_to_cell_1(:, i_dim)) + minval(index_to_cell_2(:, i_dim))
2168 r_max(i_dim) = maxval(index_to_cell_1(:, i_dim)) + maxval(index_to_cell_2(:, i_dim))
2171 nimages_max = (r_max(1) - r_min(1) + 1)*(r_max(2) - r_min(2) + 1)*(r_max(3) - r_min(3) + 1)
2173 ALLOCATE (index_to_cell_tmp(nimages_max, 3))
2174 index_to_cell_tmp(:, :) = -1
2176 ALLOCATE (cell_to_index(r_min(1):r_max(1), r_min(2):r_max(2), r_min(3):r_max(3)))
2177 cell_to_index(:, :, :) = -1
2181 DO img_1 = 1, nimages_1
2183 DO img_2 = 1, nimages_2
2185 cell_1(1:3) = index_to_cell_1(img_1, 1:3)
2186 cell_2(1:3) = index_to_cell_2(img_2, 1:3)
2188 r(1:3) = cell_1(1:3) + cell_2(1:3)
2191 IF (cell_to_index(r(1), r(2), r(3)) == -1)
THEN
2193 nimages = nimages + 1
2194 cell_to_index(r(1), r(2), r(3)) = nimages
2195 index_to_cell_tmp(nimages, 1:3) = r(1:3)
2203 ALLOCATE (index_to_cell(nimages, 3))
2204 index_to_cell(:, :) = index_to_cell_tmp(1:nimages, 1:3)
2206 CALL timestop(handle)
2208 END SUBROUTINE sum_two_r_grids
2215 SUBROUTINE compute_3c_integrals(qs_env, bs_env)
2220 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
2222 INTEGER :: handle, j_cell, k_cell, nimages_3c
2224 CALL timeset(routinen, handle)
2226 nimages_3c = bs_env%nimages_3c
2227 ALLOCATE (bs_env%t_3c_int(nimages_3c, nimages_3c))
2228 DO j_cell = 1, nimages_3c
2229 DO k_cell = 1, nimages_3c
2230 CALL dbt_create(bs_env%t_RI_AO__AO, bs_env%t_3c_int(j_cell, k_cell))
2235 bs_env%eps_filter, &
2238 int_eps=bs_env%eps_filter*0.05_dp, &
2239 basis_i=bs_env%basis_set_RI, &
2240 basis_j=bs_env%basis_set_AO, &
2241 basis_k=bs_env%basis_set_AO, &
2242 potential_parameter=bs_env%ri_metric, &
2243 desymmetrize=.false., do_kpoints=.true., cell_sym=.true., &
2244 cell_to_index_ext=bs_env%cell_to_index_3c)
2246 CALL bs_env%para_env%sync()
2248 CALL timestop(handle)
2250 END SUBROUTINE compute_3c_integrals
2258 SUBROUTINE get_cell_dist(cell_index, hmat, cell_dist)
2260 INTEGER,
DIMENSION(3) :: cell_index
2261 REAL(kind=
dp) :: hmat(3, 3), cell_dist
2263 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_cell_dist'
2265 INTEGER :: handle, i_dim
2266 INTEGER,
DIMENSION(3) :: cell_index_adj
2267 REAL(kind=
dp) :: cell_dist_3(3)
2269 CALL timeset(routinen, handle)
2274 IF (cell_index(i_dim) > 0) cell_index_adj(i_dim) = cell_index(i_dim) - 1
2275 IF (cell_index(i_dim) < 0) cell_index_adj(i_dim) = cell_index(i_dim) + 1
2276 IF (cell_index(i_dim) == 0) cell_index_adj(i_dim) = cell_index(i_dim)
2279 cell_dist_3(1:3) = matmul(hmat, real(cell_index_adj, kind=
dp))
2281 cell_dist = sqrt(abs(sum(cell_dist_3(1:3)**2)))
2283 CALL timestop(handle)
2285 END SUBROUTINE get_cell_dist
2294 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
2299 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
2301 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
2302 k_cell_z, nimages, nkp, u
2303 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
2308 CALL timeset(routinen, handle)
2313 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
2315 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
2316 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
2320 IF (bs_env%periodic(i_dim) == 1)
THEN
2321 cpassert(nkp_grid(i_dim) > 1)
2325 kpoints%kp_scheme =
"GENERAL"
2326 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
2328 bs_env%nkp_scf_desymm = nkp
2330 ALLOCATE (kpoints%xkp(1:3, nkp))
2333 ALLOCATE (kpoints%wkp(nkp))
2334 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
2338 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
2340 cixd(1:3) = cell_grid(1:3)/2
2342 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
2344 bs_env%nimages_scf_desymm = nimages
2346 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
2347 ALLOCATE (kpoints%index_to_cell(nimages, 3))
2350 DO i_cell_x = -cixd(1), cixd(1)
2351 DO j_cell_y = -cixd(2), cixd(2)
2352 DO k_cell_z = -cixd(3), cixd(3)
2354 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
2355 kpoints%index_to_cell(img, 1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2361 IF (u > 0 .AND. do_print)
THEN
2362 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
2365 CALL timestop(handle)
2367 END SUBROUTINE setup_kpoints_scf_desymm
2373 SUBROUTINE setup_cells_delta_r(bs_env)
2377 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_Delta_R'
2381 CALL timeset(routinen, handle)
2386 CALL sum_two_r_grids(bs_env%index_to_cell_3c, &
2387 bs_env%index_to_cell_3c, &
2388 bs_env%nimages_3c, bs_env%nimages_3c, &
2389 bs_env%index_to_cell_Delta_R, &
2390 bs_env%cell_to_index_Delta_R, &
2391 bs_env%nimages_Delta_R)
2393 IF (bs_env%unit_nr > 0)
THEN
2394 WRITE (bs_env%unit_nr, fmt=
"(T2,A,I61)") Δ
"Number of cells R", bs_env%nimages_Delta_R
2397 CALL timestop(handle)
2399 END SUBROUTINE setup_cells_delta_r
2405 SUBROUTINE setup_parallelization_delta_r(bs_env)
2409 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_parallelization_Delta_R'
2411 INTEGER :: handle, i_cell_delta_r, i_task_local, &
2413 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: i_cell_delta_r_group, &
2414 n_tensor_ops_delta_r
2416 CALL timeset(routinen, handle)
2418 CALL compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_delta_r)
2420 CALL compute_delta_r_dist(bs_env, n_tensor_ops_delta_r, i_cell_delta_r_group, n_tasks_local)
2422 bs_env%n_tasks_Delta_R_local = n_tasks_local
2424 ALLOCATE (bs_env%task_Delta_R(n_tasks_local))
2427 DO i_cell_delta_r = 1, bs_env%nimages_Delta_R
2429 IF (i_cell_delta_r_group(i_cell_delta_r) /= bs_env%tensor_group_color) cycle
2431 i_task_local = i_task_local + 1
2433 bs_env%task_Delta_R(i_task_local) = i_cell_delta_r
2437 ALLOCATE (bs_env%skip_DR_chi(n_tasks_local))
2438 bs_env%skip_DR_chi(:) = .false.
2439 ALLOCATE (bs_env%skip_DR_Sigma(n_tasks_local))
2440 bs_env%skip_DR_Sigma(:) = .false.
2442 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Goccx3c_chi, bs_env)
2443 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Gvirx3c_chi, bs_env)
2444 CALL allocate_skip_3xr(bs_env%skip_DR_R_R2_MxM_chi, bs_env)
2446 CALL allocate_skip_3xr(bs_env%skip_DR_R1_S2_Gx3c_Sigma, bs_env)
2447 CALL allocate_skip_3xr(bs_env%skip_DR_R1_R_MxM_Sigma, bs_env)
2449 CALL timestop(handle)
2451 END SUBROUTINE setup_parallelization_delta_r
2458 SUBROUTINE allocate_skip_3xr(skip, bs_env)
2459 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip
2462 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_skip_3xR'
2466 CALL timeset(routinen, handle)
2468 ALLOCATE (skip(bs_env%n_tasks_Delta_R_local, bs_env%nimages_3c, bs_env%nimages_scf_desymm))
2469 skip(:, :, :) = .false.
2471 CALL timestop(handle)
2473 END SUBROUTINE allocate_skip_3xr
2482 SUBROUTINE compute_delta_r_dist(bs_env, n_tensor_ops_Delta_R, i_cell_Delta_R_group, n_tasks_local)
2484 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r, &
2485 i_cell_delta_r_group
2486 INTEGER :: n_tasks_local
2488 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Delta_R_dist'
2490 INTEGER :: handle, i_delta_r_max_op, i_group_min, &
2492 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r_in_group
2494 CALL timeset(routinen, handle)
2496 nimages_delta_r = bs_env%nimages_Delta_R
2500 IF (u > 0 .AND. nimages_delta_r < bs_env%num_tensor_groups)
THEN
2501 WRITE (u, fmt=
"(T2,A,I5,A,I5,A)")
"There are only ", nimages_delta_r, &
2502 " tasks to work on but there are ", bs_env%num_tensor_groups,
" groups."
2503 WRITE (u, fmt=
"(T2,A)")
"Please reduce the number of MPI processes."
2504 WRITE (u,
'(T2,A)')
''
2507 ALLOCATE (n_tensor_ops_delta_r_in_group(bs_env%num_tensor_groups))
2508 n_tensor_ops_delta_r_in_group(:) = 0
2509 ALLOCATE (i_cell_delta_r_group(nimages_delta_r))
2510 i_cell_delta_r_group(:) = -1
2514 DO WHILE (any(n_tensor_ops_delta_r(:) .NE. 0))
2517 i_delta_r_max_op = maxloc(n_tensor_ops_delta_r, 1)
2520 i_group_min = minloc(n_tensor_ops_delta_r_in_group, 1)
2523 i_cell_delta_r_group(i_delta_r_max_op) = i_group_min - 1
2524 n_tensor_ops_delta_r_in_group(i_group_min) = n_tensor_ops_delta_r_in_group(i_group_min) + &
2525 n_tensor_ops_delta_r(i_delta_r_max_op)
2528 n_tensor_ops_delta_r(i_delta_r_max_op) = 0
2530 IF (bs_env%tensor_group_color == i_group_min - 1) n_tasks_local = n_tasks_local + 1
2534 CALL timestop(handle)
2536 END SUBROUTINE compute_delta_r_dist
2543 SUBROUTINE compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_Delta_R)
2545 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r
2547 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_n_tensor_ops_Delta_R'
2549 INTEGER :: handle, i_cell_delta_r, i_cell_r, i_cell_r1, i_cell_r1_minus_r, i_cell_r2, &
2550 i_cell_r2_m_r1, i_cell_s1, i_cell_s1_m_r1_p_r2, i_cell_s1_minus_r, i_cell_s2, &
2552 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, cell_r1_minus_r, cell_r2, &
2553 cell_r2_m_r1, cell_s1, cell_s1_m_r2_p_r1, cell_s1_minus_r, cell_s1_p_s2_m_r1, cell_s2
2554 LOGICAL :: cell_found
2556 CALL timeset(routinen, handle)
2558 nimages_delta_r = bs_env%nimages_Delta_R
2560 ALLOCATE (n_tensor_ops_delta_r(nimages_delta_r))
2561 n_tensor_ops_delta_r(:) = 0
2564 DO i_cell_delta_r = 1, nimages_delta_r
2566 IF (
modulo(i_cell_delta_r, bs_env%num_tensor_groups) /= bs_env%tensor_group_color) cycle
2568 DO i_cell_r1 = 1, bs_env%nimages_3c
2570 cell_r1(1:3) = bs_env%index_to_cell_3c(i_cell_r1, 1:3)
2571 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(i_cell_delta_r, 1:3)
2574 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
2575 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
2576 IF (.NOT. cell_found) cycle
2578 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
2580 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r2, 1:3)
2583 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
2584 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
2585 IF (.NOT. cell_found) cycle
2588 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
2589 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
2590 IF (.NOT. cell_found) cycle
2592 n_tensor_ops_delta_r(i_cell_delta_r) = n_tensor_ops_delta_r(i_cell_delta_r) + 1
2596 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
2598 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_s2, 1:3)
2599 cell_m_r1(1:3) = -cell_r1(1:3)
2600 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
2603 IF (.NOT. cell_found) cycle
2606 IF (.NOT. cell_found) cycle
2610 DO i_cell_r = 1, bs_env%nimages_scf_desymm
2612 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r, 1:3)
2615 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
2616 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
2617 IF (.NOT. cell_found) cycle
2620 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
2621 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
2622 IF (.NOT. cell_found) cycle
2630 CALL bs_env%para_env%sum(n_tensor_ops_delta_r)
2632 CALL timestop(handle)
2634 END SUBROUTINE compute_n_tensor_ops_delta_r
2646 SUBROUTINE add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, &
2647 cell_to_index, i_cell_1_plus_2)
2649 INTEGER,
DIMENSION(3) :: cell_1, cell_2
2650 INTEGER,
DIMENSION(:, :) :: index_to_cell
2651 INTEGER,
DIMENSION(3) :: cell_1_plus_2
2652 LOGICAL :: cell_found
2653 INTEGER,
DIMENSION(:, :, :),
INTENT(IN), &
2654 OPTIONAL,
POINTER :: cell_to_index
2655 INTEGER,
INTENT(OUT),
OPTIONAL :: i_cell_1_plus_2
2657 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_R'
2661 CALL timeset(routinen, handle)
2663 cell_1_plus_2(1:3) = cell_1(1:3) + cell_2(1:3)
2667 IF (
PRESENT(i_cell_1_plus_2))
THEN
2668 IF (cell_found)
THEN
2669 cpassert(
PRESENT(cell_to_index))
2670 i_cell_1_plus_2 = cell_to_index(cell_1_plus_2(1), cell_1_plus_2(2), cell_1_plus_2(3))
2672 i_cell_1_plus_2 = -1000
2676 CALL timestop(handle)
2678 END SUBROUTINE add_r
2687 INTEGER,
DIMENSION(3) :: cell
2688 INTEGER,
DIMENSION(:, :) :: index_to_cell
2689 LOGICAL :: cell_found
2691 CHARACTER(LEN=*),
PARAMETER :: routinen =
'is_cell_in_index_to_cell'
2693 INTEGER :: handle, i_cell, nimg
2694 INTEGER,
DIMENSION(3) :: cell_i
2696 CALL timeset(routinen, handle)
2698 nimg =
SIZE(index_to_cell, 1)
2700 cell_found = .false.
2704 cell_i(1:3) = index_to_cell(i_cell, 1:3)
2706 IF (cell_i(1) == cell(1) .AND. cell_i(2) == cell(2) .AND. cell_i(3) == cell(3))
THEN
2712 CALL timestop(handle)
2721 SUBROUTINE allocate_matrices_small_cell_full_kp(qs_env, bs_env)
2725 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_small_cell_full_kp'
2727 INTEGER :: handle, i_spin, i_t, img, n_spin, &
2728 nimages_scf, num_time_freq_points
2732 CALL timeset(routinen, handle)
2734 nimages_scf = bs_env%nimages_scf_desymm
2735 num_time_freq_points = bs_env%num_time_freq_points
2736 n_spin = bs_env%n_spin
2738 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2740 ALLOCATE (bs_env%fm_G_S(nimages_scf))
2741 ALLOCATE (bs_env%fm_Sigma_x_R(nimages_scf))
2742 ALLOCATE (bs_env%fm_chi_R_t(nimages_scf, num_time_freq_points))
2743 ALLOCATE (bs_env%fm_MWM_R_t(nimages_scf, num_time_freq_points))
2744 ALLOCATE (bs_env%fm_Sigma_c_R_neg_tau(nimages_scf, num_time_freq_points, n_spin))
2745 ALLOCATE (bs_env%fm_Sigma_c_R_pos_tau(nimages_scf, num_time_freq_points, n_spin))
2746 DO img = 1, nimages_scf
2747 CALL cp_fm_create(bs_env%fm_G_S(img), bs_env%fm_work_mo(1)%matrix_struct)
2748 CALL cp_fm_create(bs_env%fm_Sigma_x_R(img), bs_env%fm_work_mo(1)%matrix_struct)
2749 DO i_t = 1, num_time_freq_points
2750 CALL cp_fm_create(bs_env%fm_chi_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2751 CALL cp_fm_create(bs_env%fm_MWM_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2753 DO i_spin = 1, n_spin
2754 CALL cp_fm_create(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), &
2755 bs_env%fm_work_mo(1)%matrix_struct)
2756 CALL cp_fm_create(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), &
2757 bs_env%fm_work_mo(1)%matrix_struct)
2758 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), 0.0_dp)
2759 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), 0.0_dp)
2764 CALL timestop(handle)
2766 END SUBROUTINE allocate_matrices_small_cell_full_kp
2773 SUBROUTINE trafo_v_xc_r_to_kp(qs_env, bs_env)
2777 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_V_xc_R_to_kp'
2779 INTEGER :: handle, ikp, img, ispin, n_ao
2780 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2781 TYPE(
cp_cfm_type) :: cfm_mo_coeff, cfm_tmp, cfm_v_xc
2783 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
2788 CALL timeset(routinen, handle)
2792 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints_scf)
2795 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2797 CALL cp_cfm_create(cfm_v_xc, bs_env%cfm_work_mo%matrix_struct)
2798 CALL cp_cfm_create(cfm_mo_coeff, bs_env%cfm_work_mo%matrix_struct)
2799 CALL cp_cfm_create(cfm_tmp, bs_env%cfm_work_mo%matrix_struct)
2800 CALL cp_fm_create(fm_v_xc_re, bs_env%cfm_work_mo%matrix_struct)
2802 DO img = 1, bs_env%nimages_scf
2803 DO ispin = 1, bs_env%n_spin
2805 CALL dbcsr_set(matrix_ks(ispin, img)%matrix, 0.0_dp)
2806 CALL copy_fm_to_dbcsr(bs_env%fm_V_xc_R(img, ispin), matrix_ks(ispin, img)%matrix)
2810 ALLOCATE (bs_env%v_xc_n(n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
2812 DO ispin = 1, bs_env%n_spin
2813 DO ikp = 1, bs_env%nkp_bs_and_DOS
2816 CALL rsmat_to_kp(matrix_ks, ispin, bs_env%kpoints_DOS%xkp(1:3, ikp), &
2817 cell_to_index_scf, sab_nl, bs_env, cfm_v_xc)
2820 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
2844 CALL timestop(handle)
2846 END SUBROUTINE trafo_v_xc_r_to_kp
2853 SUBROUTINE heuristic_ri_regularization(qs_env, bs_env)
2857 CHARACTER(LEN=*),
PARAMETER :: routinen =
'heuristic_RI_regularization'
2859 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m
2860 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
2862 REAL(kind=
dp) :: cond_nr, cond_nr_max, max_ev, &
2863 max_ev_ikp, min_ev, min_ev_ikp
2864 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
2866 CALL timeset(routinen, handle)
2869 CALL get_v_tr_r(m_r, bs_env%ri_metric, 0.0_dp, bs_env, qs_env)
2871 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
2877 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2878 nkp_local = nkp_local + 1
2881 ALLOCATE (m(n_ri, n_ri, nkp_local))
2884 cond_nr_max = 0.0_dp
2891 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2893 ikp_local = ikp_local + 1
2897 bs_env%kpoints_scf_desymm%index_to_cell, &
2898 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
2901 CALL power(m(:, :, ikp_local), 1.0_dp, 0.0_dp, cond_nr, min_ev_ikp, max_ev_ikp)
2903 IF (cond_nr > cond_nr_max) cond_nr_max = cond_nr
2904 IF (max_ev_ikp > max_ev) max_ev = max_ev_ikp
2905 IF (min_ev_ikp < min_ev) min_ev = min_ev_ikp
2909 CALL bs_env%para_env%max(cond_nr_max)
2913 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Min. abs. eigenvalue of RI metric matrix M(k)", min_ev
2914 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Max. abs. eigenvalue of RI metric matrix M(k)", max_ev
2915 WRITE (u, fmt=
"(T2,A,ES50.1)")
"Max. condition number of M(k)", cond_nr_max
2918 CALL timestop(handle)
2920 END SUBROUTINE heuristic_ri_regularization
2930 SUBROUTINE get_v_tr_r(V_tr_R, pot_type, regularization_RI, bs_env, qs_env)
2931 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: v_tr_r
2933 REAL(kind=
dp) :: regularization_ri
2937 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_V_tr_R'
2939 INTEGER :: handle, img, nimages_scf_desymm
2940 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
2941 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
2943 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_v_tr_r
2945 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_v_tr_r
2950 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2952 CALL timeset(routinen, handle)
2954 NULLIFY (sab_ri, dist_2d)
2957 blacs_env=blacs_env, &
2958 distribution_2d=dist_2d, &
2959 qs_kind_set=qs_kind_set, &
2960 particle_set=particle_set)
2962 ALLOCATE (sizes_ri(bs_env%n_atom))
2963 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=bs_env%basis_set_RI)
2965 pot_type,
"2c_nl_RI", qs_env, sym_ij=.false., &
2968 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
2969 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
2970 row_bsize(:) = sizes_ri
2971 col_bsize(:) = sizes_ri
2973 nimages_scf_desymm = bs_env%nimages_scf_desymm
2974 ALLOCATE (mat_v_tr_r(nimages_scf_desymm))
2975 CALL dbcsr_create(mat_v_tr_r(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_no_symmetry, &
2976 row_bsize, col_bsize)
2977 DEALLOCATE (row_bsize, col_bsize)
2979 DO img = 2, nimages_scf_desymm
2980 CALL dbcsr_create(mat_v_tr_r(img), template=mat_v_tr_r(1))
2984 bs_env%basis_set_RI, pot_type, do_kpoints=.true., &
2985 ext_kpoints=bs_env%kpoints_scf_desymm, &
2986 regularization_ri=regularization_ri)
2988 ALLOCATE (fm_v_tr_r(nimages_scf_desymm))
2989 DO img = 1, nimages_scf_desymm
2990 CALL cp_fm_create(fm_v_tr_r(img), bs_env%fm_RI_RI%matrix_struct)
2995 IF (.NOT.
ALLOCATED(v_tr_r))
THEN
2996 ALLOCATE (v_tr_r(bs_env%n_RI, bs_env%n_RI, nimages_scf_desymm))
3005 CALL timestop(handle)
3018 SUBROUTINE power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
3019 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
3020 REAL(kind=
dp) :: exponent, eps
3021 REAL(kind=
dp),
OPTIONAL :: cond_nr, min_ev, max_ev
3023 CHARACTER(len=*),
PARAMETER :: routinen =
'power'
3025 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenvectors
3026 INTEGER :: handle, i, n
3027 REAL(kind=
dp) :: pos_eval
3028 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
3030 CALL timeset(routinen, handle)
3033 matrix(:, :) = 0.5_dp*(matrix(:, :) + conjg(transpose(matrix(:, :))))
3036 ALLOCATE (eigenvalues(n), eigenvectors(n, n))
3039 IF (
PRESENT(cond_nr)) cond_nr = maxval(abs(eigenvalues))/minval(abs(eigenvalues))
3040 IF (
PRESENT(min_ev)) min_ev = minval(abs(eigenvalues))
3041 IF (
PRESENT(max_ev)) max_ev = maxval(abs(eigenvalues))
3044 IF (eps < eigenvalues(i))
THEN
3045 pos_eval = (eigenvalues(i))**(0.5_dp*exponent)
3049 eigenvectors(:, i) = eigenvectors(:, i)*pos_eval
3052 CALL zgemm(
"N",
"C", n, n, n,
z_one, eigenvectors, n, eigenvectors, n,
z_zero, matrix, n)
3054 DEALLOCATE (eigenvalues, eigenvectors)
3056 CALL timestop(handle)
3058 END SUBROUTINE power
3069 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_n_time, sigma_c_n_freq
3072 CHARACTER(LEN=*),
PARAMETER :: routinen =
'time_to_freq'
3074 INTEGER :: handle, i_t, j_w, n_occ
3075 REAL(kind=
dp) :: freq_j, time_i, w_cos_ij, w_sin_ij
3076 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sigma_c_n_cos_time, sigma_c_n_sin_time
3078 CALL timeset(routinen, handle)
3080 ALLOCATE (sigma_c_n_cos_time(bs_env%n_ao, bs_env%num_time_freq_points))
3081 ALLOCATE (sigma_c_n_sin_time(bs_env%n_ao, bs_env%num_time_freq_points))
3083 sigma_c_n_cos_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) + sigma_c_n_time(:, :, 2))
3084 sigma_c_n_sin_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) - sigma_c_n_time(:, :, 2))
3086 sigma_c_n_freq(:, :, :) = 0.0_dp
3088 DO i_t = 1, bs_env%num_time_freq_points
3090 DO j_w = 1, bs_env%num_time_freq_points
3092 freq_j = bs_env%imag_freq_points(j_w)
3093 time_i = bs_env%imag_time_points(i_t)
3095 w_cos_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(freq_j*time_i)
3096 w_sin_ij = bs_env%weights_sin_t_to_w(j_w, i_t)*sin(freq_j*time_i)
3099 sigma_c_n_freq(:, j_w, 1) = sigma_c_n_freq(:, j_w, 1) + &
3100 w_cos_ij*sigma_c_n_cos_time(:, i_t)
3103 sigma_c_n_freq(:, j_w, 2) = sigma_c_n_freq(:, j_w, 2) + &
3104 w_sin_ij*sigma_c_n_sin_time(:, i_t)
3113 n_occ = bs_env%n_occ(ispin)
3114 sigma_c_n_freq(1:n_occ, :, 2) = -sigma_c_n_freq(1:n_occ, :, 2)
3116 CALL timestop(handle)
3131 eigenval_scf, ikp, ispin)
3134 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq
3135 REAL(kind=
dp),
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf
3136 INTEGER :: ikp, ispin
3138 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyt_conti_and_print'
3140 CHARACTER(len=3) :: occ_vir
3141 CHARACTER(len=default_string_length) :: fname
3142 INTEGER :: handle, i_mo, ikp_for_print, iunit, &
3144 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
3146 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dummy, sigma_c_ikp_n_qp
3148 CALL timeset(routinen, handle)
3151 ALLOCATE (dummy(n_mo), sigma_c_ikp_n_qp(n_mo))
3152 sigma_c_ikp_n_qp(:) = 0.0_dp
3157 IF (
modulo(i_mo, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3160 bs_env%imag_freq_points_fit, dummy, dummy, &
3161 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 1)*
z_one + &
3162 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 2)*
gaussi, &
3163 sigma_x_ikp_n(:) - v_xc_ikp_n(:), &
3164 eigenval_scf(:), eigenval_scf(:), &
3165 bs_env%do_hedin_shift, &
3166 i_mo, bs_env%n_occ(ispin), bs_env%n_vir(ispin), &
3167 bs_env%nparam_pade, bs_env%num_freq_points_fit, &
3169 0.0_dp, .true., .false., 1, e_fermi_ext=bs_env%e_fermi(ispin))
3172 CALL bs_env%para_env%sum(sigma_c_ikp_n_qp)
3174 CALL correct_obvious_fitting_fails(sigma_c_ikp_n_qp, ispin, bs_env)
3176 bs_env%eigenval_G0W0(:, ikp, ispin) = eigenval_scf(:) + &
3177 sigma_c_ikp_n_qp(:) + &
3178 sigma_x_ikp_n(:) - &
3181 bs_env%eigenval_HF(:, ikp, ispin) = eigenval_scf(:) + sigma_x_ikp_n(:) - v_xc_ikp_n(:)
3184 print_dos_kpoints = (bs_env%nkp_only_bs .LE. 0)
3186 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
3187 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
3189 IF (bs_env%para_env%is_source() .AND. print_ikp)
THEN
3191 IF (print_dos_kpoints)
THEN
3192 nkp = bs_env%nkp_only_DOS
3195 nkp = bs_env%nkp_only_bs
3196 ikp_for_print = ikp - bs_env%nkp_only_DOS
3199 fname =
"bandstructure_SCF_and_G0W0"
3201 IF (ikp_for_print == 1)
THEN
3202 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
3203 file_action=
"WRITE")
3205 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
3206 file_action=
"WRITE", file_position=
"APPEND")
3209 WRITE (iunit,
"(A)")
" "
3210 WRITE (iunit,
"(A10,I7,A25,3F10.4)")
"kpoint: ", ikp_for_print,
"coordinate: ", &
3211 bs_env%kpoints_DOS%xkp(:, ikp)
3212 WRITE (iunit,
"(A)")
" "
3213 WRITE (iunit,
"(A5,A12,3A17,A16,A18)")
"n",
"k", ϵ
"_nk^DFT (eV)", Σ
"^c_nk (eV)", &
3214 Σ
"^x_nk (eV)",
"v_nk^xc (eV)", ϵ
"_nk^G0W0 (eV)"
3215 WRITE (iunit,
"(A)")
" "
3218 IF (i_mo .LE. bs_env%n_occ(ispin)) occ_vir =
'occ'
3219 IF (i_mo > bs_env%n_occ(ispin)) occ_vir =
'vir'
3220 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', ikp_for_print, &
3221 eigenval_scf(i_mo)*
evolt, &
3222 sigma_c_ikp_n_qp(i_mo)*
evolt, &
3223 sigma_x_ikp_n(i_mo)*
evolt, &
3224 v_xc_ikp_n(i_mo)*
evolt, &
3225 bs_env%eigenval_G0W0(i_mo, ikp, ispin)*
evolt
3228 WRITE (iunit,
"(A)")
" "
3234 CALL timestop(handle)
3244 SUBROUTINE correct_obvious_fitting_fails(Sigma_c_ikp_n_qp, ispin, bs_env)
3245 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_c_ikp_n_qp
3249 CHARACTER(LEN=*),
PARAMETER :: routinen =
'correct_obvious_fitting_fails'
3251 INTEGER :: handle, homo, i_mo, j_mo, &
3252 n_levels_scissor, n_mo
3253 LOGICAL :: is_occ, is_vir
3254 REAL(kind=
dp) :: sum_sigma_c
3256 CALL timeset(routinen, handle)
3259 homo = bs_env%n_occ(ispin)
3264 IF (abs(sigma_c_ikp_n_qp(i_mo)) > 13.0_dp/
evolt)
THEN
3266 is_occ = (i_mo .LE. homo)
3267 is_vir = (i_mo > homo)
3269 n_levels_scissor = 0
3270 sum_sigma_c = 0.0_dp
3276 IF (is_occ .AND. j_mo > homo) cycle
3277 IF (is_vir .AND. j_mo .LE. homo) cycle
3278 IF (abs(i_mo - j_mo) > 10) cycle
3279 IF (i_mo == j_mo) cycle
3281 n_levels_scissor = n_levels_scissor + 1
3282 sum_sigma_c = sum_sigma_c + sigma_c_ikp_n_qp(j_mo)
3287 sigma_c_ikp_n_qp(i_mo) = sum_sigma_c/real(n_levels_scissor, kind=
dp)
3293 CALL timestop(handle)
3295 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.
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.