LCOV - code coverage report
Current view: top level - src/aobasis - ai_coulomb.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:66ce584) Lines: 96.5 % 454 438
Test Date: 2026-09-12 06:50:25 Functions: 100.0 % 2 2

            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 Coulomb integrals over Cartesian Gaussian-type functions
      10              : !>      (electron repulsion integrals, ERIs).
      11              : !> \par Literature
      12              : !>      S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
      13              : !> \par History
      14              : !>      none
      15              : !> \par Parameters
      16              : !>       - ax,ay,az    : Angular momentum index numbers of orbital a.
      17              : !>       - bx,by,bz    : Angular momentum index numbers of orbital b.
      18              : !>       - cx,cy,cz    : Angular momentum index numbers of orbital c.
      19              : !>       - coset       : Cartesian orbital set pointer.
      20              : !>       - dab         : Distance between the atomic centers a and b.
      21              : !>       - dac         : Distance between the atomic centers a and c.
      22              : !>       - dbc         : Distance between the atomic centers b and c.
      23              : !>       - gccc        : Prefactor of the primitive Gaussian function c.
      24              : !>       - l{a,b,c}    : Angular momentum quantum number of shell a, b or c.
      25              : !>       - l{a,b,c}_max: Maximum angular momentum quantum number of shell a, b or c.
      26              : !>       - l{a,b,c}_min: Minimum angular momentum quantum number of shell a, b or c.
      27              : !>       - ncoset      : Number of orbitals in a Cartesian orbital set.
      28              : !>       - npgf{a,b}   : Degree of contraction of shell a or b.
      29              : !>       - rab         : Distance vector between the atomic centers a and b.
      30              : !>       - rab2        : Square of the distance between the atomic centers a and b.
      31              : !>       - rac         : Distance vector between the atomic centers a and c.
      32              : !>       - rac2        : Square of the distance between the atomic centers a and c.
      33              : !>       - rbc         : Distance vector between the atomic centers b and c.
      34              : !>       - rbc2        : Square of the distance between the atomic centers b and c.
      35              : !>       - rpgf{a,b,c} : Radius of the primitive Gaussian-type function a, b or c.
      36              : !>       - zet{a,b,c}  : Exponents of the Gaussian-type functions a, b or c.
      37              : !>       - zetp        : Reciprocal of the sum of the exponents of orbital a and b.
      38              : !>       - zetw        : Reciprocal of the sum of the exponents of orbital a, b and c.
      39              : !> \author Matthias Krack (22.08.2000)
      40              : ! **************************************************************************************************
      41              : MODULE ai_coulomb
      42              : 
      43              :    USE gamma,                           ONLY: fgamma => fgamma_0
      44              :    USE kinds,                           ONLY: dp
      45              :    USE mathconstants,                   ONLY: pi
      46              :    USE orbital_pointers,                ONLY: coset,&
      47              :                                               ncoset
      48              : #include "../base/base_uses.f90"
      49              : 
      50              :    IMPLICIT NONE
      51              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_coulomb'
      52              :    PRIVATE
      53              : 
      54              :    ! *** Public subroutines ***
      55              : 
      56              :    PUBLIC :: coulomb2, coulomb3
      57              : 
      58              : CONTAINS
      59              : 
      60              : ! **************************************************************************************************
      61              : !> \brief   Calculation of the primitive two-center Coulomb integrals over
      62              : !>          Cartesian Gaussian-type functions.
      63              : !> \param la_max ...
      64              : !> \param npgfa ...
      65              : !> \param zeta ...
      66              : !> \param rpgfa ...
      67              : !> \param la_min ...
      68              : !> \param lc_max ...
      69              : !> \param npgfc ...
      70              : !> \param zetc ...
      71              : !> \param rpgfc ...
      72              : !> \param lc_min ...
      73              : !> \param rac ...
      74              : !> \param rac2 ...
      75              : !> \param vac ...
      76              : !> \param v ...
      77              : !> \param f ...
      78              : !> \param screening optional primitive-pair screening switch
      79              : !> \date    05.12.2000
      80              : !> \author  Matthias Krack
      81              : !> \version 1.0
      82              : ! **************************************************************************************************
      83         3108 :    SUBROUTINE coulomb2(la_max, npgfa, zeta, rpgfa, la_min, lc_max, npgfc, zetc, rpgfc, lc_min, &
      84         4662 :                        rac, rac2, vac, v, f, screening)
      85              :       INTEGER, INTENT(IN)                                :: la_max, npgfa
      86              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zeta, rpgfa
      87              :       INTEGER, INTENT(IN)                                :: la_min, lc_max, npgfc
      88              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zetc, rpgfc
      89              :       INTEGER, INTENT(IN)                                :: lc_min
      90              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
      91              :       REAL(KIND=dp), INTENT(IN)                          :: rac2
      92              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: vac
      93              :       REAL(KIND=dp), DIMENSION(:, :, :)                  :: v
      94              :       REAL(KIND=dp), DIMENSION(0:)                       :: f
      95              :       LOGICAL, INTENT(IN), OPTIONAL                      :: screening
      96              : 
      97              :       INTEGER                                            :: ax, ay, az, coc, cocx, cocy, cocz, cx, &
      98              :                                                             cy, cz, i, ipgf, j, jpgf, la, lc, n, &
      99              :                                                             na, nc, nmax
     100              :       LOGICAL                                            :: do_screening
     101              :       REAL(KIND=dp)                                      :: dac, f0, f1, f2, f3, f4, f5, f6, fcx, &
     102              :                                                             fcy, fcz, rho, t, zetp, zetq, zetw
     103              :       REAL(KIND=dp), DIMENSION(3)                        :: raw, rcw
     104              : 
     105         1554 :       do_screening = .TRUE.
     106         1554 :       IF (PRESENT(screening)) do_screening = screening
     107              : 
     108      5324566 :       v = 0.0_dp
     109              : 
     110         1554 :       nmax = la_max + lc_max + 1
     111              : 
     112         1554 :       dac = SQRT(rac2)
     113              : 
     114              :       ! *** Loop over all pairs of primitive Gaussian-type functions ***
     115              : 
     116         1554 :       na = 0
     117         3558 :       DO ipgf = 1, npgfa
     118              : 
     119         2004 :          nc = 0
     120              : 
     121         5808 :          DO jpgf = 1, npgfc
     122              : 
     123         3804 :             IF (do_screening .AND. rpgfa(ipgf) + rpgfc(jpgf) < dac) THEN
     124            0 :                DO j = nc + ncoset(lc_min - 1) + 1, nc + ncoset(lc_max)
     125            0 :                   DO i = na + ncoset(la_min - 1) + 1, na + ncoset(la_max)
     126            0 :                      vac(i, j) = 0.0_dp
     127              :                   END DO
     128              :                END DO
     129            0 :                nc = nc + ncoset(lc_max)
     130            0 :                CYCLE
     131              :             END IF
     132              : 
     133              :             ! *** Calculate some prefactors ***
     134              : 
     135         3804 :             zetp = 1.0_dp/zeta(ipgf)
     136         3804 :             zetq = 1.0_dp/zetc(jpgf)
     137         3804 :             zetw = 1.0_dp/(zeta(ipgf) + zetc(jpgf))
     138              : 
     139         3804 :             rho = zeta(ipgf)*zetc(jpgf)*zetw
     140              : 
     141         3804 :             f0 = 2.0_dp*SQRT(pi**5*zetw)*zetp*zetq
     142              : 
     143              :             ! *** Calculate the incomplete Gamma function ***
     144              : 
     145         3804 :             t = rho*rac2
     146              : 
     147         3804 :             CALL fgamma(nmax - 1, t, f)
     148              : 
     149              :             ! *** Calculate the basic two-center Coulomb integrals [s||s]{n} ***
     150              : 
     151        13367 :             DO n = 1, nmax
     152        13367 :                v(1, 1, n) = f0*f(n - 1)
     153              :             END DO
     154              : 
     155              :             ! *** Vertical recurrence steps: [s||s] -> [s||c] ***
     156              : 
     157         3804 :             IF (lc_max > 0) THEN
     158              : 
     159         1607 :                f1 = 0.5_dp*zetq
     160         1607 :                f2 = -rho*zetq
     161              : 
     162         6428 :                rcw(:) = -zeta(ipgf)*zetw*rac(:)
     163              : 
     164              :                ! *** [s||p]{n} = (Wi - Ci)*[s||s]{n+1}  (i = x,y,z) ***
     165              : 
     166         6853 :                DO n = 1, nmax - 1
     167         5246 :                   v(1, 2, n) = rcw(1)*v(1, 1, n + 1)
     168         5246 :                   v(1, 3, n) = rcw(2)*v(1, 1, n + 1)
     169         6853 :                   v(1, 4, n) = rcw(3)*v(1, 1, n + 1)
     170              :                END DO
     171              : 
     172              :                ! ** [s||c]{n} = (Wi - Ci)*[s||c-1i]{n+1} +     ***
     173              :                ! **             f1*Ni(c-1i)*(   [s||c-2i]{n} + ***
     174              :                ! **                          f2*[s||c-2i]{n+1} ***
     175              : 
     176         2899 :                DO lc = 2, lc_max
     177              : 
     178         8745 :                   DO n = 1, nmax - lc
     179              : 
     180              :                      ! **** Increase the angular momentum component z of c ***
     181              : 
     182              :                      v(1, coset(0, 0, lc), n) = &
     183              :                         rcw(3)*v(1, coset(0, 0, lc - 1), n + 1) + &
     184              :                         f1*REAL(lc - 1, dp)*(v(1, coset(0, 0, lc - 2), n) + &
     185         5846 :                                              f2*v(1, coset(0, 0, lc - 2), n + 1))
     186              : 
     187              :                      ! *** Increase the angular momentum component y of c ***
     188              : 
     189         5846 :                      cz = lc - 1
     190         5846 :                      v(1, coset(0, 1, cz), n) = rcw(2)*v(1, coset(0, 0, cz), n + 1)
     191              : 
     192        17072 :                      DO cy = 2, lc
     193        11226 :                         cz = lc - cy
     194              :                         v(1, coset(0, cy, cz), n) = &
     195              :                            rcw(2)*v(1, coset(0, cy - 1, cz), n + 1) + &
     196              :                            f1*REAL(cy - 1, dp)*(v(1, coset(0, cy - 2, cz), n) + &
     197        17072 :                                                 f2*v(1, coset(0, cy - 2, cz), n + 1))
     198              :                      END DO
     199              : 
     200              :                      ! *** Increase the angular momentum component x of c ***
     201              : 
     202        22918 :                      DO cy = 0, lc - 1
     203        17072 :                         cz = lc - 1 - cy
     204        22918 :                         v(1, coset(1, cy, cz), n) = rcw(1)*v(1, coset(0, cy, cz), n + 1)
     205              :                      END DO
     206              : 
     207        18364 :                      DO cx = 2, lc
     208        11226 :                         f6 = f1*REAL(cx - 1, dp)
     209        37198 :                         DO cy = 0, lc - cx
     210        20126 :                            cz = lc - cx - cy
     211              :                            v(1, coset(cx, cy, cz), n) = &
     212              :                               rcw(1)*v(1, coset(cx - 1, cy, cz), n + 1) + &
     213              :                               f6*(v(1, coset(cx - 2, cy, cz), n) + &
     214        31352 :                                   f2*v(1, coset(cx - 2, cy, cz), n + 1))
     215              :                         END DO
     216              :                      END DO
     217              : 
     218              :                   END DO
     219              : 
     220              :                END DO
     221              : 
     222              :             END IF
     223              : 
     224              :             ! *** Vertical recurrence steps: [s||c] -> [a||c] ***
     225              : 
     226         3804 :             IF (la_max > 0) THEN
     227              : 
     228         1592 :                f3 = 0.5_dp*zetp
     229         1592 :                f4 = -rho*zetp
     230         1592 :                f5 = 0.5_dp*zetw
     231              : 
     232         6368 :                raw(:) = zetc(jpgf)*zetw*rac(:)
     233              : 
     234              :                ! *** [p||s]{n} = (Wi - Ai)*[s||s]{n+1}  (i = x,y,z) ***
     235              : 
     236         6808 :                DO n = 1, nmax - 1
     237         5216 :                   v(2, 1, n) = raw(1)*v(1, 1, n + 1)
     238         5216 :                   v(3, 1, n) = raw(2)*v(1, 1, n + 1)
     239         6808 :                   v(4, 1, n) = raw(3)*v(1, 1, n + 1)
     240              :                END DO
     241              : 
     242              :                ! *** [a||s]{n} = (Wi - Ai)*[a-1i||s]{n+1} +      ***
     243              :                ! ***             f3*Ni(a-1i)*(   [a-2i||s]{n} +  ***
     244              :                ! ***                          f4*[a-2i||s]{n+1}) ***
     245              : 
     246         2860 :                DO la = 2, la_max
     247              : 
     248         8675 :                   DO n = 1, nmax - la
     249              : 
     250              :                      ! *** Increase the angular momentum component z of a ***
     251              : 
     252              :                      v(coset(0, 0, la), 1, n) = &
     253              :                         raw(3)*v(coset(0, 0, la - 1), 1, n + 1) + &
     254              :                         f3*REAL(la - 1, dp)*(v(coset(0, 0, la - 2), 1, n) + &
     255         5815 :                                              f4*v(coset(0, 0, la - 2), 1, n + 1))
     256              : 
     257              :                      ! *** Increase the angular momentum component y of a ***
     258              : 
     259         5815 :                      az = la - 1
     260         5815 :                      v(coset(0, 1, az), 1, n) = raw(2)*v(coset(0, 0, az), 1, n + 1)
     261              : 
     262        17016 :                      DO ay = 2, la
     263        11201 :                         az = la - ay
     264              :                         v(coset(0, ay, az), 1, n) = &
     265              :                            raw(2)*v(coset(0, ay - 1, az), 1, n + 1) + &
     266              :                            f3*REAL(ay - 1, dp)*(v(coset(0, ay - 2, az), 1, n) + &
     267        17016 :                                                 f4*v(coset(0, ay - 2, az), 1, n + 1))
     268              :                      END DO
     269              : 
     270              :                      ! *** Increase the angular momentum component x of a ***
     271              : 
     272        22831 :                      DO ay = 0, la - 1
     273        17016 :                         az = la - 1 - ay
     274        22831 :                         v(coset(1, ay, az), 1, n) = raw(1)*v(coset(0, ay, az), 1, n + 1)
     275              :                      END DO
     276              : 
     277        18284 :                      DO ax = 2, la
     278        11201 :                         f6 = f3*REAL(ax - 1, dp)
     279        37123 :                         DO ay = 0, la - ax
     280        20107 :                            az = la - ax - ay
     281              :                            v(coset(ax, ay, az), 1, n) = &
     282              :                               raw(1)*v(coset(ax - 1, ay, az), 1, n + 1) + &
     283              :                               f6*(v(coset(ax - 2, ay, az), 1, n) + &
     284        31308 :                                   f4*v(coset(ax - 2, ay, az), 1, n + 1))
     285              :                         END DO
     286              :                      END DO
     287              : 
     288              :                   END DO
     289              : 
     290              :                END DO
     291              : 
     292         3948 :                DO lc = 1, lc_max
     293              : 
     294        10600 :                   DO cx = 0, lc
     295        23248 :                      DO cy = 0, lc - cx
     296        14240 :                         cz = lc - cx - cy
     297              : 
     298        14240 :                         coc = coset(cx, cy, cz)
     299        14240 :                         cocx = coset(MAX(0, cx - 1), cy, cz)
     300        14240 :                         cocy = coset(cx, MAX(0, cy - 1), cz)
     301        14240 :                         cocz = coset(cx, cy, MAX(0, cz - 1))
     302              : 
     303        14240 :                         fcx = f5*REAL(cx, dp)
     304        14240 :                         fcy = f5*REAL(cy, dp)
     305        14240 :                         fcz = f5*REAL(cz, dp)
     306              : 
     307              :                         ! *** [p||c]{n} = (Wi - Ai)*[s||c]{n+1} + ***
     308              :                         ! ***             f5*Ni(c)*[s||c-1i]{n+1} ***
     309              : 
     310        72773 :                         DO n = 1, nmax - 1 - lc
     311        58533 :                            v(2, coc, n) = raw(1)*v(1, coc, n + 1) + fcx*v(1, cocx, n + 1)
     312        58533 :                            v(3, coc, n) = raw(2)*v(1, coc, n + 1) + fcy*v(1, cocy, n + 1)
     313        72773 :                            v(4, coc, n) = raw(3)*v(1, coc, n + 1) + fcz*v(1, cocz, n + 1)
     314              :                         END DO
     315              : 
     316              :                         ! *** [a||c]{n} = (Wi - Ai)*[a-1i||c]{n+1} +        ***
     317              :                         ! ***             f3*Ni(a-1i)*(   [a-2i||c]{n} +    ***
     318              :                         ! ***                          f4*[a-2i||c]{n+1}) + ***
     319              :                         ! ***             f5*Ni(c)*[a-1i||c-1i]{n+1}        ***
     320              : 
     321        54605 :                         DO la = 2, la_max
     322              : 
     323       164268 :                            DO n = 1, nmax - la - lc
     324              : 
     325              :                               ! *** Increase the angular momentum component z of a ***
     326              : 
     327              :                               v(coset(0, 0, la), coc, n) = &
     328              :                                  raw(3)*v(coset(0, 0, la - 1), coc, n + 1) + &
     329              :                                  f3*REAL(la - 1, dp)*(v(coset(0, 0, la - 2), coc, n) + &
     330              :                                                       f4*v(coset(0, 0, la - 2), coc, n + 1)) + &
     331       116315 :                                  fcz*v(coset(0, 0, la - 1), cocz, n + 1)
     332              : 
     333              :                               ! *** Increase the angular momentum component y of a ***
     334              : 
     335       116315 :                               az = la - 1
     336              :                               v(coset(0, 1, az), coc, n) = &
     337              :                                  raw(2)*v(coset(0, 0, az), coc, n + 1) + &
     338       116315 :                                  fcy*v(coset(0, 0, az), cocy, n + 1)
     339              : 
     340       372244 :                               DO ay = 2, la
     341       255929 :                                  az = la - ay
     342              :                                  v(coset(0, ay, az), coc, n) = &
     343              :                                     raw(2)*v(coset(0, ay - 1, az), coc, n + 1) + &
     344              :                                     f3*REAL(ay - 1, dp)*(v(coset(0, ay - 2, az), coc, n) + &
     345              :                                                          f4*v(coset(0, ay - 2, az), coc, n + 1)) + &
     346       372244 :                                     fcy*v(coset(0, ay - 1, az), cocy, n + 1)
     347              :                               END DO
     348              : 
     349              :                               ! *** Increase the angular momentum component x of a ***
     350              : 
     351       488559 :                               DO ay = 0, la - 1
     352       372244 :                                  az = la - 1 - ay
     353              :                                  v(coset(1, ay, az), coc, n) = &
     354              :                                     raw(1)*v(coset(0, ay, az), coc, n + 1) + &
     355       488559 :                                     fcx*v(coset(0, ay, az), cocx, n + 1)
     356              :                               END DO
     357              : 
     358       405957 :                               DO ax = 2, la
     359       255929 :                                  f6 = f3*REAL(ax - 1, dp)
     360       867307 :                                  DO ay = 0, la - ax
     361       495063 :                                     az = la - ax - ay
     362              :                                     v(coset(ax, ay, az), coc, n) = &
     363              :                                        raw(1)*v(coset(ax - 1, ay, az), coc, n + 1) + &
     364              :                                        f6*(v(coset(ax - 2, ay, az), coc, n) + &
     365              :                                            f4*v(coset(ax - 2, ay, az), coc, n + 1)) + &
     366       750992 :                                        fcx*v(coset(ax - 1, ay, az), cocx, n + 1)
     367              :                                  END DO
     368              :                               END DO
     369              : 
     370              :                            END DO
     371              : 
     372              :                         END DO
     373              : 
     374              :                      END DO
     375              :                   END DO
     376              : 
     377              :                END DO
     378              : 
     379              :             END IF
     380              : 
     381        15568 :             DO j = ncoset(lc_min - 1) + 1, ncoset(lc_max)
     382       103964 :                DO i = ncoset(la_min - 1) + 1, ncoset(la_max)
     383       100160 :                   vac(na + i, nc + j) = v(i, j, 1)
     384              :                END DO
     385              :             END DO
     386              : 
     387         5808 :             nc = nc + ncoset(lc_max)
     388              : 
     389              :          END DO
     390              : 
     391         3558 :          na = na + ncoset(la_max)
     392              : 
     393              :       END DO
     394              : 
     395         1554 :    END SUBROUTINE coulomb2
     396              : ! **************************************************************************************************
     397              : !> \brief   Calculation of the primitive three-center Coulomb integrals over
     398              : !>          Cartesian Gaussian-type functions (electron repulsion integrals,
     399              : !>          ERIs).
     400              : !> \param la_max ...
     401              : !> \param npgfa ...
     402              : !> \param zeta ...
     403              : !> \param rpgfa ...
     404              : !> \param la_min ...
     405              : !> \param lb_max ...
     406              : !> \param npgfb ...
     407              : !> \param zetb ...
     408              : !> \param rpgfb ...
     409              : !> \param lb_min ...
     410              : !> \param lc_max ...
     411              : !> \param zetc ...
     412              : !> \param rpgfc ...
     413              : !> \param lc_min ...
     414              : !> \param gccc ...
     415              : !> \param rab ...
     416              : !> \param rab2 ...
     417              : !> \param rac ...
     418              : !> \param rac2 ...
     419              : !> \param rbc2 ...
     420              : !> \param vabc ...
     421              : !> \param int_abc ...
     422              : !> \param v ...
     423              : !> \param f ...
     424              : !> \param maxder ...
     425              : !> \param vabc_plus ...
     426              : !> \date    06.11.2000
     427              : !> \author  Matthias Krack
     428              : !> \version 1.0
     429              : ! **************************************************************************************************
     430         1620 :    SUBROUTINE coulomb3(la_max, npgfa, zeta, rpgfa, la_min, lb_max, npgfb, zetb, rpgfb, lb_min, &
     431         3240 :                        lc_max, zetc, rpgfc, lc_min, gccc, rab, rab2, rac, rac2, rbc2, vabc, int_abc, &
     432         4860 :                        v, f, maxder, vabc_plus)
     433              :       INTEGER, INTENT(IN)                                :: la_max, npgfa
     434              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zeta, rpgfa
     435              :       INTEGER, INTENT(IN)                                :: la_min, lb_max, npgfb
     436              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zetb, rpgfb
     437              :       INTEGER, INTENT(IN)                                :: lb_min, lc_max
     438              :       REAL(KIND=dp), INTENT(IN)                          :: zetc, rpgfc
     439              :       INTEGER, INTENT(IN)                                :: lc_min
     440              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: gccc
     441              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     442              :       REAL(KIND=dp), INTENT(IN)                          :: rab2
     443              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
     444              :       REAL(KIND=dp), INTENT(IN)                          :: rac2, rbc2
     445              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: vabc
     446              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(OUT)     :: int_abc
     447              :       REAL(KIND=dp), DIMENSION(:, :, :, :)               :: v
     448              :       REAL(KIND=dp), DIMENSION(0:)                       :: f
     449              :       INTEGER, INTENT(IN), OPTIONAL                      :: maxder
     450              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL           :: vabc_plus
     451              : 
     452              :       INTEGER                                            :: ax, ay, az, bx, by, bz, coc, cocx, cocy, &
     453              :                                                             cocz, cx, cy, cz, i, ipgf, j, jpgf, k, &
     454              :                                                             kk, la, la_start, lb, lc, &
     455              :                                                             maxder_local, n, na, nap, nb, nmax
     456              :       REAL(KIND=dp)                                      :: dab, dac, dbc, f0, f1, f2, f3, f4, f5, &
     457              :                                                             f6, f7, fcx, fcy, fcz, fx, fy, fz, t, &
     458              :                                                             zetp, zetq, zetw
     459              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp, rcp, rcw, rpw
     460              : 
     461      1374540 :       v = 0.0_dp
     462              : 
     463         1620 :       maxder_local = 0
     464         1620 :       IF (PRESENT(maxder)) THEN
     465            0 :          maxder_local = maxder
     466              :       END IF
     467              : 
     468         1620 :       nmax = la_max + lb_max + lc_max + 1
     469              : 
     470              :       ! *** Calculate the distances of the centers a, b and c ***
     471              : 
     472         1620 :       dab = SQRT(rab2)
     473         1620 :       dac = SQRT(rac2)
     474         1620 :       dbc = SQRT(rbc2)
     475              : 
     476              :       ! *** Initialize integrals array
     477       168570 :       int_abc = 0.0_dp
     478              : 
     479              :       ! *** Loop over all pairs of primitive Gaussian-type functions ***
     480              : 
     481         1620 :       na = 0
     482         1620 :       nap = 0
     483              : 
     484         4320 :       DO ipgf = 1, npgfa
     485              : 
     486              :          ! *** Screening ***
     487         2700 :          IF (rpgfa(ipgf) + rpgfc < dac) THEN
     488            0 :             na = na + ncoset(la_max - maxder_local)
     489            0 :             nap = nap + ncoset(la_max)
     490            0 :             CYCLE
     491              :          END IF
     492              : 
     493         2700 :          nb = 0
     494              : 
     495         7200 :          DO jpgf = 1, npgfb
     496              : 
     497              :             ! *** Screening ***
     498              :             IF ( &
     499         4500 :                (rpgfb(jpgf) + rpgfc < dbc) .OR. &
     500              :                (rpgfa(ipgf) + rpgfb(jpgf) < dab)) THEN
     501            0 :                nb = nb + ncoset(lb_max)
     502            0 :                CYCLE
     503              :             END IF
     504              : 
     505              :             ! *** Calculate some prefactors ***
     506              : 
     507         4500 :             zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
     508         4500 :             zetq = 1.0_dp/zetc
     509         4500 :             zetw = 1.0_dp/(zeta(ipgf) + zetb(jpgf) + zetc)
     510              : 
     511         4500 :             f0 = 2.0_dp*SQRT(pi**5*zetw)*zetp*zetq
     512         4500 :             f1 = zetb(jpgf)*zetp
     513         4500 :             f2 = 0.5_dp*zetp
     514         4500 :             f4 = -zetc*zetw
     515              : 
     516         4500 :             f0 = f0*EXP(-zeta(ipgf)*f1*rab2)
     517              : 
     518        18000 :             rap(:) = f1*rab(:)
     519        18000 :             rcp(:) = rap(:) - rac(:)
     520        18000 :             rpw(:) = f4*rcp(:)
     521              : 
     522              :             ! *** Calculate the incomplete Gamma function ***
     523              : 
     524         4500 :             t = -f4*(rcp(1)*rcp(1) + rcp(2)*rcp(2) + rcp(3)*rcp(3))/zetp
     525              : 
     526         4500 :             CALL fgamma(nmax - 1, t, f)
     527              : 
     528              :             ! *** Calculate the basic three-center Coulomb integrals [ss||s]{n} ***
     529              : 
     530        18300 :             DO n = 1, nmax
     531        18300 :                v(1, 1, 1, n) = f0*f(n - 1)
     532              :             END DO
     533              : 
     534              :             ! *** Recurrence steps: [ss||s] -> [as||s] ***
     535              : 
     536         4500 :             IF (la_max > 0) THEN
     537              : 
     538              :                ! *** Vertical recurrence steps: [ss||s] -> [as||s] ***
     539              : 
     540              :                ! *** [ps||s]{n} = (Pi - Ai)*[ss||s]{n} +              ***
     541              :                ! ***              (Wi - Pi)*[ss||s]{n+1}  (i = x,y,z) ***
     542              : 
     543         7920 :                DO n = 1, nmax - 1
     544         5820 :                   v(2, 1, 1, n) = rap(1)*v(1, 1, 1, n) + rpw(1)*v(1, 1, 1, n + 1)
     545         5820 :                   v(3, 1, 1, n) = rap(2)*v(1, 1, 1, n) + rpw(2)*v(1, 1, 1, n + 1)
     546         7920 :                   v(4, 1, 1, n) = rap(3)*v(1, 1, 1, n) + rpw(3)*v(1, 1, 1, n + 1)
     547              :                END DO
     548              : 
     549              :                ! *** [as||s]{n} = (Pi - Ai)*[(a-1i)s||s]{n} +        ***
     550              :                ! ***              (Wi - Pi)*[(a-1i)s||s]{n+1} +      ***
     551              :                ! ***              f2*Ni(a-1i)*(   [(a-2i)s||s]{n} +  ***
     552              :                ! ***                           f4*[(a-2i)s||s]{n+1}) ***
     553              : 
     554         2400 :                DO la = 2, la_max
     555              : 
     556         3210 :                   DO n = 1, nmax - la
     557              : 
     558              :                      ! *** Increase the angular momentum component z of a ***
     559              : 
     560              :                      v(coset(0, 0, la), 1, 1, n) = &
     561              :                         rap(3)*v(coset(0, 0, la - 1), 1, 1, n) + &
     562              :                         rpw(3)*v(coset(0, 0, la - 1), 1, 1, n + 1) + &
     563              :                         f2*REAL(la - 1, dp)*(v(coset(0, 0, la - 2), 1, 1, n) + &
     564          810 :                                              f4*v(coset(0, 0, la - 2), 1, 1, n + 1))
     565              : 
     566              :                      ! *** Increase the angular momentum component y of a ***
     567              : 
     568          810 :                      az = la - 1
     569              :                      v(coset(0, 1, az), 1, 1, n) = &
     570              :                         rap(2)*v(coset(0, 0, az), 1, 1, n) + &
     571          810 :                         rpw(2)*v(coset(0, 0, az), 1, 1, n + 1)
     572              : 
     573         1620 :                      DO ay = 2, la
     574          810 :                         az = la - ay
     575              :                         v(coset(0, ay, az), 1, 1, n) = &
     576              :                            rap(2)*v(coset(0, ay - 1, az), 1, 1, n) + &
     577              :                            rpw(2)*v(coset(0, ay - 1, az), 1, 1, n + 1) + &
     578              :                            f2*REAL(ay - 1, dp)*(v(coset(0, ay - 2, az), 1, 1, n) + &
     579         1620 :                                                 f4*v(coset(0, ay - 2, az), 1, 1, n + 1))
     580              :                      END DO
     581              : 
     582              :                      ! *** Increase the angular momentum component x of a ***
     583              : 
     584         2430 :                      DO ay = 0, la - 1
     585         1620 :                         az = la - 1 - ay
     586              :                         v(coset(1, ay, az), 1, 1, n) = &
     587              :                            rap(1)*v(coset(0, ay, az), 1, 1, n) + &
     588         2430 :                            rpw(1)*v(coset(0, ay, az), 1, 1, n + 1)
     589              :                      END DO
     590              : 
     591         1920 :                      DO ax = 2, la
     592          810 :                         f3 = f2*REAL(ax - 1, dp)
     593         2430 :                         DO ay = 0, la - ax
     594          810 :                            az = la - ax - ay
     595              :                            v(coset(ax, ay, az), 1, 1, n) = &
     596              :                               rap(1)*v(coset(ax - 1, ay, az), 1, 1, n) + &
     597              :                               rpw(1)*v(coset(ax - 1, ay, az), 1, 1, n + 1) + &
     598              :                               f3*(v(coset(ax - 2, ay, az), 1, 1, n) + &
     599         1620 :                                   f4*v(coset(ax - 2, ay, az), 1, 1, n + 1))
     600              :                         END DO
     601              :                      END DO
     602              : 
     603              :                   END DO
     604              : 
     605              :                END DO
     606              : 
     607              :                ! *** Recurrence steps: [as||s] -> [ab||s] ***
     608              : 
     609         2100 :                IF (lb_max > 0) THEN
     610              : 
     611              :                   ! *** Horizontal recurrence steps ***
     612              : 
     613         4560 :                   rbp(:) = rap(:) - rab(:)
     614              : 
     615              :                   ! *** [ap||s]{n} = [(a+1i)s||s]{n} - (Bi - Ai)*[as||s]{n} ***
     616              : 
     617         1140 :                   la_start = MAX(0, la_min - 1)
     618              : 
     619         2280 :                   DO la = la_start, la_max - 1
     620         5880 :                      DO n = 1, nmax - la - 1
     621         8910 :                         DO ax = 0, la
     622        12510 :                            DO ay = 0, la - ax
     623         4740 :                               az = la - ax - ay
     624              :                               v(coset(ax, ay, az), 2, 1, n) = &
     625              :                                  v(coset(ax + 1, ay, az), 1, 1, n) - &
     626         4740 :                                  rab(1)*v(coset(ax, ay, az), 1, 1, n)
     627              :                               v(coset(ax, ay, az), 3, 1, n) = &
     628              :                                  v(coset(ax, ay + 1, az), 1, 1, n) - &
     629         4740 :                                  rab(2)*v(coset(ax, ay, az), 1, 1, n)
     630              :                               v(coset(ax, ay, az), 4, 1, n) = &
     631              :                                  v(coset(ax, ay, az + 1), 1, 1, n) - &
     632         8910 :                                  rab(3)*v(coset(ax, ay, az), 1, 1, n)
     633              :                            END DO
     634              :                         END DO
     635              :                      END DO
     636              :                   END DO
     637              : 
     638              :                   ! *** Vertical recurrence step ***
     639              : 
     640              :                   ! *** [ap||s]{n} = (Pi - Bi)*[as||s]{n} +          ***
     641              :                   ! ***              (Wi - Pi)*[as||s]{n+1} +        ***
     642              :                   ! ***              f2*Ni(a)*(   [(a-1i)s||s]{n} +  ***
     643              :                   ! ***                        f4*[(a-1i)s||s]{n+1}) ***
     644              : 
     645         3600 :                   DO n = 1, nmax - la_max - 1
     646         8910 :                      DO ax = 0, la_max
     647         5310 :                         fx = f2*REAL(ax, dp)
     648        16320 :                         DO ay = 0, la_max - ax
     649         8550 :                            fy = f2*REAL(ay, dp)
     650         8550 :                            az = la_max - ax - ay
     651         8550 :                            fz = f2*REAL(az, dp)
     652              : 
     653         8550 :                            IF (ax == 0) THEN
     654              :                               v(coset(ax, ay, az), 2, 1, n) = &
     655              :                                  rbp(1)*v(coset(ax, ay, az), 1, 1, n) + &
     656         5310 :                                  rpw(1)*v(coset(ax, ay, az), 1, 1, n + 1)
     657              :                            ELSE
     658              :                               v(coset(ax, ay, az), 2, 1, n) = &
     659              :                                  rbp(1)*v(coset(ax, ay, az), 1, 1, n) + &
     660              :                                  rpw(1)*v(coset(ax, ay, az), 1, 1, n + 1) + &
     661              :                                  fx*(v(coset(ax - 1, ay, az), 1, 1, n) + &
     662         3240 :                                      f4*v(coset(ax - 1, ay, az), 1, 1, n + 1))
     663              :                            END IF
     664              : 
     665         8550 :                            IF (ay == 0) THEN
     666              :                               v(coset(ax, ay, az), 3, 1, n) = &
     667              :                                  rbp(2)*v(coset(ax, ay, az), 1, 1, n) + &
     668         5310 :                                  rpw(2)*v(coset(ax, ay, az), 1, 1, n + 1)
     669              :                            ELSE
     670              :                               v(coset(ax, ay, az), 3, 1, n) = &
     671              :                                  rbp(2)*v(coset(ax, ay, az), 1, 1, n) + &
     672              :                                  rpw(2)*v(coset(ax, ay, az), 1, 1, n + 1) + &
     673              :                                  fy*(v(coset(ax, ay - 1, az), 1, 1, n) + &
     674         3240 :                                      f4*v(coset(ax, ay - 1, az), 1, 1, n + 1))
     675              :                            END IF
     676              : 
     677        13860 :                            IF (az == 0) THEN
     678              :                               v(coset(ax, ay, az), 4, 1, n) = &
     679              :                                  rbp(3)*v(coset(ax, ay, az), 1, 1, n) + &
     680         5310 :                                  rpw(3)*v(coset(ax, ay, az), 1, 1, n + 1)
     681              :                            ELSE
     682              :                               v(coset(ax, ay, az), 4, 1, n) = &
     683              :                                  rbp(3)*v(coset(ax, ay, az), 1, 1, n) + &
     684              :                                  rpw(3)*v(coset(ax, ay, az), 1, 1, n + 1) + &
     685              :                                  fz*(v(coset(ax, ay, az - 1), 1, 1, n) + &
     686         3240 :                                      f4*v(coset(ax, ay, az - 1), 1, 1, n + 1))
     687              :                            END IF
     688              : 
     689              :                         END DO
     690              :                      END DO
     691              :                   END DO
     692              : 
     693              :                   ! *** Recurrence steps: [ap||s] -> [ab||s] ***
     694              : 
     695         1320 :                   DO lb = 2, lb_max
     696              : 
     697              :                      ! *** Horizontal recurrence steps ***
     698              : 
     699              :                      ! *** [ab||s]{n} = [(a+1i)(b-1i)||s]{n} -    ***
     700              :                      ! ***              (Bi - Ai)*[a(b-1i)||s]{n} ***
     701              : 
     702          360 :                      la_start = MAX(0, la_min - 1)
     703              : 
     704          360 :                      DO la = la_start, la_max - 1
     705          900 :                         DO n = 1, nmax - la - lb
     706         1350 :                            DO ax = 0, la
     707         1890 :                               DO ay = 0, la - ax
     708          720 :                                  az = la - ax - ay
     709              : 
     710              :                                  ! *** Shift of angular momentum component z from a to b ***
     711              : 
     712              :                                  v(coset(ax, ay, az), coset(0, 0, lb), 1, n) = &
     713              :                                     v(coset(ax, ay, az + 1), coset(0, 0, lb - 1), 1, n) - &
     714          720 :                                     rab(3)*v(coset(ax, ay, az), coset(0, 0, lb - 1), 1, n)
     715              : 
     716              :                                  ! *** Shift of angular momentum component y from a to b ***
     717              : 
     718         2160 :                                  DO by = 1, lb
     719         1440 :                                     bz = lb - by
     720              :                                     v(coset(ax, ay, az), coset(0, by, bz), 1, n) = &
     721              :                                        v(coset(ax, ay + 1, az), coset(0, by - 1, bz), 1, n) - &
     722         2160 :                                        rab(2)*v(coset(ax, ay, az), coset(0, by - 1, bz), 1, n)
     723              :                                  END DO
     724              : 
     725              :                                  ! *** Shift of angular momentum component x from a to b ***
     726              : 
     727         2790 :                                  DO bx = 1, lb
     728         4320 :                                     DO by = 0, lb - bx
     729         2160 :                                        bz = lb - bx - by
     730              :                                        v(coset(ax, ay, az), coset(bx, by, bz), 1, n) = &
     731              :                                           v(coset(ax + 1, ay, az), coset(bx - 1, by, bz), 1, n) - &
     732         3600 :                                           rab(1)*v(coset(ax, ay, az), coset(bx - 1, by, bz), 1, n)
     733              :                                     END DO
     734              :                                  END DO
     735              : 
     736              :                               END DO
     737              :                            END DO
     738              :                         END DO
     739              :                      END DO
     740              : 
     741              :                      ! *** Vertical recurrence step ***
     742              : 
     743              :                      ! *** [ab||s]{n} = (Pi - Bi)*[a(b-1i)||s]{n} +          ***
     744              :                      ! ***              (Wi - Pi)*[a(b-1i)||s]{n+1} +        ***
     745              :                      ! ***              f2*Ni(a)*(   [(a-1i)(b-1i)||s]{n} +  ***
     746              :                      ! ***                        f4*[(a-1i)(b-1i)||s]{n+1}) ***
     747              :                      ! ***              f2*Ni(b-1i)*(   [a(b-2i)||s]{n} +    ***
     748              :                      ! ***                           f4*[a(b-2i)||s]{n+1})   ***
     749              : 
     750         1680 :                      DO n = 1, nmax - la_max - lb
     751         1320 :                         DO ax = 0, la_max
     752          780 :                            fx = f2*REAL(ax, dp)
     753         2400 :                            DO ay = 0, la_max - ax
     754         1260 :                               fy = f2*REAL(ay, dp)
     755         1260 :                               az = la_max - ax - ay
     756         1260 :                               fz = f2*REAL(az, dp)
     757              : 
     758              :                               ! *** Shift of angular momentum component z from a to b ***
     759              : 
     760         1260 :                               f3 = f2*REAL(lb - 1, dp)
     761              : 
     762         1260 :                               IF (az == 0) THEN
     763              :                                  v(coset(ax, ay, az), coset(0, 0, lb), 1, n) = &
     764              :                                     rbp(3)*v(coset(ax, ay, az), coset(0, 0, lb - 1), 1, n) + &
     765              :                                     rpw(3)*v(coset(ax, ay, az), coset(0, 0, lb - 1), 1, n + 1) + &
     766              :                                     f3*(v(coset(ax, ay, az), coset(0, 0, lb - 2), 1, n) + &
     767          780 :                                         f4*v(coset(ax, ay, az), coset(0, 0, lb - 2), 1, n + 1))
     768              :                               ELSE
     769              :                                  v(coset(ax, ay, az), coset(0, 0, lb), 1, n) = &
     770              :                                     rbp(3)*v(coset(ax, ay, az), coset(0, 0, lb - 1), 1, n) + &
     771              :                                     rpw(3)*v(coset(ax, ay, az), coset(0, 0, lb - 1), 1, n + 1) + &
     772              :                                     fz*(v(coset(ax, ay, az - 1), coset(0, 0, lb - 1), 1, n) + &
     773              :                                         f4*v(coset(ax, ay, az - 1), coset(0, 0, lb - 1), 1, n + 1)) + &
     774              :                                     f3*(v(coset(ax, ay, az), coset(0, 0, lb - 2), 1, n) + &
     775          480 :                                         f4*v(coset(ax, ay, az), coset(0, 0, lb - 2), 1, n + 1))
     776              :                               END IF
     777              : 
     778              :                               ! *** Shift of angular momentum component y from a to b ***
     779              : 
     780         1260 :                               IF (ay == 0) THEN
     781          780 :                                  bz = lb - 1
     782              :                                  v(coset(ax, ay, az), coset(0, 1, bz), 1, n) = &
     783              :                                     rbp(2)*v(coset(ax, ay, az), coset(0, 0, bz), 1, n) + &
     784          780 :                                     rpw(2)*v(coset(ax, ay, az), coset(0, 0, bz), 1, n + 1)
     785         1560 :                                  DO by = 2, lb
     786          780 :                                     bz = lb - by
     787          780 :                                     f3 = f2*REAL(by - 1, dp)
     788              :                                     v(coset(ax, ay, az), coset(0, by, bz), 1, n) = &
     789              :                                        rbp(2)*v(coset(ax, ay, az), coset(0, by - 1, bz), 1, n) + &
     790              :                                        rpw(2)*v(coset(ax, ay, az), coset(0, by - 1, bz), 1, n + 1) + &
     791              :                                        f3*(v(coset(ax, ay, az), coset(0, by - 2, bz), 1, n) + &
     792         1560 :                                            f4*v(coset(ax, ay, az), coset(0, by - 2, bz), 1, n + 1))
     793              :                                  END DO
     794              :                               ELSE
     795          480 :                                  bz = lb - 1
     796              :                                  v(coset(ax, ay, az), coset(0, 1, bz), 1, n) = &
     797              :                                     rbp(2)*v(coset(ax, ay, az), coset(0, 0, bz), 1, n) + &
     798              :                                     rpw(2)*v(coset(ax, ay, az), coset(0, 0, bz), 1, n + 1) + &
     799              :                                     fy*(v(coset(ax, ay - 1, az), coset(0, 0, bz), 1, n) + &
     800          480 :                                         f4*v(coset(ax, ay - 1, az), coset(0, 0, bz), 1, n + 1))
     801          960 :                                  DO by = 2, lb
     802          480 :                                     bz = lb - by
     803          480 :                                     f3 = f2*REAL(by - 1, dp)
     804              :                                     v(coset(ax, ay, az), coset(0, by, bz), 1, n) = &
     805              :                                        rbp(2)*v(coset(ax, ay, az), coset(0, by - 1, bz), 1, n) + &
     806              :                                        rpw(2)*v(coset(ax, ay, az), coset(0, by - 1, bz), 1, n + 1) + &
     807              :                                        fy*(v(coset(ax, ay - 1, az), coset(0, by - 1, bz), 1, n) + &
     808              :                                            f4*v(coset(ax, ay - 1, az), &
     809              :                                                 coset(0, by - 1, bz), 1, n + 1)) + &
     810              :                                        f3*(v(coset(ax, ay, az), coset(0, by - 2, bz), 1, n) + &
     811          960 :                                            f4*v(coset(ax, ay, az), coset(0, by - 2, bz), 1, n + 1))
     812              :                                  END DO
     813              :                               END IF
     814              : 
     815              :                               ! *** Shift of angular momentum component x from a to b ***
     816              : 
     817         2040 :                               IF (ax == 0) THEN
     818         2340 :                                  DO by = 0, lb - 1
     819         1560 :                                     bz = lb - 1 - by
     820              :                                     v(coset(ax, ay, az), coset(1, by, bz), 1, n) = &
     821              :                                        rbp(1)*v(coset(ax, ay, az), coset(0, by, bz), 1, n) + &
     822         2340 :                                        rpw(1)*v(coset(ax, ay, az), coset(0, by, bz), 1, n + 1)
     823              :                                  END DO
     824         1560 :                                  DO bx = 2, lb
     825          780 :                                     f3 = f2*REAL(bx - 1, dp)
     826         2340 :                                     DO by = 0, lb - bx
     827          780 :                                        bz = lb - bx - by
     828              :                                        v(coset(ax, ay, az), coset(bx, by, bz), 1, n) = &
     829              :                                           rbp(1)*v(coset(ax, ay, az), coset(bx - 1, by, bz), 1, n) + &
     830              :                                           rpw(1)*v(coset(ax, ay, az), &
     831              :                                                    coset(bx - 1, by, bz), 1, n + 1) + &
     832              :                                           f3*(v(coset(ax, ay, az), coset(bx - 2, by, bz), 1, n) + &
     833         1560 :                                               f4*v(coset(ax, ay, az), coset(bx - 2, by, bz), 1, n + 1))
     834              :                                     END DO
     835              :                                  END DO
     836              :                               ELSE
     837         1440 :                                  DO by = 0, lb - 1
     838          960 :                                     bz = lb - 1 - by
     839              :                                     v(coset(ax, ay, az), coset(1, by, bz), 1, n) = &
     840              :                                        rbp(1)*v(coset(ax, ay, az), coset(0, by, bz), 1, n) + &
     841              :                                        rpw(1)*v(coset(ax, ay, az), coset(0, by, bz), 1, n + 1) + &
     842              :                                        fx*(v(coset(ax - 1, ay, az), coset(0, by, bz), 1, n) + &
     843         1440 :                                            f4*v(coset(ax - 1, ay, az), coset(0, by, bz), 1, n + 1))
     844              :                                  END DO
     845          960 :                                  DO bx = 2, lb
     846          480 :                                     f3 = f2*REAL(bx - 1, dp)
     847         1440 :                                     DO by = 0, lb - bx
     848          480 :                                        bz = lb - bx - by
     849              :                                        v(coset(ax, ay, az), coset(bx, by, bz), 1, n) = &
     850              :                                           rbp(1)*v(coset(ax, ay, az), coset(bx - 1, by, bz), 1, n) + &
     851              :                                           rpw(1)*v(coset(ax, ay, az), &
     852              :                                                    coset(bx - 1, by, bz), 1, n + 1) + &
     853              :                                           fx*(v(coset(ax - 1, ay, az), &
     854              :                                                 coset(bx - 1, by, bz), 1, n) + &
     855              :                                               f4*v(coset(ax - 1, ay, az), &
     856              :                                                    coset(bx - 1, by, bz), 1, n + 1)) + &
     857              :                                           f3*(v(coset(ax, ay, az), coset(bx - 2, by, bz), 1, n) + &
     858          960 :                                               f4*v(coset(ax, ay, az), coset(bx - 2, by, bz), 1, n + 1))
     859              :                                     END DO
     860              :                                  END DO
     861              :                               END IF
     862              : 
     863              :                            END DO
     864              :                         END DO
     865              :                      END DO
     866              : 
     867              :                   END DO
     868              : 
     869              :                END IF
     870              : 
     871              :             ELSE
     872              : 
     873         2400 :                IF (lb_max > 0) THEN
     874              : 
     875              :                   ! *** Vertical recurrence steps: [ss||s] -> [sb||s] ***
     876              : 
     877         3840 :                   rbp(:) = rap(:) - rab(:)
     878              : 
     879              :                   ! *** [sp||s]{n} = (Pi - Bi)*[ss||s]{n} + ***
     880              :                   ! ***              (Wi - Pi)*[ss||s]{n+1} ***
     881              : 
     882         3000 :                   DO n = 1, nmax - 1
     883         2040 :                      v(1, 2, 1, n) = rbp(1)*v(1, 1, 1, n) + rpw(1)*v(1, 1, 1, n + 1)
     884         2040 :                      v(1, 3, 1, n) = rbp(2)*v(1, 1, 1, n) + rpw(2)*v(1, 1, 1, n + 1)
     885         3000 :                      v(1, 4, 1, n) = rbp(3)*v(1, 1, 1, n) + rpw(3)*v(1, 1, 1, n + 1)
     886              :                   END DO
     887              : 
     888              :                   ! *** [sb||s]{n} = (Pi - Bi)*[s(b-1i)||s]{n} +        ***
     889              :                   ! ***              (Wi - Pi)*[s(b-1i)||s]{n+1} +      ***
     890              :                   ! ***              f2*Ni(b-1i)*(   [s(b-2i)||s]{n} +  ***
     891              :                   ! ***                           f4*[s(b-2i)||s]{n+1}) ***
     892              : 
     893         1080 :                   DO lb = 2, lb_max
     894              : 
     895         1320 :                      DO n = 1, nmax - lb
     896              : 
     897              :                         ! *** Increase the angular momentum component z of b ***
     898              : 
     899              :                         v(1, coset(0, 0, lb), 1, n) = &
     900              :                            rbp(3)*v(1, coset(0, 0, lb - 1), 1, n) + &
     901              :                            rpw(3)*v(1, coset(0, 0, lb - 1), 1, n + 1) + &
     902              :                            f2*REAL(lb - 1, dp)*(v(1, coset(0, 0, lb - 2), 1, n) + &
     903          240 :                                                 f4*v(1, coset(0, 0, lb - 2), 1, n + 1))
     904              : 
     905              :                         ! *** Increase the angular momentum component y of b ***
     906              : 
     907          240 :                         bz = lb - 1
     908              :                         v(1, coset(0, 1, bz), 1, n) = &
     909              :                            rbp(2)*v(1, coset(0, 0, bz), 1, n) + &
     910          240 :                            rpw(2)*v(1, coset(0, 0, bz), 1, n + 1)
     911              : 
     912          480 :                         DO by = 2, lb
     913          240 :                            bz = lb - by
     914              :                            v(1, coset(0, by, bz), 1, n) = &
     915              :                               rbp(2)*v(1, coset(0, by - 1, bz), 1, n) + &
     916              :                               rpw(2)*v(1, coset(0, by - 1, bz), 1, n + 1) + &
     917              :                               f2*REAL(by - 1, dp)*(v(1, coset(0, by - 2, bz), 1, n) + &
     918          480 :                                                    f4*v(1, coset(0, by - 2, bz), 1, n + 1))
     919              :                         END DO
     920              : 
     921              :                         ! *** Increase the angular momentum component x of b ***
     922              : 
     923          720 :                         DO by = 0, lb - 1
     924          480 :                            bz = lb - 1 - by
     925              :                            v(1, coset(1, by, bz), 1, n) = &
     926              :                               rbp(1)*v(1, coset(0, by, bz), 1, n) + &
     927          720 :                               rpw(1)*v(1, coset(0, by, bz), 1, n + 1)
     928              :                         END DO
     929              : 
     930          600 :                         DO bx = 2, lb
     931          240 :                            f3 = f2*REAL(bx - 1, dp)
     932          720 :                            DO by = 0, lb - bx
     933          240 :                               bz = lb - bx - by
     934              :                               v(1, coset(bx, by, bz), 1, n) = &
     935              :                                  rbp(1)*v(1, coset(bx - 1, by, bz), 1, n) + &
     936              :                                  rpw(1)*v(1, coset(bx - 1, by, bz), 1, n + 1) + &
     937              :                                  f3*(v(1, coset(bx - 2, by, bz), 1, n) + &
     938          480 :                                      f4*v(1, coset(bx - 2, by, bz), 1, n + 1))
     939              :                            END DO
     940              :                         END DO
     941              : 
     942              :                      END DO
     943              : 
     944              :                   END DO
     945              : 
     946              :                END IF
     947              : 
     948              :             END IF
     949              : 
     950              :             ! *** Recurrence steps: [ab||s] -> [ab||c] ***
     951              : 
     952         4500 :             IF (lc_max > 0) THEN
     953              : 
     954              :                ! *** Vertical recurrence steps: [ss||s] -> [ss||c] ***
     955              : 
     956         2700 :                f5 = -zetw/zetp
     957         2700 :                f6 = 0.5_dp*zetw
     958         2700 :                f7 = 0.5_dp*zetq
     959              : 
     960        10800 :                rcw(:) = rcp(:) + rpw(:)
     961              : 
     962              :                ! *** [ss||p]{n} = (Wi - Ci)*[ss||s]{n+1}  (i = x,y,z) ***
     963              : 
     964        10080 :                DO n = 1, nmax - 1
     965         7380 :                   v(1, 1, 2, n) = rcw(1)*v(1, 1, 1, n + 1)
     966         7380 :                   v(1, 1, 3, n) = rcw(2)*v(1, 1, 1, n + 1)
     967        10080 :                   v(1, 1, 4, n) = rcw(3)*v(1, 1, 1, n + 1)
     968              :                END DO
     969              : 
     970              :                ! *** [ss||c]{n} = (Wi - Ci)*[ss||c-1i]{n+1} + ***
     971              :                ! ***              f7*Ni(c-1i)*[ss||c-2i]{n} + ***
     972              :                ! ***              f5*[ss||c-2i]{n+1}          ***
     973              : 
     974         4500 :                DO lc = 2, lc_max
     975              : 
     976         8670 :                   DO n = 1, nmax - lc
     977              : 
     978              :                      ! *** Increase the angular momentum component z of c ***
     979              : 
     980              :                      v(1, 1, coset(0, 0, lc), n) = &
     981              :                         rcw(3)*v(1, 1, coset(0, 0, lc - 1), n + 1) + &
     982              :                         f7*REAL(lc - 1, dp)*(v(1, 1, coset(0, 0, lc - 2), n) + &
     983         4170 :                                              f5*v(1, 1, coset(0, 0, lc - 2), n + 1))
     984              : 
     985              :                      ! *** Increase the angular momentum component y of c ***
     986              : 
     987         4170 :                      cz = lc - 1
     988         4170 :                      v(1, 1, coset(0, 1, cz), n) = rcw(2)*v(1, 1, coset(0, 0, cz), n + 1)
     989              : 
     990         9270 :                      DO cy = 2, lc
     991         5100 :                         cz = lc - cy
     992              :                         v(1, 1, coset(0, cy, cz), n) = &
     993              :                            rcw(2)*v(1, 1, coset(0, cy - 1, cz), n + 1) + &
     994              :                            f7*REAL(cy - 1, dp)*(v(1, 1, coset(0, cy - 2, cz), n) + &
     995         9270 :                                                 f5*v(1, 1, coset(0, cy - 2, cz), n + 1))
     996              :                      END DO
     997              : 
     998              :                      ! *** Increase the angular momentum component x of c ***
     999              : 
    1000        13440 :                      DO cy = 0, lc - 1
    1001         9270 :                         cz = lc - 1 - cy
    1002        13440 :                         v(1, 1, coset(1, cy, cz), n) = rcw(1)*v(1, 1, coset(0, cy, cz), n + 1)
    1003              :                      END DO
    1004              : 
    1005        11070 :                      DO cx = 2, lc
    1006        15300 :                         DO cy = 0, lc - cx
    1007         6030 :                            cz = lc - cx - cy
    1008              :                            v(1, 1, coset(cx, cy, cz), n) = &
    1009              :                               rcw(1)*v(1, 1, coset(cx - 1, cy, cz), n + 1) + &
    1010              :                               f7*REAL(cx - 1, dp)*(v(1, 1, coset(cx - 2, cy, cz), n) + &
    1011        11130 :                                                    f5*v(1, 1, coset(cx - 2, cy, cz), n + 1))
    1012              :                         END DO
    1013              :                      END DO
    1014              : 
    1015              :                   END DO
    1016              : 
    1017              :                END DO
    1018              : 
    1019              :                ! *** Recurrence steps: [ss||c] -> [ab||c] ***
    1020              : 
    1021         7200 :                DO lc = 1, lc_max
    1022              : 
    1023        18450 :                   DO cx = 0, lc
    1024        36450 :                      DO cy = 0, lc - cx
    1025        20700 :                         cz = lc - cx - cy
    1026              : 
    1027        20700 :                         coc = coset(cx, cy, cz)
    1028        20700 :                         cocx = coset(MAX(0, cx - 1), cy, cz)
    1029        20700 :                         cocy = coset(cx, MAX(0, cy - 1), cz)
    1030        20700 :                         cocz = coset(cx, cy, MAX(0, cz - 1))
    1031              : 
    1032        20700 :                         fcx = f6*REAL(cx, dp)
    1033        20700 :                         fcy = f6*REAL(cy, dp)
    1034        20700 :                         fcz = f6*REAL(cz, dp)
    1035              : 
    1036              :                         ! *** Recurrence steps: [ss||c] -> [as||c] ***
    1037              : 
    1038        31950 :                         IF (la_max > 0) THEN
    1039              : 
    1040              :                            ! *** Vertical recurrence steps: [ss||c] -> [as||c] ***
    1041              : 
    1042              :                            ! *** [ps||c]{n} = (Pi - Ai)*[ss||c]{n} +                ***
    1043              :                            ! ***              (Wi - Pi)*[ss||c]{n+1} +              ***
    1044              :                            ! ***              f6*Ni(c)*[ss||c-1i]{n+1}  (i = x,y,z) ***
    1045              : 
    1046        30552 :                            DO n = 1, nmax - 1 - lc
    1047              :                               v(2, 1, coc, n) = rap(1)*v(1, 1, coc, n) + &
    1048              :                                                 rpw(1)*v(1, 1, coc, n + 1) + &
    1049        20892 :                                                 fcx*v(1, 1, cocx, n + 1)
    1050              :                               v(3, 1, coc, n) = rap(2)*v(1, 1, coc, n) + &
    1051              :                                                 rpw(2)*v(1, 1, coc, n + 1) + &
    1052        20892 :                                                 fcy*v(1, 1, cocy, n + 1)
    1053              :                               v(4, 1, coc, n) = rap(3)*v(1, 1, coc, n) + &
    1054              :                                                 rpw(3)*v(1, 1, coc, n + 1) + &
    1055        30552 :                                                 fcz*v(1, 1, cocz, n + 1)
    1056              :                            END DO
    1057              : 
    1058              :                            ! *** [as||c]{n} = (Pi - Ai)*[(a-1i)s||c]{n} +          ***
    1059              :                            ! ***              (Wi - Pi)*[(a-1i)s||c]{n+1} +        ***
    1060              :                            ! ***              f2*Ni(a-1i)*(   [(a-2i)s||c]{n} +    ***
    1061              :                            ! ***                           f4*[(a-2i)s||c]{n+1}) + ***
    1062              :                            ! ***              f6*Ni(c)*[(a-1i)s||c-1i]{n+1}        ***
    1063              : 
    1064        11040 :                            DO la = 2, la_max
    1065              : 
    1066        13926 :                               DO n = 1, nmax - la - lc
    1067              : 
    1068              :                                  ! *** Increase the angular momentum component z of a ***
    1069              : 
    1070              :                                  v(coset(0, 0, la), 1, coc, n) = &
    1071              :                                     rap(3)*v(coset(0, 0, la - 1), 1, coc, n) + &
    1072              :                                     rpw(3)*v(coset(0, 0, la - 1), 1, coc, n + 1) + &
    1073              :                                     f2*REAL(la - 1, dp)*(v(coset(0, 0, la - 2), 1, coc, n) + &
    1074              :                                                          f4*v(coset(0, 0, la - 2), 1, coc, n + 1)) + &
    1075         2886 :                                     fcz*v(coset(0, 0, la - 1), 1, cocz, n + 1)
    1076              : 
    1077              :                                  ! *** Increase the angular momentum component y of a ***
    1078              : 
    1079         2886 :                                  az = la - 1
    1080              :                                  v(coset(0, 1, az), 1, coc, n) = &
    1081              :                                     rap(2)*v(coset(0, 0, az), 1, coc, n) + &
    1082              :                                     rpw(2)*v(coset(0, 0, az), 1, coc, n + 1) + &
    1083         2886 :                                     fcy*v(coset(0, 0, az), 1, cocy, n + 1)
    1084              : 
    1085         5772 :                                  DO ay = 2, la
    1086         2886 :                                     f3 = f2*REAL(ay - 1, dp)
    1087         2886 :                                     az = la - ay
    1088              :                                     v(coset(0, ay, az), 1, coc, n) = &
    1089              :                                        rap(2)*v(coset(0, ay - 1, az), 1, coc, n) + &
    1090              :                                        rpw(2)*v(coset(0, ay - 1, az), 1, coc, n + 1) + &
    1091              :                                        f3*(v(coset(0, ay - 2, az), 1, coc, n) + &
    1092              :                                            f4*v(coset(0, ay - 2, az), 1, coc, n + 1)) + &
    1093         5772 :                                        fcy*v(coset(0, ay - 1, az), 1, cocy, n + 1)
    1094              :                                  END DO
    1095              : 
    1096              :                                  ! *** Increase the angular momentum component x of a ***
    1097              : 
    1098         8658 :                                  DO ay = 0, la - 1
    1099         5772 :                                     az = la - 1 - ay
    1100              :                                     v(coset(1, ay, az), 1, coc, n) = &
    1101              :                                        rap(1)*v(coset(0, ay, az), 1, coc, n) + &
    1102              :                                        rpw(1)*v(coset(0, ay, az), 1, coc, n + 1) + &
    1103         8658 :                                        fcx*v(coset(0, ay, az), 1, cocx, n + 1)
    1104              :                                  END DO
    1105              : 
    1106         7152 :                                  DO ax = 2, la
    1107         2886 :                                     f3 = f2*REAL(ax - 1, dp)
    1108         8658 :                                     DO ay = 0, la - ax
    1109         2886 :                                        az = la - ax - ay
    1110              :                                        v(coset(ax, ay, az), 1, coc, n) = &
    1111              :                                           rap(1)*v(coset(ax - 1, ay, az), 1, coc, n) + &
    1112              :                                           rpw(1)*v(coset(ax - 1, ay, az), 1, coc, n + 1) + &
    1113              :                                           f3*(v(coset(ax - 2, ay, az), 1, coc, n) + &
    1114              :                                               f4*v(coset(ax - 2, ay, az), 1, coc, n + 1)) + &
    1115         5772 :                                           fcx*v(coset(ax - 1, ay, az), 1, cocx, n + 1)
    1116              :                                     END DO
    1117              :                                  END DO
    1118              : 
    1119              :                               END DO
    1120              : 
    1121              :                            END DO
    1122              : 
    1123              :                            ! *** Recurrence steps: [as||c] -> [ab||c] ***
    1124              : 
    1125         9660 :                            IF (lb_max > 0) THEN
    1126              : 
    1127              :                               ! *** Horizontal recurrence steps ***
    1128              : 
    1129              :                               ! *** [ap||c]{n} = [(a+1i)s||c]{n} - (Bi - Ai)*[as||c]{n} ***
    1130              : 
    1131         5244 :                               la_start = MAX(0, la_min - 1)
    1132              : 
    1133        10488 :                               DO la = la_start, la_max - 1
    1134        23856 :                                  DO n = 1, nmax - la - 1 - lc
    1135        34098 :                                     DO ax = 0, la
    1136        46458 :                                        DO ay = 0, la - ax
    1137        17604 :                                           az = la - ax - ay
    1138              :                                           v(coset(ax, ay, az), 2, coc, n) = &
    1139              :                                              v(coset(ax + 1, ay, az), 1, coc, n) - &
    1140        17604 :                                              rab(1)*v(coset(ax, ay, az), 1, coc, n)
    1141              :                                           v(coset(ax, ay, az), 3, coc, n) = &
    1142              :                                              v(coset(ax, ay + 1, az), 1, coc, n) - &
    1143        17604 :                                              rab(2)*v(coset(ax, ay, az), 1, coc, n)
    1144              :                                           v(coset(ax, ay, az), 4, coc, n) = &
    1145              :                                              v(coset(ax, ay, az + 1), 1, coc, n) - &
    1146        33090 :                                              rab(3)*v(coset(ax, ay, az), 1, coc, n)
    1147              :                                        END DO
    1148              :                                     END DO
    1149              :                                  END DO
    1150              :                               END DO
    1151              : 
    1152              :                               ! *** Vertical recurrence step ***
    1153              : 
    1154              :                               ! *** [ap||c]{n} = (Pi - Bi)*[as||c]{n} +            ***
    1155              :                               ! ***              (Wi - Pi)*[as||c]{n+1} +          ***
    1156              :                               ! ***              f2*Ni(a)*(   [(a-1i)s||c]{n} +    ***
    1157              :                               ! ***                        f4*[(a-1i)s||c]{n+1}) + ***
    1158              :                               ! ***              f6*Ni(c)*[(as||c-1i]{n+1})        ***
    1159              : 
    1160        13368 :                               DO n = 1, nmax - la_max - 1 - lc
    1161        30906 :                                  DO ax = 0, la_max
    1162        17538 :                                     fx = f2*REAL(ax, dp)
    1163        53904 :                                     DO ay = 0, la_max - ax
    1164        28242 :                                        fy = f2*REAL(ay, dp)
    1165        28242 :                                        az = la_max - ax - ay
    1166        28242 :                                        fz = f2*REAL(az, dp)
    1167              : 
    1168        28242 :                                        IF (ax == 0) THEN
    1169              :                                           v(coset(ax, ay, az), 2, coc, n) = &
    1170              :                                              rbp(1)*v(coset(ax, ay, az), 1, coc, n) + &
    1171              :                                              rpw(1)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1172        17538 :                                              fcx*v(coset(ax, ay, az), 1, cocx, n + 1)
    1173              :                                        ELSE
    1174              :                                           v(coset(ax, ay, az), 2, coc, n) = &
    1175              :                                              rbp(1)*v(coset(ax, ay, az), 1, coc, n) + &
    1176              :                                              rpw(1)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1177              :                                              fx*(v(coset(ax - 1, ay, az), 1, coc, n) + &
    1178              :                                                  f4*v(coset(ax - 1, ay, az), 1, coc, n + 1)) + &
    1179        10704 :                                              fcx*v(coset(ax, ay, az), 1, cocx, n + 1)
    1180              :                                        END IF
    1181              : 
    1182        28242 :                                        IF (ay == 0) THEN
    1183              :                                           v(coset(ax, ay, az), 3, coc, n) = &
    1184              :                                              rbp(2)*v(coset(ax, ay, az), 1, coc, n) + &
    1185              :                                              rpw(2)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1186        17538 :                                              fcy*v(coset(ax, ay, az), 1, cocy, n + 1)
    1187              :                                        ELSE
    1188              :                                           v(coset(ax, ay, az), 3, coc, n) = &
    1189              :                                              rbp(2)*v(coset(ax, ay, az), 1, coc, n) + &
    1190              :                                              rpw(2)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1191              :                                              fy*(v(coset(ax, ay - 1, az), 1, coc, n) + &
    1192              :                                                  f4*v(coset(ax, ay - 1, az), 1, coc, n + 1)) + &
    1193        10704 :                                              fcy*v(coset(ax, ay, az), 1, cocy, n + 1)
    1194              :                                        END IF
    1195              : 
    1196        45780 :                                        IF (az == 0) THEN
    1197              :                                           v(coset(ax, ay, az), 4, coc, n) = &
    1198              :                                              rbp(3)*v(coset(ax, ay, az), 1, coc, n) + &
    1199              :                                              rpw(3)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1200        17538 :                                              fcz*v(coset(ax, ay, az), 1, cocz, n + 1)
    1201              :                                        ELSE
    1202              :                                           v(coset(ax, ay, az), 4, coc, n) = &
    1203              :                                              rbp(3)*v(coset(ax, ay, az), 1, coc, n) + &
    1204              :                                              rpw(3)*v(coset(ax, ay, az), 1, coc, n + 1) + &
    1205              :                                              fz*(v(coset(ax, ay, az - 1), 1, coc, n) + &
    1206              :                                                  f4*v(coset(ax, ay, az - 1), 1, coc, n + 1)) + &
    1207        10704 :                                              fcz*v(coset(ax, ay, az), 1, cocz, n + 1)
    1208              :                                        END IF
    1209              : 
    1210              :                                     END DO
    1211              :                                  END DO
    1212              :                               END DO
    1213              : 
    1214              :                               ! *** Recurrence steps: [ap||c] -> [ab||c] ***
    1215              : 
    1216         6072 :                               DO lb = 2, lb_max
    1217              : 
    1218              :                                  ! *** Horizontal recurrence steps ***
    1219              : 
    1220              :                                  ! *** [ab||c]{n} = [(a+1i)(b-1i)||c]{n} -    ***
    1221              :                                  ! ***              (Bi - Ai)*[a(b-1i)||c]{n} ***
    1222              : 
    1223         1656 :                                  la_start = MAX(0, la_min - 1)
    1224              : 
    1225         1656 :                                  DO la = la_start, la_max - 1
    1226         3636 :                                     DO n = 1, nmax - la - lb - lc
    1227         5118 :                                        DO ax = 0, la
    1228         6930 :                                           DO ay = 0, la - ax
    1229         2640 :                                              az = la - ax - ay
    1230              : 
    1231              :                                              ! *** Shift of angular momentum component z ***
    1232              : 
    1233              :                                              v(coset(ax, ay, az), coset(0, 0, lb), coc, n) = &
    1234              :                                                 v(coset(ax, ay, az + 1), &
    1235              :                                                   coset(0, 0, lb - 1), coc, n) - &
    1236              :                                                 rab(3)*v(coset(ax, ay, az), &
    1237         2640 :                                                          coset(0, 0, lb - 1), coc, n)
    1238              : 
    1239              :                                              ! *** Shift of angular momentum component y ***
    1240              : 
    1241         7920 :                                              DO by = 1, lb
    1242         5280 :                                                 bz = lb - by
    1243              :                                                 v(coset(ax, ay, az), coset(0, by, bz), coc, n) = &
    1244              :                                                    v(coset(ax, ay + 1, az), &
    1245              :                                                      coset(0, by - 1, bz), coc, n) - &
    1246              :                                                    rab(2)*v(coset(ax, ay, az), &
    1247         7920 :                                                             coset(0, by - 1, bz), coc, n)
    1248              :                                              END DO
    1249              : 
    1250              :                                              ! *** Shift of angular momentum component x ***
    1251              : 
    1252        10230 :                                              DO bx = 1, lb
    1253        15840 :                                                 DO by = 0, lb - bx
    1254         7920 :                                                    bz = lb - bx - by
    1255              :                                                    v(coset(ax, ay, az), coset(bx, by, bz), coc, n) = &
    1256              :                                                       v(coset(ax + 1, ay, az), &
    1257              :                                                         coset(bx - 1, by, bz), coc, n) - &
    1258              :                                                       rab(1)*v(coset(ax, ay, az), &
    1259        13200 :                                                                coset(bx - 1, by, bz), coc, n)
    1260              :                                                 END DO
    1261              :                                              END DO
    1262              : 
    1263              :                                           END DO
    1264              :                                        END DO
    1265              :                                     END DO
    1266              :                                  END DO
    1267              : 
    1268              :                                  ! *** Vertical recurrence step ***
    1269              : 
    1270              :                                  ! *** [ab||c]{n} = (Pi - Bi)*[a(b-1i)||c]{n} +          ***
    1271              :                                  ! ***              (Wi - Pi)*[a(b-1i)||c]{n+1} +        ***
    1272              :                                  ! ***              f2*Ni(a)*(   [(a-1i)(b-1i)||c]{n} +  ***
    1273              :                                  ! ***                        f4*[(a-1i)(b-1i)||c]{n+1}) ***
    1274              :                                  ! ***              f2*Ni(b-1i)*(   [a(b-2i)||c]{n} +    ***
    1275              :                                  ! ***                           f4*[a(b-2i)||c]{n+1}) + ***
    1276              :                                  ! ***              f6*Ni(c)*[a(b-1i)||c-1i]{n+1})       ***
    1277              : 
    1278         7224 :                                  DO n = 1, nmax - la_max - lb - lc
    1279         4476 :                                     DO ax = 0, la_max
    1280         2496 :                                        fx = f2*REAL(ax, dp)
    1281         7680 :                                        DO ay = 0, la_max - ax
    1282         4032 :                                           fy = f2*REAL(ay, dp)
    1283         4032 :                                           az = la_max - ax - ay
    1284         4032 :                                           fz = f2*REAL(az, dp)
    1285              : 
    1286              :                                           ! *** Shift of angular momentum component z from a to b ***
    1287              : 
    1288         4032 :                                           f3 = f2*REAL(lb - 1, dp)
    1289              : 
    1290         4032 :                                           IF (az == 0) THEN
    1291              :                                              v(coset(ax, ay, az), coset(0, 0, lb), coc, n) = &
    1292              :                                                 rbp(3)*v(coset(ax, ay, az), &
    1293              :                                                          coset(0, 0, lb - 1), coc, n) + &
    1294              :                                                 rpw(3)*v(coset(ax, ay, az), &
    1295              :                                                          coset(0, 0, lb - 1), coc, n + 1) + &
    1296              :                                                 f3*(v(coset(ax, ay, az), &
    1297              :                                                       coset(0, 0, lb - 2), coc, n) + &
    1298              :                                                     f4*v(coset(ax, ay, az), &
    1299              :                                                          coset(0, 0, lb - 2), coc, n + 1)) + &
    1300              :                                                 fcz*v(coset(ax, ay, az), &
    1301         2496 :                                                       coset(0, 0, lb - 1), cocz, n + 1)
    1302              :                                           ELSE
    1303              :                                              v(coset(ax, ay, az), coset(0, 0, lb), coc, n) = &
    1304              :                                                 rbp(3)*v(coset(ax, ay, az), &
    1305              :                                                          coset(0, 0, lb - 1), coc, n) + &
    1306              :                                                 rpw(3)*v(coset(ax, ay, az), &
    1307              :                                                          coset(0, 0, lb - 1), coc, n + 1) + &
    1308              :                                                 fz*(v(coset(ax, ay, az - 1), &
    1309              :                                                       coset(0, 0, lb - 1), coc, n) + &
    1310              :                                                     f4*v(coset(ax, ay, az - 1), &
    1311              :                                                          coset(0, 0, lb - 1), coc, n + 1)) + &
    1312              :                                                 f3*(v(coset(ax, ay, az), &
    1313              :                                                       coset(0, 0, lb - 2), coc, n) + &
    1314              :                                                     f4*v(coset(ax, ay, az), &
    1315              :                                                          coset(0, 0, lb - 2), coc, n + 1)) + &
    1316              :                                                 fcz*v(coset(ax, ay, az), &
    1317         1536 :                                                       coset(0, 0, lb - 1), cocz, n + 1)
    1318              :                                           END IF
    1319              : 
    1320              :                                           ! *** Shift of angular momentum component y from a to b ***
    1321              : 
    1322         4032 :                                           IF (ay == 0) THEN
    1323         2496 :                                              bz = lb - 1
    1324              :                                              v(coset(ax, ay, az), coset(0, 1, bz), coc, n) = &
    1325              :                                                 rbp(2)*v(coset(ax, ay, az), &
    1326              :                                                          coset(0, 0, bz), coc, n) + &
    1327              :                                                 rpw(2)*v(coset(ax, ay, az), &
    1328              :                                                          coset(0, 0, bz), coc, n + 1) + &
    1329              :                                                 fcy*v(coset(ax, ay, az), &
    1330         2496 :                                                       coset(0, 0, bz), cocy, n + 1)
    1331         4992 :                                              DO by = 2, lb
    1332         2496 :                                                 bz = lb - by
    1333         2496 :                                                 f3 = f2*REAL(by - 1, dp)
    1334              :                                                 v(coset(ax, ay, az), coset(0, by, bz), coc, n) = &
    1335              :                                                    rbp(2)*v(coset(ax, ay, az), &
    1336              :                                                             coset(0, by - 1, bz), coc, n) + &
    1337              :                                                    rpw(2)*v(coset(ax, ay, az), &
    1338              :                                                             coset(0, by - 1, bz), coc, n + 1) + &
    1339              :                                                    f3*(v(coset(ax, ay, az), &
    1340              :                                                          coset(0, by - 2, bz), coc, n) + &
    1341              :                                                        f4*v(coset(ax, ay, az), &
    1342              :                                                             coset(0, by - 2, bz), coc, n + 1)) + &
    1343              :                                                    fcy*v(coset(ax, ay, az), &
    1344         4992 :                                                          coset(0, by - 1, bz), cocy, n + 1)
    1345              :                                              END DO
    1346              :                                           ELSE
    1347         1536 :                                              bz = lb - 1
    1348              :                                              v(coset(ax, ay, az), coset(0, 1, bz), coc, n) = &
    1349              :                                                 rbp(2)*v(coset(ax, ay, az), &
    1350              :                                                          coset(0, 0, bz), coc, n) + &
    1351              :                                                 rpw(2)*v(coset(ax, ay, az), &
    1352              :                                                          coset(0, 0, bz), coc, n + 1) + &
    1353              :                                                 fy*(v(coset(ax, ay - 1, az), &
    1354              :                                                       coset(0, 0, bz), coc, n) + &
    1355              :                                                     f4*v(coset(ax, ay - 1, az), &
    1356              :                                                          coset(0, 0, bz), coc, n + 1)) + &
    1357              :                                                 fcy*v(coset(ax, ay, az), &
    1358         1536 :                                                       coset(0, 0, bz), cocy, n + 1)
    1359         3072 :                                              DO by = 2, lb
    1360         1536 :                                                 bz = lb - by
    1361         1536 :                                                 f3 = f2*REAL(by - 1, dp)
    1362              :                                                 v(coset(ax, ay, az), coset(0, by, bz), coc, n) = &
    1363              :                                                    rbp(2)*v(coset(ax, ay, az), &
    1364              :                                                             coset(0, by - 1, bz), coc, n) + &
    1365              :                                                    rpw(2)*v(coset(ax, ay, az), &
    1366              :                                                             coset(0, by - 1, bz), coc, n + 1) + &
    1367              :                                                    fy*(v(coset(ax, ay - 1, az), &
    1368              :                                                          coset(0, by - 1, bz), coc, n) + &
    1369              :                                                        f4*v(coset(ax, ay - 1, az), &
    1370              :                                                             coset(0, by - 1, bz), coc, n + 1)) + &
    1371              :                                                    f3*(v(coset(ax, ay, az), &
    1372              :                                                          coset(0, by - 2, bz), coc, n) + &
    1373              :                                                        f4*v(coset(ax, ay, az), &
    1374              :                                                             coset(0, by - 2, bz), coc, n + 1)) + &
    1375              :                                                    fcy*v(coset(ax, ay, az), &
    1376         3072 :                                                          coset(0, by - 1, bz), cocy, n + 1)
    1377              :                                              END DO
    1378              :                                           END IF
    1379              : 
    1380              :                                           ! *** Shift of angular momentum component x from a to b ***
    1381              : 
    1382         6528 :                                           IF (ax == 0) THEN
    1383         7488 :                                              DO by = 0, lb - 1
    1384         4992 :                                                 bz = lb - 1 - by
    1385              :                                                 v(coset(ax, ay, az), coset(1, by, bz), coc, n) = &
    1386              :                                                    rbp(1)*v(coset(ax, ay, az), &
    1387              :                                                             coset(0, by, bz), coc, n) + &
    1388              :                                                    rpw(1)*v(coset(ax, ay, az), &
    1389              :                                                             coset(0, by, bz), coc, n + 1) + &
    1390              :                                                    fcx*v(coset(ax, ay, az), &
    1391         7488 :                                                          coset(0, by, bz), cocx, n + 1)
    1392              :                                              END DO
    1393         4992 :                                              DO bx = 2, lb
    1394         2496 :                                                 f3 = f2*REAL(bx - 1, dp)
    1395         7488 :                                                 DO by = 0, lb - bx
    1396         2496 :                                                    bz = lb - bx - by
    1397              :                                                    v(coset(ax, ay, az), coset(bx, by, bz), coc, n) = &
    1398              :                                                       rbp(1)*v(coset(ax, ay, az), &
    1399              :                                                                coset(bx - 1, by, bz), coc, n) + &
    1400              :                                                       rpw(1)*v(coset(ax, ay, az), &
    1401              :                                                                coset(bx - 1, by, bz), coc, n + 1) + &
    1402              :                                                       f3*(v(coset(ax, ay, az), &
    1403              :                                                             coset(bx - 2, by, bz), coc, n) + &
    1404              :                                                           f4*v(coset(ax, ay, az), &
    1405              :                                                                coset(bx - 2, by, bz), coc, n + 1)) + &
    1406              :                                                       fcx*v(coset(ax, ay, az), &
    1407         4992 :                                                             coset(bx - 1, by, bz), cocx, n + 1)
    1408              :                                                 END DO
    1409              :                                              END DO
    1410              :                                           ELSE
    1411         4608 :                                              DO by = 0, lb - 1
    1412         3072 :                                                 bz = lb - 1 - by
    1413              :                                                 v(coset(ax, ay, az), coset(1, by, bz), coc, n) = &
    1414              :                                                    rbp(1)*v(coset(ax, ay, az), &
    1415              :                                                             coset(0, by, bz), coc, n) + &
    1416              :                                                    rpw(1)*v(coset(ax, ay, az), &
    1417              :                                                             coset(0, by, bz), coc, n + 1) + &
    1418              :                                                    fx*(v(coset(ax - 1, ay, az), &
    1419              :                                                          coset(0, by, bz), coc, n) + &
    1420              :                                                        f4*v(coset(ax - 1, ay, az), &
    1421              :                                                             coset(0, by, bz), coc, n + 1)) + &
    1422              :                                                    fcx*v(coset(ax, ay, az), &
    1423         4608 :                                                          coset(0, by, bz), cocx, n + 1)
    1424              :                                              END DO
    1425         3072 :                                              DO bx = 2, lb
    1426         1536 :                                                 f3 = f2*REAL(bx - 1, dp)
    1427         4608 :                                                 DO by = 0, lb - bx
    1428         1536 :                                                    bz = lb - bx - by
    1429              :                                                    v(coset(ax, ay, az), coset(bx, by, bz), coc, n) = &
    1430              :                                                       rbp(1)*v(coset(ax, ay, az), &
    1431              :                                                                coset(bx - 1, by, bz), coc, n) + &
    1432              :                                                       rpw(1)*v(coset(ax, ay, az), &
    1433              :                                                                coset(bx - 1, by, bz), coc, n + 1) + &
    1434              :                                                       fx*(v(coset(ax - 1, ay, az), &
    1435              :                                                             coset(bx - 1, by, bz), coc, n) + &
    1436              :                                                           f4*v(coset(ax - 1, ay, az), &
    1437              :                                                                coset(bx - 1, by, bz), coc, n + 1)) + &
    1438              :                                                       f3*(v(coset(ax, ay, az), &
    1439              :                                                             coset(bx - 2, by, bz), coc, n) + &
    1440              :                                                           f4*v(coset(ax, ay, az), &
    1441              :                                                                coset(bx - 2, by, bz), coc, n + 1)) + &
    1442              :                                                       fcx*v(coset(ax, ay, az), &
    1443         3072 :                                                             coset(bx - 1, by, bz), cocx, n + 1)
    1444              :                                                 END DO
    1445              :                                              END DO
    1446              :                                           END IF
    1447              : 
    1448              :                                        END DO
    1449              :                                     END DO
    1450              :                                  END DO
    1451              : 
    1452              :                               END DO
    1453              :                            END IF
    1454              : 
    1455              :                         ELSE
    1456              : 
    1457        11040 :                            IF (lb_max > 0) THEN
    1458              : 
    1459              :                               ! *** Vertical recurrence steps: [ss||c] -> [sb||c] ***
    1460              : 
    1461              :                               ! *** [sp||c]{n} = (Pi - Bi)*[ss||c]{n} +    ***
    1462              :                               ! ***              (Wi - Pi)*[ss||c]{n+1} +  ***
    1463              :                               ! ***              f6*Ni(c)**[ss||c-1i]{n+1} ***
    1464              : 
    1465        11112 :                               DO n = 1, nmax - 1 - lc
    1466              :                                  v(1, 2, coc, n) = rbp(1)*v(1, 1, coc, n) + &
    1467              :                                                    rpw(1)*v(1, 1, coc, n + 1) + &
    1468         6696 :                                                    fcx*v(1, 1, cocx, n + 1)
    1469              :                                  v(1, 3, coc, n) = rbp(2)*v(1, 1, coc, n) + &
    1470              :                                                    rpw(2)*v(1, 1, coc, n + 1) + &
    1471         6696 :                                                    fcy*v(1, 1, cocy, n + 1)
    1472              :                                  v(1, 4, coc, n) = rbp(3)*v(1, 1, coc, n) + &
    1473              :                                                    rpw(3)*v(1, 1, coc, n + 1) + &
    1474        11112 :                                                    fcz*v(1, 1, cocz, n + 1)
    1475              :                               END DO
    1476              : 
    1477              :                               ! *** [sb||c]{n} = (Pi - Bi)*[s(b-1i)||c]{n} +          ***
    1478              :                               ! ***              (Wi - Pi)*[s(b-1i)||c]{n+1} +        ***
    1479              :                               ! ***              f2*Ni(b-1i)*(   [s(b-2i)||c]{n} +    ***
    1480              :                               ! ***                           f4*[s(b-2i)||c]{n+1}) + ***
    1481              :                               ! ***              f6*Ni(c)**[s(b-1i)||c-1i]{n+1}       ***
    1482              : 
    1483         4968 :                               DO lb = 2, lb_max
    1484              : 
    1485         5736 :                                  DO n = 1, nmax - lb - lc
    1486              : 
    1487              :                                     ! *** Increase the angular momentum component z of b ***
    1488              : 
    1489              :                                     v(1, coset(0, 0, lb), coc, n) = &
    1490              :                                        rbp(3)*v(1, coset(0, 0, lb - 1), coc, n) + &
    1491              :                                        rpw(3)*v(1, coset(0, 0, lb - 1), coc, n + 1) + &
    1492              :                                        f2*REAL(lb - 1, dp)*(v(1, coset(0, 0, lb - 2), coc, n) + &
    1493              :                                                             f4*v(1, coset(0, 0, lb - 2), coc, n + 1)) + &
    1494          768 :                                        fcz*v(1, coset(0, 0, lb - 1), cocz, n + 1)
    1495              : 
    1496              :                                     ! *** Increase the angular momentum component y of b ***
    1497              : 
    1498          768 :                                     bz = lb - 1
    1499              :                                     v(1, coset(0, 1, bz), coc, n) = &
    1500              :                                        rbp(2)*v(1, coset(0, 0, bz), coc, n) + &
    1501              :                                        rpw(2)*v(1, coset(0, 0, bz), coc, n + 1) + &
    1502          768 :                                        fcy*v(1, coset(0, 0, bz), cocy, n + 1)
    1503              : 
    1504         1536 :                                     DO by = 2, lb
    1505          768 :                                        f3 = f2*REAL(by - 1, dp)
    1506          768 :                                        bz = lb - by
    1507              :                                        v(1, coset(0, by, bz), coc, n) = &
    1508              :                                           rbp(2)*v(1, coset(0, by - 1, bz), coc, n) + &
    1509              :                                           rpw(2)*v(1, coset(0, by - 1, bz), coc, n + 1) + &
    1510              :                                           f3*(v(1, coset(0, by - 2, bz), coc, n) + &
    1511              :                                               f4*v(1, coset(0, by - 2, bz), coc, n + 1)) + &
    1512         1536 :                                           fcy*v(1, coset(0, by - 1, bz), cocy, n + 1)
    1513              :                                     END DO
    1514              : 
    1515              :                                     ! *** Increase the angular momentum component x of b ***
    1516              : 
    1517         2304 :                                     DO by = 0, lb - 1
    1518         1536 :                                        bz = lb - 1 - by
    1519              :                                        v(1, coset(1, by, bz), coc, n) = &
    1520              :                                           rbp(1)*v(1, coset(0, by, bz), coc, n) + &
    1521              :                                           rpw(1)*v(1, coset(0, by, bz), coc, n + 1) + &
    1522         2304 :                                           fcx*v(1, coset(0, by, bz), cocx, n + 1)
    1523              :                                     END DO
    1524              : 
    1525         2088 :                                     DO bx = 2, lb
    1526          768 :                                        f3 = f2*REAL(bx - 1, dp)
    1527         2304 :                                        DO by = 0, lb - bx
    1528          768 :                                           bz = lb - bx - by
    1529              :                                           v(1, coset(bx, by, bz), coc, n) = &
    1530              :                                              rbp(1)*v(1, coset(bx - 1, by, bz), coc, n) + &
    1531              :                                              rpw(1)*v(1, coset(bx - 1, by, bz), coc, n + 1) + &
    1532              :                                              f3*(v(1, coset(bx - 2, by, bz), coc, n) + &
    1533              :                                                  f4*v(1, coset(bx - 2, by, bz), coc, n + 1)) + &
    1534         1536 :                                              fcx*v(1, coset(bx - 1, by, bz), cocx, n + 1)
    1535              :                                        END DO
    1536              :                                     END DO
    1537              : 
    1538              :                                  END DO
    1539              : 
    1540              :                               END DO
    1541              : 
    1542              :                            END IF
    1543              : 
    1544              :                         END IF
    1545              : 
    1546              :                      END DO
    1547              :                   END DO
    1548              : 
    1549              :                END DO
    1550              : 
    1551              :             END IF
    1552              : 
    1553              :             ! *** Add the contribution of the current pair ***
    1554              :             ! *** of primitive Gaussian-type functions     ***
    1555              : 
    1556        20250 :             DO k = ncoset(lc_min - 1) + 1, ncoset(lc_max)
    1557        15750 :                kk = k - ncoset(lc_min - 1)
    1558        58050 :                DO j = ncoset(lb_min - 1) + 1, ncoset(lb_max)
    1559       152145 :                   DO i = ncoset(la_min - 1) + 1, ncoset(la_max - maxder_local)
    1560        98595 :                      vabc(na + i, nb + j) = vabc(na + i, nb + j) + gccc(kk)*v(i, j, k, 1)
    1561       136395 :                      int_abc(na + i, nb + j, kk) = v(i, j, k, 1)
    1562              :                   END DO
    1563              :                END DO
    1564              :             END DO
    1565              : 
    1566         4500 :             IF (PRESENT(maxder)) THEN
    1567            0 :                DO k = ncoset(lc_min - 1) + 1, ncoset(lc_max)
    1568            0 :                   kk = k - ncoset(lc_min - 1)
    1569            0 :                   DO j = 1, ncoset(lb_max)
    1570            0 :                      DO i = 1, ncoset(la_max)
    1571            0 :                         vabc_plus(nap + i, nb + j) = vabc_plus(nap + i, nb + j) + gccc(kk)*v(i, j, k, 1)
    1572              :                      END DO
    1573              :                   END DO
    1574              :                END DO
    1575              :             END IF
    1576              : 
    1577         7200 :             nb = nb + ncoset(lb_max)
    1578              : 
    1579              :          END DO
    1580              : 
    1581         2700 :          na = na + ncoset(la_max - maxder_local)
    1582         4320 :          nap = nap + ncoset(la_max)
    1583              : 
    1584              :       END DO
    1585              : 
    1586         1620 :    END SUBROUTINE coulomb3
    1587              : 
    1588              : END MODULE ai_coulomb
        

Generated by: LCOV version 2.0-1