25 USE dbt_api,
ONLY: dbt_get_block,&
26 dbt_iterator_blocks_left,&
27 dbt_iterator_next_block,&
48#include "./base/base_uses.f90"
53 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_tdp_kernel'
80 SUBROUTINE kernel_coulomb_xc(coul_ker, xc_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
89 CHARACTER(len=*),
PARAMETER :: routinen =
'kernel_coulomb_xc'
91 INTEGER :: batch_size, bo(2), handle, i, ibatch, &
92 iex, lb, natom, nbatch, ndo_mo, &
93 ndo_so, nex_atom, nsgfp, ri_atom, &
95 INTEGER,
DIMENSION(:),
POINTER :: blk_size
96 LOGICAL :: do_coulomb, do_sc, do_sf, do_sg, do_tp, &
98 REAL(
dp),
DIMENSION(:, :),
POINTER :: pq
103 NULLIFY (contr1_int, pq, para_env, dist, blk_size)
106 ndo_mo = donor_state%ndo_mo
107 do_xc = xas_tdp_control%do_xc
108 do_sg = xas_tdp_control%do_singlet
109 do_tp = xas_tdp_control%do_triplet
110 do_sc = xas_tdp_control%do_spin_cons
111 do_sf = xas_tdp_control%do_spin_flip
112 ndo_so = ndo_mo;
IF (xas_tdp_control%do_uks) ndo_so = 2*ndo_mo
113 ri_atom = donor_state%at_index
114 CALL get_qs_env(qs_env, natom=natom, para_env=para_env)
115 do_coulomb = xas_tdp_control%do_coulomb
116 dist => donor_state%dbcsr_dist
117 blk_size => donor_state%blk_size
120 IF ((.NOT. do_coulomb) .AND. (.NOT. do_xc))
RETURN
122 CALL timeset(routinen, handle)
125 CALL contract2_ao_to_domo(contr1_int,
"COULOMB", donor_state, xas_tdp_env, xas_tdp_control, qs_env)
128 IF (do_coulomb)
CALL coulomb(coul_ker, contr1_int, dist, blk_size, xas_tdp_env, &
129 xas_tdp_control, qs_env)
138 pq => xas_tdp_env%ri_inv_coul
143 IF (.NOT. xas_tdp_env%fxc_avail)
THEN
148 nex_atom =
SIZE(xas_tdp_env%ex_atom_indices)
151 DO ibatch = 0, nbatch - 1
154 DO iex = bo(1), bo(2)
156 IF (xas_tdp_env%ex_atom_indices(iex) == ri_atom)
THEN
157 source = ibatch*batch_size
166 lb = 1;
IF (do_sf .AND. .NOT. do_sc) lb = 4
167 ub = 2;
IF (do_sc) ub = 3
170 IF (.NOT.
ASSOCIATED(xas_tdp_env%ri_fxc(ri_atom, i)%array))
THEN
171 ALLOCATE (xas_tdp_env%ri_fxc(ri_atom, i)%array(nsgfp, nsgfp))
173 CALL para_env%bcast(xas_tdp_env%ri_fxc(ri_atom, i)%array, source)
176 xas_tdp_env%fxc_avail = .true.
180 IF (do_sg .OR. do_tp)
THEN
181 CALL rcs_xc(xc_ker(1)%matrix, xc_ker(2)%matrix, contr1_int, dist, blk_size, &
182 donor_state, xas_tdp_env, xas_tdp_control, qs_env)
186 CALL sc_os_xc(xc_ker(3)%matrix, contr1_int, dist, blk_size, donor_state, &
187 xas_tdp_env, xas_tdp_control, qs_env)
191 CALL ondiag_sf_os_xc(xc_ker(4)%matrix, contr1_int, dist, blk_size, donor_state, &
192 xas_tdp_env, xas_tdp_control, qs_env)
200 CALL timestop(handle)
215 SUBROUTINE coulomb(coul_ker, contr1_int, dist, blk_size, xas_tdp_env, xas_tdp_control, qs_env)
220 INTEGER,
DIMENSION(:),
POINTER :: blk_size
225 LOGICAL :: quadrants(3)
226 REAL(
dp),
DIMENSION(:, :),
POINTER :: pq
227 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: lhs_int, rhs_int
230 NULLIFY (pq, rhs_int, lhs_int)
233 pq => xas_tdp_env%ri_inv_coul
236 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=dist, &
237 row_blk_size=blk_size, col_blk_size=blk_size)
240 rhs_int => contr1_int
241 ALLOCATE (lhs_int(
SIZE(contr1_int)))
242 CALL copy_ri_contr_int(lhs_int, rhs_int)
247 IF (xas_tdp_control%do_roks)
THEN
248 quadrants = [.true., .true., .true.]
250 quadrants = [.true., .false., .false.]
252 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
253 eps_filter=xas_tdp_control%eps_filter)
257 CALL dbcsr_create(coul_ker, name=
"COULOMB KERNEL", matrix_type=dbcsr_type_symmetric, dist=dist, &
258 row_blk_size=blk_size, col_blk_size=blk_size)
265 END SUBROUTINE coulomb
280 SUBROUTINE sc_os_xc(xc_ker, contr1_int_PQ, dist, blk_size, donor_state, xas_tdp_env, &
281 xas_tdp_control, qs_env)
284 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: contr1_int_pq
286 INTEGER,
DIMENSION(:),
POINTER :: blk_size
292 INTEGER :: ndo_mo, ri_atom
293 LOGICAL :: quadrants(3)
294 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: lhs_int, rhs_int
297 NULLIFY (lhs_int, rhs_int)
300 ndo_mo = donor_state%ndo_mo
301 ri_atom = donor_state%at_index
303 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=dist, &
304 row_blk_size=blk_size, col_blk_size=blk_size)
306 rhs_int => contr1_int_pq
307 ALLOCATE (lhs_int(
SIZE(contr1_int_pq)))
310 IF (xas_tdp_control%do_uks)
THEN
317 quadrants = [.true., .false., .false.]
321 CALL copy_ri_contr_int(lhs_int(1:ndo_mo), rhs_int(1:ndo_mo))
322 CALL ri_all_blocks_mm(lhs_int(1:ndo_mo), xas_tdp_env%ri_fxc(ri_atom, 1)%array)
323 CALL ri_int_product(work_mat, lhs_int(1:ndo_mo), rhs_int(1:ndo_mo), quadrants, qs_env, &
324 eps_filter=xas_tdp_control%eps_filter)
327 quadrants = [.false., .true., .false.]
330 CALL copy_ri_contr_int(lhs_int(1:ndo_mo), rhs_int(1:ndo_mo))
331 CALL ri_all_blocks_mm(lhs_int(1:ndo_mo), xas_tdp_env%ri_fxc(ri_atom, 2)%array)
332 CALL ri_int_product(work_mat, lhs_int(1:ndo_mo), rhs_int(ndo_mo + 1:2*ndo_mo), &
333 quadrants, qs_env, eps_filter=xas_tdp_control%eps_filter)
336 quadrants = [.false., .false., .true.]
339 CALL copy_ri_contr_int(lhs_int(ndo_mo + 1:2*ndo_mo), rhs_int(ndo_mo + 1:2*ndo_mo))
340 CALL ri_all_blocks_mm(lhs_int(ndo_mo + 1:2*ndo_mo), xas_tdp_env%ri_fxc(ri_atom, 3)%array)
341 CALL ri_int_product(work_mat, lhs_int(ndo_mo + 1:2*ndo_mo), rhs_int(ndo_mo + 1:2*ndo_mo), &
342 quadrants, qs_env, eps_filter=xas_tdp_control%eps_filter)
344 ELSE IF (xas_tdp_control%do_roks)
THEN
350 quadrants = [.true., .false., .false.]
353 CALL copy_ri_contr_int(lhs_int, rhs_int)
355 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
356 eps_filter=xas_tdp_control%eps_filter)
359 quadrants = [.false., .true., .false.]
362 CALL copy_ri_contr_int(lhs_int, rhs_int)
364 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
365 eps_filter=xas_tdp_control%eps_filter)
368 quadrants = [.false., .false., .true.]
371 CALL copy_ri_contr_int(lhs_int, rhs_int)
373 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
374 eps_filter=xas_tdp_control%eps_filter)
380 CALL dbcsr_create(xc_ker, name=
"SC OS XC KERNEL", matrix_type=dbcsr_type_symmetric, dist=dist, &
381 row_blk_size=blk_size, col_blk_size=blk_size)
388 END SUBROUTINE sc_os_xc
405 SUBROUTINE ondiag_sf_os_xc(xc_ker, contr1_int_PQ, dist, blk_size, donor_state, xas_tdp_env, &
406 xas_tdp_control, qs_env)
409 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: contr1_int_pq
411 INTEGER,
DIMENSION(:),
POINTER :: blk_size
417 INTEGER :: ndo_mo, ri_atom
418 LOGICAL :: quadrants(3)
419 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: lhs_int, rhs_int
422 NULLIFY (lhs_int, rhs_int)
425 ndo_mo = donor_state%ndo_mo
426 ri_atom = donor_state%at_index
428 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=dist, &
429 row_blk_size=blk_size, col_blk_size=blk_size)
433 rhs_int => contr1_int_pq
434 ALLOCATE (lhs_int(
SIZE(contr1_int_pq)))
435 CALL copy_ri_contr_int(lhs_int, rhs_int)
439 IF (xas_tdp_control%do_uks)
THEN
446 quadrants = [.true., .false., .false.]
447 CALL ri_int_product(work_mat, lhs_int(1:ndo_mo), rhs_int(1:ndo_mo), quadrants, qs_env, &
448 eps_filter=xas_tdp_control%eps_filter)
451 quadrants = [.false., .false., .true.]
452 CALL ri_int_product(work_mat, lhs_int(ndo_mo + 1:2*ndo_mo), rhs_int(ndo_mo + 1:2*ndo_mo), &
453 quadrants, qs_env, eps_filter=xas_tdp_control%eps_filter)
455 ELSE IF (xas_tdp_control%do_roks)
THEN
460 quadrants = [.true., .false., .true.]
461 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
462 eps_filter=xas_tdp_control%eps_filter)
468 CALL dbcsr_create(xc_ker, name=
"ON-DIAG SF OS XC KERNEL", matrix_type=dbcsr_type_symmetric, &
469 dist=dist, row_blk_size=blk_size, col_blk_size=blk_size)
476 END SUBROUTINE ondiag_sf_os_xc
493 SUBROUTINE rcs_xc(sg_xc_ker, tp_xc_ker, contr1_int_PQ, dist, blk_size, donor_state, &
494 xas_tdp_env, xas_tdp_control, qs_env)
496 TYPE(
dbcsr_type),
INTENT(INOUT) :: sg_xc_ker, tp_xc_ker
497 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: contr1_int_pq
499 INTEGER,
DIMENSION(:),
POINTER :: blk_size
505 INTEGER :: nsgfp, ri_atom
506 LOGICAL :: quadrants(3)
507 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fxc
508 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: lhs_int, rhs_int
511 NULLIFY (lhs_int, rhs_int)
514 ri_atom = donor_state%at_index
515 nsgfp =
SIZE(xas_tdp_env%ri_fxc(ri_atom, 1)%array, 1)
516 rhs_int => contr1_int_pq
517 ALLOCATE (lhs_int(
SIZE(contr1_int_pq)))
520 ALLOCATE (fxc(nsgfp, nsgfp))
521 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=dist, &
522 row_blk_size=blk_size, col_blk_size=blk_size)
525 IF (xas_tdp_control%do_singlet)
THEN
528 CALL dcopy(nsgfp*nsgfp, xas_tdp_env%ri_fxc(ri_atom, 1)%array, 1, fxc, 1)
529 CALL daxpy(nsgfp*nsgfp, 1.0_dp, xas_tdp_env%ri_fxc(ri_atom, 2)%array, 1, fxc, 1)
532 CALL copy_ri_contr_int(lhs_int, rhs_int)
536 quadrants = [.true., .false., .false.]
537 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
538 eps_filter=xas_tdp_control%eps_filter)
542 CALL dbcsr_create(sg_xc_ker, name=
"XC SINGLET KERNEL", matrix_type=dbcsr_type_symmetric, &
543 dist=dist, row_blk_size=blk_size, col_blk_size=blk_size)
548 IF (xas_tdp_control%do_triplet)
THEN
551 CALL dcopy(nsgfp*nsgfp, xas_tdp_env%ri_fxc(ri_atom, 1)%array, 1, fxc, 1)
552 CALL daxpy(nsgfp*nsgfp, -1.0_dp, xas_tdp_env%ri_fxc(ri_atom, 2)%array, 1, fxc, 1)
555 CALL copy_ri_contr_int(lhs_int, rhs_int)
559 quadrants = [.true., .false., .false.]
560 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
561 eps_filter=xas_tdp_control%eps_filter)
565 CALL dbcsr_create(tp_xc_ker, name=
"XC TRIPLET KERNEL", matrix_type=dbcsr_type_symmetric, &
566 dist=dist, row_blk_size=blk_size, col_blk_size=blk_size)
576 END SUBROUTINE rcs_xc
603 CHARACTER(len=*),
PARAMETER :: routinen =
'kernel_exchange'
606 INTEGER,
DIMENSION(:),
POINTER :: blk_size
611 NULLIFY (contr1_int, dist, blk_size)
614 IF (.NOT. xas_tdp_control%do_hfx)
RETURN
616 CALL timeset(routinen, handle)
618 dist => donor_state%dbcsr_dist
619 blk_size => donor_state%blk_size
622 do_off_sc = (.NOT. xas_tdp_control%tamm_dancoff) .AND. &
623 (xas_tdp_control%do_spin_cons .OR. xas_tdp_control%do_singlet .OR. xas_tdp_control%do_triplet)
626 CALL contract2_ao_to_domo(contr1_int,
"EXCHANGE", donor_state, xas_tdp_env, xas_tdp_control, qs_env)
629 CALL ondiag_ex(ex_ker(1)%matrix, contr1_int, dist, blk_size, donor_state, xas_tdp_env, &
630 xas_tdp_control, qs_env)
634 CALL offdiag_ex_sc(ex_ker(2)%matrix, contr1_int, dist, blk_size, donor_state, &
635 xas_tdp_env, xas_tdp_control, qs_env)
641 CALL timestop(handle)
660 SUBROUTINE ondiag_ex(ondiag_ex_ker, contr1_int, dist, blk_size, donor_state, xas_tdp_env, &
661 xas_tdp_control, qs_env)
663 TYPE(
dbcsr_type),
INTENT(INOUT) :: ondiag_ex_ker
666 INTEGER,
DIMENSION(:),
POINTER :: blk_size
672 INTEGER :: group, iblk, iso, jblk, jso, nblk, &
673 ndo_mo, ndo_so, nsgfa, nsgfp, ri_atom, &
675 INTEGER,
DIMENSION(:),
POINTER :: col_dist, col_dist_work, row_dist, &
677 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
678 LOGICAL :: do_roks, do_uks, found
679 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: coeffs, ri_coeffs
680 REAL(
dp),
DIMENSION(:, :),
POINTER :: aiq, pblock, pq
684 TYPE(
dbcsr_type) :: abij, mats_desymm, work_mat
687 NULLIFY (para_env, matrix_s, pblock, aiq, row_dist, col_dist, row_dist_work, col_dist_work, pgrid)
694 ndo_mo = donor_state%ndo_mo
695 ri_atom = donor_state%at_index
696 do_roks = xas_tdp_control%do_roks
697 do_uks = xas_tdp_control%do_uks
698 ndo_so = ndo_mo;
IF (do_uks) ndo_so = 2*ndo_mo
699 pq => xas_tdp_env%ri_inv_ex
701 CALL get_qs_env(qs_env, para_env=para_env, matrix_s=matrix_s, natom=nblk)
703 nsgfa =
SIZE(donor_state%contract_coeffs, 1)
704 ALLOCATE (coeffs(nsgfp, ndo_so), ri_coeffs(nsgfp, ndo_so))
712 CALL dbcsr_create(abij, template=mats_desymm, name=
"(ab|IJ)", dist=opt_dbcsr_dist)
721 ALLOCATE (row_dist_work(ndo_so*nblk))
722 ALLOCATE (col_dist_work(ndo_so*nblk))
724 row_dist_work((iso - 1)*nblk + 1:iso*nblk) = row_dist(:)
725 col_dist_work((iso - 1)*nblk + 1:iso*nblk) = col_dist(:)
729 col_dist=col_dist_work)
731 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=work_dbcsr_dist, &
732 row_blk_size=blk_size, col_blk_size=blk_size)
739 IF (para_env%mepos == source)
THEN
742 ALLOCATE (aiq(nsgfa, nsgfp))
744 CALL para_env%bcast(aiq, source)
747 CALL dgemm(
'T',
'N', nsgfp, ndo_so, nsgfa, 1.0_dp, aiq, nsgfa, donor_state%contract_coeffs, &
748 nsgfa, 0.0_dp, coeffs, nsgfp)
751 CALL dgemm(
'N',
'N', nsgfp, ndo_so, nsgfp, 1.0_dp, pq, nsgfp, coeffs, nsgfp, 0.0_dp, &
754 IF (.NOT. para_env%mepos == source)
DEALLOCATE (aiq)
760 IF (do_uks .AND. (iso <= ndo_mo .AND. jso > ndo_mo)) cycle
764 CALL contract3_ri_to_domos(xas_tdp_env%ri_3c_ex, ri_coeffs(:, jso), abij, ri_atom)
771 IF (iso == jso .AND. jblk < iblk) cycle
776 CALL dbcsr_put_block(work_mat, (iso - 1)*nblk + iblk, (jso - 1)*nblk + jblk, pblock)
783 (ndo_so + jso - 1)*nblk + jblk, pblock)
794 CALL dbcsr_create(ondiag_ex_ker, name=
"ONDIAG EX KERNEL", matrix_type=dbcsr_type_symmetric, &
795 dist=dist, row_blk_size=blk_size, col_blk_size=blk_size)
803 DEALLOCATE (col_dist_work, row_dist_work)
805 END SUBROUTINE ondiag_ex
821 SUBROUTINE offdiag_ex_sc(offdiag_ex_ker, contr1_int, dist, blk_size, donor_state, xas_tdp_env, &
822 xas_tdp_control, qs_env)
824 TYPE(
dbcsr_type),
INTENT(INOUT) :: offdiag_ex_ker
827 INTEGER,
DIMENSION(:),
POINTER :: blk_size
834 LOGICAL :: do_roks, do_uks, quadrants(3)
835 REAL(
dp),
DIMENSION(:, :),
POINTER :: pq
836 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: lhs_int, rhs_int
839 NULLIFY (pq, lhs_int, rhs_int)
842 ndo_mo = donor_state%ndo_mo
843 do_roks = xas_tdp_control%do_roks
844 do_uks = xas_tdp_control%do_uks
845 pq => xas_tdp_env%ri_inv_ex
847 rhs_int => contr1_int
848 ALLOCATE (lhs_int(
SIZE(contr1_int)))
849 CALL copy_ri_contr_int(lhs_int, rhs_int)
856 CALL dbcsr_create(work_mat, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, dist=dist, &
857 row_blk_size=blk_size, col_blk_size=blk_size)
863 quadrants = [.true., .false., .true.]
864 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
865 eps_filter=xas_tdp_control%eps_filter, mo_transpose=.true.)
867 ELSE IF (do_uks)
THEN
870 quadrants = [.true., .false., .false.]
871 CALL ri_int_product(work_mat, lhs_int(1:ndo_mo), rhs_int(1:ndo_mo), quadrants, &
872 qs_env, eps_filter=xas_tdp_control%eps_filter, mo_transpose=.true.)
874 quadrants = [.false., .false., .true.]
875 CALL ri_int_product(work_mat, lhs_int(ndo_mo + 1:2*ndo_mo), rhs_int(ndo_mo + 1:2*ndo_mo), &
876 quadrants, qs_env, eps_filter=xas_tdp_control%eps_filter, mo_transpose=.true.)
879 quadrants = [.true., .false., .false.]
880 CALL ri_int_product(work_mat, lhs_int, rhs_int, quadrants, qs_env, &
881 eps_filter=xas_tdp_control%eps_filter, mo_transpose=.true.)
886 CALL dbcsr_create(offdiag_ex_ker, name=
"OFFDIAG EX KERNEL", matrix_type=dbcsr_type_symmetric, &
887 dist=dist, row_blk_size=blk_size, col_blk_size=blk_size)
894 END SUBROUTINE offdiag_ex_sc
906 INTEGER,
INTENT(IN) :: ri_atom
909 INTEGER :: i, iblk, jblk, max_nblks, nblks
910 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: reserve_cols, reserve_rows
923 CALL dbcsr_create(work, template=matrix_s(1)%matrix, dist=dist)
931 ALLOCATE (reserve_rows(max_nblks), reserve_cols(max_nblks))
939 IF (iblk == ri_atom .OR. jblk == ri_atom)
THEN
941 reserve_rows(nblks) = iblk
942 reserve_cols(nblks) = jblk
947 DO i = 1,
SIZE(matrices)
948 CALL dbcsr_reserve_blocks(matrices(i)%matrix, rows=reserve_rows(1:nblks), cols=reserve_cols(1:nblks))
975 CHARACTER(len=*),
INTENT(IN) :: op_type
981 CHARACTER(len=*),
PARAMETER :: routinen =
'contract2_AO_to_doMO'
983 INTEGER :: handle, i, imo, ispin, katom, kkind, &
984 natom, ndo_mo, ndo_so, nkind, nspins
985 INTEGER,
DIMENSION(:),
POINTER :: ri_blk_size, std_blk_size
987 REAL(
dp),
DIMENSION(:, :),
POINTER :: coeffs
989 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrices, matrix_s
991 TYPE(dbt_type),
POINTER :: pq_x
996 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
998 NULLIFY (matrix_s, std_blk_size, ri_blk_size, qs_kind_set, ri_basis, pq_x)
999 NULLIFY (ai_p, p_ib, work, matrices, coeffs, opt_dist2d, particle_set)
1001 CALL timeset(routinen, handle)
1004 CALL get_qs_env(qs_env, natom=natom, matrix_s=matrix_s, qs_kind_set=qs_kind_set, para_env=para_env)
1005 ndo_mo = donor_state%ndo_mo
1006 kkind = donor_state%kind_index
1007 katom = donor_state%at_index
1009 pq_x => xas_tdp_env%ri_3c_coul
1010 opt_dist2d => xas_tdp_env%opt_dist2d_coul
1011 IF (op_type ==
"EXCHANGE")
THEN
1012 cpassert(
ASSOCIATED(xas_tdp_env%ri_3c_ex))
1013 pq_x => xas_tdp_env%ri_3c_ex
1014 opt_dist2d => xas_tdp_env%opt_dist2d_ex
1016 do_uks = xas_tdp_control%do_uks
1017 nspins = 1;
IF (do_uks) nspins = 2
1018 ndo_so = nspins*ndo_mo
1021 CALL dbcsr_get_info(matrix_s(1)%matrix, col_blk_size=std_blk_size)
1023 CALL get_qs_env(qs_env, particle_set=particle_set, nkind=nkind)
1024 ALLOCATE (ri_basis(nkind), ri_blk_size(natom))
1026 CALL get_particle_set(particle_set, qs_kind_set, nsgf=ri_blk_size, basis=ri_basis)
1031 ALLOCATE (ai_p, p_ib, work, matrices(2))
1032 CALL dbcsr_create(ai_p, dist=opt_dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, name=
"(aI|P)", &
1033 row_blk_size=std_blk_size, col_blk_size=ri_blk_size)
1035 CALL dbcsr_create(p_ib, dist=opt_dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, name=
"(P|Ib)", &
1036 row_blk_size=ri_blk_size, col_blk_size=std_blk_size)
1039 matrices(1)%matrix => ai_p; matrices(2)%matrix => p_ib
1041 DEALLOCATE (matrices)
1044 ALLOCATE (contr_int(ndo_so))
1046 ALLOCATE (contr_int(i)%matrix)
1047 CALL dbcsr_create(matrix=contr_int(i)%matrix, template=matrix_s(1)%matrix, &
1048 matrix_type=dbcsr_type_no_symmetry, row_blk_size=std_blk_size, &
1049 col_blk_size=ri_blk_size)
1053 coeffs => donor_state%contract_coeffs
1055 DO ispin = 1, nspins
1062 CALL contract2_ao_to_domo_low(pq_x, coeffs(:, (ispin - 1)*ndo_mo + imo), ai_p, p_ib, katom)
1066 CALL dbcsr_add(work, ai_p, 1.0_dp, 1.0_dp)
1068 CALL dbcsr_filter(contr_int((ispin - 1)*ndo_mo + imo)%matrix, 1.0e-16_dp)
1078 DEALLOCATE (ri_blk_size, ai_p, p_ib, work, ri_basis)
1080 CALL timestop(handle)
1093 SUBROUTINE contract3_ri_to_domos(ab_Q, vec, mat_abIJ, atom_k)
1095 TYPE(dbt_type) :: ab_q
1096 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: vec
1098 INTEGER,
INTENT(IN) :: atom_k
1100 CHARACTER(len=*),
PARAMETER :: routinen =
'contract3_RI_to_doMOs'
1102 INTEGER :: handle, i, iatom, ind(3), j, jatom, katom
1103 LOGICAL :: found, t_found
1105 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: iabc
1106 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pblock
1108 TYPE(dbt_iterator_type) :: iter
1112 CALL timeset(routinen, handle)
1117 CALL dbt_iterator_start(iter, ab_q)
1118 DO WHILE (dbt_iterator_blocks_left(iter))
1119 CALL dbt_iterator_next_block(iter, ind)
1125 IF (.NOT. atom_k == katom) cycle
1128 IF (iatom == jatom) prefac = 0.5_dp
1130 CALL dbt_get_block(ab_q, ind, iabc, t_found)
1133 IF ((.NOT. found) .OR. (.NOT. t_found)) cycle
1135 DO i = 1,
SIZE(pblock, 1)
1136 DO j = 1,
SIZE(pblock, 2)
1138 pblock(i, j) = pblock(i, j) + prefac*dot_product(vec(:), iabc(i, j, :))
1144 CALL dbt_iterator_stop(iter)
1150 CALL dbcsr_add(mat_abij, work, 1.0_dp, 1.0_dp)
1153 CALL timestop(handle)
1155 END SUBROUTINE contract3_ri_to_domos
1173 SUBROUTINE contract2_ao_to_domo_low(ab_Q, vec, mat_aIb, mat_bIa, atom_k)
1175 TYPE(dbt_type) :: ab_q
1176 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: vec
1177 TYPE(
dbcsr_type),
INTENT(INOUT) :: mat_aib, mat_bia
1178 INTEGER,
INTENT(IN) :: atom_k
1180 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract2_AO_to_doMO_low'
1182 INTEGER :: handle, i, iatom, ind(3), j, jatom, &
1184 INTEGER,
DIMENSION(:),
POINTER :: atom_blk_size
1185 LOGICAL :: found, t_found
1186 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: iabc
1187 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
1188 TYPE(dbt_iterator_type) :: iter
1190 NULLIFY (atom_blk_size, pblock)
1192 CALL timeset(routinen, handle)
1199 CALL dbt_iterator_start(iter, ab_q)
1200 DO WHILE (dbt_iterator_blocks_left(iter))
1201 CALL dbt_iterator_next_block(iter, ind)
1207 IF (atom_k /= katom) cycle
1209 CALL dbt_get_block(ab_q, ind, iabc, t_found)
1210 IF (.NOT. t_found) cycle
1213 IF (jatom == atom_k)
THEN
1214 s1 = atom_blk_size(iatom)
1217 CALL dbcsr_get_block_p(matrix=mat_aib, row=iatom, col=jatom, block=pblock, found=found)
1223 pblock(i, j) = pblock(i, j) + dot_product(vec, iabc(i, :, j))
1230 IF (iatom == jatom) cycle
1231 IF (iatom == atom_k)
THEN
1233 s2 = atom_blk_size(jatom)
1235 CALL dbcsr_get_block_p(matrix=mat_bia, row=iatom, col=jatom, block=pblock, found=found)
1241 pblock(i, j) = pblock(i, j) + dot_product(vec, iabc(:, j, i))
1249 CALL dbt_iterator_stop(iter)
1252 CALL timestop(handle)
1254 END SUBROUTINE contract2_ao_to_domo_low
1266 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: pq
1268 INTEGER :: iblk, imo, jblk, ndo_mo, s1, s2
1270 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: work
1271 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
1276 ndo_mo =
SIZE(contr_int)
1286 s1 =
SIZE(pblock, 1)
1287 s2 =
SIZE(pblock, 2)
1288 ALLOCATE (work(s1, s2))
1289 CALL dgemm(
'N',
'N', s1, s2, s2, 1.0_dp, pblock, s1, pq, s2, 0.0_dp, work, s1)
1290 CALL dcopy(s1*s2, work, 1, pblock, 1)
1306 SUBROUTINE copy_ri_contr_int(new_int, ref_int)
1308 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: new_int
1309 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: ref_int
1311 INTEGER :: iso, ndo_so
1313 cpassert(
SIZE(new_int) ==
SIZE(ref_int))
1314 ndo_so =
SIZE(ref_int)
1317 IF (.NOT.
ASSOCIATED(new_int(iso)%matrix))
ALLOCATE (new_int(iso)%matrix)
1318 CALL dbcsr_copy(new_int(iso)%matrix, ref_int(iso)%matrix)
1321 END SUBROUTINE copy_ri_contr_int
1337 SUBROUTINE ri_int_product(kernel, lhs_int, rhs_int, quadrants, qs_env, eps_filter, mo_transpose)
1340 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: lhs_int, rhs_int
1341 LOGICAL,
DIMENSION(3),
INTENT(IN) :: quadrants
1343 REAL(
dp),
INTENT(IN),
OPTIONAL :: eps_filter
1344 LOGICAL,
INTENT(IN),
OPTIONAL :: mo_transpose
1346 INTEGER :: i, iblk, iso, j, jblk, jso, nblk, ndo_so
1347 LOGICAL :: found, my_mt
1348 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
1353 NULLIFY (matrix_s, pblock)
1356 cpassert(
SIZE(lhs_int) ==
SIZE(rhs_int))
1357 cpassert(any(quadrants))
1358 ndo_so =
SIZE(lhs_int)
1359 CALL get_qs_env(qs_env, matrix_s=matrix_s, natom=nblk)
1360 CALL dbcsr_create(prod, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1362 IF (
PRESENT(mo_transpose)) my_mt = mo_transpose
1370 IF (.NOT. quadrants(2) .AND. jso < iso) cycle
1378 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, lhs_int(i)%matrix, rhs_int(j)%matrix, &
1379 0.0_dp, prod, filter_eps=eps_filter)
1386 IF ((iso == jso .AND. jblk < iblk) .AND. .NOT. quadrants(2)) cycle
1394 IF (quadrants(1))
THEN
1395 CALL dbcsr_put_block(kernel, (iso - 1)*nblk + iblk, (jso - 1)*nblk + jblk, pblock)
1399 IF (quadrants(2))
THEN
1400 CALL dbcsr_put_block(kernel, (iso - 1)*nblk + iblk, (ndo_so + jso - 1)*nblk + jblk, pblock)
1404 IF (quadrants(3))
THEN
1405 CALL dbcsr_put_block(kernel, (ndo_so + iso - 1)*nblk + iblk, (ndo_so + jso - 1)*nblk + jblk, pblock)
1419 END SUBROUTINE ri_int_product
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_reserve_blocks(matrix, rows, cols)
...
subroutine, public dbcsr_get_stored_coordinates(matrix, row, column, processor)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
integer function, public dbcsr_get_num_blocks(matrix)
...
subroutine, public dbcsr_put_block(matrix, row, col, block, summation)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
This is the start of a dbt_api, all publically needed functions are exported here....
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis, ncgf)
Get the components of a particle set.
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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.
Define the quickstep kind type and their sub types.
All kind of helpful little routines.
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
All the kernel specific subroutines for XAS TDP calculations.
subroutine, public kernel_coulomb_xc(coul_ker, xc_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Computes, if asked for it, the Coulomb and XC kernel matrices, in the usuall matrix format.
subroutine, public contract2_ao_to_domo(contr_int, op_type, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Contract the ri 3-center integrals stored in a tensor with repect to the donor MOs coeffs,...
subroutine, public kernel_exchange(ex_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Computes the exact exchange kernel matrix using RI. Returns an array of 2 matrices,...
subroutine, public reserve_contraction_blocks(matrices, ri_atom, qs_env)
Reserves the blocks in of a dbcsr matrix as needed for RI 3-center contraction (aI|P)
subroutine, public ri_all_blocks_mm(contr_int, pq)
Multiply all the blocks of a contracted RI integral (aI|P) by a matrix of type (P|....
Define XAS TDP control type and associated create, release, etc subroutines, as well as XAS TDP envir...
subroutine, public get_proc_batch_sizes(batch_size, nbatch, nex_atom, nprocs)
Uses heuristics to determine a good batching of the processros for fxc integration.
distributes pairs on a 2d grid of processors
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
Type containing informations about a single donor state.
Type containing control information for TDP XAS calculations.
Type containing informations such as inputs and results for TDP XAS calculations.