110#include "./base/base_uses.f90"
116 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_ri_2c'
160 SUBROUTINE get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, &
161 my_Lrows, my_Vrows, fm_matrix_PQ, ngroup, color_sub, dimen_RI, dimen_RI_red, &
162 kpoints, my_group_L_size, my_group_L_start, my_group_L_end, &
163 gd_array, calc_PQ_cond_num, do_svd, eps_svd, potential, ri_metric, &
164 fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, &
165 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, &
166 do_im_time, do_kpoints, mp2_eps_pgf_orb_S, qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
169 INTEGER,
INTENT(IN) :: eri_method
172 REAL(kind=
dp),
INTENT(IN) :: mp2_memory
173 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
174 INTENT(OUT) :: my_lrows, my_vrows
176 INTEGER,
INTENT(IN) :: ngroup, color_sub
177 INTEGER,
INTENT(OUT) :: dimen_ri, dimen_ri_red
179 INTEGER,
INTENT(OUT) :: my_group_l_size, my_group_l_start, &
182 LOGICAL,
INTENT(IN) :: calc_pq_cond_num, do_svd
183 REAL(kind=
dp),
INTENT(IN) :: eps_svd
185 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
186 fm_matrix_minv_l_kpoints, &
188 fm_matrix_minv_vtrunc_minv
189 LOGICAL,
INTENT(IN) :: do_im_time, do_kpoints
190 REAL(kind=
dp),
INTENT(IN) :: mp2_eps_pgf_orb_s
191 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
193 POINTER :: sab_orb_sub
194 LOGICAL,
INTENT(IN) :: calc_forces
195 INTEGER,
INTENT(IN) :: unit_nr
197 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_2c_integrals'
199 INTEGER :: handle, num_small_eigen
200 REAL(kind=
dp) :: cond_num, eps_pgf_orb_old
201 TYPE(
cp_fm_type) :: fm_matrix_l_work, fm_matrix_m_inv_work, &
207 CALL timeset(routinen, handle)
210 CALL compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_l, mp2_memory, &
211 fm_matrix_l_work, ngroup, color_sub, dimen_ri, &
212 my_group_l_size, my_group_l_start, my_group_l_end, &
213 gd_array, calc_pq_cond_num, cond_num, &
214 num_small_eigen, potential, sab_orb_sub, do_im_time=do_im_time)
216 IF (do_im_time .AND. calc_forces)
THEN
218 CALL cp_fm_create(fm_matrix_pq, fm_matrix_l_work%matrix_struct)
222 dimen_ri_red = dimen_ri
225 CALL decomp_mat_l(fm_matrix_l_work, do_svd, eps_svd, num_small_eigen, cond_num, .true., gd_array, ngroup, &
226 dimen_ri, dimen_ri_red, para_env)
231 CALL get_qs_env(qs_env, dft_control=dft_control)
234 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
235 dft_control%qs_control%eps_pgf_orb = mp2_eps_pgf_orb_s
238 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv_l_kpoints, fm_matrix_l_work, dimen_ri, ri_metric, &
239 do_kpoints, kpoints, put_mat_ks_env=.true., &
240 regularization_ri=qs_env%mp2_env%ri_rpa_im_time%regularization_RI)
243 dft_control%qs_control%eps_pgf_orb = eps_pgf_orb_old
252 ALLOCATE (fm_matrix_minv_l_kpoints(1, 1))
255 CALL compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_l, mp2_memory, &
256 fm_matrix_minv_l_kpoints(1, 1), ngroup, color_sub, dimen_ri, &
257 my_group_l_size, my_group_l_start, my_group_l_end, &
258 gd_array, calc_pq_cond_num, cond_num, &
259 num_small_eigen, ri_metric, sab_orb_sub, &
260 fm_matrix_l_extern=fm_matrix_l_work)
267 CALL compute_v_by_lattice_sum(qs_env, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, kpoints)
270 kpoints, qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S)
275 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv_vtrunc_minv, fm_matrix_l_work, dimen_ri, trunc_coulomb, &
276 do_kpoints=.false., kpoints=kpoints, put_mat_ks_env=.false., regularization_ri=0.0_dp)
279 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv, fm_matrix_l_work, dimen_ri, ri_metric, &
280 do_kpoints=.false., kpoints=kpoints, put_mat_ks_env=.false., regularization_ri=0.0_dp)
282 CALL gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc(fm_matrix_minv_vtrunc_minv, &
283 fm_matrix_minv, qs_env)
285 IF (calc_forces .AND. (.NOT. do_im_time))
THEN
287 CALL cp_fm_create(fm_matrix_v, fm_matrix_l_work%matrix_struct)
290 CALL decomp_mat_l(fm_matrix_v, do_svd, eps_svd, num_small_eigen, cond_num, .true., gd_array, ngroup, &
291 dimen_ri, dimen_ri_red, para_env)
294 CALL decomp_mat_l(fm_matrix_l_work, do_svd, eps_svd, num_small_eigen, cond_num, .false., gd_array, ngroup, &
295 dimen_ri, dimen_ri_red, para_env)
297 CALL decomp_mat_l(fm_matrix_minv_l_kpoints(1, 1), .false., 0.0_dp, num_small_eigen, cond_num, .true., &
298 gd_array, ngroup, dimen_ri, dimen_ri_red, para_env)
300 CALL cp_fm_create(fm_matrix_m_inv_work, fm_matrix_minv_l_kpoints(1, 1)%matrix_struct)
303 CALL parallel_gemm(
'N',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_minv_l_kpoints(1, 1), &
304 fm_matrix_minv_l_kpoints(1, 1), 0.0_dp, fm_matrix_m_inv_work)
308 CALL reset_size_matrix(fm_matrix_minv_l_kpoints(1, 1), dimen_ri_red, fm_matrix_l_work%matrix_struct)
311 CALL parallel_gemm(
'T',
'N', dimen_ri, dimen_ri_red, dimen_ri, 1.0_dp, fm_matrix_m_inv_work, &
312 fm_matrix_l_work, 0.0_dp, fm_matrix_minv_l_kpoints(1, 1))
315 CALL parallel_gemm(
'T',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_m_inv_work, &
316 fm_matrix_l_work, 0.0_dp, fm_matrix_minv_l_kpoints(1, 1))
323 IF (.NOT. do_im_time)
THEN
325 CALL cp_fm_to_fm(fm_matrix_minv_l_kpoints(1, 1), fm_matrix_l_work)
333 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
335 IF (.NOT. do_im_time)
THEN
336 IF (unit_nr > 0)
THEN
337 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)")
"RI_INFO| Cholesky decomposition group size:", para_env_l%num_pe
338 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)")
"RI_INFO| Number of groups for auxiliary basis functions", ngroup
339 IF (calc_pq_cond_num .OR. do_svd)
THEN
340 WRITE (unit=unit_nr, fmt=
"(T3,A,T67,ES14.5)") &
341 "RI_INFO| Condition number of the (P|Q):", cond_num
342 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
343 "RI_INFO| Number of non-positive Eigenvalues of (P|Q):", num_small_eigen
349 CALL grep_lcols(fm_matrix_l_work, my_group_l_start, my_group_l_end, my_group_l_size, my_lrows)
351 qs_env%mp2_env%potential_parameter))
THEN
352 CALL grep_lcols(fm_matrix_v, my_group_l_start, my_group_l_end, my_group_l_size, my_vrows)
357 qs_env%mp2_env%potential_parameter)))
CALL cp_fm_release(fm_matrix_v)
360 CALL timestop(handle)
378 SUBROUTINE decomp_mat_l(fm_matrix_L, do_svd, eps_svd, num_small_eigen, cond_num, do_inversion, gd_array, ngroup, &
379 dimen_RI, dimen_RI_red, para_env)
381 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_matrix_l
382 LOGICAL,
INTENT(IN) :: do_svd
383 REAL(kind=
dp),
INTENT(IN) :: eps_svd
384 INTEGER,
INTENT(INOUT) :: num_small_eigen
385 REAL(kind=
dp),
INTENT(INOUT) :: cond_num
386 LOGICAL,
INTENT(IN) :: do_inversion
388 INTEGER,
INTENT(IN) :: ngroup, dimen_ri
389 INTEGER,
INTENT(INOUT) :: dimen_ri_red
393 CALL matrix_root_with_svd(fm_matrix_l, num_small_eigen, cond_num, eps_svd, do_inversion, para_env)
395 dimen_ri_red = dimen_ri - num_small_eigen
405 CALL cholesky_decomp(fm_matrix_l, dimen_ri, do_inversion=do_inversion)
407 IF (do_inversion)
CALL invert_mat(fm_matrix_l)
410 END SUBROUTINE decomp_mat_l
419 SUBROUTINE compute_v_by_lattice_sum(qs_env, fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, kpoints)
421 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
422 fm_matrix_minv_l_kpoints
425 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_by_lattice_sum'
427 INTEGER :: handle, i_dim, i_real_imag, ikp, nkp, &
429 INTEGER,
DIMENSION(3) :: nkp_grid_orig, periodic
432 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_ri_aux_transl, matrix_v_ri_kp
434 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
436 CALL timeset(routinen, handle)
438 NULLIFY (matrix_s_ri_aux_transl, particle_set, cell, qs_kind_set)
441 matrix_s_ri_aux_kp=matrix_s_ri_aux_transl, &
442 particle_set=particle_set, &
444 qs_kind_set=qs_kind_set, &
445 atomic_kind_set=atomic_kind_set)
448 CALL get_cell(cell=cell, periodic=periodic)
450 IF (periodic(i_dim) == 1)
THEN
451 cpassert(
modulo(kpoints%nkp_grid(i_dim), 2) == 0)
457 ALLOCATE (fm_matrix_l_kpoints(nkp, 2))
458 DO i_real_imag = 1, 2
460 CALL cp_fm_create(fm_matrix_l_kpoints(ikp, i_real_imag), &
461 fm_matrix_minv_l_kpoints(1, i_real_imag)%matrix_struct)
462 CALL cp_fm_set_all(fm_matrix_l_kpoints(ikp, i_real_imag), 0.0_dp)
466 CALL allocate_matrix_v_ri_kp(matrix_v_ri_kp, matrix_s_ri_aux_transl, nkp)
468 IF (qs_env%mp2_env%ri_rpa_im_time%do_extrapolate_kpoints)
THEN
470 nkp_orig = qs_env%mp2_env%ri_rpa_im_time%nkp_orig
471 nkp_extra = qs_env%mp2_env%ri_rpa_im_time%nkp_extra
474 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
475 atomic_kind_set=atomic_kind_set, &
476 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
479 nkp_grid_orig = kpoints%nkp_grid
480 kpoints%nkp_grid(1:3) = qs_env%mp2_env%ri_rpa_im_time%kp_grid_extra(1:3)
483 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
484 atomic_kind_set=atomic_kind_set, &
485 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
488 kpoints%nkp_grid = nkp_grid_orig
493 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
494 atomic_kind_set=atomic_kind_set, &
495 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
502 CALL copy_dbcsr_to_fm(matrix_v_ri_kp(ikp, 1)%matrix, fm_matrix_l_kpoints(ikp, 1))
503 CALL copy_dbcsr_to_fm(matrix_v_ri_kp(ikp, 2)%matrix, fm_matrix_l_kpoints(ikp, 2))
509 CALL timestop(handle)
511 END SUBROUTINE compute_v_by_lattice_sum
519 SUBROUTINE allocate_matrix_v_ri_kp(matrix_v_RI_kp, matrix_s_RI_aux_transl, nkp)
521 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_ri_kp, matrix_s_ri_aux_transl
526 NULLIFY (matrix_v_ri_kp)
531 ALLOCATE (matrix_v_ri_kp(ikp, 1)%matrix)
532 CALL dbcsr_create(matrix_v_ri_kp(ikp, 1)%matrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
533 matrix_type=dbcsr_type_no_symmetry)
535 CALL dbcsr_set(matrix_v_ri_kp(ikp, 1)%matrix, 0.0_dp)
537 ALLOCATE (matrix_v_ri_kp(ikp, 2)%matrix)
538 CALL dbcsr_create(matrix_v_ri_kp(ikp, 2)%matrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
539 matrix_type=dbcsr_type_no_symmetry)
541 CALL dbcsr_set(matrix_v_ri_kp(ikp, 2)%matrix, 0.0_dp)
545 END SUBROUTINE allocate_matrix_v_ri_kp
562 do_kpoints, kpoints, put_mat_KS_env, regularization_RI, ikp_ext, &
566 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_minv_l_kpoints
568 INTEGER,
INTENT(IN) :: dimen_ri
570 LOGICAL,
INTENT(IN) :: do_kpoints
572 LOGICAL,
OPTIONAL :: put_mat_ks_env
573 REAL(kind=
dp),
OPTIONAL :: regularization_ri
574 INTEGER,
OPTIONAL :: ikp_ext
575 LOGICAL,
OPTIONAL :: do_build_cell_index
577 CHARACTER(LEN=*),
PARAMETER :: routinen =
'RI_2c_integral_mat'
579 INTEGER :: handle, i_real_imag, i_size, ikp, &
580 ikp_for_xkp, img, n_real_imag, natom, &
582 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
583 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
584 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
585 LOGICAL :: my_do_build_cell_index, my_put_mat_ks_env
586 REAL(kind=
dp) :: my_regularization_ri
587 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
592 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_ri_aux_transl
593 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_2c
594 TYPE(
dbcsr_type),
POINTER :: cmatrix, matrix_s_ri_aux_desymm, &
603 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
605 CALL timeset(routinen, handle)
607 NULLIFY (sab_ri, matrix_s_ri_aux_transl, dist_2d)
609 IF (
PRESENT(regularization_ri))
THEN
610 my_regularization_ri = regularization_ri
612 my_regularization_ri = 0.0_dp
615 IF (
PRESENT(put_mat_ks_env))
THEN
616 my_put_mat_ks_env = put_mat_ks_env
618 my_put_mat_ks_env = .false.
621 IF (
PRESENT(do_build_cell_index))
THEN
622 my_do_build_cell_index = do_build_cell_index
624 my_do_build_cell_index = .false.
629 blacs_env=blacs_env, &
631 distribution_2d=dist_2d, &
632 qs_kind_set=qs_kind_set, &
633 particle_set=particle_set, &
634 dft_control=dft_control, &
637 ALLOCATE (sizes_ri(natom))
638 ALLOCATE (basis_set_ri(nkind))
641 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri)
644 sym_ij=.true., dist_2d=dist_2d)
647 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
648 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
649 row_bsize(:) = sizes_ri
650 col_bsize(:) = sizes_ri
653 cpassert(
PRESENT(kpoints))
654 IF (my_do_build_cell_index)
THEN
658 cell_to_index=cell_to_index)
660 nimg = dft_control%nimages
667 ALLOCATE (mat_2c(nimg))
668 CALL dbcsr_create(mat_2c(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_symmetric, &
669 row_bsize, col_bsize)
670 DEALLOCATE (row_bsize, col_bsize)
677 ri_metric, do_kpoints=do_kpoints, ext_kpoints=kpoints, &
678 regularization_ri=my_regularization_ri)
681 DEALLOCATE (basis_set_ri)
683 IF (my_put_mat_ks_env)
THEN
684 CALL get_ks_env(qs_env%ks_env, matrix_s_ri_aux_kp=matrix_s_ri_aux_transl)
689 ALLOCATE (matrix_s_ri_aux_transl(1, img)%matrix)
690 CALL dbcsr_copy(matrix_s_ri_aux_transl(1, img)%matrix, mat_2c(img))
694 IF (my_put_mat_ks_env)
THEN
695 CALL set_ks_env(qs_env%ks_env, matrix_s_ri_aux_kp=matrix_s_ri_aux_transl)
698 IF (
PRESENT(ikp_ext)) nkp = 1
700 ALLOCATE (fm_matrix_minv_l_kpoints(nkp, n_real_imag))
701 DO i_real_imag = 1, n_real_imag
703 CALL cp_fm_create(fm_matrix_minv_l_kpoints(i_size, i_real_imag), fm_matrix_l%matrix_struct)
704 CALL cp_fm_set_all(fm_matrix_minv_l_kpoints(i_size, i_real_imag), 0.0_dp)
710 ncol_global=dimen_ri, para_env=para_env)
717 ALLOCATE (rmatrix, cmatrix, tmpmat)
718 CALL dbcsr_create(rmatrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
719 matrix_type=dbcsr_type_symmetric)
720 CALL dbcsr_create(cmatrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
721 matrix_type=dbcsr_type_antisymmetric)
722 CALL dbcsr_create(tmpmat, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
723 matrix_type=dbcsr_type_no_symmetry)
733 IF (
PRESENT(ikp_ext))
THEN
734 ikp_for_xkp = ikp_ext
739 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_s_ri_aux_transl, ispin=1, &
740 xkp=xkp(1:3, ikp_for_xkp), cell_to_index=cell_to_index, sab_nl=sab_ri)
747 CALL cp_fm_copy_general(fm_matrix_s_global, fm_matrix_minv_l_kpoints(ikp, 1), para_env)
754 CALL cp_fm_copy_general(fm_matrix_s_global, fm_matrix_minv_l_kpoints(ikp, 2), para_env)
764 NULLIFY (matrix_s_ri_aux_desymm)
765 ALLOCATE (matrix_s_ri_aux_desymm)
766 CALL dbcsr_create(matrix_s_ri_aux_desymm, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
767 name=
'S_RI non_symm', matrix_type=dbcsr_type_no_symmetry)
785 IF (.NOT. my_put_mat_ks_env)
THEN
789 CALL timestop(handle)
818 SUBROUTINE compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_L, mp2_memory, &
819 fm_matrix_L, ngroup, color_sub, dimen_RI, &
820 my_group_L_size, my_group_L_start, my_group_L_end, &
821 gd_array, calc_PQ_cond_num, cond_num, num_small_eigen, potential, &
822 sab_orb_sub, do_im_time, fm_matrix_L_extern)
825 INTEGER,
INTENT(IN) :: eri_method
830 REAL(kind=
dp),
INTENT(IN) :: mp2_memory
832 INTEGER,
INTENT(IN) :: ngroup, color_sub
833 INTEGER,
INTENT(OUT) :: dimen_ri, my_group_l_size, &
834 my_group_l_start, my_group_l_end
836 LOGICAL,
INTENT(IN) :: calc_pq_cond_num
837 REAL(kind=
dp),
INTENT(OUT) :: cond_num
838 INTEGER,
INTENT(OUT) :: num_small_eigen
841 POINTER :: sab_orb_sub
842 LOGICAL,
INTENT(IN),
OPTIONAL :: do_im_time
843 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: fm_matrix_l_extern
845 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_2c_integrals'
847 INTEGER :: best_group_size, color_l, group_size, handle, handle2, i_global, iatom, iib, &
848 ikind, iproc, j_global, jjb, natom, ncol_local, nkind, nrow_local, nsgf, potential_type, &
849 proc_receive, proc_receive_static, proc_send_static, proc_shift, rec_l_end, rec_l_size, &
850 rec_l_start, strat_group_size
851 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
852 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
853 LOGICAL :: my_do_im_time
854 REAL(kind=
dp) :: min_mem_for_qk
855 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: egen_l
856 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: l_external_col, l_local_col
863 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
865 CALL timeset(routinen, handle)
867 my_do_im_time = .false.
868 IF (
PRESENT(do_im_time))
THEN
869 my_do_im_time = do_im_time
873 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
874 particle_set=particle_set)
876 nkind =
SIZE(qs_kind_set)
877 natom =
SIZE(particle_set)
882 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, basis_type=
"RI_AUX")
883 cpassert(
ASSOCIATED(basis_set_a))
888 ikind = kind_of(iatom)
889 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
890 dimen_ri = dimen_ri + nsgf
894 IF (dimen_ri < ngroup)
THEN
895 CALL cp_abort(__location__,
"Product of block size and number "// &
896 "of RI functions should not exceed total number of processes")
901 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
903 CALL timeset(routinen//
"_loop_lm", handle2)
905 ALLOCATE (l_local_col(dimen_ri, my_group_l_size))
908 potential_type = potential%potential_type
915 basis_type_a=
"RI_AUX", basis_type_b=
"RI_AUX", &
916 hab=l_local_col, first_b=my_group_l_start, last_b=my_group_l_end, &
917 eri_method=eri_method)
924 natom, potential, sab_orb_sub, l_local_col, kind_of)
927 cpabort(
"unknown ERI method")
930 CALL timestop(handle2)
934 best_group_size = para_env%num_pe
936 strat_group_size = max(1, para_env%num_pe/10)
938 min_mem_for_qk = real(dimen_ri, kind=
dp)*dimen_ri*3.0_dp*8.0_dp/1024_dp/1024_dp
940 group_size = strat_group_size - 1
941 DO iproc = strat_group_size, para_env%num_pe
942 group_size = group_size + 1
945 IF (mod(para_env%num_pe, group_size) /= 0 .OR. mod(group_size, para_env_sub%num_pe) /= 0) cycle
948 IF (real(group_size, kind=
dp)*mp2_memory < min_mem_for_qk) cycle
950 best_group_size = group_size
954 IF (my_do_im_time)
THEN
956 best_group_size = para_env%num_pe
960 color_l = para_env%mepos/best_group_size
961 ALLOCATE (para_env_l)
962 CALL para_env_l%from_split(para_env, color_l)
965 NULLIFY (blacs_env_l)
969 CALL create_matrix_l(fm_matrix_l, blacs_env_l, dimen_ri, para_env_l,
"fm_matrix_L", fm_matrix_l_extern)
971 IF (my_do_im_time .AND. para_env%num_pe > 1)
THEN
973 CALL fill_fm_l_from_l_loc_non_blocking(fm_matrix_l, l_local_col, para_env, &
974 my_group_l_start, my_group_l_end, &
981 CALL comm_exchange%from_split(para_env_l, para_env_sub%mepos)
984 my_group_l_end, my_group_l_size, comm_exchange)
987 nrow_local=nrow_local, &
988 ncol_local=ncol_local, &
989 row_indices=row_indices, &
990 col_indices=col_indices)
992 DO jjb = 1, ncol_local
993 j_global = col_indices(jjb)
994 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
995 DO iib = 1, nrow_local
996 i_global = row_indices(iib)
997 fm_matrix_l%local_data(iib, jjb) = l_local_col(i_global, j_global - my_group_l_start + 1)
1002 proc_send_static =
modulo(comm_exchange%mepos + 1, comm_exchange%num_pe)
1003 proc_receive_static =
modulo(comm_exchange%mepos - 1, comm_exchange%num_pe)
1005 DO proc_shift = 1, comm_exchange%num_pe - 1
1006 proc_receive =
modulo(comm_exchange%mepos - proc_shift, comm_exchange%num_pe)
1008 CALL get_group_dist(gd_sub_array, proc_receive, rec_l_start, rec_l_end, rec_l_size)
1010 ALLOCATE (l_external_col(dimen_ri, rec_l_size))
1011 l_external_col = 0.0_dp
1013 CALL comm_exchange%sendrecv(l_local_col, proc_send_static, l_external_col, proc_receive_static)
1015 DO jjb = 1, ncol_local
1016 j_global = col_indices(jjb)
1017 IF (j_global >= rec_l_start .AND. j_global <= rec_l_end)
THEN
1018 DO iib = 1, nrow_local
1019 i_global = row_indices(iib)
1020 fm_matrix_l%local_data(iib, jjb) = l_external_col(i_global, j_global - rec_l_start + 1)
1025 CALL move_alloc(l_external_col, l_local_col)
1029 CALL comm_exchange%free()
1033 DEALLOCATE (l_local_col)
1038 comm_exchange = fm_matrix_l%matrix_struct%context%interconnect(para_env)
1039 CALL comm_exchange%sum(fm_matrix_l%local_data)
1040 CALL comm_exchange%free()
1045 IF (calc_pq_cond_num)
THEN
1049 CALL create_matrix_l(fm_matrix_l_diag, blacs_env_l, dimen_ri, para_env_l,
"fm_matrix_L_diag", fm_matrix_l_extern)
1051 CALL cp_fm_to_fm(source=fm_matrix_l, destination=fm_matrix_l_diag)
1053 ALLOCATE (egen_l(dimen_ri))
1056 CALL cp_fm_syevx(matrix=fm_matrix_l_diag, eigenvalues=egen_l)
1059 DO iib = 1, dimen_ri
1060 IF (abs(egen_l(iib)) < 0.001_dp) num_small_eigen = num_small_eigen + 1
1063 cond_num = maxval(abs(egen_l))/minval(abs(egen_l))
1065 CALL cp_fm_release(fm_matrix_l_diag)
1071 CALL cp_blacs_env_release(blacs_env_l)
1073 CALL timestop(handle)
1075 END SUBROUTINE compute_2c_integrals
1086 SUBROUTINE matrix_root_with_svd(matrix, num_small_evals, cond_num, eps_svd, do_inversion, para_env)
1087 TYPE(cp_fm_type),
INTENT(INOUT) :: matrix
1088 INTEGER,
INTENT(OUT) :: num_small_evals
1089 REAL(kind=dp),
INTENT(OUT) :: cond_num
1090 REAL(kind=dp),
INTENT(IN) :: eps_svd
1091 LOGICAL,
INTENT(IN) :: do_inversion
1092 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1094 CHARACTER(LEN=*),
PARAMETER :: routinen =
'matrix_root_with_svd'
1096 INTEGER :: group_size_l, handle, ii, needed_evals, &
1098 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num_eval
1099 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: evals
1100 TYPE(cp_fm_type) :: evecs
1101 TYPE(mp_comm_type) :: comm_exchange
1103 CALL timeset(routinen, handle)
1106 CALL cp_fm_get_info(matrix=matrix, nrow_global=nrow)
1108 ALLOCATE (evals(nrow))
1111 CALL cp_fm_create(evecs, matrix%matrix_struct)
1114 CALL choose_eigv_solver(matrix, evecs, evals)
1119 IF (evals(ii) > eps_svd)
THEN
1120 num_small_evals = ii - 1
1124 needed_evals = nrow - num_small_evals
1127 cond_num = evals(nrow)/evals(num_small_evals + 1)
1130 evals(1:num_small_evals) = 0.0_dp
1131 IF (do_inversion)
THEN
1132 evals(num_small_evals + 1:nrow) = 1.0_dp/sqrt(evals(num_small_evals + 1:nrow))
1134 evals(num_small_evals + 1:nrow) = sqrt(evals(num_small_evals + 1:nrow))
1137 CALL cp_fm_column_scale(evecs, evals)
1143 group_size_l = para_env%num_pe/matrix%matrix_struct%para_env%num_pe
1144 comm_exchange = matrix%matrix_struct%context%interconnect(para_env)
1146 ALLOCATE (num_eval(0:group_size_l - 1))
1147 CALL comm_exchange%allgather(num_small_evals, num_eval)
1149 num_small_evals = minval(num_eval)
1151 IF (num_small_evals /= maxval(num_eval))
THEN
1153 pos_max = maxloc(num_eval)
1154 num_small_evals = num_eval(pos_max(1))
1155 needed_evals = nrow - num_small_evals
1158 CALL comm_exchange%bcast(evecs%local_data, pos_max(1))
1159 CALL comm_exchange%bcast(cond_num, pos_max(1))
1162 DEALLOCATE (num_eval)
1164 CALL comm_exchange%free()
1166 CALL reset_size_matrix(matrix, needed_evals, matrix%matrix_struct)
1169 CALL cp_fm_to_fm(evecs, matrix, needed_evals, num_small_evals + 1)
1171 CALL cp_fm_release(evecs)
1173 CALL timestop(handle)
1175 END SUBROUTINE matrix_root_with_svd
1183 SUBROUTINE reset_size_matrix(matrix, new_size, fm_struct_template)
1184 TYPE(cp_fm_type),
INTENT(INOUT) :: matrix
1185 INTEGER,
INTENT(IN) :: new_size
1186 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_template
1188 CHARACTER(LEN=*),
PARAMETER :: routinen =
'reset_size_matrix'
1191 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
1193 CALL timeset(routinen, handle)
1197 CALL cp_fm_struct_create(fm_struct, ncol_global=new_size, template_fmstruct=fm_struct_template, force_block=.true.)
1199 CALL cp_fm_release(matrix)
1201 CALL cp_fm_create(matrix, fm_struct)
1202 CALL cp_fm_set_all(matrix, 0.0_dp)
1204 CALL cp_fm_struct_release(fm_struct)
1206 CALL timestop(handle)
1208 END SUBROUTINE reset_size_matrix
1219 SUBROUTINE fill_fm_l_from_l_loc_non_blocking(fm_matrix_L, L_local_col, para_env, my_group_L_start, &
1220 my_group_L_end, dimen_RI)
1221 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1222 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :), &
1223 INTENT(IN) :: l_local_col
1224 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1225 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, &
1228 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fill_fm_L_from_L_loc_non_blocking'
1230 INTEGER :: dummy_proc, handle, handle2, i_entry_rec, i_row, iproc, j_col, lll, mmm, &
1231 ncol_local, nrow_local, proc_send, send_pcol, send_prow
1232 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: entry_counter, num_entries_rec, &
1234 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1235 TYPE(integ_mat_buffer_type),
ALLOCATABLE, &
1236 DIMENSION(:) :: buffer_rec, buffer_send
1237 TYPE(mp_request_type),
DIMENSION(:, :),
POINTER :: req_array
1239 CALL timeset(routinen, handle)
1241 CALL timeset(routinen//
"_1", handle2)
1244 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1245 nrow_local=nrow_local, &
1246 ncol_local=ncol_local, &
1247 row_indices=row_indices, &
1248 col_indices=col_indices)
1250 ALLOCATE (num_entries_rec(0:para_env%num_pe - 1))
1251 ALLOCATE (num_entries_send(0:para_env%num_pe - 1))
1253 num_entries_rec(:) = 0
1254 num_entries_send(:) = 0
1259 DO lll = 1, dimen_ri
1261 send_prow = fm_matrix_l%matrix_struct%g2p_row(lll)
1263 DO mmm = my_group_l_start, my_group_l_end
1265 send_pcol = fm_matrix_l%matrix_struct%g2p_col(mmm)
1267 proc_send = fm_matrix_l%matrix_struct%context%blacs2mpi(send_prow, send_pcol)
1269 num_entries_send(proc_send) = num_entries_send(proc_send) + 1
1275 CALL timestop(handle2)
1277 CALL timeset(routinen//
"_2", handle2)
1279 CALL para_env%alltoall(num_entries_send, num_entries_rec, 1)
1281 CALL timestop(handle2)
1283 CALL timeset(routinen//
"_3", handle2)
1286 ALLOCATE (buffer_rec(0:para_env%num_pe - 1))
1287 ALLOCATE (buffer_send(0:para_env%num_pe - 1))
1290 DO iproc = 0, para_env%num_pe - 1
1292 ALLOCATE (buffer_rec(iproc)%msg(num_entries_rec(iproc)))
1293 buffer_rec(iproc)%msg = 0.0_dp
1297 CALL timestop(handle2)
1299 CALL timeset(routinen//
"_4", handle2)
1301 DO iproc = 0, para_env%num_pe - 1
1303 ALLOCATE (buffer_send(iproc)%msg(num_entries_send(iproc)))
1304 buffer_send(iproc)%msg = 0.0_dp
1308 CALL timestop(handle2)
1310 CALL timeset(routinen//
"_5", handle2)
1312 DO iproc = 0, para_env%num_pe - 1
1314 ALLOCATE (buffer_rec(iproc)%indx(num_entries_rec(iproc), 2))
1315 buffer_rec(iproc)%indx = 0
1319 CALL timestop(handle2)
1321 CALL timeset(routinen//
"_6", handle2)
1323 DO iproc = 0, para_env%num_pe - 1
1325 ALLOCATE (buffer_send(iproc)%indx(num_entries_send(iproc), 2))
1326 buffer_send(iproc)%indx = 0
1330 CALL timestop(handle2)
1332 CALL timeset(routinen//
"_7", handle2)
1334 ALLOCATE (entry_counter(0:para_env%num_pe - 1))
1335 entry_counter(:) = 0
1339 DO mmm = my_group_l_start, my_group_l_end
1341 send_pcol = fm_matrix_l%matrix_struct%g2p_col(mmm)
1343 DO lll = 1, dimen_ri
1345 send_prow = fm_matrix_l%matrix_struct%g2p_row(lll)
1347 proc_send = fm_matrix_l%matrix_struct%context%blacs2mpi(send_prow, send_pcol)
1349 entry_counter(proc_send) = entry_counter(proc_send) + 1
1351 buffer_send(proc_send)%msg(entry_counter(proc_send)) = &
1352 l_local_col(lll, mmm - my_group_l_start + 1)
1354 buffer_send(proc_send)%indx(entry_counter(proc_send), 1) = lll
1355 buffer_send(proc_send)%indx(entry_counter(proc_send), 2) = mmm
1361 ALLOCATE (req_array(1:para_env%num_pe, 4))
1363 CALL timestop(handle2)
1365 CALL timeset(routinen//
"_8", handle2)
1368 CALL communicate_buffer(para_env, num_entries_rec, num_entries_send, buffer_rec, &
1369 buffer_send, req_array)
1371 fm_matrix_l%local_data = 0.0_dp
1373 CALL timestop(handle2)
1375 CALL timeset(routinen//
"_9", handle2)
1378 DO iproc = 0, para_env%num_pe - 1
1379 DO i_entry_rec = 1, num_entries_rec(iproc)
1380 DO j_col = 1, ncol_local
1381 IF (col_indices(j_col) == buffer_rec(iproc)%indx(i_entry_rec, 2))
THEN
1382 DO i_row = 1, nrow_local
1383 IF (row_indices(i_row) == buffer_rec(iproc)%indx(i_entry_rec, 1))
THEN
1384 fm_matrix_l%local_data(i_row, j_col) = buffer_rec(iproc)%msg(i_entry_rec)
1392 CALL timestop(handle2)
1394 CALL timeset(routinen//
"_10", handle2)
1396 DO iproc = 0, para_env%num_pe - 1
1397 DEALLOCATE (buffer_rec(iproc)%msg)
1398 DEALLOCATE (buffer_rec(iproc)%indx)
1399 DEALLOCATE (buffer_send(iproc)%msg)
1400 DEALLOCATE (buffer_send(iproc)%indx)
1403 DEALLOCATE (buffer_rec, buffer_send)
1404 DEALLOCATE (req_array)
1405 DEALLOCATE (entry_counter)
1406 DEALLOCATE (num_entries_rec, num_entries_send)
1408 CALL timestop(handle2)
1410 CALL timestop(handle)
1412 END SUBROUTINE fill_fm_l_from_l_loc_non_blocking
1420 SUBROUTINE cholesky_decomp(fm_matrix_L, dimen_RI, do_inversion)
1422 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1423 INTEGER,
INTENT(IN) :: dimen_ri
1424 LOGICAL,
INTENT(IN) :: do_inversion
1426 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cholesky_decomp'
1428 INTEGER :: handle, i_global, iib, info_chol, &
1429 j_global, jjb, ncol_local, nrow_local
1430 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1432 CALL timeset(routinen, handle)
1435 CALL cp_fm_cholesky_decompose(matrix=fm_matrix_l, n=dimen_ri, info_out=info_chol)
1436 cpassert(info_chol == 0)
1438 IF (.NOT. do_inversion)
THEN
1440 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1441 nrow_local=nrow_local, &
1442 ncol_local=ncol_local, &
1443 row_indices=row_indices, &
1444 col_indices=col_indices)
1445 DO jjb = 1, ncol_local
1446 j_global = col_indices(jjb)
1447 DO iib = 1, nrow_local
1448 i_global = row_indices(iib)
1449 IF (j_global < i_global) fm_matrix_l%local_data(iib, jjb) = 0.0_dp
1455 CALL timestop(handle)
1457 END SUBROUTINE cholesky_decomp
1468 dimen_RI, kpoints, eps_eigval_S)
1470 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: fm_matrix_minv_l_kpoints, &
1472 INTEGER,
INTENT(IN) :: dimen_ri
1473 TYPE(kpoint_type),
POINTER :: kpoints
1474 REAL(kind=dp),
INTENT(IN) :: eps_eigval_s
1476 CHARACTER(LEN=*),
PARAMETER :: routinen =
'inversion_of_M_and_mult_with_chol_dec_of_V'
1478 INTEGER :: handle, ikp, nkp
1479 TYPE(cp_cfm_type) :: cfm_matrix_k_tmp, cfm_matrix_m_tmp, &
1480 cfm_matrix_v_tmp, cfm_matrix_vtrunc_tmp
1481 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
1483 CALL timeset(routinen, handle)
1485 CALL cp_fm_get_info(fm_matrix_minv_l_kpoints(1, 1), matrix_struct=matrix_struct)
1487 CALL cp_cfm_create(cfm_matrix_m_tmp, matrix_struct)
1488 CALL cp_cfm_create(cfm_matrix_v_tmp, matrix_struct)
1489 CALL cp_cfm_create(cfm_matrix_k_tmp, matrix_struct)
1490 CALL cp_cfm_create(cfm_matrix_vtrunc_tmp, matrix_struct)
1492 CALL get_kpoint_info(kpoints, nkp=nkp)
1496 CALL cp_cfm_scale_and_add_fm(z_zero, cfm_matrix_m_tmp, z_one, fm_matrix_minv_l_kpoints(ikp, 1))
1497 CALL cp_cfm_scale_and_add_fm(z_one, cfm_matrix_m_tmp, gaussi, fm_matrix_minv_l_kpoints(ikp, 2))
1499 CALL cp_cfm_scale_and_add_fm(z_zero, cfm_matrix_v_tmp, z_one, fm_matrix_l_kpoints(ikp, 1))
1500 CALL cp_cfm_scale_and_add_fm(z_one, cfm_matrix_v_tmp, gaussi, fm_matrix_l_kpoints(ikp, 2))
1502 CALL cp_cfm_power(cfm_matrix_m_tmp, threshold=eps_eigval_s, exponent=-1.0_dp)
1504 CALL cp_cfm_power(cfm_matrix_v_tmp, threshold=0.0_dp, exponent=0.5_dp)
1507 CALL cp_cfm_to_fm(cfm_matrix_v_tmp, fm_matrix_l_kpoints(ikp, 1), fm_matrix_l_kpoints(ikp, 2))
1510 CALL parallel_gemm(
"N",
"C", dimen_ri, dimen_ri, dimen_ri, z_one, cfm_matrix_m_tmp, cfm_matrix_v_tmp, &
1511 z_zero, cfm_matrix_k_tmp)
1514 CALL cp_cfm_to_fm(cfm_matrix_k_tmp, fm_matrix_minv_l_kpoints(ikp, 1), fm_matrix_minv_l_kpoints(ikp, 2))
1518 CALL cp_cfm_release(cfm_matrix_m_tmp)
1519 CALL cp_cfm_release(cfm_matrix_v_tmp)
1520 CALL cp_cfm_release(cfm_matrix_k_tmp)
1521 CALL cp_cfm_release(cfm_matrix_vtrunc_tmp)
1523 CALL timestop(handle)
1533 SUBROUTINE gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc(fm_matrix_Minv_Vtrunc_Minv, &
1534 fm_matrix_Minv, qs_env)
1536 TYPE(cp_fm_type),
DIMENSION(:, :) :: fm_matrix_minv_vtrunc_minv, &
1538 TYPE(qs_environment_type),
POINTER :: qs_env
1540 CHARACTER(LEN=*),
PARAMETER :: &
1541 routinen =
'Gamma_only_inversion_of_M_and_mult_with_chol_dec_of_Vtrunc'
1543 INTEGER :: dimen_ri, handle, ndep
1544 REAL(kind=dp) :: eps_eigval_s_gamma
1545 TYPE(cp_fm_type) :: fm_matrix_ri_metric_inv_work, fm_work
1547 CALL timeset(routinen, handle)
1549 CALL cp_fm_create(fm_work, fm_matrix_minv(1, 1)%matrix_struct)
1550 CALL cp_fm_set_all(fm_work, 0.0_dp)
1552 CALL cp_fm_create(fm_matrix_ri_metric_inv_work, fm_matrix_minv(1, 1)%matrix_struct)
1553 CALL cp_fm_set_all(fm_matrix_ri_metric_inv_work, 0.0_dp)
1555 CALL cp_fm_get_info(matrix=fm_matrix_minv(1, 1), nrow_global=dimen_ri)
1557 eps_eigval_s_gamma = qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S_Gamma
1559 IF (eps_eigval_s_gamma > 1.0e-18)
THEN
1562 CALL cp_fm_power(fm_matrix_minv(1, 1), fm_matrix_ri_metric_inv_work, -0.5_dp, &
1563 eps_eigval_s_gamma, ndep)
1567 CALL cholesky_decomp(fm_matrix_minv(1, 1), dimen_ri, do_inversion=.true.)
1569 CALL invert_mat(fm_matrix_minv(1, 1))
1573 CALL parallel_gemm(
'N',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_minv(1, 1), &
1574 fm_matrix_minv(1, 1), 0.0_dp, fm_matrix_ri_metric_inv_work)
1576 CALL cp_fm_to_fm(fm_matrix_ri_metric_inv_work, fm_matrix_minv(1, 1))
1578 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_ri_metric_inv_work, &
1579 fm_matrix_minv_vtrunc_minv(1, 1), 0.0_dp, fm_work)
1581 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work, &
1582 fm_matrix_ri_metric_inv_work, 0.0_dp, fm_matrix_minv_vtrunc_minv(1, 1))
1584 CALL cp_fm_release(fm_work)
1585 CALL cp_fm_release(fm_matrix_ri_metric_inv_work)
1587 CALL timestop(handle)
1589 END SUBROUTINE gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc
1600 cell_grid, do_BvK_cell)
1601 TYPE(qs_environment_type),
POINTER :: qs_env
1602 TYPE(libint_potential_type),
OPTIONAL :: trunc_coulomb
1603 REAL(kind=dp),
OPTIONAL :: rel_cutoff_trunc_coulomb_ri_x
1604 INTEGER,
DIMENSION(3),
OPTIONAL :: cell_grid
1605 LOGICAL,
OPTIONAL :: do_bvk_cell
1607 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trunc_coulomb_for_exchange'
1609 INTEGER :: handle, i_dim
1610 INTEGER,
DIMENSION(3) :: periodic
1611 LOGICAL :: my_do_bvk_cell
1612 REAL(kind=dp) :: kp_fac, kp_fac_idim, my_rel_cutoff_trunc_coulomb_ri_x, &
1613 shortest_dist_cell_planes
1614 TYPE(cell_type),
POINTER :: cell
1615 TYPE(kpoint_type),
POINTER :: kpoints_scf
1617 CALL timeset(routinen, handle)
1620 CALL get_qs_env(qs_env, cell=cell, kpoints=kpoints_scf)
1621 CALL get_cell(cell=cell, periodic=periodic)
1623 my_do_bvk_cell = .false.
1624 IF (
PRESENT(do_bvk_cell)) my_do_bvk_cell = do_bvk_cell
1625 IF (my_do_bvk_cell)
THEN
1629 IF (periodic(i_dim) == 1)
THEN
1630 IF (
PRESENT(cell_grid))
THEN
1631 kp_fac_idim = real(cell_grid(i_dim), kind=dp)
1633 kp_fac_idim = real(kpoints_scf%nkp_grid(i_dim), kind=dp)
1635 IF (kp_fac > kp_fac_idim) kp_fac = kp_fac_idim
1642 shortest_dist_cell_planes = 1.0e4_dp
1643 IF (periodic(1) == 1)
THEN
1644 IF (shortest_dist_cell_planes > plane_distance(1, 0, 0, cell))
THEN
1645 shortest_dist_cell_planes = plane_distance(1, 0, 0, cell)
1648 IF (periodic(2) == 1)
THEN
1649 IF (shortest_dist_cell_planes > plane_distance(0, 1, 0, cell))
THEN
1650 shortest_dist_cell_planes = plane_distance(0, 1, 0, cell)
1653 IF (periodic(3) == 1)
THEN
1654 IF (shortest_dist_cell_planes > plane_distance(0, 0, 1, cell))
THEN
1655 shortest_dist_cell_planes = plane_distance(0, 0, 1, cell)
1659 IF (
PRESENT(rel_cutoff_trunc_coulomb_ri_x))
THEN
1660 my_rel_cutoff_trunc_coulomb_ri_x = rel_cutoff_trunc_coulomb_ri_x
1662 my_rel_cutoff_trunc_coulomb_ri_x = qs_env%mp2_env%ri_rpa_im_time%rel_cutoff_trunc_coulomb_ri_x
1665 IF (
PRESENT(trunc_coulomb))
THEN
1666 trunc_coulomb%potential_type = do_potential_truncated
1667 trunc_coulomb%cutoff_radius = shortest_dist_cell_planes* &
1668 my_rel_cutoff_trunc_coulomb_ri_x* &
1670 trunc_coulomb%filename =
"t_c_g.dat"
1672 trunc_coulomb%omega = 0.0_dp
1675 CALL timestop(handle)
1683 SUBROUTINE invert_mat(fm_matrix_L)
1685 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1687 CHARACTER(LEN=*),
PARAMETER :: routinen =
'invert_mat'
1689 INTEGER :: handle, i_global, iib, j_global, jjb, &
1690 ncol_local, nrow_local
1691 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1693 CALL timeset(routinen, handle)
1695 CALL cp_fm_triangular_invert(matrix_a=fm_matrix_l, uplo_tr=
'U')
1698 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1699 nrow_local=nrow_local, &
1700 ncol_local=ncol_local, &
1701 row_indices=row_indices, &
1702 col_indices=col_indices)
1704 DO jjb = 1, ncol_local
1705 j_global = col_indices(jjb)
1706 DO iib = 1, nrow_local
1707 i_global = row_indices(iib)
1708 IF (j_global < i_global) fm_matrix_l%local_data(iib, jjb) = 0.0_dp
1712 CALL timestop(handle)
1714 END SUBROUTINE invert_mat
1725 SUBROUTINE create_matrix_l(fm_matrix_L, blacs_env_L, dimen_RI, para_env_L, name, fm_matrix_L_extern)
1726 TYPE(cp_fm_type),
INTENT(OUT) :: fm_matrix_l
1727 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_l
1728 INTEGER,
INTENT(IN) :: dimen_ri
1729 TYPE(mp_para_env_type),
POINTER :: para_env_l
1730 CHARACTER(LEN=*),
INTENT(IN) :: name
1731 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: fm_matrix_l_extern
1733 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_matrix_L'
1736 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
1738 CALL timeset(routinen, handle)
1741 IF (
PRESENT(fm_matrix_l_extern))
THEN
1742 CALL cp_fm_create(fm_matrix_l, fm_matrix_l_extern%matrix_struct, name=name)
1745 CALL cp_fm_struct_create(fm_struct, context=blacs_env_l, nrow_global=dimen_ri, &
1746 ncol_global=dimen_ri, para_env=para_env_l)
1748 CALL cp_fm_create(fm_matrix_l, fm_struct, name=name)
1750 CALL cp_fm_struct_release(fm_struct)
1753 CALL cp_fm_set_all(matrix=fm_matrix_l, alpha=0.0_dp)
1755 CALL timestop(handle)
1757 END SUBROUTINE create_matrix_l
1767 SUBROUTINE grep_lcols(fm_matrix_L, &
1768 my_group_L_start, my_group_L_end, my_group_L_size, my_Lrows)
1769 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1770 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, &
1772 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :), &
1773 INTENT(OUT) :: my_lrows
1775 CHARACTER(LEN=*),
PARAMETER :: routinen =
'grep_Lcols'
1777 INTEGER :: dimen_ri, handle, handle2, i_global, iib, j_global, jjb, max_row_col_local, &
1778 ncol_local, ncol_rec, nrow_local, nrow_rec, proc_receive_static, proc_send_static, &
1780 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: local_col_row_info, rec_col_row_info
1781 INTEGER,
DIMENSION(:),
POINTER :: col_indices, col_indices_rec, &
1782 row_indices, row_indices_rec
1783 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: local_l, rec_l
1784 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :), &
1785 POINTER :: local_l_internal
1786 TYPE(mp_para_env_type),
POINTER :: para_env
1788 CALL timeset(routinen, handle)
1790 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1791 nrow_local=nrow_local, &
1792 ncol_local=ncol_local, &
1793 row_indices=row_indices, &
1794 col_indices=col_indices, &
1795 nrow_global=dimen_ri, &
1796 local_data=local_l_internal, &
1799 ALLOCATE (my_lrows(dimen_ri, my_group_l_size))
1802 ALLOCATE (local_l(nrow_local, ncol_local))
1803 local_l(:, :) = local_l_internal(1:nrow_local, 1:ncol_local)
1805 max_row_col_local = max(nrow_local, ncol_local)
1806 CALL para_env%max(max_row_col_local)
1808 ALLOCATE (local_col_row_info(0:max_row_col_local, 2))
1809 local_col_row_info = 0
1811 local_col_row_info(0, 1) = nrow_local
1812 local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
1814 local_col_row_info(0, 2) = ncol_local
1815 local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
1817 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
1820 DO jjb = 1, ncol_local
1821 j_global = col_indices(jjb)
1822 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
1823 DO iib = 1, nrow_local
1824 i_global = row_indices(iib)
1825 my_lrows(i_global, j_global - my_group_l_start + 1) = local_l(iib, jjb)
1830 proc_send_static =
modulo(para_env%mepos + 1, para_env%num_pe)
1831 proc_receive_static =
modulo(para_env%mepos - 1, para_env%num_pe)
1833 CALL timeset(routinen//
"_comm", handle2)
1835 DO proc_shift = 1, para_env%num_pe - 1
1837 rec_col_row_info = 0
1838 CALL para_env%sendrecv(local_col_row_info, proc_send_static, rec_col_row_info, proc_receive_static)
1839 nrow_rec = rec_col_row_info(0, 1)
1840 ncol_rec = rec_col_row_info(0, 2)
1842 ALLOCATE (row_indices_rec(nrow_rec))
1843 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1845 ALLOCATE (col_indices_rec(ncol_rec))
1846 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1848 ALLOCATE (rec_l(nrow_rec, ncol_rec))
1852 CALL para_env%sendrecv(local_l, proc_send_static, rec_l, proc_receive_static)
1855 DO jjb = 1, ncol_rec
1856 j_global = col_indices_rec(jjb)
1857 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
1858 DO iib = 1, nrow_rec
1859 i_global = row_indices_rec(iib)
1860 my_lrows(i_global, j_global - my_group_l_start + 1) = rec_l(iib, jjb)
1865 local_col_row_info(:, :) = rec_col_row_info
1866 CALL move_alloc(rec_l, local_l)
1868 DEALLOCATE (col_indices_rec)
1869 DEALLOCATE (row_indices_rec)
1871 CALL timestop(handle2)
1873 DEALLOCATE (local_col_row_info)
1874 DEALLOCATE (rec_col_row_info)
1875 DEALLOCATE (local_l)
1877 CALL timestop(handle)
1879 END SUBROUTINE grep_lcols
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.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
real(kind=dp) function, public plane_distance(h, k, l, cell)
Calculate the distance between two lattice planes as defined by a triple of Miller indices (hkl).
constants for the different operators of the 2c-integrals
integer, parameter, public operator_coulomb
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
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
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.
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_triangular_invert(matrix_a, uplo_tr)
inverts a triangular matrix
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
subroutine, public cp_fm_syevx(matrix, eigenvectors, eigenvalues, neig, work_syevx)
compute eigenvalues and optionally eigenvectors of a real symmetric matrix using scalapack....
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_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
Types to describe group distributions.
Defines the basic variable types.
integer, parameter, public dp
Routines to compute the Coulomb integral V_(alpha beta)(k) for a k-point k using lattice summation in...
subroutine, public build_2c_coulomb_matrix_kp(matrix_v_kp, kpoints, basis_type, cell, particle_set, qs_kind_set, atomic_kind_set, size_lattice_sum, operator_type, ikp_start, ikp_end)
...
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
pure logical function, public compare_potential_types(potential1, potential2)
Helper function to compare libint_potential_types.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
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
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Routines to calculate 2c- and 3c-integrals for RI with GPW.
subroutine, public mp2_eri_2c_integrate_gpw(qs_env, para_env_sub, my_group_l_start, my_group_l_end, natom, potential_parameter, sab_orb_sub, l_local_col, kind_of)
Integrates the potential of an RI function.
Interface to direct methods for electron repulsion integrals for MP2.
subroutine, public mp2_eri_2c_integrate(param, potential_parameter, para_env, qs_env, basis_type_a, basis_type_b, hab, first_b, last_b, eri_method, pab, force_a, force_b, hdab, hadb, reflection_z_a, reflection_z_b, do_reflection_a, do_reflection_b)
high-level integration routine for 2c integrals over CP2K basis sets. Contiguous column-wise distribu...
Framework for 2c-integrals for RI.
subroutine, public get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, my_lrows, my_vrows, fm_matrix_pq, ngroup, color_sub, dimen_ri, dimen_ri_red, kpoints, my_group_l_size, my_group_l_start, my_group_l_end, gd_array, calc_pq_cond_num, do_svd, eps_svd, potential, ri_metric, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, do_im_time, do_kpoints, mp2_eps_pgf_orb_s, qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
...
subroutine, public trunc_coulomb_for_exchange(qs_env, trunc_coulomb, rel_cutoff_trunc_coulomb_ri_x, cell_grid, do_bvk_cell)
...
subroutine, public inversion_of_m_and_mult_with_chol_dec_of_v(fm_matrix_minv_l_kpoints, fm_matrix_l_kpoints, dimen_ri, kpoints, eps_eigval_s)
...
subroutine, public ri_2c_integral_mat(qs_env, fm_matrix_minv_l_kpoints, fm_matrix_l, dimen_ri, ri_metric, do_kpoints, kpoints, put_mat_ks_env, regularization_ri, ikp_ext, do_build_cell_index)
...
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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(qs_control, qs_kind_set)
Initialize all the atomic kind radii for a given threshold value.
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, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
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 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...
Auxiliary routines necessary to redistribute an fm_matrix from a given blacs_env to another.
subroutine, public communicate_buffer(para_env, num_entries_rec, num_entries_send, buffer_rec, buffer_send, req_array, do_indx, do_msg)
...
Routines treating GW and RPA calculations with kpoints.
subroutine, public cp_cfm_power(matrix, threshold, exponent, min_eigval)
...
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
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.