LCOV - code coverage report
Current view: top level - src/aobasis - ai_overlap.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:9ccafda) Lines: 98.1 % 414 406
Test Date: 2026-10-15 00:55:44 Functions: 100.0 % 6 6

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Calculation of the overlap integrals over Cartesian Gaussian-type
      10              : !>      functions.
      11              : !> \par Literature
      12              : !>      S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
      13              : !> \par History
      14              : !>      - Derivatives added (02.05.2002,MK)
      15              : !>      - New OS routine with simpler logic (11.07.2014, JGH)
      16              : !> \author Matthias Krack (08.10.1999)
      17              : ! **************************************************************************************************
      18              : MODULE ai_overlap
      19              :    USE ai_cartesian_operators,          ONLY: apply_cartesian_1d,&
      20              :                                               cartesian_ladder,&
      21              :                                               cartesian_ladder_map
      22              :    USE ai_os_rr,                        ONLY: os_rr_ovlp
      23              :    USE kinds,                           ONLY: dp
      24              :    USE mathconstants,                   ONLY: pi,&
      25              :                                               twopi,&
      26              :                                               z_one
      27              :    USE orbital_pointers,                ONLY: coset,&
      28              :                                               indco,&
      29              :                                               nco,&
      30              :                                               ncoset,&
      31              :                                               nso
      32              :    USE orbital_transformation_matrices, ONLY: orbtramat
      33              : #include "../base/base_uses.f90"
      34              : 
      35              :    IMPLICIT NONE
      36              : 
      37              :    PRIVATE
      38              : 
      39              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_overlap'
      40              : 
      41              : ! *** Public subroutines ***
      42              :    PUBLIC :: overlap, overlap_ab, overlap_aab, overlap_ab_s, overlap_ab_sp, &
      43              :              overlap_abb
      44              : 
      45              : CONTAINS
      46              : 
      47              : ! **************************************************************************************************
      48              : !> \brief   Purpose: Calculation of the two-center overlap integrals [a|b] over
      49              : !>          Cartesian Gaussian-type functions.
      50              : !> \param la_max_set Max L on center A
      51              : !> \param la_min_set Min L on center A
      52              : !> \param npgfa      Number of primitives on center A
      53              : !> \param rpgfa      Range of functions on A, used for screening
      54              : !> \param zeta       Exponents on center A
      55              : !> \param lb_max_set Max L on center B
      56              : !> \param lb_min_set Min L on center B
      57              : !> \param npgfb      Number of primitives on center B
      58              : !> \param rpgfb      Range of functions on B, used for screening
      59              : !> \param zetb       Exponents on center B
      60              : !> \param rab        Distance vector A-B
      61              : !> \param dab        Distance A-B
      62              : !> \param sab        Final Integrals, basic and derivatives
      63              : !> \param da_max_set Some additional derivative information
      64              : !> \param return_derivatives   Return integral derivatives
      65              : !> \param s          Work space
      66              : !> \param lds        Leading dimension of s
      67              : !> \date    19.09.2000
      68              : !> \author  MK
      69              : !> \version 1.0
      70              : ! **************************************************************************************************
      71      2054486 :    SUBROUTINE overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
      72      4108972 :                       lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
      73      2054486 :                       rab, dab, sab, da_max_set, return_derivatives, s, lds)
      74              :       INTEGER, INTENT(IN)                                :: la_max_set, la_min_set, npgfa
      75              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa, zeta
      76              :       INTEGER, INTENT(IN)                                :: lb_max_set, lb_min_set, npgfb
      77              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb, zetb
      78              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
      79              :       REAL(KIND=dp), INTENT(IN)                          :: dab
      80              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: sab
      81              :       INTEGER, INTENT(IN)                                :: da_max_set
      82              :       LOGICAL, INTENT(IN)                                :: return_derivatives
      83              :       INTEGER, INTENT(IN)                                :: lds
      84              :       REAL(KIND=dp), DIMENSION(lds, lds, *), &
      85              :          INTENT(INOUT)                                   :: s
      86              : 
      87              :       INTEGER :: ax, axis, ay, az, bx, by, bz, cda, cdax, cday, cdaz, coa, cob, da, da_max, dax, &
      88              :          day, daz, first, first_b, i, ipgf, j, jk, jpgf, jstart, k, la_max, la_start, last, &
      89              :          last_b, lb_max, lb_start, ldrr, na, nb
      90      2054486 :       INTEGER, ALLOCATABLE                               :: derivative_map(:, :, :)
      91              :       REAL(KIND=dp)                                      :: f0, zetp
      92      2054486 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: rr
      93              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp
      94              : 
      95      2054486 :       da_max = da_max_set
      96      2054486 :       la_max = la_max_set + da_max_set
      97              : 
      98      2054486 :       lb_max = lb_max_set
      99      2054486 :       ldrr = MAX(la_max, lb_max) + 1
     100     10272430 :       ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
     101      2054486 :       IF (da_max > 0) THEN
     102      2557480 :          ALLOCATE (derivative_map(4, ncoset(la_max - 1), 3))
     103      2557480 :          DO axis = 1, 3
     104      2557480 :             CALL cartesian_ladder_map(la_max - 1, 0, axis, derivative_map(:, :, axis))
     105              :          END DO
     106              :       END IF
     107              : 
     108              : !   *** Loop over all pairs of primitive Gaussian-type functions ***
     109              : 
     110      2054486 :       na = 0
     111     10530462 :       DO ipgf = 1, npgfa
     112              : 
     113      8475976 :          nb = 0
     114              : 
     115     22880302 :          DO jpgf = 1, npgfb
     116              : 
     117              : !       *** Screening ***
     118              : 
     119     14404326 :             IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) THEN
     120     51250688 :                DO j = nb + 1, nb + ncoset(lb_max_set)
     121    257999158 :                   DO i = na + 1, na + ncoset(la_max_set)
     122    248641846 :                      sab(i, j) = 0.0_dp
     123              :                   END DO
     124              :                END DO
     125      9357312 :                IF (return_derivatives) THEN
     126     20013030 :                   DO k = 2, ncoset(da_max_set)
     127     10668870 :                      jstart = (k - 1)*SIZE(sab, 1)
     128     62625960 :                      DO j = jstart + nb + 1, jstart + nb + ncoset(lb_max_set)
     129    228142932 :                         DO i = na + 1, na + ncoset(la_max_set)
     130    217474062 :                            sab(i, j) = 0.0_dp
     131              :                         END DO
     132              :                      END DO
     133              :                   END DO
     134              :                END IF
     135      9357312 :                nb = nb + ncoset(lb_max_set)
     136      9357312 :                CYCLE
     137              :             END IF
     138              : 
     139              : !       *** Calculate some prefactors ***
     140              : 
     141      5047014 :             zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
     142              : 
     143      5047014 :             f0 = SQRT((pi*zetp)**3)*EXP(-zeta(ipgf)*zetb(jpgf)*zetp*dab*dab)
     144     20188056 :             rap(:) = zetb(jpgf)*zetp*rab(:)
     145     20188056 :             rbp(:) = -zeta(ipgf)*zetp*rab(:)
     146              : 
     147      5047014 :             CALL os_rr_ovlp(rap, la_max, rbp, lb_max, 1.0_dp/zetp, ldrr, rr)
     148              : 
     149     27860470 :             DO cob = 1, ncoset(lb_max)
     150     22813456 :                bx = indco(1, cob)
     151     22813456 :                by = indco(2, cob)
     152     22813456 :                bz = indco(3, cob)
     153    194897438 :                DO coa = 1, ncoset(la_max)
     154    167036968 :                   ax = indco(1, coa)
     155    167036968 :                   ay = indco(2, coa)
     156    167036968 :                   az = indco(3, coa)
     157    189850424 :                   s(coa, cob, 1) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
     158              :                END DO
     159              :             END DO
     160              : 
     161              : !       *** Store the primitive overlap integrals ***
     162              : 
     163     27860470 :             DO j = 1, ncoset(lb_max_set)
     164    150410612 :                DO i = 1, ncoset(la_max_set)
     165    145363598 :                   sab(na + i, nb + j) = s(i, j, 1)
     166              :                END DO
     167              :             END DO
     168              : 
     169              : !       *** Calculate the requested derivatives with respect  ***
     170              : !       *** to the nuclear coordinates of the atomic center a ***
     171              : 
     172      5047014 :             IF (return_derivatives) THEN
     173              :                la_start = 0
     174              :                lb_start = 0
     175              :             ELSE
     176        16278 :                la_start = la_min_set
     177        16278 :                lb_start = lb_min_set
     178              :             END IF
     179              : 
     180      5047014 :             first = ncoset(la_start - 1) + 1
     181      5047014 :             first_b = ncoset(lb_start - 1) + 1
     182      5047014 :             last_b = ncoset(lb_max_set)
     183      6789335 :             DO da = 0, da_max - 1
     184      1742321 :                last = ncoset(la_max - da - 1)
     185      8532256 :                DO dax = 0, da
     186      5228763 :                   DO day = 0, da - dax
     187      1743521 :                      daz = da - dax - day
     188      1743521 :                      cda = coset(dax, day, daz)
     189      1743521 :                      cdax = coset(dax + 1, day, daz)
     190      1743521 :                      cday = coset(dax, day + 1, daz)
     191      1743521 :                      cdaz = coset(dax, day, daz + 1)
     192              :                      CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cdax), &
     193      1743521 :                                            derivative_map(:, first:last, 1), .TRUE., zeta(ipgf), 0.0_dp, .FALSE.)
     194              :                      CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cday), &
     195      1743521 :                                            derivative_map(:, first:last, 2), .TRUE., zeta(ipgf), 0.0_dp, .FALSE.)
     196              :                      CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cdaz), &
     197      3486442 :                                            derivative_map(:, first:last, 3), .TRUE., zeta(ipgf), 0.0_dp, .FALSE.)
     198              :                   END DO
     199              :                END DO
     200              :             END DO
     201              : 
     202              : !       *** Return all the calculated derivatives of the ***
     203              : !       *** primitive overlap integrals, if requested    ***
     204              : 
     205      5047014 :             IF (return_derivatives) THEN
     206     10259499 :                DO k = 2, ncoset(da_max_set)
     207      5228763 :                   jstart = (k - 1)*SIZE(sab, 1)
     208     31404534 :                   DO j = 1, ncoset(lb_max_set)
     209     21145035 :                      jk = jstart + j
     210    132075324 :                      DO i = 1, ncoset(la_max_set)
     211    126846561 :                         sab(na + i, nb + jk) = s(i, j, k)
     212              :                      END DO
     213              :                   END DO
     214              :                END DO
     215              :             END IF
     216              : 
     217     13522990 :             nb = nb + ncoset(lb_max_set)
     218              : 
     219              :          END DO
     220              : 
     221     10530462 :          na = na + ncoset(la_max_set)
     222              :       END DO
     223              : 
     224      2054486 :       DEALLOCATE (rr)
     225              : 
     226      2054486 :    END SUBROUTINE overlap
     227              : 
     228              : ! **************************************************************************************************
     229              : !> \brief   Calculation of the two-center overlap integrals [a|b] over
     230              : !>          Cartesian Gaussian-type functions. First and second derivatives
     231              : !> \param la_max     Max L on center A
     232              : !> \param la_min     Min L on center A
     233              : !> \param npgfa      Number of primitives on center A
     234              : !> \param rpgfa      Range of functions on A, used for screening
     235              : !> \param zeta       Exponents on center A
     236              : !> \param lb_max     Max L on center B
     237              : !> \param lb_min     Min L on center B
     238              : !> \param npgfb      Number of primitives on center B
     239              : !> \param rpgfb      Range of functions on B, used for screening
     240              : !> \param zetb       Exponents on center B
     241              : !> \param rab        Distance vector A-B
     242              : !> \param sab        Final overlap integrals
     243              : !> \param dab        First derivative overlap integrals
     244              : !> \param ddab       Second derivative overlap integrals ordered xx, xy, xz, yy, yz, zz
     245              : !> \param rr_work    Optional caller-provided one-dimensional overlap recurrence workspace
     246              : !> \date    01.07.2014
     247              : !> \author  JGH
     248              : ! **************************************************************************************************
     249     18838855 :    SUBROUTINE overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, &
     250     18838855 :                          lb_max, lb_min, npgfb, rpgfb, zetb, &
     251     18838855 :                          rab, sab, dab, ddab, rr_work)
     252              :       INTEGER, INTENT(IN)                                :: la_max, la_min, npgfa
     253              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa, zeta
     254              :       INTEGER, INTENT(IN)                                :: lb_max, lb_min, npgfb
     255              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb, zetb
     256              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     257              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT), &
     258              :          OPTIONAL                                        :: sab
     259              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
     260              :          OPTIONAL                                        :: dab, ddab
     261              :       REAL(KIND=dp), DIMENSION(:), INTENT(INOUT), &
     262              :          OPTIONAL, TARGET                                :: rr_work
     263              : 
     264              :       INTEGER, PARAMETER :: pairs(2, 6) = RESHAPE([1, 1, 1, 2, 1, 3, 2, 2, 2, 3, 3, 3], [2, 6])
     265              : 
     266              :       INTEGER                                            :: avec(3), bvec(3), coa, cob, ia, ib, &
     267              :                                                             icomp, idir, ipgf, jdir, jpgf, kdir, &
     268              :                                                             ldrr, lma, lmb, ma, mb, na, nb, ofa, &
     269              :                                                             ofb
     270              :       REAL(KIND=dp)                                      :: a, b, f0, factor(3), rab2, sval(3), tab, &
     271              :                                                             xhi, zet
     272     18838855 :       REAL(KIND=dp), ALLOCATABLE                         :: drr_a(:, :, :), drr_ab(:, :, :)
     273              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp
     274     18838855 :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: rr
     275              : 
     276              :       ! Distance of the centers a and b
     277              : 
     278     18838855 :       rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
     279     18838855 :       tab = SQRT(rab2)
     280              : 
     281              :       ! Maximum l for auxiliary integrals
     282     18838855 :       CPASSERT(PRESENT(sab) .OR. PRESENT(dab) .OR. PRESENT(ddab))
     283     18838855 :       IF (PRESENT(sab)) THEN
     284     18542274 :          lma = la_max
     285     18542274 :          lmb = lb_max
     286              :       END IF
     287     18838855 :       IF (PRESENT(dab)) THEN
     288      4966025 :          lma = la_max + 1
     289      4966025 :          lmb = lb_max
     290              :       END IF
     291     18838855 :       IF (PRESENT(ddab)) THEN
     292        13855 :          lma = la_max + 1
     293        13855 :          lmb = lb_max + 1
     294              :       END IF
     295     18838855 :       ldrr = MAX(lma, lmb) + 1
     296              : 
     297              :       ! Allocate or attach the workspace for auxiliary integrals
     298              :       NULLIFY (rr)
     299     18838855 :       IF (PRESENT(rr_work)) THEN
     300       144107 :          CPASSERT(SIZE(rr_work) >= ldrr*ldrr*3)
     301       144107 :          rr(0:ldrr - 1, 0:ldrr - 1, 1:3) => rr_work(1:ldrr*ldrr*3)
     302              :       ELSE
     303     93473740 :          ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
     304              :       END IF
     305              : 
     306     38702955 :       IF (PRESENT(dab) .OR. PRESENT(ddab)) ALLOCATE (drr_a(0:ldrr - 1, 0:ldrr - 1, 3))
     307      4993735 :       IF (PRESENT(ddab)) ALLOCATE (drr_ab(0:ldrr - 1, 0:ldrr - 1, 3))
     308              : 
     309              :       ! Number of integrals, check size of arrays
     310     18838855 :       ofa = ncoset(la_min - 1)
     311     18838855 :       ofb = ncoset(lb_min - 1)
     312     18838855 :       na = ncoset(la_max) - ofa
     313     18838855 :       nb = ncoset(lb_max) - ofb
     314     18838855 :       IF (PRESENT(sab)) THEN
     315     18542274 :          CPASSERT((SIZE(sab, 1) >= na*npgfa))
     316     18542274 :          CPASSERT((SIZE(sab, 2) >= nb*npgfb))
     317              :       END IF
     318     18838855 :       IF (PRESENT(dab)) THEN
     319      4966025 :          CPASSERT((SIZE(dab, 1) >= na*npgfa))
     320      4966025 :          CPASSERT((SIZE(dab, 2) >= nb*npgfb))
     321      4966025 :          CPASSERT((SIZE(dab, 3) >= 3))
     322              :       END IF
     323     18838855 :       IF (PRESENT(ddab)) THEN
     324        13855 :          CPASSERT((SIZE(ddab, 1) >= na*npgfa))
     325        13855 :          CPASSERT((SIZE(ddab, 2) >= nb*npgfb))
     326        13855 :          CPASSERT((SIZE(ddab, 3) >= 6))
     327              :       END IF
     328              : 
     329              :       ! Loops over all pairs of primitive Gaussian-type functions
     330     18838855 :       ma = 0
     331    114088877 :       DO ipgf = 1, npgfa
     332     95250022 :          mb = 0
     333    648193985 :          DO jpgf = 1, npgfb
     334              :             ! Distance Screening
     335    552943963 :             IF (rpgfa(ipgf) + rpgfb(jpgf) < tab) THEN
     336   4623746297 :                IF (PRESENT(sab)) sab(ma + 1:ma + na, mb + 1:mb + nb) = 0.0_dp
     337   3587115782 :                IF (PRESENT(dab)) dab(ma + 1:ma + na, mb + 1:mb + nb, 1:3) = 0.0_dp
     338    430215845 :                IF (PRESENT(ddab)) ddab(ma + 1:ma + na, mb + 1:mb + nb, 1:6) = 0.0_dp
     339    423507431 :                mb = mb + nb
     340    423507431 :                CYCLE
     341              :             END IF
     342              : 
     343              :             ! Calculate some prefactors
     344    129436532 :             a = zeta(ipgf)
     345    129436532 :             b = zetb(jpgf)
     346    129436532 :             zet = a + b
     347    129436532 :             xhi = a*b/zet
     348    517746128 :             rap = b*rab/zet
     349    517746128 :             rbp = -a*rab/zet
     350              : 
     351              :             ! [s|s] integral
     352    129436532 :             f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
     353              : 
     354              :             ! Calculate the recurrence relation
     355    129436532 :             CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
     356    129436532 :             IF (PRESENT(dab) .OR. PRESENT(ddab)) THEN
     357     32163909 :                CALL apply_cartesian_1d(rr, drr_a, la_max, lmb, .FALSE., .TRUE., a, [0.0_dp, 0.0_dp, 0.0_dp])
     358              :             END IF
     359     32163909 :             IF (PRESENT(ddab)) THEN
     360        55855 :                CALL apply_cartesian_1d(drr_a, drr_ab, la_max, lb_max, .TRUE., .TRUE., b, [0.0_dp, 0.0_dp, 0.0_dp])
     361              :             END IF
     362              : 
     363    465581305 :             DO cob = ofb + 1, ncoset(lb_max)
     364   1344579092 :                bvec = indco(:, cob)
     365    336144773 :                ib = mb + cob - ofb
     366   1532136379 :                DO coa = ofa + 1, ncoset(la_max)
     367   4266220296 :                   avec = indco(:, coa)
     368   1066555074 :                   ia = ma + coa - ofa
     369   4266220296 :                   sval = [(rr(avec(idir), bvec(idir), idir), idir=1, 3)]
     370              :                   ! integrals
     371   1066555074 :                   IF (PRESENT(sab)) THEN
     372   1061896243 :                      sab(ia, ib) = f0*sval(1)*sval(2)*sval(3)
     373              :                   END IF
     374              :                   ! first derivatives
     375   1066555074 :                   IF (PRESENT(dab)) THEN
     376    867468528 :                      DO idir = 1, 3
     377    650601396 :                         jdir = MOD(idir, 3) + 1
     378    650601396 :                         kdir = MOD(idir + 1, 3) + 1
     379    867468528 :                         dab(ia, ib, idir) = f0*drr_a(avec(idir), bvec(idir), idir)*sval(jdir)*sval(kdir)
     380              :                      END DO
     381              :                   END IF
     382              :                   ! Translational invariance gives D_B S = -D_A S and D_A D_A S = -D_A D_B S.
     383   1402699847 :                   IF (PRESENT(ddab)) THEN
     384      2444281 :                      DO icomp = 1, 6
     385      2095098 :                         idir = pairs(1, icomp)
     386      2095098 :                         jdir = pairs(2, icomp)
     387      2095098 :                         factor = sval
     388      2095098 :                         IF (idir == jdir) THEN
     389      1047549 :                            factor(idir) = -drr_ab(avec(idir), bvec(idir), idir)
     390              :                         ELSE
     391      1047549 :                            factor(idir) = drr_a(avec(idir), bvec(idir), idir)
     392      1047549 :                            factor(jdir) = drr_a(avec(jdir), bvec(jdir), jdir)
     393              :                         END IF
     394      2444281 :                         ddab(ia, ib, icomp) = f0*factor(1)*factor(2)*factor(3)
     395              :                      END DO
     396              :                   END IF
     397              :                   !
     398              :                END DO
     399              :             END DO
     400              : 
     401    224686554 :             mb = mb + nb
     402              :          END DO
     403    114088877 :          ma = ma + na
     404              :       END DO
     405              : 
     406     18838855 :       IF (.NOT. PRESENT(rr_work)) DEALLOCATE (rr)
     407              :       NULLIFY (rr)
     408              : 
     409     18838855 :    END SUBROUTINE overlap_ab
     410              : 
     411              : ! **************************************************************************************************
     412              : !> \brief   Calculation of the two-center overlap integrals [aa|b] over
     413              : !>          Cartesian Gaussian-type functions.
     414              : !> \param la1_max    Max L on center A (basis 1)
     415              : !> \param la1_min    Min L on center A (basis 1)
     416              : !> \param npgfa1     Number of primitives on center A (basis 1)
     417              : !> \param rpgfa1     Range of functions on A, used for screening (basis 1)
     418              : !> \param zeta1      Exponents on center A (basis 1)
     419              : !> \param la2_max    Max L on center A (basis 2)
     420              : !> \param la2_min    Min L on center A (basis 2)
     421              : !> \param npgfa2     Number of primitives on center A (basis 2)
     422              : !> \param rpgfa2     Range of functions on A, used for screening (basis 2)
     423              : !> \param zeta2      Exponents on center A (basis 2)
     424              : !> \param lb_max     Max L on center B
     425              : !> \param lb_min     Min L on center B
     426              : !> \param npgfb      Number of primitives on center B
     427              : !> \param rpgfb      Range of functions on B, used for screening
     428              : !> \param zetb       Exponents on center B
     429              : !> \param rab        Distance vector A-B
     430              : !> \param saab       Final overlap integrals
     431              : !> \param daab       First derivatives with respect to the shared center of both A functions
     432              : !> \param saba       Final overlap integrals; different order
     433              : !> \param daba       Same shared-center derivatives as daab, with A-B-A output ordering
     434              : !> \date    01.07.2014
     435              : !> \author  JGH
     436              : ! **************************************************************************************************
     437         9695 :    SUBROUTINE overlap_aab(la1_max, la1_min, npgfa1, rpgfa1, zeta1, &
     438        19390 :                           la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
     439        19390 :                           lb_max, lb_min, npgfb, rpgfb, zetb, &
     440         9695 :                           rab, saab, daab, saba, daba)
     441              :       INTEGER, INTENT(IN)                                :: la1_max, la1_min, npgfa1
     442              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa1, zeta1
     443              :       INTEGER, INTENT(IN)                                :: la2_max, la2_min, npgfa2
     444              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa2, zeta2
     445              :       INTEGER, INTENT(IN)                                :: lb_max, lb_min, npgfb
     446              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb, zetb
     447              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     448              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
     449              :          OPTIONAL                                        :: saab
     450              :       REAL(KIND=dp), DIMENSION(:, :, :, :), &
     451              :          INTENT(INOUT), OPTIONAL                         :: daab
     452              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
     453              :          OPTIONAL                                        :: saba
     454              :       REAL(KIND=dp), DIMENSION(:, :, :, :), &
     455              :          INTENT(INOUT), OPTIONAL                         :: daba
     456              : 
     457              :       INTEGER                                            :: coa1, coa2, cob, i1pgf, i2pgf, ia1, ia2, &
     458              :                                                             ib, jpgf, ldrr, lma, lmb, ma1, ma2, &
     459              :                                                             mb, na1, na2, nb, ofa1, ofa2, ofb
     460              :       INTEGER, DIMENSION(3)                              :: a2vec, avec, bvec
     461              :       REAL(KIND=dp)                                      :: a, b, dum(3), f0, rab2, rpgfa, tab, &
     462              :                                                             value, xhi, zet
     463         9695 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: drr, rr
     464              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp
     465              : 
     466              :       ! Distance of the centers a and b
     467              : 
     468         9695 :       rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
     469         9695 :       tab = SQRT(rab2)
     470              : 
     471              :       ! Maximum l for auxiliary integrals
     472         9695 :       CPASSERT(PRESENT(saab) .OR. PRESENT(daab) .OR. PRESENT(saba) .OR. PRESENT(daba))
     473         9695 :       IF (PRESENT(saab) .OR. PRESENT(saba)) THEN
     474         9567 :          lma = la1_max + la2_max
     475         9567 :          lmb = lb_max
     476              :       END IF
     477         9695 :       IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
     478         3525 :          lma = la1_max + la2_max + 1
     479         3525 :          lmb = lb_max
     480              :       END IF
     481         9695 :       ldrr = MAX(lma, lmb) + 1
     482              : 
     483              :       ! Allocate space for auxiliary integrals
     484        48475 :       ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
     485        23795 :       IF (PRESENT(daab) .OR. PRESENT(daba)) ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
     486              : 
     487              :       ! Number of integrals, check size of arrays
     488         9695 :       ofa1 = ncoset(la1_min - 1)
     489         9695 :       ofa2 = ncoset(la2_min - 1)
     490         9695 :       ofb = ncoset(lb_min - 1)
     491         9695 :       na1 = ncoset(la1_max) - ofa1
     492         9695 :       na2 = ncoset(la2_max) - ofa2
     493         9695 :       nb = ncoset(lb_max) - ofb
     494         9695 :       IF (PRESENT(saab)) THEN
     495         1570 :          CPASSERT((SIZE(saab, 1) >= na1*npgfa1))
     496         1570 :          CPASSERT((SIZE(saab, 2) >= na2*npgfa2))
     497         1570 :          CPASSERT((SIZE(saab, 3) >= nb*npgfb))
     498              :       END IF
     499         9695 :       IF (PRESENT(daab)) THEN
     500          128 :          CPASSERT((SIZE(daab, 1) >= na1*npgfa1))
     501          128 :          CPASSERT((SIZE(daab, 2) >= na2*npgfa2))
     502          128 :          CPASSERT((SIZE(daab, 3) >= nb*npgfb))
     503          128 :          CPASSERT((SIZE(daab, 4) >= 3))
     504              :       END IF
     505         9695 :       IF (PRESENT(saba)) THEN
     506         7997 :          CPASSERT((SIZE(saba, 1) >= na1*npgfa1))
     507         7997 :          CPASSERT((SIZE(saba, 2) >= nb*npgfb))
     508         7997 :          CPASSERT((SIZE(saba, 3) >= na2*npgfa2))
     509              :       END IF
     510         9695 :       IF (PRESENT(daba)) THEN
     511         3397 :          CPASSERT((SIZE(daba, 1) >= na1*npgfa1))
     512         3397 :          CPASSERT((SIZE(daba, 2) >= nb*npgfb))
     513         3397 :          CPASSERT((SIZE(daba, 3) >= na2*npgfa2))
     514         3397 :          CPASSERT((SIZE(daba, 4) >= 3))
     515              :       END IF
     516              : 
     517              :       ! Loops over all primitive Gaussian-type functions
     518         9695 :       ma1 = 0
     519        72326 :       DO i1pgf = 1, npgfa1
     520        62631 :          ma2 = 0
     521       302786 :          DO i2pgf = 1, npgfa2
     522       240155 :             rpgfa = MIN(rpgfa1(i1pgf), rpgfa2(i2pgf))
     523       240155 :             mb = 0
     524      1362964 :             DO jpgf = 1, npgfb
     525              :                ! Distance Screening
     526      1122809 :                IF (rpgfa + rpgfb(jpgf) < tab) THEN
     527       251494 :                   IF (PRESENT(saab)) saab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb) = 0.0_dp
     528       251494 :                   IF (PRESENT(daab)) daab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb, 1:3) = 0.0_dp
     529     12150124 :                   IF (PRESENT(saba)) saba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2) = 0.0_dp
     530     15308095 :                   IF (PRESENT(daba)) daba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2, 1:3) = 0.0_dp
     531       251494 :                   mb = mb + nb
     532       251494 :                   CYCLE
     533              :                END IF
     534              : 
     535              :                ! Calculate some prefactors
     536       871315 :                a = zeta1(i1pgf) + zeta2(i2pgf)
     537       871315 :                b = zetb(jpgf)
     538       871315 :                zet = a + b
     539       871315 :                xhi = a*b/zet
     540      3485260 :                rap = b*rab/zet
     541      3485260 :                rbp = -a*rab/zet
     542              : 
     543              :                ! [ss|s] integral
     544       871315 :                f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
     545              : 
     546              :                ! Calculate the recurrence relation
     547       871315 :                CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
     548       871315 :                IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
     549              :                   CALL apply_cartesian_1d(rr, drr, la1_max + la2_max, lmb, .FALSE., .TRUE., a, &
     550       348900 :                                           [0.0_dp, 0.0_dp, 0.0_dp])
     551              :                END IF
     552              : 
     553      3125262 :                DO cob = ofb + 1, ncoset(lb_max)
     554      9015788 :                   bvec = indco(:, cob)
     555      2253947 :                   ib = mb + cob - ofb
     556     15740535 :                   DO coa2 = ofa2 + 1, ncoset(la2_max)
     557     50461092 :                      a2vec = indco(:, coa2)
     558     12615273 :                      ia2 = ma2 + coa2 - ofa2
     559     51499096 :                      DO coa1 = ofa1 + 1, ncoset(la1_max)
     560    146519504 :                         avec = indco(:, coa1) + a2vec
     561     36629876 :                         ia1 = ma1 + coa1 - ofa1
     562              :                         ! integrals
     563     36629876 :                         IF (PRESENT(saab) .OR. PRESENT(saba)) THEN
     564     36598584 :                            value = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     565     36598584 :                            IF (PRESENT(saab)) saab(ia1, ia2, ib) = value
     566     36598584 :                            IF (PRESENT(saba)) saba(ia1, ib, ia2) = value
     567              :                         END IF
     568              :                         ! first derivatives
     569     49245149 :                         IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
     570     19863985 :                            dum(1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     571     19863985 :                            dum(2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     572     19863985 :                            dum(3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
     573     19957861 :                            IF (PRESENT(daab)) daab(ia1, ia2, ib, 1:3) = dum
     574     79362064 :                            IF (PRESENT(daba)) daba(ia1, ib, ia2, 1:3) = dum
     575              :                         END IF
     576              :                      END DO
     577              :                   END DO
     578              :                END DO
     579              : 
     580      1111470 :                mb = mb + nb
     581              :             END DO
     582       302786 :             ma2 = ma2 + na2
     583              :          END DO
     584        72326 :          ma1 = ma1 + na1
     585              :       END DO
     586              : 
     587         9695 :       DEALLOCATE (rr)
     588              : 
     589         9695 :    END SUBROUTINE overlap_aab
     590              : 
     591              : ! **************************************************************************************************
     592              : !> \brief   Calculation of the two-center overlap integrals [a|bb] over
     593              : !>          Cartesian Gaussian-type functions.
     594              : !> \param la_max     Max L on center A
     595              : !> \param la_min     Min L on center A
     596              : !> \param npgfa      Number of primitives on center A
     597              : !> \param rpgfa      Range of functions on A, used for screening
     598              : !> \param zeta       Exponents on center A
     599              : !> \param lb1_max    Max L on center B (basis 1)
     600              : !> \param lb1_min    Min L on center B (basis 1)
     601              : !> \param npgfb1     Number of primitives on center B (basis 1)
     602              : !> \param rpgfb1     Range of functions on B, used for screening (basis 1)
     603              : !> \param zetb1      Exponents on center B (basis 1)
     604              : !> \param lb2_max    Max L on center B (basis 2)
     605              : !> \param lb2_min    Min L on center B (basis 2)
     606              : !> \param npgfb2     Number of primitives on center B (basis 2)
     607              : !> \param rpgfb2     Range of functions on B, used for screening (basis 2)
     608              : !> \param zetb2      Exponents on center B (basis 2)
     609              : !> \param rab        Distance vector A-B
     610              : !> \param sabb       Final overlap integrals
     611              : !> \param dabb       First derivatives with respect to center A
     612              : !> \date    01.07.2014
     613              : !> \author  JGH
     614              : ! **************************************************************************************************
     615         7997 :    SUBROUTINE overlap_abb(la_max, la_min, npgfa, rpgfa, zeta, &
     616        15994 :                           lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
     617        15994 :                           lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
     618         7997 :                           rab, sabb, dabb)
     619              :       INTEGER, INTENT(IN)                                :: la_max, la_min, npgfa
     620              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa, zeta
     621              :       INTEGER, INTENT(IN)                                :: lb1_max, lb1_min, npgfb1
     622              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb1, zetb1
     623              :       INTEGER, INTENT(IN)                                :: lb2_max, lb2_min, npgfb2
     624              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb2, zetb2
     625              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     626              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
     627              :          OPTIONAL                                        :: sabb
     628              :       REAL(KIND=dp), DIMENSION(:, :, :, :), &
     629              :          INTENT(INOUT), OPTIONAL                         :: dabb
     630              : 
     631              :       INTEGER                                            :: coa, cob1, cob2, ia, ib1, ib2, ipgf, &
     632              :                                                             j1pgf, j2pgf, ldrr, lma, lmb, ma, mb1, &
     633              :                                                             mb2, na, nb1, nb2, ofa, ofb1, ofb2
     634              :       INTEGER, DIMENSION(3)                              :: avec, b2vec, bvec
     635              :       REAL(KIND=dp)                                      :: a, b, f0, rab2, rpgfb, tab, xhi, zet
     636         7997 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: drr, rr
     637              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp
     638              : 
     639              :       ! Distance of the centers a and b
     640              : 
     641         7997 :       rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
     642         7997 :       tab = SQRT(rab2)
     643              : 
     644              :       ! Maximum l for auxiliary integrals
     645         7997 :       CPASSERT(PRESENT(sabb) .OR. PRESENT(dabb))
     646         7997 :       IF (PRESENT(sabb)) THEN
     647         7997 :          lma = la_max
     648         7997 :          lmb = lb1_max + lb2_max
     649              :       END IF
     650         7997 :       IF (PRESENT(dabb)) THEN
     651         3397 :          lma = la_max + 1
     652         3397 :          lmb = lb1_max + lb2_max
     653              :       END IF
     654         7997 :       ldrr = MAX(lma, lmb) + 1
     655              : 
     656              :       ! Allocate space for auxiliary integrals
     657        39985 :       ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
     658        21585 :       IF (PRESENT(dabb)) ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
     659              : 
     660              :       ! Number of integrals, check size of arrays
     661         7997 :       ofa = ncoset(la_min - 1)
     662         7997 :       ofb1 = ncoset(lb1_min - 1)
     663         7997 :       ofb2 = ncoset(lb2_min - 1)
     664         7997 :       na = ncoset(la_max) - ofa
     665         7997 :       nb1 = ncoset(lb1_max) - ofb1
     666         7997 :       nb2 = ncoset(lb2_max) - ofb2
     667         7997 :       IF (PRESENT(sabb)) THEN
     668         7997 :          CPASSERT((SIZE(sabb, 1) >= na*npgfa))
     669         7997 :          CPASSERT((SIZE(sabb, 2) >= nb1*npgfb1))
     670         7997 :          CPASSERT((SIZE(sabb, 3) >= nb2*npgfb2))
     671              :       END IF
     672         7997 :       IF (PRESENT(dabb)) THEN
     673         3397 :          CPASSERT((SIZE(dabb, 1) >= na*npgfa))
     674         3397 :          CPASSERT((SIZE(dabb, 2) >= nb1*npgfb1))
     675         3397 :          CPASSERT((SIZE(dabb, 3) >= nb2*npgfb2))
     676         3397 :          CPASSERT((SIZE(dabb, 4) >= 3))
     677              :       END IF
     678              : 
     679              :       ! Loops over all pairs of primitive Gaussian-type functions
     680         7997 :       ma = 0
     681        60026 :       DO ipgf = 1, npgfa
     682        52029 :          mb1 = 0
     683       392532 :          DO j1pgf = 1, npgfb1
     684       340503 :             mb2 = 0
     685      1393966 :             DO j2pgf = 1, npgfb2
     686              :                ! Distance Screening
     687      1053463 :                rpgfb = MIN(rpgfb1(j1pgf), rpgfb2(j2pgf))
     688      1053463 :                IF (rpgfa(ipgf) + rpgfb < tab) THEN
     689     11929000 :                   IF (PRESENT(sabb)) sabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
     690     15070032 :                   IF (PRESENT(dabb)) dabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
     691       253218 :                   mb2 = mb2 + nb2
     692       253218 :                   CYCLE
     693              :                END IF
     694              : 
     695              :                ! Calculate some prefactors
     696       800245 :                a = zeta(ipgf)
     697       800245 :                b = zetb1(j1pgf) + zetb2(j2pgf)
     698       800245 :                zet = a + b
     699       800245 :                xhi = a*b/zet
     700      3200980 :                rap = b*rab/zet
     701      3200980 :                rbp = -a*rab/zet
     702              : 
     703              :                ! [s|s] integral
     704       800245 :                f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
     705              : 
     706              :                ! Calculate the recurrence relation
     707       800245 :                CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
     708       800245 :                IF (PRESENT(dabb)) THEN
     709              :                   CALL apply_cartesian_1d(rr, drr, la_max, lmb, .FALSE., .TRUE., a, &
     710       342382 :                                           [0.0_dp, 0.0_dp, 0.0_dp])
     711              :                END IF
     712              : 
     713      4903571 :                DO cob2 = ofb2 + 1, ncoset(lb2_max)
     714     16413304 :                   b2vec = indco(:, cob2)
     715      4103326 :                   ib2 = mb2 + cob2 - ofb2
     716     17227305 :                   DO cob1 = ofb1 + 1, ncoset(lb1_max)
     717     49294936 :                      bvec = indco(:, cob1) + b2vec
     718     12323734 :                      ib1 = mb1 + cob1 - ofb1
     719     52406636 :                      DO coa = ofa + 1, ncoset(la_max)
     720    143918304 :                         avec = indco(:, coa)
     721     35979576 :                         ia = ma + coa - ofa
     722              :                         ! integrals
     723     35979576 :                         IF (PRESENT(sabb)) THEN
     724     35979576 :                            sabb(ia, ib1, ib2) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     725              :                         END IF
     726              :                         ! first derivatives
     727     48303310 :                         IF (PRESENT(dabb)) THEN
     728     19827139 :                            dabb(ia, ib1, ib2, 1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     729     19827139 :                            dabb(ia, ib1, ib2, 2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
     730     19827139 :                            dabb(ia, ib1, ib2, 3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
     731              :                         END IF
     732              :                      END DO
     733              :                   END DO
     734              :                END DO
     735              : 
     736      1140748 :                mb2 = mb2 + nb2
     737              :             END DO
     738       392532 :             mb1 = mb1 + nb1
     739              :          END DO
     740        60026 :          ma = ma + na
     741              :       END DO
     742              : 
     743         7997 :       DEALLOCATE (rr)
     744              : 
     745         7997 :    END SUBROUTINE overlap_abb
     746              : 
     747              : ! **************************************************************************************************
     748              : 
     749              : ! **************************************************************************************************
     750              : !> \brief   Calculation of the two-center overlap integrals [a|b] over
     751              : !>          Spherical Gaussian-type functions.
     752              : !> \param la         Max L on center A
     753              : !> \param zeta       Exponents on center A
     754              : !> \param lb         Max L on center B
     755              : !> \param zetb       Exponents on center B
     756              : !> \param rab        Distance vector A-B
     757              : !> \param sab        Final overlap integrals
     758              : !> \date    01.03.2016
     759              : !> \author  JGH
     760              : ! **************************************************************************************************
     761       275350 :    SUBROUTINE overlap_ab_s(la, zeta, lb, zetb, rab, sab)
     762              :       INTEGER, INTENT(IN)                                :: la
     763              :       REAL(KIND=dp), INTENT(IN)                          :: zeta
     764              :       INTEGER, INTENT(IN)                                :: lb
     765              :       REAL(KIND=dp), INTENT(IN)                          :: zetb
     766              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     767              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: sab
     768              : 
     769              :       REAL(KIND=dp), PARAMETER                           :: huge4 = HUGE(1._dp)/4._dp
     770              : 
     771              :       INTEGER                                            :: nca, ncb, nsa, nsb
     772              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: cab
     773              :       REAL(KIND=dp), DIMENSION(1)                        :: rpgf, za, zb
     774       275350 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: c2sa, c2sb
     775              : 
     776       275350 :       rpgf(1) = huge4
     777       275350 :       za(1) = zeta
     778       275350 :       zb(1) = zetb
     779              : 
     780       275350 :       nca = nco(la)
     781       275350 :       ncb = nco(lb)
     782      1101400 :       ALLOCATE (cab(nca, ncb))
     783       275350 :       nsa = nso(la)
     784       275350 :       nsb = nso(lb)
     785              : 
     786       275350 :       CALL overlap_ab(la, la, 1, rpgf, za, lb, lb, 1, rpgf, zb, rab, cab)
     787              : 
     788       275350 :       c2sa => orbtramat(la)%c2s
     789       275350 :       c2sb => orbtramat(lb)%c2s
     790       275350 :       sab(1:nsa, 1:nsb) = MATMUL(c2sa(1:nsa, 1:nca), &
     791     11068283 :                                  MATMUL(cab(1:nca, 1:ncb), TRANSPOSE(c2sb(1:nsb, 1:ncb))))
     792              : 
     793       275350 :       DEALLOCATE (cab)
     794              : 
     795       275350 :    END SUBROUTINE overlap_ab_s
     796              : 
     797              : ! **************************************************************************************************
     798              : !> \brief   Calculation of the overlap integrals [a|b] over
     799              : !>          cubic periodic Spherical Gaussian-type functions.
     800              : !> \param la         Max L on center A
     801              : !> \param zeta       Exponents on center A
     802              : !> \param lb         Max L on center B
     803              : !> \param zetb       Exponents on center B
     804              : !> \param alat       Lattice constant
     805              : !> \param sab        Final overlap integrals
     806              : !> \date    01.03.2016
     807              : !> \author  JGH
     808              : ! **************************************************************************************************
     809        36066 :    SUBROUTINE overlap_ab_sp(la, zeta, lb, zetb, alat, sab)
     810              :       INTEGER, INTENT(IN)                                :: la
     811              :       REAL(KIND=dp), INTENT(IN)                          :: zeta
     812              :       INTEGER, INTENT(IN)                                :: lb
     813              :       REAL(KIND=dp), INTENT(IN)                          :: zetb, alat
     814              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: sab
     815              : 
     816              :       COMPLEX(KIND=dp)                                   :: zfg
     817        36066 :       COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :)     :: fun, gun
     818              :       INTEGER                                            :: ax, ay, az, bx, by, bz, i, ia, ib, l, &
     819              :                                                             l1, l2, na, nb, nca, ncb, nmax, nsa, &
     820              :                                                             nsb
     821              :       REAL(KIND=dp)                                      :: oa, ob, ovol, zm
     822        36066 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: fexp, gexp, gval
     823        36066 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: cab
     824              :       REAL(KIND=dp), DIMENSION(0:3, 0:3)                 :: fgsum
     825        36066 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: c2sa, c2sb
     826              : 
     827        36066 :       nca = nco(la)
     828        36066 :       ncb = nco(lb)
     829       144264 :       ALLOCATE (cab(nca, ncb))
     830        36066 :       cab = 0.0_dp
     831        36066 :       nsa = nso(la)
     832        36066 :       nsb = nso(lb)
     833              : 
     834        36066 :       zm = MIN(zeta, zetb)
     835        36066 :       nmax = NINT(1.81_dp*alat*SQRT(zm) + 1.0_dp)
     836              :       ALLOCATE (fun(-nmax:nmax, 0:la), gun(-nmax:nmax, 0:lb), &
     837       396726 :                 fexp(-nmax:nmax), gexp(-nmax:nmax), gval(-nmax:nmax))
     838              : 
     839        36066 :       oa = 1._dp/zeta
     840        36066 :       ob = 1._dp/zetb
     841       522120 :       DO i = -nmax, nmax
     842       486054 :          gval(i) = twopi/alat*REAL(i, KIND=dp)
     843       486054 :          fexp(i) = SQRT(oa*pi)*EXP(-0.25_dp*oa*gval(i)**2)
     844       522120 :          gexp(i) = SQRT(ob*pi)*EXP(-0.25_dp*ob*gval(i)**2)
     845              :       END DO
     846        91966 :       DO l = 0, la
     847        91966 :          IF (l == 0) THEN
     848       522120 :             fun(:, l) = z_one
     849        19834 :          ELSE IF (l == 1) THEN
     850       252786 :             fun(:, l) = CMPLX(0.0_dp, 0.5_dp*oa*gval(:), KIND=dp)
     851         2073 :          ELSE IF (l == 2) THEN
     852        29772 :             fun(:, l) = CMPLX(-(0.5_dp*oa*gval(:))**2, 0.0_dp, KIND=dp)
     853        29772 :             fun(:, l) = fun(:, l) + CMPLX(0.5_dp*oa, 0.0_dp, KIND=dp)
     854            0 :          ELSE IF (l == 3) THEN
     855            0 :             fun(:, l) = CMPLX(0.0_dp, -(0.5_dp*oa*gval(:))**3, KIND=dp)
     856            0 :             fun(:, l) = fun(:, l) + CMPLX(0.0_dp, 0.75_dp*oa*oa*gval(:), KIND=dp)
     857              :          ELSE
     858            0 :             CPABORT("l value too high")
     859              :          END IF
     860              :       END DO
     861        91966 :       DO l = 0, lb
     862        91966 :          IF (l == 0) THEN
     863       522120 :             gun(:, l) = z_one
     864        19834 :          ELSE IF (l == 1) THEN
     865       252786 :             gun(:, l) = CMPLX(0.0_dp, 0.5_dp*ob*gval(:), KIND=dp)
     866         2073 :          ELSE IF (l == 2) THEN
     867        29772 :             gun(:, l) = CMPLX(-(0.5_dp*ob*gval(:))**2, 0.0_dp, KIND=dp)
     868        29772 :             gun(:, l) = gun(:, l) + CMPLX(0.5_dp*ob, 0.0_dp, KIND=dp)
     869            0 :          ELSE IF (l == 3) THEN
     870            0 :             gun(:, l) = CMPLX(0.0_dp, -(0.5_dp*ob*gval(:))**3, KIND=dp)
     871            0 :             gun(:, l) = gun(:, l) + CMPLX(0.0_dp, 0.75_dp*ob*ob*gval(:), KIND=dp)
     872              :          ELSE
     873            0 :             CPABORT("l value too high")
     874              :          END IF
     875              :       END DO
     876              : 
     877        36066 :       fgsum = 0.0_dp
     878        91966 :       DO l1 = 0, la
     879       179954 :          DO l2 = 0, lb
     880      1260466 :             zfg = SUM(CONJG(fun(:, l1))*fexp(:)*gun(:, l2)*gexp(:))
     881       143888 :             fgsum(l1, l2) = REAL(zfg, KIND=dp)
     882              :          END DO
     883              :       END DO
     884              : 
     885        36066 :       na = ncoset(la - 1)
     886        36066 :       nb = ncoset(lb - 1)
     887        91966 :       DO ax = 0, la
     888       169773 :          DO ay = 0, la - ax
     889        77807 :             az = la - ax - ay
     890        77807 :             ia = coset(ax, ay, az) - na
     891       257848 :             DO bx = 0, lb
     892       379135 :                DO by = 0, lb - bx
     893       177187 :                   bz = lb - bx - by
     894       177187 :                   ib = coset(bx, by, bz) - nb
     895       301328 :                   cab(ia, ib) = fgsum(ax, bx)*fgsum(ay, by)*fgsum(az, bz)
     896              :                END DO
     897              :             END DO
     898              :          END DO
     899              :       END DO
     900              : 
     901        36066 :       c2sa => orbtramat(la)%c2s
     902        36066 :       c2sb => orbtramat(lb)%c2s
     903        36066 :       sab(1:nsa, 1:nsb) = MATMUL(c2sa(1:nsa, 1:nca), &
     904      2482203 :                                  MATMUL(cab(1:nca, 1:ncb), TRANSPOSE(c2sb(1:nsb, 1:ncb))))
     905        36066 :       ovol = 1._dp/(alat**3)
     906       276218 :       sab(1:nsa, 1:nsb) = ovol*sab(1:nsa, 1:nsb)
     907              : 
     908        36066 :       DEALLOCATE (cab, fun, gun, fexp, gexp, gval)
     909              : 
     910        36066 :    END SUBROUTINE overlap_ab_sp
     911              : 
     912       311416 : END MODULE ai_overlap
        

Generated by: LCOV version 2.0-1