55 USE dbcsr_api,
ONLY: &
56 dbcsr_copy, dbcsr_create, dbcsr_deallocate_matrix, dbcsr_desymmetrize, &
57 dbcsr_distribution_release, dbcsr_distribution_type, dbcsr_p_type, dbcsr_release, &
58 dbcsr_reserve_all_blocks, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, &
59 dbcsr_type_no_symmetry, dbcsr_type_symmetric
86 USE mp2_types,
ONLY: integ_mat_buffer_type
106 #include "./base/base_uses.f90"
112 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_ri_2c'
155 SUBROUTINE get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, &
156 my_Lrows, my_Vrows, fm_matrix_PQ, ngroup, color_sub, dimen_RI, dimen_RI_red, &
157 kpoints, my_group_L_size, my_group_L_start, my_group_L_end, &
158 gd_array, calc_PQ_cond_num, do_svd, potential, ri_metric, &
159 fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, &
160 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, &
161 do_im_time, do_kpoints, mp2_eps_pgf_orb_S, qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
163 TYPE(qs_environment_type),
POINTER :: qs_env
164 INTEGER,
INTENT(IN) :: eri_method
165 TYPE(cp_eri_mme_param),
POINTER :: eri_param
166 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_sub
167 REAL(kind=
dp),
INTENT(IN) :: mp2_memory
168 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
169 INTENT(OUT) :: my_lrows, my_vrows
170 TYPE(cp_fm_type),
INTENT(OUT) :: fm_matrix_pq
171 INTEGER,
INTENT(IN) :: ngroup, color_sub
172 INTEGER,
INTENT(OUT) :: dimen_ri, dimen_ri_red
173 TYPE(kpoint_type),
POINTER :: kpoints
174 INTEGER,
INTENT(OUT) :: my_group_l_size, my_group_l_start, &
176 TYPE(group_dist_d1_type),
INTENT(OUT) :: gd_array
177 LOGICAL,
INTENT(IN) :: calc_pq_cond_num, do_svd
178 TYPE(libint_potential_type) :: potential, ri_metric
179 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
180 fm_matrix_minv_l_kpoints, &
182 fm_matrix_minv_vtrunc_minv
183 LOGICAL,
INTENT(IN) :: do_im_time, do_kpoints
184 REAL(kind=
dp),
INTENT(IN) :: mp2_eps_pgf_orb_s
185 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
186 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
187 POINTER :: sab_orb_sub
188 LOGICAL,
INTENT(IN) :: calc_forces
189 INTEGER,
INTENT(IN) :: unit_nr
191 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_2c_integrals'
193 INTEGER :: handle, num_small_eigen
194 REAL(kind=
dp) :: cond_num, eps_pgf_orb_old
195 TYPE(cp_fm_type) :: fm_matrix_l_work, fm_matrix_m_inv_work, &
197 TYPE(dft_control_type),
POINTER :: dft_control
198 TYPE(libint_potential_type) :: trunc_coulomb
199 TYPE(mp_para_env_type),
POINTER :: para_env_l
201 CALL timeset(routinen, handle)
204 CALL compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_l, mp2_memory, &
205 fm_matrix_l_work, ngroup, color_sub, dimen_ri, &
206 my_group_l_size, my_group_l_start, my_group_l_end, &
207 gd_array, calc_pq_cond_num, cond_num, &
208 num_small_eigen, potential, sab_orb_sub, do_im_time=do_im_time)
210 IF (do_im_time .AND. calc_forces)
THEN
212 CALL cp_fm_create(fm_matrix_pq, fm_matrix_l_work%matrix_struct)
213 CALL cp_fm_to_fm(fm_matrix_l_work, fm_matrix_pq)
216 dimen_ri_red = dimen_ri
219 CALL decomp_mat_l(fm_matrix_l_work, do_svd, num_small_eigen, cond_num, .true., gd_array, ngroup, &
220 dimen_ri, dimen_ri_red, para_env)
225 CALL get_qs_env(qs_env, dft_control=dft_control)
228 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
229 dft_control%qs_control%eps_pgf_orb = mp2_eps_pgf_orb_s
232 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv_l_kpoints, fm_matrix_l_work, dimen_ri, ri_metric, &
233 do_kpoints, kpoints, put_mat_ks_env=.true., &
234 regularization_ri=qs_env%mp2_env%ri_rpa_im_time%regularization_RI)
237 dft_control%qs_control%eps_pgf_orb = eps_pgf_orb_old
244 CALL release_group_dist(gd_array)
246 ALLOCATE (fm_matrix_minv_l_kpoints(1, 1))
249 CALL compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_l, mp2_memory, &
250 fm_matrix_minv_l_kpoints(1, 1), ngroup, color_sub, dimen_ri, &
251 my_group_l_size, my_group_l_start, my_group_l_end, &
252 gd_array, calc_pq_cond_num, cond_num, &
253 num_small_eigen, ri_metric, sab_orb_sub, &
254 fm_matrix_l_extern=fm_matrix_l_work)
261 CALL compute_v_by_lattice_sum(qs_env, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, kpoints)
264 kpoints, qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S)
269 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv_vtrunc_minv, fm_matrix_l_work, dimen_ri, trunc_coulomb, &
270 do_kpoints=.false., kpoints=kpoints, put_mat_ks_env=.false., regularization_ri=0.0_dp)
273 CALL ri_2c_integral_mat(qs_env, fm_matrix_minv, fm_matrix_l_work, dimen_ri, ri_metric, &
274 do_kpoints=.false., kpoints=kpoints, put_mat_ks_env=.false., regularization_ri=0.0_dp)
276 CALL gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc(fm_matrix_minv_vtrunc_minv, &
277 fm_matrix_minv, qs_env)
279 IF (calc_forces .AND. (.NOT. do_im_time))
THEN
281 CALL cp_fm_create(fm_matrix_v, fm_matrix_l_work%matrix_struct)
282 CALL cp_fm_to_fm(fm_matrix_l_work, fm_matrix_v)
284 CALL decomp_mat_l(fm_matrix_v, do_svd, num_small_eigen, cond_num, .true., gd_array, ngroup, &
285 dimen_ri, dimen_ri_red, para_env)
288 CALL decomp_mat_l(fm_matrix_l_work, do_svd, num_small_eigen, cond_num, .false., gd_array, ngroup, &
289 dimen_ri, dimen_ri_red, para_env)
291 CALL decomp_mat_l(fm_matrix_minv_l_kpoints(1, 1), .false., num_small_eigen, cond_num, .true., &
292 gd_array, ngroup, dimen_ri, dimen_ri_red, para_env)
294 CALL cp_fm_create(fm_matrix_m_inv_work, fm_matrix_minv_l_kpoints(1, 1)%matrix_struct)
297 CALL parallel_gemm(
'N',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_minv_l_kpoints(1, 1), &
298 fm_matrix_minv_l_kpoints(1, 1), 0.0_dp, fm_matrix_m_inv_work)
302 CALL reset_size_matrix(fm_matrix_minv_l_kpoints(1, 1), dimen_ri_red, fm_matrix_l_work%matrix_struct)
305 CALL parallel_gemm(
'T',
'N', dimen_ri, dimen_ri_red, dimen_ri, 1.0_dp, fm_matrix_m_inv_work, &
306 fm_matrix_l_work, 0.0_dp, fm_matrix_minv_l_kpoints(1, 1))
309 CALL parallel_gemm(
'T',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_m_inv_work, &
310 fm_matrix_l_work, 0.0_dp, fm_matrix_minv_l_kpoints(1, 1))
314 CALL cp_fm_release(fm_matrix_m_inv_work)
317 IF (.NOT. do_im_time)
THEN
319 CALL cp_fm_to_fm(fm_matrix_minv_l_kpoints(1, 1), fm_matrix_l_work)
320 CALL cp_fm_release(fm_matrix_minv_l_kpoints)
327 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
329 IF (.NOT. do_im_time)
THEN
330 IF (unit_nr > 0)
THEN
331 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)")
"RI_INFO| Cholesky decomposition group size:", para_env_l%num_pe
332 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)")
"RI_INFO| Number of groups for auxiliary basis functions", ngroup
333 IF (calc_pq_cond_num .OR. do_svd)
THEN
334 WRITE (unit=unit_nr, fmt=
"(T3,A,T67,ES14.5)") &
335 "RI_INFO| Condition number of the (P|Q):", cond_num
336 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
337 "RI_INFO| Number of non-positive Eigenvalues of (P|Q):", num_small_eigen
343 CALL grep_lcols(fm_matrix_l_work, my_group_l_start, my_group_l_end, my_group_l_size, my_lrows)
345 qs_env%mp2_env%potential_parameter))
THEN
346 CALL grep_lcols(fm_matrix_v, my_group_l_start, my_group_l_end, my_group_l_size, my_vrows)
349 CALL cp_fm_release(fm_matrix_l_work)
351 qs_env%mp2_env%potential_parameter)))
CALL cp_fm_release(fm_matrix_v)
354 CALL timestop(handle)
371 SUBROUTINE decomp_mat_l(fm_matrix_L, do_svd, num_small_eigen, cond_num, do_inversion, gd_array, ngroup, &
372 dimen_RI, dimen_RI_red, para_env)
374 TYPE(cp_fm_type),
INTENT(INOUT) :: fm_matrix_l
375 LOGICAL,
INTENT(IN) :: do_svd
376 INTEGER,
INTENT(INOUT) :: num_small_eigen
377 REAL(kind=
dp),
INTENT(INOUT) :: cond_num
378 LOGICAL,
INTENT(IN) :: do_inversion
379 TYPE(group_dist_d1_type),
INTENT(INOUT) :: gd_array
380 INTEGER,
INTENT(IN) :: ngroup, dimen_ri
381 INTEGER,
INTENT(INOUT) :: dimen_ri_red
382 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
385 CALL matrix_root_with_svd(fm_matrix_l, num_small_eigen, cond_num, do_inversion, para_env)
387 dimen_ri_red = dimen_ri - num_small_eigen
391 CALL release_group_dist(gd_array)
393 CALL create_group_dist(gd_array, ngroup, dimen_ri_red)
397 CALL cholesky_decomp(fm_matrix_l, dimen_ri, do_inversion=do_inversion)
399 IF (do_inversion)
CALL invert_mat(fm_matrix_l)
402 END SUBROUTINE decomp_mat_l
411 SUBROUTINE compute_v_by_lattice_sum(qs_env, fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, kpoints)
412 TYPE(qs_environment_type),
POINTER :: qs_env
413 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
414 fm_matrix_minv_l_kpoints
415 TYPE(kpoint_type),
POINTER :: kpoints
417 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_by_lattice_sum'
419 INTEGER :: handle, i_dim, i_real_imag, ikp, nkp, &
421 INTEGER,
DIMENSION(3) :: nkp_grid_orig, periodic
422 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
423 TYPE(cell_type),
POINTER :: cell
424 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_ri_aux_transl, matrix_v_ri_kp
425 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
426 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
428 CALL timeset(routinen, handle)
430 NULLIFY (matrix_s_ri_aux_transl, particle_set, cell, qs_kind_set)
433 matrix_s_ri_aux_kp=matrix_s_ri_aux_transl, &
434 particle_set=particle_set, &
436 qs_kind_set=qs_kind_set, &
437 atomic_kind_set=atomic_kind_set)
440 CALL get_cell(cell=cell, periodic=periodic)
442 IF (periodic(i_dim) == 1)
THEN
443 cpassert(
modulo(kpoints%nkp_grid(i_dim), 2) == 0)
449 ALLOCATE (fm_matrix_l_kpoints(nkp, 2))
451 DO i_real_imag = 1, 2
452 CALL cp_fm_create(fm_matrix_l_kpoints(ikp, i_real_imag), &
453 fm_matrix_minv_l_kpoints(1, i_real_imag)%matrix_struct)
454 CALL cp_fm_set_all(fm_matrix_l_kpoints(ikp, i_real_imag), 0.0_dp)
458 CALL allocate_matrix_v_ri_kp(matrix_v_ri_kp, matrix_s_ri_aux_transl, nkp)
460 IF (qs_env%mp2_env%ri_rpa_im_time%do_extrapolate_kpoints)
THEN
462 nkp_orig = qs_env%mp2_env%ri_rpa_im_time%nkp_orig
463 nkp_extra = qs_env%mp2_env%ri_rpa_im_time%nkp_extra
466 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
467 atomic_kind_set=atomic_kind_set, &
468 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
471 nkp_grid_orig = kpoints%nkp_grid
472 kpoints%nkp_grid(1:3) = qs_env%mp2_env%ri_rpa_im_time%kp_grid_extra(1:3)
475 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
476 atomic_kind_set=atomic_kind_set, &
477 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
480 kpoints%nkp_grid = nkp_grid_orig
485 cell=cell, particle_set=particle_set, qs_kind_set=qs_kind_set, &
486 atomic_kind_set=atomic_kind_set, &
487 size_lattice_sum=qs_env%mp2_env%mp2_gpw%size_lattice_sum, &
494 CALL copy_dbcsr_to_fm(matrix_v_ri_kp(ikp, 1)%matrix, fm_matrix_l_kpoints(ikp, 1))
495 CALL copy_dbcsr_to_fm(matrix_v_ri_kp(ikp, 2)%matrix, fm_matrix_l_kpoints(ikp, 2))
501 CALL timestop(handle)
503 END SUBROUTINE compute_v_by_lattice_sum
511 SUBROUTINE allocate_matrix_v_ri_kp(matrix_v_RI_kp, matrix_s_RI_aux_transl, nkp)
513 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_ri_kp, matrix_s_ri_aux_transl
518 NULLIFY (matrix_v_ri_kp)
523 ALLOCATE (matrix_v_ri_kp(ikp, 1)%matrix)
524 CALL dbcsr_create(matrix_v_ri_kp(ikp, 1)%matrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
525 matrix_type=dbcsr_type_no_symmetry)
526 CALL dbcsr_reserve_all_blocks(matrix_v_ri_kp(ikp, 1)%matrix)
527 CALL dbcsr_set(matrix_v_ri_kp(ikp, 1)%matrix, 0.0_dp)
529 ALLOCATE (matrix_v_ri_kp(ikp, 2)%matrix)
530 CALL dbcsr_create(matrix_v_ri_kp(ikp, 2)%matrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
531 matrix_type=dbcsr_type_no_symmetry)
532 CALL dbcsr_reserve_all_blocks(matrix_v_ri_kp(ikp, 2)%matrix)
533 CALL dbcsr_set(matrix_v_ri_kp(ikp, 2)%matrix, 0.0_dp)
537 END SUBROUTINE allocate_matrix_v_ri_kp
553 do_kpoints, kpoints, put_mat_KS_env, regularization_RI, ikp_ext)
555 TYPE(qs_environment_type),
POINTER :: qs_env
556 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_minv_l_kpoints
557 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
558 INTEGER,
INTENT(IN) :: dimen_ri
559 TYPE(libint_potential_type) :: ri_metric
560 LOGICAL,
INTENT(IN) :: do_kpoints
561 TYPE(kpoint_type),
OPTIONAL,
POINTER :: kpoints
562 LOGICAL,
OPTIONAL :: put_mat_ks_env
563 REAL(kind=
dp),
OPTIONAL :: regularization_ri
564 INTEGER,
OPTIONAL :: ikp_ext
566 CHARACTER(LEN=*),
PARAMETER :: routinen =
'RI_2c_integral_mat'
568 INTEGER :: handle, i_real_imag, i_size, ikp, &
569 ikp_for_xkp, img, n_real_imag, natom, &
571 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sizes_ri
572 INTEGER,
DIMENSION(:),
POINTER :: col_bsize, row_bsize
573 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
574 LOGICAL :: my_put_mat_ks_env
575 REAL(kind=
dp) :: my_regularization_ri
576 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
577 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
578 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
579 TYPE(cp_fm_type) :: fm_matrix_s_global
580 TYPE(dbcsr_distribution_type) :: dbcsr_dist
581 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_ri_aux_transl
582 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: mat_2c
583 TYPE(dbcsr_type),
POINTER :: cmatrix, matrix_s_ri_aux_desymm, &
585 TYPE(dft_control_type),
POINTER :: dft_control
586 TYPE(distribution_2d_type),
POINTER :: dist_2d
587 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: basis_set_ri
588 TYPE(mp_para_env_type),
POINTER :: para_env
589 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
591 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
592 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
594 CALL timeset(routinen, handle)
596 NULLIFY (sab_ri, matrix_s_ri_aux_transl, dist_2d)
598 IF (
PRESENT(regularization_ri))
THEN
599 my_regularization_ri = regularization_ri
601 my_regularization_ri = 0.0_dp
604 IF (
PRESENT(put_mat_ks_env))
THEN
605 my_put_mat_ks_env = put_mat_ks_env
607 my_put_mat_ks_env = .false.
612 blacs_env=blacs_env, &
614 distribution_2d=dist_2d, &
615 qs_kind_set=qs_kind_set, &
616 particle_set=particle_set, &
617 dft_control=dft_control, &
620 ALLOCATE (sizes_ri(natom))
621 ALLOCATE (basis_set_ri(nkind))
624 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri)
627 sym_ij=.true., dist_2d=dist_2d)
630 ALLOCATE (row_bsize(
SIZE(sizes_ri)))
631 ALLOCATE (col_bsize(
SIZE(sizes_ri)))
632 row_bsize(:) = sizes_ri
633 col_bsize(:) = sizes_ri
636 nimg = dft_control%nimages
641 ALLOCATE (mat_2c(nimg))
642 CALL dbcsr_create(mat_2c(1),
"(RI|RI)", dbcsr_dist, dbcsr_type_symmetric, &
643 row_bsize, col_bsize)
644 DEALLOCATE (row_bsize, col_bsize)
647 CALL dbcsr_create(mat_2c(img), template=mat_2c(1))
651 ri_metric, do_kpoints=do_kpoints, ext_kpoints=kpoints, &
652 regularization_ri=my_regularization_ri)
654 CALL dbcsr_distribution_release(dbcsr_dist)
655 DEALLOCATE (basis_set_ri)
657 IF (my_put_mat_ks_env)
THEN
658 CALL get_ks_env(qs_env%ks_env, matrix_s_ri_aux_kp=matrix_s_ri_aux_transl)
663 ALLOCATE (matrix_s_ri_aux_transl(1, img)%matrix)
664 CALL dbcsr_copy(matrix_s_ri_aux_transl(1, img)%matrix, mat_2c(img))
665 CALL dbcsr_release(mat_2c(img))
668 IF (my_put_mat_ks_env)
THEN
669 CALL set_ks_env(qs_env%ks_env, matrix_s_ri_aux_kp=matrix_s_ri_aux_transl)
673 cpassert(
PRESENT(kpoints))
675 cell_to_index=cell_to_index)
682 IF (
PRESENT(ikp_ext)) nkp = 1
684 ALLOCATE (fm_matrix_minv_l_kpoints(nkp, n_real_imag))
686 DO i_real_imag = 1, n_real_imag
687 CALL cp_fm_create(fm_matrix_minv_l_kpoints(i_size, i_real_imag), fm_matrix_l%matrix_struct)
688 CALL cp_fm_set_all(fm_matrix_minv_l_kpoints(i_size, i_real_imag), 0.0_dp)
694 ncol_global=dimen_ri, para_env=para_env)
701 ALLOCATE (rmatrix, cmatrix, tmpmat)
702 CALL dbcsr_create(rmatrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
703 matrix_type=dbcsr_type_symmetric)
704 CALL dbcsr_create(cmatrix, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
705 matrix_type=dbcsr_type_antisymmetric)
706 CALL dbcsr_create(tmpmat, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
707 matrix_type=dbcsr_type_no_symmetry)
714 CALL dbcsr_set(rmatrix, 0.0_dp)
715 CALL dbcsr_set(cmatrix, 0.0_dp)
717 IF (
PRESENT(ikp_ext))
THEN
718 ikp_for_xkp = ikp_ext
723 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_s_ri_aux_transl, ispin=1, &
724 xkp=xkp(1:3, ikp_for_xkp), cell_to_index=cell_to_index, sab_nl=sab_ri)
726 CALL dbcsr_set(tmpmat, 0.0_dp)
727 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
731 CALL cp_fm_copy_general(fm_matrix_s_global, fm_matrix_minv_l_kpoints(ikp, 1), para_env)
733 CALL dbcsr_set(tmpmat, 0.0_dp)
734 CALL dbcsr_desymmetrize(cmatrix, tmpmat)
738 CALL cp_fm_copy_general(fm_matrix_s_global, fm_matrix_minv_l_kpoints(ikp, 2), para_env)
742 CALL dbcsr_deallocate_matrix(rmatrix)
743 CALL dbcsr_deallocate_matrix(cmatrix)
744 CALL dbcsr_deallocate_matrix(tmpmat)
748 NULLIFY (matrix_s_ri_aux_desymm)
749 ALLOCATE (matrix_s_ri_aux_desymm)
750 CALL dbcsr_create(matrix_s_ri_aux_desymm, template=matrix_s_ri_aux_transl(1, 1)%matrix, &
751 name=
'S_RI non_symm', matrix_type=dbcsr_type_no_symmetry)
753 CALL dbcsr_desymmetrize(matrix_s_ri_aux_transl(1, 1)%matrix, matrix_s_ri_aux_desymm)
759 CALL dbcsr_deallocate_matrix(matrix_s_ri_aux_desymm)
767 CALL cp_fm_release(fm_matrix_s_global)
769 IF (.NOT. my_put_mat_ks_env)
THEN
773 CALL timestop(handle)
802 SUBROUTINE compute_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, para_env_L, mp2_memory, &
803 fm_matrix_L, ngroup, color_sub, dimen_RI, &
804 my_group_L_size, my_group_L_start, my_group_L_end, &
805 gd_array, calc_PQ_cond_num, cond_num, num_small_eigen, potential, &
806 sab_orb_sub, do_im_time, fm_matrix_L_extern)
808 TYPE(qs_environment_type),
POINTER :: qs_env
809 INTEGER,
INTENT(IN) :: eri_method
810 TYPE(cp_eri_mme_param),
POINTER :: eri_param
811 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
812 TYPE(mp_para_env_type),
INTENT(IN),
POINTER :: para_env_sub
813 TYPE(mp_para_env_type),
INTENT(OUT),
POINTER :: para_env_l
814 REAL(kind=
dp),
INTENT(IN) :: mp2_memory
815 TYPE(cp_fm_type),
INTENT(OUT) :: fm_matrix_l
816 INTEGER,
INTENT(IN) :: ngroup, color_sub
817 INTEGER,
INTENT(OUT) :: dimen_ri, my_group_l_size, &
818 my_group_l_start, my_group_l_end
819 TYPE(group_dist_d1_type),
INTENT(OUT) :: gd_array
820 LOGICAL,
INTENT(IN) :: calc_pq_cond_num
821 REAL(kind=
dp),
INTENT(OUT) :: cond_num
822 INTEGER,
INTENT(OUT) :: num_small_eigen
823 TYPE(libint_potential_type),
INTENT(IN) :: potential
824 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
825 POINTER :: sab_orb_sub
826 LOGICAL,
INTENT(IN),
OPTIONAL :: do_im_time
827 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: fm_matrix_l_extern
829 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_2c_integrals'
831 INTEGER :: best_group_size, color_l, group_size, handle, handle2, i_global, iatom, iib, &
832 ikind, iproc, j_global, jjb, natom, ncol_local, nkind, nrow_local, nsgf, potential_type, &
833 proc_receive, proc_receive_static, proc_send_static, proc_shift, rec_l_end, rec_l_size, &
834 rec_l_start, strat_group_size
835 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
836 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
837 LOGICAL :: my_do_im_time
838 REAL(kind=
dp) :: min_mem_for_qk
839 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: egen_l
840 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: l_external_col, l_local_col
841 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
842 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_l
843 TYPE(cp_fm_type) :: fm_matrix_l_diag
844 TYPE(group_dist_d1_type) :: gd_sub_array
845 TYPE(gto_basis_set_type),
POINTER :: basis_set_a
846 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
847 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
849 CALL timeset(routinen, handle)
851 my_do_im_time = .false.
852 IF (
PRESENT(do_im_time))
THEN
853 my_do_im_time = do_im_time
857 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
858 particle_set=particle_set)
860 nkind =
SIZE(qs_kind_set)
861 natom =
SIZE(particle_set)
866 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, basis_type=
"RI_AUX")
867 cpassert(
ASSOCIATED(basis_set_a))
872 ikind = kind_of(iatom)
873 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=
"RI_AUX")
874 dimen_ri = dimen_ri + nsgf
878 IF (dimen_ri < ngroup)
THEN
879 CALL cp_abort(__location__,
"Product of block size and number "// &
880 "of RI functions should not exceed total number of processes")
883 CALL create_group_dist(gd_array, ngroup, dimen_ri)
885 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
887 CALL timeset(routinen//
"_loop_lm", handle2)
889 ALLOCATE (l_local_col(dimen_ri, my_group_l_size))
892 potential_type = potential%potential_type
899 basis_type_a=
"RI_AUX", basis_type_b=
"RI_AUX", &
900 hab=l_local_col, first_b=my_group_l_start, last_b=my_group_l_end, &
901 eri_method=eri_method)
908 natom, potential, sab_orb_sub, l_local_col, kind_of)
911 cpabort(
"unknown ERI method")
914 CALL timestop(handle2)
918 best_group_size = para_env%num_pe
920 strat_group_size = max(1, para_env%num_pe/10)
922 min_mem_for_qk = real(dimen_ri, kind=
dp)*dimen_ri*3.0_dp*8.0_dp/1024_dp/1024_dp
924 group_size = strat_group_size - 1
925 DO iproc = strat_group_size, para_env%num_pe
926 group_size = group_size + 1
929 IF (mod(para_env%num_pe, group_size) /= 0 .OR. mod(group_size, para_env_sub%num_pe) /= 0) cycle
932 IF (real(group_size, kind=
dp)*mp2_memory < min_mem_for_qk) cycle
934 best_group_size = group_size
938 IF (my_do_im_time)
THEN
940 best_group_size = para_env%num_pe
944 color_l = para_env%mepos/best_group_size
945 ALLOCATE (para_env_l)
946 CALL para_env_l%from_split(para_env, color_l)
949 NULLIFY (blacs_env_l)
953 CALL create_matrix_l(fm_matrix_l, blacs_env_l, dimen_ri, para_env_l,
"fm_matrix_L", fm_matrix_l_extern)
955 IF (my_do_im_time .AND. para_env%num_pe > 1)
THEN
957 CALL fill_fm_l_from_l_loc_non_blocking(fm_matrix_l, l_local_col, para_env, &
958 my_group_l_start, my_group_l_end, &
963 TYPE(mp_comm_type) :: comm_exchange
965 CALL comm_exchange%from_split(para_env_l, para_env_sub%mepos)
967 CALL create_group_dist(gd_sub_array, my_group_l_start, &
968 my_group_l_end, my_group_l_size, comm_exchange)
971 nrow_local=nrow_local, &
972 ncol_local=ncol_local, &
973 row_indices=row_indices, &
974 col_indices=col_indices)
976 DO jjb = 1, ncol_local
977 j_global = col_indices(jjb)
978 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
979 DO iib = 1, nrow_local
980 i_global = row_indices(iib)
981 fm_matrix_l%local_data(iib, jjb) = l_local_col(i_global, j_global - my_group_l_start + 1)
986 proc_send_static =
modulo(comm_exchange%mepos + 1, comm_exchange%num_pe)
987 proc_receive_static =
modulo(comm_exchange%mepos - 1, comm_exchange%num_pe)
989 DO proc_shift = 1, comm_exchange%num_pe - 1
990 proc_receive =
modulo(comm_exchange%mepos - proc_shift, comm_exchange%num_pe)
992 CALL get_group_dist(gd_sub_array, proc_receive, rec_l_start, rec_l_end, rec_l_size)
994 ALLOCATE (l_external_col(dimen_ri, rec_l_size))
995 l_external_col = 0.0_dp
997 CALL comm_exchange%sendrecv(l_local_col, proc_send_static, l_external_col, proc_receive_static)
999 DO jjb = 1, ncol_local
1000 j_global = col_indices(jjb)
1001 IF (j_global >= rec_l_start .AND. j_global <= rec_l_end)
THEN
1002 DO iib = 1, nrow_local
1003 i_global = row_indices(iib)
1004 fm_matrix_l%local_data(iib, jjb) = l_external_col(i_global, j_global - rec_l_start + 1)
1009 CALL move_alloc(l_external_col, l_local_col)
1012 CALL release_group_dist(gd_sub_array)
1013 CALL comm_exchange%free()
1017 DEALLOCATE (l_local_col)
1021 TYPE(mp_comm_type) :: comm_exchange
1022 comm_exchange = fm_matrix_l%matrix_struct%context%interconnect(para_env)
1023 CALL comm_exchange%sum(fm_matrix_l%local_data)
1024 CALL comm_exchange%free()
1029 IF (calc_pq_cond_num)
THEN
1033 CALL create_matrix_l(fm_matrix_l_diag, blacs_env_l, dimen_ri, para_env_l,
"fm_matrix_L_diag", fm_matrix_l_extern)
1035 CALL cp_fm_to_fm(source=fm_matrix_l, destination=fm_matrix_l_diag)
1037 ALLOCATE (egen_l(dimen_ri))
1040 CALL cp_fm_syevx(matrix=fm_matrix_l_diag, eigenvalues=egen_l)
1043 DO iib = 1, dimen_ri
1044 IF (abs(egen_l(iib)) < 0.001_dp) num_small_eigen = num_small_eigen + 1
1047 cond_num = maxval(abs(egen_l))/minval(abs(egen_l))
1049 CALL cp_fm_release(fm_matrix_l_diag)
1055 CALL cp_blacs_env_release(blacs_env_l)
1057 CALL timestop(handle)
1059 END SUBROUTINE compute_2c_integrals
1069 SUBROUTINE matrix_root_with_svd(matrix, num_small_evals, cond_num, do_inversion, para_env)
1070 TYPE(cp_fm_type),
INTENT(INOUT) :: matrix
1071 INTEGER,
INTENT(OUT) :: num_small_evals
1072 REAL(kind=dp),
INTENT(OUT) :: cond_num
1073 LOGICAL,
INTENT(IN) :: do_inversion
1074 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1076 CHARACTER(LEN=*),
PARAMETER :: routinen =
'matrix_root_with_svd'
1078 INTEGER :: group_size_l, handle, ii, needed_evals, &
1080 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num_eval
1081 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: evals
1082 TYPE(cp_fm_type) :: evecs
1083 TYPE(mp_comm_type) :: comm_exchange
1085 CALL timeset(routinen, handle)
1088 CALL cp_fm_get_info(matrix=matrix, nrow_global=nrow)
1090 ALLOCATE (evals(nrow))
1093 CALL cp_fm_create(evecs, matrix%matrix_struct)
1096 CALL choose_eigv_solver(matrix, evecs, evals)
1101 IF (evals(ii) > 0.0_dp)
THEN
1102 num_small_evals = ii - 1
1106 needed_evals = nrow - num_small_evals
1109 cond_num = evals(nrow)/evals(num_small_evals + 1)
1112 evals(1:num_small_evals) = 0.0_dp
1113 IF (do_inversion)
THEN
1114 evals(num_small_evals + 1:nrow) = 1.0_dp/sqrt(evals(num_small_evals + 1:nrow))
1116 evals(num_small_evals + 1:nrow) = sqrt(evals(num_small_evals + 1:nrow))
1119 CALL cp_fm_column_scale(evecs, evals)
1125 group_size_l = para_env%num_pe/matrix%matrix_struct%para_env%num_pe
1126 comm_exchange = matrix%matrix_struct%context%interconnect(para_env)
1128 ALLOCATE (num_eval(0:group_size_l - 1))
1129 CALL comm_exchange%allgather(num_small_evals, num_eval)
1131 num_small_evals = minval(num_eval)
1133 IF (num_small_evals /= maxval(num_eval))
THEN
1135 pos_max = maxloc(num_eval)
1136 num_small_evals = num_eval(pos_max(1))
1137 needed_evals = nrow - num_small_evals
1140 CALL comm_exchange%bcast(evecs%local_data, pos_max(1))
1141 CALL comm_exchange%bcast(cond_num, pos_max(1))
1144 DEALLOCATE (num_eval)
1146 CALL comm_exchange%free()
1148 CALL reset_size_matrix(matrix, needed_evals, matrix%matrix_struct)
1151 CALL cp_fm_to_fm(evecs, matrix, needed_evals, num_small_evals + 1)
1153 CALL cp_fm_release(evecs)
1155 CALL timestop(handle)
1157 END SUBROUTINE matrix_root_with_svd
1165 SUBROUTINE reset_size_matrix(matrix, new_size, fm_struct_template)
1166 TYPE(cp_fm_type),
INTENT(INOUT) :: matrix
1167 INTEGER,
INTENT(IN) :: new_size
1168 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_template
1170 CHARACTER(LEN=*),
PARAMETER :: routinen =
'reset_size_matrix'
1173 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
1175 CALL timeset(routinen, handle)
1179 CALL cp_fm_struct_create(fm_struct, ncol_global=new_size, template_fmstruct=fm_struct_template, force_block=.true.)
1181 CALL cp_fm_release(matrix)
1183 CALL cp_fm_create(matrix, fm_struct)
1184 CALL cp_fm_set_all(matrix, 0.0_dp)
1186 CALL cp_fm_struct_release(fm_struct)
1188 CALL timestop(handle)
1190 END SUBROUTINE reset_size_matrix
1201 SUBROUTINE fill_fm_l_from_l_loc_non_blocking(fm_matrix_L, L_local_col, para_env, my_group_L_start, &
1202 my_group_L_end, dimen_RI)
1203 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1204 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :), &
1205 INTENT(IN) :: l_local_col
1206 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1207 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, &
1210 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fill_fm_L_from_L_loc_non_blocking'
1212 INTEGER :: dummy_proc, handle, handle2, i_entry_rec, i_row, i_row_global, iproc, j_col, &
1213 j_col_global, lll, mmm, ncol_block, ncol_local, npcol, nprow, nrow_block, nrow_local, &
1214 proc_send, send_pcol, send_prow
1215 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: entry_counter, num_entries_rec, &
1217 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1218 TYPE(integ_mat_buffer_type),
ALLOCATABLE, &
1219 DIMENSION(:) :: buffer_rec, buffer_send
1220 TYPE(mp_request_type),
DIMENSION(:, :),
POINTER :: req_array
1222 CALL timeset(routinen, handle)
1224 CALL timeset(routinen//
"_1", handle2)
1227 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1228 nrow_local=nrow_local, &
1229 ncol_local=ncol_local, &
1230 row_indices=row_indices, &
1231 col_indices=col_indices, &
1232 nrow_block=nrow_block, &
1233 ncol_block=ncol_block)
1235 nprow = fm_matrix_l%matrix_struct%context%num_pe(1)
1236 npcol = fm_matrix_l%matrix_struct%context%num_pe(2)
1238 ALLOCATE (num_entries_rec(0:para_env%num_pe - 1))
1239 ALLOCATE (num_entries_send(0:para_env%num_pe - 1))
1241 num_entries_rec(:) = 0
1242 num_entries_send(:) = 0
1247 DO lll = 1, dimen_ri
1249 send_prow = cp_fm_indxg2p(lll, nrow_block, dummy_proc, &
1250 fm_matrix_l%matrix_struct%first_p_pos(1), nprow)
1252 DO mmm = my_group_l_start, my_group_l_end
1254 send_pcol = cp_fm_indxg2p(mmm, ncol_block, dummy_proc, &
1255 fm_matrix_l%matrix_struct%first_p_pos(2), npcol)
1257 proc_send = fm_matrix_l%matrix_struct%context%blacs2mpi(send_prow, send_pcol)
1259 num_entries_send(proc_send) = num_entries_send(proc_send) + 1
1265 CALL timestop(handle2)
1267 CALL timeset(routinen//
"_2", handle2)
1269 CALL para_env%alltoall(num_entries_send, num_entries_rec, 1)
1271 CALL timestop(handle2)
1273 CALL timeset(routinen//
"_3", handle2)
1276 ALLOCATE (buffer_rec(0:para_env%num_pe - 1))
1277 ALLOCATE (buffer_send(0:para_env%num_pe - 1))
1280 DO iproc = 0, para_env%num_pe - 1
1282 ALLOCATE (buffer_rec(iproc)%msg(num_entries_rec(iproc)))
1283 buffer_rec(iproc)%msg = 0.0_dp
1287 CALL timestop(handle2)
1289 CALL timeset(routinen//
"_4", handle2)
1291 DO iproc = 0, para_env%num_pe - 1
1293 ALLOCATE (buffer_send(iproc)%msg(num_entries_send(iproc)))
1294 buffer_send(iproc)%msg = 0.0_dp
1298 CALL timestop(handle2)
1300 CALL timeset(routinen//
"_5", handle2)
1302 DO iproc = 0, para_env%num_pe - 1
1304 ALLOCATE (buffer_rec(iproc)%indx(num_entries_rec(iproc), 2))
1305 buffer_rec(iproc)%indx = 0
1309 CALL timestop(handle2)
1311 CALL timeset(routinen//
"_6", handle2)
1313 DO iproc = 0, para_env%num_pe - 1
1315 ALLOCATE (buffer_send(iproc)%indx(num_entries_send(iproc), 2))
1316 buffer_send(iproc)%indx = 0
1320 CALL timestop(handle2)
1322 CALL timeset(routinen//
"_7", handle2)
1324 ALLOCATE (entry_counter(0:para_env%num_pe - 1))
1325 entry_counter(:) = 0
1329 DO lll = 1, dimen_ri
1331 send_prow = cp_fm_indxg2p(lll, nrow_block, dummy_proc, &
1332 fm_matrix_l%matrix_struct%first_p_pos(1), nprow)
1334 DO mmm = my_group_l_start, my_group_l_end
1336 send_pcol = cp_fm_indxg2p(mmm, ncol_block, dummy_proc, &
1337 fm_matrix_l%matrix_struct%first_p_pos(2), npcol)
1339 proc_send = fm_matrix_l%matrix_struct%context%blacs2mpi(send_prow, send_pcol)
1341 entry_counter(proc_send) = entry_counter(proc_send) + 1
1343 buffer_send(proc_send)%msg(entry_counter(proc_send)) = &
1344 l_local_col(lll, mmm - my_group_l_start + 1)
1346 buffer_send(proc_send)%indx(entry_counter(proc_send), 1) = lll
1347 buffer_send(proc_send)%indx(entry_counter(proc_send), 2) = mmm
1353 ALLOCATE (req_array(1:para_env%num_pe, 4))
1355 CALL timestop(handle2)
1357 CALL timeset(routinen//
"_8", handle2)
1360 CALL communicate_buffer(para_env, num_entries_rec, num_entries_send, buffer_rec, &
1361 buffer_send, req_array)
1363 fm_matrix_l%local_data = 0.0_dp
1365 CALL timestop(handle2)
1367 CALL timeset(routinen//
"_9", handle2)
1370 DO iproc = 0, para_env%num_pe - 1
1372 DO i_entry_rec = 1, num_entries_rec(iproc)
1374 DO i_row = 1, nrow_local
1376 i_row_global = row_indices(i_row)
1378 DO j_col = 1, ncol_local
1380 j_col_global = col_indices(j_col)
1382 IF (i_row_global == buffer_rec(iproc)%indx(i_entry_rec, 1) .AND. &
1383 j_col_global == buffer_rec(iproc)%indx(i_entry_rec, 2))
THEN
1385 fm_matrix_l%local_data(i_row, j_col) = buffer_rec(iproc)%msg(i_entry_rec)
1397 CALL timestop(handle2)
1399 CALL timeset(routinen//
"_10", handle2)
1401 DO iproc = 0, para_env%num_pe - 1
1402 DEALLOCATE (buffer_rec(iproc)%msg)
1403 DEALLOCATE (buffer_rec(iproc)%indx)
1404 DEALLOCATE (buffer_send(iproc)%msg)
1405 DEALLOCATE (buffer_send(iproc)%indx)
1408 DEALLOCATE (buffer_rec, buffer_send)
1409 DEALLOCATE (req_array)
1410 DEALLOCATE (entry_counter)
1411 DEALLOCATE (num_entries_rec, num_entries_send)
1413 CALL timestop(handle2)
1415 CALL timestop(handle)
1417 END SUBROUTINE fill_fm_l_from_l_loc_non_blocking
1425 SUBROUTINE cholesky_decomp(fm_matrix_L, dimen_RI, do_inversion)
1427 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1428 INTEGER,
INTENT(IN) :: dimen_ri
1429 LOGICAL,
INTENT(IN) :: do_inversion
1431 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cholesky_decomp'
1433 INTEGER :: handle, i_global, iib, info_chol, &
1434 j_global, jjb, ncol_local, nrow_local
1435 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1437 CALL timeset(routinen, handle)
1440 CALL cp_fm_cholesky_decompose(matrix=fm_matrix_l, n=dimen_ri, info_out=info_chol)
1441 cpassert(info_chol == 0)
1443 IF (.NOT. do_inversion)
THEN
1445 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1446 nrow_local=nrow_local, &
1447 ncol_local=ncol_local, &
1448 row_indices=row_indices, &
1449 col_indices=col_indices)
1450 DO iib = 1, nrow_local
1451 i_global = row_indices(iib)
1452 DO jjb = 1, ncol_local
1453 j_global = col_indices(jjb)
1454 IF (j_global < i_global) fm_matrix_l%local_data(iib, jjb) = 0.0_dp
1460 CALL timestop(handle)
1462 END SUBROUTINE cholesky_decomp
1473 dimen_RI, kpoints, eps_eigval_S)
1475 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: fm_matrix_minv_l_kpoints, &
1477 INTEGER,
INTENT(IN) :: dimen_ri
1478 TYPE(kpoint_type),
POINTER :: kpoints
1479 REAL(kind=dp),
INTENT(IN) :: eps_eigval_s
1481 CHARACTER(LEN=*),
PARAMETER :: routinen =
'inversion_of_M_and_mult_with_chol_dec_of_V'
1482 COMPLEX(KIND=dp),
PARAMETER :: cone = cmplx(1.0_dp, 0.0_dp, kind=dp), &
1483 czero = cmplx(0.0_dp, 0.0_dp, kind=dp), ione = cmplx(0.0_dp, 1.0_dp, kind=dp)
1485 INTEGER :: handle, ikp, nkp
1486 TYPE(cp_cfm_type) :: cfm_matrix_k_tmp, cfm_matrix_m_tmp, &
1487 cfm_matrix_v_tmp, cfm_matrix_vtrunc_tmp
1488 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
1490 CALL timeset(routinen, handle)
1492 CALL cp_fm_get_info(fm_matrix_minv_l_kpoints(1, 1), matrix_struct=matrix_struct)
1494 CALL cp_cfm_create(cfm_matrix_m_tmp, matrix_struct)
1495 CALL cp_cfm_create(cfm_matrix_v_tmp, matrix_struct)
1496 CALL cp_cfm_create(cfm_matrix_k_tmp, matrix_struct)
1497 CALL cp_cfm_create(cfm_matrix_vtrunc_tmp, matrix_struct)
1499 CALL get_kpoint_info(kpoints, nkp=nkp)
1503 CALL cp_cfm_scale_and_add_fm(czero, cfm_matrix_m_tmp, cone, fm_matrix_minv_l_kpoints(ikp, 1))
1504 CALL cp_cfm_scale_and_add_fm(cone, cfm_matrix_m_tmp, ione, fm_matrix_minv_l_kpoints(ikp, 2))
1506 CALL cp_cfm_scale_and_add_fm(czero, cfm_matrix_v_tmp, cone, fm_matrix_l_kpoints(ikp, 1))
1507 CALL cp_cfm_scale_and_add_fm(cone, cfm_matrix_v_tmp, ione, fm_matrix_l_kpoints(ikp, 2))
1509 CALL cp_cfm_power(cfm_matrix_m_tmp, threshold=eps_eigval_s, exponent=-1.0_dp)
1511 CALL cp_cfm_power(cfm_matrix_v_tmp, threshold=0.0_dp, exponent=0.5_dp)
1514 CALL cp_cfm_to_fm(cfm_matrix_v_tmp, fm_matrix_l_kpoints(ikp, 1), fm_matrix_l_kpoints(ikp, 2))
1517 CALL parallel_gemm(
"N",
"C", dimen_ri, dimen_ri, dimen_ri, cone, cfm_matrix_m_tmp, cfm_matrix_v_tmp, &
1518 czero, cfm_matrix_k_tmp)
1521 CALL cp_cfm_to_fm(cfm_matrix_k_tmp, fm_matrix_minv_l_kpoints(ikp, 1), fm_matrix_minv_l_kpoints(ikp, 2))
1525 CALL cp_cfm_release(cfm_matrix_m_tmp)
1526 CALL cp_cfm_release(cfm_matrix_v_tmp)
1527 CALL cp_cfm_release(cfm_matrix_k_tmp)
1528 CALL cp_cfm_release(cfm_matrix_vtrunc_tmp)
1530 CALL timestop(handle)
1540 SUBROUTINE gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc(fm_matrix_Minv_Vtrunc_Minv, &
1541 fm_matrix_Minv, qs_env)
1543 TYPE(cp_fm_type),
DIMENSION(:, :) :: fm_matrix_minv_vtrunc_minv, &
1545 TYPE(qs_environment_type),
POINTER :: qs_env
1547 CHARACTER(LEN=*),
PARAMETER :: &
1548 routinen =
'Gamma_only_inversion_of_M_and_mult_with_chol_dec_of_Vtrunc'
1550 INTEGER :: dimen_ri, handle, ndep
1551 REAL(kind=dp) :: eps_eigval_s_gamma
1552 TYPE(cp_fm_type) :: fm_matrix_ri_metric_inv_work, fm_work
1554 CALL timeset(routinen, handle)
1556 CALL cp_fm_create(fm_work, fm_matrix_minv(1, 1)%matrix_struct)
1557 CALL cp_fm_set_all(fm_work, 0.0_dp)
1559 CALL cp_fm_create(fm_matrix_ri_metric_inv_work, fm_matrix_minv(1, 1)%matrix_struct)
1560 CALL cp_fm_set_all(fm_matrix_ri_metric_inv_work, 0.0_dp)
1562 CALL cp_fm_get_info(matrix=fm_matrix_minv(1, 1), nrow_global=dimen_ri)
1564 eps_eigval_s_gamma = qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S_Gamma
1566 IF (eps_eigval_s_gamma > 1.0e-18)
THEN
1569 CALL cp_fm_power(fm_matrix_minv(1, 1), fm_matrix_ri_metric_inv_work, -0.5_dp, &
1570 eps_eigval_s_gamma, ndep)
1574 CALL cholesky_decomp(fm_matrix_minv(1, 1), dimen_ri, do_inversion=.true.)
1576 CALL invert_mat(fm_matrix_minv(1, 1))
1580 CALL parallel_gemm(
'N',
'T', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_minv(1, 1), &
1581 fm_matrix_minv(1, 1), 0.0_dp, fm_matrix_ri_metric_inv_work)
1583 CALL cp_fm_to_fm(fm_matrix_ri_metric_inv_work, fm_matrix_minv(1, 1))
1585 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_matrix_ri_metric_inv_work, &
1586 fm_matrix_minv_vtrunc_minv(1, 1), 0.0_dp, fm_work)
1588 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work, &
1589 fm_matrix_ri_metric_inv_work, 0.0_dp, fm_matrix_minv_vtrunc_minv(1, 1))
1591 CALL cp_fm_release(fm_work)
1592 CALL cp_fm_release(fm_matrix_ri_metric_inv_work)
1594 CALL timestop(handle)
1596 END SUBROUTINE gamma_only_inversion_of_m_and_mult_with_chol_dec_of_vtrunc
1605 rel_cutoff_trunc_coulomb_ri_x)
1606 TYPE(qs_environment_type),
POINTER :: qs_env
1607 TYPE(libint_potential_type),
OPTIONAL :: trunc_coulomb
1608 REAL(kind=dp),
OPTIONAL :: rel_cutoff_trunc_coulomb_ri_x
1610 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_trunc_coulomb_pot_for_exchange_self_energy'
1613 INTEGER,
DIMENSION(3) :: periodic
1614 REAL(kind=dp) :: my_rel_cutoff_trunc_coulomb_ri_x, shortest_dist_cell_planes
1615 TYPE(cell_type),
POINTER :: cell
1617 CALL timeset(routinen, handle)
1620 CALL get_qs_env(qs_env, cell=cell)
1622 CALL get_cell(cell=cell, periodic=periodic)
1624 shortest_dist_cell_planes = 1.0e4_dp
1625 IF (periodic(1) == 1)
THEN
1626 IF (shortest_dist_cell_planes > plane_distance(1, 0, 0, cell))
THEN
1627 shortest_dist_cell_planes = plane_distance(1, 0, 0, cell)
1630 IF (periodic(2) == 1)
THEN
1631 IF (shortest_dist_cell_planes > plane_distance(0, 1, 0, cell))
THEN
1632 shortest_dist_cell_planes = plane_distance(0, 1, 0, cell)
1635 IF (periodic(3) == 1)
THEN
1636 IF (shortest_dist_cell_planes > plane_distance(0, 0, 1, cell))
THEN
1637 shortest_dist_cell_planes = plane_distance(0, 0, 1, cell)
1641 IF (
PRESENT(rel_cutoff_trunc_coulomb_ri_x))
THEN
1642 my_rel_cutoff_trunc_coulomb_ri_x = rel_cutoff_trunc_coulomb_ri_x
1644 my_rel_cutoff_trunc_coulomb_ri_x = qs_env%mp2_env%ri_rpa_im_time%rel_cutoff_trunc_coulomb_ri_x
1647 IF (
PRESENT(trunc_coulomb))
THEN
1648 trunc_coulomb%potential_type = do_potential_truncated
1649 trunc_coulomb%cutoff_radius = shortest_dist_cell_planes*my_rel_cutoff_trunc_coulomb_ri_x
1650 trunc_coulomb%filename =
"t_c_g.dat"
1652 trunc_coulomb%omega = 0.0_dp
1655 CALL timestop(handle)
1663 SUBROUTINE invert_mat(fm_matrix_L)
1665 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1667 CHARACTER(LEN=*),
PARAMETER :: routinen =
'invert_mat'
1669 INTEGER :: handle, i_global, iib, j_global, jjb, &
1670 ncol_local, nrow_local
1671 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1673 CALL timeset(routinen, handle)
1675 CALL cp_fm_triangular_invert(matrix_a=fm_matrix_l, uplo_tr=
'U')
1678 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1679 nrow_local=nrow_local, &
1680 ncol_local=ncol_local, &
1681 row_indices=row_indices, &
1682 col_indices=col_indices)
1683 DO iib = 1, nrow_local
1684 i_global = row_indices(iib)
1685 DO jjb = 1, ncol_local
1686 j_global = col_indices(jjb)
1687 IF (j_global < i_global) fm_matrix_l%local_data(iib, jjb) = 0.0_dp
1691 CALL timestop(handle)
1693 END SUBROUTINE invert_mat
1704 SUBROUTINE create_matrix_l(fm_matrix_L, blacs_env_L, dimen_RI, para_env_L, name, fm_matrix_L_extern)
1705 TYPE(cp_fm_type),
INTENT(OUT) :: fm_matrix_l
1706 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_l
1707 INTEGER,
INTENT(IN) :: dimen_ri
1708 TYPE(mp_para_env_type),
POINTER :: para_env_l
1709 CHARACTER(LEN=*),
INTENT(IN) :: name
1710 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: fm_matrix_l_extern
1712 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_matrix_L'
1715 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
1717 CALL timeset(routinen, handle)
1720 IF (
PRESENT(fm_matrix_l_extern))
THEN
1721 CALL cp_fm_create(fm_matrix_l, fm_matrix_l_extern%matrix_struct, name=name)
1724 CALL cp_fm_struct_create(fm_struct, context=blacs_env_l, nrow_global=dimen_ri, &
1725 ncol_global=dimen_ri, para_env=para_env_l)
1727 CALL cp_fm_create(fm_matrix_l, fm_struct, name=name)
1729 CALL cp_fm_struct_release(fm_struct)
1732 CALL cp_fm_set_all(matrix=fm_matrix_l, alpha=0.0_dp)
1734 CALL timestop(handle)
1736 END SUBROUTINE create_matrix_l
1746 SUBROUTINE grep_lcols(fm_matrix_L, &
1747 my_group_L_start, my_group_L_end, my_group_L_size, my_Lrows)
1748 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_l
1749 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, &
1751 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :), &
1752 INTENT(OUT) :: my_lrows
1754 CHARACTER(LEN=*),
PARAMETER :: routinen =
'grep_Lcols'
1756 INTEGER :: dimen_ri, handle, handle2, i_global, iib, j_global, jjb, max_row_col_local, &
1757 ncol_local, ncol_rec, nrow_local, nrow_rec, proc_receive_static, proc_send_static, &
1759 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: local_col_row_info, rec_col_row_info
1760 INTEGER,
DIMENSION(:),
POINTER :: col_indices, col_indices_rec, &
1761 row_indices, row_indices_rec
1762 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: local_l, rec_l
1763 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :), &
1764 POINTER :: local_l_internal
1765 TYPE(mp_para_env_type),
POINTER :: para_env
1767 CALL timeset(routinen, handle)
1769 CALL cp_fm_get_info(matrix=fm_matrix_l, &
1770 nrow_local=nrow_local, &
1771 ncol_local=ncol_local, &
1772 row_indices=row_indices, &
1773 col_indices=col_indices, &
1774 nrow_global=dimen_ri, &
1775 local_data=local_l_internal, &
1778 ALLOCATE (my_lrows(dimen_ri, my_group_l_size))
1781 ALLOCATE (local_l(nrow_local, ncol_local))
1782 local_l(:, :) = local_l_internal(1:nrow_local, 1:ncol_local)
1784 max_row_col_local = max(nrow_local, ncol_local)
1785 CALL para_env%max(max_row_col_local)
1787 ALLOCATE (local_col_row_info(0:max_row_col_local, 2))
1788 local_col_row_info = 0
1790 local_col_row_info(0, 1) = nrow_local
1791 local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
1793 local_col_row_info(0, 2) = ncol_local
1794 local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
1796 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
1799 DO jjb = 1, ncol_local
1800 j_global = col_indices(jjb)
1801 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
1802 DO iib = 1, nrow_local
1803 i_global = row_indices(iib)
1804 my_lrows(i_global, j_global - my_group_l_start + 1) = local_l(iib, jjb)
1809 proc_send_static =
modulo(para_env%mepos + 1, para_env%num_pe)
1810 proc_receive_static =
modulo(para_env%mepos - 1, para_env%num_pe)
1812 CALL timeset(routinen//
"_comm", handle2)
1814 DO proc_shift = 1, para_env%num_pe - 1
1816 rec_col_row_info = 0
1817 CALL para_env%sendrecv(local_col_row_info, proc_send_static, rec_col_row_info, proc_receive_static)
1818 nrow_rec = rec_col_row_info(0, 1)
1819 ncol_rec = rec_col_row_info(0, 2)
1821 ALLOCATE (row_indices_rec(nrow_rec))
1822 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1824 ALLOCATE (col_indices_rec(ncol_rec))
1825 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1827 ALLOCATE (rec_l(nrow_rec, ncol_rec))
1831 CALL para_env%sendrecv(local_l, proc_send_static, rec_l, proc_receive_static)
1834 DO jjb = 1, ncol_rec
1835 j_global = col_indices_rec(jjb)
1836 IF (j_global >= my_group_l_start .AND. j_global <= my_group_l_end)
THEN
1837 DO iib = 1, nrow_rec
1838 i_global = row_indices_rec(iib)
1839 my_lrows(i_global, j_global - my_group_l_start + 1) = rec_l(iib, jjb)
1844 local_col_row_info(:, :) = rec_col_row_info
1845 CALL move_alloc(rec_l, local_l)
1847 DEALLOCATE (col_indices_rec)
1848 DEALLOCATE (row_indices_rec)
1850 CALL timestop(handle2)
1852 DEALLOCATE (local_col_row_info)
1853 DEALLOCATE (rec_col_row_info)
1854 DEALLOCATE (local_l)
1856 CALL timestop(handle)
1858 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...
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
integer function, public cp_fm_indxg2p(INDXGLOB, NB, IPROC, ISRCPROC, NPROCS)
wrapper to scalapack function INDXG2P that computes the process coordinate which possesses the entry ...
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.
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
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 setup_trunc_coulomb_pot_for_exchange_self_energy(qs_env, trunc_coulomb, rel_cutoff_trunc_coulomb_ri_x)
...
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 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, 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 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)
...
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_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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, rhs)
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, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, 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_r3d_rs_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_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
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_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, 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)
...
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_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
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_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_2c_integrals(t2c, filter_eps, qs_env, nl_2c, basis_i, basis_j, potential_parameter, do_kpoints, do_hfx_kpoints, ext_kpoints, regularization_RI)
...
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)
...