57 dbt_clear, dbt_create, dbt_destroy, dbt_filter, dbt_iterator_blocks_left, &
58 dbt_iterator_next_block, dbt_iterator_start, dbt_iterator_stop, dbt_iterator_type, &
59 dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_type
134#include "base/base_uses.f90"
144 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_utils'
159 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_and_init_bs_env_for_gw'
163 CALL timeset(routinen, handle)
167 CALL read_gw_input_parameters(bs_env, bs_sec)
169 CALL print_header_and_input_parameters(bs_env)
171 CALL setup_ao_and_ri_basis_set(qs_env, bs_env)
173 CALL get_ri_basis_and_basis_function_indices(qs_env, bs_env)
175 CALL set_heuristic_parameters(bs_env, qs_env)
179 CALL setup_kpoints_chi_eps_w(bs_env, bs_env%kpoints_chi_eps_W)
182 CALL setup_cells_3c(qs_env, bs_env)
185 CALL set_parallelization_parameters(qs_env, bs_env)
187 CALL allocate_matrices(qs_env, bs_env)
189 CALL compute_v_xc(qs_env, bs_env)
191 CALL create_tensors(qs_env, bs_env)
193 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
196 CALL allocate_gw_eigenvalues(bs_env)
198 CALL check_sparsity_3c(qs_env, bs_env)
200 CALL set_sparsity_parallelization_parameters(bs_env)
202 CALL check_for_restart_files(qs_env, bs_env)
206 CALL compute_3c_integrals(qs_env, bs_env)
208 CALL setup_cells_delta_r(bs_env)
210 CALL setup_parallelization_delta_r(bs_env)
212 CALL allocate_matrices_small_cell_full_kp(qs_env, bs_env)
214 CALL trafo_v_xc_r_to_kp(qs_env, bs_env)
216 CALL heuristic_ri_regularization(qs_env, bs_env)
220 CALL setup_time_and_frequency_minimax_grid(bs_env)
228 IF (.NOT. bs_env%do_ldos .AND. .false.)
THEN
232 CALL timestop(handle)
243 CHARACTER(LEN=*),
PARAMETER :: routinen =
'de_init_bs_env'
247 CALL timeset(routinen, handle)
253 IF (
ASSOCIATED(bs_env%nl_3c%ij_list) .AND. (bs_env%rtp_method ==
rtp_method_bse))
THEN
254 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr, *)
"Retaining nl_3c for RTBSE"
261 CALL timestop(handle)
270 SUBROUTINE read_gw_input_parameters(bs_env, bs_sec)
274 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_gw_input_parameters'
279 CALL timeset(routinen, handle)
287 CALL section_vals_val_get(gw_sec,
"REGULARIZATION_MINIMAX", r_val=bs_env%input_regularization_minimax)
296 CALL section_vals_val_get(gw_sec,
"PRINT%PRINT_DBT_CONTRACT_VERBOSE", l_val=bs_env%print_contract_verbose)
299 CALL section_vals_val_get(gw_sec,
"CUTOFF_RADIUS_RI_RS", r_val=bs_env%ri_rs%cutoff_radius_ri_rs)
300 CALL section_vals_val_get(gw_sec,
"N_PROCS_PER_ATOM_Z_LP", i_val=bs_env%ri_rs%n_procs_per_atom_z_lp)
302 IF (bs_env%print_contract)
THEN
303 bs_env%unit_nr_contract = bs_env%unit_nr
305 bs_env%unit_nr_contract = 0
307 CALL timestop(handle)
309 END SUBROUTINE read_gw_input_parameters
316 SUBROUTINE setup_ao_and_ri_basis_set(qs_env, bs_env)
320 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_AO_and_RI_basis_set'
322 INTEGER :: handle, natom, nkind
324 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
326 CALL timeset(routinen, handle)
329 qs_kind_set=qs_kind_set, &
330 particle_set=particle_set, &
331 natom=natom, nkind=nkind)
334 ALLOCATE (bs_env%sizes_RI(natom), bs_env%sizes_AO(natom))
335 ALLOCATE (bs_env%basis_set_RI(nkind), bs_env%basis_set_AO(nkind))
341 basis=bs_env%basis_set_RI)
343 basis=bs_env%basis_set_AO)
345 CALL timestop(handle)
347 END SUBROUTINE setup_ao_and_ri_basis_set
354 SUBROUTINE get_ri_basis_and_basis_function_indices(qs_env, bs_env)
358 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_RI_basis_and_basis_function_indices'
360 INTEGER :: handle, i_ri, iatom, ikind, iset, &
361 max_ao_bf_per_atom, n_ao_test, n_atom, &
362 n_kind, n_ri, nset, nsgf, u
363 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
364 INTEGER,
DIMENSION(:),
POINTER :: l_max, l_min, nsgf_set
367 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
369 CALL timeset(routinen, handle)
372 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
374 n_kind =
SIZE(qs_kind_set)
375 n_atom = bs_env%n_atom
380 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
382 IF (.NOT.
ASSOCIATED(basis_set_a))
THEN
383 CALL cp_abort(__location__, &
384 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section.")
388 ALLOCATE (bs_env%i_RI_start_from_atom(n_atom))
389 ALLOCATE (bs_env%i_RI_end_from_atom(n_atom))
390 ALLOCATE (bs_env%i_ao_start_from_atom(n_atom))
391 ALLOCATE (bs_env%i_ao_end_from_atom(n_atom))
395 bs_env%i_RI_start_from_atom(iatom) = n_ri + 1
396 ikind = kind_of(iatom)
397 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
399 bs_env%i_RI_end_from_atom(iatom) = n_ri
403 max_ao_bf_per_atom = 0
406 bs_env%i_ao_start_from_atom(iatom) = n_ao_test + 1
407 ikind = kind_of(iatom)
408 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"ORB")
409 n_ao_test = n_ao_test + nsgf
410 bs_env%i_ao_end_from_atom(iatom) = n_ao_test
411 max_ao_bf_per_atom = max(max_ao_bf_per_atom, nsgf)
413 cpassert(n_ao_test == bs_env%n_ao)
414 bs_env%max_AO_bf_per_atom = max_ao_bf_per_atom
416 ALLOCATE (bs_env%l_RI(n_ri))
419 ikind = kind_of(iatom)
421 nset = bs_env%basis_set_RI(ikind)%gto_basis_set%nset
422 l_max => bs_env%basis_set_RI(ikind)%gto_basis_set%lmax
423 l_min => bs_env%basis_set_RI(ikind)%gto_basis_set%lmin
424 nsgf_set => bs_env%basis_set_RI(ikind)%gto_basis_set%nsgf_set
427 cpassert(l_max(iset) == l_min(iset))
428 bs_env%l_RI(i_ri + 1:i_ri + nsgf_set(iset)) = l_max(iset)
429 i_ri = i_ri + nsgf_set(iset)
433 cpassert(i_ri == n_ri)
438 WRITE (u, fmt=
"(T2,A)")
" "
439 WRITE (u, fmt=
"(T2,2A,T75,I8)")
"Number of auxiliary Gaussian basis functions ", &
443 CALL timestop(handle)
445 END SUBROUTINE get_ri_basis_and_basis_function_indices
452 SUBROUTINE setup_kpoints_chi_eps_w(bs_env, kpoints)
457 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_chi_eps_W'
459 INTEGER :: handle, i_dim, n_dim, nkp, nkp_extra, &
461 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
462 REAL(kind=
dp) :: exp_s_p, n_dim_inv
464 CALL timeset(routinen, handle)
470 kpoints%kp_scheme =
"GENERAL"
472 periodic(1:3) = bs_env%periodic(1:3)
474 cpassert(
SIZE(bs_env%nkp_grid_chi_eps_W_input) == 3)
476 IF (bs_env%nkp_grid_chi_eps_W_input(1) > 0 .AND. &
477 bs_env%nkp_grid_chi_eps_W_input(2) > 0 .AND. &
478 bs_env%nkp_grid_chi_eps_W_input(3) > 0)
THEN
481 SELECT CASE (periodic(i_dim))
484 nkp_grid_extra(i_dim) = 1
486 nkp_grid(i_dim) = bs_env%nkp_grid_chi_eps_W_input(i_dim)
487 nkp_grid_extra(i_dim) = nkp_grid(i_dim)*2
489 cpabort(
"Error in periodicity.")
493 ELSE IF (bs_env%nkp_grid_chi_eps_W_input(1) == -1 .AND. &
494 bs_env%nkp_grid_chi_eps_W_input(2) == -1 .AND. &
495 bs_env%nkp_grid_chi_eps_W_input(3) == -1)
THEN
500 cpassert(periodic(i_dim) == 0 .OR. periodic(i_dim) == 1)
502 SELECT CASE (periodic(i_dim))
505 nkp_grid_extra(i_dim) = 1
507 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
510 nkp_grid_extra(i_dim) = 6
512 nkp_grid(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*4
513 nkp_grid_extra(i_dim) = bs_env%kpoints_scf_desymm%nkp_grid(i_dim)*8
516 cpabort(
"Error in periodicity.")
523 cpabort(
"An error occured when setting up the k-mesh for W.")
527 nkp_orig = max(nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2, 1)
529 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
531 nkp = nkp_orig + nkp_extra
533 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
536 bs_env%nkp_grid_chi_eps_W_orig(1:3) = nkp_grid(1:3)
537 bs_env%nkp_grid_chi_eps_W_extra(1:3) = nkp_grid_extra(1:3)
538 bs_env%nkp_chi_eps_W_orig = nkp_orig
539 bs_env%nkp_chi_eps_W_extra = nkp_extra
540 bs_env%nkp_chi_eps_W_orig_plus_extra = nkp
542 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
543 ALLOCATE (bs_env%wkp_no_extra(nkp), bs_env%wkp_s_p(nkp))
545 CALL compute_xkp(kpoints%xkp, 1, nkp_orig, nkp_grid)
546 CALL compute_xkp(kpoints%xkp, nkp_orig + 1, nkp, nkp_grid_extra)
548 n_dim = sum(periodic)
551 kpoints%wkp(1) = 1.0_dp
552 bs_env%wkp_s_p(1) = 1.0_dp
553 bs_env%wkp_no_extra(1) = 1.0_dp
556 n_dim_inv = 1.0_dp/real(n_dim, kind=
dp)
559 CALL compute_wkp(kpoints%wkp(1:nkp_orig), nkp_orig, nkp_extra, n_dim_inv)
560 CALL compute_wkp(kpoints%wkp(nkp_orig + 1:nkp), nkp_extra, nkp_orig, n_dim_inv)
562 bs_env%wkp_no_extra(1:nkp_orig) = 0.0_dp
563 bs_env%wkp_no_extra(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=
dp)
568 exp_s_p = 2.0_dp*n_dim_inv
569 CALL compute_wkp(bs_env%wkp_s_p(1:nkp_orig), nkp_orig, nkp_extra, exp_s_p)
570 CALL compute_wkp(bs_env%wkp_s_p(nkp_orig + 1:nkp), nkp_extra, nkp_orig, exp_s_p)
572 bs_env%wkp_s_p(1:nkp) = bs_env%wkp_no_extra(1:nkp)
577 IF (bs_env%approx_kp_extrapol)
THEN
578 bs_env%wkp_orig = 1.0_dp/real(nkp_orig, kind=
dp)
584 bs_env%nkp_chi_eps_W_batch = 4
586 bs_env%num_chi_eps_W_batches = (bs_env%nkp_chi_eps_W_orig_plus_extra - 1)/ &
587 bs_env%nkp_chi_eps_W_batch + 1
592 WRITE (u, fmt=
"(T2,A)")
" "
593 WRITE (u, fmt=
"(T2,1A,T71,3I4)") χε
"K-point mesh 1 for , , W", nkp_grid(1:3)
594 WRITE (u, fmt=
"(T2,2A,T71,3I4)") χε
"K-point mesh 2 for , , W ", &
595 "(for k-point extrapolation of W)", nkp_grid_extra(1:3)
596 WRITE (u, fmt=
"(T2,A,T80,L)")
"Approximate the k-point extrapolation", &
597 bs_env%approx_kp_extrapol
600 CALL timestop(handle)
602 END SUBROUTINE setup_kpoints_chi_eps_w
613 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
614 INTEGER :: ikp_start, ikp_end
615 INTEGER,
DIMENSION(3) :: grid
617 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_xkp'
619 INTEGER :: handle, i, ix, iy, iz
621 CALL timeset(routinen, handle)
628 IF (i > ikp_end) cycle
630 xkp(1, i) = real(2*ix - grid(1) - 1, kind=
dp)/(2._dp*real(grid(1), kind=
dp))
631 xkp(2, i) = real(2*iy - grid(2) - 1, kind=
dp)/(2._dp*real(grid(2), kind=
dp))
632 xkp(3, i) = real(2*iz - grid(3) - 1, kind=
dp)/(2._dp*real(grid(3), kind=
dp))
639 CALL timestop(handle)
650 SUBROUTINE compute_wkp(wkp, nkp_1, nkp_2, exponent)
651 REAL(kind=
dp),
DIMENSION(:) :: wkp
652 INTEGER :: nkp_1, nkp_2
653 REAL(kind=
dp) :: exponent
655 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp'
658 REAL(kind=
dp) :: nkp_ratio
660 CALL timeset(routinen, handle)
662 nkp_ratio = real(nkp_2, kind=
dp)/real(nkp_1, kind=
dp)
664 wkp(:) = 1.0_dp/real(nkp_1, kind=
dp)/(1.0_dp - nkp_ratio**exponent)
666 CALL timestop(handle)
668 END SUBROUTINE compute_wkp
675 SUBROUTINE allocate_matrices(qs_env, bs_env)
679 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices'
681 INTEGER :: handle, i_t
686 CALL timeset(routinen, handle)
688 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
690 fm_struct => bs_env%fm_ks_Gamma(1)%matrix_struct
695 NULLIFY (fm_struct_ri_global)
696 CALL cp_fm_struct_create(fm_struct_ri_global, context=blacs_env, nrow_global=bs_env%n_RI, &
697 ncol_global=bs_env%n_RI, para_env=para_env)
699 CALL cp_fm_create(bs_env%fm_chi_Gamma_freq, fm_struct_ri_global)
700 CALL cp_fm_create(bs_env%fm_W_MIC_freq, fm_struct_ri_global)
701 IF (bs_env%approx_kp_extrapol)
THEN
702 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_extra, fm_struct_ri_global)
703 CALL cp_fm_create(bs_env%fm_W_MIC_freq_1_no_extra, fm_struct_ri_global)
710 NULLIFY (blacs_env_tensor)
717 CALL create_mat_munu(bs_env%mat_ao_ao_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
718 blacs_env_tensor, do_ri_aux_basis=.false.)
720 CALL create_mat_munu(bs_env%mat_RI_RI_tensor, qs_env, bs_env%eps_atom_grid_2d_mat, &
721 blacs_env_tensor, do_ri_aux_basis=.true.)
723 CALL create_mat_munu(bs_env%mat_RI_RI, qs_env, bs_env%eps_atom_grid_2d_mat, &
724 blacs_env, do_ri_aux_basis=.true.)
728 NULLIFY (bs_env%mat_chi_Gamma_tau)
731 DO i_t = 1, bs_env%num_time_freq_points
732 ALLOCATE (bs_env%mat_chi_Gamma_tau(i_t)%matrix)
733 CALL dbcsr_create(bs_env%mat_chi_Gamma_tau(i_t)%matrix, template=bs_env%mat_RI_RI%matrix)
736 CALL timestop(handle)
738 END SUBROUTINE allocate_matrices
744 SUBROUTINE allocate_gw_eigenvalues(bs_env)
747 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_GW_eigenvalues'
751 CALL timeset(routinen, handle)
753 ALLOCATE (bs_env%eigenval_G0W0(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
754 ALLOCATE (bs_env%eigenval_HF(bs_env%n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
756 CALL timestop(handle)
758 END SUBROUTINE allocate_gw_eigenvalues
765 SUBROUTINE create_tensors(qs_env, bs_env)
769 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors'
773 CALL timeset(routinen, handle)
775 CALL init_interaction_radii(bs_env)
779 CALL create_3c_t(bs_env%t_RI_AO__AO, bs_env%para_env_tensor,
"(RI AO | AO)", [1, 2], [3], &
780 bs_env%sizes_RI, bs_env%sizes_AO, &
781 create_nl_3c=.true., nl_3c=bs_env%nl_3c, qs_env=qs_env)
782 CALL create_3c_t(bs_env%t_RI__AO_AO, bs_env%para_env_tensor,
"(RI | AO AO)", [1], [2, 3], &
783 bs_env%sizes_RI, bs_env%sizes_AO)
785 CALL create_2c_t(bs_env, bs_env%sizes_RI, bs_env%sizes_AO)
787 CALL timestop(handle)
789 END SUBROUTINE create_tensors
796 SUBROUTINE check_sparsity_3c(qs_env, bs_env)
800 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_sparsity_3c'
802 INTEGER :: handle, n_atom_step, ri_atom
803 INTEGER(int_8) :: non_zero_elements_sum, nze
804 REAL(
dp) :: max_dist_ao_atoms, occ, occupation_sum
805 REAL(kind=
dp) :: t1, t2
806 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_global_array
812 CALL timeset(routinen, handle)
817 ALLOCATE (t_3c_global_array(1, 1))
818 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_global_array(1, 1))
822 ALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom(bs_env%n_atom, bs_env%n_atom))
823 ALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom(bs_env%n_atom, bs_env%n_atom))
824 ALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom(bs_env%n_atom, bs_env%n_atom))
825 ALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom(bs_env%n_atom, bs_env%n_atom))
826 bs_env%min_RI_idx_from_AO_AO_atom(:, :) = bs_env%n_RI
827 bs_env%max_RI_idx_from_AO_AO_atom(:, :) = 1
828 bs_env%min_AO_idx_from_RI_AO_atom(:, :) = bs_env%n_AO
829 bs_env%max_AO_idx_from_RI_AO_atom(:, :) = 1
831 CALL bs_env%para_env%sync()
834 occupation_sum = 0.0_dp
835 non_zero_elements_sum = 0
836 max_dist_ao_atoms = 0.0_dp
837 n_atom_step = int(sqrt(real(bs_env%n_atom, kind=
dp)))
839 DO ri_atom = 1, bs_env%n_atom, n_atom_step
845 int_eps=bs_env%eps_filter, &
846 basis_i=bs_env%basis_set_RI, &
847 basis_j=bs_env%basis_set_AO, &
848 basis_k=bs_env%basis_set_AO, &
849 bounds_i=[ri_atom, min(ri_atom + n_atom_step - 1, bs_env%n_atom)], &
850 potential_parameter=bs_env%ri_metric, &
851 desymmetrize=.false.)
853 CALL dbt_filter(t_3c_global_array(1, 1), bs_env%eps_filter)
855 CALL bs_env%para_env%sync()
858 non_zero_elements_sum = non_zero_elements_sum + nze
859 occupation_sum = occupation_sum + occ
861 CALL get_max_dist_ao_atoms(t_3c_global_array(1, 1), max_dist_ao_atoms, qs_env)
864 CALL get_i_j_atom_ranges(t_3c_global_array(1, 1), bs_env)
866 CALL dbt_clear(t_3c_global_array(1, 1))
873 bs_env%max_dist_AO_atoms = max_dist_ao_atoms
875 bs_env%occupation_3c_int = occupation_sum
877 CALL bs_env%para_env%min(bs_env%min_RI_idx_from_AO_AO_atom)
878 CALL bs_env%para_env%max(bs_env%max_RI_idx_from_AO_AO_atom)
879 CALL bs_env%para_env%min(bs_env%min_AO_idx_from_RI_AO_atom)
880 CALL bs_env%para_env%max(bs_env%max_AO_idx_from_RI_AO_atom)
882 CALL dbt_destroy(t_3c_global_array(1, 1))
883 DEALLOCATE (t_3c_global_array)
885 IF (bs_env%unit_nr > 0)
THEN
886 WRITE (bs_env%unit_nr,
'(T2,A)')
''
887 WRITE (bs_env%unit_nr,
'(T2,A,F27.1,A)') &
888 µν
'Computed 3-center integrals (|P), execution time', t2 - t1,
' s'
889 WRITE (bs_env%unit_nr,
'(T2,A,F48.3,A)') µν
'Percentage of non-zero (|P)', &
890 bs_env%occupation_3c_int*100,
' %'
891 WRITE (bs_env%unit_nr,
'(T2,A,F33.1,A)') µνµν
'Max. distance between , in non-zero (|P)', &
892 bs_env%max_dist_AO_atoms*
angstrom,
' A'
893 WRITE (bs_env%unit_nr,
'(T2,2A,I20,A)')
'Required memory if storing all 3-center ', &
894 µν
'integrals (|P)', int(real(non_zero_elements_sum, kind=
dp)*8.0e-9_dp),
' GB'
897 CALL timestop(handle)
899 END SUBROUTINE check_sparsity_3c
906 SUBROUTINE get_i_j_atom_ranges(t_3c, bs_env)
907 TYPE(dbt_type) :: t_3c
910 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atom_ranges'
912 INTEGER :: handle, idx_ao_end, idx_ao_start, &
913 idx_ri_end, idx_ri_start
914 INTEGER,
DIMENSION(3) :: atom_ind
915 TYPE(dbt_iterator_type) :: iter
917 CALL timeset(routinen, handle)
925 CALL dbt_iterator_start(iter, t_3c)
926 DO WHILE (dbt_iterator_blocks_left(iter))
927 CALL dbt_iterator_next_block(iter, atom_ind)
930 idx_ri_start = bs_env%i_RI_start_from_atom(atom_ind(1))
931 idx_ri_end = bs_env%i_RI_end_from_atom(atom_ind(1))
933 idx_ao_start = bs_env%i_ao_start_from_atom(atom_ind(2))
934 idx_ao_end = bs_env%i_ao_end_from_atom(atom_ind(2))
938 bs_env%min_RI_idx_from_AO_AO_atom(atom_ind(2), atom_ind(3)) = &
939 min(bs_env%min_RI_idx_from_AO_AO_atom(atom_ind(2), atom_ind(3)), idx_ri_start)
941 bs_env%max_RI_idx_from_AO_AO_atom(atom_ind(2), atom_ind(3)) = &
942 max(bs_env%max_RI_idx_from_AO_AO_atom(atom_ind(2), atom_ind(3)), idx_ri_end)
945 bs_env%min_AO_idx_from_RI_AO_atom(atom_ind(1), atom_ind(3)) = &
946 min(bs_env%min_AO_idx_from_RI_AO_atom(atom_ind(1), atom_ind(3)), idx_ao_start)
948 bs_env%max_AO_idx_from_RI_AO_atom(atom_ind(1), atom_ind(3)) = &
949 max(bs_env%max_AO_idx_from_RI_AO_atom(atom_ind(1), atom_ind(3)), idx_ao_end)
952 CALL dbt_iterator_stop(iter)
955 CALL timestop(handle)
957 END SUBROUTINE get_i_j_atom_ranges
965 SUBROUTINE create_2c_t(bs_env, sizes_RI, sizes_AO)
967 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
969 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_2c_t'
972 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_1, dist_2
973 INTEGER,
DIMENSION(2) :: pdims_2d
974 TYPE(dbt_pgrid_type) :: pgrid_2d
976 CALL timeset(routinen, handle)
981 CALL dbt_pgrid_create(bs_env%para_env_tensor, pdims_2d, pgrid_2d)
983 CALL create_2c_tensor(bs_env%t_G, dist_1, dist_2, pgrid_2d, sizes_ao, sizes_ao, &
985 DEALLOCATE (dist_1, dist_2)
986 CALL create_2c_tensor(bs_env%t_chi, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
988 DEALLOCATE (dist_1, dist_2)
989 CALL create_2c_tensor(bs_env%t_W, dist_1, dist_2, pgrid_2d, sizes_ri, sizes_ri, &
991 DEALLOCATE (dist_1, dist_2)
992 CALL dbt_pgrid_destroy(pgrid_2d)
994 CALL timestop(handle)
996 END SUBROUTINE create_2c_t
1011 SUBROUTINE create_3c_t(tensor, para_env, tensor_name, map1, map2, sizes_RI, sizes_AO, &
1012 create_nl_3c, nl_3c, qs_env)
1015 CHARACTER(LEN=12) :: tensor_name
1016 INTEGER,
DIMENSION(:) :: map1, map2
1017 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri, sizes_ao
1018 LOGICAL,
OPTIONAL :: create_nl_3c
1022 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_3c_t'
1024 INTEGER :: handle, nkind
1025 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri
1026 INTEGER,
DIMENSION(3) :: pcoord, pdims, pdims_3d
1027 LOGICAL :: my_create_nl_3c
1028 TYPE(dbt_pgrid_type) :: pgrid_3d
1033 CALL timeset(routinen, handle)
1036 CALL dbt_pgrid_create(para_env, pdims_3d, pgrid_3d)
1038 pgrid_3d, sizes_ri, sizes_ao, sizes_ao, &
1039 map1=map1, map2=map2, name=tensor_name)
1041 IF (
PRESENT(create_nl_3c))
THEN
1042 my_create_nl_3c = create_nl_3c
1044 my_create_nl_3c = .false.
1047 IF (my_create_nl_3c)
THEN
1048 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
1049 CALL dbt_mp_environ_pgrid(pgrid_3d, pdims, pcoord)
1050 CALL mp_comm_t3c_2%create(pgrid_3d%mp_comm_2d, 3, pdims)
1052 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
1055 qs_env%bs_env%basis_set_RI, &
1056 qs_env%bs_env%basis_set_AO, &
1057 qs_env%bs_env%basis_set_AO, &
1058 dist_3d, qs_env%bs_env%ri_metric, &
1059 "GW_3c_nl", qs_env, own_dist=.true.)
1062 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
1063 CALL dbt_pgrid_destroy(pgrid_3d)
1065 CALL timestop(handle)
1067 END SUBROUTINE create_3c_t
1073 SUBROUTINE init_interaction_radii(bs_env)
1076 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_interaction_radii'
1078 INTEGER :: handle, ibasis
1081 CALL timeset(routinen, handle)
1083 DO ibasis = 1,
SIZE(bs_env%basis_set_AO)
1085 orb_basis => bs_env%basis_set_AO(ibasis)%gto_basis_set
1088 ri_basis => bs_env%basis_set_RI(ibasis)%gto_basis_set
1093 CALL timestop(handle)
1095 END SUBROUTINE init_interaction_radii
1103 SUBROUTINE get_max_dist_ao_atoms(t_3c_int, max_dist_AO_atoms, qs_env)
1104 TYPE(dbt_type) :: t_3c_int
1105 REAL(kind=
dp),
INTENT(INOUT) :: max_dist_ao_atoms
1108 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_max_dist_AO_atoms'
1110 INTEGER :: atom_1, atom_2, handle, num_cells
1111 INTEGER,
DIMENSION(3) :: atom_ind
1112 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1113 REAL(kind=
dp) :: abs_rab
1114 REAL(kind=
dp),
DIMENSION(3) :: rab
1116 TYPE(dbt_iterator_type) :: iter
1120 CALL timeset(routinen, handle)
1122 NULLIFY (cell, particle_set, para_env)
1123 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set, para_env=para_env)
1134 CALL dbt_iterator_start(iter, t_3c_int)
1135 DO WHILE (dbt_iterator_blocks_left(iter))
1136 CALL dbt_iterator_next_block(iter, atom_ind)
1138 atom_1 = atom_ind(2)
1139 atom_2 = atom_ind(3)
1140 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
1141 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
1144 max_dist_ao_atoms = max(max_dist_ao_atoms, abs_rab)
1147 CALL dbt_iterator_stop(iter)
1150 CALL para_env%max(max_dist_ao_atoms)
1152 CALL timestop(handle)
1154 END SUBROUTINE get_max_dist_ao_atoms
1160 SUBROUTINE set_sparsity_parallelization_parameters(bs_env)
1163 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_sparsity_parallelization_parameters'
1165 INTEGER :: handle, i_ivl, il_ivl, j_ivl, n_atom_per_il_ivl, n_atom_per_ivl, n_intervals_i, &
1166 n_intervals_inner_loop_atoms, n_intervals_j, u
1167 INTEGER(KIND=int_8) :: input_memory_per_proc
1169 CALL timeset(routinen, handle)
1172 bs_env%safety_factor_memory = 0.10_dp
1174 input_memory_per_proc = int(bs_env%input_memory_per_proc_GB*1.0e9_dp, kind=
int_8)
1180 n_atom_per_ivl = int(sqrt(bs_env%safety_factor_memory*input_memory_per_proc &
1181 *bs_env%group_size_tensor/24/bs_env%n_RI &
1182 /sqrt(bs_env%occupation_3c_int)))/bs_env%max_AO_bf_per_atom
1184 n_intervals_i = (bs_env%n_atom_i - 1)/n_atom_per_ivl + 1
1185 n_intervals_j = (bs_env%n_atom_j - 1)/n_atom_per_ivl + 1
1187 bs_env%n_atom_per_interval_ij = n_atom_per_ivl
1188 bs_env%n_intervals_i = n_intervals_i
1189 bs_env%n_intervals_j = n_intervals_j
1191 ALLOCATE (bs_env%i_atom_intervals(2, n_intervals_i))
1192 ALLOCATE (bs_env%j_atom_intervals(2, n_intervals_j))
1194 DO i_ivl = 1, n_intervals_i
1195 bs_env%i_atom_intervals(1, i_ivl) = (i_ivl - 1)*n_atom_per_ivl + bs_env%atoms_i(1)
1196 bs_env%i_atom_intervals(2, i_ivl) = min(i_ivl*n_atom_per_ivl + bs_env%atoms_i(1) - 1, &
1200 DO j_ivl = 1, n_intervals_j
1201 bs_env%j_atom_intervals(1, j_ivl) = (j_ivl - 1)*n_atom_per_ivl + bs_env%atoms_j(1)
1202 bs_env%j_atom_intervals(2, j_ivl) = min(j_ivl*n_atom_per_ivl + bs_env%atoms_j(1) - 1, &
1206 ALLOCATE (bs_env%skip_Sigma_occ(n_intervals_i, n_intervals_j))
1207 ALLOCATE (bs_env%skip_Sigma_vir(n_intervals_i, n_intervals_j))
1208 bs_env%skip_Sigma_occ(:, :) = .false.
1209 bs_env%skip_Sigma_vir(:, :) = .false.
1210 bs_env%n_skip_chi = 0
1212 ALLOCATE (bs_env%skip_chi(n_intervals_i, n_intervals_j))
1213 bs_env%skip_chi(:, :) = .false.
1214 bs_env%n_skip_sigma = 0
1219 n_atom_per_il_ivl = min(int(bs_env%safety_factor_memory*input_memory_per_proc &
1220 *bs_env%group_size_tensor/n_atom_per_ivl &
1221 /bs_env%max_AO_bf_per_atom &
1222 /bs_env%n_RI/8/sqrt(bs_env%occupation_3c_int) &
1223 /bs_env%max_AO_bf_per_atom), bs_env%n_atom)
1225 n_intervals_inner_loop_atoms = (bs_env%n_atom - 1)/n_atom_per_il_ivl + 1
1227 bs_env%n_atom_per_IL_interval = n_atom_per_il_ivl
1228 bs_env%n_intervals_inner_loop_atoms = n_intervals_inner_loop_atoms
1230 ALLOCATE (bs_env%inner_loop_atom_intervals(2, n_intervals_inner_loop_atoms))
1231 DO il_ivl = 1, n_intervals_inner_loop_atoms
1232 bs_env%inner_loop_atom_intervals(1, il_ivl) = (il_ivl - 1)*n_atom_per_il_ivl + 1
1233 bs_env%inner_loop_atom_intervals(2, il_ivl) = min(il_ivl*n_atom_per_il_ivl, bs_env%n_atom)
1238 WRITE (u,
'(T2,A)')
''
1239 WRITE (u,
'(T2,A,I33)') λντνλτ
'Number of i and j atoms in M_P(), N_Q():', n_atom_per_ivl
1240 WRITE (u,
'(T2,A,I18)') µλνµµνµλ
'Number of inner loop atoms for in M_P = sum_ (|P) G_', &
1244 CALL timestop(handle)
1246 END SUBROUTINE set_sparsity_parallelization_parameters
1253 SUBROUTINE check_for_restart_files(qs_env, bs_env)
1257 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_for_restart_files'
1259 CHARACTER(LEN=9) :: frmt
1260 CHARACTER(len=default_path_length) :: f_chi, f_s_n, f_s_p, f_s_x, f_w_t, &
1261 prefix, project_name, z_lp_name
1262 INTEGER :: handle, i_spin, i_t_or_w, ind, n_spin, &
1263 num_time_freq_points
1264 LOGICAL :: chi_exists, sigma_neg_time_exists, &
1265 sigma_pos_time_exists, &
1266 sigma_x_spin_exists, w_time_exists, &
1271 CALL timeset(routinen, handle)
1273 num_time_freq_points = bs_env%num_time_freq_points
1274 n_spin = bs_env%n_spin
1276 ALLOCATE (bs_env%read_chi(num_time_freq_points))
1277 ALLOCATE (bs_env%calc_chi(num_time_freq_points))
1278 ALLOCATE (bs_env%Sigma_c_exists(num_time_freq_points, n_spin))
1286 WRITE (prefix,
'(2A)') trim(project_name),
"-RESTART_"
1287 bs_env%prefix = prefix
1289 bs_env%all_W_exist = .true.
1291 DO i_t_or_w = 1, num_time_freq_points
1293 IF (i_t_or_w < 10)
THEN
1294 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1295 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_0", i_t_or_w,
".matrix"
1296 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_0", i_t_or_w,
".matrix"
1297 ELSE IF (i_t_or_w < 100)
THEN
1298 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1299 WRITE (f_chi, frmt) trim(prefix), bs_env%chi_name,
"_", i_t_or_w,
".matrix"
1300 WRITE (f_w_t, frmt) trim(prefix), bs_env%W_time_name,
"_", i_t_or_w,
".matrix"
1302 cpabort(
'Please implement more than 99 time/frequency points.')
1305 INQUIRE (file=trim(f_chi), exist=chi_exists)
1306 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1308 bs_env%read_chi(i_t_or_w) = chi_exists
1309 bs_env%calc_chi(i_t_or_w) = .NOT. chi_exists
1311 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1314 DO i_spin = 1, n_spin
1316 ind = i_t_or_w + (i_spin - 1)*num_time_freq_points
1319 WRITE (frmt,
'(A)')
'(3A,I1,A)'
1320 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_0", ind,
".matrix"
1321 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_0", ind,
".matrix"
1322 ELSE IF (i_t_or_w < 100)
THEN
1323 WRITE (frmt,
'(A)')
'(3A,I2,A)'
1324 WRITE (f_s_p, frmt) trim(prefix), bs_env%Sigma_p_name,
"_", ind,
".matrix"
1325 WRITE (f_s_n, frmt) trim(prefix), bs_env%Sigma_n_name,
"_", ind,
".matrix"
1328 INQUIRE (file=trim(f_s_p), exist=sigma_pos_time_exists)
1329 INQUIRE (file=trim(f_s_n), exist=sigma_neg_time_exists)
1331 bs_env%Sigma_c_exists(i_t_or_w, i_spin) = sigma_pos_time_exists .AND. &
1332 sigma_neg_time_exists
1340 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix),
"W_freq_rtp",
"_0", 0,
".matrix"
1341 INQUIRE (file=trim(f_w_t), exist=w_time_exists)
1342 bs_env%all_W_exist = bs_env%all_W_exist .AND. w_time_exists
1346 IF (bs_env%do_gw_ri_rs)
THEN
1347 WRITE (z_lp_name,
'(3A)') trim(prefix),
"Z_lP",
".matrix"
1348 INQUIRE (file=trim(z_lp_name), exist=z_lp_exists)
1349 bs_env%ri_rs%Z_lP_exists = z_lp_exists
1352 IF (bs_env%all_W_exist)
THEN
1353 bs_env%read_chi(:) = .false.
1354 bs_env%calc_chi(:) = .false.
1357 bs_env%Sigma_x_exists = .true.
1358 DO i_spin = 1, n_spin
1359 WRITE (f_s_x,
'(3A,I1,A)') trim(prefix), bs_env%Sigma_x_name,
"_0", i_spin,
".matrix"
1360 INQUIRE (file=trim(f_s_x), exist=sigma_x_spin_exists)
1361 bs_env%Sigma_x_exists = bs_env%Sigma_x_exists .AND. sigma_x_spin_exists
1366 IF (any(bs_env%read_chi(:)) &
1367 .OR. any(bs_env%Sigma_c_exists) &
1368 .OR. bs_env%all_W_exist &
1369 .OR. bs_env%Sigma_x_exists &
1372 IF (qs_env%scf_env%iter_count /= 1)
THEN
1373 CALL cp_warn(__location__,
"SCF needed more than 1 step, "// &
1374 "which might lead to spurious GW results when using GW restart files. ")
1378 CALL timestop(handle)
1380 END SUBROUTINE check_for_restart_files
1387 SUBROUTINE set_parallelization_parameters(qs_env, bs_env)
1391 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_parallelization_parameters'
1393 INTEGER :: color_sub, dummy_1, dummy_2, handle, &
1394 num_pe, num_t_groups, u
1397 CALL timeset(routinen, handle)
1401 num_pe = para_env%num_pe
1404 IF (bs_env%group_size_tensor < 0 .OR. bs_env%group_size_tensor > num_pe) &
1405 bs_env%group_size_tensor = num_pe
1408 IF (
modulo(num_pe, bs_env%group_size_tensor) /= 0)
THEN
1409 CALL find_good_group_size(num_pe, bs_env%group_size_tensor)
1413 color_sub = para_env%mepos/bs_env%group_size_tensor
1414 bs_env%tensor_group_color = color_sub
1416 ALLOCATE (bs_env%para_env_tensor)
1417 CALL bs_env%para_env_tensor%from_split(para_env, color_sub)
1419 num_t_groups = para_env%num_pe/bs_env%group_size_tensor
1420 bs_env%num_tensor_groups = num_t_groups
1422 CALL get_i_j_atoms(bs_env%atoms_i, bs_env%atoms_j, bs_env%n_atom_i, bs_env%n_atom_j, &
1425 ALLOCATE (bs_env%atoms_i_t_group(2, num_t_groups))
1426 ALLOCATE (bs_env%atoms_j_t_group(2, num_t_groups))
1427 DO color_sub = 0, num_t_groups - 1
1428 CALL get_i_j_atoms(bs_env%atoms_i_t_group(1:2, color_sub + 1), &
1429 bs_env%atoms_j_t_group(1:2, color_sub + 1), &
1430 dummy_1, dummy_2, color_sub, bs_env)
1435 WRITE (u,
'(T2,A,I47)')
'Group size for tensor operations', bs_env%group_size_tensor
1436 IF (bs_env%group_size_tensor > 1 .AND. bs_env%n_atom < 5)
THEN
1437 WRITE (u,
'(T2,A)')
'The requested group size is > 1 which can lead to bad performance.'
1438 WRITE (u,
'(T2,A)')
'Using more memory per MPI process might improve performance.'
1439 WRITE (u,
'(T2,A)')
'(Also increase MEMORY_PER_PROC when using more memory per process.)'
1443 CALL timestop(handle)
1445 END SUBROUTINE set_parallelization_parameters
1452 SUBROUTINE find_good_group_size(num_pe, group_size)
1454 INTEGER :: num_pe, group_size
1456 CHARACTER(LEN=*),
PARAMETER :: routinen =
'find_good_group_size'
1458 INTEGER :: group_size_minus, group_size_orig, &
1459 group_size_plus, handle, i_diff
1461 CALL timeset(routinen, handle)
1463 group_size_orig = group_size
1465 DO i_diff = 1, num_pe
1467 group_size_minus = group_size - i_diff
1469 IF (
modulo(num_pe, group_size_minus) == 0 .AND. group_size_minus > 0)
THEN
1470 group_size = group_size_minus
1474 group_size_plus = group_size + i_diff
1476 IF (
modulo(num_pe, group_size_plus) == 0 .AND. group_size_plus <= num_pe)
THEN
1477 group_size = group_size_plus
1483 IF (group_size_orig == group_size) cpabort(
"Group size error")
1485 CALL timestop(handle)
1487 END SUBROUTINE find_good_group_size
1498 SUBROUTINE get_i_j_atoms(atoms_i, atoms_j, n_atom_i, n_atom_j, color_sub, bs_env)
1500 INTEGER,
DIMENSION(2) :: atoms_i, atoms_j
1501 INTEGER :: n_atom_i, n_atom_j, color_sub
1504 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_i_j_atoms'
1506 INTEGER :: handle, i_atoms_per_group, i_group, &
1507 ipcol, ipcol_loop, iprow, iprow_loop, &
1508 j_atoms_per_group, npcol, nprow
1510 CALL timeset(routinen, handle)
1513 CALL square_mesh(nprow, npcol, bs_env%num_tensor_groups)
1516 DO ipcol_loop = 0, npcol - 1
1517 DO iprow_loop = 0, nprow - 1
1518 IF (i_group == color_sub)
THEN
1522 i_group = i_group + 1
1526 IF (
modulo(bs_env%n_atom, nprow) == 0)
THEN
1527 i_atoms_per_group = bs_env%n_atom/nprow
1529 i_atoms_per_group = bs_env%n_atom/nprow + 1
1532 IF (
modulo(bs_env%n_atom, npcol) == 0)
THEN
1533 j_atoms_per_group = bs_env%n_atom/npcol
1535 j_atoms_per_group = bs_env%n_atom/npcol + 1
1538 atoms_i(1) = iprow*i_atoms_per_group + 1
1539 atoms_i(2) = min((iprow + 1)*i_atoms_per_group, bs_env%n_atom)
1540 n_atom_i = atoms_i(2) - atoms_i(1) + 1
1542 atoms_j(1) = ipcol*j_atoms_per_group + 1
1543 atoms_j(2) = min((ipcol + 1)*j_atoms_per_group, bs_env%n_atom)
1544 n_atom_j = atoms_j(2) - atoms_j(1) + 1
1546 CALL timestop(handle)
1556 SUBROUTINE square_mesh(nprow, npcol, nproc)
1557 INTEGER :: nprow, npcol, nproc
1559 CHARACTER(LEN=*),
PARAMETER :: routinen =
'square_mesh'
1561 INTEGER :: gcd_max, handle, ipe, jpe
1563 CALL timeset(routinen, handle)
1566 DO ipe = 1, ceiling(sqrt(real(nproc,
dp)))
1568 IF (ipe*jpe /= nproc) cycle
1569 IF (
gcd(ipe, jpe) >= gcd_max)
THEN
1572 gcd_max =
gcd(ipe, jpe)
1576 CALL timestop(handle)
1578 END SUBROUTINE square_mesh
1585 SUBROUTINE set_heuristic_parameters(bs_env, qs_env)
1589 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_heuristic_parameters'
1591 INTEGER :: handle, u
1592 LOGICAL :: do_bvk_cell
1594 CALL timeset(routinen, handle)
1597 bs_env%num_points_per_magnitude = 200
1599 IF (bs_env%input_regularization_minimax > -1.0e-12_dp)
THEN
1600 bs_env%regularization_minimax = bs_env%input_regularization_minimax
1605 IF (sum(bs_env%periodic) /= 0 .OR. bs_env%num_time_freq_points >= 20)
THEN
1606 bs_env%regularization_minimax = 1.0e-6_dp
1608 bs_env%regularization_minimax = 0.0_dp
1612 bs_env%stabilize_exp = 70.0_dp
1613 bs_env%eps_atom_grid_2d_mat = 1.0e-50_dp
1616 bs_env%nparam_pade = 16
1620 bs_env%ri_metric%omega = 0.0_dp
1622 bs_env%ri_metric%filename =
"t_c_g.dat"
1624 bs_env%eps_eigval_mat_RI = 0.0_dp
1626 IF (bs_env%input_regularization_RI > -1.0e-12_dp)
THEN
1627 bs_env%regularization_RI = bs_env%input_regularization_RI
1632 bs_env%regularization_RI = 1.0e-2_dp
1635 IF (sum(bs_env%periodic) == 0) bs_env%regularization_RI = 0.0_dp
1643 rel_cutoff_trunc_coulomb_ri_x=0.5_dp, &
1644 cell_grid=bs_env%cell_grid_scf_desymm, &
1645 do_bvk_cell=do_bvk_cell)
1649 bs_env%heuristic_filter_factor = 1.0e-4
1653 WRITE (u, fmt=
"(T2,2A,F21.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1654 Σ
"operator in ^x:", bs_env%trunc_coulomb%cutoff_radius*
angstrom, Å
" "
1655 WRITE (u, fmt=
"(T2,2A,F15.1,A)")
"Cutoff radius for the truncated Coulomb ", &
1656 "operator in RI metric:", bs_env%ri_metric%cutoff_radius*
angstrom, Å
" "
1657 WRITE (u, fmt=
"(T2,A,ES48.1)")
"Regularization parameter of RI ", bs_env%regularization_RI
1658 WRITE (u, fmt=
"(T2,A,ES38.1)")
"Regularization parameter of minimax grids", &
1659 bs_env%regularization_minimax
1660 WRITE (u, fmt=
"(T2,A,I53)")
"Lattice sum size for V(k):", bs_env%size_lattice_sum_V
1663 CALL timestop(handle)
1665 END SUBROUTINE set_heuristic_parameters
1671 SUBROUTINE print_header_and_input_parameters(bs_env)
1675 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_header_and_input_parameters'
1677 INTEGER :: handle, u
1679 CALL timeset(routinen, handle)
1684 WRITE (u,
'(T2,A)')
' '
1685 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1686 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1687 WRITE (u,
'(T2,A,A46,A32)')
'-',
'GW CALCULATION',
'-'
1688 WRITE (u,
'(T2,A,A78)')
'-',
'-'
1689 WRITE (u,
'(T2,A)') repeat(
'-', 79)
1690 WRITE (u,
'(T2,A)')
' '
1691 WRITE (u,
'(T2,A,I45)')
'Input: Number of time/freq. points', bs_env%num_time_freq_points
1692 WRITE (u,
"(T2,A,F44.1,A)") ωΣω
'Input: _max for fitting (i) (eV)', bs_env%freq_max_fit*
evolt
1693 WRITE (u,
'(T2,A,ES27.1)')
'Input: Filter threshold for sparse tensor operations', &
1695 WRITE (u,
"(T2,A,L55)")
'Input: Apply Hedin shift', bs_env%do_hedin_shift
1696 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
1697 bs_env%input_memory_per_proc_GB,
' GB'
1698 IF (bs_env%do_gw_ri_rs)
THEN
1699 WRITE (u, fmt=
"(T2,A,ES44.1)")
" "
1700 WRITE (u, fmt=
"(T2,A,ES37.1)")
"INPUT: Regularization parameter for RI-RS ", bs_env%ri_rs%tikhonov
1701 IF (bs_env%ri_rs%cutoff_radius_ri_rs /= -1.0_dp)
THEN
1702 WRITE (u, fmt=
"(T2,A,F31.1,A)")
"INPUT: Cutoff radius for grid points in RI-RS ", &
1703 bs_env%ri_rs%cutoff_radius_ri_rs*
angstrom, Å
" "
1705 WRITE (u, fmt=
"(T2,A,I35)")
"INPUT: Number of MPI ranks per atom in Z_lP solve ", &
1706 bs_env%ri_rs%n_procs_per_atom_z_lp
1707 WRITE (u, fmt=
"(T2,A,ES44.1)")
" "
1711 CALL timestop(handle)
1713 END SUBROUTINE print_header_and_input_parameters
1720 SUBROUTINE compute_v_xc(qs_env, bs_env)
1724 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_xc'
1726 INTEGER :: handle, img, ispin, myfun, nimages
1727 LOGICAL :: hf_present
1728 REAL(kind=
dp) :: energy_ex, energy_exc, energy_total, &
1730 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_ks_without_v_xc
1731 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp
1736 CALL timeset(routinen, handle)
1738 CALL get_qs_env(qs_env, input=input, energy=energy, dft_control=dft_control)
1741 nimages = dft_control%nimages
1742 dft_control%nimages = bs_env%nimages_scf
1750 hf_present = .false.
1751 IF (
ASSOCIATED(hf_section))
THEN
1754 IF (hf_present)
THEN
1761 energy_total = energy%total
1762 energy_exc = energy%exc
1763 energy_ex = energy%ex
1765 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1768 NULLIFY (mat_ks_without_v_xc)
1771 DO ispin = 1, bs_env%n_spin
1772 ALLOCATE (mat_ks_without_v_xc(ispin)%matrix)
1773 IF (hf_present)
THEN
1774 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix, &
1775 matrix_type=dbcsr_type_symmetric)
1777 CALL dbcsr_create(mat_ks_without_v_xc(ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1783 ext_ks_matrix=mat_ks_without_v_xc)
1785 DO ispin = 1, bs_env%n_spin
1787 CALL cp_fm_create(bs_env%fm_V_xc_Gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1788 CALL copy_dbcsr_to_fm(mat_ks_without_v_xc(ispin)%matrix, bs_env%fm_V_xc_Gamma(ispin))
1792 beta=1.0_dp, matrix_b=bs_env%fm_ks_Gamma(ispin))
1801 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks_kp)
1803 ALLOCATE (bs_env%fm_V_xc_R(dft_control%nimages, bs_env%n_spin))
1804 DO ispin = 1, bs_env%n_spin
1805 DO img = 1, dft_control%nimages
1807 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1808 CALL cp_fm_create(bs_env%fm_V_xc_R(img, ispin), bs_env%fm_work_mo(1)%matrix_struct, &
1812 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1819 energy%total = energy_total
1820 energy%exc = energy_exc
1821 energy%ex = energy_ex
1824 dft_control%nimages = nimages
1829 IF (hf_present)
THEN
1837 DO ispin = 1, bs_env%n_spin
1838 DO img = 1, dft_control%nimages
1840 CALL copy_dbcsr_to_fm(matrix_ks_kp(ispin, img)%matrix, bs_env%fm_work_mo(1))
1843 beta=1.0_dp, matrix_b=bs_env%fm_work_mo(1))
1848 CALL timestop(handle)
1850 END SUBROUTINE compute_v_xc
1856 SUBROUTINE setup_time_and_frequency_minimax_grid(bs_env)
1859 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_time_and_frequency_minimax_grid'
1861 INTEGER :: handle, homo, i_w, ierr, ispin, j_w, &
1862 n_mo, num_time_freq_points, u
1863 REAL(kind=
dp) :: e_max, e_max_ispin, e_min, e_min_ispin, &
1864 e_range, max_error_min
1865 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: points_and_weights
1867 CALL timeset(routinen, handle)
1870 num_time_freq_points = bs_env%num_time_freq_points
1872 ALLOCATE (bs_env%imag_freq_points(num_time_freq_points))
1873 ALLOCATE (bs_env%imag_time_points(num_time_freq_points))
1874 ALLOCATE (bs_env%imag_time_weights_freq_zero(num_time_freq_points))
1875 ALLOCATE (bs_env%weights_cos_t_to_w(num_time_freq_points, num_time_freq_points))
1876 ALLOCATE (bs_env%weights_cos_w_to_t(num_time_freq_points, num_time_freq_points))
1877 ALLOCATE (bs_env%weights_sin_t_to_w(num_time_freq_points, num_time_freq_points))
1882 DO ispin = 1, bs_env%n_spin
1883 homo = bs_env%n_occ(ispin)
1884 SELECT CASE (bs_env%small_cell_full_kp_or_large_cell_Gamma)
1886 e_min_ispin = bs_env%eigenval_scf_Gamma(homo + 1, ispin) - &
1887 bs_env%eigenval_scf_Gamma(homo, ispin)
1888 e_max_ispin = bs_env%eigenval_scf_Gamma(n_mo, ispin) - &
1889 bs_env%eigenval_scf_Gamma(1, ispin)
1891 e_min_ispin = minval(bs_env%eigenval_scf(homo + 1, :, ispin)) - &
1892 maxval(bs_env%eigenval_scf(homo, :, ispin))
1893 e_max_ispin = maxval(bs_env%eigenval_scf(n_mo, :, ispin)) - &
1894 minval(bs_env%eigenval_scf(1, :, ispin))
1896 e_min = min(e_min, e_min_ispin)
1897 e_max = max(e_max, e_max_ispin)
1900 e_range = e_max/e_min
1902 ALLOCATE (points_and_weights(2*num_time_freq_points))
1905 IF (num_time_freq_points <= 20)
THEN
1913 bs_env%imag_freq_points(:) = points_and_weights(1:num_time_freq_points)*e_min
1916 bs_env%num_freq_points_fit = 0
1917 DO i_w = 1, num_time_freq_points
1918 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1919 bs_env%num_freq_points_fit = bs_env%num_freq_points_fit + 1
1924 ALLOCATE (bs_env%imag_freq_points_fit(bs_env%num_freq_points_fit))
1926 DO i_w = 1, num_time_freq_points
1927 IF (bs_env%imag_freq_points(i_w) < bs_env%freq_max_fit)
THEN
1929 bs_env%imag_freq_points_fit(j_w) = bs_env%imag_freq_points(i_w)
1935 IF (bs_env%num_freq_points_fit < bs_env%nparam_pade)
THEN
1936 bs_env%nparam_pade = bs_env%num_freq_points_fit
1940 IF (num_time_freq_points <= 20)
THEN
1946 bs_env%imag_time_points(:) = points_and_weights(1:num_time_freq_points)/(2.0_dp*e_min)
1947 bs_env%imag_time_weights_freq_zero(:) = points_and_weights(num_time_freq_points + 1:)/(e_min)
1949 DEALLOCATE (points_and_weights)
1953 WRITE (u,
'(T2,A)')
''
1954 WRITE (u,
'(T2,A,F55.2)')
'SCF direct band gap (eV)', e_min*
evolt
1955 WRITE (u,
'(T2,A,F53.2)')
'Max. SCF eigval diff. (eV)', e_max*
evolt
1956 WRITE (u,
'(T2,A,F55.2)')
'E-Range for minimax grid', e_range
1957 WRITE (u,
'(T2,A,I27)') é
'Number of Pad parameters for analytic continuation:', &
1959 WRITE (u,
'(T2,A)')
''
1969 bs_env%imag_time_points, &
1970 bs_env%weights_cos_t_to_w, &
1971 bs_env%imag_freq_points, &
1972 e_min, e_max, max_error_min, &
1973 bs_env%num_points_per_magnitude, &
1974 bs_env%regularization_minimax)
1978 bs_env%imag_time_points, &
1979 bs_env%weights_cos_w_to_t, &
1980 bs_env%imag_freq_points, &
1981 e_min, e_max, max_error_min, &
1982 bs_env%num_points_per_magnitude, &
1983 bs_env%regularization_minimax)
1987 bs_env%imag_time_points, &
1988 bs_env%weights_sin_t_to_w, &
1989 bs_env%imag_freq_points, &
1990 e_min, e_max, max_error_min, &
1991 bs_env%num_points_per_magnitude, &
1992 bs_env%regularization_minimax)
1994 CALL timestop(handle)
1996 END SUBROUTINE setup_time_and_frequency_minimax_grid
2003 SUBROUTINE setup_cells_3c(qs_env, bs_env)
2008 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_3c'
2010 INTEGER :: atom_i, atom_j, atom_k, block_count, handle, i, i_cell_x, i_cell_x_max, &
2011 i_cell_x_min, i_size, ikind, img, j, j_cell, j_cell_max, j_cell_y, j_cell_y_max, &
2012 j_cell_y_min, j_size, k_cell, k_cell_max, k_cell_z, k_cell_z_max, k_cell_z_min, k_size, &
2013 nimage_pairs_3c, nimages_3c, nimages_3c_max, nkind, u
2014 INTEGER(KIND=int_8) :: mem_occ_per_proc
2015 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, n_other_3c_images_max
2016 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c_max, nblocks_3c_max
2017 INTEGER,
DIMENSION(3) :: cell_index, n_max
2018 REAL(kind=
dp) :: avail_mem_per_proc_gb, cell_dist, cell_radius_3c, dij, dik, djk, eps, &
2019 exp_min_ao, exp_min_ri, frobenius_norm, mem_3c_gb, mem_occ_per_proc_gb, radius_ao, &
2020 radius_ao_product, radius_ri
2021 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exp_ao_kind, exp_ri_kind, &
2023 radius_ao_product_kind, radius_ri_kind
2024 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: int_3c
2025 REAL(kind=
dp),
DIMENSION(3) :: rij, rik, rjk, vec_cell_j, vec_cell_k
2026 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: exp_ao, exp_ri
2031 CALL timeset(routinen, handle)
2033 CALL get_qs_env(qs_env, nkind=nkind, atomic_kind_set=atomic_kind_set, particle_set=particle_set, cell=cell)
2035 ALLOCATE (exp_ao_kind(nkind), exp_ri_kind(nkind), radius_ao_kind(nkind), &
2036 radius_ao_product_kind(nkind), radius_ri_kind(nkind))
2038 exp_min_ri = 10.0_dp
2039 exp_min_ao = 10.0_dp
2040 exp_ri_kind = 10.0_dp
2041 exp_ao_kind = 10.0_dp
2043 eps = bs_env%eps_filter*bs_env%heuristic_filter_factor
2052 DO i = 1,
SIZE(exp_ri, 1)
2053 DO j = 1,
SIZE(exp_ri, 2)
2054 IF (exp_ri(i, j) < exp_min_ri .AND. exp_ri(i, j) > 1e-3_dp) exp_min_ri = exp_ri(i, j)
2055 IF (exp_ri(i, j) < exp_ri_kind(ikind) .AND. exp_ri(i, j) > 1e-3_dp) &
2056 exp_ri_kind(ikind) = exp_ri(i, j)
2059 DO i = 1,
SIZE(exp_ao, 1)
2060 DO j = 1,
SIZE(exp_ao, 2)
2061 IF (exp_ao(i, j) < exp_min_ao .AND. exp_ao(i, j) > 1e-3_dp) exp_min_ao = exp_ao(i, j)
2062 IF (exp_ao(i, j) < exp_ao_kind(ikind) .AND. exp_ao(i, j) > 1e-3_dp) &
2063 exp_ao_kind(ikind) = exp_ao(i, j)
2066 radius_ao_kind(ikind) = sqrt(-log(eps)/exp_ao_kind(ikind))
2067 radius_ao_product_kind(ikind) = sqrt(-log(eps)/(2.0_dp*exp_ao_kind(ikind)))
2068 radius_ri_kind(ikind) = sqrt(-log(eps)/exp_ri_kind(ikind))
2071 radius_ao = sqrt(-log(eps)/exp_min_ao)
2072 radius_ao_product = sqrt(-log(eps)/(2.0_dp*exp_min_ao))
2073 radius_ri = sqrt(-log(eps)/exp_min_ri)
2078 cell_radius_3c = radius_ao_product + radius_ri + bs_env%ri_metric%cutoff_radius
2080 n_max(1:3) = bs_env%periodic(1:3)*30
2091 DO i_cell_x = -n_max(1), n_max(1)
2092 DO j_cell_y = -n_max(2), n_max(2)
2093 DO k_cell_z = -n_max(3), n_max(3)
2095 cell_index(1:3) = [i_cell_x, j_cell_y, k_cell_z]
2097 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2099 IF (cell_dist < cell_radius_3c)
THEN
2100 nimages_3c_max = nimages_3c_max + 1
2101 i_cell_x_min = min(i_cell_x_min, i_cell_x)
2102 i_cell_x_max = max(i_cell_x_max, i_cell_x)
2103 j_cell_y_min = min(j_cell_y_min, j_cell_y)
2104 j_cell_y_max = max(j_cell_y_max, j_cell_y)
2105 k_cell_z_min = min(k_cell_z_min, k_cell_z)
2106 k_cell_z_max = max(k_cell_z_max, k_cell_z)
2115 ALLOCATE (index_to_cell_3c_max(3, nimages_3c_max))
2118 DO i_cell_x = -n_max(1), n_max(1)
2119 DO j_cell_y = -n_max(2), n_max(2)
2120 DO k_cell_z = -n_max(3), n_max(3)
2122 cell_index(1:3) = [i_cell_x, j_cell_y, k_cell_z]
2124 CALL get_cell_dist(cell_index, bs_env%hmat, cell_dist)
2126 IF (cell_dist < cell_radius_3c)
THEN
2128 index_to_cell_3c_max(1:3, img) = cell_index(1:3)
2136 ALLOCATE (nblocks_3c_max(nimages_3c_max, nimages_3c_max))
2137 nblocks_3c_max(:, :) = 0
2140 DO j_cell = 1, nimages_3c_max
2141 DO k_cell = 1, nimages_3c_max
2143 DO atom_j = 1, bs_env%n_atom
2144 DO atom_k = 1, bs_env%n_atom
2145 DO atom_i = 1, bs_env%n_atom
2147 block_count = block_count + 1
2148 IF (
modulo(block_count, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
2150 CALL scaled_to_real(vec_cell_j, real(index_to_cell_3c_max(1:3, j_cell), kind=
dp), cell)
2151 CALL scaled_to_real(vec_cell_k, real(index_to_cell_3c_max(1:3, k_cell), kind=
dp), cell)
2153 rij =
pbc(particle_set(atom_j)%r(:), cell) -
pbc(particle_set(atom_i)%r(:), cell) + vec_cell_j(:)
2154 rjk =
pbc(particle_set(atom_k)%r(:), cell) -
pbc(particle_set(atom_j)%r(:), cell) &
2155 + vec_cell_k(:) - vec_cell_j(:)
2156 rik(:) = rij(:) + rjk(:)
2160 IF (djk > radius_ao_kind(kind_of(atom_j)) + radius_ao_kind(kind_of(atom_k))) cycle
2161 IF (dij > radius_ao_kind(kind_of(atom_j)) + radius_ri_kind(kind_of(atom_i)) &
2162 + bs_env%ri_metric%cutoff_radius) cycle
2163 IF (dik > radius_ri_kind(kind_of(atom_i)) + radius_ao_kind(kind_of(atom_k)) &
2164 + bs_env%ri_metric%cutoff_radius) cycle
2166 j_size = bs_env%i_ao_end_from_atom(atom_j) - bs_env%i_ao_start_from_atom(atom_j) + 1
2167 k_size = bs_env%i_ao_end_from_atom(atom_k) - bs_env%i_ao_start_from_atom(atom_k) + 1
2168 i_size = bs_env%i_RI_end_from_atom(atom_i) - bs_env%i_RI_start_from_atom(atom_i) + 1
2170 ALLOCATE (int_3c(j_size, k_size, i_size))
2175 basis_j=bs_env%basis_set_AO, &
2176 basis_k=bs_env%basis_set_AO, &
2177 basis_i=bs_env%basis_set_RI, &
2178 cell_j=index_to_cell_3c_max(1:3, j_cell), &
2179 cell_k=index_to_cell_3c_max(1:3, k_cell), &
2180 atom_k=atom_k, atom_j=atom_j, atom_i=atom_i)
2182 frobenius_norm = sqrt(sum(int_3c(:, :, :)**2))
2188 IF (frobenius_norm > eps)
THEN
2189 nblocks_3c_max(j_cell, k_cell) = nblocks_3c_max(j_cell, k_cell) + 1
2199 CALL bs_env%para_env%sum(nblocks_3c_max)
2201 ALLOCATE (n_other_3c_images_max(nimages_3c_max))
2202 n_other_3c_images_max(:) = 0
2207 DO j_cell = 1, nimages_3c_max
2208 DO k_cell = 1, nimages_3c_max
2209 IF (nblocks_3c_max(j_cell, k_cell) > 0)
THEN
2210 n_other_3c_images_max(j_cell) = n_other_3c_images_max(j_cell) + 1
2211 nimage_pairs_3c = nimage_pairs_3c + 1
2215 IF (n_other_3c_images_max(j_cell) > 0) nimages_3c = nimages_3c + 1
2219 bs_env%nimages_3c = nimages_3c
2220 ALLOCATE (bs_env%index_to_cell_3c(3, nimages_3c))
2221 ALLOCATE (bs_env%cell_to_index_3c(i_cell_x_min:i_cell_x_max, &
2222 j_cell_y_min:j_cell_y_max, &
2223 k_cell_z_min:k_cell_z_max))
2224 bs_env%cell_to_index_3c(:, :, :) = -1
2226 ALLOCATE (bs_env%nblocks_3c(nimages_3c, nimages_3c))
2227 bs_env%nblocks_3c(nimages_3c, nimages_3c) = 0
2230 DO j_cell_max = 1, nimages_3c_max
2231 IF (n_other_3c_images_max(j_cell_max) == 0) cycle
2233 cell_index(1:3) = index_to_cell_3c_max(1:3, j_cell_max)
2234 bs_env%index_to_cell_3c(1:3, j_cell) = cell_index(1:3)
2235 bs_env%cell_to_index_3c(cell_index(1), cell_index(2), cell_index(3)) = j_cell
2238 DO k_cell_max = 1, nimages_3c_max
2239 IF (n_other_3c_images_max(k_cell_max) == 0) cycle
2242 bs_env%nblocks_3c(j_cell, k_cell) = nblocks_3c_max(j_cell_max, k_cell_max)
2248 mem_3c_gb = real(bs_env%n_RI, kind=
dp)*real(bs_env%n_ao, kind=
dp)**2 &
2249 *real(nimage_pairs_3c, kind=
dp)*8e-9_dp
2252 CALL bs_env%para_env%max(mem_occ_per_proc)
2254 mem_occ_per_proc_gb = real(mem_occ_per_proc, kind=
dp)/1.0e9_dp
2257 avail_mem_per_proc_gb = bs_env%input_memory_per_proc_GB - mem_occ_per_proc_gb
2260 bs_env%group_size_tensor = max(int(mem_3c_gb/avail_mem_per_proc_gb + 1.0_dp), 1)
2265 WRITE (u, fmt=
"(T2,A,F52.1,A)")
"Radius of atomic orbitals", radius_ao*
angstrom, Å
" "
2266 WRITE (u, fmt=
"(T2,A,F55.1,A)")
"Radius of RI functions", radius_ri*
angstrom, Å
" "
2267 WRITE (u, fmt=
"(T2,A,I47)")
"Number of cells for 3c integrals", nimages_3c
2268 WRITE (u, fmt=
"(T2,A,I42)")
"Number of cell pairs for 3c integrals", nimage_pairs_3c
2269 WRITE (u,
'(T2,A)')
''
2270 WRITE (u,
'(T2,A,F37.1,A)')
'Input: Available memory per MPI process', &
2271 bs_env%input_memory_per_proc_GB,
' GB'
2272 WRITE (u,
'(T2,A,F35.1,A)')
'Used memory per MPI process before GW run', &
2273 mem_occ_per_proc_gb,
' GB'
2274 WRITE (u,
'(T2,A,F44.1,A)')
'Memory of three-center integrals', mem_3c_gb,
' GB'
2277 CALL timestop(handle)
2279 END SUBROUTINE setup_cells_3c
2291 SUBROUTINE sum_two_r_grids(index_to_cell_1, index_to_cell_2, nimages_1, nimages_2, &
2292 index_to_cell, cell_to_index, nimages)
2294 INTEGER,
DIMENSION(:, :) :: index_to_cell_1, index_to_cell_2
2295 INTEGER :: nimages_1, nimages_2
2296 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell
2297 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
2300 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_two_R_grids'
2302 INTEGER :: handle, i_dim, img_1, img_2, nimages_max
2303 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_tmp
2304 INTEGER,
DIMENSION(3) :: cell_1, cell_2, r, r_max, r_min
2306 CALL timeset(routinen, handle)
2309 r_min(i_dim) = minval(index_to_cell_1(i_dim, :)) + minval(index_to_cell_2(i_dim, :))
2310 r_max(i_dim) = maxval(index_to_cell_1(i_dim, :)) + maxval(index_to_cell_2(i_dim, :))
2313 nimages_max = (r_max(1) - r_min(1) + 1)*(r_max(2) - r_min(2) + 1)*(r_max(3) - r_min(3) + 1)
2315 ALLOCATE (index_to_cell_tmp(3, nimages_max))
2316 index_to_cell_tmp(:, :) = -1
2318 ALLOCATE (cell_to_index(r_min(1):r_max(1), r_min(2):r_max(2), r_min(3):r_max(3)))
2319 cell_to_index(:, :, :) = -1
2323 DO img_1 = 1, nimages_1
2325 DO img_2 = 1, nimages_2
2327 cell_1(1:3) = index_to_cell_1(1:3, img_1)
2328 cell_2(1:3) = index_to_cell_2(1:3, img_2)
2330 r(1:3) = cell_1(1:3) + cell_2(1:3)
2333 IF (cell_to_index(r(1), r(2), r(3)) == -1)
THEN
2335 nimages = nimages + 1
2336 cell_to_index(r(1), r(2), r(3)) = nimages
2337 index_to_cell_tmp(1:3, nimages) = r(1:3)
2345 ALLOCATE (index_to_cell(3, nimages))
2346 index_to_cell(:, :) = index_to_cell_tmp(1:3, 1:nimages)
2348 CALL timestop(handle)
2350 END SUBROUTINE sum_two_r_grids
2357 SUBROUTINE compute_3c_integrals(qs_env, bs_env)
2362 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
2364 INTEGER :: handle, j_cell, k_cell, nimages_3c
2366 CALL timeset(routinen, handle)
2368 nimages_3c = bs_env%nimages_3c
2369 ALLOCATE (bs_env%t_3c_int(nimages_3c, nimages_3c))
2370 DO j_cell = 1, nimages_3c
2371 DO k_cell = 1, nimages_3c
2372 CALL dbt_create(bs_env%t_RI_AO__AO, bs_env%t_3c_int(j_cell, k_cell))
2377 bs_env%eps_filter, &
2380 int_eps=bs_env%eps_filter*0.05_dp, &
2381 basis_i=bs_env%basis_set_RI, &
2382 basis_j=bs_env%basis_set_AO, &
2383 basis_k=bs_env%basis_set_AO, &
2384 potential_parameter=bs_env%ri_metric, &
2385 desymmetrize=.false., do_kpoints=.true., cell_sym=.true., &
2386 cell_to_index_ext=bs_env%cell_to_index_3c)
2388 CALL bs_env%para_env%sync()
2390 CALL timestop(handle)
2392 END SUBROUTINE compute_3c_integrals
2400 SUBROUTINE get_cell_dist(cell_index, hmat, cell_dist)
2402 INTEGER,
DIMENSION(3) :: cell_index
2403 REAL(kind=
dp) :: hmat(3, 3), cell_dist
2405 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_cell_dist'
2407 INTEGER :: handle, i_dim
2408 INTEGER,
DIMENSION(3) :: cell_index_adj
2409 REAL(kind=
dp) :: cell_dist_3(3)
2411 CALL timeset(routinen, handle)
2416 IF (cell_index(i_dim) > 0) cell_index_adj(i_dim) = cell_index(i_dim) - 1
2417 IF (cell_index(i_dim) < 0) cell_index_adj(i_dim) = cell_index(i_dim) + 1
2418 IF (cell_index(i_dim) == 0) cell_index_adj(i_dim) = cell_index(i_dim)
2421 cell_dist_3(1:3) = matmul(hmat, real(cell_index_adj, kind=
dp))
2423 cell_dist = sqrt(abs(sum(cell_dist_3(1:3)**2)))
2425 CALL timestop(handle)
2427 END SUBROUTINE get_cell_dist
2436 SUBROUTINE setup_kpoints_scf_desymm(qs_env, bs_env, kpoints, do_print)
2441 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_kpoints_scf_desymm'
2443 INTEGER :: handle, i_cell_x, i_dim, img, j_cell_y, &
2444 k_cell_z, nimages, nkp, u
2445 INTEGER,
DIMENSION(3) :: cell_grid, cixd, nkp_grid
2450 CALL timeset(routinen, handle)
2455 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints_scf)
2457 nkp_grid(1:3) = kpoints_scf%nkp_grid(1:3)
2458 nkp = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)
2462 IF (bs_env%periodic(i_dim) == 1)
THEN
2463 cpassert(nkp_grid(i_dim) > 1)
2467 kpoints%kp_scheme =
"GENERAL"
2468 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
2470 bs_env%nkp_scf_desymm = nkp
2472 ALLOCATE (kpoints%xkp(1:3, nkp))
2475 ALLOCATE (kpoints%wkp(nkp))
2476 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=
dp)
2480 cell_grid(1:3) = nkp_grid(1:3) -
modulo(nkp_grid(1:3) + 1, 2)
2482 cixd(1:3) = cell_grid(1:3)/2
2484 nimages = cell_grid(1)*cell_grid(2)*cell_grid(3)
2486 bs_env%nimages_scf_desymm = nimages
2488 ALLOCATE (kpoints%cell_to_index(-cixd(1):cixd(1), -cixd(2):cixd(2), -cixd(3):cixd(3)))
2489 ALLOCATE (kpoints%index_to_cell(3, nimages))
2492 DO i_cell_x = -cixd(1), cixd(1)
2493 DO j_cell_y = -cixd(2), cixd(2)
2494 DO k_cell_z = -cixd(3), cixd(3)
2496 kpoints%cell_to_index(i_cell_x, j_cell_y, k_cell_z) = img
2497 kpoints%index_to_cell(1:3, img) = [i_cell_x, j_cell_y, k_cell_z]
2503 IF (u > 0 .AND. do_print)
THEN
2504 WRITE (u, fmt=
"(T2,A,I49)") χΣ
"Number of cells for G, , W, ", nimages
2507 CALL timestop(handle)
2509 END SUBROUTINE setup_kpoints_scf_desymm
2515 SUBROUTINE setup_cells_delta_r(bs_env)
2519 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_cells_Delta_R'
2523 CALL timeset(routinen, handle)
2528 CALL sum_two_r_grids(bs_env%index_to_cell_3c, &
2529 bs_env%index_to_cell_3c, &
2530 bs_env%nimages_3c, bs_env%nimages_3c, &
2531 bs_env%index_to_cell_Delta_R, &
2532 bs_env%cell_to_index_Delta_R, &
2533 bs_env%nimages_Delta_R)
2535 IF (bs_env%unit_nr > 0)
THEN
2536 WRITE (bs_env%unit_nr, fmt=
"(T2,A,I61)") Δ
"Number of cells R", bs_env%nimages_Delta_R
2539 CALL timestop(handle)
2541 END SUBROUTINE setup_cells_delta_r
2547 SUBROUTINE setup_parallelization_delta_r(bs_env)
2551 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_parallelization_Delta_R'
2553 INTEGER :: handle, i_cell_delta_r, i_task_local, &
2555 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: i_cell_delta_r_group, &
2556 n_tensor_ops_delta_r
2558 CALL timeset(routinen, handle)
2560 CALL compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_delta_r)
2562 CALL compute_delta_r_dist(bs_env, n_tensor_ops_delta_r, i_cell_delta_r_group, n_tasks_local)
2564 bs_env%n_tasks_Delta_R_local = n_tasks_local
2566 ALLOCATE (bs_env%task_Delta_R(n_tasks_local))
2569 DO i_cell_delta_r = 1, bs_env%nimages_Delta_R
2571 IF (i_cell_delta_r_group(i_cell_delta_r) /= bs_env%tensor_group_color) cycle
2573 i_task_local = i_task_local + 1
2575 bs_env%task_Delta_R(i_task_local) = i_cell_delta_r
2579 ALLOCATE (bs_env%skip_DR_chi(n_tasks_local))
2580 bs_env%skip_DR_chi(:) = .false.
2581 ALLOCATE (bs_env%skip_DR_Sigma(n_tasks_local))
2582 bs_env%skip_DR_Sigma(:) = .false.
2584 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Goccx3c_chi, bs_env)
2585 CALL allocate_skip_3xr(bs_env%skip_DR_R12_S_Gvirx3c_chi, bs_env)
2586 CALL allocate_skip_3xr(bs_env%skip_DR_R_R2_MxM_chi, bs_env)
2588 CALL allocate_skip_3xr(bs_env%skip_DR_R1_S2_Gx3c_Sigma, bs_env)
2589 CALL allocate_skip_3xr(bs_env%skip_DR_R1_R_MxM_Sigma, bs_env)
2591 CALL timestop(handle)
2593 END SUBROUTINE setup_parallelization_delta_r
2600 SUBROUTINE allocate_skip_3xr(skip, bs_env)
2601 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip
2604 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_skip_3xR'
2608 CALL timeset(routinen, handle)
2610 ALLOCATE (skip(bs_env%n_tasks_Delta_R_local, bs_env%nimages_3c, bs_env%nimages_scf_desymm))
2611 skip(:, :, :) = .false.
2613 CALL timestop(handle)
2615 END SUBROUTINE allocate_skip_3xr
2624 SUBROUTINE compute_delta_r_dist(bs_env, n_tensor_ops_Delta_R, i_cell_Delta_R_group, n_tasks_local)
2626 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r, &
2627 i_cell_delta_r_group
2628 INTEGER :: n_tasks_local
2630 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Delta_R_dist'
2632 INTEGER :: handle, i_delta_r_max_op, i_group_min, &
2634 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r_in_group
2636 CALL timeset(routinen, handle)
2638 nimages_delta_r = bs_env%nimages_Delta_R
2642 IF (u > 0 .AND. nimages_delta_r < bs_env%num_tensor_groups)
THEN
2643 WRITE (u, fmt=
"(T2,A,I5,A,I5,A)")
"There are only ", nimages_delta_r, &
2644 " tasks to work on but there are ", bs_env%num_tensor_groups,
" groups."
2645 WRITE (u, fmt=
"(T2,A)")
"Please reduce the number of MPI processes."
2646 WRITE (u,
'(T2,A)')
''
2649 ALLOCATE (n_tensor_ops_delta_r_in_group(bs_env%num_tensor_groups))
2650 n_tensor_ops_delta_r_in_group(:) = 0
2651 ALLOCATE (i_cell_delta_r_group(nimages_delta_r))
2652 i_cell_delta_r_group(:) = -1
2656 DO WHILE (any(n_tensor_ops_delta_r(:) /= 0))
2659 i_delta_r_max_op = maxloc(n_tensor_ops_delta_r, 1)
2662 i_group_min = minloc(n_tensor_ops_delta_r_in_group, 1)
2665 i_cell_delta_r_group(i_delta_r_max_op) = i_group_min - 1
2666 n_tensor_ops_delta_r_in_group(i_group_min) = n_tensor_ops_delta_r_in_group(i_group_min) + &
2667 n_tensor_ops_delta_r(i_delta_r_max_op)
2670 n_tensor_ops_delta_r(i_delta_r_max_op) = 0
2672 IF (bs_env%tensor_group_color == i_group_min - 1) n_tasks_local = n_tasks_local + 1
2676 CALL timestop(handle)
2678 END SUBROUTINE compute_delta_r_dist
2685 SUBROUTINE compute_n_tensor_ops_delta_r(bs_env, n_tensor_ops_Delta_R)
2687 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_tensor_ops_delta_r
2689 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_n_tensor_ops_Delta_R'
2691 INTEGER :: handle, i_cell_delta_r, i_cell_r, i_cell_r1, i_cell_r1_minus_r, i_cell_r2, &
2692 i_cell_r2_m_r1, i_cell_s1, i_cell_s1_m_r1_p_r2, i_cell_s1_minus_r, i_cell_s2, &
2694 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, cell_r1_minus_r, cell_r2, &
2695 cell_r2_m_r1, cell_s1, cell_s1_m_r2_p_r1, cell_s1_minus_r, cell_s1_p_s2_m_r1, cell_s2
2696 LOGICAL :: cell_found
2698 CALL timeset(routinen, handle)
2700 nimages_delta_r = bs_env%nimages_Delta_R
2702 ALLOCATE (n_tensor_ops_delta_r(nimages_delta_r))
2703 n_tensor_ops_delta_r(:) = 0
2706 DO i_cell_delta_r = 1, nimages_delta_r
2708 IF (
modulo(i_cell_delta_r, bs_env%num_tensor_groups) /= bs_env%tensor_group_color) cycle
2710 DO i_cell_r1 = 1, bs_env%nimages_3c
2712 cell_r1(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r1)
2713 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
2716 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
2717 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
2718 IF (.NOT. cell_found) cycle
2720 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
2722 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r2)
2725 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
2726 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
2727 IF (.NOT. cell_found) cycle
2730 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
2731 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
2732 IF (.NOT. cell_found) cycle
2734 n_tensor_ops_delta_r(i_cell_delta_r) = n_tensor_ops_delta_r(i_cell_delta_r) + 1
2738 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
2740 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_s2)
2741 cell_m_r1(1:3) = -cell_r1(1:3)
2742 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
2745 IF (.NOT. cell_found) cycle
2748 IF (.NOT. cell_found) cycle
2752 DO i_cell_r = 1, bs_env%nimages_scf_desymm
2754 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r)
2757 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
2758 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
2759 IF (.NOT. cell_found) cycle
2762 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
2763 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
2764 IF (.NOT. cell_found) cycle
2772 CALL bs_env%para_env%sum(n_tensor_ops_delta_r)
2774 CALL timestop(handle)
2776 END SUBROUTINE compute_n_tensor_ops_delta_r
2788 SUBROUTINE add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, &
2789 cell_to_index, i_cell_1_plus_2)
2791 INTEGER,
DIMENSION(3) :: cell_1, cell_2
2792 INTEGER,
DIMENSION(:, :) :: index_to_cell
2793 INTEGER,
DIMENSION(3) :: cell_1_plus_2
2794 LOGICAL :: cell_found
2795 INTEGER,
DIMENSION(:, :, :),
INTENT(IN), &
2796 OPTIONAL,
POINTER :: cell_to_index
2797 INTEGER,
INTENT(OUT),
OPTIONAL :: i_cell_1_plus_2
2799 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_R'
2803 CALL timeset(routinen, handle)
2805 cell_1_plus_2(1:3) = cell_1(1:3) + cell_2(1:3)
2809 IF (
PRESENT(i_cell_1_plus_2))
THEN
2810 IF (cell_found)
THEN
2811 cpassert(
PRESENT(cell_to_index))
2812 i_cell_1_plus_2 = cell_to_index(cell_1_plus_2(1), cell_1_plus_2(2), cell_1_plus_2(3))
2814 i_cell_1_plus_2 = -1000
2818 CALL timestop(handle)
2820 END SUBROUTINE add_r
2829 INTEGER,
DIMENSION(3) :: cell
2830 INTEGER,
DIMENSION(:, :) :: index_to_cell
2831 LOGICAL :: cell_found
2833 CHARACTER(LEN=*),
PARAMETER :: routinen =
'is_cell_in_index_to_cell'
2835 INTEGER :: handle, i_cell, nimg
2836 INTEGER,
DIMENSION(3) :: cell_i
2838 CALL timeset(routinen, handle)
2840 nimg =
SIZE(index_to_cell, 2)
2842 cell_found = .false.
2846 cell_i(1:3) = index_to_cell(1:3, i_cell)
2848 IF (cell_i(1) == cell(1) .AND. cell_i(2) == cell(2) .AND. cell_i(3) == cell(3))
THEN
2854 CALL timestop(handle)
2863 SUBROUTINE allocate_matrices_small_cell_full_kp(qs_env, bs_env)
2867 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_small_cell_full_kp'
2869 INTEGER :: handle, i_spin, i_t, img, n_spin, &
2870 nimages_scf, num_time_freq_points
2874 CALL timeset(routinen, handle)
2876 nimages_scf = bs_env%nimages_scf_desymm
2877 num_time_freq_points = bs_env%num_time_freq_points
2878 n_spin = bs_env%n_spin
2880 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2882 ALLOCATE (bs_env%fm_G_S(nimages_scf))
2883 ALLOCATE (bs_env%fm_Sigma_x_R(nimages_scf))
2884 ALLOCATE (bs_env%fm_chi_R_t(nimages_scf, num_time_freq_points))
2885 ALLOCATE (bs_env%fm_MWM_R_t(nimages_scf, num_time_freq_points))
2886 ALLOCATE (bs_env%fm_Sigma_c_R_neg_tau(nimages_scf, num_time_freq_points, n_spin))
2887 ALLOCATE (bs_env%fm_Sigma_c_R_pos_tau(nimages_scf, num_time_freq_points, n_spin))
2888 DO img = 1, nimages_scf
2889 CALL cp_fm_create(bs_env%fm_G_S(img), bs_env%fm_work_mo(1)%matrix_struct)
2890 CALL cp_fm_create(bs_env%fm_Sigma_x_R(img), bs_env%fm_work_mo(1)%matrix_struct)
2891 DO i_t = 1, num_time_freq_points
2892 CALL cp_fm_create(bs_env%fm_chi_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2893 CALL cp_fm_create(bs_env%fm_MWM_R_t(img, i_t), bs_env%fm_RI_RI%matrix_struct)
2895 DO i_spin = 1, n_spin
2896 CALL cp_fm_create(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), &
2897 bs_env%fm_work_mo(1)%matrix_struct)
2898 CALL cp_fm_create(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), &
2899 bs_env%fm_work_mo(1)%matrix_struct)
2900 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_neg_tau(img, i_t, i_spin), 0.0_dp)
2901 CALL cp_fm_set_all(bs_env%fm_Sigma_c_R_pos_tau(img, i_t, i_spin), 0.0_dp)
2906 CALL timestop(handle)
2908 END SUBROUTINE allocate_matrices_small_cell_full_kp
2915 SUBROUTINE trafo_v_xc_r_to_kp(qs_env, bs_env)
2919 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_V_xc_R_to_kp'
2921 INTEGER :: handle, ikp, img, ispin, n_ao
2922 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index_scf
2923 TYPE(
cp_cfm_type) :: cfm_mo_coeff, cfm_tmp, cfm_v_xc
2925 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks
2930 CALL timeset(routinen, handle)
2934 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints_scf)
2937 CALL get_kpoint_info(kpoints_scf, sab_nl=sab_nl, cell_to_index=cell_to_index_scf)
2939 CALL cp_cfm_create(cfm_v_xc, bs_env%cfm_work_mo%matrix_struct)
2940 CALL cp_cfm_create(cfm_mo_coeff, bs_env%cfm_work_mo%matrix_struct)
2941 CALL cp_cfm_create(cfm_tmp, bs_env%cfm_work_mo%matrix_struct)
2942 CALL cp_fm_create(fm_v_xc_re, bs_env%cfm_work_mo%matrix_struct)
2944 DO img = 1, bs_env%nimages_scf
2945 DO ispin = 1, bs_env%n_spin
2947 CALL dbcsr_set(matrix_ks(ispin, img)%matrix, 0.0_dp)
2948 CALL copy_fm_to_dbcsr(bs_env%fm_V_xc_R(img, ispin), matrix_ks(ispin, img)%matrix)
2952 ALLOCATE (bs_env%v_xc_n(n_ao, bs_env%nkp_bs_and_DOS, bs_env%n_spin))
2954 DO ispin = 1, bs_env%n_spin
2955 DO ikp = 1, bs_env%nkp_bs_and_DOS
2958 CALL rsmat_to_kp(matrix_ks, ispin, bs_env%kpoints_DOS%xkp(1:3, ikp), &
2959 cell_to_index_scf, sab_nl, bs_env, cfm_v_xc)
2962 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
2986 CALL timestop(handle)
2988 END SUBROUTINE trafo_v_xc_r_to_kp
2995 SUBROUTINE heuristic_ri_regularization(qs_env, bs_env)
2999 CHARACTER(LEN=*),
PARAMETER :: routinen =
'heuristic_RI_regularization'
3001 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m
3002 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
3004 REAL(kind=
dp) :: cond_nr, cond_nr_max, max_ev, &
3005 max_ev_ikp, min_ev, min_ev_ikp
3006 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
3008 CALL timeset(routinen, handle)
3011 CALL get_v_tr_r(m_r, bs_env%ri_metric, 0.0_dp, bs_env, qs_env)
3013 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
3019 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3020 nkp_local = nkp_local + 1
3023 ALLOCATE (m(n_ri, n_ri, nkp_local))
3026 cond_nr_max = 0.0_dp
3033 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3035 ikp_local = ikp_local + 1
3038 CALL rs_to_kp(m_r, m(:, :, ikp_local), &
3039 bs_env%kpoints_scf_desymm%index_to_cell, &
3040 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
3043 CALL power(m(:, :, ikp_local), 1.0_dp, 0.0_dp, cond_nr, min_ev_ikp, max_ev_ikp)
3045 IF (cond_nr > cond_nr_max) cond_nr_max = cond_nr
3046 IF (max_ev_ikp > max_ev) max_ev = max_ev_ikp
3047 IF (min_ev_ikp < min_ev) min_ev = min_ev_ikp
3051 CALL bs_env%para_env%max(cond_nr_max)
3052 CALL bs_env%para_env%min(min_ev)
3053 CALL bs_env%para_env%max(max_ev)
3057 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Min. abs. eigenvalue of RI metric matrix M(k)", min_ev
3058 WRITE (u, fmt=
"(T2,A,ES34.1)")
"Max. abs. eigenvalue of RI metric matrix M(k)", max_ev
3059 WRITE (u, fmt=
"(T2,A,ES50.1)")
"Max. condition number of M(k)", cond_nr_max
3062 CALL timestop(handle)
3064 END SUBROUTINE heuristic_ri_regularization
3074 SUBROUTINE get_v_tr_r(V_tr_R, pot_type, regularization_RI, bs_env, qs_env)
3075 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: v_tr_r
3077 REAL(kind=
dp) :: regularization_ri
3081 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_V_tr_R'
3083 INTEGER :: handle, img, nimages_scf_desymm
3084 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
3085 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
3087 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_v_tr_r
3089 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_v_tr_r
3094 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3096 CALL timeset(routinen, handle)
3098 NULLIFY (sab_ri, dist_2d)
3101 blacs_env=blacs_env, &
3102 distribution_2d=dist_2d, &
3103 qs_kind_set=qs_kind_set, &
3104 particle_set=particle_set)
3106 ALLOCATE (sizes_ri(bs_env%n_atom))
3107 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=bs_env%basis_set_RI)
3109 pot_type,
"2c_nl_RI", qs_env, sym_ij=.false., &
3112 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
3113 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
3114 row_bsize(:) = sizes_ri
3115 col_bsize(:) = sizes_ri
3117 nimages_scf_desymm = bs_env%nimages_scf_desymm
3118 ALLOCATE (mat_v_tr_r(nimages_scf_desymm))
3119 CALL dbcsr_create(mat_v_tr_r(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_no_symmetry, &
3120 row_bsize, col_bsize)
3121 DEALLOCATE (row_bsize, col_bsize)
3123 DO img = 2, nimages_scf_desymm
3124 CALL dbcsr_create(mat_v_tr_r(img), template=mat_v_tr_r(1))
3128 bs_env%basis_set_RI, pot_type, do_kpoints=.true., &
3129 ext_kpoints=bs_env%kpoints_scf_desymm, &
3130 regularization_ri=regularization_ri)
3132 ALLOCATE (fm_v_tr_r(nimages_scf_desymm))
3133 DO img = 1, nimages_scf_desymm
3134 CALL cp_fm_create(fm_v_tr_r(img), bs_env%fm_RI_RI%matrix_struct)
3139 IF (.NOT.
ALLOCATED(v_tr_r))
THEN
3140 ALLOCATE (v_tr_r(bs_env%n_RI, bs_env%n_RI, nimages_scf_desymm))
3149 CALL timestop(handle)
3162 SUBROUTINE power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
3163 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
3164 REAL(kind=
dp) :: exponent, eps
3165 REAL(kind=
dp),
OPTIONAL :: cond_nr, min_ev, max_ev
3167 CHARACTER(len=*),
PARAMETER :: routinen =
'power'
3169 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenvectors
3170 INTEGER :: handle, i, n
3171 REAL(kind=
dp) :: pos_eval
3172 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
3174 CALL timeset(routinen, handle)
3177 matrix(:, :) = 0.5_dp*(matrix(:, :) + conjg(transpose(matrix(:, :))))
3180 ALLOCATE (eigenvalues(n), eigenvectors(n, n))
3183 IF (
PRESENT(cond_nr)) cond_nr = maxval(abs(eigenvalues))/minval(abs(eigenvalues))
3184 IF (
PRESENT(min_ev)) min_ev = minval(abs(eigenvalues))
3185 IF (
PRESENT(max_ev)) max_ev = maxval(abs(eigenvalues))
3188 IF (eps < eigenvalues(i))
THEN
3189 pos_eval = (eigenvalues(i))**(0.5_dp*exponent)
3193 eigenvectors(:, i) = eigenvectors(:, i)*pos_eval
3196 CALL zgemm(
"N",
"C", n, n, n,
z_one, eigenvectors, n, eigenvectors, n,
z_zero, matrix, n)
3198 DEALLOCATE (eigenvalues, eigenvectors)
3200 CALL timestop(handle)
3202 END SUBROUTINE power
3213 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_n_time, sigma_c_n_freq
3216 CHARACTER(LEN=*),
PARAMETER :: routinen =
'time_to_freq'
3218 INTEGER :: handle, i_t, j_w, n_occ
3219 REAL(kind=
dp) :: freq_j, time_i, w_cos_ij, w_sin_ij
3220 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sigma_c_n_cos_time, sigma_c_n_sin_time
3222 CALL timeset(routinen, handle)
3224 ALLOCATE (sigma_c_n_cos_time(bs_env%n_ao, bs_env%num_time_freq_points))
3225 ALLOCATE (sigma_c_n_sin_time(bs_env%n_ao, bs_env%num_time_freq_points))
3227 sigma_c_n_cos_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) + sigma_c_n_time(:, :, 2))
3228 sigma_c_n_sin_time(:, :) = 0.5_dp*(sigma_c_n_time(:, :, 1) - sigma_c_n_time(:, :, 2))
3230 sigma_c_n_freq(:, :, :) = 0.0_dp
3232 DO i_t = 1, bs_env%num_time_freq_points
3234 DO j_w = 1, bs_env%num_time_freq_points
3236 freq_j = bs_env%imag_freq_points(j_w)
3237 time_i = bs_env%imag_time_points(i_t)
3239 w_cos_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(freq_j*time_i)
3240 w_sin_ij = bs_env%weights_sin_t_to_w(j_w, i_t)*sin(freq_j*time_i)
3243 sigma_c_n_freq(:, j_w, 1) = sigma_c_n_freq(:, j_w, 1) + &
3244 w_cos_ij*sigma_c_n_cos_time(:, i_t)
3247 sigma_c_n_freq(:, j_w, 2) = sigma_c_n_freq(:, j_w, 2) + &
3248 w_sin_ij*sigma_c_n_sin_time(:, i_t)
3257 n_occ = bs_env%n_occ(ispin)
3258 sigma_c_n_freq(1:n_occ, :, 2) = -sigma_c_n_freq(1:n_occ, :, 2)
3260 CALL timestop(handle)
3275 eigenval_scf, ikp, ispin)
3278 REAL(kind=
dp),
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq
3279 REAL(kind=
dp),
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf
3280 INTEGER :: ikp, ispin
3282 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyt_conti_and_print'
3284 CHARACTER(len=3) :: occ_vir
3285 CHARACTER(len=default_path_length) :: fname
3286 INTEGER :: handle, i_mo, ikp_for_print, iunit, &
3288 LOGICAL :: is_bandstruc_kpoint, print_dos_kpoints, &
3290 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dummy, sigma_c_ikp_n_qp
3292 CALL timeset(routinen, handle)
3295 ALLOCATE (dummy(n_mo), sigma_c_ikp_n_qp(n_mo))
3296 sigma_c_ikp_n_qp(:) = 0.0_dp
3301 IF (
modulo(i_mo, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
3304 bs_env%imag_freq_points_fit, dummy, dummy, &
3305 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 1)*
z_one + &
3306 sigma_c_ikp_n_freq(:, 1:bs_env%num_freq_points_fit, 2)*
gaussi, &
3307 sigma_x_ikp_n(:) - v_xc_ikp_n(:), &
3308 eigenval_scf(:), eigenval_scf(:), &
3309 bs_env%do_hedin_shift, &
3310 i_mo, bs_env%n_occ(ispin), bs_env%n_vir(ispin), &
3311 bs_env%nparam_pade, bs_env%num_freq_points_fit, &
3313 0.0_dp, .true., .false., 1, e_fermi_ext=bs_env%e_fermi(ispin))
3316 CALL bs_env%para_env%sum(sigma_c_ikp_n_qp)
3318 CALL correct_obvious_fitting_fails(sigma_c_ikp_n_qp, ispin, bs_env)
3320 bs_env%eigenval_G0W0(:, ikp, ispin) = eigenval_scf(:) + &
3321 sigma_c_ikp_n_qp(:) + &
3322 sigma_x_ikp_n(:) - &
3325 bs_env%eigenval_HF(:, ikp, ispin) = eigenval_scf(:) + sigma_x_ikp_n(:) - v_xc_ikp_n(:)
3328 print_dos_kpoints = (bs_env%nkp_only_bs <= 0)
3330 is_bandstruc_kpoint = (ikp > bs_env%nkp_only_DOS)
3331 print_ikp = print_dos_kpoints .OR. is_bandstruc_kpoint
3333 IF (bs_env%para_env%is_source() .AND. print_ikp)
THEN
3335 IF (print_dos_kpoints)
THEN
3336 nkp = bs_env%nkp_only_DOS
3339 nkp = bs_env%nkp_only_bs
3340 ikp_for_print = ikp - bs_env%nkp_only_DOS
3343 fname =
"bandstructure_SCF_and_G0W0"
3345 IF (ikp_for_print == 1 .AND. ispin == 1)
THEN
3346 CALL open_file(trim(fname), unit_number=iunit, file_status=
"REPLACE", &
3347 file_action=
"WRITE")
3349 CALL open_file(trim(fname), unit_number=iunit, file_status=
"OLD", &
3350 file_action=
"WRITE", file_position=
"APPEND")
3353 WRITE (iunit,
"(A)")
" "
3354 WRITE (iunit,
"(A10,I7,A25,3F10.4,T90,A7,I2)")
"kpoint: ", ikp_for_print,
"coordinate: ", &
3355 bs_env%kpoints_DOS%xkp(:, ikp),
"spin: ", ispin
3356 WRITE (iunit,
"(A)")
" "
3357 WRITE (iunit,
"(A5,A12,3A17,A16,A18)")
"n",
"k", ϵ
"_nk^DFT (eV)", Σ
"^c_nk (eV)", &
3358 Σ
"^x_nk (eV)",
"v_nk^xc (eV)", ϵ
"_nk^G0W0 (eV)"
3359 WRITE (iunit,
"(A)")
" "
3362 IF (i_mo <= bs_env%n_occ(ispin)) occ_vir =
'occ'
3363 IF (i_mo > bs_env%n_occ(ispin)) occ_vir =
'vir'
3364 WRITE (iunit,
"(I5,3A,I5,4F16.3,F17.3)") i_mo,
' (', occ_vir,
') ', ikp_for_print, &
3365 eigenval_scf(i_mo)*
evolt, &
3366 sigma_c_ikp_n_qp(i_mo)*
evolt, &
3367 sigma_x_ikp_n(i_mo)*
evolt, &
3368 v_xc_ikp_n(i_mo)*
evolt, &
3369 bs_env%eigenval_G0W0(i_mo, ikp, ispin)*
evolt
3372 WRITE (iunit,
"(A)")
" "
3378 CALL timestop(handle)
3388 SUBROUTINE correct_obvious_fitting_fails(Sigma_c_ikp_n_qp, ispin, bs_env)
3389 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_c_ikp_n_qp
3393 CHARACTER(LEN=*),
PARAMETER :: routinen =
'correct_obvious_fitting_fails'
3395 INTEGER :: handle, homo, i_mo, j_mo, &
3396 n_levels_scissor, n_mo
3397 LOGICAL :: is_occ, is_vir
3398 REAL(kind=
dp) :: sum_sigma_c
3400 CALL timeset(routinen, handle)
3403 homo = bs_env%n_occ(ispin)
3408 IF (abs(sigma_c_ikp_n_qp(i_mo)) > 13.0_dp/
evolt)
THEN
3410 is_occ = (i_mo <= homo)
3411 is_vir = (i_mo > homo)
3413 n_levels_scissor = 0
3414 sum_sigma_c = 0.0_dp
3420 IF (is_occ .AND. j_mo > homo) cycle
3421 IF (is_vir .AND. j_mo <= homo) cycle
3422 IF (abs(i_mo - j_mo) > 10) cycle
3423 IF (i_mo == j_mo) cycle
3425 n_levels_scissor = n_levels_scissor + 1
3426 sum_sigma_c = sum_sigma_c + sigma_c_ikp_n_qp(j_mo)
3431 sigma_c_ikp_n_qp(i_mo) = sum_sigma_c/real(n_levels_scissor, kind=
dp)
3437 CALL timestop(handle)
3439 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, ccon)
...
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_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, nrow, ncol, set_zero)
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 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_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 get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
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, ncgf)
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, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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.