37#include "./base/base_uses.f90" 
   42   CHARACTER(len=*), 
PARAMETER, 
PRIVATE :: moduleN = 
'semi_empirical_int_gks' 
   43   LOGICAL, 
PARAMETER, 
PRIVATE          :: debug_this_module = .false.
 
   58   SUBROUTINE rotnuc_gks(sepi, sepj, rij, e1b, e2a, se_int_control)
 
   60      REAL(
dp), 
DIMENSION(3), 
INTENT(IN)                 :: rij
 
   61      REAL(
dp), 
DIMENSION(45), 
INTENT(OUT), 
OPTIONAL     :: e1b, e2a
 
   65      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
   66      REAL(kind=
dp), 
DIMENSION(45, 45)                   :: coul
 
   70      IF (se_int_control%do_ewald_gks) 
THEN 
   72            CALL makecoule(rab, sepi, sepj, coul, se_int_control)
 
   74            CALL makecoule0(sepi, coul, se_int_control)
 
   77         CALL makecoul(rab, sepi, sepj, coul, se_int_control)
 
   81      DO mu = 1, sepi%natorb
 
   84            e1b(i) = -coul(i, 1)*sepj%zeff
 
   89      DO mu = 1, sepj%natorb
 
   92            e2a(i) = -coul(1, i)*sepi%zeff
 
 
  108      REAL(
dp), 
DIMENSION(3), 
INTENT(IN)                 :: rij
 
  109      REAL(
dp), 
DIMENSION(2025), 
INTENT(OUT), 
OPTIONAL   :: w
 
  112      INTEGER                                            :: i, ind1, ind2, lam, mu, nu, sig
 
  113      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  114      REAL(kind=
dp), 
DIMENSION(45, 45)                   :: coul
 
  118      IF (se_int_control%do_ewald_gks) 
THEN 
  120            CALL makecoule(rab, sepi, sepj, coul, se_int_control)
 
  122            CALL makecoule0(sepi, coul, se_int_control)
 
  125         CALL makecoul(rab, sepi, sepj, coul, se_int_control)
 
  130      DO mu = 1, sepi%natorb
 
  134            DO lam = 1, sepj%natorb
 
  138                  w(i) = coul(ind1, ind2)
 
 
  155   SUBROUTINE drotnuc_gks(sepi, sepj, rij, de1b, de2a, se_int_control)
 
  157      REAL(
dp), 
DIMENSION(3), 
INTENT(IN)                 :: rij
 
  158      REAL(
dp), 
DIMENSION(3, 45), 
INTENT(OUT), 
OPTIONAL  :: de1b, de2a
 
  162      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  163      REAL(kind=
dp), 
DIMENSION(3, 45, 45)                :: dcoul
 
  167      IF (se_int_control%do_ewald_gks) 
THEN 
  168         CALL makedcoule(rab, sepi, sepj, dcoul, se_int_control)
 
  170         CALL makedcoul(rab, sepi, sepj, dcoul, se_int_control)
 
  174      DO mu = 1, sepi%natorb
 
  177            de1b(1, i) = dcoul(1, i, 1)*sepj%zeff
 
  178            de1b(2, i) = dcoul(2, i, 1)*sepj%zeff
 
  179            de1b(3, i) = dcoul(3, i, 1)*sepj%zeff
 
  184      DO mu = 1, sepj%natorb
 
  187            de2a(1, i) = dcoul(1, 1, i)*sepi%zeff
 
  188            de2a(2, i) = dcoul(2, 1, i)*sepi%zeff
 
  189            de2a(3, i) = dcoul(3, 1, i)*sepi%zeff
 
 
  205      REAL(
dp), 
DIMENSION(3), 
INTENT(IN)                 :: rij
 
  206      REAL(
dp), 
DIMENSION(3, 2025), 
INTENT(OUT)          :: dw
 
  209      INTEGER                                            :: i, ind1, ind2, lam, mu, nu, sig
 
  210      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  211      REAL(kind=
dp), 
DIMENSION(3, 45, 45)                :: dcoul
 
  215      IF (se_int_control%do_ewald_gks) 
THEN 
  216         CALL makedcoule(rab, sepi, sepj, dcoul, se_int_control)
 
  218         CALL makedcoul(rab, sepi, sepj, dcoul, se_int_control)
 
  223      DO mu = 1, sepi%natorb
 
  227            DO lam = 1, sepj%natorb
 
  231                  dw(1, i) = -dcoul(1, ind1, ind2)
 
  232                  dw(2, i) = -dcoul(2, ind1, ind2)
 
  233                  dw(3, i) = -dcoul(3, ind1, ind2)
 
 
  249   SUBROUTINE makecoul(RAB, sepi, sepj, Coul, se_int_control)
 
  250      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  252      REAL(kind=
dp), 
DIMENSION(45, 45), 
INTENT(OUT)      :: coul
 
  255      INTEGER                                            :: ia, ib, ima, imb, ja, jb, k1, k2, k3, k4
 
  256      LOGICAL                                            :: shortrange
 
  257      REAL(kind=
dp)                                      :: a2, acoula, acoulb, d1, d1f(3), d2, &
 
  258                                                            d2f(3, 3), d3, d3f(3, 3, 3), d4, &
 
  259                                                            d4f(3, 3, 3, 3), f, rr, w, w0, w1, w2, &
 
  261      REAL(kind=
dp), 
DIMENSION(3)                        :: v
 
  262      REAL(kind=
dp), 
DIMENSION(3, 3, 45)                 :: m2a, m2b
 
  263      REAL(kind=
dp), 
DIMENSION(3, 45)                    :: m1a, m1b
 
  264      REAL(kind=
dp), 
DIMENSION(45)                       :: m0a, m0b
 
  266      shortrange = se_int_control%shortrange
 
  267      CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
 
  268      CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
 
  273      rr = sqrt(dot_product(v, v))
 
  275      a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
 
  278      w1 = (1.0_dp + 0.5_dp*w0)
 
  279      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
 
  280      w3 = (w2 + w0**3/6.0_dp)
 
  281      w4 = (w3 + w0**4/30.0_dp)
 
  282      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
 
  286         d1 = -1.0_dp*(-w*w2)/rr**3
 
  287         d2 = 3.0_dp*(-w*w3)/rr**5
 
  288         d3 = -15.0_dp*(-w*w4)/rr**7
 
  289         d4 = 105.0_dp*(-w*w5)/rr**9
 
  291         f = (1.0_dp - w*w1)/rr
 
  292         d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
 
  293         d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
 
  294         d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
 
  295         d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
 
  298      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
 
  301      DO ia = 1, sepi%natorb
 
  306            DO ib = 1, sepj%natorb
 
  310                  w = m0a(ima)*m0b(imb)*f
 
  312                     w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
 
  316                        w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
 
  322                           w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
 
  331                              w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
 
  343   END SUBROUTINE makecoul
 
  354   SUBROUTINE makedcoul(RAB, sepi, sepj, dCoul, se_int_control)
 
  355      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  357      REAL(kind=
dp), 
DIMENSION(3, 45, 45), 
INTENT(OUT)   :: dcoul
 
  360      INTEGER                                            :: ia, ib, ima, imb, ja, jb, k1, k2, k3, k4
 
  361      LOGICAL                                            :: shortrange
 
  362      REAL(kind=
dp) :: a2, acoula, acoulb, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), d4, &
 
  363         d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, rr, tmp, w, w0, w1, w2, w3, w4, w5, w6
 
  364      REAL(kind=
dp), 
DIMENSION(3)                        :: v, wv
 
  365      REAL(kind=
dp), 
DIMENSION(3, 3, 45)                 :: m2a, m2b
 
  366      REAL(kind=
dp), 
DIMENSION(3, 45)                    :: m1a, m1b
 
  367      REAL(kind=
dp), 
DIMENSION(45)                       :: m0a, m0b
 
  369      shortrange = se_int_control%shortrange
 
  370      CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
 
  371      CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
 
  376      rr = sqrt(dot_product(v, v))
 
  378      a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
 
  381      w1 = (1.0_dp + 0.5_dp*w0)
 
  382      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
 
  383      w3 = (w2 + w0**3/6.0_dp)
 
  384      w4 = (w3 + w0**4/30.0_dp)
 
  385      w5 = (w3 + 4.0_dp*w0**4/105.0_dp + w0**5/210.0_dp)
 
  386      w6 = (w3 + 15.0_dp*w0**4/378.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
 
  390         d1 = -1.0_dp*(-w*w2)/rr**3
 
  391         d2 = 3.0_dp*(-w*w3)/rr**5
 
  392         d3 = -15.0_dp*(-w*w4)/rr**7
 
  393         d4 = 105.0_dp*(-w*w5)/rr**9
 
  394         d5 = -945.0_dp*(-w*w6)/rr**11
 
  396         f = (1.0_dp - w*w1)/rr
 
  397         d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
 
  398         d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
 
  399         d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
 
  400         d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
 
  401         d5 = -945.0_dp*(1.0_dp - w*w6)/rr**11
 
  404      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
 
  407      DO ia = 1, sepi%natorb
 
  412            DO ib = 1, sepj%natorb
 
  416                  tmp = m0a(ima)*m0b(imb)
 
  421                     tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
 
  422                     wv(1) = wv(1) + tmp*d2f(1, k1)
 
  423                     wv(2) = wv(2) + tmp*d2f(2, k1)
 
  424                     wv(3) = wv(3) + tmp*d2f(3, k1)
 
  428                        tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
 
  429                        wv(1) = wv(1) + tmp*d3f(1, k1, k2)
 
  430                        wv(2) = wv(2) + tmp*d3f(2, k1, k2)
 
  431                        wv(3) = wv(3) + tmp*d3f(3, k1, k2)
 
  437                           tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
 
  438                           wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
 
  439                           wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
 
  440                           wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
 
  449                              tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
 
  450                              wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
 
  451                              wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
 
  452                              wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
 
  458                  dcoul(1, ima, imb) = wv(1)
 
  459                  dcoul(2, ima, imb) = wv(2)
 
  460                  dcoul(3, ima, imb) = wv(3)
 
  466   END SUBROUTINE makedcoul
 
  479      REAL(
dp), 
DIMENSION(3), 
INTENT(IN)                 :: rijv
 
  480      REAL(
dp), 
INTENT(OUT), 
OPTIONAL                    :: enuc
 
  481      REAL(
dp), 
DIMENSION(3), 
INTENT(OUT), 
OPTIONAL      :: denuc
 
  484      LOGICAL                                            :: l_denuc, l_enuc
 
  485      REAL(
dp)                                           :: alpi, alpj, dscale, rij, scale, zz
 
  486      REAL(kind=
dp), 
DIMENSION(3, 45, 45)                :: dcoul, dcoule
 
  487      REAL(kind=
dp), 
DIMENSION(45, 45)                   :: coul, coule
 
  490      rij = dot_product(rijv, rijv)
 
  492      l_enuc = 
PRESENT(enuc)
 
  493      l_denuc = 
PRESENT(denuc)
 
  498         IF (se_int_control%shortrange) 
THEN 
  500                                           do_ewald_gks=.false., integral_screening=se_int_control%integral_screening, &
 
  502            CALL makecoul(rijv, sepi, sepj, coul, se_int_control_off)
 
  503            IF (l_denuc) 
CALL makedcoul(rijv, sepi, sepj, dcoul, se_int_control_off)
 
  504            IF (se_int_control%do_ewald_gks) 
THEN 
  505               CALL makecoule(rijv, sepi, sepj, coule, se_int_control)
 
  506               IF (l_denuc) 
CALL makedcoule(rijv, sepi, sepj, dcoule, se_int_control)
 
  508               CALL makecoul(rijv, sepi, sepj, coule, se_int_control)
 
  509               IF (l_denuc) 
CALL makedcoul(rijv, sepi, sepj, dcoule, se_int_control)
 
  512            CALL makecoul(rijv, sepi, sepj, coul, se_int_control)
 
  514            IF (l_denuc) 
CALL makedcoul(rijv, sepi, sepj, dcoul, se_int_control)
 
  515            IF (l_denuc) dcoule = dcoul
 
  520         zz = sepi%zeff*sepj%zeff
 
  523         scale = exp(-alpi*rij) + exp(-alpj*rij)
 
  525            enuc = zz*coule(1, 1) + scale*zz*coul(1, 1)
 
  528            dscale = -alpi*exp(-alpi*rij) - alpj*exp(-alpj*rij)
 
  529            denuc(1) = zz*dcoule(1, 1, 1) + dscale*(rijv(1)/rij)*zz*coul(1, 1) + scale*zz*dcoul(1, 1, 1)
 
  530            denuc(2) = zz*dcoule(2, 1, 1) + dscale*(rijv(2)/rij)*zz*coul(1, 1) + scale*zz*dcoul(2, 1, 1)
 
  531            denuc(3) = zz*dcoule(3, 1, 1) + dscale*(rijv(3)/rij)*zz*coul(1, 1) + scale*zz*dcoul(3, 1, 1)
 
  536         IF (se_int_control%do_ewald_gks) 
THEN 
  537            zz = sepi%zeff*sepi%zeff
 
  538            CALL makecoule0(sepi, coule, se_int_control)
 
  540               enuc = zz*coule(1, 1)
 
 
  558   SUBROUTINE makecoule(RAB, sepi, sepj, Coul, se_int_control)
 
  559      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  561      REAL(kind=
dp), 
DIMENSION(45, 45), 
INTENT(OUT)      :: coul
 
  564      INTEGER                                            :: gpt, ima, imb, k1, k2, k3, k4, lp, mp, np
 
  565      INTEGER, 
DIMENSION(:, :), 
POINTER                  :: bds
 
  566      REAL(kind=
dp) :: a2, acoula, acoulb, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
 
  567         d4, d4f(3, 3, 3, 3), f, ff, kr, kr2, r1, r2, r3, r5, r7, r9, rr, ss, w, w0, w1, w2, w3, &
 
  569      REAL(kind=
dp), 
DIMENSION(3)                        :: kk, v
 
  570      REAL(kind=
dp), 
DIMENSION(3, 3, 45)                 :: m2a, m2b
 
  571      REAL(kind=
dp), 
DIMENSION(3, 45)                    :: m1a, m1b
 
  572      REAL(kind=
dp), 
DIMENSION(45)                       :: m0a, m0b
 
  573      REAL(kind=
dp), 
DIMENSION(:, :, :), 
POINTER         :: rho0
 
  579      alpha = se_int_control%ewald_gks%alpha
 
  580      pw_pool => se_int_control%ewald_gks%pw_pool
 
  581      dg => se_int_control%ewald_gks%dg
 
  582      CALL dg_get(dg, dg_rho0=dg_rho0)
 
  583      rho0 => dg_rho0%density%array
 
  584      pw_grid => pw_pool%pw_grid
 
  585      bds => pw_grid%bounds
 
  587      CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
 
  588      CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
 
  593      rr = sqrt(dot_product(v, v))
 
  602      a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
 
  606      w1 = (1.0_dp + 0.5_dp*w0)
 
  607      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
 
  608      w3 = (w2 + w0**3/6.0_dp)
 
  609      w4 = (w3 + w0**4/30.0_dp)
 
  610      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
 
  612      f = (1.0_dp - w*w1)*r1
 
  613      d1 = -1.0_dp*(1.0_dp - w*w2)*r3
 
  614      d2 = 3.0_dp*(1.0_dp - w*w3)*r5
 
  615      d3 = -15.0_dp*(1.0_dp - w*w4)*r7
 
  616      d4 = 105.0_dp*(1.0_dp - w*w5)*r9
 
  620      w0 = 1.0_dp - erfc(kr)
 
  625      d1 = d1 + (-w2 + w0)*r3
 
  626      d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
 
  627      d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
 
  628      d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
 
  630      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
 
  632      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
  633         DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
 
  635            w = m0a(ima)*m0b(imb)*f
 
  637               w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
 
  641                  w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
 
  647                     w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
 
  656                        w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
 
  676      DO gpt = 1, pw_grid%ngpts_cut_local
 
  677         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
 
  678         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
 
  679         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
 
  685         IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
 
  686         kk(:) = pw_grid%g(:, gpt)
 
  687         ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
 
  689         kr = dot_product(kk, v)
 
  695            d1f(k1) = d1f(k1) - kk(k1)*ss*ff
 
  699               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
 
  705                  d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
 
  713                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
 
  721      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
  722         DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
 
  724            w = m0a(ima)*m0b(imb)*f
 
  726               w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
 
  730                  w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
 
  736                     w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
 
  745                        w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
 
  751            coul(ima, imb) = coul(ima, imb) + w
 
  756      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
  757         DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
 
  758            w = -m0a(ima)*m0b(imb)*0.25_dp*
fourpi/(pw_grid%vol*alpha**2)
 
  759            coul(ima, imb) = coul(ima, imb) + w
 
  763   END SUBROUTINE makecoule
 
  774   SUBROUTINE makedcoule(RAB, sepi, sepj, dCoul, se_int_control)
 
  775      REAL(kind=
dp), 
DIMENSION(3)                        :: rab
 
  777      REAL(kind=
dp), 
DIMENSION(3, 45, 45), 
INTENT(OUT)   :: dcoul
 
  780      INTEGER                                            :: gpt, ima, imb, k1, k2, k3, k4, k5, lp, &
 
  782      INTEGER, 
DIMENSION(:, :), 
POINTER                  :: bds
 
  783      REAL(kind=
dp) :: a2, acoula, acoulb, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
 
  784         d4, d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, ff, kr, kr2, r1, r11, r2, r3, r5, r7, r9, &
 
  785         rr, ss, tmp, w, w0, w1, w2, w3, w4, w5, w6
 
  786      REAL(kind=
dp), 
DIMENSION(3)                        :: kk, v, wv
 
  787      REAL(kind=
dp), 
DIMENSION(3, 3, 45)                 :: m2a, m2b
 
  788      REAL(kind=
dp), 
DIMENSION(3, 45)                    :: m1a, m1b
 
  789      REAL(kind=
dp), 
DIMENSION(45)                       :: m0a, m0b
 
  790      REAL(kind=
dp), 
DIMENSION(:, :, :), 
POINTER         :: rho0
 
  796      alpha = se_int_control%ewald_gks%alpha
 
  797      pw_pool => se_int_control%ewald_gks%pw_pool
 
  798      dg => se_int_control%ewald_gks%dg
 
  799      CALL dg_get(dg, dg_rho0=dg_rho0)
 
  800      rho0 => dg_rho0%density%array
 
  801      pw_grid => pw_pool%pw_grid
 
  802      bds => pw_grid%bounds
 
  804      CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
 
  805      CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
 
  810      rr = sqrt(dot_product(v, v))
 
  812      a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
 
  824      w1 = (1.0_dp + 0.5_dp*w0)
 
  825      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
 
  826      w3 = (w2 + w0**3/6.0_dp)
 
  827      w4 = (w3 + w0**4/30.0_dp)
 
  828      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
 
  829      w6 = (w3 + 5.0_dp*w0**4/126.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
 
  831      f = (1.0_dp - w*w1)*r1
 
  832      d1 = -1.0_dp*(1.0_dp - w*w2)*r3
 
  833      d2 = 3.0_dp*(1.0_dp - w*w3)*r5
 
  834      d3 = -15.0_dp*(1.0_dp - w*w4)*r7
 
  835      d4 = 105.0_dp*(1.0_dp - w*w5)*r9
 
  836      d5 = -945.0_dp*(1.0_dp - w*w6)*r11
 
  840      w0 = 1.0_dp - erfc(kr)
 
  845      d1 = d1 + (-w2 + w0)*r3
 
  846      d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
 
  847      d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
 
  848      d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
 
  849      d5 = d5 + (-w2*(945.0_dp + kr2*(630.0_dp + kr2*(252.0_dp + kr2*(72.0_dp + kr2*16.0_dp)))) + 945.0_dp*w0)*r11
 
  851      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
 
  853      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
  854         DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
 
  856            tmp = m0a(ima)*m0b(imb)
 
  862               tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
 
  863               wv(1) = wv(1) + tmp*d2f(1, k1)
 
  864               wv(2) = wv(2) + tmp*d2f(2, k1)
 
  865               wv(3) = wv(3) + tmp*d2f(3, k1)
 
  869                  tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
 
  870                  wv(1) = wv(1) + tmp*d3f(1, k1, k2)
 
  871                  wv(2) = wv(2) + tmp*d3f(2, k1, k2)
 
  872                  wv(3) = wv(3) + tmp*d3f(3, k1, k2)
 
  878                     tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
 
  879                     wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
 
  880                     wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
 
  881                     wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
 
  890                        tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
 
  891                        wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
 
  892                        wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
 
  893                        wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
 
  899            dcoul(1, ima, imb) = wv(1)
 
  900            dcoul(2, ima, imb) = wv(2)
 
  901            dcoul(3, ima, imb) = wv(3)
 
  916      DO gpt = 1, pw_grid%ngpts_cut_local
 
  917         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
 
  918         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
 
  919         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
 
  925         IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
 
  926         kk(:) = pw_grid%g(:, gpt)
 
  927         ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
 
  929         kr = dot_product(kk, v)
 
  935            d1f(k1) = d1f(k1) - kk(k1)*ss*ff
 
  939               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
 
  945                  d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
 
  953                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
 
  963                        d5f(k1, k2, k3, k4, k5) = d5f(k1, k2, k3, k4, k5) - kk(k1)*kk(k2)*kk(k3)*kk(k4)*kk(k5)*ss*ff
 
  971      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
  972         DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
 
  973            tmp = m0a(ima)*m0b(imb)
 
  978               tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
 
  979               wv(1) = wv(1) + tmp*d2f(1, k1)
 
  980               wv(2) = wv(2) + tmp*d2f(2, k1)
 
  981               wv(3) = wv(3) + tmp*d2f(3, k1)
 
  985                  tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
 
  986                  wv(1) = wv(1) + tmp*d3f(1, k1, k2)
 
  987                  wv(2) = wv(2) + tmp*d3f(2, k1, k2)
 
  988                  wv(3) = wv(3) + tmp*d3f(3, k1, k2)
 
  994                     tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
 
  995                     wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
 
  996                     wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
 
  997                     wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
 
 1006                        tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
 
 1007                        wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
 
 1008                        wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
 
 1009                        wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
 
 1015            dcoul(1, ima, imb) = dcoul(1, ima, imb) + wv(1)
 
 1016            dcoul(2, ima, imb) = dcoul(2, ima, imb) + wv(2)
 
 1017            dcoul(3, ima, imb) = dcoul(3, ima, imb) + wv(3)
 
 1021   END SUBROUTINE makedcoule
 
 1038   SUBROUTINE build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
 
 1039      REAL(kind=
dp), 
DIMENSION(3), 
INTENT(OUT)           :: d1f
 
 1040      REAL(kind=
dp), 
DIMENSION(3, 3), 
INTENT(OUT)        :: d2f
 
 1041      REAL(kind=
dp), 
DIMENSION(3, 3, 3), 
INTENT(OUT)     :: d3f
 
 1042      REAL(kind=
dp), 
DIMENSION(3, 3, 3, 3), 
INTENT(OUT)  :: d4f
 
 1043      REAL(kind=
dp), 
DIMENSION(3, 3, 3, 3, 3), &
 
 1044         INTENT(OUT), 
OPTIONAL                           :: d5f
 
 1045      REAL(kind=
dp), 
DIMENSION(3), 
INTENT(IN)            :: v
 
 1046      REAL(kind=
dp), 
INTENT(IN)                          :: d1, d2, d3, d4
 
 1047      REAL(kind=
dp), 
INTENT(IN), 
OPTIONAL                :: d5
 
 1049      INTEGER                                            :: k1, k2, k3, k4, k5
 
 1057         d1f(k1) = d1f(k1) + v(k1)*d1
 
 1061            d2f(k2, k1) = d2f(k2, k1) + v(k1)*v(k2)*d2
 
 1063         d2f(k1, k1) = d2f(k1, k1) + d1
 
 1068               d3f(k3, k2, k1) = d3f(k3, k2, k1) + v(k1)*v(k2)*v(k3)*d3
 
 1071            d3f(k1, k2, k2) = d3f(k1, k2, k2) + w
 
 1072            d3f(k2, k1, k2) = d3f(k2, k1, k2) + w
 
 1073            d3f(k2, k2, k1) = d3f(k2, k2, k1) + w
 
 1080                  d4f(k4, k3, k2, k1) = d4f(k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*d4
 
 1083               d4f(k1, k2, k3, k3) = d4f(k1, k2, k3, k3) + w
 
 1084               d4f(k1, k3, k2, k3) = d4f(k1, k3, k2, k3) + w
 
 1085               d4f(k3, k1, k2, k3) = d4f(k3, k1, k2, k3) + w
 
 1086               d4f(k1, k3, k3, k2) = d4f(k1, k3, k3, k2) + w
 
 1087               d4f(k3, k1, k3, k2) = d4f(k3, k1, k3, k2) + w
 
 1088               d4f(k3, k3, k1, k2) = d4f(k3, k3, k1, k2) + w
 
 1090            d4f(k1, k1, k2, k2) = d4f(k1, k1, k2, k2) + d2
 
 1091            d4f(k1, k2, k1, k2) = d4f(k1, k2, k1, k2) + d2
 
 1092            d4f(k1, k2, k2, k1) = d4f(k1, k2, k2, k1) + d2
 
 1095      IF (
PRESENT(d5f) .AND. 
PRESENT(d5)) 
THEN 
 1103                        d5f(k5, k4, k3, k2, k1) = d5f(k5, k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*v(k5)*d5
 
 1105                     w = v(k1)*v(k2)*v(k3)*d4
 
 1106                     d5f(k1, k2, k3, k4, k4) = d5f(k1, k2, k3, k4, k4) + w
 
 1107                     d5f(k1, k2, k4, k3, k4) = d5f(k1, k2, k4, k3, k4) + w
 
 1108                     d5f(k1, k4, k2, k3, k4) = d5f(k1, k4, k2, k3, k4) + w
 
 1109                     d5f(k4, k1, k2, k3, k4) = d5f(k4, k1, k2, k3, k4) + w
 
 1110                     d5f(k1, k2, k4, k4, k3) = d5f(k1, k2, k4, k4, k3) + w
 
 1111                     d5f(k1, k4, k2, k4, k3) = d5f(k1, k4, k2, k4, k3) + w
 
 1112                     d5f(k4, k1, k2, k4, k3) = d5f(k4, k1, k2, k4, k3) + w
 
 1113                     d5f(k1, k4, k4, k2, k3) = d5f(k1, k4, k4, k2, k3) + w
 
 1114                     d5f(k4, k1, k4, k2, k3) = d5f(k4, k1, k4, k2, k3) + w
 
 1115                     d5f(k4, k4, k1, k2, k3) = d5f(k4, k4, k1, k2, k3) + w
 
 1118                  d5f(k1, k2, k2, k3, k3) = d5f(k1, k2, k2, k3, k3) + w
 
 1119                  d5f(k1, k2, k3, k2, k3) = d5f(k1, k2, k3, k2, k3) + w
 
 1120                  d5f(k1, k2, k3, k3, k2) = d5f(k1, k2, k3, k3, k2) + w
 
 1121                  d5f(k2, k1, k2, k3, k3) = d5f(k2, k1, k2, k3, k3) + w
 
 1122                  d5f(k2, k1, k3, k2, k3) = d5f(k2, k1, k3, k2, k3) + w
 
 1123                  d5f(k2, k1, k3, k3, k2) = d5f(k2, k1, k3, k3, k2) + w
 
 1124                  d5f(k2, k2, k1, k3, k3) = d5f(k2, k2, k1, k3, k3) + w
 
 1125                  d5f(k2, k3, k1, k2, k3) = d5f(k2, k3, k1, k2, k3) + w
 
 1126                  d5f(k2, k3, k1, k3, k2) = d5f(k2, k3, k1, k3, k2) + w
 
 1127                  d5f(k2, k2, k3, k1, k3) = d5f(k2, k2, k3, k1, k3) + w
 
 1128                  d5f(k2, k3, k2, k1, k3) = d5f(k2, k3, k2, k1, k3) + w
 
 1129                  d5f(k2, k3, k3, k1, k2) = d5f(k2, k3, k3, k1, k2) + w
 
 1130                  d5f(k2, k2, k3, k3, k1) = d5f(k2, k2, k3, k3, k1) + w
 
 1131                  d5f(k2, k3, k2, k3, k1) = d5f(k2, k3, k2, k3, k1) + w
 
 1132                  d5f(k2, k3, k3, k2, k1) = d5f(k2, k3, k3, k2, k1) + w
 
 1137   END SUBROUTINE build_d_tensor_gks
 
 1145   SUBROUTINE makecoule0(sepi, Coul, se_int_control)
 
 1147      REAL(kind=
dp), 
DIMENSION(45, 45), 
INTENT(OUT)      :: coul
 
 1150      INTEGER                                            :: gpt, ima, imb, k1, k2, k3, k4, lp, mp, np
 
 1151      INTEGER, 
DIMENSION(:, :), 
POINTER                  :: bds
 
 1152      REAL(kind=
dp)                                      :: alpha, d2f(3, 3), d4f(3, 3, 3, 3), f, &
 
 1154      REAL(kind=
dp), 
DIMENSION(3)                        :: kk
 
 1155      REAL(kind=
dp), 
DIMENSION(3, 3, 45)                 :: m2a
 
 1156      REAL(kind=
dp), 
DIMENSION(3, 45)                    :: m1a
 
 1157      REAL(kind=
dp), 
DIMENSION(45)                       :: m0a
 
 1158      REAL(kind=
dp), 
DIMENSION(:, :, :), 
POINTER         :: rho0
 
 1164      alpha = se_int_control%ewald_gks%alpha
 
 1165      pw_pool => se_int_control%ewald_gks%pw_pool
 
 1166      dg => se_int_control%ewald_gks%dg
 
 1167      CALL dg_get(dg, dg_rho0=dg_rho0)
 
 1168      rho0 => dg_rho0%density%array
 
 1169      pw_grid => pw_pool%pw_grid
 
 1170      bds => pw_grid%bounds
 
 1172      CALL get_se_slater_multipole(sepi, m0a, m1a, m2a)
 
 1178      DO gpt = 1, pw_grid%ngpts_cut_local
 
 1179         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
 
 1180         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
 
 1181         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
 
 1187         IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
 
 1188         kk(:) = pw_grid%g(:, gpt)
 
 1189         ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
 
 1194               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*ff
 
 1201                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*ff
 
 1209      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1210         DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1212            w = m0a(ima)*m0a(imb)*f
 
 1215                  w = w + (m2a(k1, k2, ima)*m0a(imb) - m1a(k1, ima)*m1a(k2, imb) + m0a(ima)*m2a(k1, k2, imb))*d2f(k1, k2)
 
 1223                        w = w + m2a(k1, k2, ima)*m2a(k3, k4, imb)*d4f(k1, k2, k3, k4)
 
 1234      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1235         DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1236            w = -m0a(ima)*m0a(imb)*0.25_dp*
fourpi/(pw_grid%vol*alpha**2)
 
 1237            coul(ima, imb) = coul(ima, imb) + w
 
 1241      DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1242         DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
 
 1244            w = m0a(ima)*m0a(imb)
 
 1245            coul(ima, imb) = coul(ima, imb) - 2.0_dp*alpha*
oorootpi*w
 
 1249               w = w + m1a(k1, ima)*m1a(k1, imb)
 
 1250               w = w - m0a(ima)*m2a(k1, k1, imb)
 
 1251               w = w - m2a(k1, k1, ima)*m0a(imb)
 
 1253            coul(ima, imb) = coul(ima, imb) - 4.0_dp*alpha**3*
oorootpi*w/3.0_dp
 
 1258                  w = w + 2.0_dp*m2a(k1, k2, ima)*m2a(k1, k2, imb)
 
 1259                  w = w + m2a(k1, k1, ima)*m2a(k2, k2, imb)
 
 1262            coul(ima, imb) = coul(ima, imb) - 8.0_dp*alpha**5*
oorootpi*w/5.0_dp
 
 1265   END SUBROUTINE makecoule0
 
 1275   SUBROUTINE get_se_slater_multipole(sepi, M0, M1, M2, ACOUL)
 
 1277      REAL(kind=
dp), 
DIMENSION(45), 
INTENT(OUT)          :: m0
 
 1278      REAL(kind=
dp), 
DIMENSION(3, 45), 
INTENT(OUT)       :: m1
 
 1279      REAL(kind=
dp), 
DIMENSION(3, 3, 45), 
INTENT(OUT)    :: m2
 
 1280      REAL(kind=
dp), 
INTENT(OUT), 
OPTIONAL               :: acoul
 
 1282      INTEGER                                            :: i, j, jint, size_1c_int
 
 1286      size_1c_int = 
SIZE(sepi%w_mpole)
 
 1287      DO jint = 1, size_1c_int
 
 1288         mpole => sepi%w_mpole(jint)%mpole
 
 1291         m0(
indexb(i, j)) = -mpole%cs
 
 1293         m1(1, 
indexb(i, j)) = -mpole%ds(1)
 
 1294         m1(2, 
indexb(i, j)) = -mpole%ds(2)
 
 1295         m1(3, 
indexb(i, j)) = -mpole%ds(3)
 
 1297         m2(1, 1, 
indexb(i, j)) = -mpole%qq(1, 1)/3.0_dp
 
 1298         m2(2, 1, 
indexb(i, j)) = -mpole%qq(2, 1)/3.0_dp
 
 1299         m2(3, 1, 
indexb(i, j)) = -mpole%qq(3, 1)/3.0_dp
 
 1301         m2(1, 2, 
indexb(i, j)) = -mpole%qq(1, 2)/3.0_dp
 
 1302         m2(2, 2, 
indexb(i, j)) = -mpole%qq(2, 2)/3.0_dp
 
 1303         m2(3, 2, 
indexb(i, j)) = -mpole%qq(3, 2)/3.0_dp
 
 1305         m2(1, 3, 
indexb(i, j)) = -mpole%qq(1, 3)/3.0_dp
 
 1306         m2(2, 3, 
indexb(i, j)) = -mpole%qq(2, 3)/3.0_dp
 
 1307         m2(3, 3, 
indexb(i, j)) = -mpole%qq(3, 3)/3.0_dp
 
 1309      IF (
PRESENT(acoul)) acoul = sepi%acoul
 
 1310   END SUBROUTINE get_se_slater_multipole
 
subroutine, public dg_get(dg, dg_rho0)
Get the dg_type.
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public oorootpi
real(kind=dp), parameter, public fourpi
Multipole structure: for multipole (fixed and induced) in FF based MD.
integer, parameter, public do_multipole_none
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Arrays of parameters used in the semi-empirical calculations \References Everywhere in this module TC...
real(kind=dp), parameter, public rij_threshold
integer, dimension(9, 9), public indexb
Integral GKS scheme: The order of the integrals in makeCoul reflects the standard order by MOPAC.
subroutine, public drotnuc_gks(sepi, sepj, rij, de1b, de2a, se_int_control)
Computes the derivatives of the electron-nuclei integrals.
subroutine, public corecore_gks(sepi, sepj, rijv, enuc, denuc, se_int_control)
Computes nuclei-nuclei interactions.
subroutine, public drotint_gks(sepi, sepj, rij, dw, se_int_control)
Computes the derivatives of the electron-electron integrals.
subroutine, public rotnuc_gks(sepi, sepj, rij, e1b, e2a, se_int_control)
Computes the electron-nuclei integrals.
subroutine, public rotint_gks(sepi, sepj, rij, w, se_int_control)
Computes the electron-electron integrals.
Definition of the semi empirical multipole integral expansions types.
Definition of the semi empirical parameter types.
subroutine, public setup_se_int_control_type(se_int_control, shortrange, do_ewald_r3, do_ewald_gks, integral_screening, max_multipole, pc_coulomb_int)
Setup the Semiempirical integral control type.
Type for Gaussian Densities type = type of gaussian (PME) grid = grid number gcc = Gaussian contracti...
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Semi-empirical integral multipole expansion type.