55 dbt_clear, dbt_create, dbt_destroy, dbt_filter, dbt_iterator_blocks_left, &
56 dbt_iterator_next_block, dbt_iterator_start, dbt_iterator_stop, dbt_iterator_type, &
57 dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_type
131#include "base/base_uses.f90"
141 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_utils'
156 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env_for_gw'
160 CALL timeset(routinen, handle)
164 CALL read_gw_input_parameters(bs_env, bs_sec)
166 CALL print_header_and_input_parameters(bs_env)
168 CALL setup_ao_and_ri_basis_set(qs_env, bs_env)
170 CALL get_ri_basis_and_basis_function_indices(qs_env, bs_env)
172 CALL set_heuristic_parameters(bs_env, qs_env)
176 CALL setup_kpoints_chi_eps_w(bs_env, bs_env%kpoints_chi_eps_W)
179 CALL setup_cells_3c(qs_env, bs_env)
182 CALL set_parallelization_parameters(qs_env, bs_env)
184 CALL allocate_matrices(qs_env, bs_env)
186 CALL compute_v_xc(qs_env, bs_env)
188 CALL create_tensors(qs_env, bs_env)
190 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
193 CALL allocate_gw_eigenvalues(bs_env)
195 CALL check_sparsity_3c(qs_env, bs_env)
197 CALL set_sparsity_parallelization_parameters(bs_env)
199 CALL check_for_restart_files(qs_env, bs_env)
203 CALL compute_3c_integrals(qs_env, bs_env)
205 CALL setup_cells_delta_r(bs_env)
207 CALL setup_parallelization_delta_r(bs_env)
209 CALL allocate_matrices_small_cell_full_kp(qs_env, bs_env)
211 CALL trafo_v_xc_r_to_kp(qs_env, bs_env)
213 CALL heuristic_ri_regularization(qs_env, bs_env)
217 CALL setup_time_and_frequency_minimax_grid(bs_env)
225 IF (.NOT. bs_env%do_ldos .AND. .false.)
THEN
229 CALL timestop(handle)
240 CHARACTER(LEN=*),
PARAMETER :: routinen =
'de_init_bs_env'
244 CALL timeset(routinen, handle)
250 IF (
ASSOCIATED(bs_env%nl_3c%ij_list) .AND. (bs_env%rtp_method ==
rtp_method_bse))
THEN
251 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr, *)
"Retaining nl_3c for RTBSE"
258 CALL timestop(handle)
267 SUBROUTINE read_gw_input_parameters(bs_env, bs_sec)
271 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_gw_input_parameters'
276 CALL timeset(routinen, handle)
284 CALL section_vals_val_get(gw_sec,
"REGULARIZATION_MINIMAX", r_val=bs_env%input_regularization_minimax)
293 CALL timestop(handle)
295 END SUBROUTINE read_gw_input_parameters
302 SUBROUTINE setup_ao_and_ri_basis_set(qs_env, bs_env)
306 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_AO_and_RI_basis_set'
308 INTEGER :: handle, natom, nkind
310 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
312 CALL timeset(routinen, handle)
315 qs_kind_set=qs_kind_set, &
316 particle_set=particle_set, &
317 natom=natom, nkind=nkind)
320 ALLOCATE (bs_env%sizes_RI(natom), bs_env%sizes_AO(natom))
321 ALLOCATE (bs_env%basis_set_RI(nkind), bs_env%basis_set_AO(nkind))
327 basis=bs_env%basis_set_RI)
329 basis=bs_env%basis_set_AO)
331 CALL timestop(handle)
333 END SUBROUTINE setup_ao_and_ri_basis_set
340 SUBROUTINE get_ri_basis_and_basis_function_indices(qs_env, bs_env)
344 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_RI_basis_and_basis_function_indices'
346 INTEGER :: handle, i_ri, iatom, ikind, iset, &
347 max_ao_bf_per_atom, n_ao_test, n_atom, &
348 n_kind, n_ri, nset, nsgf, u
349 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
350 INTEGER,
DIMENSION(:),
POINTER :: l_max, l_min, nsgf_set
353 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
355 CALL timeset(routinen, handle)
358 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
360 n_kind =
SIZE(qs_kind_set)
361 n_atom = bs_env%n_atom
366 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
368 IF (.NOT.
ASSOCIATED(basis_set_a))
THEN
369 CALL cp_abort(__location__, &
370 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section.")
374 ALLOCATE (bs_env%i_RI_start_from_atom(n_atom))
375 ALLOCATE (bs_env%i_RI_end_from_atom(n_atom))
376 ALLOCATE (bs_env%i_ao_start_from_atom(n_atom))
377 ALLOCATE (bs_env%i_ao_end_from_atom(n_atom))
381 bs_env%i_RI_start_from_atom(iatom) = n_ri + 1
382 ikind = kind_of(iatom)
383 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
385 bs_env%i_RI_end_from_atom(iatom) = n_ri
389 max_ao_bf_per_atom = 0
392 bs_env%i_ao_start_from_atom(iatom) = n_ao_test + 1
393 ikind = kind_of(iatom)
394 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"ORB")
395 n_ao_test = n_ao_test + nsgf
396 bs_env%i_ao_end_from_atom(iatom) = n_ao_test
397 max_ao_bf_per_atom = max(max_ao_bf_per_atom, nsgf)
399 cpassert(n_ao_test == bs_env%n_ao)
400 bs_env%max_AO_bf_per_atom = max_ao_bf_per_atom
402 ALLOCATE (bs_env%l_RI(n_ri))
405 ikind = kind_of(iatom)
407 nset = bs_env%basis_set_RI(ikind)%gto_basis_set%nset
408 l_max => bs_env%basis_set_RI(ikind)%gto_basis_set%lmax
409 l_min => bs_env%basis_set_RI(ikind)%gto_basis_set%lmin
410 nsgf_set => bs_env%basis_set_RI(ikind)%gto_basis_set%nsgf_set
413 cpassert(l_max(iset) == l_min(iset))
414 bs_env%l_RI(i_ri + 1:i_ri + nsgf_set(iset)) = l_max(iset)
415 i_ri = i_ri + nsgf_set(iset)
419 cpassert(i_ri == n_ri)
424 WRITE (u, fmt=
"(T2,A)")
" "
425 WRITE (u, fmt=
"(T2,2A,T75,I8)")
"Number of auxiliary Gaussian basis functions ", &
429 CALL timestop(handle)
431 END SUBROUTINE get_ri_basis_and_basis_function_indices
438 SUBROUTINE setup_kpoints_chi_eps_w(bs_env, kpoints)
443 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_chi_eps_W'
445 INTEGER :: handle, i_dim, n_dim, nkp, nkp_extra, &
447 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
448 REAL(kind=
dp) :: exp_s_p, n_dim_inv
450 CALL timeset(routinen, handle)
456 kpoints%kp_scheme =
"GENERAL"
458 periodic(1:3) = bs_env%periodic(1:3)
460 cpassert(
SIZE(bs_env%nkp_grid_chi_eps_W_input) == 3)
462 IF (bs_env%nkp_grid_chi_eps_W_input(1) > 0 .AND. &
463 bs_env%nkp_grid_chi_eps_W_input(2) > 0 .AND. &
464 bs_env%nkp_grid_chi_eps_W_input(3) > 0)
THEN
467 SELECT CASE (periodic(i_dim))
470 nkp_grid_extra(i_dim) = 1
472 nkp_grid(i_dim) = bs_env%nkp_grid_chi_eps_W_input(i_dim)
473 nkp_grid_extra(i_dim) = nkp_grid(i_dim)*2
475 cpabort(
"Error in periodicity.")
479 ELSE IF (bs_env%nkp_grid_chi_eps_W_input(1) == -1 .AND. &
480 bs_env%nkp_grid_chi_eps_W_input(2) == -1 .AND. &
481 bs_env%nkp_grid_chi_eps_W_input(3) == -1)
THEN
486 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
488 SELECT CASE (periodic(i_dim))
491 nkp_grid_extra(i_dim) = 1
493 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
496 nkp_grid_extra(i_dim) = 6
498 nkp_grid(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*4
499 nkp_grid_extra(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*8
502 cpabort(
"Error in periodicity.")
509 cpabort(
"An error occured when setting up the k-mesh for W.")
513 nkp_orig = max(nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2, 1)
515 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
517 nkp = nkp_orig + nkp_extra
519 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
522 bs_env%nkp_grid_chi_eps_W_orig(1:3) = nkp_grid(1:3)
523 bs_env%nkp_grid_chi_eps_W_extra(1:3) = nkp_grid_extra(1:3)
524 bs_env%nkp_chi_eps_W_orig = nkp_orig
525 bs_env%nkp_chi_eps_W_extra = nkp_extra
526 bs_env%nkp_chi_eps_W_orig_plus_extra = nkp
528 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
529 ALLOCATE (bs_env%wkp_no_extra(nkp), bs_env%wkp_s_p(nkp))
531 CALL compute_xkp(kpoints%xkp, 1, nkp_orig, nkp_grid)
532 CALL compute_xkp(kpoints%xkp, nkp_orig + 1, nkp, nkp_grid_extra)
534 n_dim = sum(periodic)
537 kpoints%wkp(1) = 1.0_dp
538 bs_env%wkp_s_p(1) = 1.0_dp
539 bs_env%wkp_no_extra(1) = 1.0_dp
542 n_dim_inv = 1.0_dp/real(n_dim, kind=
dp)
545 CALL compute_wkp(kpoints%wkp(1:nkp_orig), nkp_orig, nkp_extra, n_dim_inv)
546 CALL compute_wkp(kpoints%wkp(nkp_orig + 1:nkp), nkp_extra, nkp_orig, n_dim_inv)
548 bs_env%wkp_no_extra(1:nkp_orig) = 0.0_dp
549 bs_env%wkp_no_extra(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=
dp)
554 exp_s_p = 2.0_dp*n_dim_inv
555 CALL compute_wkp(bs_env%wkp_s_p(1:nkp_orig), nkp_orig, nkp_extra, exp_s_p)
556 CALL compute_wkp(bs_env%wkp_s_p(nkp_orig + 1:nkp), nkp_extra, nkp_orig, exp_s_p)
558 bs_env%wkp_s_p(1:nkp) = bs_env%wkp_no_extra(1:nkp)
563 IF (bs_env%approx_kp_extrapol)
THEN
564 bs_env%wkp_orig = 1.0_dp/real(nkp_orig, kind=
dp)
570 bs_env%nkp_chi_eps_W_batch = 4
572 bs_env%num_chi_eps_W_batches = (bs_env%nkp_chi_eps_W_orig_plus_extra - 1)/ &
573 bs_env%nkp_chi_eps_W_batch + 1
578 WRITE (u, fmt=
"(T2,A)")
" "
579 WRITE (u, fmt=
"(T2,1A,T71,3I4)") χε
"K-point mesh 1 for , , W", nkp_grid(1:3)
580 WRITE (u, fmt=
"(T2,2A,T71,3I4)") χε
"K-point mesh 2 for , , W ", &
581 "(for k-point extrapolation of W)", nkp_grid_extra(1:3)
582 WRITE (u, fmt=
"(T2,A,T80,L)")
"Approximate the k-point extrapolation", &
583 bs_env%approx_kp_extrapol
586 CALL timestop(handle)
588 END SUBROUTINE setup_kpoints_chi_eps_w
599 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
600 INTEGER :: ikp_start, ikp_end
601 INTEGER,
DIMENSION(3) :: grid
603 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
605 INTEGER :: handle, i, ix, iy, iz
607 CALL timeset(routinen, handle)
614 IF (i > ikp_end) cycle
616 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
617 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
618 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
625 CALL timestop(handle)
636 SUBROUTINE compute_wkp(wkp, nkp_1, nkp_2, exponent)
637 REAL(kind=
dp),
DIMENSION(:) :: wkp
638 INTEGER :: nkp_1, nkp_2
639 REAL(kind=
dp) :: exponent
641 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp'
644 REAL(kind=
dp) :: nkp_ratio
646 CALL timeset(routinen, handle)
648 nkp_ratio = real(nkp_2, kind=
dp)/real(nkp_1, kind=
dp)
650 wkp(:) = 1.0_dp/real(nkp_1, kind=
dp)/(1.0_dp - nkp_ratio**exponent)
652 CALL timestop(handle)
654 END SUBROUTINE compute_wkp
661 SUBROUTINE allocate_matrices(qs_env, bs_env)
665 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices'
667 INTEGER :: handle, i_t
672 CALL timeset(routinen, handle)
674 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
676 fm_struct => bs_env%fm_ks_Gamma(1)%matrix_struct
681 NULLIFY (fm_struct_ri_global)
682 CALL cp_fm_struct_create(fm_struct_ri_global, context=blacs_env, nrow_global=bs_env%n_RI, &
683 ncol_global=bs_env%n_RI, para_env=para_env)
685 CALL cp_fm_create(bs_env%fm_chi_Gamma_freq, fm_struct_ri_global)
686 CALL cp_fm_create(bs_env%fm_W_MIC_freq, fm_struct_ri_global)
687 IF (bs_env%approx_kp_extrapol)
THEN
688 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_extra, fm_struct_ri_global)
689 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_no_extra, fm_struct_ri_global)
696 NULLIFY (blacs_env_tensor)
703 CALL create_mat_munu(bs_env%mat_ao_ao_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
704 blacs_env_tensor, do_ri_aux_basis=.false.)
706 CALL create_mat_munu(bs_env%mat_RI_RI_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
707 blacs_env_tensor, do_ri_aux_basis=.true.)
709 CALL create_mat_munu(bs_env%mat_RI_RI, qs_env, bs_env%eps_atom_grid_2d_mat, &
710 blacs_env, do_ri_aux_basis=.true.)
714 NULLIFY (bs_env%mat_chi_Gamma_tau)
717 DO i_t = 1, bs_env%num_time_freq_points
718 ALLOCATE (bs_env%mat_chi_Gamma_tau(i_t)%matrix)
719 CALL dbcsr_create(bs_env%mat_chi_Gamma_tau(i_t)%matrix, template=bs_env%mat_RI_RI%matrix)
722 CALL timestop(handle)
724 END SUBROUTINE allocate_matrices
730 SUBROUTINE allocate_gw_eigenvalues(bs_env)
733 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_GW_eigenvalues'
737 CALL timeset(routinen, handle)
739 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
740 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
742 CALL timestop(handle)
744 END SUBROUTINE allocate_gw_eigenvalues
751 SUBROUTINE create_tensors(qs_env, bs_env)
755 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors'
759 CALL timeset(routinen, handle)
761 CALL init_interaction_radii(bs_env)
765 CALL create_3c_t(bs_env%t_RI_AO__AO, bs_env%para_env_tensor,
"(RI AO | AO)", [1, 2], [3], &
766 bs_env%sizes_RI, bs_env%sizes_AO, &
767 create_nl_3c=.true., nl_3c=bs_env%nl_3c, qs_env=qs_env)
768 CALL create_3c_t(bs_env%t_RI__AO_AO, bs_env%para_env_tensor,
"(RI | AO AO)", [1], [2, 3], &
769 bs_env%sizes_RI, bs_env%sizes_AO)
771 CALL create_2c_t(bs_env, bs_env%sizes_RI, bs_env%sizes_AO)
773 CALL timestop(handle)
775 END SUBROUTINE create_tensors
782 SUBROUTINE check_sparsity_3c(qs_env, bs_env)
786 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_sparsity_3c'
788 INTEGER :: handle, n_atom_step, ri_atom
789 INTEGER(int_8) :: mem, non_zero_elements_sum, nze
790 REAL(
dp) :: max_dist_ao_atoms, occ, occupation_sum
791 REAL(kind=
dp) :: t1, t2
792 TYPE(dbt_type) :: t_3c_global
793 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_global_array
796 CALL timeset(routinen, handle)
800 CALL create_3c_t(t_3c_global, bs_env%para_env,
"(RI AO | AO)", [1, 2], [3], &
801 bs_env%sizes_RI, bs_env%sizes_AO, &
802 create_nl_3c=.true., nl_3c=nl_3c_global, qs_env=qs_env)
805 CALL bs_env%para_env%max(mem)
807 ALLOCATE (t_3c_global_array(1, 1))
808 CALL dbt_create(t_3c_global, t_3c_global_array(1, 1))
810 CALL bs_env%para_env%sync()
813 occupation_sum = 0.0_dp
814 non_zero_elements_sum = 0
815 max_dist_ao_atoms = 0.0_dp
816 n_atom_step = int(sqrt(real(bs_env%n_atom, kind=
dp)))
818 DO ri_atom = 1, bs_env%n_atom, n_atom_step
824 int_eps=bs_env%eps_filter, &
825 basis_i=bs_env%basis_set_RI, &
826 basis_j=bs_env%basis_set_AO, &
827 basis_k=bs_env%basis_set_AO, &
828 bounds_i=[ri_atom, min(ri_atom + n_atom_step - 1, bs_env%n_atom)], &
829 potential_parameter=bs_env%ri_metric, &
830 desymmetrize=.false.)
832 CALL dbt_filter(t_3c_global_array(1, 1), bs_env%eps_filter)
834 CALL bs_env%para_env%sync()
837 non_zero_elements_sum = non_zero_elements_sum + nze
838 occupation_sum = occupation_sum + occ
840 CALL get_max_dist_ao_atoms(t_3c_global_array(1, 1), max_dist_ao_atoms, qs_env)
842 CALL dbt_clear(t_3c_global_array(1, 1))
848 bs_env%occupation_3c_int = occupation_sum
849 bs_env%max_dist_AO_atoms = max_dist_ao_atoms
851 CALL dbt_destroy(t_3c_global)
852 CALL dbt_destroy(t_3c_global_array(1, 1))
853 DEALLOCATE (t_3c_global_array)
857 IF (bs_env%unit_nr > 0)
THEN
858 WRITE (bs_env%unit_nr,
'(T2,A)')
''
859 WRITE (bs_env%unit_nr,
'(T2,A,F27.1,A)') &
860 µν
'Computed 3-center integrals (|P), execution time', t2 - t1,
' s'
861 WRITE (bs_env%unit_nr,
'(T2,A,F48.3,A)') µν
'Percentage of non-zero (|P)', &
862 occupation_sum*100,
' %'
863 WRITE (bs_env%unit_nr,
'(T2,A,F33.1,A)') µνµν
'Max. distance between , in non-zero (|P)', &
865 WRITE (bs_env%unit_nr,
'(T2,2A,I20,A)')
'Required memory if storing all 3-center ', &
866 µν
'integrals (|P)', int(real(non_zero_elements_sum, kind=
dp)*8.0e-9_dp),
' GB'
869 CALL timestop(handle)
871 END SUBROUTINE check_sparsity_3c
879 SUBROUTINE create_2c_t(bs_env, sizes_RI, sizes_AO)
881 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
883 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_2c_t'
886 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_1, dist_2
887 INTEGER,
DIMENSION(2) :: pdims_2d
888 TYPE(dbt_pgrid_type) :: pgrid_2d
890 CALL timeset(routinen, handle)
895 CALL dbt_pgrid_create(bs_env%para_env_tensor, pdims_2d, pgrid_2d)
897 CALL create_2c_tensor(bs_env%t_G, dist_1, dist_2, pgrid_2d, sizes_ao, sizes_ao, &
899 DEALLOCATE (dist_1, dist_2)
900 CALL create_2c_tensor(bs_env%t_chi, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
902 DEALLOCATE (dist_1, dist_2)
903 CALL create_2c_tensor(bs_env%t_W, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
905 DEALLOCATE (dist_1, dist_2)
906 CALL dbt_pgrid_destroy(pgrid_2d)
908 CALL timestop(handle)
910 END SUBROUTINE create_2c_t
925 SUBROUTINE create_3c_t(tensor, para_env, tensor_name, map1, map2, sizes_RI, sizes_AO, &
926 create_nl_3c, nl_3c, qs_env)
929 CHARACTER(LEN=12) :: tensor_name
930 INTEGER,
DIMENSION(:) :: map1, map2
931 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
932 LOGICAL,
OPTIONAL :: create_nl_3c
936 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_3c_t'
938 INTEGER :: handle, nkind
939 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri
940 INTEGER,
DIMENSION(3) :: pcoord, pdims, pdims_3d
941 LOGICAL :: my_create_nl_3c
942 TYPE(dbt_pgrid_type) :: pgrid_3d
947 CALL timeset(routinen, handle)
950 CALL dbt_pgrid_create(para_env, pdims_3d, pgrid_3d)
952 pgrid_3d, sizes_ri, sizes_ao, sizes_ao, &
953 map1=map1, map2=map2, name=tensor_name)
955 IF (
PRESENT(create_nl_3c))
THEN
956 my_create_nl_3c = create_nl_3c
958 my_create_nl_3c = .false.
961 IF (my_create_nl_3c)
THEN
962 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
963 CALL dbt_mp_environ_pgrid(pgrid_3d, pdims, pcoord)
964 CALL mp_comm_t3c_2%create(pgrid_3d%mp_comm_2d, 3, pdims)
966 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
969 qs_env%bs_env%basis_set_RI, &
970 qs_env%bs_env%basis_set_AO, &
971 qs_env%bs_env%basis_set_AO, &
972 dist_3d, qs_env%bs_env%ri_metric, &
973 "GW_3c_nl", qs_env, own_dist=.true.)
976 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
977 CALL dbt_pgrid_destroy(pgrid_3d)
979 CALL timestop(handle)
981 END SUBROUTINE create_3c_t
987 SUBROUTINE init_interaction_radii(bs_env)
990 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_interaction_radii'
992 INTEGER :: handle, ibasis
995 CALL timeset(routinen, handle)
997 DO ibasis = 1,
SIZE(bs_env%basis_set_AO)
999 orb_basis => bs_env%basis_set_AO(ibasis)%gto_basis_set
1002 ri_basis => bs_env%basis_set_RI(ibasis)%gto_basis_set
1007 CALL timestop(handle)
1009 END SUBROUTINE init_interaction_radii
1017 SUBROUTINE get_max_dist_ao_atoms(t_3c_int, max_dist_AO_atoms, qs_env)
1018 TYPE(dbt_type) :: t_3c_int
1019 REAL(kind=
dp) :: max_dist_ao_atoms
1022 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_max_dist_AO_atoms'
1024 INTEGER :: atom_1, atom_2, handle, num_cells
1025 INTEGER,
DIMENSION(3) :: atom_ind
1026 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1027 REAL(kind=
dp) :: abs_rab
1028 REAL(kind=
dp),
DIMENSION(3) :: rab
1030 TYPE(dbt_iterator_type) :: iter
1034 CALL timeset(routinen, handle)
1036 NULLIFY (cell, particle_set, para_env)
1037 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, para_env=para_env)
1042 CALL dbt_iterator_start(iter, t_3c_int)
1043 DO WHILE (dbt_iterator_blocks_left(iter))
1044 CALL dbt_iterator_next_block(iter, atom_ind)
1046 atom_1 = atom_ind(2)
1047 atom_2 = atom_ind(3)
1049 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
1051 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
1053 max_dist_ao_atoms = max(max_dist_ao_atoms, abs_rab)
1056 CALL dbt_iterator_stop(iter)
1059 CALL para_env%max(max_dist_ao_atoms)
1061 CALL timestop(handle)
1063 END SUBROUTINE get_max_dist_ao_atoms
1069 SUBROUTINE set_sparsity_parallelization_parameters(bs_env)
1072 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_sparsity_parallelization_parameters'
1074 INTEGER :: handle, i_ivl, il_ivl, j_ivl, n_atom_per_il_ivl, n_atom_per_ivl, n_intervals_i, &
1075 n_intervals_inner_loop_atoms, n_intervals_j, u
1076 INTEGER(KIND=int_8) :: input_memory_per_proc
1078 CALL timeset(routinen, handle)
1081 bs_env%safety_factor_memory = 0.10_dp
1083 input_memory_per_proc = int(bs_env%input_memory_per_proc_GB*1.0e9_dp, kind=
int_8)
1089 n_atom_per_ivl = int(sqrt(bs_env%safety_factor_memory*input_memory_per_proc &
1090 *bs_env%group_size_tensor/24/bs_env%n_RI &
1091 /sqrt(bs_env%occupation_3c_int)))/bs_env%max_AO_bf_per_atom
1093 n_intervals_i = (bs_env%n_atom_i - 1)/n_atom_per_ivl + 1
1094 n_intervals_j = (bs_env%n_atom_j - 1)/n_atom_per_ivl + 1
1096 bs_env%n_atom_per_interval_ij = n_atom_per_ivl
1097 bs_env%n_intervals_i = n_intervals_i
1098 bs_env%n_intervals_j = n_intervals_j
1100 ALLOCATE (bs_env%i_atom_intervals(2, n_intervals_i))
1101 ALLOCATE (bs_env%j_atom_intervals(2, n_intervals_j))
1103 DO i_ivl = 1, n_intervals_i
1104 bs_env%i_atom_intervals(1, i_ivl) = (i_ivl - 1)*n_atom_per_ivl + bs_env%atoms_i(1)
1105 bs_env%i_atom_intervals(2, i_ivl) = min(i_ivl*n_atom_per_ivl + bs_env%atoms_i(1) - 1, &
1109 DO j_ivl = 1, n_intervals_j
1110 bs_env%j_atom_intervals(1, j_ivl) = (j_ivl - 1)*n_atom_per_ivl + bs_env%atoms_j(1)
1111 bs_env%j_atom_intervals(2, j_ivl) = min(j_ivl*n_atom_per_ivl + bs_env%atoms_j(1) - 1, &
1115 ALLOCATE (bs_env%skip_Sigma_occ(n_intervals_i, n_intervals_j))
1116 ALLOCATE (bs_env%skip_Sigma_vir(n_intervals_i, n_intervals_j))
1117 bs_env%skip_Sigma_occ(:, :) = .false.
1118 bs_env%skip_Sigma_vir(:, :) = .false.
1123 n_atom_per_il_ivl = min(int(bs_env%safety_factor_memory*input_memory_per_proc &
1124 *bs_env%group_size_tensor/n_atom_per_ivl &
1125 /bs_env%max_AO_bf_per_atom &
1126 /bs_env%n_RI/8/sqrt(bs_env%occupation_3c_int) &
1127 /bs_env%max_AO_bf_per_atom), bs_env%n_atom)
1129 n_intervals_inner_loop_atoms = (bs_env%n_atom - 1)/n_atom_per_il_ivl + 1
1131 bs_env%n_atom_per_IL_interval = n_atom_per_il_ivl
1132 bs_env%n_intervals_inner_loop_atoms = n_intervals_inner_loop_atoms
1134 ALLOCATE (bs_env%inner_loop_atom_intervals(2, n_intervals_inner_loop_atoms))
1135 DO il_ivl = 1, n_intervals_inner_loop_atoms
1136 bs_env%inner_loop_atom_intervals(1, il_ivl) = (il_ivl - 1)*n_atom_per_il_ivl + 1
1137 bs_env%inner_loop_atom_intervals(2, il_ivl) = min(il_ivl*n_atom_per_il_ivl, bs_env%n_atom)
1142 WRITE (u,
'(T2,A)')
''
1143 WRITE (u,
'(T2,A,I33)') λντνλτ
'Number of i and j atoms in M_P(), N_Q():', n_atom_per_ivl
1144 WRITE (u,
'(T2,A,I18)') µλνµµνµλ
'Number of inner loop atoms for in M_P = sum_ (|P) G_', &
1148 CALL timestop(handle)
1150 END SUBROUTINE set_sparsity_parallelization_parameters
1157 SUBROUTINE check_for_restart_files(qs_env, bs_env)
1161 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_for_restart_files'
1163 CHARACTER(LEN=9) :: frmt
1164 CHARACTER(len=default_path_length) :: project_name
1165 CHARACTER(len=default_string_length) :: f_chi, f_s_n, f_s_p, f_s_x, f_w_t, prefix
1166 INTEGER :: handle, i_spin, i_t_or_w, ind, n_spin, &
1167 num_time_freq_points
1168 LOGICAL :: chi_exists, sigma_neg_time_exists, &
1169 sigma_pos_time_exists, &
1170 sigma_x_spin_exists, w_time_exists
1174 CALL timeset(routinen, handle)
1176 num_time_freq_points = bs_env%num_time_freq_points
1177 n_spin = bs_env%n_spin
1179 ALLOCATE (bs_env%read_chi(num_time_freq_points))
1180 ALLOCATE (bs_env%calc_chi(num_time_freq_points))
1181 ALLOCATE (bs_env%Sigma_c_exists(num_time_freq_points, n_spin))
1189 WRITE (prefix,
'(2A)') trim(project_name),
"-RESTART_"
1190 bs_env%prefix = prefix
1192 bs_env%all_W_exist = .true.
1194 DO i_t_or_w = 1, num_time_freq_points
1196 IF (i_t_or_w < 10)
THEN
1197 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1198 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_0", i_t_or_w,
".matrix"
1199 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_0", i_t_or_w,
".matrix"
1200 ELSE IF (i_t_or_w < 100)
THEN
1201 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1202 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_", i_t_or_w,
".matrix"
1203 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_", i_t_or_w,
".matrix"
1205 cpabort(
'Please implement more than 99 time/frequency points.')
1208 INQUIRE (file=trim(f_chi), exist=chi_exists)
1209 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1211 bs_env%read_chi(i_t_or_w) = chi_exists
1212 bs_env%calc_chi(i_t_or_w) = .NOT. chi_exists
1214 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1217 DO i_spin = 1, n_spin
1219 ind = i_t_or_w + (i_spin - 1)*num_time_freq_points
1222 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1223 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_0", ind,
".matrix"
1224 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_0", ind,
".matrix"
1225 ELSE IF (i_t_or_w < 100)
THEN
1226 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1227 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_", ind,
".matrix"
1228 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_", ind,
".matrix"
1231 INQUIRE (file=trim(f_s_p), exist=sigma_pos_time_exists)
1232 INQUIRE (file=trim(f_s_n), exist=sigma_neg_time_exists)
1234 bs_env%Sigma_c_exists(i_t_or_w, i_spin) = sigma_pos_time_exists .AND. &
1235 sigma_neg_time_exists
1243 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix),
"W_freq_rtp",
"_0", 0,
".matrix"
1244 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1245 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1248 IF (bs_env%all_W_exist)
THEN
1249 bs_env%read_chi(:) = .false.
1250 bs_env%calc_chi(:) = .false.
1253 bs_env%Sigma_x_exists = .true.
1254 DO i_spin = 1, n_spin
1255 WRITE (f_s_x,
'(3A,I1,A)') trim(prefix), bs_env%Sigma_x_name,
"_0", i_spin,
".matrix"
1256 INQUIRE (file=trim(f_s_x), exist=sigma_x_spin_exists)
1257 bs_env%Sigma_x_exists = bs_env%Sigma_x_exists .AND. sigma_x_spin_exists
1262 IF (any(bs_env%read_chi(:)) &
1263 .OR. any(bs_env%Sigma_c_exists) &
1264 .OR. bs_env%all_W_exist &
1265 .OR. bs_env%Sigma_x_exists &
1268 IF (qs_env%scf_env%iter_count /= 1)
THEN
1269 CALL cp_warn(__location__,
"SCF needed more than 1 step, "// &
1270 "which might lead to spurious GW results when using GW restart files. ")
1274 CALL timestop(handle)
1276 END SUBROUTINE check_for_restart_files
1283 SUBROUTINE set_parallelization_parameters(qs_env, bs_env)
1287 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_parallelization_parameters'
1289 INTEGER :: color_sub, dummy_1, dummy_2, handle, &
1290 num_pe, num_t_groups, u
1291 INTEGER(KIND=int_8) :: mem
1294 CALL timeset(routinen, handle)
1298 num_pe = para_env%num_pe
1301 IF (bs_env%group_size_tensor < 0 .OR. bs_env%group_size_tensor > num_pe) &
1302 bs_env%group_size_tensor = num_pe
1305 IF (
modulo(num_pe, bs_env%group_size_tensor) /= 0)
THEN
1306 CALL find_good_group_size(num_pe, bs_env%group_size_tensor)
1310 color_sub = para_env%mepos/bs_env%group_size_tensor
1311 bs_env%tensor_group_color = color_sub
1313 ALLOCATE (bs_env%para_env_tensor)
1314 CALL bs_env%para_env_tensor%from_split(para_env, color_sub)
1316 num_t_groups = para_env%num_pe/bs_env%group_size_tensor
1317 bs_env%num_tensor_groups = num_t_groups
1319 CALL get_i_j_atoms(bs_env%atoms_i, bs_env%atoms_j, bs_env%n_atom_i, bs_env%n_atom_j, &
1322 ALLOCATE (bs_env%atoms_i_t_group(2, num_t_groups))
1323 ALLOCATE (bs_env%atoms_j_t_group(2, num_t_groups))
1324 DO color_sub = 0, num_t_groups - 1
1325 CALL get_i_j_atoms(bs_env%atoms_i_t_group(1:2, color_sub + 1), &
1326 bs_env%atoms_j_t_group(1:2, color_sub + 1), &
1327 dummy_1, dummy_2, color_sub, bs_env)
1331 CALL bs_env%para_env%max(mem)
1335 WRITE (u,
'(T2,A,I47)')
'Group size for tensor operations', bs_env%group_size_tensor
1336 IF (bs_env%group_size_tensor > 1 .AND. bs_env%n_atom < 5)
THEN
1337 WRITE (u,
'(T2,A)')
'The requested group size is > 1 which can lead to bad performance.'
1338 WRITE (u,
'(T2,A)')
'Using more memory per MPI process might improve performance.'
1339 WRITE (u,
'(T2,A)')
'(Also increase MEMORY_PER_PROC when using more memory per process.)'
1343 CALL timestop(handle)
1345 END SUBROUTINE set_parallelization_parameters
1352 SUBROUTINE find_good_group_size(num_pe, group_size)
1354 INTEGER :: num_pe, group_size
1356 CHARACTER(LEN=*),
PARAMETER :: routinen =
'find_good_group_size'
1358 INTEGER :: group_size_minus, group_size_orig, &
1359 group_size_plus, handle, i_diff
1361 CALL timeset(routinen, handle)
1363 group_size_orig = group_size
1365 DO i_diff = 1, num_pe
1367 group_size_minus = group_size - i_diff
1369 IF (
modulo(num_pe, group_size_minus) == 0 .AND. group_size_minus > 0)
THEN
1370 group_size = group_size_minus
1374 group_size_plus = group_size + i_diff
1376 IF (
modulo(num_pe, group_size_plus) == 0 .AND. group_size_plus <= num_pe)
THEN
1377 group_size = group_size_plus
1383 IF (group_size_orig == group_size) cpabort(
"Group size error")
1385 CALL timestop(handle)
1387 END SUBROUTINE find_good_group_size
1398 SUBROUTINE get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
1400 INTEGER,
DIMENSION(2) :: atoms_i, atoms_j
1401 INTEGER :: n_atom_i, n_atom_j, color_sub
1404 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atoms'
1406 INTEGER :: handle, i_atoms_per_group, i_group, &
1407 ipcol, ipcol_loop, iprow, iprow_loop, &
1408 j_atoms_per_group, npcol, nprow
1410 CALL timeset(routinen, handle)
1413 CALL square_mesh(nprow, npcol, bs_env%num_tensor_groups)
1416 DO ipcol_loop = 0, npcol - 1
1417 DO iprow_loop = 0, nprow - 1
1418 IF (i_group == color_sub)
THEN
1422 i_group = i_group + 1
1426 IF (
modulo(bs_env%n_atom, nprow) == 0)
THEN
1427 i_atoms_per_group = bs_env%n_atom/nprow
1429 i_atoms_per_group = bs_env%n_atom/nprow + 1
1432 IF (
modulo(bs_env%n_atom, npcol) == 0)
THEN
1433 j_atoms_per_group = bs_env%n_atom/npcol
1435 j_atoms_per_group = bs_env%n_atom/npcol + 1
1438 atoms_i(1) = iprow*i_atoms_per_group + 1
1439 atoms_i(2) = min((iprow + 1)*i_atoms_per_group, bs_env%n_atom)
1440 n_atom_i = atoms_i(2) - atoms_i(1) + 1
1442 atoms_j(1) = ipcol*j_atoms_per_group + 1
1443 atoms_j(2) = min((ipcol + 1)*j_atoms_per_group, bs_env%n_atom)
1444 n_atom_j = atoms_j(2) - atoms_j(1) + 1
1446 CALL timestop(handle)
1456 SUBROUTINE square_mesh(nprow, npcol, nproc)
1457 INTEGER :: nprow, npcol, nproc
1459 CHARACTER(LEN=*),
PARAMETER :: routinen =
'square_mesh'
1461 INTEGER :: gcd_max, handle, ipe, jpe
1463 CALL timeset(routinen, handle)
1466 DO ipe = 1, ceiling(sqrt(real(nproc,
dp)))
1468 IF (ipe*jpe /= nproc) cycle
1469 IF (
gcd(ipe, jpe) >= gcd_max)
THEN
1472 gcd_max =
gcd(ipe, jpe)
1476 CALL timestop(handle)
1478 END SUBROUTINE square_mesh
1485 SUBROUTINE set_heuristic_parameters(bs_env, qs_env)
1489 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
1491 INTEGER :: handle, u
1492 LOGICAL :: do_bvk_cell
1494 CALL timeset(routinen, handle)
1497 bs_env%num_points_per_magnitude = 200
1499 IF (bs_env%input_regularization_minimax > -1.0e-12_dp)
THEN
1500 bs_env%regularization_minimax = bs_env%input_regularization_minimax
1505 IF (sum(bs_env%periodic) /= 0 .OR. bs_env%num_time_freq_points >= 20)
THEN
1506 bs_env%regularization_minimax = 1.0e-6_dp
1508 bs_env%regularization_minimax = 0.0_dp
1512 bs_env%stabilize_exp = 70.0_dp
1513 bs_env%eps_atom_grid_2d_mat = 1.0e-50_dp
1516 bs_env%nparam_pade = 16
1520 bs_env%ri_metric%omega = 0.0_dp
1522 bs_env%ri_metric%filename =
"t_c_g.dat"
1524 bs_env%eps_eigval_mat_RI = 0.0_dp
1526 IF (bs_env%input_regularization_RI > -1.0e-12_dp)
THEN
1527 bs_env%regularization_RI = bs_env%input_regularization_RI
1532 bs_env%regularization_RI = 1.0e-2_dp
1535 IF (sum(bs_env%periodic) == 0) bs_env%regularization_RI = 0.0_dp
1543 rel_cutoff_trunc_coulomb_ri_x=0.5_dp, &
1544 cell_grid=bs_env%cell_grid_scf_desymm, &
1545 do_bvk_cell=do_bvk_cell)
1549 bs_env%heuristic_filter_factor = 1.0e-4
1553 WRITE (u, fmt=
"(T2,2A,F21.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1554 Σ
"operator in ^x:", bs_env%trunc_coulomb%cutoff_radius*
angstrom, Å
" "
1555 WRITE (u, fmt=
"(T2,2A,F15.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1556 "operator in RI metric:", bs_env%ri_metric%cutoff_radius*
angstrom, Å
" "
1557 WRITE (u, fmt=
"(T2,A,ES48.1)")
"Regularization parameter of RI ", bs_env%regularization_RI
1558 WRITE (u, fmt=
"(T2,A,ES38.1)")
"Regularization parameter of minimax grids", &
1559 bs_env%regularization_minimax
1560 WRITE (u, fmt=
"(T2,A,I53)")
"Lattice sum size for V(k):", bs_env%size_lattice_sum_V
1563 CALL timestop(handle)
1565 END SUBROUTINE set_heuristic_parameters
1571 SUBROUTINE print_header_and_input_parameters(bs_env)
1575 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header_and_input_parameters'
1577 INTEGER :: handle, u
1579 CALL timeset(routinen, handle)
1584 WRITE (u,
'(T2,A)')
' '
1585 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1586 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1587 WRITE (u,
'(T2,A,A46,A32)')
'-',
'GW CALCULATION',
'-'
1588 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1589 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1590 WRITE (u,
'(T2,A)')
' '
1591 WRITE (u,
'(T2,A,I45)')
'Input: Number of time/freq. points', bs_env%num_time_freq_points
1592 WRITE (u,
"(T2,A,F44.1,A)") ωΣω
'Input: _max for fitting (i) (eV)', bs_env%freq_max_fit*
evolt
1593 WRITE (u,
'(T2,A,ES27.1)')
'Input: Filter threshold for sparse tensor operations', &
1595 WRITE (u,
"(T2,A,L55)")
'Input: Apply Hedin shift', bs_env%do_hedin_shift
1598 CALL timestop(handle)
1600 END SUBROUTINE print_header_and_input_parameters
1607 SUBROUTINE compute_v_xc(qs_env, bs_env)
1611 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_xc'
1613 INTEGER :: handle, img, ispin, myfun, nimages
1614 LOGICAL :: hf_present
1615 REAL(kind=
dp) :: energy_ex, energy_exc, energy_total, &
1617 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_ks_without_v_xc
1618 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp
1623 CALL timeset(routinen, handle)
1625 CALL get_qs_env(qs_env, input=input, energy=energy, dft_control=dft_control)
1628 nimages = dft_control%nimages
1629 dft_control%nimages = bs_env%nimages_scf
1637 hf_present = .false.
1638 IF (
ASSOCIATED(hf_section))
THEN
1641 IF (hf_present)
THEN
1648 energy_total = energy%total
1649 energy_exc = energy%exc
1650 energy_ex = energy%ex
1652 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1655 NULLIFY (mat_ks_without_v_xc)
1658 DO ispin = 1, bs_env%n_spin
1659 ALLOCATE (mat_ks_without_v_xc(ispin)%matrix)
1660 IF (hf_present)
THEN
1661 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix, &
1662 matrix_type=dbcsr_type_symmetric)
1664 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1670 ext_ks_matrix=mat_ks_without_v_xc)
1672 DO ispin = 1, bs_env%n_spin
1674 CALL cp_fm_create(bs_env%fm_V_xc_Gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1675 CALL copy_dbcsr_to_fm(mat_ks_without_v_xc(ispin)%matrix, bs_env%fm_V_xc_Gamma(ispin))
1679 beta=1.0_dp, matrix_b=bs_env%fm_ks_Gamma(ispin))
1688 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks_kp)
1690 ALLOCATE (bs_env%fm_V_xc_R(dft_control%nimages, bs_env%n_spin))
1691 DO ispin = 1, bs_env%n_spin
1692 DO img = 1, dft_control%nimages
1694 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1695 CALL cp_fm_create(bs_env%fm_V_xc_R(img, ispin), bs_env%fm_work_mo(1)%matrix_struct, &
1699 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1706 energy%total = energy_total
1707 energy%exc = energy_exc
1708 energy%ex = energy_ex
1711 dft_control%nimages = nimages
1716 IF (hf_present)
THEN
1724 DO ispin = 1, bs_env%n_spin
1725 DO img = 1, dft_control%nimages
1727 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1730 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1735 CALL timestop(handle)
1737 END SUBROUTINE compute_v_xc
1743 SUBROUTINE setup_time_and_frequency_minimax_grid(bs_env)
1746 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_time_and_frequency_minimax_grid'
1748 INTEGER :: handle, homo, i_w, ierr, ispin, j_w, &
1749 n_mo, num_time_freq_points, u
1750 REAL(kind=
dp) :: e_max, e_max_ispin, e_min, e_min_ispin, &
1751 e_range, max_error_min
1752 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: points_and_weights
1754 CALL timeset(routinen, handle)
1757 num_time_freq_points = bs_env%num_time_freq_points
1759 ALLOCATE (bs_env%imag_freq_points(num_time_freq_points))
1760 ALLOCATE (bs_env%imag_time_points(num_time_freq_points))
1761 ALLOCATE (bs_env%imag_time_weights_freq_zero(num_time_freq_points))
1762 ALLOCATE (bs_env%weights_cos_t_to_w(num_time_freq_points, num_time_freq_points))
1763 ALLOCATE (bs_env%weights_cos_w_to_t(num_time_freq_points, num_time_freq_points))
1764 ALLOCATE (bs_env%weights_sin_t_to_w(num_time_freq_points, num_time_freq_points))
1769 DO ispin = 1, bs_env%n_spin
1770 homo = bs_env%n_occ(ispin)
1771 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1773 e_min_ispin = bs_env%eigenval_scf_Gamma(homo + 1, ispin) - &
1774 bs_env%eigenval_scf_Gamma(homo, ispin)
1775 e_max_ispin = bs_env%eigenval_scf_Gamma(n_mo, ispin) - &
1776 bs_env%eigenval_scf_Gamma(1, ispin)
1778 e_min_ispin = minval(bs_env%eigenval_scf(homo + 1, :, ispin)) - &
1779 maxval(bs_env%eigenval_scf(homo, :, ispin))
1780 e_max_ispin = maxval(bs_env%eigenval_scf(n_mo, :, ispin)) - &
1781 minval(bs_env%eigenval_scf(1, :, ispin))
1783 e_min = min(e_min, e_min_ispin)
1784 e_max = max(e_max, e_max_ispin)
1787 e_range = e_max/e_min
1789 ALLOCATE (points_and_weights(2*num_time_freq_points))
1792 IF (num_time_freq_points <= 20)
THEN
1800 bs_env%imag_freq_points(:) = points_and_weights(1:num_time_freq_points)*e_min
1803 bs_env%num_freq_points_fit = 0
1804 DO i_w = 1, num_time_freq_points
1805 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1806 bs_env%num_freq_points_fit = bs_env%num_freq_points_fit + 1
1811 ALLOCATE (bs_env%imag_freq_points_fit(bs_env%num_freq_points_fit))
1813 DO i_w = 1, num_time_freq_points
1814 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1816 bs_env%imag_freq_points_fit(j_w) = bs_env%imag_freq_points(i_w)
1822 IF (bs_env%num_freq_points_fit < bs_env%nparam_pade)
THEN
1823 bs_env%nparam_pade = bs_env%num_freq_points_fit
1827 IF (num_time_freq_points <= 20)
THEN
1833 bs_env%imag_time_points(:) = points_and_weights(1:num_time_freq_points)/(2.0_dp*e_min)
1834 bs_env%imag_time_weights_freq_zero(:) = points_and_weights(num_time_freq_points + 1:)/(e_min)
1836 DEALLOCATE (points_and_weights)
1840 WRITE (u,
'(T2,A)')
''
1841 WRITE (u,
'(T2,A,F55.2)')
'SCF direct band gap (eV)', e_min*
evolt
1842 WRITE (u,
'(T2,A,F53.2)')
'Max. SCF eigval diff. (eV)', e_max*
evolt
1843 WRITE (u,
'(T2,A,F55.2)')
'E-Range for minimax grid', e_range
1844 WRITE (u,
'(T2,A,I27)') é
'Number of Pad parameters for analytic continuation:', &
1846 WRITE (u,
'(T2,A)')
''
1856 bs_env%imag_time_points, &
1857 bs_env%weights_cos_t_to_w, &
1858 bs_env%imag_freq_points, &
1859 e_min, e_max, max_error_min, &
1860 bs_env%num_points_per_magnitude, &
1861 bs_env%regularization_minimax)
1865 bs_env%imag_time_points, &
1866 bs_env%weights_cos_w_to_t, &
1867 bs_env%imag_freq_points, &
1868 e_min, e_max, max_error_min, &
1869 bs_env%num_points_per_magnitude, &
1870 bs_env%regularization_minimax)
1874 bs_env%imag_time_points, &
1875 bs_env%weights_sin_t_to_w, &
1876 bs_env%imag_freq_points, &
1877 e_min, e_max, max_error_min, &
1878 bs_env%num_points_per_magnitude, &
1879 bs_env%regularization_minimax)
1881 CALL timestop(handle)
1883 END SUBROUTINE setup_time_and_frequency_minimax_grid
1890 SUBROUTINE setup_cells_3c(qs_env, bs_env)
1895 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_3c'
1897 INTEGER :: atom_i, atom_j, atom_k, block_count, handle, i, i_cell_x, i_cell_x_max, &
1898 i_cell_x_min, i_size, ikind, img, j, j_cell, j_cell_max, j_cell_y, j_cell_y_max, &
1899 j_cell_y_min, j_size, k_cell, k_cell_max, k_cell_z, k_cell_z_max, k_cell_z_min, k_size, &
1900 nimage_pairs_3c, nimages_3c, nimages_3c_max, nkind, u
1901 INTEGER(KIND=int_8) :: mem_occ_per_proc
1902 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, n_other_3c_images_max
1903 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c_max, nblocks_3c_max
1904 INTEGER,
DIMENSION(3) :: cell_index, n_max
1905 REAL(kind=
dp) :: avail_mem_per_proc_gb, cell_dist, cell_radius_3c, dij, dik, djk, eps, &
1906 exp_min_ao, exp_min_ri, frobenius_norm, mem_3c_gb, mem_occ_per_proc_gb, radius_ao, &
1907 radius_ao_product, radius_ri
1908 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exp_ao_kind, exp_ri_kind, &
1910 radius_ao_product_kind, radius_ri_kind
1911 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: int_3c
1912 REAL(kind=
dp),
DIMENSION(3) :: rij, rik, rjk, vec_cell_j, vec_cell_k
1913 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: exp_ao, exp_ri
1918 CALL timeset(routinen, handle)
1920 CALL get_qs_env(qs_env, nkind=nkind, atomic_kind_set=atomic_kind_set, particle_set=particle_set, cell=cell)
1922 ALLOCATE (exp_ao_kind(nkind), exp_ri_kind(nkind), radius_ao_kind(nkind), &
1923 radius_ao_product_kind(nkind), radius_ri_kind(nkind))
1925 exp_min_ri = 10.0_dp
1926 exp_min_ao = 10.0_dp
1927 exp_ri_kind = 10.0_dp
1928 exp_ao_kind = 10.0_dp
1930 eps = bs_env%eps_filter*bs_env%heuristic_filter_factor
1939 DO i = 1,
SIZE(exp_ri, 1)
1940 DO j = 1,
SIZE(exp_ri, 2)
1941 IF (exp_ri(i, j) < exp_min_ri .AND. exp_ri(i, j) > 1e-3_dp) exp_min_ri = exp_ri(i, j)
1942 IF (exp_ri(i, j) < exp_ri_kind(ikind) .AND. exp_ri(i, j) > 1e-3_dp) &
1943 exp_ri_kind(ikind) = exp_ri(i, j)
1946 DO i = 1,
SIZE(exp_ao, 1)
1947 DO j = 1,
SIZE(exp_ao, 2)
1948 IF (exp_ao(i, j) < exp_min_ao .AND. exp_ao(i, j) > 1e-3_dp) exp_min_ao = exp_ao(i, j)
1949 IF (exp_ao(i, j) < exp_ao_kind(ikind) .AND. exp_ao(i, j) > 1e-3_dp) &
1950 exp_ao_kind(ikind) = exp_ao(i, j)
1953 radius_ao_kind(ikind) = sqrt(-log(eps)/exp_ao_kind(ikind))
1954 radius_ao_product_kind(ikind) = sqrt(-log(eps)/(2.0_dp*exp_ao_kind(ikind)))
1955 radius_ri_kind(ikind) = sqrt(-log(eps)/exp_ri_kind(ikind))
1958 radius_ao = sqrt(-log(eps)/exp_min_ao)
1959 radius_ao_product = sqrt(-log(eps)/(2.0_dp*exp_min_ao))
1960 radius_ri = sqrt(-log(eps)/exp_min_ri)
1965 cell_radius_3c = radius_ao_product + radius_ri + bs_env%ri_metric%cutoff_radius
1967 n_max(1:3) = bs_env%periodic(1:3)*30
1978 DO i_cell_x = -n_max(1), n_max(1)
1979 DO j_cell_y = -n_max(2), n_max(2)
1980 DO k_cell_z = -n_max(3), n_max(3)
1982 cell_index(1:3) = [i_cell_x, j_cell_y, k_cell_z]
1984 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
1986 IF (cell_dist < cell_radius_3c)
THEN
1987 nimages_3c_max = nimages_3c_max + 1
1988 i_cell_x_min = min(i_cell_x_min, i_cell_x)
1989 i_cell_x_max = max(i_cell_x_max, i_cell_x)
1990 j_cell_y_min = min(j_cell_y_min, j_cell_y)
1991 j_cell_y_max = max(j_cell_y_max, j_cell_y)
1992 k_cell_z_min = min(k_cell_z_min, k_cell_z)
1993 k_cell_z_max = max(k_cell_z_max, k_cell_z)
2002 ALLOCATE (index_to_cell_3c_max(3, nimages_3c_max))
2005 DO i_cell_x = -n_max(1), n_max(1)
2006 DO j_cell_y = -n_max(2), n_max(2)
2007 DO k_cell_z = -n_max(3), n_max(3)
2009 cell_index(1:3) = [i_cell_x, j_cell_y, k_cell_z]
2011 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2013 IF (cell_dist < cell_radius_3c)
THEN
2015 index_to_cell_3c_max(1:3, img) = cell_index(1:3)
2023 ALLOCATE (nblocks_3c_max(nimages_3c_max, nimages_3c_max))
2024 nblocks_3c_max(:, :) = 0
2027 DO j_cell = 1, nimages_3c_max
2028 DO k_cell = 1, nimages_3c_max
2030 DO atom_j = 1, bs_env%n_atom
2031 DO atom_k = 1, bs_env%n_atom
2032 DO atom_i = 1, bs_env%n_atom
2034 block_count = block_count + 1
2035 IF (
modulo(block_count, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
2037 CALL scaled_to_real(vec_cell_j, real(index_to_cell_3c_max(1:3, j_cell), kind=
dp), cell)
2038 CALL scaled_to_real(vec_cell_k, real(index_to_cell_3c_max(1:3, k_cell), kind=
dp), cell)
2040 rij =
pbc(particle_set(atom_j)%r(:), cell) -
pbc(particle_set(atom_i)%r(:), cell) + vec_cell_j(:)
2041 rjk =
pbc(particle_set(atom_k)%r(:), cell) -
pbc(particle_set(atom_j)%r(:), cell) &
2042 + vec_cell_k(:) - vec_cell_j(:)
2043 rik(:) = rij(:) + rjk(:)
2047 IF (djk > radius_ao_kind(kind_of(atom_j)) + radius_ao_kind(kind_of(atom_k))) cycle
2048 IF (dij > radius_ao_kind(kind_of(atom_j)) + radius_ri_kind(kind_of(atom_i)) &
2049 + bs_env%ri_metric%cutoff_radius) cycle
2050 IF (dik > radius_ri_kind(kind_of(atom_i)) + radius_ao_kind(kind_of(atom_k)) &
2051 + bs_env%ri_metric%cutoff_radius) cycle
2053 j_size = bs_env%i_ao_end_from_atom(atom_j) - bs_env%i_ao_start_from_atom(atom_j) + 1
2054 k_size = bs_env%i_ao_end_from_atom(atom_k) - bs_env%i_ao_start_from_atom(atom_k) + 1
2055 i_size = bs_env%i_RI_end_from_atom(atom_i) - bs_env%i_RI_start_from_atom(atom_i) + 1
2057 ALLOCATE (int_3c(j_size, k_size, i_size))
2062 basis_j=bs_env%basis_set_AO, &
2063 basis_k=bs_env%basis_set_AO, &
2064 basis_i=bs_env%basis_set_RI, &
2065 cell_j=index_to_cell_3c_max(1:3, j_cell), &
2066 cell_k=index_to_cell_3c_max(1:3, k_cell), &
2067 atom_k=atom_k, atom_j=atom_j, atom_i=atom_i)
2069 frobenius_norm = sqrt(sum(int_3c(:, :, :)**2))
2075 IF (frobenius_norm > eps)
THEN
2076 nblocks_3c_max(j_cell, k_cell) = nblocks_3c_max(j_cell, k_cell) + 1
2086 CALL bs_env%para_env%sum(nblocks_3c_max)
2088 ALLOCATE (n_other_3c_images_max(nimages_3c_max))
2089 n_other_3c_images_max(:) = 0
2094 DO j_cell = 1, nimages_3c_max
2095 DO k_cell = 1, nimages_3c_max
2096 IF (nblocks_3c_max(j_cell, k_cell) > 0)
THEN
2097 n_other_3c_images_max(j_cell) = n_other_3c_images_max(j_cell) + 1
2098 nimage_pairs_3c = nimage_pairs_3c + 1
2102 IF (n_other_3c_images_max(j_cell) > 0) nimages_3c = nimages_3c + 1
2106 bs_env%nimages_3c = nimages_3c
2107 ALLOCATE (bs_env%index_to_cell_3c(3, nimages_3c))
2108 ALLOCATE (bs_env%cell_to_index_3c(i_cell_x_min:i_cell_x_max, &
2109 j_cell_y_min:j_cell_y_max, &
2110 k_cell_z_min:k_cell_z_max))
2111 bs_env%cell_to_index_3c(:, :, :) = -1
2113 ALLOCATE (bs_env%nblocks_3c(nimages_3c, nimages_3c))
2114 bs_env%nblocks_3c(nimages_3c, nimages_3c) = 0
2117 DO j_cell_max = 1, nimages_3c_max
2118 IF (n_other_3c_images_max(j_cell_max) == 0) cycle
2120 cell_index(1:3) = index_to_cell_3c_max(1:3, j_cell_max)
2121 bs_env%index_to_cell_3c(1:3, j_cell) = cell_index(1:3)
2122 bs_env%cell_to_index_3c(cell_index(1), cell_index(2), cell_index(3)) = j_cell
2125 DO k_cell_max = 1, nimages_3c_max
2126 IF (n_other_3c_images_max(k_cell_max) == 0) cycle
2129 bs_env%nblocks_3c(j_cell, k_cell) = nblocks_3c_max(j_cell_max, k_cell_max)
2135 mem_3c_gb = real(bs_env%n_RI, kind=
dp)*real(bs_env%n_ao, kind=
dp)**2 &
2136 *real(nimage_pairs_3c, kind=
dp)*8e-9_dp
2139 CALL bs_env%para_env%max(mem_occ_per_proc)
2141 mem_occ_per_proc_gb = real(mem_occ_per_proc, kind=
dp)/1.0e9_dp
2144 avail_mem_per_proc_gb = bs_env%input_memory_per_proc_GB - mem_occ_per_proc_gb
2147 bs_env%group_size_tensor = max(int(mem_3c_gb/avail_mem_per_proc_gb + 1.0_dp), 1)
2152 WRITE (u, fmt=
"(T2,A,F52.1,A)")
"Radius of atomic orbitals", radius_ao*
angstrom, Å
" "
2153 WRITE (u, fmt=
"(T2,A,F55.1,A)")
"Radius of RI functions", radius_ri*
angstrom, Å
" "
2154 WRITE (u, fmt=
"(T2,A,I47)")
"Number of cells for 3c integrals", nimages_3c
2155 WRITE (u, fmt=
"(T2,A,I42)")
"Number of cell pairs for 3c integrals", nimage_pairs_3c
2156 WRITE (u,
'(T2,A)')
''
2157 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
2158 bs_env%input_memory_per_proc_GB,
' GB'
2159 WRITE (u,
'(T2,A,F35.1,A)')
'Used memory per MPI process before GW run', &
2160 mem_occ_per_proc_gb,
' GB'
2161 WRITE (u,
'(T2,A,F44.1,A)')
'Memory of three-center integrals', mem_3c_gb,
' GB'
2164 CALL timestop(handle)
2166 END SUBROUTINE setup_cells_3c
2178 SUBROUTINE sum_two_r_grids(index_to_cell_1, index_to_cell_2, nimages_1, nimages_2, &
2179 index_to_cell, cell_to_index, nimages)
2181 INTEGER,
DIMENSION(:, :) :: index_to_cell_1, index_to_cell_2
2182 INTEGER :: nimages_1, nimages_2
2183 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
2184 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2187 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_two_R_grids'
2189 INTEGER :: handle, i_dim, img_1, img_2, nimages_max
2190 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_tmp
2191 INTEGER,
DIMENSION(3) :: cell_1, cell_2, r, r_max, r_min
2193 CALL timeset(routinen, handle)
2196 r_min(i_dim) = minval(index_to_cell_1(i_dim, :)) + minval(index_to_cell_2(i_dim, :))
2197 r_max(i_dim) = maxval(index_to_cell_1(i_dim, :)) + maxval(index_to_cell_2(i_dim, :))
2200 nimages_max = (r_max(1) - r_min(1) + 1)*(r_max(2) - r_min(2) + 1)*(r_max(3) - r_min(3) + 1)
2202 ALLOCATE (index_to_cell_tmp(3, nimages_max))
2203 index_to_cell_tmp(:, :) = -1
2205 ALLOCATE (cell_to_index(r_min(1):r_max(1), r_min(2):r_max(2), r_min(3):r_max(3)))
2206 cell_to_index(:, :, :) = -1
2210 DO img_1 = 1, nimages_1
2212 DO img_2 = 1, nimages_2
2214 cell_1(1:3) = index_to_cell_1(1:3, img_1)
2215 cell_2(1:3) = index_to_cell_2(1:3, img_2)
2217 r(1:3) = cell_1(1:3) + cell_2(1:3)
2220 IF (cell_to_index(r(1), r(2), r(3)) == -1)
THEN
2222 nimages = nimages + 1
2223 cell_to_index(r(1), r(2), r(3)) = nimages
2224 index_to_cell_tmp(1:3, nimages) = r(1:3)
2232 ALLOCATE (index_to_cell(3, nimages))
2233 index_to_cell(:, :) = index_to_cell_tmp(1:3, 1:nimages)
2235 CALL timestop(handle)
2237 END SUBROUTINE sum_two_r_grids
2244 SUBROUTINE compute_3c_integrals(qs_env, bs_env)
2249 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
2251 INTEGER :: handle, j_cell, k_cell, nimages_3c
2253 CALL timeset(routinen, handle)
2255 nimages_3c = bs_env%nimages_3c
2256 ALLOCATE (bs_env%t_3c_int(nimages_3c, nimages_3c))
2257 DO j_cell = 1, nimages_3c
2258 DO k_cell = 1, nimages_3c
2259 CALL dbt_create(bs_env%t_RI_AO__AO, bs_env%t_3c_int(j_cell, k_cell))
2264 bs_env%eps_filter, &
2267 int_eps=bs_env%eps_filter*0.05_dp, &
2268 basis_i=bs_env%basis_set_RI, &
2269 basis_j=bs_env%basis_set_AO, &
2270 basis_k=bs_env%basis_set_AO, &
2271 potential_parameter=bs_env%ri_metric, &
2272 desymmetrize=.false., do_kpoints=.true., cell_sym=.true., &
2273 cell_to_index_ext=bs_env%cell_to_index_3c)
2275 CALL bs_env%para_env%sync()
2277 CALL timestop(handle)
2279 END SUBROUTINE compute_3c_integrals
2287 SUBROUTINE get_cell_dist(cell_index, hmat, cell_dist)
2289 INTEGER,
DIMENSION(3) :: cell_index
2290 REAL(kind=
dp) :: hmat(3, 3), cell_dist
2292 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_cell_dist'
2294 INTEGER :: handle, i_dim
2295 INTEGER,
DIMENSION(3) :: cell_index_adj
2296 REAL(kind=
dp) :: cell_dist_3(3)
2298 CALL timeset(routinen, handle)
2303 IF (cell_index(i_dim) > 0) cell_index_adj(i_dim) = cell_index(i_dim) - 1
2304 IF (cell_index(i_dim) < 0) cell_index_adj(i_dim) = cell_index(i_dim) + 1
2305 IF (cell_index(i_dim) == 0) cell_index_adj(i_dim) = cell_index(i_dim)
2308 cell_dist_3(1:3) = matmul(hmat, real(cell_index_adj, kind=
dp))
2310 cell_dist = sqrt(abs(sum(cell_dist_3(1:3)**2)))
2312 CALL timestop(handle)
2314 END SUBROUTINE get_cell_dist
2323 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
2328 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
2330 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
2331 k_cell_z, nimages, nkp, u
2332 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
2337 CALL timeset(routinen, handle)
2342 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
2344 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
2345 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
2349 IF (bs_env%periodic(i_dim) == 1)
THEN
2350 cpassert(nkp_grid(i_dim) > 1)
2354 kpoints%kp_scheme =
"GENERAL"
2355 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
2357 bs_env%nkp_scf_desymm = nkp
2359 ALLOCATE (kpoints%xkp(1:3, nkp))
2362 ALLOCATE (kpoints%wkp(nkp))
2363 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
2367 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
2369 cixd(1:3) = cell_grid(1:3)/2
2371 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
2373 bs_env%nimages_scf_desymm = nimages
2375 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
2376 ALLOCATE (kpoints%index_to_cell(3, nimages))
2379 DO i_cell_x = -cixd(1), cixd(1)
2380 DO j_cell_y = -cixd(2), cixd(2)
2381 DO k_cell_z = -cixd(3), cixd(3)
2383 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
2384 kpoints%index_to_cell(1:3, img) = [i_cell_x, j_cell_y, k_cell_z]
2390 IF (u > 0 .AND. do_print)
THEN
2391 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
2394 CALL timestop(handle)
2396 END SUBROUTINE setup_kpoints_scf_desymm
2402 SUBROUTINE setup_cells_delta_r(bs_env)
2406 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_Delta_R'
2410 CALL timeset(routinen, handle)
2415 CALL sum_two_r_grids(bs_env%index_to_cell_3c, &
2416 bs_env%index_to_cell_3c, &
2417 bs_env%nimages_3c, bs_env%nimages_3c, &
2418 bs_env%index_to_cell_Delta_R, &
2419 bs_env%cell_to_index_Delta_R, &
2420 bs_env%nimages_Delta_R)
2422 IF (bs_env%unit_nr > 0)
THEN
2423 WRITE (bs_env%unit_nr, fmt=
"(T2,A,I61)") Δ
"Number of cells R", bs_env%nimages_Delta_R
2426 CALL timestop(handle)
2428 END SUBROUTINE setup_cells_delta_r
2434 SUBROUTINE setup_parallelization_delta_r(bs_env)
2438 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_parallelization_Delta_R'
2440 INTEGER :: handle, i_cell_delta_r, i_task_local, &
2442 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: i_cell_delta_r_group, &
2443 n_tensor_ops_delta_r
2445 CALL timeset(routinen, handle)
2447 CALL compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_delta_r)
2449 CALL compute_delta_r_dist(bs_env, n_tensor_ops_delta_r, i_cell_delta_r_group, n_tasks_local)
2451 bs_env%n_tasks_Delta_R_local = n_tasks_local
2453 ALLOCATE (bs_env%task_Delta_R(n_tasks_local))
2456 DO i_cell_delta_r = 1, bs_env%nimages_Delta_R
2458 IF (i_cell_delta_r_group(i_cell_delta_r) /= bs_env%tensor_group_color) cycle
2460 i_task_local = i_task_local + 1
2462 bs_env%task_Delta_R(i_task_local) = i_cell_delta_r
2466 ALLOCATE (bs_env%skip_DR_chi(n_tasks_local))
2467 bs_env%skip_DR_chi(:) = .false.
2468 ALLOCATE (bs_env%skip_DR_Sigma(n_tasks_local))
2469 bs_env%skip_DR_Sigma(:) = .false.
2471 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Goccx3c_chi, bs_env)
2472 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Gvirx3c_chi, bs_env)
2473 CALL allocate_skip_3xr(bs_env%skip_DR_R_R2_MxM_chi, bs_env)
2475 CALL allocate_skip_3xr(bs_env%skip_DR_R1_S2_Gx3c_Sigma, bs_env)
2476 CALL allocate_skip_3xr(bs_env%skip_DR_R1_R_MxM_Sigma, bs_env)
2478 CALL timestop(handle)
2480 END SUBROUTINE setup_parallelization_delta_r
2487 SUBROUTINE allocate_skip_3xr(skip, bs_env)
2488 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip
2491 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_skip_3xR'
2495 CALL timeset(routinen, handle)
2497 ALLOCATE (skip(bs_env%n_tasks_Delta_R_local, bs_env%nimages_3c, bs_env%nimages_scf_desymm))
2498 skip(:, :, :) = .false.
2500 CALL timestop(handle)
2502 END SUBROUTINE allocate_skip_3xr
2511 SUBROUTINE compute_delta_r_dist(bs_env, n_tensor_ops_Delta_R, i_cell_Delta_R_group, n_tasks_local)
2513 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r, &
2514 i_cell_delta_r_group
2515 INTEGER :: n_tasks_local
2517 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Delta_R_dist'
2519 INTEGER :: handle, i_delta_r_max_op, i_group_min, &
2521 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r_in_group
2523 CALL timeset(routinen, handle)
2525 nimages_delta_r = bs_env%nimages_Delta_R
2529 IF (u > 0 .AND. nimages_delta_r < bs_env%num_tensor_groups)
THEN
2530 WRITE (u, fmt=
"(T2,A,I5,A,I5,A)")
"There are only ", nimages_delta_r, &
2531 " tasks to work on but there are ", bs_env%num_tensor_groups,
" groups."
2532 WRITE (u, fmt=
"(T2,A)")
"Please reduce the number of MPI processes."
2533 WRITE (u,
'(T2,A)')
''
2536 ALLOCATE (n_tensor_ops_delta_r_in_group(bs_env%num_tensor_groups))
2537 n_tensor_ops_delta_r_in_group(:) = 0
2538 ALLOCATE (i_cell_delta_r_group(nimages_delta_r))
2539 i_cell_delta_r_group(:) = -1
2543 DO WHILE (any(n_tensor_ops_delta_r(:) /= 0))
2546 i_delta_r_max_op = maxloc(n_tensor_ops_delta_r, 1)
2549 i_group_min = minloc(n_tensor_ops_delta_r_in_group, 1)
2552 i_cell_delta_r_group(i_delta_r_max_op) = i_group_min - 1
2553 n_tensor_ops_delta_r_in_group(i_group_min) = n_tensor_ops_delta_r_in_group(i_group_min) + &
2554 n_tensor_ops_delta_r(i_delta_r_max_op)
2557 n_tensor_ops_delta_r(i_delta_r_max_op) = 0
2559 IF (bs_env%tensor_group_color == i_group_min - 1) n_tasks_local = n_tasks_local + 1
2563 CALL timestop(handle)
2565 END SUBROUTINE compute_delta_r_dist
2572 SUBROUTINE compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_Delta_R)
2574 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r
2576 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_n_tensor_ops_Delta_R'
2578 INTEGER :: handle, i_cell_delta_r, i_cell_r, i_cell_r1, i_cell_r1_minus_r, i_cell_r2, &
2579 i_cell_r2_m_r1, i_cell_s1, i_cell_s1_m_r1_p_r2, i_cell_s1_minus_r, i_cell_s2, &
2581 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, cell_r1_minus_r, cell_r2, &
2582 cell_r2_m_r1, cell_s1, cell_s1_m_r2_p_r1, cell_s1_minus_r, cell_s1_p_s2_m_r1, cell_s2
2583 LOGICAL :: cell_found
2585 CALL timeset(routinen, handle)
2587 nimages_delta_r = bs_env%nimages_Delta_R
2589 ALLOCATE (n_tensor_ops_delta_r(nimages_delta_r))
2590 n_tensor_ops_delta_r(:) = 0
2593 DO i_cell_delta_r = 1, nimages_delta_r
2595 IF (
modulo(i_cell_delta_r, bs_env%num_tensor_groups) /= bs_env%tensor_group_color) cycle
2597 DO i_cell_r1 = 1, bs_env%nimages_3c
2599 cell_r1(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r1)
2600 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
2603 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
2604 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
2605 IF (.NOT. cell_found) cycle
2607 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
2609 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r2)
2612 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
2613 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
2614 IF (.NOT. cell_found) cycle
2617 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
2618 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
2619 IF (.NOT. cell_found) cycle
2621 n_tensor_ops_delta_r(i_cell_delta_r) = n_tensor_ops_delta_r(i_cell_delta_r) + 1
2625 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
2627 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_s2)
2628 cell_m_r1(1:3) = -cell_r1(1:3)
2629 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
2632 IF (.NOT. cell_found) cycle
2635 IF (.NOT. cell_found) cycle
2639 DO i_cell_r = 1, bs_env%nimages_scf_desymm
2641 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r)
2644 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
2645 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
2646 IF (.NOT. cell_found) cycle
2649 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
2650 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
2651 IF (.NOT. cell_found) cycle
2659 CALL bs_env%para_env%sum(n_tensor_ops_delta_r)
2661 CALL timestop(handle)
2663 END SUBROUTINE compute_n_tensor_ops_delta_r
2675 SUBROUTINE add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, &
2676 cell_to_index, i_cell_1_plus_2)
2678 INTEGER,
DIMENSION(3) :: cell_1, cell_2
2679 INTEGER,
DIMENSION(:, :) :: index_to_cell
2680 INTEGER,
DIMENSION(3) :: cell_1_plus_2
2681 LOGICAL :: cell_found
2682 INTEGER,
DIMENSION(:, :, :),
INTENT(IN), &
2683 OPTIONAL,
POINTER :: cell_to_index
2684 INTEGER,
INTENT(OUT),
OPTIONAL :: i_cell_1_plus_2
2686 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_R'
2690 CALL timeset(routinen, handle)
2692 cell_1_plus_2(1:3) = cell_1(1:3) + cell_2(1:3)
2696 IF (
PRESENT(i_cell_1_plus_2))
THEN
2697 IF (cell_found)
THEN
2698 cpassert(
PRESENT(cell_to_index))
2699 i_cell_1_plus_2 = cell_to_index(cell_1_plus_2(1), cell_1_plus_2(2), cell_1_plus_2(3))
2701 i_cell_1_plus_2 = -1000
2705 CALL timestop(handle)
2707 END SUBROUTINE add_r
2716 INTEGER,
DIMENSION(3) :: cell
2717 INTEGER,
DIMENSION(:, :) :: index_to_cell
2718 LOGICAL :: cell_found
2720 CHARACTER(LEN=*),
PARAMETER :: routinen =
'is_cell_in_index_to_cell'
2722 INTEGER :: handle, i_cell, nimg
2723 INTEGER,
DIMENSION(3) :: cell_i
2725 CALL timeset(routinen, handle)
2727 nimg =
SIZE(index_to_cell, 2)
2729 cell_found = .false.
2733 cell_i(1:3) = index_to_cell(1:3, i_cell)
2735 IF (cell_i(1) == cell(1) .AND. cell_i(2) == cell(2) .AND. cell_i(3) == cell(3))
THEN
2741 CALL timestop(handle)
2750 SUBROUTINE allocate_matrices_small_cell_full_kp(qs_env, bs_env)
2754 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_small_cell_full_kp'
2756 INTEGER :: handle, i_spin, i_t, img, n_spin, &
2757 nimages_scf, num_time_freq_points
2761 CALL timeset(routinen, handle)
2763 nimages_scf = bs_env%nimages_scf_desymm
2764 num_time_freq_points = bs_env%num_time_freq_points
2765 n_spin = bs_env%n_spin
2767 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2769 ALLOCATE (bs_env%fm_G_S(nimages_scf))
2770 ALLOCATE (bs_env%fm_Sigma_x_R(nimages_scf))
2771 ALLOCATE (bs_env%fm_chi_R_t(nimages_scf, num_time_freq_points))
2772 ALLOCATE (bs_env%fm_MWM_R_t(nimages_scf, num_time_freq_points))
2773 ALLOCATE (bs_env%fm_Sigma_c_R_neg_tau(nimages_scf, num_time_freq_points, n_spin))
2774 ALLOCATE (bs_env%fm_Sigma_c_R_pos_tau(nimages_scf, num_time_freq_points, n_spin))
2775 DO img = 1, nimages_scf
2776 CALL cp_fm_create(bs_env%fm_G_S(img), bs_env%fm_work_mo(1)%matrix_struct)
2777 CALL cp_fm_create(bs_env%fm_Sigma_x_R(img), bs_env%fm_work_mo(1)%matrix_struct)
2778 DO i_t = 1, num_time_freq_points
2779 CALL cp_fm_create(bs_env%fm_chi_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2780 CALL cp_fm_create(bs_env%fm_MWM_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2782 DO i_spin = 1, n_spin
2783 CALL cp_fm_create(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), &
2784 bs_env%fm_work_mo(1)%matrix_struct)
2785 CALL cp_fm_create(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), &
2786 bs_env%fm_work_mo(1)%matrix_struct)
2787 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), 0.0_dp)
2788 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), 0.0_dp)
2793 CALL timestop(handle)
2795 END SUBROUTINE allocate_matrices_small_cell_full_kp
2802 SUBROUTINE trafo_v_xc_r_to_kp(qs_env, bs_env)
2806 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_V_xc_R_to_kp'
2808 INTEGER :: handle, ikp, img, ispin, n_ao
2809 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2810 TYPE(
cp_cfm_type) :: cfm_mo_coeff, cfm_tmp, cfm_v_xc
2812 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
2817 CALL timeset(routinen, handle)
2821 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints_scf)
2824 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2826 CALL cp_cfm_create(cfm_v_xc, bs_env%cfm_work_mo%matrix_struct)
2827 CALL cp_cfm_create(cfm_mo_coeff, bs_env%cfm_work_mo%matrix_struct)
2828 CALL cp_cfm_create(cfm_tmp, bs_env%cfm_work_mo%matrix_struct)
2829 CALL cp_fm_create(fm_v_xc_re, bs_env%cfm_work_mo%matrix_struct)
2831 DO img = 1, bs_env%nimages_scf
2832 DO ispin = 1, bs_env%n_spin
2834 CALL dbcsr_set(matrix_ks(ispin, img)%matrix, 0.0_dp)
2835 CALL copy_fm_to_dbcsr(bs_env%fm_V_xc_R(img, ispin), matrix_ks(ispin, img)%matrix)
2839 ALLOCATE (bs_env%v_xc_n(n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
2841 DO ispin = 1, bs_env%n_spin
2842 DO ikp = 1, bs_env%nkp_bs_and_DOS
2845 CALL rsmat_to_kp(matrix_ks, ispin, bs_env%kpoints_DOS%xkp(1:3, ikp), &
2846 cell_to_index_scf, sab_nl, bs_env, cfm_v_xc)
2849 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
2873 CALL timestop(handle)
2875 END SUBROUTINE trafo_v_xc_r_to_kp
2882 SUBROUTINE heuristic_ri_regularization(qs_env, bs_env)
2886 CHARACTER(LEN=*),
PARAMETER :: routinen =
'heuristic_RI_regularization'
2888 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m
2889 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
2891 REAL(kind=
dp) :: cond_nr, cond_nr_max, max_ev, &
2892 max_ev_ikp, min_ev, min_ev_ikp
2893 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
2895 CALL timeset(routinen, handle)
2898 CALL get_v_tr_r(m_r, bs_env%ri_metric, 0.0_dp, bs_env, qs_env)
2900 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
2906 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
2907 nkp_local = nkp_local + 1
2910 ALLOCATE (m(n_ri, n_ri, nkp_local))
2913 cond_nr_max = 0.0_dp
2920 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
2922 ikp_local = ikp_local + 1
2925 CALL rs_to_kp(m_r, m(:, :, ikp_local), &
2926 bs_env%kpoints_scf_desymm%index_to_cell, &
2927 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
2930 CALL power(m(:, :, ikp_local), 1.0_dp, 0.0_dp, cond_nr, min_ev_ikp, max_ev_ikp)
2932 IF (cond_nr > cond_nr_max) cond_nr_max = cond_nr
2933 IF (max_ev_ikp > max_ev) max_ev = max_ev_ikp
2934 IF (min_ev_ikp < min_ev) min_ev = min_ev_ikp
2938 CALL bs_env%para_env%max(cond_nr_max)
2942 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Min. abs. eigenvalue of RI metric matrix M(k)", min_ev
2943 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Max. abs. eigenvalue of RI metric matrix M(k)", max_ev
2944 WRITE (u, fmt=
"(T2,A,ES50.1)")
"Max. condition number of M(k)", cond_nr_max
2947 CALL timestop(handle)
2949 END SUBROUTINE heuristic_ri_regularization
2959 SUBROUTINE get_v_tr_r(V_tr_R, pot_type, regularization_RI, bs_env, qs_env)
2960 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: v_tr_r
2962 REAL(kind=
dp) :: regularization_ri
2966 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_V_tr_R'
2968 INTEGER :: handle, img, nimages_scf_desymm
2969 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
2970 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
2972 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_v_tr_r
2974 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_v_tr_r
2979 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2981 CALL timeset(routinen, handle)
2983 NULLIFY (sab_ri, dist_2d)
2986 blacs_env=blacs_env, &
2987 distribution_2d=dist_2d, &
2988 qs_kind_set=qs_kind_set, &
2989 particle_set=particle_set)
2991 ALLOCATE (sizes_ri(bs_env%n_atom))
2992 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=bs_env%basis_set_RI)
2994 pot_type,
"2c_nl_RI", qs_env, sym_ij=.false., &
2997 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
2998 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
2999 row_bsize(:) = sizes_ri
3000 col_bsize(:) = sizes_ri
3002 nimages_scf_desymm = bs_env%nimages_scf_desymm
3003 ALLOCATE (mat_v_tr_r(nimages_scf_desymm))
3004 CALL dbcsr_create(mat_v_tr_r(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_no_symmetry, &
3005 row_bsize, col_bsize)
3006 DEALLOCATE (row_bsize, col_bsize)
3008 DO img = 2, nimages_scf_desymm
3009 CALL dbcsr_create(mat_v_tr_r(img), template=mat_v_tr_r(1))
3013 bs_env%basis_set_RI, pot_type, do_kpoints=.true., &
3014 ext_kpoints=bs_env%kpoints_scf_desymm, &
3015 regularization_ri=regularization_ri)
3017 ALLOCATE (fm_v_tr_r(nimages_scf_desymm))
3018 DO img = 1, nimages_scf_desymm
3019 CALL cp_fm_create(fm_v_tr_r(img), bs_env%fm_RI_RI%matrix_struct)
3024 IF (.NOT.
ALLOCATED(v_tr_r))
THEN
3025 ALLOCATE (v_tr_r(bs_env%n_RI, bs_env%n_RI, nimages_scf_desymm))
3034 CALL timestop(handle)
3047 SUBROUTINE power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
3048 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
3049 REAL(kind=
dp) :: exponent, eps
3050 REAL(kind=
dp),
OPTIONAL :: cond_nr, min_ev, max_ev
3052 CHARACTER(len=*),
PARAMETER :: routinen =
'power'
3054 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenvectors
3055 INTEGER :: handle, i, n
3056 REAL(kind=
dp) :: pos_eval
3057 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
3059 CALL timeset(routinen, handle)
3062 matrix(:, :) = 0.5_dp*(matrix(:, :) + conjg(transpose(matrix(:, :))))
3065 ALLOCATE (eigenvalues(n), eigenvectors(n, n))
3068 IF (
PRESENT(cond_nr)) cond_nr = maxval(abs(eigenvalues))/minval(abs(eigenvalues))
3069 IF (
PRESENT(min_ev)) min_ev = minval(abs(eigenvalues))
3070 IF (
PRESENT(max_ev)) max_ev = maxval(abs(eigenvalues))
3073 IF (eps < eigenvalues(i))
THEN
3074 pos_eval = (eigenvalues(i))**(0.5_dp*exponent)
3078 eigenvectors(:, i) = eigenvectors(:, i)*pos_eval
3081 CALL zgemm(
"N",
"C", n, n, n,
z_one, eigenvectors, n, eigenvectors, n,
z_zero, matrix, n)
3083 DEALLOCATE (eigenvalues, eigenvectors)
3085 CALL timestop(handle)
3087 END SUBROUTINE power
3098 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_n_time, sigma_c_n_freq
3101 CHARACTER(LEN=*),
PARAMETER :: routinen =
'time_to_freq'
3103 INTEGER :: handle, i_t, j_w, n_occ
3104 REAL(kind=
dp) :: freq_j, time_i, w_cos_ij, w_sin_ij
3105 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sigma_c_n_cos_time, sigma_c_n_sin_time
3107 CALL timeset(routinen, handle)
3109 ALLOCATE (sigma_c_n_cos_time(bs_env%n_ao, bs_env%num_time_freq_points))
3110 ALLOCATE (sigma_c_n_sin_time(bs_env%n_ao, bs_env%num_time_freq_points))
3112 sigma_c_n_cos_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) + sigma_c_n_time(:, :, 2))
3113 sigma_c_n_sin_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) - sigma_c_n_time(:, :, 2))
3115 sigma_c_n_freq(:, :, :) = 0.0_dp
3117 DO i_t = 1, bs_env%num_time_freq_points
3119 DO j_w = 1, bs_env%num_time_freq_points
3121 freq_j = bs_env%imag_freq_points(j_w)
3122 time_i = bs_env%imag_time_points(i_t)
3124 w_cos_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(freq_j*time_i)
3125 w_sin_ij = bs_env%weights_sin_t_to_w(j_w, i_t)*sin(freq_j*time_i)
3128 sigma_c_n_freq(:, j_w, 1) = sigma_c_n_freq(:, j_w, 1) + &
3129 w_cos_ij*sigma_c_n_cos_time(:, i_t)
3132 sigma_c_n_freq(:, j_w, 2) = sigma_c_n_freq(:, j_w, 2) + &
3133 w_sin_ij*sigma_c_n_sin_time(:, i_t)
3142 n_occ = bs_env%n_occ(ispin)
3143 sigma_c_n_freq(1:n_occ, :, 2) = -sigma_c_n_freq(1:n_occ, :, 2)
3145 CALL timestop(handle)
3160 eigenval_scf, ikp, ispin)
3163 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq
3164 REAL(kind=
dp),
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf
3165 INTEGER :: ikp, ispin
3167 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyt_conti_and_print'
3169 CHARACTER(len=3) :: occ_vir
3170 CHARACTER(len=default_string_length) :: fname
3171 INTEGER :: handle, i_mo, ikp_for_print, iunit, &
3173 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
3175 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dummy, sigma_c_ikp_n_qp
3177 CALL timeset(routinen, handle)
3180 ALLOCATE (dummy(n_mo), sigma_c_ikp_n_qp(n_mo))
3181 sigma_c_ikp_n_qp(:) = 0.0_dp
3186 IF (
modulo(i_mo, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3189 bs_env%imag_freq_points_fit, dummy, dummy, &
3190 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 1)*
z_one + &
3191 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 2)*
gaussi, &
3192 sigma_x_ikp_n(:) - v_xc_ikp_n(:), &
3193 eigenval_scf(:), eigenval_scf(:), &
3194 bs_env%do_hedin_shift, &
3195 i_mo, bs_env%n_occ(ispin), bs_env%n_vir(ispin), &
3196 bs_env%nparam_pade, bs_env%num_freq_points_fit, &
3198 0.0_dp, .true., .false., 1, e_fermi_ext=bs_env%e_fermi(ispin))
3201 CALL bs_env%para_env%sum(sigma_c_ikp_n_qp)
3203 CALL correct_obvious_fitting_fails(sigma_c_ikp_n_qp, ispin, bs_env)
3205 bs_env%eigenval_G0W0(:, ikp, ispin) = eigenval_scf(:) + &
3206 sigma_c_ikp_n_qp(:) + &
3207 sigma_x_ikp_n(:) - &
3210 bs_env%eigenval_HF(:, ikp, ispin) = eigenval_scf(:) + sigma_x_ikp_n(:) - v_xc_ikp_n(:)
3213 print_dos_kpoints = (bs_env%nkp_only_bs <= 0)
3215 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
3216 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
3218 IF (bs_env%para_env%is_source() .AND. print_ikp)
THEN
3220 IF (print_dos_kpoints)
THEN
3221 nkp = bs_env%nkp_only_DOS
3224 nkp = bs_env%nkp_only_bs
3225 ikp_for_print = ikp - bs_env%nkp_only_DOS
3228 fname =
"bandstructure_SCF_and_G0W0"
3230 IF (ikp_for_print == 1)
THEN
3231 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
3232 file_action=
"WRITE")
3234 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
3235 file_action=
"WRITE", file_position=
"APPEND")
3238 WRITE (iunit,
"(A)")
" "
3239 WRITE (iunit,
"(A10,I7,A25,3F10.4)")
"kpoint: ", ikp_for_print,
"coordinate: ", &
3240 bs_env%kpoints_DOS%xkp(:, ikp)
3241 WRITE (iunit,
"(A)")
" "
3242 WRITE (iunit,
"(A5,A12,3A17,A16,A18)")
"n",
"k", ϵ
"_nk^DFT (eV)", Σ
"^c_nk (eV)", &
3243 Σ
"^x_nk (eV)",
"v_nk^xc (eV)", ϵ
"_nk^G0W0 (eV)"
3244 WRITE (iunit,
"(A)")
" "
3247 IF (i_mo <= bs_env%n_occ(ispin)) occ_vir =
'occ'
3248 IF (i_mo > bs_env%n_occ(ispin)) occ_vir =
'vir'
3249 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', ikp_for_print, &
3250 eigenval_scf(i_mo)*
evolt, &
3251 sigma_c_ikp_n_qp(i_mo)*
evolt, &
3252 sigma_x_ikp_n(i_mo)*
evolt, &
3253 v_xc_ikp_n(i_mo)*
evolt, &
3254 bs_env%eigenval_G0W0(i_mo, ikp, ispin)*
evolt
3257 WRITE (iunit,
"(A)")
" "
3263 CALL timestop(handle)
3273 SUBROUTINE correct_obvious_fitting_fails(Sigma_c_ikp_n_qp, ispin, bs_env)
3274 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_c_ikp_n_qp
3278 CHARACTER(LEN=*),
PARAMETER :: routinen =
'correct_obvious_fitting_fails'
3280 INTEGER :: handle, homo, i_mo, j_mo, &
3281 n_levels_scissor, n_mo
3282 LOGICAL :: is_occ, is_vir
3283 REAL(kind=
dp) :: sum_sigma_c
3285 CALL timeset(routinen, handle)
3288 homo = bs_env%n_occ(ispin)
3293 IF (abs(sigma_c_ikp_n_qp(i_mo)) > 13.0_dp/
evolt)
THEN
3295 is_occ = (i_mo <= homo)
3296 is_vir = (i_mo > homo)
3298 n_levels_scissor = 0
3299 sum_sigma_c = 0.0_dp
3305 IF (is_occ .AND. j_mo > homo) cycle
3306 IF (is_vir .AND. j_mo <= homo) cycle
3307 IF (abs(i_mo - j_mo) > 10) cycle
3308 IF (i_mo == j_mo) cycle
3310 n_levels_scissor = n_levels_scissor + 1
3311 sum_sigma_c = sum_sigma_c + sigma_c_ikp_n_qp(j_mo)
3316 sigma_c_ikp_n_qp(i_mo) = sum_sigma_c/real(n_levels_scissor, kind=
dp)
3322 CALL timestop(handle)
3324 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_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
various routines to log and control the output. The idea is that decisions about where to log should ...
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 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 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
Implements transformations from k-space to R-space for Fortran array matrices.
subroutine, public rs_to_kp(rs_real, ks_complex, index_to_cell, xkp, deriv_direction, hmat)
Integrate RS matrices (stored as Fortran array) into a kpoint matrix at given kp.
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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, cneo_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, monovalent, 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, ext_xc_section)
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.