LCOV - code coverage report
Current view: top level - src/aobasis - ai_overlap3.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:ccc2433) Lines: 0 437 0.0 %
Date: 2024-04-25 07:09:54 Functions: 0 2 0.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : !!****** cp2k/ai_overlap3 [1.0] *
       8             : !!
       9             : !!   NAME
      10             : !!     ai_overlap3
      11             : !!
      12             : !!   FUNCTION
      13             : !!     Calculation of three-center overlap integrals over Cartesian
      14             : !!     Gaussian-type functions.
      15             : !!
      16             : !!   AUTHOR
      17             : !!     Matthias Krack (26.06.2001)
      18             : !!
      19             : !!   LITERATURE
      20             : !!     S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
      21             : !!
      22             : !******************************************************************************
      23             : 
      24             : MODULE ai_overlap3
      25             : 
      26             : ! **************************************************************************************************
      27             : 
      28             : ! ax,ay,az   : Angular momentum index numbers of orbital a.
      29             : ! bx,by,bz   : Angular momentum index numbers of orbital b.
      30             : ! coset      : Cartesian orbital set pointer.
      31             : ! dab        : Distance between the atomic centers a and b.
      32             : ! dac        : Distance between the atomic centers a and c.
      33             : ! dbc        : Distance between the atomic centers b and c.
      34             : ! l{a,b,c}   : Angular momentum quantum number of shell a, b or c.
      35             : ! l{a,b}_max : Maximum angular momentum quantum number of shell a, b or c.
      36             : ! ncoset     : Number of Cartesian orbitals up to l.
      37             : ! rab        : Distance vector between the atomic centers a and b.
      38             : ! rac        : Distance vector between the atomic centers a and c.
      39             : ! rbc        : Distance vector between the atomic centers b and c.
      40             : ! rpgf{a,b,c}: Radius of the primitive Gaussian-type function a or b.
      41             : ! zet{a,b,c} : Exponents of the Gaussian-type functions a or b.
      42             : ! zetg       : Reciprocal of the sum of the exponents of orbital a, b and c.
      43             : ! zetp       : Reciprocal of the sum of the exponents of orbital a and b.
      44             : 
      45             : ! **************************************************************************************************
      46             : 
      47             :    USE kinds,                           ONLY: dp
      48             :    USE mathconstants,                   ONLY: pi
      49             :    USE orbital_pointers,                ONLY: coset,&
      50             :                                               ncoset
      51             : #include "../base/base_uses.f90"
      52             : 
      53             :    IMPLICIT NONE
      54             : 
      55             :    PRIVATE
      56             : 
      57             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_overlap3'
      58             : 
      59             : ! *** Public subroutines ***
      60             : 
      61             :    PUBLIC :: overlap3
      62             : 
      63             : !!***
      64             : ! **************************************************************************************************
      65             : 
      66             : CONTAINS
      67             : 
      68             : ! ***************************************************************************************************
      69             : !> \brief Calculation of three-center overlap integrals [a|b|c] over primitive
      70             : !>        Cartesian Gaussian functions
      71             : !> \param la_max_set ...
      72             : !> \param npgfa ...
      73             : !> \param zeta ...
      74             : !> \param rpgfa ...
      75             : !> \param la_min_set ...
      76             : !> \param lb_max_set ...
      77             : !> \param npgfb ...
      78             : !> \param zetb ...
      79             : !> \param rpgfb ...
      80             : !> \param lb_min_set ...
      81             : !> \param lc_max_set ...
      82             : !> \param npgfc ...
      83             : !> \param zetc ...
      84             : !> \param rpgfc ...
      85             : !> \param lc_min_set ...
      86             : !> \param rab ...
      87             : !> \param dab ...
      88             : !> \param rac ...
      89             : !> \param dac ...
      90             : !> \param rbc ...
      91             : !> \param dbc ...
      92             : !> \param sabc integrals [a|b|c]
      93             : !> \param sdabc derivative [da/dAi|b|c]
      94             : !> \param sabdc derivative [a|b|dc/dCi]
      95             : !> \param int_abc_ext the extremal value of sabc, i.e., MAXVAL(ABS(sabc))
      96             : !> \par History
      97             : !>      05.2014 created (Dorothea Golze)
      98             : !> \author Dorothea Golze
      99             : !> \note  overlap3 essentially uses the setup of overlap3_old
     100             : ! **************************************************************************************************
     101             : 
     102           0 :    SUBROUTINE overlap3(la_max_set, npgfa, zeta, rpgfa, la_min_set, &
     103           0 :                        lb_max_set, npgfb, zetb, rpgfb, lb_min_set, &
     104           0 :                        lc_max_set, npgfc, zetc, rpgfc, lc_min_set, &
     105           0 :                        rab, dab, rac, dac, rbc, dbc, sabc, &
     106           0 :                        sdabc, sabdc, int_abc_ext)
     107             : 
     108             :       INTEGER, INTENT(IN)                                :: la_max_set, npgfa
     109             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zeta, rpgfa
     110             :       INTEGER, INTENT(IN)                                :: la_min_set, lb_max_set, npgfb
     111             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zetb, rpgfb
     112             :       INTEGER, INTENT(IN)                                :: lb_min_set, lc_max_set, npgfc
     113             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zetc, rpgfc
     114             :       INTEGER, INTENT(IN)                                :: lc_min_set
     115             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     116             :       REAL(KIND=dp), INTENT(IN)                          :: dab
     117             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
     118             :       REAL(KIND=dp), INTENT(IN)                          :: dac
     119             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rbc
     120             :       REAL(KIND=dp), INTENT(IN)                          :: dbc
     121             :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT)   :: sabc
     122             :       REAL(KIND=dp), DIMENSION(:, :, :, :), &
     123             :          INTENT(INOUT), OPTIONAL                         :: sdabc, sabdc
     124             :       REAL(dp), INTENT(OUT), OPTIONAL                    :: int_abc_ext
     125             : 
     126             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'overlap3'
     127             : 
     128             :       INTEGER :: ax, ay, az, bx, by, bz, coa, coax, coay, coaz, coc, cocx, cocy, cocz, cx, cy, cz, &
     129             :          handle, i, ipgf, j, jpgf, k, kpgf, l, la, la_max, la_min, la_start, lai, lb, lb_max, &
     130             :          lb_min, lbi, lc, lc_max, lc_min, lci, na, nb, nc, nda, ndc
     131             :       REAL(KIND=dp)                                      :: f0, f1, f2, f3, fcx, fcy, fcz, fx, fy, &
     132             :                                                             fz, rcp2, zetg, zetp
     133             :       REAL(KIND=dp), DIMENSION(3)                        :: rag, rbg, rcg, rcp
     134             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: s
     135           0 :       REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER      :: sda, sdc
     136             : 
     137             : !   ---------------------------------------------------------------------------
     138             : 
     139           0 :       CALL timeset(routineN, handle)
     140             : 
     141           0 :       NULLIFY (s, sda, sdc)
     142             : 
     143           0 :       lai = 0
     144           0 :       lbi = 0
     145           0 :       lci = 0
     146             : 
     147           0 :       IF (PRESENT(sdabc)) lai = 1
     148           0 :       IF (PRESENT(sabdc)) lci = 1
     149             : 
     150           0 :       la_max = la_max_set + lai
     151           0 :       la_min = MAX(0, la_min_set - lai)
     152           0 :       lb_max = lb_max_set
     153           0 :       lb_min = lb_min_set
     154           0 :       lc_max = lc_max_set + lci
     155           0 :       lc_min = MAX(0, lc_min_set - lci)
     156             : 
     157           0 :       ALLOCATE (s(ncoset(la_max), ncoset(lb_max), ncoset(lc_max)))
     158           0 :       s = 0._dp
     159           0 :       IF (PRESENT(sdabc)) THEN
     160           0 :          ALLOCATE (sda(ncoset(la_max), ncoset(lb_max), ncoset(lc_max), 3))
     161           0 :          sda = 0._dp
     162             :       END IF
     163           0 :       IF (PRESENT(sabdc)) THEN
     164           0 :          ALLOCATE (sdc(ncoset(la_max), ncoset(lb_max), ncoset(lc_max), 3))
     165           0 :          sdc = 0._dp
     166             :       END IF
     167           0 :       IF (PRESENT(int_abc_ext)) THEN
     168           0 :          int_abc_ext = 0.0_dp
     169             :       END IF
     170             : 
     171             : !   *** Loop over all pairs of primitive Gaussian-type functions ***
     172             : 
     173           0 :       na = 0
     174           0 :       nda = 0
     175           0 :       DO ipgf = 1, npgfa
     176             : 
     177           0 :          nb = 0
     178           0 :          DO jpgf = 1, npgfb
     179             : 
     180             :             ! *** Screening ***
     181           0 :             IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) THEN
     182           0 :                nb = nb + ncoset(lb_max_set)
     183           0 :                CYCLE
     184             :             END IF
     185             : 
     186           0 :             nc = 0
     187           0 :             ndc = 0
     188           0 :             DO kpgf = 1, npgfc
     189             : 
     190             :                ! *** Screening ***
     191           0 :                IF ((rpgfb(jpgf) + rpgfc(kpgf) < dbc) .OR. &
     192             :                    (rpgfa(ipgf) + rpgfc(kpgf) < dac)) THEN
     193           0 :                   nc = nc + ncoset(lc_max_set)
     194           0 :                   ndc = ndc + ncoset(lc_max_set)
     195           0 :                   CYCLE
     196             :                END IF
     197             : 
     198             :                ! *** Calculate some prefactors ***
     199           0 :                zetg = 1.0_dp/(zeta(ipgf) + zetb(jpgf) + zetc(kpgf))
     200           0 :                zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
     201           0 :                f0 = (pi*zetg)**1.5_dp
     202           0 :                f1 = zetb(jpgf)*zetp
     203           0 :                f2 = 0.5_dp*zetg
     204           0 :                rcp(:) = f1*rab(:) - rac(:)
     205           0 :                rcp2 = rcp(1)*rcp(1) + rcp(2)*rcp(2) + rcp(3)*rcp(3)
     206             : 
     207             :                ! *** Calculate the basic three-center overlap integral [s|s|s] ***
     208           0 :                s(1, 1, 1) = f0*EXP(-(zeta(ipgf)*f1*dab*dab + zetc(kpgf)*zetg*rcp2/zetp))
     209             : 
     210             : !         *** Recurrence steps: [s|s|s] -> [a|s|s] ***
     211             : 
     212           0 :                IF (la_max > 0) THEN
     213             : 
     214             : !           *** Vertical recurrence steps: [s|s|s] -> [a|s|s] ***
     215             : 
     216           0 :                   rag(:) = zetg*(zetb(jpgf)*rab(:) + zetc(kpgf)*rac(:))
     217             : 
     218             : !           *** [p|s|s] = (Gi - Ai)*[s|s|s]  (i = x,y,z) ***
     219             : 
     220           0 :                   s(2, 1, 1) = rag(1)*s(1, 1, 1)
     221           0 :                   s(3, 1, 1) = rag(2)*s(1, 1, 1)
     222           0 :                   s(4, 1, 1) = rag(3)*s(1, 1, 1)
     223             : 
     224             : !           *** [a|s|s] = (Gi - Ai)*[a-1i|s|s] + f2*Ni(a-1i)*[a-2i|s|s] ***
     225             : 
     226           0 :                   DO la = 2, la_max
     227             : 
     228             : !             *** Increase the angular momentum component z of function a ***
     229             : 
     230             :                      s(coset(0, 0, la), 1, 1) = rag(3)*s(coset(0, 0, la - 1), 1, 1) + &
     231           0 :                                                 f2*REAL(la - 1, dp)*s(coset(0, 0, la - 2), 1, 1)
     232             : 
     233             : !             *** Increase the angular momentum component y of function a ***
     234             : 
     235           0 :                      az = la - 1
     236           0 :                      s(coset(0, 1, az), 1, 1) = rag(2)*s(coset(0, 0, az), 1, 1)
     237             : 
     238           0 :                      DO ay = 2, la
     239           0 :                         az = la - ay
     240             :                         s(coset(0, ay, az), 1, 1) = rag(2)*s(coset(0, ay - 1, az), 1, 1) + &
     241           0 :                                                     f2*REAL(ay - 1, dp)*s(coset(0, ay - 2, az), 1, 1)
     242             :                      END DO
     243             : 
     244             : !             *** Increase the angular momentum component x of function a ***
     245             : 
     246           0 :                      DO ay = 0, la - 1
     247           0 :                         az = la - 1 - ay
     248           0 :                         s(coset(1, ay, az), 1, 1) = rag(1)*s(coset(0, ay, az), 1, 1)
     249             :                      END DO
     250             : 
     251           0 :                      DO ax = 2, la
     252           0 :                         f3 = f2*REAL(ax - 1, dp)
     253           0 :                         DO ay = 0, la - ax
     254           0 :                            az = la - ax - ay
     255             :                            s(coset(ax, ay, az), 1, 1) = rag(1)*s(coset(ax - 1, ay, az), 1, 1) + &
     256           0 :                                                         f3*s(coset(ax - 2, ay, az), 1, 1)
     257             :                         END DO
     258             :                      END DO
     259             : 
     260             :                   END DO
     261             : 
     262             : !           *** Recurrence steps: [a|s|s] -> [a|s|b] ***
     263             : 
     264           0 :                   IF (lb_max > 0) THEN
     265             : 
     266             : !             *** Horizontal recurrence steps ***
     267             : 
     268           0 :                      rbg(:) = rag(:) - rab(:)
     269             : 
     270             : !             *** [a|s|p] = [a+1i|s|s] - (Bi - Ai)*[a|s|s] ***
     271             : 
     272           0 :                      IF (lb_max == 1) THEN
     273             :                         la_start = la_min
     274             :                      ELSE
     275           0 :                         la_start = MAX(0, la_min - 1)
     276             :                      END IF
     277             : 
     278           0 :                      DO la = la_start, la_max - 1
     279           0 :                         DO ax = 0, la
     280           0 :                            DO ay = 0, la - ax
     281           0 :                               az = la - ax - ay
     282           0 :                               coa = coset(ax, ay, az)
     283           0 :                               coax = coset(ax + 1, ay, az)
     284           0 :                               coay = coset(ax, ay + 1, az)
     285           0 :                               coaz = coset(ax, ay, az + 1)
     286           0 :                               s(coset(ax, ay, az), 2, 1) = s(coax, 1, 1) - rab(1)*s(coa, 1, 1)
     287           0 :                               s(coset(ax, ay, az), 3, 1) = s(coay, 1, 1) - rab(2)*s(coa, 1, 1)
     288           0 :                               s(coset(ax, ay, az), 4, 1) = s(coaz, 1, 1) - rab(3)*s(coa, 1, 1)
     289             :                            END DO
     290             :                         END DO
     291             :                      END DO
     292             : 
     293             : !             *** Vertical recurrence step ***
     294             : 
     295             : !             *** [a|s|p] = (Gi - Bi)*[a|s|s] + f2*Ni(a)*[a-1i|s|s] ***
     296             : 
     297           0 :                      DO ax = 0, la_max
     298           0 :                         fx = f2*REAL(ax, dp)
     299           0 :                         DO ay = 0, la_max - ax
     300           0 :                            fy = f2*REAL(ay, dp)
     301           0 :                            az = la_max - ax - ay
     302           0 :                            fz = f2*REAL(az, dp)
     303           0 :                            coa = coset(ax, ay, az)
     304           0 :                            IF (ax == 0) THEN
     305           0 :                               s(coa, 2, 1) = rbg(1)*s(coa, 1, 1)
     306             :                            ELSE
     307           0 :                               s(coa, 2, 1) = rbg(1)*s(coa, 1, 1) + fx*s(coset(ax - 1, ay, az), 1, 1)
     308             :                            END IF
     309           0 :                            IF (ay == 0) THEN
     310           0 :                               s(coa, 3, 1) = rbg(2)*s(coa, 1, 1)
     311             :                            ELSE
     312           0 :                               s(coa, 3, 1) = rbg(2)*s(coa, 1, 1) + fy*s(coset(ax, ay - 1, az), 1, 1)
     313             :                            END IF
     314           0 :                            IF (az == 0) THEN
     315           0 :                               s(coa, 4, 1) = rbg(3)*s(coa, 1, 1)
     316             :                            ELSE
     317           0 :                               s(coa, 4, 1) = rbg(3)*s(coa, 1, 1) + fz*s(coset(ax, ay, az - 1), 1, 1)
     318             :                            END IF
     319             :                         END DO
     320             :                      END DO
     321             : 
     322             : !             *** Recurrence steps: [a|s|p] -> [a|s|b] ***
     323             : 
     324           0 :                      DO lb = 2, lb_max
     325             : 
     326             : !               *** Horizontal recurrence steps ***
     327             : 
     328             : !               *** [a|s|b] = [a+1i|s|b-1i] - (Bi - Ai)*[a|s|b-1i] ***
     329             : 
     330           0 :                         IF (lb == lb_max) THEN
     331             :                            la_start = la_min
     332             :                         ELSE
     333           0 :                            la_start = MAX(0, la_min - 1)
     334             :                         END IF
     335             : 
     336           0 :                         DO la = la_start, la_max - 1
     337           0 :                            DO ax = 0, la
     338           0 :                               DO ay = 0, la - ax
     339           0 :                                  az = la - ax - ay
     340             : 
     341           0 :                                  coa = coset(ax, ay, az)
     342           0 :                                  coax = coset(ax + 1, ay, az)
     343           0 :                                  coay = coset(ax, ay + 1, az)
     344           0 :                                  coaz = coset(ax, ay, az + 1)
     345             : 
     346             : !                     *** Shift of angular momentum component z from a to b ***
     347             : 
     348             :                                  s(coa, coset(0, 0, lb), 1) = &
     349             :                                     s(coaz, coset(0, 0, lb - 1), 1) - &
     350           0 :                                     rab(3)*s(coa, coset(0, 0, lb - 1), 1)
     351             : 
     352             : !                     *** Shift of angular momentum component y from a to b ***
     353             : 
     354           0 :                                  DO by = 1, lb
     355           0 :                                     bz = lb - by
     356             :                                     s(coa, coset(0, by, bz), 1) = &
     357             :                                        s(coay, coset(0, by - 1, bz), 1) - &
     358           0 :                                        rab(2)*s(coa, coset(0, by - 1, bz), 1)
     359             :                                  END DO
     360             : 
     361             : !                     *** Shift of angular momentum component x from a to b ***
     362             : 
     363           0 :                                  DO bx = 1, lb
     364           0 :                                     DO by = 0, lb - bx
     365           0 :                                        bz = lb - bx - by
     366             :                                        s(coa, coset(bx, by, bz), 1) = &
     367             :                                           s(coax, coset(bx - 1, by, bz), 1) - &
     368           0 :                                           rab(1)*s(coa, coset(bx - 1, by, bz), 1)
     369             :                                     END DO
     370             :                                  END DO
     371             : 
     372             :                               END DO
     373             :                            END DO
     374             :                         END DO
     375             : 
     376             : !               *** Vertical recurrence step ***
     377             : 
     378             : !               *** [a|s|b] = (Gi - Bi)*[a|s|b-1i] +   ***
     379             : !               ***           f2*Ni(a)*[a-1i|s|b-1i] + ***
     380             : !               ***           f2*Ni(b-1i)*[a|s|b-2i]   ***
     381             : 
     382           0 :                         DO ax = 0, la_max
     383           0 :                            fx = f2*REAL(ax, dp)
     384           0 :                            DO ay = 0, la_max - ax
     385           0 :                               fy = f2*REAL(ay, dp)
     386           0 :                               az = la_max - ax - ay
     387           0 :                               fz = f2*REAL(az, dp)
     388             : 
     389           0 :                               coa = coset(ax, ay, az)
     390             : 
     391           0 :                               f3 = f2*REAL(lb - 1, dp)
     392             : 
     393             : !                   *** Shift of angular momentum component z from a to b ***
     394             : 
     395           0 :                               IF (az == 0) THEN
     396             :                                  s(coa, coset(0, 0, lb), 1) = &
     397             :                                     rbg(3)*s(coa, coset(0, 0, lb - 1), 1) + &
     398           0 :                                     f3*s(coa, coset(0, 0, lb - 2), 1)
     399             :                               ELSE
     400           0 :                                  coaz = coset(ax, ay, az - 1)
     401             :                                  s(coa, coset(0, 0, lb), 1) = &
     402             :                                     rbg(3)*s(coa, coset(0, 0, lb - 1), 1) + &
     403             :                                     fz*s(coaz, coset(0, 0, lb - 1), 1) + &
     404           0 :                                     f3*s(coa, coset(0, 0, lb - 2), 1)
     405             :                               END IF
     406             : 
     407             : !                   *** Shift of angular momentum component y from a to b ***
     408             : 
     409           0 :                               IF (ay == 0) THEN
     410           0 :                                  bz = lb - 1
     411             :                                  s(coa, coset(0, 1, bz), 1) = &
     412           0 :                                     rbg(2)*s(coa, coset(0, 0, bz), 1)
     413           0 :                                  DO by = 2, lb
     414           0 :                                     bz = lb - by
     415           0 :                                     f3 = f2*REAL(by - 1, dp)
     416             :                                     s(coa, coset(0, by, bz), 1) = &
     417             :                                        rbg(2)*s(coa, coset(0, by - 1, bz), 1) + &
     418           0 :                                        f3*s(coa, coset(0, by - 2, bz), 1)
     419             :                                  END DO
     420             :                               ELSE
     421           0 :                                  coay = coset(ax, ay - 1, az)
     422           0 :                                  bz = lb - 1
     423             :                                  s(coa, coset(0, 1, bz), 1) = &
     424             :                                     rbg(2)*s(coa, coset(0, 0, bz), 1) + &
     425           0 :                                     fy*s(coay, coset(0, 0, bz), 1)
     426           0 :                                  DO by = 2, lb
     427           0 :                                     bz = lb - by
     428           0 :                                     f3 = f2*REAL(by - 1, dp)
     429             :                                     s(coa, coset(0, by, bz), 1) = &
     430             :                                        rbg(2)*s(coa, coset(0, by - 1, bz), 1) + &
     431             :                                        fy*s(coay, coset(0, by - 1, bz), 1) + &
     432           0 :                                        f3*s(coa, coset(0, by - 2, bz), 1)
     433             :                                  END DO
     434             :                               END IF
     435             : 
     436             : !                   *** Shift of angular momentum component x from a to b ***
     437             : 
     438           0 :                               IF (ax == 0) THEN
     439           0 :                                  DO by = 0, lb - 1
     440           0 :                                     bz = lb - 1 - by
     441             :                                     s(coa, coset(1, by, bz), 1) = &
     442           0 :                                        rbg(1)*s(coa, coset(0, by, bz), 1)
     443             :                                  END DO
     444           0 :                                  DO bx = 2, lb
     445           0 :                                     f3 = f2*REAL(bx - 1, dp)
     446           0 :                                     DO by = 0, lb - bx
     447           0 :                                        bz = lb - bx - by
     448             :                                        s(coa, coset(bx, by, bz), 1) = &
     449             :                                           rbg(1)*s(coa, coset(bx - 1, by, bz), 1) + &
     450           0 :                                           f3*s(coa, coset(bx - 2, by, bz), 1)
     451             :                                     END DO
     452             :                                  END DO
     453             :                               ELSE
     454           0 :                                  coax = coset(ax - 1, ay, az)
     455           0 :                                  DO by = 0, lb - 1
     456           0 :                                     bz = lb - 1 - by
     457             :                                     s(coa, coset(1, by, bz), 1) = &
     458             :                                        rbg(1)*s(coa, coset(0, by, bz), 1) + &
     459           0 :                                        fx*s(coax, coset(0, by, bz), 1)
     460             :                                  END DO
     461           0 :                                  DO bx = 2, lb
     462           0 :                                     f3 = f2*REAL(bx - 1, dp)
     463           0 :                                     DO by = 0, lb - bx
     464           0 :                                        bz = lb - bx - by
     465             :                                        s(coa, coset(bx, by, bz), 1) = &
     466             :                                           rbg(1)*s(coa, coset(bx - 1, by, bz), 1) + &
     467             :                                           fx*s(coax, coset(bx - 1, by, bz), 1) + &
     468           0 :                                           f3*s(coa, coset(bx - 2, by, bz), 1)
     469             :                                     END DO
     470             :                                  END DO
     471             :                               END IF
     472             : 
     473             :                            END DO
     474             :                         END DO
     475             : 
     476             :                      END DO
     477             : 
     478             :                   END IF
     479             : 
     480             :                ELSE
     481             : 
     482           0 :                   IF (lb_max > 0) THEN
     483             : 
     484             : !             *** Vertical recurrence steps: [s|s|s] -> [s|s|b] ***
     485             : 
     486           0 :                      rbg(:) = -zetg*(zeta(ipgf)*rab(:) - zetc(kpgf)*rbc(:))
     487             : 
     488             : !             *** [s|s|p] = (Gi - Bi)*[s|s|s] ***
     489             : 
     490           0 :                      s(1, 2, 1) = rbg(1)*s(1, 1, 1)
     491           0 :                      s(1, 3, 1) = rbg(2)*s(1, 1, 1)
     492           0 :                      s(1, 4, 1) = rbg(3)*s(1, 1, 1)
     493             : 
     494             : !             *** [s|s|b] = (Gi - Bi)*[s|s|b-1i] + f2*Ni(b-1i)*[s|s|b-2i] ***
     495             : 
     496           0 :                      DO lb = 2, lb_max
     497             : 
     498             : !               *** Increase the angular momentum component z of function b ***
     499             : 
     500             :                         s(1, coset(0, 0, lb), 1) = rbg(3)*s(1, coset(0, 0, lb - 1), 1) + &
     501           0 :                                                    f2*REAL(lb - 1, dp)*s(1, coset(0, 0, lb - 2), 1)
     502             : 
     503             : !               *** Increase the angular momentum component y of function b ***
     504             : 
     505           0 :                         bz = lb - 1
     506           0 :                         s(1, coset(0, 1, bz), 1) = rbg(2)*s(1, coset(0, 0, bz), 1)
     507             : 
     508           0 :                         DO by = 2, lb
     509           0 :                            bz = lb - by
     510             :                            s(1, coset(0, by, bz), 1) = &
     511             :                               rbg(2)*s(1, coset(0, by - 1, bz), 1) + &
     512           0 :                               f2*REAL(by - 1, dp)*s(1, coset(0, by - 2, bz), 1)
     513             :                         END DO
     514             : 
     515             : !               *** Increase the angular momentum component x of function b ***
     516             : 
     517           0 :                         DO by = 0, lb - 1
     518           0 :                            bz = lb - 1 - by
     519           0 :                            s(1, coset(1, by, bz), 1) = rbg(1)*s(1, coset(0, by, bz), 1)
     520             :                         END DO
     521             : 
     522           0 :                         DO bx = 2, lb
     523           0 :                            f3 = f2*REAL(bx - 1, dp)
     524           0 :                            DO by = 0, lb - bx
     525           0 :                               bz = lb - bx - by
     526             :                               s(1, coset(bx, by, bz), 1) = rbg(1)*s(1, coset(bx - 1, by, bz), 1) + &
     527           0 :                                                            f3*s(1, coset(bx - 2, by, bz), 1)
     528             :                            END DO
     529             :                         END DO
     530             : 
     531             :                      END DO
     532             : 
     533             :                   END IF
     534             : 
     535             :                END IF
     536             : 
     537             : !         *** Recurrence steps: [a|s|b] -> [a|c|b] ***
     538             : 
     539           0 :                IF (lc_max > 0) THEN
     540             : 
     541             : !           *** Vertical recurrence steps: [s|s|s] -> [s|c|s] ***
     542             : 
     543           0 :                   rcg(:) = -zetg*(zeta(ipgf)*rac(:) + zetb(jpgf)*rbc(:))
     544             : 
     545             : !           *** [s|p|s] = (Gi - Ci)*[s|s|s]  (i = x,y,z) ***
     546             : 
     547           0 :                   s(1, 1, 2) = rcg(1)*s(1, 1, 1)
     548           0 :                   s(1, 1, 3) = rcg(2)*s(1, 1, 1)
     549           0 :                   s(1, 1, 4) = rcg(3)*s(1, 1, 1)
     550             : 
     551             : !           *** [s|c|s] = (Gi - Ci)*[s|c-1i|s] + f2*Ni(c-1i)*[s|c-2i|s] ***
     552             : 
     553           0 :                   DO lc = 2, lc_max
     554             : 
     555             : !             *** Increase the angular momentum component z of function c ***
     556             : 
     557             :                      s(1, 1, coset(0, 0, lc)) = rcg(3)*s(1, 1, coset(0, 0, lc - 1)) + &
     558           0 :                                                 f2*REAL(lc - 1, dp)*s(1, 1, coset(0, 0, lc - 2))
     559             : 
     560             : !             *** Increase the angular momentum component y of function c ***
     561             : 
     562           0 :                      cz = lc - 1
     563           0 :                      s(1, 1, coset(0, 1, cz)) = rcg(2)*s(1, 1, coset(0, 0, cz))
     564             : 
     565           0 :                      DO cy = 2, lc
     566           0 :                         cz = lc - cy
     567             :                         s(1, 1, coset(0, cy, cz)) = rcg(2)*s(1, 1, coset(0, cy - 1, cz)) + &
     568           0 :                                                     f2*REAL(cy - 1, dp)*s(1, 1, coset(0, cy - 2, cz))
     569             :                      END DO
     570             : 
     571             : !             *** Increase the angular momentum component x of function c ***
     572             : 
     573           0 :                      DO cy = 0, lc - 1
     574           0 :                         cz = lc - 1 - cy
     575           0 :                         s(1, 1, coset(1, cy, cz)) = rcg(1)*s(1, 1, coset(0, cy, cz))
     576             :                      END DO
     577             : 
     578           0 :                      DO cx = 2, lc
     579           0 :                         f3 = f2*REAL(cx - 1, dp)
     580           0 :                         DO cy = 0, lc - cx
     581           0 :                            cz = lc - cx - cy
     582             :                            s(1, 1, coset(cx, cy, cz)) = rcg(1)*s(1, 1, coset(cx - 1, cy, cz)) + &
     583           0 :                                                         f3*s(1, 1, coset(cx - 2, cy, cz))
     584             :                         END DO
     585             :                      END DO
     586             : 
     587             :                   END DO
     588             : 
     589             : !           *** Recurrence steps: [s|c|s] -> [a|c|b] ***
     590             : 
     591           0 :                   DO lc = 1, lc_max
     592             : 
     593           0 :                      DO cx = 0, lc
     594           0 :                         DO cy = 0, lc - cx
     595           0 :                            cz = lc - cx - cy
     596             : 
     597           0 :                            coc = coset(cx, cy, cz)
     598           0 :                            cocx = coset(MAX(0, cx - 1), cy, cz)
     599           0 :                            cocy = coset(cx, MAX(0, cy - 1), cz)
     600           0 :                            cocz = coset(cx, cy, MAX(0, cz - 1))
     601             : 
     602           0 :                            fcx = f2*REAL(cx, dp)
     603           0 :                            fcy = f2*REAL(cy, dp)
     604           0 :                            fcz = f2*REAL(cz, dp)
     605             : 
     606             : !                 *** Recurrence steps: [s|c|s] -> [a|c|s] ***
     607             : 
     608           0 :                            IF (la_max > 0) THEN
     609             : 
     610             : !                   *** Vertical recurrence steps: [s|c|s] -> [a|c|s] ***
     611             : 
     612           0 :                               rag(:) = rcg(:) + rac(:)
     613             : 
     614             : !                   *** [p|c|s] = (Gi - Ai)*[s|c|s] + f2*Ni(c)*[s|c-1i|s] ***
     615             : 
     616           0 :                               s(2, 1, coc) = rag(1)*s(1, 1, coc) + fcx*s(1, 1, cocx)
     617           0 :                               s(3, 1, coc) = rag(2)*s(1, 1, coc) + fcy*s(1, 1, cocy)
     618           0 :                               s(4, 1, coc) = rag(3)*s(1, 1, coc) + fcz*s(1, 1, cocz)
     619             : 
     620             : !                   *** [a|c|s] = (Gi - Ai)*[a-1i|c|s] +   ***
     621             : !                   ***           f2*Ni(a-1i)*[a-2i|c|s] + ***
     622             : !                   ***           f2*Ni(c)*[a-1i|c-1i|s]   ***
     623             : 
     624           0 :                               DO la = 2, la_max
     625             : 
     626             : !                     *** Increase the angular momentum component z of a ***
     627             : 
     628             :                                  s(coset(0, 0, la), 1, coc) = &
     629             :                                     rag(3)*s(coset(0, 0, la - 1), 1, coc) + &
     630             :                                     f2*REAL(la - 1, dp)*s(coset(0, 0, la - 2), 1, coc) + &
     631           0 :                                     fcz*s(coset(0, 0, la - 1), 1, cocz)
     632             : 
     633             : !                     *** Increase the angular momentum component y of a ***
     634             : 
     635           0 :                                  az = la - 1
     636             :                                  s(coset(0, 1, az), 1, coc) = &
     637             :                                     rag(2)*s(coset(0, 0, az), 1, coc) + &
     638           0 :                                     fcy*s(coset(0, 0, az), 1, cocy)
     639             : 
     640           0 :                                  DO ay = 2, la
     641           0 :                                     az = la - ay
     642             :                                     s(coset(0, ay, az), 1, coc) = &
     643             :                                        rag(2)*s(coset(0, ay - 1, az), 1, coc) + &
     644             :                                        f2*REAL(ay - 1, dp)*s(coset(0, ay - 2, az), 1, coc) + &
     645           0 :                                        fcy*s(coset(0, ay - 1, az), 1, cocy)
     646             :                                  END DO
     647             : 
     648             : !                     *** Increase the angular momentum component x of a ***
     649             : 
     650           0 :                                  DO ay = 0, la - 1
     651           0 :                                     az = la - 1 - ay
     652             :                                     s(coset(1, ay, az), 1, coc) = &
     653             :                                        rag(1)*s(coset(0, ay, az), 1, coc) + &
     654           0 :                                        fcx*s(coset(0, ay, az), 1, cocx)
     655             :                                  END DO
     656             : 
     657           0 :                                  DO ax = 2, la
     658           0 :                                     f3 = f2*REAL(ax - 1, dp)
     659           0 :                                     DO ay = 0, la - ax
     660           0 :                                        az = la - ax - ay
     661             :                                        s(coset(ax, ay, az), 1, coc) = &
     662             :                                           rag(1)*s(coset(ax - 1, ay, az), 1, coc) + &
     663             :                                           f3*s(coset(ax - 2, ay, az), 1, coc) + &
     664           0 :                                           fcx*s(coset(ax - 1, ay, az), 1, cocx)
     665             :                                     END DO
     666             :                                  END DO
     667             : 
     668             :                               END DO
     669             : 
     670             : !                   *** Recurrence steps: [a|c|s] -> [a|c|b] ***
     671             : 
     672           0 :                               IF (lb_max > 0) THEN
     673             : 
     674             : !                     *** Horizontal recurrence steps ***
     675             : 
     676           0 :                                  rbg(:) = rag(:) - rab(:)
     677             : 
     678             : !                     *** [a|c|p] = [a+1i|c|s] - (Bi - Ai)*[a|c|s] ***
     679             : 
     680           0 :                                  IF (lb_max == 1) THEN
     681             :                                     la_start = la_min
     682             :                                  ELSE
     683           0 :                                     la_start = MAX(0, la_min - 1)
     684             :                                  END IF
     685             : 
     686           0 :                                  DO la = la_start, la_max - 1
     687           0 :                                     DO ax = 0, la
     688           0 :                                        DO ay = 0, la - ax
     689           0 :                                           az = la - ax - ay
     690           0 :                                           coa = coset(ax, ay, az)
     691           0 :                                           coax = coset(ax + 1, ay, az)
     692           0 :                                           coay = coset(ax, ay + 1, az)
     693           0 :                                           coaz = coset(ax, ay, az + 1)
     694           0 :                                           s(coa, 2, coc) = s(coax, 1, coc) - rab(1)*s(coa, 1, coc)
     695           0 :                                           s(coa, 3, coc) = s(coay, 1, coc) - rab(2)*s(coa, 1, coc)
     696           0 :                                           s(coa, 4, coc) = s(coaz, 1, coc) - rab(3)*s(coa, 1, coc)
     697             :                                        END DO
     698             :                                     END DO
     699             :                                  END DO
     700             : 
     701             : !                     *** Vertical recurrence step ***
     702             : 
     703             : !                     *** [a|c|p] = (Gi - Bi)*[a|c|s] +   ***
     704             : !                                   f2*Ni(a)*[a-1i|c|s] + ***
     705             : !                                   f2*Ni(c)*[a|c-1i|s]   ***
     706             : 
     707           0 :                                  DO ax = 0, la_max
     708           0 :                                     fx = f2*REAL(ax, dp)
     709           0 :                                     DO ay = 0, la_max - ax
     710           0 :                                        fy = f2*REAL(ay, dp)
     711           0 :                                        az = la_max - ax - ay
     712           0 :                                        fz = f2*REAL(az, dp)
     713           0 :                                        coa = coset(ax, ay, az)
     714           0 :                                        IF (ax == 0) THEN
     715             :                                           s(coa, 2, coc) = rbg(1)*s(coa, 1, coc) + &
     716           0 :                                                            fcx*s(coa, 1, cocx)
     717             :                                        ELSE
     718             :                                           s(coa, 2, coc) = rbg(1)*s(coa, 1, coc) + &
     719             :                                                            fx*s(coset(ax - 1, ay, az), 1, coc) + &
     720           0 :                                                            fcx*s(coa, 1, cocx)
     721             :                                        END IF
     722           0 :                                        IF (ay == 0) THEN
     723             :                                           s(coa, 3, coc) = rbg(2)*s(coa, 1, coc) + &
     724           0 :                                                            fcy*s(coa, 1, cocy)
     725             :                                        ELSE
     726             :                                           s(coa, 3, coc) = rbg(2)*s(coa, 1, coc) + &
     727             :                                                            fy*s(coset(ax, ay - 1, az), 1, coc) + &
     728           0 :                                                            fcy*s(coa, 1, cocy)
     729             :                                        END IF
     730           0 :                                        IF (az == 0) THEN
     731             :                                           s(coa, 4, coc) = rbg(3)*s(coa, 1, coc) + &
     732           0 :                                                            fcz*s(coa, 1, cocz)
     733             :                                        ELSE
     734             :                                           s(coa, 4, coc) = rbg(3)*s(coa, 1, coc) + &
     735             :                                                            fz*s(coset(ax, ay, az - 1), 1, coc) + &
     736           0 :                                                            fcz*s(coa, 1, cocz)
     737             :                                        END IF
     738             :                                     END DO
     739             :                                  END DO
     740             : 
     741             : !                     *** Recurrence steps: [a|c|p] -> [a|c|b] ***
     742             : 
     743           0 :                                  DO lb = 2, lb_max
     744             : 
     745             : !                       *** Horizontal recurrence steps ***
     746             : 
     747             : !                       *** [a|c|b] = [a+1i|c|b-1i] - (Bi - Ai)*[a|c|b-1i] ***
     748             : 
     749           0 :                                     IF (lb == lb_max) THEN
     750             :                                        la_start = la_min
     751             :                                     ELSE
     752           0 :                                        la_start = MAX(0, la_min - 1)
     753             :                                     END IF
     754             : 
     755           0 :                                     DO la = la_start, la_max - 1
     756           0 :                                        DO ax = 0, la
     757           0 :                                           DO ay = 0, la - ax
     758           0 :                                              az = la - ax - ay
     759             : 
     760           0 :                                              coa = coset(ax, ay, az)
     761           0 :                                              coax = coset(ax + 1, ay, az)
     762           0 :                                              coay = coset(ax, ay + 1, az)
     763           0 :                                              coaz = coset(ax, ay, az + 1)
     764             : 
     765             : !                             *** Shift of angular momentum ***
     766             : !                             *** component z from a to b   ***
     767             : 
     768             :                                              s(coa, coset(0, 0, lb), coc) = &
     769             :                                                 s(coaz, coset(0, 0, lb - 1), coc) - &
     770           0 :                                                 rab(3)*s(coa, coset(0, 0, lb - 1), coc)
     771             : 
     772             : !                             *** Shift of angular momentum ***
     773             : !                             *** component y from a to b   ***
     774             : 
     775           0 :                                              DO by = 1, lb
     776           0 :                                                 bz = lb - by
     777             :                                                 s(coa, coset(0, by, bz), coc) = &
     778             :                                                    s(coay, coset(0, by - 1, bz), coc) - &
     779           0 :                                                    rab(2)*s(coa, coset(0, by - 1, bz), coc)
     780             :                                              END DO
     781             : 
     782             : !                             *** Shift of angular momentum ***
     783             : !                             *** component x from a to b   ***
     784             : 
     785           0 :                                              DO bx = 1, lb
     786           0 :                                                 DO by = 0, lb - bx
     787           0 :                                                    bz = lb - bx - by
     788             :                                                    s(coa, coset(bx, by, bz), coc) = &
     789             :                                                       s(coax, coset(bx - 1, by, bz), coc) - &
     790           0 :                                                       rab(1)*s(coa, coset(bx - 1, by, bz), coc)
     791             :                                                 END DO
     792             :                                              END DO
     793             : 
     794             :                                           END DO
     795             :                                        END DO
     796             :                                     END DO
     797             : 
     798             : !                       *** Vertical recurrence step ***
     799             : 
     800             : !                       *** [a|c|b] = (Gi - Bi)*[a|c|b-1i] +   ***
     801             : !                       ***           f2*Ni(a)*[a-1i|c|b-1i] + ***
     802             : !                       ***           f2*Ni(b-1i)*[a|c|b-2i] + ***
     803             : !                       ***           f2*Ni(c)*[a|c-1i|b-1i]   ***
     804             : 
     805           0 :                                     DO ax = 0, la_max
     806           0 :                                        fx = f2*REAL(ax, dp)
     807           0 :                                        DO ay = 0, la_max - ax
     808           0 :                                           fy = f2*REAL(ay, dp)
     809           0 :                                           az = la_max - ax - ay
     810           0 :                                           fz = f2*REAL(az, dp)
     811             : 
     812           0 :                                           coa = coset(ax, ay, az)
     813           0 :                                           coax = coset(MAX(0, ax - 1), ay, az)
     814           0 :                                           coay = coset(ax, MAX(0, ay - 1), az)
     815           0 :                                           coaz = coset(ax, ay, MAX(0, az - 1))
     816             : 
     817           0 :                                           f3 = f2*REAL(lb - 1, dp)
     818             : 
     819             : !                           *** Shift of angular momentum ***
     820             : !                           *** component z from a to b   ***
     821             : 
     822           0 :                                           IF (az == 0) THEN
     823             :                                              s(coa, coset(0, 0, lb), coc) = &
     824             :                                                 rbg(3)*s(coa, coset(0, 0, lb - 1), coc) + &
     825             :                                                 f3*s(coa, coset(0, 0, lb - 2), coc) + &
     826           0 :                                                 fcz*s(coa, coset(0, 0, lb - 1), cocz)
     827             :                                           ELSE
     828             :                                              s(coa, coset(0, 0, lb), coc) = &
     829             :                                                 rbg(3)*s(coa, coset(0, 0, lb - 1), coc) + &
     830             :                                                 fz*s(coaz, coset(0, 0, lb - 1), coc) + &
     831             :                                                 f3*s(coa, coset(0, 0, lb - 2), coc) + &
     832           0 :                                                 fcz*s(coa, coset(0, 0, lb - 1), cocz)
     833             :                                           END IF
     834             : 
     835             : !                           *** Shift of angular momentum ***
     836             : !                           *** component y from a to b   ***
     837             : 
     838           0 :                                           IF (ay == 0) THEN
     839           0 :                                              bz = lb - 1
     840             :                                              s(coa, coset(0, 1, bz), coc) = &
     841             :                                                 rbg(2)*s(coa, coset(0, 0, bz), coc) + &
     842           0 :                                                 fcy*s(coa, coset(0, 0, bz), cocy)
     843           0 :                                              DO by = 2, lb
     844           0 :                                                 bz = lb - by
     845           0 :                                                 f3 = f2*REAL(by - 1, dp)
     846             :                                                 s(coa, coset(0, by, bz), coc) = &
     847             :                                                    rbg(2)*s(coa, coset(0, by - 1, bz), coc) + &
     848             :                                                    f3*s(coa, coset(0, by - 2, bz), coc) + &
     849           0 :                                                    fcy*s(coa, coset(0, by - 1, bz), cocy)
     850             :                                              END DO
     851             :                                           ELSE
     852           0 :                                              bz = lb - 1
     853             :                                              s(coa, coset(0, 1, bz), coc) = &
     854             :                                                 rbg(2)*s(coa, coset(0, 0, bz), coc) + &
     855             :                                                 fy*s(coay, coset(0, 0, bz), coc) + &
     856           0 :                                                 fcy*s(coa, coset(0, 0, bz), cocy)
     857           0 :                                              DO by = 2, lb
     858           0 :                                                 bz = lb - by
     859           0 :                                                 f3 = f2*REAL(by - 1, dp)
     860             :                                                 s(coa, coset(0, by, bz), coc) = &
     861             :                                                    rbg(2)*s(coa, coset(0, by - 1, bz), coc) + &
     862             :                                                    fy*s(coay, coset(0, by - 1, bz), coc) + &
     863             :                                                    f3*s(coa, coset(0, by - 2, bz), coc) + &
     864           0 :                                                    fcy*s(coa, coset(0, by - 1, bz), cocy)
     865             :                                              END DO
     866             :                                           END IF
     867             : 
     868             : !                           *** Shift of angular momentum ***
     869             : !                           *** component x from a to b   ***
     870             : 
     871           0 :                                           IF (ax == 0) THEN
     872           0 :                                              DO by = 0, lb - 1
     873           0 :                                                 bz = lb - 1 - by
     874             :                                                 s(coa, coset(1, by, bz), coc) = &
     875             :                                                    rbg(1)*s(coa, coset(0, by, bz), coc) + &
     876           0 :                                                    fcx*s(coa, coset(0, by, bz), cocx)
     877             :                                              END DO
     878           0 :                                              DO bx = 2, lb
     879           0 :                                                 f3 = f2*REAL(bx - 1, dp)
     880           0 :                                                 DO by = 0, lb - bx
     881           0 :                                                    bz = lb - bx - by
     882             :                                                    s(coa, coset(bx, by, bz), coc) = &
     883             :                                                       rbg(1)*s(coa, coset(bx - 1, by, bz), coc) + &
     884             :                                                       f3*s(coa, coset(bx - 2, by, bz), coc) + &
     885           0 :                                                       fcx*s(coa, coset(bx - 1, by, bz), cocx)
     886             :                                                 END DO
     887             :                                              END DO
     888             :                                           ELSE
     889           0 :                                              DO by = 0, lb - 1
     890           0 :                                                 bz = lb - 1 - by
     891             :                                                 s(coa, coset(1, by, bz), coc) = &
     892             :                                                    rbg(1)*s(coa, coset(0, by, bz), coc) + &
     893             :                                                    fx*s(coax, coset(0, by, bz), coc) + &
     894           0 :                                                    fcx*s(coa, coset(0, by, bz), cocx)
     895             :                                              END DO
     896           0 :                                              DO bx = 2, lb
     897           0 :                                                 f3 = f2*REAL(bx - 1, dp)
     898           0 :                                                 DO by = 0, lb - bx
     899           0 :                                                    bz = lb - bx - by
     900             :                                                    s(coa, coset(bx, by, bz), coc) = &
     901             :                                                       rbg(1)*s(coa, coset(bx - 1, by, bz), coc) + &
     902             :                                                       fx*s(coax, coset(bx - 1, by, bz), coc) + &
     903             :                                                       f3*s(coa, coset(bx - 2, by, bz), coc) + &
     904           0 :                                                       fcx*s(coa, coset(bx - 1, by, bz), cocx)
     905             :                                                 END DO
     906             :                                              END DO
     907             :                                           END IF
     908             : 
     909             :                                        END DO
     910             :                                     END DO
     911             : 
     912             :                                  END DO
     913             : 
     914             :                               END IF
     915             : 
     916             :                            ELSE
     917             : 
     918           0 :                               IF (lb_max > 0) THEN
     919             : 
     920             : !                     *** Vertical recurrence steps: [s|c|s] -> [s|c|b] ***
     921             : 
     922           0 :                                  rbg(:) = rcg(:) + rbc(:)
     923             : 
     924             : !                     *** [s|c|p] = (Gi - Bi)*[s|c|s] + f2*Ni(c)*[s|c-1i|s] ***
     925             : 
     926           0 :                                  s(1, 2, coc) = rbg(1)*s(1, 1, coc) + fcx*s(1, 1, cocx)
     927           0 :                                  s(1, 3, coc) = rbg(2)*s(1, 1, coc) + fcy*s(1, 1, cocy)
     928           0 :                                  s(1, 4, coc) = rbg(3)*s(1, 1, coc) + fcz*s(1, 1, cocz)
     929             : 
     930             : !                     *** [s|c|b] = (Gi - Bi)*[s|c|b-1i] + ***
     931             : !                     ***           f2*Ni(b-1i)*[s|c|b-2i] ***
     932             : !                     ***           f2*Ni(c)*[s|c-1i|b-1i] ***
     933             : 
     934           0 :                                  DO lb = 2, lb_max
     935             : 
     936             : !                       *** Increase the angular momentum component z of b ***
     937             : 
     938             :                                     s(1, coset(0, 0, lb), coc) = &
     939             :                                        rbg(3)*s(1, coset(0, 0, lb - 1), coc) + &
     940             :                                        f2*REAL(lb - 1, dp)*s(1, coset(0, 0, lb - 2), coc) + &
     941           0 :                                        fcz*s(1, coset(0, 0, lb - 1), cocz)
     942             : 
     943             : !                       *** Increase the angular momentum component y of b ***
     944             : 
     945           0 :                                     bz = lb - 1
     946             :                                     s(1, coset(0, 1, bz), coc) = &
     947             :                                        rbg(2)*s(1, coset(0, 0, bz), coc) + &
     948           0 :                                        fcy*s(1, coset(0, 0, bz), cocy)
     949             : 
     950           0 :                                     DO by = 2, lb
     951           0 :                                        bz = lb - by
     952             :                                        s(1, coset(0, by, bz), coc) = &
     953             :                                           rbg(2)*s(1, coset(0, by - 1, bz), coc) + &
     954             :                                           f2*REAL(by - 1, dp)*s(1, coset(0, by - 2, bz), coc) + &
     955           0 :                                           fcy*s(1, coset(0, by - 1, bz), cocy)
     956             :                                     END DO
     957             : 
     958             : !                       *** Increase the angular momentum component x of b ***
     959             : 
     960           0 :                                     DO by = 0, lb - 1
     961           0 :                                        bz = lb - 1 - by
     962             :                                        s(1, coset(1, by, bz), coc) = &
     963             :                                           rbg(1)*s(1, coset(0, by, bz), coc) + &
     964           0 :                                           fcx*s(1, coset(0, by, bz), cocx)
     965             :                                     END DO
     966             : 
     967           0 :                                     DO bx = 2, lb
     968           0 :                                        f3 = f2*REAL(bx - 1, dp)
     969           0 :                                        DO by = 0, lb - bx
     970           0 :                                           bz = lb - bx - by
     971             :                                           s(1, coset(bx, by, bz), coc) = &
     972             :                                              rbg(1)*s(1, coset(bx - 1, by, bz), coc) + &
     973             :                                              f3*s(1, coset(bx - 2, by, bz), coc) + &
     974           0 :                                              fcx*s(1, coset(bx - 1, by, bz), cocx)
     975             :                                        END DO
     976             :                                     END DO
     977             : 
     978             :                                  END DO
     979             : 
     980             :                               END IF
     981             : 
     982             :                            END IF
     983             : 
     984             :                         END DO
     985             :                      END DO
     986             : 
     987             :                   END DO
     988             : 
     989             :                END IF
     990             : 
     991             : !         *** Store integrals
     992             : 
     993           0 :                IF (PRESENT(int_abc_ext)) THEN
     994           0 :                   DO k = ncoset(lc_min_set - 1) + 1, ncoset(lc_max_set)
     995           0 :                      DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     996           0 :                         DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     997           0 :                            sabc(na + i, nb + j, nc + k) = s(i, j, k)
     998           0 :                            int_abc_ext = MAX(int_abc_ext, ABS(s(i, j, k)))
     999             :                         END DO
    1000             :                      END DO
    1001             :                   END DO
    1002             :                ELSE
    1003           0 :                   DO k = ncoset(lc_min_set - 1) + 1, ncoset(lc_max_set)
    1004           0 :                      DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
    1005           0 :                         DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
    1006           0 :                            sabc(na + i, nb + j, nc + k) = s(i, j, k)
    1007             :                         END DO
    1008             :                      END DO
    1009             :                   END DO
    1010             :                END IF
    1011             : 
    1012             : !         *** Calculate the requested derivatives with respect to  ***
    1013             : !         *** the nuclear coordinates of the atomic center a and c ***
    1014             : 
    1015           0 :                IF (PRESENT(sdabc) .OR. PRESENT(sabdc)) THEN
    1016             :                   CALL derivatives_overlap3(la_max_set, la_min_set, lb_max_set, lb_min_set, &
    1017             :                                             lc_max_set, lc_min_set, zeta(ipgf), zetc(kpgf), &
    1018           0 :                                             s, sda, sdc)
    1019             :                END IF
    1020             : 
    1021             : !         *** Store the first derivatives of the primitive overlap integrals ***
    1022             : 
    1023           0 :                IF (PRESENT(sdabc)) THEN
    1024           0 :                   DO k = 1, 3
    1025           0 :                      DO l = 1, ncoset(lc_max_set)
    1026           0 :                         DO j = 1, ncoset(lb_max_set)
    1027           0 :                            DO i = 1, ncoset(la_max_set)
    1028           0 :                               sdabc(nda + i, nb + j, nc + l, k) = sda(i, j, l, k)
    1029             :                            END DO
    1030             :                         END DO
    1031             :                      END DO
    1032             :                   END DO
    1033             :                END IF
    1034             : 
    1035           0 :                IF (PRESENT(sabdc)) THEN
    1036           0 :                   DO k = 1, 3
    1037           0 :                      DO l = 1, ncoset(lc_max_set)
    1038           0 :                         DO j = 1, ncoset(lb_max_set)
    1039           0 :                            DO i = 1, ncoset(la_max_set)
    1040           0 :                               sabdc(na + i, nb + j, ndc + l, k) = sdc(i, j, l, k)
    1041             :                            END DO
    1042             :                         END DO
    1043             :                      END DO
    1044             :                   END DO
    1045             :                END IF
    1046             : 
    1047           0 :                nc = nc + ncoset(lc_max_set)
    1048           0 :                ndc = ndc + ncoset(lc_max_set)
    1049             :             END DO
    1050             : 
    1051           0 :             nb = nb + ncoset(lb_max)
    1052             :          END DO
    1053             : 
    1054           0 :          na = na + ncoset(la_max_set)
    1055           0 :          nda = nda + ncoset(la_max_set)
    1056             :       END DO
    1057             : 
    1058           0 :       DEALLOCATE (s)
    1059           0 :       IF (PRESENT(sdabc)) THEN
    1060           0 :          DEALLOCATE (sda)
    1061             :       END IF
    1062           0 :       IF (PRESENT(sabdc)) THEN
    1063           0 :          DEALLOCATE (sdc)
    1064             :       END IF
    1065             : 
    1066           0 :       CALL timestop(handle)
    1067             : 
    1068           0 :    END SUBROUTINE overlap3
    1069             : 
    1070             : ! **************************************************************************************************
    1071             : !> \brief Calculates the derivatives of the three-center overlap integral [a|b|c]
    1072             : !>        with respect to the nuclear coordinates of the atomic center a and c
    1073             : !> \param la_max_set ...
    1074             : !> \param la_min_set ...
    1075             : !> \param lb_max_set ...
    1076             : !> \param lb_min_set ...
    1077             : !> \param lc_max_set ...
    1078             : !> \param lc_min_set ...
    1079             : !> \param zeta ...
    1080             : !> \param zetc ...
    1081             : !> \param s integrals [a|b|c]
    1082             : !> \param sda derivative [da/dAi|b|c]
    1083             : !> \param sdc derivative [a|b|dc/dCi]
    1084             : ! **************************************************************************************************
    1085           0 :    SUBROUTINE derivatives_overlap3(la_max_set, la_min_set, lb_max_set, lb_min_set, &
    1086             :                                    lc_max_set, lc_min_set, zeta, zetc, s, sda, sdc)
    1087             : 
    1088             :       INTEGER, INTENT(IN)                                :: la_max_set, la_min_set, lb_max_set, &
    1089             :                                                             lb_min_set, lc_max_set, lc_min_set
    1090             :       REAL(KIND=dp), INTENT(IN)                          :: zeta, zetc
    1091             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: s
    1092             :       REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER      :: sda, sdc
    1093             : 
    1094             :       CHARACTER(len=*), PARAMETER :: routineN = 'derivatives_overlap3'
    1095             : 
    1096             :       INTEGER :: ax, ay, az, bx, by, bz, coa, coamx, coamy, coamz, coapx, coapy, coapz, cob, coc, &
    1097             :          cocmx, cocmy, cocmz, cocpx, cocpy, cocpz, cx, cy, cz, devx, devy, devz, handle, la, lb, lc
    1098             :       REAL(KIND=dp)                                      :: fax, fay, faz, fcx, fcy, fcz, fexpa, &
    1099             :                                                             fexpc
    1100             : 
    1101           0 :       CALL timeset(routineN, handle)
    1102             : 
    1103           0 :       fexpa = 2.0_dp*zeta
    1104           0 :       fexpc = 2.0_dp*zetc
    1105             : 
    1106             : !   derivative with respec to x,y,z
    1107             : 
    1108           0 :       devx = 1
    1109           0 :       devy = 2
    1110           0 :       devz = 3
    1111             : 
    1112             : !   *** [da/dAi|b|c] = 2*zeta*[a+1i|b|c] - Ni(a)[a-1i|b|c] ***
    1113             : !   *** [a|b|dc/dCi] = 2*zetc*[a|b|c+1i] - Ni(c)[a|b|c-1i] ***
    1114             : 
    1115           0 :       DO la = la_min_set, la_max_set
    1116           0 :          DO ax = 0, la
    1117           0 :             fax = REAL(ax, dp)
    1118           0 :             DO ay = 0, la - ax
    1119           0 :                fay = REAL(ay, dp)
    1120           0 :                az = la - ax - ay
    1121           0 :                faz = REAL(az, dp)
    1122           0 :                coa = coset(ax, ay, az)
    1123           0 :                coamx = coset(ax - 1, ay, az)
    1124           0 :                coamy = coset(ax, ay - 1, az)
    1125           0 :                coamz = coset(ax, ay, az - 1)
    1126           0 :                coapx = coset(ax + 1, ay, az)
    1127           0 :                coapy = coset(ax, ay + 1, az)
    1128           0 :                coapz = coset(ax, ay, az + 1)
    1129           0 :                DO lb = lb_min_set, lb_max_set
    1130           0 :                   DO bx = 0, lb
    1131           0 :                      DO by = 0, lb - bx
    1132           0 :                         bz = lb - bx - by
    1133           0 :                         cob = coset(bx, by, bz)
    1134           0 :                         DO lc = lc_min_set, lc_max_set
    1135           0 :                            DO cx = 0, lc
    1136           0 :                               fcx = REAL(cx, dp)
    1137           0 :                               DO cy = 0, lc - cx
    1138           0 :                                  fcy = REAL(cy, dp)
    1139           0 :                                  cz = lc - cx - cy
    1140           0 :                                  fcz = REAL(cz, dp)
    1141           0 :                                  coc = coset(cx, cy, cz)
    1142           0 :                                  cocmx = coset(cx - 1, cy, cz)
    1143           0 :                                  cocmy = coset(cx, cy - 1, cz)
    1144           0 :                                  cocmz = coset(cx, cy, cz - 1)
    1145           0 :                                  cocpx = coset(cx + 1, cy, cz)
    1146           0 :                                  cocpy = coset(cx, cy + 1, cz)
    1147           0 :                                  cocpz = coset(cx, cy, cz + 1)
    1148           0 :                                  IF (ASSOCIATED(sda)) THEN
    1149             :                                     sda(coa, cob, coc, devx) = fexpa*s(coapx, cob, coc) - &
    1150           0 :                                                                fax*s(coamx, cob, coc)
    1151             :                                     sda(coa, cob, coc, devy) = fexpa*s(coapy, cob, coc) - &
    1152           0 :                                                                fay*s(coamy, cob, coc)
    1153             :                                     sda(coa, cob, coc, devz) = fexpa*s(coapz, cob, coc) - &
    1154           0 :                                                                faz*s(coamz, cob, coc)
    1155             :                                  END IF
    1156           0 :                                  IF (ASSOCIATED(sdc)) THEN
    1157             :                                     sdc(coa, cob, coc, devx) = fexpc*s(coa, cob, cocpx) - &
    1158           0 :                                                                fcx*s(coa, cob, cocmx)
    1159             :                                     sdc(coa, cob, coc, devy) = fexpc*s(coa, cob, cocpy) - &
    1160           0 :                                                                fcy*s(coa, cob, cocmy)
    1161             :                                     sdc(coa, cob, coc, devz) = fexpc*s(coa, cob, cocpz) - &
    1162           0 :                                                                fcz*s(coa, cob, cocmz)
    1163             :                                  END IF
    1164             :                               END DO
    1165             :                            END DO
    1166             :                         END DO
    1167             :                      END DO
    1168             :                   END DO
    1169             :                END DO
    1170             :             END DO
    1171             :          END DO
    1172             :       END DO
    1173             : 
    1174           0 :       CALL timestop(handle)
    1175             : 
    1176           0 :    END SUBROUTINE derivatives_overlap3
    1177             : 
    1178             : END MODULE ai_overlap3

Generated by: LCOV version 1.15