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
132#include "base/base_uses.f90"
142 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_utils'
157 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env_for_gw'
161 CALL timeset(routinen, handle)
165 CALL read_gw_input_parameters(bs_env, bs_sec)
167 CALL print_header_and_input_parameters(bs_env)
169 CALL setup_ao_and_ri_basis_set(qs_env, bs_env)
171 CALL get_ri_basis_and_basis_function_indices(qs_env, bs_env)
173 CALL set_heuristic_parameters(bs_env, qs_env)
177 CALL setup_kpoints_chi_eps_w(bs_env, bs_env%kpoints_chi_eps_W)
180 CALL setup_cells_3c(qs_env, bs_env)
183 CALL set_parallelization_parameters(qs_env, bs_env)
185 CALL allocate_matrices(qs_env, bs_env)
187 CALL compute_v_xc(qs_env, bs_env)
189 CALL create_tensors(qs_env, bs_env)
191 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
194 CALL allocate_gw_eigenvalues(bs_env)
196 CALL check_sparsity_3c(qs_env, bs_env)
198 CALL set_sparsity_parallelization_parameters(bs_env)
200 CALL check_for_restart_files(qs_env, bs_env)
204 CALL compute_3c_integrals(qs_env, bs_env)
206 CALL setup_cells_delta_r(bs_env)
208 CALL setup_parallelization_delta_r(bs_env)
210 CALL allocate_matrices_small_cell_full_kp(qs_env, bs_env)
212 CALL trafo_v_xc_r_to_kp(qs_env, bs_env)
214 CALL heuristic_ri_regularization(qs_env, bs_env)
218 CALL setup_time_and_frequency_minimax_grid(bs_env)
226 IF (.NOT. bs_env%do_ldos .AND. .false.)
THEN
230 CALL timestop(handle)
241 CHARACTER(LEN=*),
PARAMETER :: routinen =
'de_init_bs_env'
245 CALL timeset(routinen, handle)
251 IF (
ASSOCIATED(bs_env%nl_3c%ij_list) .AND. (bs_env%rtp_method ==
rtp_method_bse))
THEN
252 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr, *)
"Retaining nl_3c for RTBSE"
259 CALL timestop(handle)
268 SUBROUTINE read_gw_input_parameters(bs_env, bs_sec)
272 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_gw_input_parameters'
277 CALL timeset(routinen, handle)
285 CALL section_vals_val_get(gw_sec,
"REGULARIZATION_MINIMAX", r_val=bs_env%input_regularization_minimax)
294 CALL timestop(handle)
296 END SUBROUTINE read_gw_input_parameters
303 SUBROUTINE setup_ao_and_ri_basis_set(qs_env, bs_env)
307 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_AO_and_RI_basis_set'
309 INTEGER :: handle, natom, nkind
311 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
313 CALL timeset(routinen, handle)
316 qs_kind_set=qs_kind_set, &
317 particle_set=particle_set, &
318 natom=natom, nkind=nkind)
321 ALLOCATE (bs_env%sizes_RI(natom), bs_env%sizes_AO(natom))
322 ALLOCATE (bs_env%basis_set_RI(nkind), bs_env%basis_set_AO(nkind))
328 basis=bs_env%basis_set_RI)
330 basis=bs_env%basis_set_AO)
332 CALL timestop(handle)
334 END SUBROUTINE setup_ao_and_ri_basis_set
341 SUBROUTINE get_ri_basis_and_basis_function_indices(qs_env, bs_env)
345 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_RI_basis_and_basis_function_indices'
347 INTEGER :: handle, i_ri, iatom, ikind, iset, &
348 max_ao_bf_per_atom, n_ao_test, n_atom, &
349 n_kind, n_ri, nset, nsgf, u
350 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
351 INTEGER,
DIMENSION(:),
POINTER :: l_max, l_min, nsgf_set
354 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
356 CALL timeset(routinen, handle)
359 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
361 n_kind =
SIZE(qs_kind_set)
362 n_atom = bs_env%n_atom
367 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
369 IF (.NOT.
ASSOCIATED(basis_set_a))
THEN
370 CALL cp_abort(__location__, &
371 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section.")
375 ALLOCATE (bs_env%i_RI_start_from_atom(n_atom))
376 ALLOCATE (bs_env%i_RI_end_from_atom(n_atom))
377 ALLOCATE (bs_env%i_ao_start_from_atom(n_atom))
378 ALLOCATE (bs_env%i_ao_end_from_atom(n_atom))
382 bs_env%i_RI_start_from_atom(iatom) = n_ri + 1
383 ikind = kind_of(iatom)
384 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
386 bs_env%i_RI_end_from_atom(iatom) = n_ri
390 max_ao_bf_per_atom = 0
393 bs_env%i_ao_start_from_atom(iatom) = n_ao_test + 1
394 ikind = kind_of(iatom)
395 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"ORB")
396 n_ao_test = n_ao_test + nsgf
397 bs_env%i_ao_end_from_atom(iatom) = n_ao_test
398 max_ao_bf_per_atom = max(max_ao_bf_per_atom, nsgf)
400 cpassert(n_ao_test == bs_env%n_ao)
401 bs_env%max_AO_bf_per_atom = max_ao_bf_per_atom
403 ALLOCATE (bs_env%l_RI(n_ri))
406 ikind = kind_of(iatom)
408 nset = bs_env%basis_set_RI(ikind)%gto_basis_set%nset
409 l_max => bs_env%basis_set_RI(ikind)%gto_basis_set%lmax
410 l_min => bs_env%basis_set_RI(ikind)%gto_basis_set%lmin
411 nsgf_set => bs_env%basis_set_RI(ikind)%gto_basis_set%nsgf_set
414 cpassert(l_max(iset) == l_min(iset))
415 bs_env%l_RI(i_ri + 1:i_ri + nsgf_set(iset)) = l_max(iset)
416 i_ri = i_ri + nsgf_set(iset)
420 cpassert(i_ri == n_ri)
425 WRITE (u, fmt=
"(T2,A)")
" "
426 WRITE (u, fmt=
"(T2,2A,T75,I8)")
"Number of auxiliary Gaussian basis functions ", &
430 CALL timestop(handle)
432 END SUBROUTINE get_ri_basis_and_basis_function_indices
439 SUBROUTINE setup_kpoints_chi_eps_w(bs_env, kpoints)
444 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_chi_eps_W'
446 INTEGER :: handle, i_dim, n_dim, nkp, nkp_extra, &
448 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
449 REAL(kind=
dp) :: exp_s_p, n_dim_inv
451 CALL timeset(routinen, handle)
457 kpoints%kp_scheme =
"GENERAL"
459 periodic(1:3) = bs_env%periodic(1:3)
461 cpassert(
SIZE(bs_env%nkp_grid_chi_eps_W_input) == 3)
463 IF (bs_env%nkp_grid_chi_eps_W_input(1) > 0 .AND. &
464 bs_env%nkp_grid_chi_eps_W_input(2) > 0 .AND. &
465 bs_env%nkp_grid_chi_eps_W_input(3) > 0)
THEN
468 SELECT CASE (periodic(i_dim))
471 nkp_grid_extra(i_dim) = 1
473 nkp_grid(i_dim) = bs_env%nkp_grid_chi_eps_W_input(i_dim)
474 nkp_grid_extra(i_dim) = nkp_grid(i_dim)*2
476 cpabort(
"Error in periodicity.")
480 ELSE IF (bs_env%nkp_grid_chi_eps_W_input(1) == -1 .AND. &
481 bs_env%nkp_grid_chi_eps_W_input(2) == -1 .AND. &
482 bs_env%nkp_grid_chi_eps_W_input(3) == -1)
THEN
487 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
489 SELECT CASE (periodic(i_dim))
492 nkp_grid_extra(i_dim) = 1
494 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
497 nkp_grid_extra(i_dim) = 6
499 nkp_grid(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*4
500 nkp_grid_extra(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*8
503 cpabort(
"Error in periodicity.")
510 cpabort(
"An error occured when setting up the k-mesh for W.")
514 nkp_orig = max(nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2, 1)
516 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
518 nkp = nkp_orig + nkp_extra
520 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
523 bs_env%nkp_grid_chi_eps_W_orig(1:3) = nkp_grid(1:3)
524 bs_env%nkp_grid_chi_eps_W_extra(1:3) = nkp_grid_extra(1:3)
525 bs_env%nkp_chi_eps_W_orig = nkp_orig
526 bs_env%nkp_chi_eps_W_extra = nkp_extra
527 bs_env%nkp_chi_eps_W_orig_plus_extra = nkp
529 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
530 ALLOCATE (bs_env%wkp_no_extra(nkp), bs_env%wkp_s_p(nkp))
532 CALL compute_xkp(kpoints%xkp, 1, nkp_orig, nkp_grid)
533 CALL compute_xkp(kpoints%xkp, nkp_orig + 1, nkp, nkp_grid_extra)
535 n_dim = sum(periodic)
538 kpoints%wkp(1) = 1.0_dp
539 bs_env%wkp_s_p(1) = 1.0_dp
540 bs_env%wkp_no_extra(1) = 1.0_dp
543 n_dim_inv = 1.0_dp/real(n_dim, kind=
dp)
546 CALL compute_wkp(kpoints%wkp(1:nkp_orig), nkp_orig, nkp_extra, n_dim_inv)
547 CALL compute_wkp(kpoints%wkp(nkp_orig + 1:nkp), nkp_extra, nkp_orig, n_dim_inv)
549 bs_env%wkp_no_extra(1:nkp_orig) = 0.0_dp
550 bs_env%wkp_no_extra(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=
dp)
555 exp_s_p = 2.0_dp*n_dim_inv
556 CALL compute_wkp(bs_env%wkp_s_p(1:nkp_orig), nkp_orig, nkp_extra, exp_s_p)
557 CALL compute_wkp(bs_env%wkp_s_p(nkp_orig + 1:nkp), nkp_extra, nkp_orig, exp_s_p)
559 bs_env%wkp_s_p(1:nkp) = bs_env%wkp_no_extra(1:nkp)
564 IF (bs_env%approx_kp_extrapol)
THEN
565 bs_env%wkp_orig = 1.0_dp/real(nkp_orig, kind=
dp)
571 bs_env%nkp_chi_eps_W_batch = 4
573 bs_env%num_chi_eps_W_batches = (bs_env%nkp_chi_eps_W_orig_plus_extra - 1)/ &
574 bs_env%nkp_chi_eps_W_batch + 1
579 WRITE (u, fmt=
"(T2,A)")
" "
580 WRITE (u, fmt=
"(T2,1A,T71,3I4)") χε
"K-point mesh 1 for , , W", nkp_grid(1:3)
581 WRITE (u, fmt=
"(T2,2A,T71,3I4)") χε
"K-point mesh 2 for , , W ", &
582 "(for k-point extrapolation of W)", nkp_grid_extra(1:3)
583 WRITE (u, fmt=
"(T2,A,T80,L)")
"Approximate the k-point extrapolation", &
584 bs_env%approx_kp_extrapol
587 CALL timestop(handle)
589 END SUBROUTINE setup_kpoints_chi_eps_w
601 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_init_cell_index_simple'
609 CALL timeset(routinen, handle)
611 NULLIFY (dft_control, para_env, sab_orb)
612 CALL get_qs_env(qs_env=qs_env, para_env=para_env, dft_control=dft_control, sab_orb=sab_orb)
615 CALL timestop(handle)
628 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
629 INTEGER :: ikp_start, ikp_end
630 INTEGER,
DIMENSION(3) :: grid
632 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
634 INTEGER :: handle, i, ix, iy, iz
636 CALL timeset(routinen, handle)
643 IF (i > ikp_end) cycle
645 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
646 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
647 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
654 CALL timestop(handle)
665 SUBROUTINE compute_wkp(wkp, nkp_1, nkp_2, exponent)
666 REAL(kind=
dp),
DIMENSION(:) :: wkp
667 INTEGER :: nkp_1, nkp_2
668 REAL(kind=
dp) :: exponent
670 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp'
673 REAL(kind=
dp) :: nkp_ratio
675 CALL timeset(routinen, handle)
677 nkp_ratio = real(nkp_2, kind=
dp)/real(nkp_1, kind=
dp)
679 wkp(:) = 1.0_dp/real(nkp_1, kind=
dp)/(1.0_dp - nkp_ratio**exponent)
681 CALL timestop(handle)
683 END SUBROUTINE compute_wkp
690 SUBROUTINE allocate_matrices(qs_env, bs_env)
694 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices'
696 INTEGER :: handle, i_t
701 CALL timeset(routinen, handle)
703 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
705 fm_struct => bs_env%fm_ks_Gamma(1)%matrix_struct
710 NULLIFY (fm_struct_ri_global)
711 CALL cp_fm_struct_create(fm_struct_ri_global, context=blacs_env, nrow_global=bs_env%n_RI, &
712 ncol_global=bs_env%n_RI, para_env=para_env)
714 CALL cp_fm_create(bs_env%fm_chi_Gamma_freq, fm_struct_ri_global)
715 CALL cp_fm_create(bs_env%fm_W_MIC_freq, fm_struct_ri_global)
716 IF (bs_env%approx_kp_extrapol)
THEN
717 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_extra, fm_struct_ri_global)
718 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_no_extra, fm_struct_ri_global)
725 NULLIFY (blacs_env_tensor)
732 CALL create_mat_munu(bs_env%mat_ao_ao_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
733 blacs_env_tensor, do_ri_aux_basis=.false.)
735 CALL create_mat_munu(bs_env%mat_RI_RI_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
736 blacs_env_tensor, do_ri_aux_basis=.true.)
738 CALL create_mat_munu(bs_env%mat_RI_RI, qs_env, bs_env%eps_atom_grid_2d_mat, &
739 blacs_env, do_ri_aux_basis=.true.)
743 NULLIFY (bs_env%mat_chi_Gamma_tau)
746 DO i_t = 1, bs_env%num_time_freq_points
747 ALLOCATE (bs_env%mat_chi_Gamma_tau(i_t)%matrix)
748 CALL dbcsr_create(bs_env%mat_chi_Gamma_tau(i_t)%matrix, template=bs_env%mat_RI_RI%matrix)
751 CALL timestop(handle)
753 END SUBROUTINE allocate_matrices
759 SUBROUTINE allocate_gw_eigenvalues(bs_env)
762 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_GW_eigenvalues'
766 CALL timeset(routinen, handle)
768 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
769 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
771 CALL timestop(handle)
773 END SUBROUTINE allocate_gw_eigenvalues
780 SUBROUTINE create_tensors(qs_env, bs_env)
784 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors'
788 CALL timeset(routinen, handle)
790 CALL init_interaction_radii(bs_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, &
796 create_nl_3c=.true., nl_3c=bs_env%nl_3c, qs_env=qs_env)
797 CALL create_3c_t(bs_env%t_RI__AO_AO, bs_env%para_env_tensor,
"(RI | AO AO)", [1], [2, 3], &
798 bs_env%sizes_RI, bs_env%sizes_AO)
800 CALL create_2c_t(bs_env, bs_env%sizes_RI, bs_env%sizes_AO)
802 CALL timestop(handle)
804 END SUBROUTINE create_tensors
811 SUBROUTINE check_sparsity_3c(qs_env, bs_env)
815 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_sparsity_3c'
817 INTEGER :: handle, n_atom_step, ri_atom
818 INTEGER(int_8) :: mem, non_zero_elements_sum, nze
819 REAL(
dp) :: max_dist_ao_atoms, occ, occupation_sum
820 REAL(kind=
dp) :: t1, t2
821 TYPE(dbt_type) :: t_3c_global
822 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_global_array
825 CALL timeset(routinen, handle)
829 CALL create_3c_t(t_3c_global, bs_env%para_env,
"(RI AO | AO)", [1, 2], [3], &
830 bs_env%sizes_RI, bs_env%sizes_AO, &
831 create_nl_3c=.true., nl_3c=nl_3c_global, qs_env=qs_env)
834 CALL bs_env%para_env%max(mem)
836 ALLOCATE (t_3c_global_array(1, 1))
837 CALL dbt_create(t_3c_global, t_3c_global_array(1, 1))
839 CALL bs_env%para_env%sync()
842 occupation_sum = 0.0_dp
843 non_zero_elements_sum = 0
844 max_dist_ao_atoms = 0.0_dp
845 n_atom_step = int(sqrt(real(bs_env%n_atom, kind=
dp)))
847 DO ri_atom = 1, bs_env%n_atom, n_atom_step
853 int_eps=bs_env%eps_filter, &
854 basis_i=bs_env%basis_set_RI, &
855 basis_j=bs_env%basis_set_AO, &
856 basis_k=bs_env%basis_set_AO, &
857 bounds_i=[ri_atom, min(ri_atom + n_atom_step - 1, bs_env%n_atom)], &
858 potential_parameter=bs_env%ri_metric, &
859 desymmetrize=.false.)
861 CALL dbt_filter(t_3c_global_array(1, 1), bs_env%eps_filter)
863 CALL bs_env%para_env%sync()
866 non_zero_elements_sum = non_zero_elements_sum + nze
867 occupation_sum = occupation_sum + occ
869 CALL get_max_dist_ao_atoms(t_3c_global_array(1, 1), max_dist_ao_atoms, qs_env)
871 CALL dbt_clear(t_3c_global_array(1, 1))
877 bs_env%occupation_3c_int = occupation_sum
878 bs_env%max_dist_AO_atoms = max_dist_ao_atoms
880 CALL dbt_destroy(t_3c_global)
881 CALL dbt_destroy(t_3c_global_array(1, 1))
882 DEALLOCATE (t_3c_global_array)
886 IF (bs_env%unit_nr > 0)
THEN
887 WRITE (bs_env%unit_nr,
'(T2,A)')
''
888 WRITE (bs_env%unit_nr,
'(T2,A,F27.1,A)') &
889 µν
'Computed 3-center integrals (|P), execution time', t2 - t1,
' s'
890 WRITE (bs_env%unit_nr,
'(T2,A,F48.3,A)') µν
'Percentage of non-zero (|P)', &
891 occupation_sum*100,
' %'
892 WRITE (bs_env%unit_nr,
'(T2,A,F33.1,A)') µνµν
'Max. distance between , in non-zero (|P)', &
894 WRITE (bs_env%unit_nr,
'(T2,2A,I20,A)')
'Required memory if storing all 3-center ', &
895 µν
'integrals (|P)', int(real(non_zero_elements_sum, kind=
dp)*8.0e-9_dp),
' GB'
898 CALL timestop(handle)
900 END SUBROUTINE check_sparsity_3c
908 SUBROUTINE create_2c_t(bs_env, sizes_RI, sizes_AO)
910 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
912 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_2c_t'
915 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_1, dist_2
916 INTEGER,
DIMENSION(2) :: pdims_2d
917 TYPE(dbt_pgrid_type) :: pgrid_2d
919 CALL timeset(routinen, handle)
924 CALL dbt_pgrid_create(bs_env%para_env_tensor, pdims_2d, pgrid_2d)
926 CALL create_2c_tensor(bs_env%t_G, dist_1, dist_2, pgrid_2d, sizes_ao, sizes_ao, &
928 DEALLOCATE (dist_1, dist_2)
929 CALL create_2c_tensor(bs_env%t_chi, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
931 DEALLOCATE (dist_1, dist_2)
932 CALL create_2c_tensor(bs_env%t_W, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
934 DEALLOCATE (dist_1, dist_2)
935 CALL dbt_pgrid_destroy(pgrid_2d)
937 CALL timestop(handle)
939 END SUBROUTINE create_2c_t
954 SUBROUTINE create_3c_t(tensor, para_env, tensor_name, map1, map2, sizes_RI, sizes_AO, &
955 create_nl_3c, nl_3c, qs_env)
958 CHARACTER(LEN=12) :: tensor_name
959 INTEGER,
DIMENSION(:) :: map1, map2
960 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
961 LOGICAL,
OPTIONAL :: create_nl_3c
965 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_3c_t'
967 INTEGER :: handle, nkind
968 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri
969 INTEGER,
DIMENSION(3) :: pcoord, pdims, pdims_3d
970 LOGICAL :: my_create_nl_3c
971 TYPE(dbt_pgrid_type) :: pgrid_3d
976 CALL timeset(routinen, handle)
979 CALL dbt_pgrid_create(para_env, pdims_3d, pgrid_3d)
981 pgrid_3d, sizes_ri, sizes_ao, sizes_ao, &
982 map1=map1, map2=map2, name=tensor_name)
984 IF (
PRESENT(create_nl_3c))
THEN
985 my_create_nl_3c = create_nl_3c
987 my_create_nl_3c = .false.
990 IF (my_create_nl_3c)
THEN
991 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
992 CALL dbt_mp_environ_pgrid(pgrid_3d, pdims, pcoord)
993 CALL mp_comm_t3c_2%create(pgrid_3d%mp_comm_2d, 3, pdims)
995 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
998 qs_env%bs_env%basis_set_RI, &
999 qs_env%bs_env%basis_set_AO, &
1000 qs_env%bs_env%basis_set_AO, &
1001 dist_3d, qs_env%bs_env%ri_metric, &
1002 "GW_3c_nl", qs_env, own_dist=.true.)
1005 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
1006 CALL dbt_pgrid_destroy(pgrid_3d)
1008 CALL timestop(handle)
1010 END SUBROUTINE create_3c_t
1016 SUBROUTINE init_interaction_radii(bs_env)
1019 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_interaction_radii'
1021 INTEGER :: handle, ibasis
1024 CALL timeset(routinen, handle)
1026 DO ibasis = 1,
SIZE(bs_env%basis_set_AO)
1028 orb_basis => bs_env%basis_set_AO(ibasis)%gto_basis_set
1031 ri_basis => bs_env%basis_set_RI(ibasis)%gto_basis_set
1036 CALL timestop(handle)
1038 END SUBROUTINE init_interaction_radii
1046 SUBROUTINE get_max_dist_ao_atoms(t_3c_int, max_dist_AO_atoms, qs_env)
1047 TYPE(dbt_type) :: t_3c_int
1048 REAL(kind=
dp) :: max_dist_ao_atoms
1051 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_max_dist_AO_atoms'
1053 INTEGER :: atom_1, atom_2, handle, num_cells
1054 INTEGER,
DIMENSION(3) :: atom_ind
1055 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1056 REAL(kind=
dp) :: abs_rab
1057 REAL(kind=
dp),
DIMENSION(3) :: rab
1059 TYPE(dbt_iterator_type) :: iter
1063 CALL timeset(routinen, handle)
1065 NULLIFY (cell, particle_set, para_env)
1066 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, para_env=para_env)
1071 CALL dbt_iterator_start(iter, t_3c_int)
1072 DO WHILE (dbt_iterator_blocks_left(iter))
1073 CALL dbt_iterator_next_block(iter, atom_ind)
1075 atom_1 = atom_ind(2)
1076 atom_2 = atom_ind(3)
1078 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
1080 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
1082 max_dist_ao_atoms = max(max_dist_ao_atoms, abs_rab)
1085 CALL dbt_iterator_stop(iter)
1088 CALL para_env%max(max_dist_ao_atoms)
1090 CALL timestop(handle)
1092 END SUBROUTINE get_max_dist_ao_atoms
1098 SUBROUTINE set_sparsity_parallelization_parameters(bs_env)
1101 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_sparsity_parallelization_parameters'
1103 INTEGER :: handle, i_ivl, il_ivl, j_ivl, n_atom_per_il_ivl, n_atom_per_ivl, n_intervals_i, &
1104 n_intervals_inner_loop_atoms, n_intervals_j, u
1105 INTEGER(KIND=int_8) :: input_memory_per_proc
1107 CALL timeset(routinen, handle)
1110 bs_env%safety_factor_memory = 0.10_dp
1112 input_memory_per_proc = int(bs_env%input_memory_per_proc_GB*1.0e9_dp, kind=
int_8)
1118 n_atom_per_ivl = int(sqrt(bs_env%safety_factor_memory*input_memory_per_proc &
1119 *bs_env%group_size_tensor/24/bs_env%n_RI &
1120 /sqrt(bs_env%occupation_3c_int)))/bs_env%max_AO_bf_per_atom
1122 n_intervals_i = (bs_env%n_atom_i - 1)/n_atom_per_ivl + 1
1123 n_intervals_j = (bs_env%n_atom_j - 1)/n_atom_per_ivl + 1
1125 bs_env%n_atom_per_interval_ij = n_atom_per_ivl
1126 bs_env%n_intervals_i = n_intervals_i
1127 bs_env%n_intervals_j = n_intervals_j
1129 ALLOCATE (bs_env%i_atom_intervals(2, n_intervals_i))
1130 ALLOCATE (bs_env%j_atom_intervals(2, n_intervals_j))
1132 DO i_ivl = 1, n_intervals_i
1133 bs_env%i_atom_intervals(1, i_ivl) = (i_ivl - 1)*n_atom_per_ivl + bs_env%atoms_i(1)
1134 bs_env%i_atom_intervals(2, i_ivl) = min(i_ivl*n_atom_per_ivl + bs_env%atoms_i(1) - 1, &
1138 DO j_ivl = 1, n_intervals_j
1139 bs_env%j_atom_intervals(1, j_ivl) = (j_ivl - 1)*n_atom_per_ivl + bs_env%atoms_j(1)
1140 bs_env%j_atom_intervals(2, j_ivl) = min(j_ivl*n_atom_per_ivl + bs_env%atoms_j(1) - 1, &
1144 ALLOCATE (bs_env%skip_Sigma_occ(n_intervals_i, n_intervals_j))
1145 ALLOCATE (bs_env%skip_Sigma_vir(n_intervals_i, n_intervals_j))
1146 bs_env%skip_Sigma_occ(:, :) = .false.
1147 bs_env%skip_Sigma_vir(:, :) = .false.
1152 n_atom_per_il_ivl = min(int(bs_env%safety_factor_memory*input_memory_per_proc &
1153 *bs_env%group_size_tensor/n_atom_per_ivl &
1154 /bs_env%max_AO_bf_per_atom &
1155 /bs_env%n_RI/8/sqrt(bs_env%occupation_3c_int) &
1156 /bs_env%max_AO_bf_per_atom), bs_env%n_atom)
1158 n_intervals_inner_loop_atoms = (bs_env%n_atom - 1)/n_atom_per_il_ivl + 1
1160 bs_env%n_atom_per_IL_interval = n_atom_per_il_ivl
1161 bs_env%n_intervals_inner_loop_atoms = n_intervals_inner_loop_atoms
1163 ALLOCATE (bs_env%inner_loop_atom_intervals(2, n_intervals_inner_loop_atoms))
1164 DO il_ivl = 1, n_intervals_inner_loop_atoms
1165 bs_env%inner_loop_atom_intervals(1, il_ivl) = (il_ivl - 1)*n_atom_per_il_ivl + 1
1166 bs_env%inner_loop_atom_intervals(2, il_ivl) = min(il_ivl*n_atom_per_il_ivl, bs_env%n_atom)
1171 WRITE (u,
'(T2,A)')
''
1172 WRITE (u,
'(T2,A,I33)') λντνλτ
'Number of i and j atoms in M_P(), N_Q():', n_atom_per_ivl
1173 WRITE (u,
'(T2,A,I18)') µλνµµνµλ
'Number of inner loop atoms for in M_P = sum_ (|P) G_', &
1177 CALL timestop(handle)
1179 END SUBROUTINE set_sparsity_parallelization_parameters
1186 SUBROUTINE check_for_restart_files(qs_env, bs_env)
1190 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_for_restart_files'
1192 CHARACTER(LEN=9) :: frmt
1193 CHARACTER(LEN=default_path_length) :: project_name
1194 CHARACTER(LEN=default_string_length) :: f_chi, f_s_n, f_s_p, f_s_x, f_w_t, prefix
1195 INTEGER :: handle, i_spin, i_t_or_w, ind, n_spin, &
1196 num_time_freq_points
1197 LOGICAL :: chi_exists, sigma_neg_time_exists, &
1198 sigma_pos_time_exists, &
1199 sigma_x_spin_exists, w_time_exists
1203 CALL timeset(routinen, handle)
1205 num_time_freq_points = bs_env%num_time_freq_points
1206 n_spin = bs_env%n_spin
1208 ALLOCATE (bs_env%read_chi(num_time_freq_points))
1209 ALLOCATE (bs_env%calc_chi(num_time_freq_points))
1210 ALLOCATE (bs_env%Sigma_c_exists(num_time_freq_points, n_spin))
1218 WRITE (prefix,
'(2A)') trim(project_name),
"-RESTART_"
1219 bs_env%prefix = prefix
1221 bs_env%all_W_exist = .true.
1223 DO i_t_or_w = 1, num_time_freq_points
1225 IF (i_t_or_w < 10)
THEN
1226 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1227 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_0", i_t_or_w,
".matrix"
1228 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_0", i_t_or_w,
".matrix"
1229 ELSE IF (i_t_or_w < 100)
THEN
1230 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1231 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_", i_t_or_w,
".matrix"
1232 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_", i_t_or_w,
".matrix"
1234 cpabort(
'Please implement more than 99 time/frequency points.')
1237 INQUIRE (file=trim(f_chi), exist=chi_exists)
1238 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1240 bs_env%read_chi(i_t_or_w) = chi_exists
1241 bs_env%calc_chi(i_t_or_w) = .NOT. chi_exists
1243 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1246 DO i_spin = 1, n_spin
1248 ind = i_t_or_w + (i_spin - 1)*num_time_freq_points
1251 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1252 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_0", ind,
".matrix"
1253 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_0", ind,
".matrix"
1254 ELSE IF (i_t_or_w < 100)
THEN
1255 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1256 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_", ind,
".matrix"
1257 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_", ind,
".matrix"
1260 INQUIRE (file=trim(f_s_p), exist=sigma_pos_time_exists)
1261 INQUIRE (file=trim(f_s_n), exist=sigma_neg_time_exists)
1263 bs_env%Sigma_c_exists(i_t_or_w, i_spin) = sigma_pos_time_exists .AND. &
1264 sigma_neg_time_exists
1272 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix),
"W_freq_rtp",
"_0", 0,
".matrix"
1273 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1274 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1277 IF (bs_env%all_W_exist)
THEN
1278 bs_env%read_chi(:) = .false.
1279 bs_env%calc_chi(:) = .false.
1282 bs_env%Sigma_x_exists = .true.
1283 DO i_spin = 1, n_spin
1284 WRITE (f_s_x,
'(3A,I1,A)') trim(prefix), bs_env%Sigma_x_name,
"_0", i_spin,
".matrix"
1285 INQUIRE (file=trim(f_s_x), exist=sigma_x_spin_exists)
1286 bs_env%Sigma_x_exists = bs_env%Sigma_x_exists .AND. sigma_x_spin_exists
1291 IF (any(bs_env%read_chi(:)) &
1292 .OR. any(bs_env%Sigma_c_exists) &
1293 .OR. bs_env%all_W_exist &
1294 .OR. bs_env%Sigma_x_exists &
1297 IF (qs_env%scf_env%iter_count /= 1)
THEN
1298 CALL cp_warn(__location__,
"SCF needed more than 1 step, "// &
1299 "which might lead to spurious GW results when using GW restart files. ")
1303 CALL timestop(handle)
1305 END SUBROUTINE check_for_restart_files
1312 SUBROUTINE set_parallelization_parameters(qs_env, bs_env)
1316 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_parallelization_parameters'
1318 INTEGER :: color_sub, dummy_1, dummy_2, handle, &
1319 num_pe, num_t_groups, u
1320 INTEGER(KIND=int_8) :: mem
1323 CALL timeset(routinen, handle)
1327 num_pe = para_env%num_pe
1330 IF (bs_env%group_size_tensor < 0 .OR. bs_env%group_size_tensor > num_pe) &
1331 bs_env%group_size_tensor = num_pe
1334 IF (
modulo(num_pe, bs_env%group_size_tensor) .NE. 0)
THEN
1335 CALL find_good_group_size(num_pe, bs_env%group_size_tensor)
1339 color_sub = para_env%mepos/bs_env%group_size_tensor
1340 bs_env%tensor_group_color = color_sub
1342 ALLOCATE (bs_env%para_env_tensor)
1343 CALL bs_env%para_env_tensor%from_split(para_env, color_sub)
1345 num_t_groups = para_env%num_pe/bs_env%group_size_tensor
1346 bs_env%num_tensor_groups = num_t_groups
1348 CALL get_i_j_atoms(bs_env%atoms_i, bs_env%atoms_j, bs_env%n_atom_i, bs_env%n_atom_j, &
1351 ALLOCATE (bs_env%atoms_i_t_group(2, num_t_groups))
1352 ALLOCATE (bs_env%atoms_j_t_group(2, num_t_groups))
1353 DO color_sub = 0, num_t_groups - 1
1354 CALL get_i_j_atoms(bs_env%atoms_i_t_group(1:2, color_sub + 1), &
1355 bs_env%atoms_j_t_group(1:2, color_sub + 1), &
1356 dummy_1, dummy_2, color_sub, bs_env)
1360 CALL bs_env%para_env%max(mem)
1364 WRITE (u,
'(T2,A,I47)')
'Group size for tensor operations', bs_env%group_size_tensor
1365 IF (bs_env%group_size_tensor > 1 .AND. bs_env%n_atom < 5)
THEN
1366 WRITE (u,
'(T2,A)')
'The requested group size is > 1 which can lead to bad performance.'
1367 WRITE (u,
'(T2,A)')
'Using more memory per MPI process might improve performance.'
1368 WRITE (u,
'(T2,A)')
'(Also increase MEMORY_PER_PROC when using more memory per process.)'
1372 CALL timestop(handle)
1374 END SUBROUTINE set_parallelization_parameters
1381 SUBROUTINE find_good_group_size(num_pe, group_size)
1383 INTEGER :: num_pe, group_size
1385 CHARACTER(LEN=*),
PARAMETER :: routinen =
'find_good_group_size'
1387 INTEGER :: group_size_minus, group_size_orig, &
1388 group_size_plus, handle, i_diff
1390 CALL timeset(routinen, handle)
1392 group_size_orig = group_size
1394 DO i_diff = 1, num_pe
1396 group_size_minus = group_size - i_diff
1398 IF (
modulo(num_pe, group_size_minus) == 0 .AND. group_size_minus > 0)
THEN
1399 group_size = group_size_minus
1403 group_size_plus = group_size + i_diff
1405 IF (
modulo(num_pe, group_size_plus) == 0 .AND. group_size_plus <= num_pe)
THEN
1406 group_size = group_size_plus
1412 IF (group_size_orig == group_size) cpabort(
"Group size error")
1414 CALL timestop(handle)
1416 END SUBROUTINE find_good_group_size
1427 SUBROUTINE get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
1429 INTEGER,
DIMENSION(2) :: atoms_i, atoms_j
1430 INTEGER :: n_atom_i, n_atom_j, color_sub
1433 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atoms'
1435 INTEGER :: handle, i_atoms_per_group, i_group, &
1436 ipcol, ipcol_loop, iprow, iprow_loop, &
1437 j_atoms_per_group, npcol, nprow
1439 CALL timeset(routinen, handle)
1442 CALL square_mesh(nprow, npcol, bs_env%num_tensor_groups)
1445 DO ipcol_loop = 0, npcol - 1
1446 DO iprow_loop = 0, nprow - 1
1447 IF (i_group == color_sub)
THEN
1451 i_group = i_group + 1
1455 IF (
modulo(bs_env%n_atom, nprow) == 0)
THEN
1456 i_atoms_per_group = bs_env%n_atom/nprow
1458 i_atoms_per_group = bs_env%n_atom/nprow + 1
1461 IF (
modulo(bs_env%n_atom, npcol) == 0)
THEN
1462 j_atoms_per_group = bs_env%n_atom/npcol
1464 j_atoms_per_group = bs_env%n_atom/npcol + 1
1467 atoms_i(1) = iprow*i_atoms_per_group + 1
1468 atoms_i(2) = min((iprow + 1)*i_atoms_per_group, bs_env%n_atom)
1469 n_atom_i = atoms_i(2) - atoms_i(1) + 1
1471 atoms_j(1) = ipcol*j_atoms_per_group + 1
1472 atoms_j(2) = min((ipcol + 1)*j_atoms_per_group, bs_env%n_atom)
1473 n_atom_j = atoms_j(2) - atoms_j(1) + 1
1475 CALL timestop(handle)
1485 SUBROUTINE square_mesh(nprow, npcol, nproc)
1486 INTEGER :: nprow, npcol, nproc
1488 CHARACTER(LEN=*),
PARAMETER :: routinen =
'square_mesh'
1490 INTEGER :: gcd_max, handle, ipe, jpe
1492 CALL timeset(routinen, handle)
1495 DO ipe = 1, ceiling(sqrt(real(nproc,
dp)))
1497 IF (ipe*jpe .NE. nproc) cycle
1498 IF (
gcd(ipe, jpe) >= gcd_max)
THEN
1501 gcd_max =
gcd(ipe, jpe)
1505 CALL timestop(handle)
1507 END SUBROUTINE square_mesh
1514 SUBROUTINE set_heuristic_parameters(bs_env, qs_env)
1518 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
1520 INTEGER :: handle, u
1521 LOGICAL :: do_bvk_cell
1523 CALL timeset(routinen, handle)
1526 bs_env%num_points_per_magnitude = 200
1528 IF (bs_env%input_regularization_minimax > -1.0e-12_dp)
THEN
1529 bs_env%regularization_minimax = bs_env%input_regularization_minimax
1534 IF (sum(bs_env%periodic) .NE. 0 .OR. bs_env%num_time_freq_points >= 20)
THEN
1535 bs_env%regularization_minimax = 1.0e-6_dp
1537 bs_env%regularization_minimax = 0.0_dp
1541 bs_env%stabilize_exp = 70.0_dp
1542 bs_env%eps_atom_grid_2d_mat = 1.0e-50_dp
1545 bs_env%nparam_pade = 16
1549 bs_env%ri_metric%omega = 0.0_dp
1551 bs_env%ri_metric%filename =
"t_c_g.dat"
1553 bs_env%eps_eigval_mat_RI = 0.0_dp
1555 IF (bs_env%input_regularization_RI > -1.0e-12_dp)
THEN
1556 bs_env%regularization_RI = bs_env%input_regularization_RI
1561 bs_env%regularization_RI = 1.0e-2_dp
1564 IF (sum(bs_env%periodic) == 0) bs_env%regularization_RI = 0.0_dp
1572 rel_cutoff_trunc_coulomb_ri_x=0.5_dp, &
1573 cell_grid=bs_env%cell_grid_scf_desymm, &
1574 do_bvk_cell=do_bvk_cell)
1578 bs_env%heuristic_filter_factor = 1.0e-4
1582 WRITE (u, fmt=
"(T2,2A,F21.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1583 Σ
"operator in ^x:", bs_env%trunc_coulomb%cutoff_radius*
angstrom, Å
" "
1584 WRITE (u, fmt=
"(T2,2A,F15.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1585 "operator in RI metric:", bs_env%ri_metric%cutoff_radius*
angstrom, Å
" "
1586 WRITE (u, fmt=
"(T2,A,ES48.1)")
"Regularization parameter of RI ", bs_env%regularization_RI
1587 WRITE (u, fmt=
"(T2,A,ES38.1)")
"Regularization parameter of minimax grids", &
1588 bs_env%regularization_minimax
1589 WRITE (u, fmt=
"(T2,A,I53)")
"Lattice sum size for V(k):", bs_env%size_lattice_sum_V
1592 CALL timestop(handle)
1594 END SUBROUTINE set_heuristic_parameters
1600 SUBROUTINE print_header_and_input_parameters(bs_env)
1604 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header_and_input_parameters'
1606 INTEGER :: handle, u
1608 CALL timeset(routinen, handle)
1613 WRITE (u,
'(T2,A)')
' '
1614 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1615 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1616 WRITE (u,
'(T2,A,A46,A32)')
'-',
'GW CALCULATION',
'-'
1617 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1618 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1619 WRITE (u,
'(T2,A)')
' '
1620 WRITE (u,
'(T2,A,I45)')
'Input: Number of time/freq. points', bs_env%num_time_freq_points
1621 WRITE (u,
"(T2,A,F44.1,A)") ωΣω
'Input: _max for fitting (i) (eV)', bs_env%freq_max_fit*
evolt
1622 WRITE (u,
'(T2,A,ES27.1)')
'Input: Filter threshold for sparse tensor operations', &
1624 WRITE (u,
"(T2,A,L55)")
'Input: Apply Hedin shift', bs_env%do_hedin_shift
1627 CALL timestop(handle)
1629 END SUBROUTINE print_header_and_input_parameters
1636 SUBROUTINE compute_v_xc(qs_env, bs_env)
1640 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_xc'
1642 INTEGER :: handle, img, ispin, myfun, nimages
1643 LOGICAL :: hf_present
1644 REAL(kind=
dp) :: energy_ex, energy_exc, energy_total, &
1646 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_ks_without_v_xc
1647 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp
1652 CALL timeset(routinen, handle)
1654 CALL get_qs_env(qs_env, input=input, energy=energy, dft_control=dft_control)
1657 nimages = dft_control%nimages
1658 dft_control%nimages = bs_env%nimages_scf
1666 hf_present = .false.
1667 IF (
ASSOCIATED(hf_section))
THEN
1670 IF (hf_present)
THEN
1677 energy_total = energy%total
1678 energy_exc = energy%exc
1679 energy_ex = energy%ex
1681 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1684 NULLIFY (mat_ks_without_v_xc)
1687 DO ispin = 1, bs_env%n_spin
1688 ALLOCATE (mat_ks_without_v_xc(ispin)%matrix)
1689 IF (hf_present)
THEN
1690 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix, &
1691 matrix_type=dbcsr_type_symmetric)
1693 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1699 ext_ks_matrix=mat_ks_without_v_xc)
1701 DO ispin = 1, bs_env%n_spin
1703 CALL cp_fm_create(bs_env%fm_V_xc_Gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1704 CALL copy_dbcsr_to_fm(mat_ks_without_v_xc(ispin)%matrix, bs_env%fm_V_xc_Gamma(ispin))
1708 beta=1.0_dp, matrix_b=bs_env%fm_ks_Gamma(ispin))
1717 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks_kp)
1719 ALLOCATE (bs_env%fm_V_xc_R(dft_control%nimages, bs_env%n_spin))
1720 DO ispin = 1, bs_env%n_spin
1721 DO img = 1, dft_control%nimages
1723 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1724 CALL cp_fm_create(bs_env%fm_V_xc_R(img, ispin), bs_env%fm_work_mo(1)%matrix_struct)
1727 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1734 energy%total = energy_total
1735 energy%exc = energy_exc
1736 energy%ex = energy_ex
1739 dft_control%nimages = nimages
1744 IF (hf_present)
THEN
1752 DO ispin = 1, bs_env%n_spin
1753 DO img = 1, dft_control%nimages
1755 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1758 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1763 CALL timestop(handle)
1765 END SUBROUTINE compute_v_xc
1771 SUBROUTINE setup_time_and_frequency_minimax_grid(bs_env)
1774 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_time_and_frequency_minimax_grid'
1776 INTEGER :: handle, homo, i_w, ierr, ispin, j_w, &
1777 n_mo, num_time_freq_points, u
1778 REAL(kind=
dp) :: e_max, e_max_ispin, e_min, e_min_ispin, &
1779 e_range, max_error_min
1780 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: points_and_weights
1782 CALL timeset(routinen, handle)
1785 num_time_freq_points = bs_env%num_time_freq_points
1787 ALLOCATE (bs_env%imag_freq_points(num_time_freq_points))
1788 ALLOCATE (bs_env%imag_time_points(num_time_freq_points))
1789 ALLOCATE (bs_env%imag_time_weights_freq_zero(num_time_freq_points))
1790 ALLOCATE (bs_env%weights_cos_t_to_w(num_time_freq_points, num_time_freq_points))
1791 ALLOCATE (bs_env%weights_cos_w_to_t(num_time_freq_points, num_time_freq_points))
1792 ALLOCATE (bs_env%weights_sin_t_to_w(num_time_freq_points, num_time_freq_points))
1797 DO ispin = 1, bs_env%n_spin
1798 homo = bs_env%n_occ(ispin)
1799 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1801 e_min_ispin = bs_env%eigenval_scf_Gamma(homo + 1, ispin) - &
1802 bs_env%eigenval_scf_Gamma(homo, ispin)
1803 e_max_ispin = bs_env%eigenval_scf_Gamma(n_mo, ispin) - &
1804 bs_env%eigenval_scf_Gamma(1, ispin)
1806 e_min_ispin = minval(bs_env%eigenval_scf(homo + 1, :, ispin)) - &
1807 maxval(bs_env%eigenval_scf(homo, :, ispin))
1808 e_max_ispin = maxval(bs_env%eigenval_scf(n_mo, :, ispin)) - &
1809 minval(bs_env%eigenval_scf(1, :, ispin))
1811 e_min = min(e_min, e_min_ispin)
1812 e_max = max(e_max, e_max_ispin)
1815 e_range = e_max/e_min
1817 ALLOCATE (points_and_weights(2*num_time_freq_points))
1820 IF (num_time_freq_points .LE. 20)
THEN
1828 bs_env%imag_freq_points(:) = points_and_weights(1:num_time_freq_points)*e_min
1831 bs_env%num_freq_points_fit = 0
1832 DO i_w = 1, num_time_freq_points
1833 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1834 bs_env%num_freq_points_fit = bs_env%num_freq_points_fit + 1
1839 ALLOCATE (bs_env%imag_freq_points_fit(bs_env%num_freq_points_fit))
1841 DO i_w = 1, num_time_freq_points
1842 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1844 bs_env%imag_freq_points_fit(j_w) = bs_env%imag_freq_points(i_w)
1850 IF (bs_env%num_freq_points_fit < bs_env%nparam_pade)
THEN
1851 bs_env%nparam_pade = bs_env%num_freq_points_fit
1855 IF (num_time_freq_points .LE. 20)
THEN
1861 bs_env%imag_time_points(:) = points_and_weights(1:num_time_freq_points)/(2.0_dp*e_min)
1862 bs_env%imag_time_weights_freq_zero(:) = points_and_weights(num_time_freq_points + 1:)/(e_min)
1864 DEALLOCATE (points_and_weights)
1868 WRITE (u,
'(T2,A)')
''
1869 WRITE (u,
'(T2,A,F55.2)')
'SCF direct band gap (eV)', e_min*
evolt
1870 WRITE (u,
'(T2,A,F53.2)')
'Max. SCF eigval diff. (eV)', e_max*
evolt
1871 WRITE (u,
'(T2,A,F55.2)')
'E-Range for minimax grid', e_range
1872 WRITE (u,
'(T2,A,I27)') é
'Number of Pad parameters for analytic continuation:', &
1874 WRITE (u,
'(T2,A)')
''
1884 bs_env%imag_time_points, &
1885 bs_env%weights_cos_t_to_w, &
1886 bs_env%imag_freq_points, &
1887 e_min, e_max, max_error_min, &
1888 bs_env%num_points_per_magnitude, &
1889 bs_env%regularization_minimax)
1893 bs_env%imag_time_points, &
1894 bs_env%weights_cos_w_to_t, &
1895 bs_env%imag_freq_points, &
1896 e_min, e_max, max_error_min, &
1897 bs_env%num_points_per_magnitude, &
1898 bs_env%regularization_minimax)
1902 bs_env%imag_time_points, &
1903 bs_env%weights_sin_t_to_w, &
1904 bs_env%imag_freq_points, &
1905 e_min, e_max, max_error_min, &
1906 bs_env%num_points_per_magnitude, &
1907 bs_env%regularization_minimax)
1909 CALL timestop(handle)
1911 END SUBROUTINE setup_time_and_frequency_minimax_grid
1918 SUBROUTINE setup_cells_3c(qs_env, bs_env)
1923 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_3c'
1925 INTEGER :: atom_i, atom_j, atom_k, block_count, handle, i, i_cell_x, i_cell_x_max, &
1926 i_cell_x_min, i_size, ikind, img, j, j_cell, j_cell_max, j_cell_y, j_cell_y_max, &
1927 j_cell_y_min, j_size, k_cell, k_cell_max, k_cell_z, k_cell_z_max, k_cell_z_min, k_size, &
1928 nimage_pairs_3c, nimages_3c, nimages_3c_max, nkind, u
1929 INTEGER(KIND=int_8) :: mem_occ_per_proc
1930 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, n_other_3c_images_max
1931 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c_max, nblocks_3c_max
1932 INTEGER,
DIMENSION(3) :: cell_index, n_max
1933 REAL(kind=
dp) :: avail_mem_per_proc_gb, cell_dist, cell_radius_3c, dij, dik, djk, eps, &
1934 exp_min_ao, exp_min_ri, frobenius_norm, mem_3c_gb, mem_occ_per_proc_gb, radius_ao, &
1935 radius_ao_product, radius_ri
1936 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exp_ao_kind, exp_ri_kind, &
1938 radius_ao_product_kind, radius_ri_kind
1939 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: int_3c
1940 REAL(kind=
dp),
DIMENSION(3) :: rij, rik, rjk, vec_cell_j, vec_cell_k
1941 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: exp_ao, exp_ri
1946 CALL timeset(routinen, handle)
1948 CALL get_qs_env(qs_env, nkind=nkind, atomic_kind_set=atomic_kind_set, particle_set=particle_set, cell=cell)
1950 ALLOCATE (exp_ao_kind(nkind), exp_ri_kind(nkind), radius_ao_kind(nkind), &
1951 radius_ao_product_kind(nkind), radius_ri_kind(nkind))
1953 exp_min_ri = 10.0_dp
1954 exp_min_ao = 10.0_dp
1955 exp_ri_kind = 10.0_dp
1956 exp_ao_kind = 10.0_dp
1958 eps = bs_env%eps_filter*bs_env%heuristic_filter_factor
1967 DO i = 1,
SIZE(exp_ri, 1)
1968 DO j = 1,
SIZE(exp_ri, 2)
1969 IF (exp_ri(i, j) < exp_min_ri .AND. exp_ri(i, j) > 1e-3_dp) exp_min_ri = exp_ri(i, j)
1970 IF (exp_ri(i, j) < exp_ri_kind(ikind) .AND. exp_ri(i, j) > 1e-3_dp) &
1971 exp_ri_kind(ikind) = exp_ri(i, j)
1974 DO i = 1,
SIZE(exp_ao, 1)
1975 DO j = 1,
SIZE(exp_ao, 2)
1976 IF (exp_ao(i, j) < exp_min_ao .AND. exp_ao(i, j) > 1e-3_dp) exp_min_ao = exp_ao(i, j)
1977 IF (exp_ao(i, j) < exp_ao_kind(ikind) .AND. exp_ao(i, j) > 1e-3_dp) &
1978 exp_ao_kind(ikind) = exp_ao(i, j)
1981 radius_ao_kind(ikind) = sqrt(-log(eps)/exp_ao_kind(ikind))
1982 radius_ao_product_kind(ikind) = sqrt(-log(eps)/(2.0_dp*exp_ao_kind(ikind)))
1983 radius_ri_kind(ikind) = sqrt(-log(eps)/exp_ri_kind(ikind))
1986 radius_ao = sqrt(-log(eps)/exp_min_ao)
1987 radius_ao_product = sqrt(-log(eps)/(2.0_dp*exp_min_ao))
1988 radius_ri = sqrt(-log(eps)/exp_min_ri)
1993 cell_radius_3c = radius_ao_product + radius_ri + bs_env%ri_metric%cutoff_radius
1995 n_max(1:3) = bs_env%periodic(1:3)*30
2006 DO i_cell_x = -n_max(1), n_max(1)
2007 DO j_cell_y = -n_max(2), n_max(2)
2008 DO k_cell_z = -n_max(3), n_max(3)
2010 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2012 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2014 IF (cell_dist < cell_radius_3c)
THEN
2015 nimages_3c_max = nimages_3c_max + 1
2016 i_cell_x_min = min(i_cell_x_min, i_cell_x)
2017 i_cell_x_max = max(i_cell_x_max, i_cell_x)
2018 j_cell_y_min = min(j_cell_y_min, j_cell_y)
2019 j_cell_y_max = max(j_cell_y_max, j_cell_y)
2020 k_cell_z_min = min(k_cell_z_min, k_cell_z)
2021 k_cell_z_max = max(k_cell_z_max, k_cell_z)
2030 ALLOCATE (index_to_cell_3c_max(nimages_3c_max, 3))
2033 DO i_cell_x = -n_max(1), n_max(1)
2034 DO j_cell_y = -n_max(2), n_max(2)
2035 DO k_cell_z = -n_max(3), n_max(3)
2037 cell_index(1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2039 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2041 IF (cell_dist < cell_radius_3c)
THEN
2043 index_to_cell_3c_max(img, 1:3) = cell_index(1:3)
2051 ALLOCATE (nblocks_3c_max(nimages_3c_max, nimages_3c_max))
2052 nblocks_3c_max(:, :) = 0
2055 DO j_cell = 1, nimages_3c_max
2056 DO k_cell = 1, nimages_3c_max
2058 DO atom_j = 1, bs_env%n_atom
2059 DO atom_k = 1, bs_env%n_atom
2060 DO atom_i = 1, bs_env%n_atom
2062 block_count = block_count + 1
2063 IF (
modulo(block_count, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2065 CALL scaled_to_real(vec_cell_j, real(index_to_cell_3c_max(j_cell, 1:3), kind=
dp), cell)
2066 CALL scaled_to_real(vec_cell_k, real(index_to_cell_3c_max(k_cell, 1:3), kind=
dp), cell)
2068 rij =
pbc(particle_set(atom_j)%r(:), cell) -
pbc(particle_set(atom_i)%r(:), cell) + vec_cell_j(:)
2069 rjk =
pbc(particle_set(atom_k)%r(:), cell) -
pbc(particle_set(atom_j)%r(:), cell) &
2070 + vec_cell_k(:) - vec_cell_j(:)
2071 rik(:) = rij(:) + rjk(:)
2075 IF (djk > radius_ao_kind(kind_of(atom_j)) + radius_ao_kind(kind_of(atom_k))) cycle
2076 IF (dij > radius_ao_kind(kind_of(atom_j)) + radius_ri_kind(kind_of(atom_i)) &
2077 + bs_env%ri_metric%cutoff_radius) cycle
2078 IF (dik > radius_ri_kind(kind_of(atom_i)) + radius_ao_kind(kind_of(atom_k)) &
2079 + bs_env%ri_metric%cutoff_radius) cycle
2081 j_size = bs_env%i_ao_end_from_atom(atom_j) - bs_env%i_ao_start_from_atom(atom_j) + 1
2082 k_size = bs_env%i_ao_end_from_atom(atom_k) - bs_env%i_ao_start_from_atom(atom_k) + 1
2083 i_size = bs_env%i_RI_end_from_atom(atom_i) - bs_env%i_RI_start_from_atom(atom_i) + 1
2085 ALLOCATE (int_3c(j_size, k_size, i_size))
2090 basis_j=bs_env%basis_set_AO, &
2091 basis_k=bs_env%basis_set_AO, &
2092 basis_i=bs_env%basis_set_RI, &
2093 cell_j=index_to_cell_3c_max(j_cell, 1:3), &
2094 cell_k=index_to_cell_3c_max(k_cell, 1:3), &
2095 atom_k=atom_k, atom_j=atom_j, atom_i=atom_i)
2097 frobenius_norm = sqrt(sum(int_3c(:, :, :)**2))
2103 IF (frobenius_norm > eps)
THEN
2104 nblocks_3c_max(j_cell, k_cell) = nblocks_3c_max(j_cell, k_cell) + 1
2114 CALL bs_env%para_env%sum(nblocks_3c_max)
2116 ALLOCATE (n_other_3c_images_max(nimages_3c_max))
2117 n_other_3c_images_max(:) = 0
2122 DO j_cell = 1, nimages_3c_max
2123 DO k_cell = 1, nimages_3c_max
2124 IF (nblocks_3c_max(j_cell, k_cell) > 0)
THEN
2125 n_other_3c_images_max(j_cell) = n_other_3c_images_max(j_cell) + 1
2126 nimage_pairs_3c = nimage_pairs_3c + 1
2130 IF (n_other_3c_images_max(j_cell) > 0) nimages_3c = nimages_3c + 1
2134 bs_env%nimages_3c = nimages_3c
2135 ALLOCATE (bs_env%index_to_cell_3c(nimages_3c, 3))
2136 ALLOCATE (bs_env%cell_to_index_3c(i_cell_x_min:i_cell_x_max, &
2137 j_cell_y_min:j_cell_y_max, &
2138 k_cell_z_min:k_cell_z_max))
2139 bs_env%cell_to_index_3c(:, :, :) = -1
2141 ALLOCATE (bs_env%nblocks_3c(nimages_3c, nimages_3c))
2142 bs_env%nblocks_3c(nimages_3c, nimages_3c) = 0
2145 DO j_cell_max = 1, nimages_3c_max
2146 IF (n_other_3c_images_max(j_cell_max) == 0) cycle
2148 cell_index(1:3) = index_to_cell_3c_max(j_cell_max, 1:3)
2149 bs_env%index_to_cell_3c(j_cell, 1:3) = cell_index(1:3)
2150 bs_env%cell_to_index_3c(cell_index(1), cell_index(2), cell_index(3)) = j_cell
2153 DO k_cell_max = 1, nimages_3c_max
2154 IF (n_other_3c_images_max(k_cell_max) == 0) cycle
2157 bs_env%nblocks_3c(j_cell, k_cell) = nblocks_3c_max(j_cell_max, k_cell_max)
2163 mem_3c_gb = real(bs_env%n_RI, kind=
dp)*real(bs_env%n_ao, kind=
dp)**2 &
2164 *real(nimage_pairs_3c, kind=
dp)*8e-9_dp
2167 CALL bs_env%para_env%max(mem_occ_per_proc)
2169 mem_occ_per_proc_gb = real(mem_occ_per_proc, kind=
dp)/1.0e9_dp
2172 avail_mem_per_proc_gb = bs_env%input_memory_per_proc_GB - mem_occ_per_proc_gb
2175 bs_env%group_size_tensor = max(int(mem_3c_gb/avail_mem_per_proc_gb + 1.0_dp), 1)
2180 WRITE (u, fmt=
"(T2,A,F52.1,A)")
"Radius of atomic orbitals", radius_ao*
angstrom, Å
" "
2181 WRITE (u, fmt=
"(T2,A,F55.1,A)")
"Radius of RI functions", radius_ri*
angstrom, Å
" "
2182 WRITE (u, fmt=
"(T2,A,I47)")
"Number of cells for 3c integrals", nimages_3c
2183 WRITE (u, fmt=
"(T2,A,I42)")
"Number of cell pairs for 3c integrals", nimage_pairs_3c
2184 WRITE (u,
'(T2,A)')
''
2185 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
2186 bs_env%input_memory_per_proc_GB,
' GB'
2187 WRITE (u,
'(T2,A,F35.1,A)')
'Used memory per MPI process before GW run', &
2188 mem_occ_per_proc_gb,
' GB'
2189 WRITE (u,
'(T2,A,F44.1,A)')
'Memory of three-center integrals', mem_3c_gb,
' GB'
2192 CALL timestop(handle)
2194 END SUBROUTINE setup_cells_3c
2206 SUBROUTINE sum_two_r_grids(index_to_cell_1, index_to_cell_2, nimages_1, nimages_2, &
2207 index_to_cell, cell_to_index, nimages)
2209 INTEGER,
DIMENSION(:, :) :: index_to_cell_1, index_to_cell_2
2210 INTEGER :: nimages_1, nimages_2
2211 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
2212 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2215 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_two_R_grids'
2217 INTEGER :: handle, i_dim, img_1, img_2, nimages_max
2218 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_tmp
2219 INTEGER,
DIMENSION(3) :: cell_1, cell_2, r, r_max, r_min
2221 CALL timeset(routinen, handle)
2224 r_min(i_dim) = minval(index_to_cell_1(:, i_dim)) + minval(index_to_cell_2(:, i_dim))
2225 r_max(i_dim) = maxval(index_to_cell_1(:, i_dim)) + maxval(index_to_cell_2(:, i_dim))
2228 nimages_max = (r_max(1) - r_min(1) + 1)*(r_max(2) - r_min(2) + 1)*(r_max(3) - r_min(3) + 1)
2230 ALLOCATE (index_to_cell_tmp(nimages_max, 3))
2231 index_to_cell_tmp(:, :) = -1
2233 ALLOCATE (cell_to_index(r_min(1):r_max(1), r_min(2):r_max(2), r_min(3):r_max(3)))
2234 cell_to_index(:, :, :) = -1
2238 DO img_1 = 1, nimages_1
2240 DO img_2 = 1, nimages_2
2242 cell_1(1:3) = index_to_cell_1(img_1, 1:3)
2243 cell_2(1:3) = index_to_cell_2(img_2, 1:3)
2245 r(1:3) = cell_1(1:3) + cell_2(1:3)
2248 IF (cell_to_index(r(1), r(2), r(3)) == -1)
THEN
2250 nimages = nimages + 1
2251 cell_to_index(r(1), r(2), r(3)) = nimages
2252 index_to_cell_tmp(nimages, 1:3) = r(1:3)
2260 ALLOCATE (index_to_cell(nimages, 3))
2261 index_to_cell(:, :) = index_to_cell_tmp(1:nimages, 1:3)
2263 CALL timestop(handle)
2265 END SUBROUTINE sum_two_r_grids
2272 SUBROUTINE compute_3c_integrals(qs_env, bs_env)
2277 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
2279 INTEGER :: handle, j_cell, k_cell, nimages_3c
2281 CALL timeset(routinen, handle)
2283 nimages_3c = bs_env%nimages_3c
2284 ALLOCATE (bs_env%t_3c_int(nimages_3c, nimages_3c))
2285 DO j_cell = 1, nimages_3c
2286 DO k_cell = 1, nimages_3c
2287 CALL dbt_create(bs_env%t_RI_AO__AO, bs_env%t_3c_int(j_cell, k_cell))
2292 bs_env%eps_filter, &
2295 int_eps=bs_env%eps_filter*0.05_dp, &
2296 basis_i=bs_env%basis_set_RI, &
2297 basis_j=bs_env%basis_set_AO, &
2298 basis_k=bs_env%basis_set_AO, &
2299 potential_parameter=bs_env%ri_metric, &
2300 desymmetrize=.false., do_kpoints=.true., cell_sym=.true., &
2301 cell_to_index_ext=bs_env%cell_to_index_3c)
2303 CALL bs_env%para_env%sync()
2305 CALL timestop(handle)
2307 END SUBROUTINE compute_3c_integrals
2315 SUBROUTINE get_cell_dist(cell_index, hmat, cell_dist)
2317 INTEGER,
DIMENSION(3) :: cell_index
2318 REAL(kind=
dp) :: hmat(3, 3), cell_dist
2320 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_cell_dist'
2322 INTEGER :: handle, i_dim
2323 INTEGER,
DIMENSION(3) :: cell_index_adj
2324 REAL(kind=
dp) :: cell_dist_3(3)
2326 CALL timeset(routinen, handle)
2331 IF (cell_index(i_dim) > 0) cell_index_adj(i_dim) = cell_index(i_dim) - 1
2332 IF (cell_index(i_dim) < 0) cell_index_adj(i_dim) = cell_index(i_dim) + 1
2333 IF (cell_index(i_dim) == 0) cell_index_adj(i_dim) = cell_index(i_dim)
2336 cell_dist_3(1:3) = matmul(hmat, real(cell_index_adj, kind=
dp))
2338 cell_dist = sqrt(abs(sum(cell_dist_3(1:3)**2)))
2340 CALL timestop(handle)
2342 END SUBROUTINE get_cell_dist
2351 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
2356 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
2358 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
2359 k_cell_z, nimages, nkp, u
2360 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
2365 CALL timeset(routinen, handle)
2370 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
2372 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
2373 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
2377 IF (bs_env%periodic(i_dim) == 1)
THEN
2378 cpassert(nkp_grid(i_dim) > 1)
2382 kpoints%kp_scheme =
"GENERAL"
2383 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
2385 bs_env%nkp_scf_desymm = nkp
2387 ALLOCATE (kpoints%xkp(1:3, nkp))
2390 ALLOCATE (kpoints%wkp(nkp))
2391 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
2395 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
2397 cixd(1:3) = cell_grid(1:3)/2
2399 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
2401 bs_env%nimages_scf_desymm = nimages
2403 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
2404 ALLOCATE (kpoints%index_to_cell(nimages, 3))
2407 DO i_cell_x = -cixd(1), cixd(1)
2408 DO j_cell_y = -cixd(2), cixd(2)
2409 DO k_cell_z = -cixd(3), cixd(3)
2411 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
2412 kpoints%index_to_cell(img, 1:3) = (/i_cell_x, j_cell_y, k_cell_z/)
2418 IF (u > 0 .AND. do_print)
THEN
2419 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
2422 CALL timestop(handle)
2424 END SUBROUTINE setup_kpoints_scf_desymm
2430 SUBROUTINE setup_cells_delta_r(bs_env)
2434 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_Delta_R'
2438 CALL timeset(routinen, handle)
2443 CALL sum_two_r_grids(bs_env%index_to_cell_3c, &
2444 bs_env%index_to_cell_3c, &
2445 bs_env%nimages_3c, bs_env%nimages_3c, &
2446 bs_env%index_to_cell_Delta_R, &
2447 bs_env%cell_to_index_Delta_R, &
2448 bs_env%nimages_Delta_R)
2450 IF (bs_env%unit_nr > 0)
THEN
2451 WRITE (bs_env%unit_nr, fmt=
"(T2,A,I61)") Δ
"Number of cells R", bs_env%nimages_Delta_R
2454 CALL timestop(handle)
2456 END SUBROUTINE setup_cells_delta_r
2462 SUBROUTINE setup_parallelization_delta_r(bs_env)
2466 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_parallelization_Delta_R'
2468 INTEGER :: handle, i_cell_delta_r, i_task_local, &
2470 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: i_cell_delta_r_group, &
2471 n_tensor_ops_delta_r
2473 CALL timeset(routinen, handle)
2475 CALL compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_delta_r)
2477 CALL compute_delta_r_dist(bs_env, n_tensor_ops_delta_r, i_cell_delta_r_group, n_tasks_local)
2479 bs_env%n_tasks_Delta_R_local = n_tasks_local
2481 ALLOCATE (bs_env%task_Delta_R(n_tasks_local))
2484 DO i_cell_delta_r = 1, bs_env%nimages_Delta_R
2486 IF (i_cell_delta_r_group(i_cell_delta_r) /= bs_env%tensor_group_color) cycle
2488 i_task_local = i_task_local + 1
2490 bs_env%task_Delta_R(i_task_local) = i_cell_delta_r
2494 ALLOCATE (bs_env%skip_DR_chi(n_tasks_local))
2495 bs_env%skip_DR_chi(:) = .false.
2496 ALLOCATE (bs_env%skip_DR_Sigma(n_tasks_local))
2497 bs_env%skip_DR_Sigma(:) = .false.
2499 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Goccx3c_chi, bs_env)
2500 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Gvirx3c_chi, bs_env)
2501 CALL allocate_skip_3xr(bs_env%skip_DR_R_R2_MxM_chi, bs_env)
2503 CALL allocate_skip_3xr(bs_env%skip_DR_R1_S2_Gx3c_Sigma, bs_env)
2504 CALL allocate_skip_3xr(bs_env%skip_DR_R1_R_MxM_Sigma, bs_env)
2506 CALL timestop(handle)
2508 END SUBROUTINE setup_parallelization_delta_r
2515 SUBROUTINE allocate_skip_3xr(skip, bs_env)
2516 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip
2519 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_skip_3xR'
2523 CALL timeset(routinen, handle)
2525 ALLOCATE (skip(bs_env%n_tasks_Delta_R_local, bs_env%nimages_3c, bs_env%nimages_scf_desymm))
2526 skip(:, :, :) = .false.
2528 CALL timestop(handle)
2530 END SUBROUTINE allocate_skip_3xr
2539 SUBROUTINE compute_delta_r_dist(bs_env, n_tensor_ops_Delta_R, i_cell_Delta_R_group, n_tasks_local)
2541 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r, &
2542 i_cell_delta_r_group
2543 INTEGER :: n_tasks_local
2545 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Delta_R_dist'
2547 INTEGER :: handle, i_delta_r_max_op, i_group_min, &
2549 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r_in_group
2551 CALL timeset(routinen, handle)
2553 nimages_delta_r = bs_env%nimages_Delta_R
2557 IF (u > 0 .AND. nimages_delta_r < bs_env%num_tensor_groups)
THEN
2558 WRITE (u, fmt=
"(T2,A,I5,A,I5,A)")
"There are only ", nimages_delta_r, &
2559 " tasks to work on but there are ", bs_env%num_tensor_groups,
" groups."
2560 WRITE (u, fmt=
"(T2,A)")
"Please reduce the number of MPI processes."
2561 WRITE (u,
'(T2,A)')
''
2564 ALLOCATE (n_tensor_ops_delta_r_in_group(bs_env%num_tensor_groups))
2565 n_tensor_ops_delta_r_in_group(:) = 0
2566 ALLOCATE (i_cell_delta_r_group(nimages_delta_r))
2567 i_cell_delta_r_group(:) = -1
2571 DO WHILE (any(n_tensor_ops_delta_r(:) .NE. 0))
2574 i_delta_r_max_op = maxloc(n_tensor_ops_delta_r, 1)
2577 i_group_min = minloc(n_tensor_ops_delta_r_in_group, 1)
2580 i_cell_delta_r_group(i_delta_r_max_op) = i_group_min - 1
2581 n_tensor_ops_delta_r_in_group(i_group_min) = n_tensor_ops_delta_r_in_group(i_group_min) + &
2582 n_tensor_ops_delta_r(i_delta_r_max_op)
2585 n_tensor_ops_delta_r(i_delta_r_max_op) = 0
2587 IF (bs_env%tensor_group_color == i_group_min - 1) n_tasks_local = n_tasks_local + 1
2591 CALL timestop(handle)
2593 END SUBROUTINE compute_delta_r_dist
2600 SUBROUTINE compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_Delta_R)
2602 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r
2604 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_n_tensor_ops_Delta_R'
2606 INTEGER :: handle, i_cell_delta_r, i_cell_r, i_cell_r1, i_cell_r1_minus_r, i_cell_r2, &
2607 i_cell_r2_m_r1, i_cell_s1, i_cell_s1_m_r1_p_r2, i_cell_s1_minus_r, i_cell_s2, &
2609 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, cell_r1_minus_r, cell_r2, &
2610 cell_r2_m_r1, cell_s1, cell_s1_m_r2_p_r1, cell_s1_minus_r, cell_s1_p_s2_m_r1, cell_s2
2611 LOGICAL :: cell_found
2613 CALL timeset(routinen, handle)
2615 nimages_delta_r = bs_env%nimages_Delta_R
2617 ALLOCATE (n_tensor_ops_delta_r(nimages_delta_r))
2618 n_tensor_ops_delta_r(:) = 0
2621 DO i_cell_delta_r = 1, nimages_delta_r
2623 IF (
modulo(i_cell_delta_r, bs_env%num_tensor_groups) /= bs_env%tensor_group_color) cycle
2625 DO i_cell_r1 = 1, bs_env%nimages_3c
2627 cell_r1(1:3) = bs_env%index_to_cell_3c(i_cell_r1, 1:3)
2628 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(i_cell_delta_r, 1:3)
2631 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
2632 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
2633 IF (.NOT. cell_found) cycle
2635 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
2637 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r2, 1:3)
2640 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
2641 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
2642 IF (.NOT. cell_found) cycle
2645 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
2646 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
2647 IF (.NOT. cell_found) cycle
2649 n_tensor_ops_delta_r(i_cell_delta_r) = n_tensor_ops_delta_r(i_cell_delta_r) + 1
2653 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
2655 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_s2, 1:3)
2656 cell_m_r1(1:3) = -cell_r1(1:3)
2657 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
2660 IF (.NOT. cell_found) cycle
2663 IF (.NOT. cell_found) cycle
2667 DO i_cell_r = 1, bs_env%nimages_scf_desymm
2669 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(i_cell_r, 1:3)
2672 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
2673 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
2674 IF (.NOT. cell_found) cycle
2677 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
2678 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
2679 IF (.NOT. cell_found) cycle
2687 CALL bs_env%para_env%sum(n_tensor_ops_delta_r)
2689 CALL timestop(handle)
2691 END SUBROUTINE compute_n_tensor_ops_delta_r
2703 SUBROUTINE add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, &
2704 cell_to_index, i_cell_1_plus_2)
2706 INTEGER,
DIMENSION(3) :: cell_1, cell_2
2707 INTEGER,
DIMENSION(:, :) :: index_to_cell
2708 INTEGER,
DIMENSION(3) :: cell_1_plus_2
2709 LOGICAL :: cell_found
2710 INTEGER,
DIMENSION(:, :, :),
INTENT(IN), &
2711 OPTIONAL,
POINTER :: cell_to_index
2712 INTEGER,
INTENT(OUT),
OPTIONAL :: i_cell_1_plus_2
2714 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_R'
2718 CALL timeset(routinen, handle)
2720 cell_1_plus_2(1:3) = cell_1(1:3) + cell_2(1:3)
2724 IF (
PRESENT(i_cell_1_plus_2))
THEN
2725 IF (cell_found)
THEN
2726 cpassert(
PRESENT(cell_to_index))
2727 i_cell_1_plus_2 = cell_to_index(cell_1_plus_2(1), cell_1_plus_2(2), cell_1_plus_2(3))
2729 i_cell_1_plus_2 = -1000
2733 CALL timestop(handle)
2735 END SUBROUTINE add_r
2744 INTEGER,
DIMENSION(3) :: cell
2745 INTEGER,
DIMENSION(:, :) :: index_to_cell
2746 LOGICAL :: cell_found
2748 CHARACTER(LEN=*),
PARAMETER :: routinen =
'is_cell_in_index_to_cell'
2750 INTEGER :: handle, i_cell, nimg
2751 INTEGER,
DIMENSION(3) :: cell_i
2753 CALL timeset(routinen, handle)
2755 nimg =
SIZE(index_to_cell, 1)
2757 cell_found = .false.
2761 cell_i(1:3) = index_to_cell(i_cell, 1:3)
2763 IF (cell_i(1) == cell(1) .AND. cell_i(2) == cell(2) .AND. cell_i(3) == cell(3))
THEN
2769 CALL timestop(handle)
2778 SUBROUTINE allocate_matrices_small_cell_full_kp(qs_env, bs_env)
2782 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_small_cell_full_kp'
2784 INTEGER :: handle, i_spin, i_t, img, n_spin, &
2785 nimages_scf, num_time_freq_points
2789 CALL timeset(routinen, handle)
2791 nimages_scf = bs_env%nimages_scf_desymm
2792 num_time_freq_points = bs_env%num_time_freq_points
2793 n_spin = bs_env%n_spin
2795 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2797 ALLOCATE (bs_env%fm_G_S(nimages_scf))
2798 ALLOCATE (bs_env%fm_Sigma_x_R(nimages_scf))
2799 ALLOCATE (bs_env%fm_chi_R_t(nimages_scf, num_time_freq_points))
2800 ALLOCATE (bs_env%fm_MWM_R_t(nimages_scf, num_time_freq_points))
2801 ALLOCATE (bs_env%fm_Sigma_c_R_neg_tau(nimages_scf, num_time_freq_points, n_spin))
2802 ALLOCATE (bs_env%fm_Sigma_c_R_pos_tau(nimages_scf, num_time_freq_points, n_spin))
2803 DO img = 1, nimages_scf
2804 CALL cp_fm_create(bs_env%fm_G_S(img), bs_env%fm_work_mo(1)%matrix_struct)
2805 CALL cp_fm_create(bs_env%fm_Sigma_x_R(img), bs_env%fm_work_mo(1)%matrix_struct)
2806 DO i_t = 1, num_time_freq_points
2807 CALL cp_fm_create(bs_env%fm_chi_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2808 CALL cp_fm_create(bs_env%fm_MWM_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2810 DO i_spin = 1, n_spin
2811 CALL cp_fm_create(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), &
2812 bs_env%fm_work_mo(1)%matrix_struct)
2813 CALL cp_fm_create(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), &
2814 bs_env%fm_work_mo(1)%matrix_struct)
2815 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), 0.0_dp)
2816 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), 0.0_dp)
2821 CALL timestop(handle)
2823 END SUBROUTINE allocate_matrices_small_cell_full_kp
2830 SUBROUTINE trafo_v_xc_r_to_kp(qs_env, bs_env)
2834 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_V_xc_R_to_kp'
2836 INTEGER :: handle, ikp, img, ispin, n_ao
2837 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2838 TYPE(
cp_cfm_type) :: cfm_mo_coeff, cfm_tmp, cfm_v_xc
2840 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
2845 CALL timeset(routinen, handle)
2849 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints_scf)
2852 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2854 CALL cp_cfm_create(cfm_v_xc, bs_env%cfm_work_mo%matrix_struct)
2855 CALL cp_cfm_create(cfm_mo_coeff, bs_env%cfm_work_mo%matrix_struct)
2856 CALL cp_cfm_create(cfm_tmp, bs_env%cfm_work_mo%matrix_struct)
2857 CALL cp_fm_create(fm_v_xc_re, bs_env%cfm_work_mo%matrix_struct)
2859 DO img = 1, bs_env%nimages_scf
2860 DO ispin = 1, bs_env%n_spin
2862 CALL dbcsr_set(matrix_ks(ispin, img)%matrix, 0.0_dp)
2863 CALL copy_fm_to_dbcsr(bs_env%fm_V_xc_R(img, ispin), matrix_ks(ispin, img)%matrix)
2867 ALLOCATE (bs_env%v_xc_n(n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
2869 DO ispin = 1, bs_env%n_spin
2870 DO ikp = 1, bs_env%nkp_bs_and_DOS
2873 CALL rsmat_to_kp(matrix_ks, ispin, bs_env%kpoints_DOS%xkp(1:3, ikp), &
2874 cell_to_index_scf, sab_nl, bs_env, cfm_v_xc)
2877 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
2901 CALL timestop(handle)
2903 END SUBROUTINE trafo_v_xc_r_to_kp
2910 SUBROUTINE heuristic_ri_regularization(qs_env, bs_env)
2914 CHARACTER(LEN=*),
PARAMETER :: routinen =
'heuristic_RI_regularization'
2916 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m
2917 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
2919 REAL(kind=
dp) :: cond_nr, cond_nr_max, max_ev, &
2920 max_ev_ikp, min_ev, min_ev_ikp
2921 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
2923 CALL timeset(routinen, handle)
2926 CALL get_v_tr_r(m_r, bs_env%ri_metric, 0.0_dp, bs_env, qs_env)
2928 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
2934 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2935 nkp_local = nkp_local + 1
2938 ALLOCATE (m(n_ri, n_ri, nkp_local))
2941 cond_nr_max = 0.0_dp
2948 IF (
modulo(ikp, bs_env%para_env%num_pe) .NE. bs_env%para_env%mepos) cycle
2950 ikp_local = ikp_local + 1
2954 bs_env%kpoints_scf_desymm%index_to_cell, &
2955 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
2958 CALL power(m(:, :, ikp_local), 1.0_dp, 0.0_dp, cond_nr, min_ev_ikp, max_ev_ikp)
2960 IF (cond_nr > cond_nr_max) cond_nr_max = cond_nr
2961 IF (max_ev_ikp > max_ev) max_ev = max_ev_ikp
2962 IF (min_ev_ikp < min_ev) min_ev = min_ev_ikp
2966 CALL bs_env%para_env%max(cond_nr_max)
2970 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Min. abs. eigenvalue of RI metric matrix M(k)", min_ev
2971 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Max. abs. eigenvalue of RI metric matrix M(k)", max_ev
2972 WRITE (u, fmt=
"(T2,A,ES50.1)")
"Max. condition number of M(k)", cond_nr_max
2975 CALL timestop(handle)
2977 END SUBROUTINE heuristic_ri_regularization
2987 SUBROUTINE get_v_tr_r(V_tr_R, pot_type, regularization_RI, bs_env, qs_env)
2988 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: v_tr_r
2990 REAL(kind=
dp) :: regularization_ri
2994 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_V_tr_R'
2996 INTEGER :: handle, img, nimages_scf_desymm
2997 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
2998 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
3000 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_v_tr_r
3002 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_v_tr_r
3007 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3009 CALL timeset(routinen, handle)
3011 NULLIFY (sab_ri, dist_2d)
3014 blacs_env=blacs_env, &
3015 distribution_2d=dist_2d, &
3016 qs_kind_set=qs_kind_set, &
3017 particle_set=particle_set)
3019 ALLOCATE (sizes_ri(bs_env%n_atom))
3020 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=bs_env%basis_set_RI)
3022 pot_type,
"2c_nl_RI", qs_env, sym_ij=.false., &
3025 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
3026 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
3027 row_bsize(:) = sizes_ri
3028 col_bsize(:) = sizes_ri
3030 nimages_scf_desymm = bs_env%nimages_scf_desymm
3031 ALLOCATE (mat_v_tr_r(nimages_scf_desymm))
3032 CALL dbcsr_create(mat_v_tr_r(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_no_symmetry, &
3033 row_bsize, col_bsize)
3034 DEALLOCATE (row_bsize, col_bsize)
3036 DO img = 2, nimages_scf_desymm
3037 CALL dbcsr_create(mat_v_tr_r(img), template=mat_v_tr_r(1))
3041 bs_env%basis_set_RI, pot_type, do_kpoints=.true., &
3042 ext_kpoints=bs_env%kpoints_scf_desymm, &
3043 regularization_ri=regularization_ri)
3045 ALLOCATE (fm_v_tr_r(nimages_scf_desymm))
3046 DO img = 1, nimages_scf_desymm
3047 CALL cp_fm_create(fm_v_tr_r(img), bs_env%fm_RI_RI%matrix_struct)
3052 IF (.NOT.
ALLOCATED(v_tr_r))
THEN
3053 ALLOCATE (v_tr_r(bs_env%n_RI, bs_env%n_RI, nimages_scf_desymm))
3062 CALL timestop(handle)
3075 SUBROUTINE power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
3076 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
3077 REAL(kind=
dp) :: exponent, eps
3078 REAL(kind=
dp),
OPTIONAL :: cond_nr, min_ev, max_ev
3080 CHARACTER(len=*),
PARAMETER :: routinen =
'power'
3082 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenvectors
3083 INTEGER :: handle, i, n
3084 REAL(kind=
dp) :: pos_eval
3085 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
3087 CALL timeset(routinen, handle)
3090 matrix(:, :) = 0.5_dp*(matrix(:, :) + conjg(transpose(matrix(:, :))))
3093 ALLOCATE (eigenvalues(n), eigenvectors(n, n))
3096 IF (
PRESENT(cond_nr)) cond_nr = maxval(abs(eigenvalues))/minval(abs(eigenvalues))
3097 IF (
PRESENT(min_ev)) min_ev = minval(abs(eigenvalues))
3098 IF (
PRESENT(max_ev)) max_ev = maxval(abs(eigenvalues))
3101 IF (eps < eigenvalues(i))
THEN
3102 pos_eval = (eigenvalues(i))**(0.5_dp*exponent)
3106 eigenvectors(:, i) = eigenvectors(:, i)*pos_eval
3109 CALL zgemm(
"N",
"C", n, n, n,
z_one, eigenvectors, n, eigenvectors, n,
z_zero, matrix, n)
3111 DEALLOCATE (eigenvalues, eigenvectors)
3113 CALL timestop(handle)
3115 END SUBROUTINE power
3126 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_n_time, sigma_c_n_freq
3129 CHARACTER(LEN=*),
PARAMETER :: routinen =
'time_to_freq'
3131 INTEGER :: handle, i_t, j_w, n_occ
3132 REAL(kind=
dp) :: freq_j, time_i, w_cos_ij, w_sin_ij
3133 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sigma_c_n_cos_time, sigma_c_n_sin_time
3135 CALL timeset(routinen, handle)
3137 ALLOCATE (sigma_c_n_cos_time(bs_env%n_ao, bs_env%num_time_freq_points))
3138 ALLOCATE (sigma_c_n_sin_time(bs_env%n_ao, bs_env%num_time_freq_points))
3140 sigma_c_n_cos_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) + sigma_c_n_time(:, :, 2))
3141 sigma_c_n_sin_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) - sigma_c_n_time(:, :, 2))
3143 sigma_c_n_freq(:, :, :) = 0.0_dp
3145 DO i_t = 1, bs_env%num_time_freq_points
3147 DO j_w = 1, bs_env%num_time_freq_points
3149 freq_j = bs_env%imag_freq_points(j_w)
3150 time_i = bs_env%imag_time_points(i_t)
3152 w_cos_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(freq_j*time_i)
3153 w_sin_ij = bs_env%weights_sin_t_to_w(j_w, i_t)*sin(freq_j*time_i)
3156 sigma_c_n_freq(:, j_w, 1) = sigma_c_n_freq(:, j_w, 1) + &
3157 w_cos_ij*sigma_c_n_cos_time(:, i_t)
3160 sigma_c_n_freq(:, j_w, 2) = sigma_c_n_freq(:, j_w, 2) + &
3161 w_sin_ij*sigma_c_n_sin_time(:, i_t)
3170 n_occ = bs_env%n_occ(ispin)
3171 sigma_c_n_freq(1:n_occ, :, 2) = -sigma_c_n_freq(1:n_occ, :, 2)
3173 CALL timestop(handle)
3188 eigenval_scf, ikp, ispin)
3191 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq
3192 REAL(kind=
dp),
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf
3193 INTEGER :: ikp, ispin
3195 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyt_conti_and_print'
3197 CHARACTER(len=3) :: occ_vir
3198 CHARACTER(len=default_string_length) :: fname
3199 INTEGER :: handle, i_mo, ikp_for_print, iunit, &
3201 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
3203 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dummy, sigma_c_ikp_n_qp
3205 CALL timeset(routinen, handle)
3208 ALLOCATE (dummy(n_mo), sigma_c_ikp_n_qp(n_mo))
3209 sigma_c_ikp_n_qp(:) = 0.0_dp
3214 IF (
modulo(i_mo, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3217 bs_env%imag_freq_points_fit, dummy, dummy, &
3218 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 1)*
z_one + &
3219 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 2)*
gaussi, &
3220 sigma_x_ikp_n(:) - v_xc_ikp_n(:), &
3221 eigenval_scf(:), eigenval_scf(:), &
3222 bs_env%do_hedin_shift, &
3223 i_mo, bs_env%n_occ(ispin), bs_env%n_vir(ispin), &
3224 bs_env%nparam_pade, bs_env%num_freq_points_fit, &
3226 0.0_dp, .true., .false., 1, e_fermi_ext=bs_env%e_fermi(ispin))
3229 CALL bs_env%para_env%sum(sigma_c_ikp_n_qp)
3231 CALL correct_obvious_fitting_fails(sigma_c_ikp_n_qp, ispin, bs_env)
3233 bs_env%eigenval_G0W0(:, ikp, ispin) = eigenval_scf(:) + &
3234 sigma_c_ikp_n_qp(:) + &
3235 sigma_x_ikp_n(:) - &
3238 bs_env%eigenval_HF(:, ikp, ispin) = eigenval_scf(:) + sigma_x_ikp_n(:) - v_xc_ikp_n(:)
3241 print_dos_kpoints = (bs_env%nkp_only_bs .LE. 0)
3243 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
3244 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
3246 IF (bs_env%para_env%is_source() .AND. print_ikp)
THEN
3248 IF (print_dos_kpoints)
THEN
3249 nkp = bs_env%nkp_only_DOS
3252 nkp = bs_env%nkp_only_bs
3253 ikp_for_print = ikp - bs_env%nkp_only_DOS
3256 fname =
"bandstructure_SCF_and_G0W0"
3258 IF (ikp_for_print == 1)
THEN
3259 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
3260 file_action=
"WRITE")
3262 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
3263 file_action=
"WRITE", file_position=
"APPEND")
3266 WRITE (iunit,
"(A)")
" "
3267 WRITE (iunit,
"(A10,I7,A25,3F10.4)")
"kpoint: ", ikp_for_print,
"coordinate: ", &
3268 bs_env%kpoints_DOS%xkp(:, ikp)
3269 WRITE (iunit,
"(A)")
" "
3270 WRITE (iunit,
"(A5,A12,3A17,A16,A18)")
"n",
"k", ϵ
"_nk^DFT (eV)", Σ
"^c_nk (eV)", &
3271 Σ
"^x_nk (eV)",
"v_nk^xc (eV)", ϵ
"_nk^G0W0 (eV)"
3272 WRITE (iunit,
"(A)")
" "
3275 IF (i_mo .LE. bs_env%n_occ(ispin)) occ_vir =
'occ'
3276 IF (i_mo > bs_env%n_occ(ispin)) occ_vir =
'vir'
3277 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', ikp_for_print, &
3278 eigenval_scf(i_mo)*
evolt, &
3279 sigma_c_ikp_n_qp(i_mo)*
evolt, &
3280 sigma_x_ikp_n(i_mo)*
evolt, &
3281 v_xc_ikp_n(i_mo)*
evolt, &
3282 bs_env%eigenval_G0W0(i_mo, ikp, ispin)*
evolt
3285 WRITE (iunit,
"(A)")
" "
3291 CALL timestop(handle)
3301 SUBROUTINE correct_obvious_fitting_fails(Sigma_c_ikp_n_qp, ispin, bs_env)
3302 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_c_ikp_n_qp
3306 CHARACTER(LEN=*),
PARAMETER :: routinen =
'correct_obvious_fitting_fails'
3308 INTEGER :: handle, homo, i_mo, j_mo, &
3309 n_levels_scissor, n_mo
3310 LOGICAL :: is_occ, is_vir
3311 REAL(kind=
dp) :: sum_sigma_c
3313 CALL timeset(routinen, handle)
3316 homo = bs_env%n_occ(ispin)
3321 IF (abs(sigma_c_ikp_n_qp(i_mo)) > 13.0_dp/
evolt)
THEN
3323 is_occ = (i_mo .LE. homo)
3324 is_vir = (i_mo > homo)
3326 n_levels_scissor = 0
3327 sum_sigma_c = 0.0_dp
3333 IF (is_occ .AND. j_mo > homo) cycle
3334 IF (is_vir .AND. j_mo .LE. homo) cycle
3335 IF (abs(i_mo - j_mo) > 10) cycle
3336 IF (i_mo == j_mo) cycle
3338 n_levels_scissor = n_levels_scissor + 1
3339 sum_sigma_c = sum_sigma_c + sigma_c_ikp_n_qp(j_mo)
3344 sigma_c_ikp_n_qp(i_mo) = sum_sigma_c/real(n_levels_scissor, kind=
dp)
3350 CALL timestop(handle)
3352 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
integer, parameter, public default_path_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, do_rixs, tb_tblite)
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.