int2_rys_compute Subroutine

public subroutine int2_rys_compute(ints, gdat, ppairs, zero_shq, mu2)

Uses

  • proc~~int2_rys_compute~~UsesGraph proc~int2_rys_compute int2_rys_compute module~int2_pairs int2_pairs proc~int2_rys_compute->module~int2_pairs module~precision precision module~int2_pairs->module~precision iso_fortran_env iso_fortran_env module~precision->iso_fortran_env

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(inout) :: ints(*)
type(int2_rys_data_t) :: gdat
type(int2_pair_storage), intent(in) :: ppairs
logical :: zero_shq
real(kind=dp), intent(in), optional :: mu2

Calls

proc~~int2_rys_compute~~CallsGraph proc~int2_rys_compute int2_rys_compute none~evaluate rys_root_t%evaluate proc~int2_rys_compute->none~evaluate

Called by

proc~~int2_rys_compute~~CalledByGraph proc~int2_rys_compute int2_rys_compute none~run_generic int2_compute_t%run_generic none~run_generic->proc~int2_rys_compute proc~ints_exchange ints_exchange none~run_generic->proc~ints_exchange proc~ints_exchange->proc~int2_rys_compute none~run_cam int2_compute_t%run_cam none~run_cam->none~run_generic none~run~6 int2_compute_t%run none~run~6->none~run_generic none~run~6->none~run_cam none~set_screening~2 int2_compute_t%set_screening none~set_screening~2->proc~ints_exchange proc~grd2_driver grd2_driver proc~grd2_driver->proc~ints_exchange proc~fock_jk fock_jk proc~fock_jk->none~run~6 proc~fock_jk->none~set_screening~2 proc~hf_gradient hf_gradient proc~hf_gradient->proc~grd2_driver proc~oqp_tdhf_z_vector oqp_tdhf_z_vector proc~oqp_tdhf_z_vector->none~run~6 proc~oqp_tdhf_z_vector->none~set_screening~2 proc~scf_driver scf_driver proc~scf_driver->none~run~6 proc~scf_driver->none~set_screening~2 proc~tdhf_2e_grad tdhf_2e_grad proc~tdhf_2e_grad->proc~grd2_driver proc~tdhf_energy tdhf_energy proc~tdhf_energy->none~run~6 proc~tdhf_energy->none~set_screening~2 proc~tdhf_mrsf_energy tdhf_mrsf_energy proc~tdhf_mrsf_energy->none~run~6 proc~tdhf_mrsf_energy->none~set_screening~2 proc~tdhf_sf_energy tdhf_sf_energy proc~tdhf_sf_energy->none~run~6 proc~tdhf_sf_energy->none~set_screening~2 proc~hf_energy hf_energy proc~hf_energy->proc~scf_driver proc~tdhf_energy_c tdhf_energy_C proc~tdhf_energy_c->proc~tdhf_energy proc~tdhf_gradient tdhf_gradient proc~tdhf_gradient->proc~tdhf_2e_grad proc~tdhf_mrsf_energy_c tdhf_mrsf_energy_C proc~tdhf_mrsf_energy_c->proc~tdhf_mrsf_energy proc~tdhf_sf_energy_c tdhf_sf_energy_C proc~tdhf_sf_energy_c->proc~tdhf_sf_energy proc~tdhf_z_vector_c tdhf_z_vector_C proc~tdhf_z_vector_c->proc~oqp_tdhf_z_vector proc~tdhf_gradient_c tdhf_gradient_C proc~tdhf_gradient_c->proc~tdhf_gradient

Source Code

  subroutine int2_rys_compute(ints, gdat, ppairs, zero_shq, mu2)

    use int2_pairs, only: int2_pair_storage
    implicit none

    type(int2_rys_data_t) :: gdat
    type(int2_pair_storage), intent(in) :: ppairs
    real(kind=dp), intent(inout) :: ints(*)
    real(kind=dp), intent(in), optional :: mu2
    logical :: zero_shq

    integer :: ijg, klg, maxgg, mmax, ng
    integer :: nmax
    real(kind=dp) :: aa, ab, aandb1, bb, da, db, test
    real(kind=dp) :: pfac, rho
    real(kind=dp) :: p(3), q(3)
    logical :: first
    integer :: id1, id2, ppid_p, ppid_q, npp_p, npp_q
    real(kind=dp) :: mu2_1

    ! Range-separation parameter for Erfc-attenuated integrals
    mu2_1 = 0
    if (present(mu2)) mu2_1 = 1.0d0/mu2

!   Prepare shell block
    call set_shells(gdat)


    id1 = maxval(gdat%id(1:2))
    id2 = minval(gdat%id(1:2))
    npp_p = ppairs%ppid(1,id1*(id1-1)/2+id2)
    ppid_p = ppairs%ppid(2,id1*(id1-1)/2+id2)

    id1 = maxval(gdat%id(3:4))
    id2 = minval(gdat%id(3:4))
    npp_q = ppairs%ppid(1,id1*(id1-1)/2+id2)
    ppid_q = ppairs%ppid(2,id1*(id1-1)/2+id2)

    zero_shq = npp_p*npp_q == 0
    if (zero_shq) return

    nmax = gdat%am(1)+gdat%am(2)+1
    mmax = gdat%am(3)+gdat%am(4)+1

    maxgg = MAXCONTR/gdat%nroots

!   Pair of k,l primitives

    first = .true.
    zero_shq = .true.
    ng = 0

    do klg = 1, npp_q
      db = ppairs%k(ppid_q-1+klg)*ppairs%ginv(ppid_q-1+klg)
      bb = ppairs%g(ppid_q-1+klg)
      q = ppairs%P(:,ppid_q-1+klg)

!     Pair of i,j primitives
      do ijg = 1, npp_p
        da = ppairs%k(ppid_p-1+ijg)*ppairs%ginv(ppid_p-1+ijg)
        aa = ppairs%g(ppid_p-1+ijg)
        p = ppairs%P(:,ppid_p-1+ijg)

        ! 2nd term is used for Erfc-attenuated integrals
        ! It is zero for regular integrals
        ab = (aa+bb) + aa*bb*mu2_1

        pfac = da*db
        test = pfac*pfac

        if (test<gdat%quartet_cutoff*ab) cycle

        ng = ng+1

        aandb1 = 1.0_dp/ab
        rho = aa*bb*aandb1

        gdat%abv(1,ng) = ppairs%ginv(ppid_p-1+ijg)
        gdat%abv(2,ng) = ppairs%ginv(ppid_q-1+klg)
        gdat%abv(3,ng) = rho
        gdat%abv(4,ng) = pfac*sqrt(aandb1)
        gdat%abv(5,ng) = aandb1
        gdat%abv(6,ng) = rho*sum((p-q)**2)

        gdat%PQ(:,ng) = p-q

        if (nmax>1) gdat%pb(:,ng) = ppairs%PB(:,ppid_p-1+ijg)
        if (mmax>1) gdat%qd(:,ng) = ppairs%PB(:,ppid_q-1+klg)

        gdat%dij(:,ng) = ppairs%PA(:,ppid_p-1+ijg)-ppairs%PB(:,ppid_p-1+ijg)
        gdat%dkl(:,ng) = ppairs%PA(:,ppid_q-1+klg)-ppairs%PB(:,ppid_q-1+klg)

        if (ng==maxgg) then
          if (ng/=0) then
            if (first) call clear_ints(gdat, ints)
            first = .false.
            call compute(gdat, ng, nmax, mmax, ints)
            ng = 0
            zero_shq = .false.
          end if
        end if

      end do
    end do
    if (ng/=0) then
      if (first) call clear_ints(gdat, ints)
      first = .false.
      call compute(gdat, ng, nmax, mmax, ints)
      ng = 0
      zero_shq = .false.
    end if


  end subroutine int2_rys_compute