@brief Compute overlap integrals between CSFs of MRSF-TDDFT using TLF approximation
@details TLF approximation for SF- and LR-TDDFT is introduced in JCTC 15 882 (2019)
@author Seunghoon Lee, Kostantin Komarov
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(information), | intent(in) | :: | infos | |||
real(kind=dp), | intent(in), | dimension(:,:) | :: | s_mo | ||
real(kind=dp), | intent(out), | dimension(:,:) | :: | s_ij | ||
real(kind=dp), | intent(out), | dimension(:,:) | :: | s_ab | ||
real(kind=dp), | intent(out), | dimension(:,:) | :: | s_ia | ||
integer, | intent(in) | :: | ndtlf |
subroutine mrsf_tlf(infos, s_mo, s_ij, s_ab, s_ia, ndtlf) use precision, only: dp use types, only: information implicit none type(information), intent(in) :: infos real(kind=dp), intent(in), dimension(:,:) :: s_mo real(kind=dp), intent(out), dimension(:,:) :: s_ij real(kind=dp), intent(out), dimension(:,:) :: s_ab real(kind=dp), intent(out), dimension(:,:) :: s_ia integer, intent(in) :: ndtlf integer :: nbf, noca, nocb, nvirb, noc integer :: i, i1, i2, ia1, ia2, j1, j2 real(kind=dp) :: precomp, temp1, temp2, tmp, tmp1, tmp2 nbf = infos%basis%nbf noca = infos%mol_prop%nelec_a nocb = infos%mol_prop%nelec_b nvirb = nbf - nocb noc = noca-1 i1 = 0 i2 = 0 ia1 = 0 ia2 = 0 select case (ndtlf) case(0) ! alpha determinant do i1 = 1, noca do i2 = 1, noca call ov_exact(temp1, i1, i2, ia1, ia2, s_mo, 1, noc, 1) s_ij(i1,i2) = temp1 end do end do ! 1-2 det do j1 = 1, nvirb ia1 = nocb+j1 do j2 = 1, nvirb ia2 = nocb+j2 call ov_exact(temp2, i1, i2, ia1, ia2, s_mo, 1, noc, 2) s_ab(j1,j2) = temp2 end do end do case(1) precomp = 1.0_dp do i = 1, noca precomp = precomp*s_mo(i,i) end do ! alpha determinant do i1 = 1, noca do i2 = 1, noca call tlf_exp(tmp, 11, i1, i2, s_mo, precomp, noca, nbf) if (i1/=i2) then tmp = -1.0_dp*tmp end if s_ij(i1,i2) = tmp end do end do precomp = 1.0_dp do i = 1, noca-2 precomp = precomp*s_mo(i,i) end do ! 1-2 det do j1 = 1, nvirb ia1 = nocb+j1 do j2 = 1, nvirb ia2 = nocb+j2 call tlf_exp(tmp, 21, ia1, ia2, s_mo, precomp, noca, nbf) s_ab(j1,j2) = tmp end do end do case (2) precomp = 1.0_dp do i = 1, noca precomp = precomp*s_mo(i,i) enddo ! alpha determinant do i1 = 1, noca do i2 = 1, noca call tlf_exp(tmp1, 11, i1, i2, s_mo, precomp, noca, nbf) call tlf_exp(tmp2, 12, i1, i2, s_mo, precomp, noca, nbf) tmp = tmp1+tmp2 if (i1/=i2) then tmp = -1.0_dp*tmp end if s_ij(i1,i2) = tmp end do end do precomp = 1.d+00 do i = 1, noca-2 precomp = precomp*s_mo(i,i) end do ! 1-2 det do j1 = 1, nvirb ia1 = nocb+j1 do j2 = 1, nvirb ia2 = nocb+j2 call tlf_exp(tmp1, 21, ia1, ia2, s_mo, precomp, noca, nbf) call tlf_exp(tmp2, 22, ia1, ia2, s_mo, precomp, noca, nbf) s_ab(j1,j2) = tmp1+tmp2 end do end do case default error stop "Unknown TLF value (0,1,2)" end select ! alpha determinant do i1 = 1, noca do j1 = 1, nvirb ia1 = nocb+j1 call ov_exact(temp1 ,i1, i2, ia1, ia2, s_mo, 1, noc, 3) s_ia(i1,j1) = temp1 end do end do end subroutine mrsf_tlf