LCOV - code coverage report
Current view: top level - src/aobasis - ai_verfc.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 77.0 % 300 231
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Build up the nuclear potential part of the core Hamiltonian matrix
      10              : !>      in the case of an allelectron calculation by computing the nuclear
      11              : !>      attraction integral matrix <a|-Z/r|b> and the integral matrix
      12              : !>      <a|Z*erf(r)/r|b>.  The integrals <a|Z*erf(r)/r|b> can be rewritten
      13              : !>      as the three-center Coulomb integrals <ab||c> with a  primitive
      14              : !>      s-type Gaussian function c multiplied by a factor N.
      15              : !>
      16              : !>                       erfc(r)
      17              : !>      <a|V|b> = -Z*<a|---------|b>
      18              : !>                          r
      19              : !>
      20              : !>                       1 - erf(r)
      21              : !>              = -Z*<a|------------|b>
      22              : !>                           r
      23              : !>
      24              : !>                        1           erf(r)
      25              : !>              = -Z*(<a|---|b> - <a|--------|b>)
      26              : !>                        r             r
      27              : !>
      28              : !>                        1
      29              : !>              = -Z*(<a|---|b> - N*<ab||c>)
      30              : !>                        r
      31              : !>
      32              : !>                       1
      33              : !>              = -Z*<a|---|b> + Z*N*<ab||c>
      34              : !>                       r
      35              : !>                   \_______/       \_____/
      36              : !>                       |              |
      37              : !>                    nuclear        coulomb
      38              : !> \par Literature
      39              : !>      S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
      40              : !> \par Parameters
      41              : !>      -  ax,ay,az  : Angular momentum index numbers of orbital a.
      42              : !>      -  bx,by,bz  : Angular momentum index numbers of orbital b.
      43              : !>      -  coset     : Cartesian orbital set pointer.
      44              : !>      -  dab       : Distance between the atomic centers a and b.
      45              : !>      -  dac       : Distance between the atomic centers a and c.
      46              : !>      -  dbc       : Distance between the atomic centers b and c.
      47              : !>      -  l{a,b}    : Angular momentum quantum number of shell a or b.
      48              : !>      -  l{a,b}_max: Maximum angular momentum quantum number of shell a or b.
      49              : !>      -  l{a,b}_min: Minimum angular momentum quantum number of shell a or b.
      50              : !>      -  ncoset    : Number of orbitals in a Cartesian orbital set.
      51              : !>      -  npgf{a,b} : Degree of contraction of shell a or b.
      52              : !>      -  rab       : Distance vector between the atomic centers a and b.
      53              : !>      -  rab2      : Square of the distance between the atomic centers a and b.
      54              : !>      -  rac       : Distance vector between the atomic centers a and c.
      55              : !>      -  rac2      : Square of the distance between the atomic centers a and c.
      56              : !>      -  rbc2      : Square of the distance between the atomic centers b and c.
      57              : !>      -  rpgf{a,b} : Radius of the primitive Gaussian-type function a or b.
      58              : !>      -  zet{a,b}  : Exponents of the Gaussian-type functions a or b.
      59              : !>      -  zetp      : Reciprocal of the sum of the exponents of orbital a and b.
      60              : !>      -  zetw        : Reciprocal of the sum of the exponents of orbital a, b and c.
      61              : !> Indices for pVp matrices
      62              : !>      -  ax,ay,az                : Angular momentum index numbers of orbital a.
      63              : !>      -  n{x1,y1,z1}{x2,y2,z2}   : indices for the pVp matrix elements
      64              : !>                                   <p_{x1,y1,z1}a|V|p_{x2,y2,z2}>
      65              : !>      -  co{a,b}{m,p}{x,y,z}     : coefficients of the pVp matrix elements: co == coset(lx,ly,lz)
      66              : !>                                   m == li - 1; p == li +1; li= x,y,z (which l quantum number is modified); l = a,b
      67              : !>                                   coset ( ... -1 ...) = 1  , should be zero, lmi = 1.0 for li >=1 and lmi = 0.0 for li = 0
      68              : !>                                  guarantees this as a prefactor
      69              : !>      -  f{a,b}{x,y,z},ft{a,b},z : f(t)li: prefactors as a result of derivations of l with respect to i
      70              : !>      -  pVpout                  : pVp matrix elements
      71              : !>      -  pVp                     : local pVp matrix elements
      72              : !>      -  lamin,lbmin             : minimal angular quantum number used in pVp matrices
      73              : !>      _  vnucp                   : potential of the nuclei
      74              : !>      -  vnuc                    : potential of the electrons
      75              : !>      _  pVpa, pVpb              : pVpl=coset(lx,ly,lz)
      76              : !>      -  na_pgf,nb_pgf           : indices for primitive gaussian functions
      77              : !> \par History
      78              : !>      10.2008 added pVp matrix elements (jens)
      79              : !> \author Matthias Krack (04.10.2000)
      80              : ! **************************************************************************************************
      81              : 
      82              : MODULE ai_verfc
      83              : 
      84              :    USE gamma,                           ONLY: fgamma => fgamma_0
      85              :    USE kinds,                           ONLY: dp
      86              :    USE mathconstants,                   ONLY: pi
      87              :    USE orbital_pointers,                ONLY: coset,&
      88              :                                               ncoset
      89              : #include "../base/base_uses.f90"
      90              : 
      91              :    IMPLICIT NONE
      92              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_verfc'
      93              :    PRIVATE
      94              : 
      95              : ! *** Public subroutines ***
      96              : 
      97              :    PUBLIC :: verfc
      98              : 
      99              : CONTAINS
     100              : 
     101              : ! **************************************************************************************************
     102              : !> \brief   Calculation of the primitive three-center nuclear potential
     103              : !>          integrals <a|Z*erfc(r)/r|b> over Cartesian Gaussian-type
     104              : !>          functions.
     105              : !> \param la_max1 ...
     106              : !> \param npgfa ...
     107              : !> \param zeta ...
     108              : !> \param rpgfa ...
     109              : !> \param la_min1 ...
     110              : !> \param lb_max1 ...
     111              : !> \param npgfb ...
     112              : !> \param zetb ...
     113              : !> \param rpgfb ...
     114              : !> \param lb_min1 ...
     115              : !> \param zetc ...
     116              : !> \param rpgfc ...
     117              : !> \param zc ...
     118              : !> \param cerf ...
     119              : !> \param rab ...
     120              : !> \param rab2 ...
     121              : !> \param rac ...
     122              : !> \param rac2 ...
     123              : !> \param rbc2 ...
     124              : !> \param vabc ...
     125              : !> \param verf ...
     126              : !> \param vnuc ...
     127              : !> \param f ...
     128              : !> \param maxder ...
     129              : !> \param vabc_plus ...
     130              : !> \param vnabc ...
     131              : !> \param pVp_sum ...
     132              : !> \param pVp ...
     133              : !> \param dkh_erfc ...
     134              : !> \date    04.10.2000
     135              : !> \author  Matthias Krack
     136              : !> \version 1.0
     137              : ! **************************************************************************************************
     138      1620473 :    SUBROUTINE verfc(la_max1, npgfa, zeta, rpgfa, la_min1, lb_max1, npgfb, zetb, rpgfb, lb_min1, &
     139      4861419 :                     zetc, rpgfc, zc, cerf, rab, rab2, rac, rac2, rbc2, vabc, verf, vnuc, f, &
     140      4861419 :                     maxder, vabc_plus, vnabc, pVp_sum, pVp, dkh_erfc) !JT
     141              :       INTEGER, INTENT(IN)                                :: la_max1, npgfa
     142              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zeta, rpgfa
     143              :       INTEGER, INTENT(IN)                                :: la_min1, lb_max1, npgfb
     144              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: zetb, rpgfb
     145              :       INTEGER, INTENT(IN)                                :: lb_min1
     146              :       REAL(KIND=dp), INTENT(IN)                          :: zetc, rpgfc, zc, cerf
     147              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     148              :       REAL(KIND=dp), INTENT(IN)                          :: rab2
     149              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
     150              :       REAL(KIND=dp), INTENT(IN)                          :: rac2, rbc2
     151              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: vabc
     152              :       REAL(KIND=dp), DIMENSION(:, :, :)                  :: verf, vnuc
     153              :       REAL(KIND=dp), DIMENSION(0:)                       :: f
     154              :       INTEGER, INTENT(IN), OPTIONAL                      :: maxder
     155              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL           :: vabc_plus, vnabc, pVp_sum, pVp
     156              :       LOGICAL, OPTIONAL                                  :: dkh_erfc
     157              : 
     158              :       INTEGER :: ax, ay, az, bx, by, bz, coamx, coamy, coamz, coapx, coapy, coapz, cobmx, cobmy, &
     159              :          cobmz, cobpx, cobpy, cobpz, i, ipgf, j, jpgf, la, la_max, la_min, la_start, lb, lb_max, &
     160              :          lb_min, maxder_local, n, na, nap, nb, nmax, nxx, nxy, nxz, nyx, nyy, nyz, nzx, nzy, nzz, &
     161              :          pVpa, pVpb
     162              :       LOGICAL                                            :: do_dkh
     163              :       REAL(KIND=dp)                                      :: dab, dac, dbc, f0, f1, f2, f3, f4, fax, &
     164              :                                                             fay, faz, fbx, fby, fbz, ferf, fnuc, &
     165              :                                                             ftaz, ftbz, fx, fy, fz, rcp2, t, zetp, &
     166              :                                                             zetq, zetw
     167              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, rbp, rcp, rpw
     168              : 
     169              : !   ---------------------------------------------------------------------------
     170              : 
     171      1620473 :       IF (PRESENT(maxder)) THEN
     172     20407527 :          verf(1:ncoset(la_max1), 1:ncoset(lb_max1), 1) = 0._dp
     173     20407527 :          vnuc(1:ncoset(la_max1), 1:ncoset(lb_max1), 1) = 0._dp
     174              :       END IF
     175              : 
     176      1620473 :       do_dkh = .FALSE.
     177              : 
     178      1620473 :       IF (PRESENT(pVp)) THEN
     179            0 :          do_dkh = .TRUE.
     180            0 :          pVp = 0.0_dp
     181              :          ! pVp matrices requires angular momentum quantum numbers l+1 and l-1
     182              : 
     183            0 :          la_max = la_max1 + 1
     184            0 :          IF (PRESENT(maxder)) THEN
     185            0 :             IF (maxder > 0) THEN
     186            0 :                la_max = la_max1
     187              :             END IF
     188              :          END IF
     189            0 :          lb_max = lb_max1 + 1
     190              : 
     191            0 :          la_min = MAX(0, la_min1 - 1)
     192            0 :          lb_min = MAX(0, lb_min1 - 1)
     193              :       ELSE
     194      1620473 :          do_dkh = .FALSE.
     195      1620473 :          la_max = la_max1
     196      1620473 :          lb_max = lb_max1
     197      1620473 :          la_min = la_min1
     198      1620473 :          lb_min = lb_min1
     199              :       END IF
     200              : 
     201      1620473 :       nmax = la_max + lb_max + 1
     202              : 
     203      1620473 :       maxder_local = 0
     204      1620473 :       IF (PRESENT(maxder)) maxder_local = maxder
     205              : 
     206              : !   *** Calculate the distances of the centers a, b and c ***
     207              : 
     208      1620473 :       dab = SQRT(rab2)
     209      1620473 :       dac = SQRT(rac2)
     210      1620473 :       dbc = SQRT(rbc2)
     211              : 
     212              : !   *** Loop over all pairs of primitive Gaussian-type functions ***
     213              : 
     214      1620473 :       na = 0
     215      1620473 :       nap = 0
     216              : 
     217      4073306 :       DO ipgf = 1, npgfa
     218              : 
     219              : !     *** Screening ***
     220              : 
     221      2452833 :          IF (do_dkh) THEN
     222            0 :             IF (dkh_erfc) THEN
     223            0 :                IF (rpgfa(ipgf) + rpgfc < dac) THEN
     224            0 :                   na = na + ncoset(la_max1 - maxder_local) !JT
     225            0 :                   nap = nap + ncoset(la_max1) !JT
     226            0 :                   CYCLE
     227              :                END IF
     228              :             END IF
     229              :          ELSE
     230      2452833 :             IF (rpgfa(ipgf) + rpgfc < dac) THEN
     231       526363 :                na = na + ncoset(la_max1 - maxder_local) !JT
     232       526363 :                nap = nap + ncoset(la_max1) !JT
     233       526363 :                CYCLE
     234              :             END IF
     235              :          END IF
     236              : 
     237      1926470 :          nb = 0
     238              : 
     239      5035973 :          DO jpgf = 1, npgfb
     240              : 
     241              : !       *** Screening ***
     242      3109503 :             IF (do_dkh) THEN
     243            0 :                IF (dkh_erfc) THEN
     244            0 :                   IF ((rpgfb(jpgf) + rpgfc < dbc) .OR. &
     245              :                       (rpgfa(ipgf) + rpgfb(jpgf) < dab)) THEN
     246            0 :                      nb = nb + ncoset(lb_max1) !JT
     247            0 :                      CYCLE
     248              :                   END IF
     249              :                END IF
     250              :             ELSE
     251      3109503 :                IF ((rpgfb(jpgf) + rpgfc < dbc) .OR. &
     252              :                    (rpgfa(ipgf) + rpgfb(jpgf) < dab)) THEN
     253       789728 :                   nb = nb + ncoset(lb_max1) !JT
     254       789728 :                   CYCLE
     255              :                END IF
     256              :             END IF
     257              : !       *** Calculate some prefactors ***
     258              : 
     259      2319775 :             zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
     260      2319775 :             zetq = 1.0_dp/zetc
     261      2319775 :             zetw = 1.0_dp/(zeta(ipgf) + zetb(jpgf) + zetc)
     262              : 
     263      2319775 :             f1 = zetb(jpgf)*zetp
     264      2319775 :             f2 = 0.5_dp*zetp
     265      2319775 :             f4 = -zetc*zetw
     266              : 
     267      2319775 :             f0 = EXP(-zeta(ipgf)*f1*rab2)
     268              : 
     269      2319775 :             fnuc = 2.0_dp*pi*zetp*f0
     270      2319775 :             ferf = 2.0_dp*SQRT(pi**5*zetw)*zetp*zetq*f0
     271              : 
     272      9279100 :             rap(:) = f1*rab(:)
     273      9279100 :             rcp(:) = rap(:) - rac(:)
     274      9279100 :             rpw(:) = f4*rcp(:)
     275              : 
     276              : !       *** Calculate the incomplete Gamma function values ***
     277              : 
     278      2319775 :             rcp2 = rcp(1)*rcp(1) + rcp(2)*rcp(2) + rcp(3)*rcp(3)
     279              : 
     280      2319775 :             t = rcp2/zetp
     281              : 
     282      2319775 :             CALL fgamma(nmax - 1, t, f)
     283              : 
     284              : !       *** Calculate the basic nuclear attraction integrals [s|A(0)|s]{n} ***
     285              : 
     286      8440291 :             DO n = 1, nmax
     287      8440291 :                vnuc(1, 1, n) = fnuc*f(n - 1)
     288              :             END DO
     289              : 
     290              : !       *** Calculate the incomplete Gamma function values ***
     291              : 
     292      2319775 :             t = -f4*rcp2/zetp
     293              : 
     294      2319775 :             CALL fgamma(nmax - 1, t, f)
     295              : 
     296              : !       *** Calculate the basic three-center Coulomb integrals [ss||s]{n} ***
     297              : 
     298      8440291 :             DO n = 1, nmax
     299      8440291 :                verf(1, 1, n) = ferf*f(n - 1)
     300              :             END DO
     301              : 
     302              : !       *** Recurrence steps: [s|A(0)|s] -> [a|A(0)|b] ***
     303              : !       ***                   [ss||s]    -> [ab||s]    ***
     304              : 
     305      2319775 :             IF (la_max > 0) THEN
     306              : 
     307              : !         *** Vertical recurrence steps: [s|A(0)|s] -> [a|A(0)|s] ***
     308              : !         ***                            [ss||s]    -> [as||s]    ***
     309              : 
     310              : !         *** [p|A(0)|s]{n} = (Pi - Ai)*[s|A(0)|s]{n} -           ***
     311              : !         ***                 (Pi - Ci)*[s|A(0)|s]{n+1}           ***
     312              : !         *** [ps||s]{n}    = (Pi - Ai)*[ss||s]{n} +              ***
     313              : !         ***                 (Wi - Pi)*[ss||s]{n+1}  (i = x,y,z) ***
     314              : 
     315      5050332 :                DO n = 1, nmax - 1
     316      3428900 :                   vnuc(2, 1, n) = rap(1)*vnuc(1, 1, n) - rcp(1)*vnuc(1, 1, n + 1)
     317      3428900 :                   verf(2, 1, n) = rap(1)*verf(1, 1, n) + rpw(1)*verf(1, 1, n + 1)
     318      3428900 :                   vnuc(3, 1, n) = rap(2)*vnuc(1, 1, n) - rcp(2)*vnuc(1, 1, n + 1)
     319      3428900 :                   verf(3, 1, n) = rap(2)*verf(1, 1, n) + rpw(2)*verf(1, 1, n + 1)
     320      3428900 :                   vnuc(4, 1, n) = rap(3)*vnuc(1, 1, n) - rcp(3)*vnuc(1, 1, n + 1)
     321      5050332 :                   verf(4, 1, n) = rap(3)*verf(1, 1, n) + rpw(3)*verf(1, 1, n + 1)
     322              :                END DO
     323              : 
     324              : !         *** [a|A(0)|s]{n} = (Pi - Ai)*[a-1i|A(0)|s]{n} -       ***
     325              : !         ***                 (Pi - Ci)*[a-1i|A(0)|s]{n+1} +     ***
     326              : !         ***                 f2*Ni(a-1i)*([a-2i|A(0)|s]{n} -    ***
     327              : !         ***                              [a-2i|A(0)|s]{n+1}    ***
     328              : !         *** [as||s]{n}    = (Pi - Ai)*[(a-1i)s||s]{n} +        ***
     329              : !         ***                 (Wi - Pi)*[(a-1i)s||s]{n+1} +      ***
     330              : !         ***                 f2*Ni(a-1i)*(   [(a-2i)s||s]{n} +  ***
     331              : !         ***                              f4*[(a-2i)s||s]{n+1}) ***
     332              : 
     333      2295163 :                DO la = 2, la_max
     334              : 
     335      3529098 :                   DO n = 1, nmax - la
     336              : 
     337              : !             *** Increase the angular momentum component z of function a ***
     338              : 
     339              :                      vnuc(coset(0, 0, la), 1, n) = &
     340              :                         rap(3)*vnuc(coset(0, 0, la - 1), 1, n) - &
     341              :                         rcp(3)*vnuc(coset(0, 0, la - 1), 1, n + 1) + &
     342              :                         f2*REAL(la - 1, dp)*(vnuc(coset(0, 0, la - 2), 1, n) - &
     343      1233935 :                                              vnuc(coset(0, 0, la - 2), 1, n + 1))
     344              :                      verf(coset(0, 0, la), 1, n) = &
     345              :                         rap(3)*verf(coset(0, 0, la - 1), 1, n) + &
     346              :                         rpw(3)*verf(coset(0, 0, la - 1), 1, n + 1) + &
     347              :                         f2*REAL(la - 1, dp)*(verf(coset(0, 0, la - 2), 1, n) + &
     348      1233935 :                                              f4*verf(coset(0, 0, la - 2), 1, n + 1))
     349              : 
     350              : !             *** Increase the angular momentum component y of function a ***
     351              : 
     352      1233935 :                      az = la - 1
     353              :                      vnuc(coset(0, 1, az), 1, n) = &
     354              :                         rap(2)*vnuc(coset(0, 0, az), 1, n) - &
     355      1233935 :                         rcp(2)*vnuc(coset(0, 0, az), 1, n + 1)
     356              :                      verf(coset(0, 1, az), 1, n) = &
     357              :                         rap(2)*verf(coset(0, 0, az), 1, n) + &
     358      1233935 :                         rpw(2)*verf(coset(0, 0, az), 1, n + 1)
     359              : 
     360      2587234 :                      DO ay = 2, la
     361      1353299 :                         az = la - ay
     362              :                         vnuc(coset(0, ay, az), 1, n) = &
     363              :                            rap(2)*vnuc(coset(0, ay - 1, az), 1, n) - &
     364              :                            rcp(2)*vnuc(coset(0, ay - 1, az), 1, n + 1) + &
     365              :                            f2*REAL(ay - 1, dp)*(vnuc(coset(0, ay - 2, az), 1, n) - &
     366      1353299 :                                                 vnuc(coset(0, ay - 2, az), 1, n + 1))
     367              :                         verf(coset(0, ay, az), 1, n) = &
     368              :                            rap(2)*verf(coset(0, ay - 1, az), 1, n) + &
     369              :                            rpw(2)*verf(coset(0, ay - 1, az), 1, n + 1) + &
     370              :                            f2*REAL(ay - 1, dp)*(verf(coset(0, ay - 2, az), 1, n) + &
     371      2587234 :                                                 f4*verf(coset(0, ay - 2, az), 1, n + 1))
     372              :                      END DO
     373              : 
     374              : !             *** Increase the angular momentum component x of function a ***
     375              : 
     376      3821169 :                      DO ay = 0, la - 1
     377      2587234 :                         az = la - 1 - ay
     378              :                         vnuc(coset(1, ay, az), 1, n) = &
     379              :                            rap(1)*vnuc(coset(0, ay, az), 1, n) - &
     380      2587234 :                            rcp(1)*vnuc(coset(0, ay, az), 1, n + 1)
     381              :                         verf(coset(1, ay, az), 1, n) = &
     382              :                            rap(1)*verf(coset(0, ay, az), 1, n) + &
     383      3821169 :                            rpw(1)*verf(coset(0, ay, az), 1, n + 1)
     384              :                      END DO
     385              : 
     386      3260965 :                      DO ax = 2, la
     387      1353299 :                         f3 = f2*REAL(ax - 1, dp)
     388      4061268 :                         DO ay = 0, la - ax
     389      1474034 :                            az = la - ax - ay
     390              :                            vnuc(coset(ax, ay, az), 1, n) = &
     391              :                               rap(1)*vnuc(coset(ax - 1, ay, az), 1, n) - &
     392              :                               rcp(1)*vnuc(coset(ax - 1, ay, az), 1, n + 1) + &
     393              :                               f3*(vnuc(coset(ax - 2, ay, az), 1, n) - &
     394      1474034 :                                   vnuc(coset(ax - 2, ay, az), 1, n + 1))
     395              :                            verf(coset(ax, ay, az), 1, n) = &
     396              :                               rap(1)*verf(coset(ax - 1, ay, az), 1, n) + &
     397              :                               rpw(1)*verf(coset(ax - 1, ay, az), 1, n + 1) + &
     398              :                               f3*(verf(coset(ax - 2, ay, az), 1, n) + &
     399      2827333 :                                   f4*verf(coset(ax - 2, ay, az), 1, n + 1))
     400              :                         END DO
     401              :                      END DO
     402              : 
     403              :                   END DO
     404              : 
     405              :                END DO
     406              : 
     407              : !         *** Recurrence steps: [a|A(0)|s] -> [a|A(0)|b] ***
     408              : !         ***                   [as||s]    -> [ab||s]    ***
     409              : 
     410      1621432 :                IF (lb_max > 0) THEN
     411              : 
     412              : !           *** Horizontal recurrence steps ***
     413              : 
     414      3965096 :                   rbp(:) = rap(:) - rab(:)
     415              : 
     416              : !           *** [a||A(0)|p]{n} = [a+1i|A(0)|s]{n} - (Bi - Ai)*[a|A(0)|s]{n} ***
     417              : !           *** [ap||s]{n}     = [(a+1i)s||s]{n}  - (Bi - Ai)*[as||s]{n}    ***
     418              : 
     419       991274 :                   la_start = MAX(0, la_min - 1)
     420              : 
     421      2302653 :                   DO la = la_start, la_max - 1
     422      5440206 :                      DO n = 1, nmax - la - 1
     423      8631216 :                         DO ax = 0, la
     424     12640547 :                            DO ay = 0, la - ax
     425      5320710 :                               az = la - ax - ay
     426              :                               vnuc(coset(ax, ay, az), 2, n) = &
     427              :                                  vnuc(coset(ax + 1, ay, az), 1, n) - &
     428      5320710 :                                  rab(1)*vnuc(coset(ax, ay, az), 1, n)
     429              :                               verf(coset(ax, ay, az), 2, n) = &
     430              :                                  verf(coset(ax + 1, ay, az), 1, n) - &
     431      5320710 :                                  rab(1)*verf(coset(ax, ay, az), 1, n)
     432              :                               vnuc(coset(ax, ay, az), 3, n) = &
     433              :                                  vnuc(coset(ax, ay + 1, az), 1, n) - &
     434      5320710 :                                  rab(2)*vnuc(coset(ax, ay, az), 1, n)
     435              :                               verf(coset(ax, ay, az), 3, n) = &
     436              :                                  verf(coset(ax, ay + 1, az), 1, n) - &
     437      5320710 :                                  rab(2)*verf(coset(ax, ay, az), 1, n)
     438              :                               vnuc(coset(ax, ay, az), 4, n) = &
     439              :                                  vnuc(coset(ax, ay, az + 1), 1, n) - &
     440      5320710 :                                  rab(3)*vnuc(coset(ax, ay, az), 1, n)
     441              :                               verf(coset(ax, ay, az), 4, n) = &
     442              :                                  verf(coset(ax, ay, az + 1), 1, n) - &
     443      9502994 :                                  rab(3)*verf(coset(ax, ay, az), 1, n)
     444              :                            END DO
     445              :                         END DO
     446              :                      END DO
     447              :                   END DO
     448              : 
     449              : !           *** Vertical recurrence step ***
     450              : 
     451              : !           *** [a|A(0)|p]{n} = (Pi - Bi)*[a|A(0)|s]{n} -        ***
     452              : !           ***                 (Pi - Ci)*[a|A(0)|s]{n+1} +      ***
     453              : !           ***                 f2*Ni(a)*([a-1i|A(0)|s]{n} -     ***
     454              : !           ***                           [a-1i|A(0)|s]{n+1})    ***
     455              : !           *** [ap||s]{n}    = (Pi - Bi)*[as||s]{n} +           ***
     456              : !           ***                 (Wi - Pi)*[as||s]{n+1} +         ***
     457              : !           ***                  f2*Ni(a)*(   [(a-1i)s||s]{n} +  ***
     458              : !           ***                            f4*[(a-1i)s||s]{n+1}) ***
     459              : 
     460      2125011 :                   DO n = 1, nmax - la_max - 1
     461      4884725 :                      DO ax = 0, la_max
     462      2759714 :                         fx = f2*REAL(ax, dp)
     463      8822211 :                         DO ay = 0, la_max - ax
     464      4928760 :                            fy = f2*REAL(ay, dp)
     465      4928760 :                            az = la_max - ax - ay
     466      4928760 :                            fz = f2*REAL(az, dp)
     467              : 
     468      4928760 :                            IF (ax == 0) THEN
     469              :                               vnuc(coset(ax, ay, az), 2, n) = &
     470              :                                  rbp(1)*vnuc(coset(ax, ay, az), 1, n) - &
     471      2759714 :                                  rcp(1)*vnuc(coset(ax, ay, az), 1, n + 1)
     472              :                               verf(coset(ax, ay, az), 2, n) = &
     473              :                                  rbp(1)*verf(coset(ax, ay, az), 1, n) + &
     474      2759714 :                                  rpw(1)*verf(coset(ax, ay, az), 1, n + 1)
     475              :                            ELSE
     476              :                               vnuc(coset(ax, ay, az), 2, n) = &
     477              :                                  rbp(1)*vnuc(coset(ax, ay, az), 1, n) - &
     478              :                                  rcp(1)*vnuc(coset(ax, ay, az), 1, n + 1) + &
     479              :                                  fx*(vnuc(coset(ax - 1, ay, az), 1, n) - &
     480      2169046 :                                      vnuc(coset(ax - 1, ay, az), 1, n + 1))
     481              :                               verf(coset(ax, ay, az), 2, n) = &
     482              :                                  rbp(1)*verf(coset(ax, ay, az), 1, n) + &
     483              :                                  rpw(1)*verf(coset(ax, ay, az), 1, n + 1) + &
     484              :                                  fx*(verf(coset(ax - 1, ay, az), 1, n) + &
     485      2169046 :                                      f4*verf(coset(ax - 1, ay, az), 1, n + 1))
     486              :                            END IF
     487              : 
     488      4928760 :                            IF (ay == 0) THEN
     489              :                               vnuc(coset(ax, ay, az), 3, n) = &
     490              :                                  rbp(2)*vnuc(coset(ax, ay, az), 1, n) - &
     491      2759714 :                                  rcp(2)*vnuc(coset(ax, ay, az), 1, n + 1)
     492              :                               verf(coset(ax, ay, az), 3, n) = &
     493              :                                  rbp(2)*verf(coset(ax, ay, az), 1, n) + &
     494      2759714 :                                  rpw(2)*verf(coset(ax, ay, az), 1, n + 1)
     495              :                            ELSE
     496              :                               vnuc(coset(ax, ay, az), 3, n) = &
     497              :                                  rbp(2)*vnuc(coset(ax, ay, az), 1, n) - &
     498              :                                  rcp(2)*vnuc(coset(ax, ay, az), 1, n + 1) + &
     499              :                                  fy*(vnuc(coset(ax, ay - 1, az), 1, n) - &
     500      2169046 :                                      vnuc(coset(ax, ay - 1, az), 1, n + 1))
     501              :                               verf(coset(ax, ay, az), 3, n) = &
     502              :                                  rbp(2)*verf(coset(ax, ay, az), 1, n) + &
     503              :                                  rpw(2)*verf(coset(ax, ay, az), 1, n + 1) + &
     504              :                                  fy*(verf(coset(ax, ay - 1, az), 1, n) + &
     505      2169046 :                                      f4*verf(coset(ax, ay - 1, az), 1, n + 1))
     506              :                            END IF
     507              : 
     508      7688474 :                            IF (az == 0) THEN
     509              :                               vnuc(coset(ax, ay, az), 4, n) = &
     510              :                                  rbp(3)*vnuc(coset(ax, ay, az), 1, n) - &
     511      2759714 :                                  rcp(3)*vnuc(coset(ax, ay, az), 1, n + 1)
     512              :                               verf(coset(ax, ay, az), 4, n) = &
     513              :                                  rbp(3)*verf(coset(ax, ay, az), 1, n) + &
     514      2759714 :                                  rpw(3)*verf(coset(ax, ay, az), 1, n + 1)
     515              :                            ELSE
     516              :                               vnuc(coset(ax, ay, az), 4, n) = &
     517              :                                  rbp(3)*vnuc(coset(ax, ay, az), 1, n) - &
     518              :                                  rcp(3)*vnuc(coset(ax, ay, az), 1, n + 1) + &
     519              :                                  fz*(vnuc(coset(ax, ay, az - 1), 1, n) - &
     520      2169046 :                                      vnuc(coset(ax, ay, az - 1), 1, n + 1))
     521              :                               verf(coset(ax, ay, az), 4, n) = &
     522              :                                  rbp(3)*verf(coset(ax, ay, az), 1, n) + &
     523              :                                  rpw(3)*verf(coset(ax, ay, az), 1, n + 1) + &
     524              :                                  fz*(verf(coset(ax, ay, az - 1), 1, n) + &
     525      2169046 :                                      f4*verf(coset(ax, ay, az - 1), 1, n + 1))
     526              :                            END IF
     527              : 
     528              :                         END DO
     529              :                      END DO
     530              :                   END DO
     531              : 
     532              : !           *** Recurrence steps: [a|A(0)|p] -> [a|A(0)|b] ***
     533              : !           ***                   [ap||s]    -> [ab||s]    ***
     534              : 
     535      1133737 :                   DO lb = 2, lb_max
     536              : 
     537              : !             *** Horizontal recurrence steps ***
     538              : 
     539              : !             *** [a||A(0)|b]{n} = [a+1i|A(0)|b-1i]{n} -      ***
     540              : !             ***                  (Bi - Ai)*[a|A(0)|b-1i]{n} ***
     541              : !             *** [ab||s]{n}     = [(a+1i)(b-1i)||s]{n} -     ***
     542              : !             ***                  (Bi - Ai)*[a(b-1i)||s]{n}  ***
     543              : 
     544       336103 :                      la_start = MAX(0, la_min - 1)
     545              : 
     546       336103 :                      DO la = la_start, la_max - 1
     547       777405 :                         DO n = 1, nmax - la - lb
     548      1234045 :                            DO ax = 0, la
     549      1814213 :                               DO ay = 0, la - ax
     550       773808 :                                  az = la - ax - ay
     551              : 
     552              : !                     *** Shift of angular momentum component z from a to b ***
     553              : 
     554              :                                  vnuc(coset(ax, ay, az), coset(0, 0, lb), n) = &
     555              :                                     vnuc(coset(ax, ay, az + 1), coset(0, 0, lb - 1), n) - &
     556       773808 :                                     rab(3)*vnuc(coset(ax, ay, az), coset(0, 0, lb - 1), n)
     557              :                                  verf(coset(ax, ay, az), coset(0, 0, lb), n) = &
     558              :                                     verf(coset(ax, ay, az + 1), coset(0, 0, lb - 1), n) - &
     559       773808 :                                     rab(3)*verf(coset(ax, ay, az), coset(0, 0, lb - 1), n)
     560              : 
     561              : !                     *** Shift of angular momentum component y from a to b ***
     562              : 
     563      2335737 :                                  DO by = 1, lb
     564      1561929 :                                     bz = lb - by
     565              :                                     vnuc(coset(ax, ay, az), coset(0, by, bz), n) = &
     566              :                                        vnuc(coset(ax, ay + 1, az), coset(0, by - 1, bz), n) - &
     567      1561929 :                                        rab(2)*vnuc(coset(ax, ay, az), coset(0, by - 1, bz), n)
     568              :                                     verf(coset(ax, ay, az), coset(0, by, bz), n) = &
     569              :                                        verf(coset(ax, ay + 1, az), coset(0, by - 1, bz), n) - &
     570      2335737 :                                        rab(2)*verf(coset(ax, ay, az), coset(0, by - 1, bz), n)
     571              :                                  END DO
     572              : 
     573              : !                     *** Shift of angular momentum component x from a to b ***
     574              : 
     575      2934840 :                                  DO bx = 1, lb
     576      4703154 :                                     DO by = 0, lb - bx
     577      2367417 :                                        bz = lb - bx - by
     578              :                                        vnuc(coset(ax, ay, az), coset(bx, by, bz), n) = &
     579              :                                           vnuc(coset(ax + 1, ay, az), coset(bx - 1, by, bz), n) - &
     580      2367417 :                                           rab(1)*vnuc(coset(ax, ay, az), coset(bx - 1, by, bz), n)
     581              :                                        verf(coset(ax, ay, az), coset(bx, by, bz), n) = &
     582              :                                           verf(coset(ax + 1, ay, az), coset(bx - 1, by, bz), n) - &
     583      3929346 :                                           rab(1)*verf(coset(ax, ay, az), coset(bx - 1, by, bz), n)
     584              :                                     END DO
     585              :                                  END DO
     586              : 
     587              :                               END DO
     588              :                            END DO
     589              :                         END DO
     590              :                      END DO
     591              : 
     592              : !             *** Vertical recurrence step ***
     593              : 
     594              : !             *** [a|A(0)|b]{n} = (Pi - Bi)*[a|A(0)|b-1i]{n} -         ***
     595              : !             ***                 (Pi - Ci)*[a|A(0)|b-1i]{n+1} +       ***
     596              : !             ***                 f2*Ni(a)*([a-1i|A(0)|b-1i]{n} -      ***
     597              : !             ***                           [a-1i|A(0)|b-1i]{n+1}) +   ***
     598              : !             ***                 f2*Ni(b-1i)*([a|A(0)|b-2i]{n} -      ***
     599              : !             ***                              [a|A(0)|b-2i]{n+1})     ***
     600              : !             *** [ab||s]{n}    = (Pi - Bi)*[a(b-1i)||s]{n} +          ***
     601              : !             ***                 (Wi - Pi)*[a(b-1i)||s]{n+1} +        ***
     602              : !             ***                 f2*Ni(a)*(   [(a-1i)(b-1i)||s]{n} +  ***
     603              : !             ***                           f4*[(a-1i)(b-1i)||s]{n+1}) ***
     604              : !             ***                 f2*Ni(b-1i)*(   [a(b-2i)||s]{n} +    ***
     605              : !             ***                              f4*[a(b-2i)||s]{n+1})   ***
     606              : 
     607      1278163 :                      DO n = 1, nmax - la_max - lb
     608       646200 :                         DO ax = 0, la_max
     609       359311 :                            fx = f2*REAL(ax, dp)
     610      1157333 :                            DO ay = 0, la_max - ax
     611       653596 :                               fy = f2*REAL(ay, dp)
     612       653596 :                               az = la_max - ax - ay
     613       653596 :                               fz = f2*REAL(az, dp)
     614              : 
     615              : !                   *** Shift of angular momentum component z from a to b ***
     616              : 
     617       653596 :                               f3 = f2*REAL(lb - 1, dp)
     618              : 
     619       653596 :                               IF (az == 0) THEN
     620              :                                  vnuc(coset(ax, ay, az), coset(0, 0, lb), n) = &
     621              :                                     rbp(3)*vnuc(coset(ax, ay, az), coset(0, 0, lb - 1), n) - &
     622              :                                     rcp(3)*vnuc(coset(ax, ay, az), coset(0, 0, lb - 1), n + 1) + &
     623              :                                     f3*(vnuc(coset(ax, ay, az), coset(0, 0, lb - 2), n) - &
     624       359311 :                                         vnuc(coset(ax, ay, az), coset(0, 0, lb - 2), n + 1))
     625              :                                  verf(coset(ax, ay, az), coset(0, 0, lb), n) = &
     626              :                                     rbp(3)*verf(coset(ax, ay, az), coset(0, 0, lb - 1), n) + &
     627              :                                     rpw(3)*verf(coset(ax, ay, az), coset(0, 0, lb - 1), n + 1) + &
     628              :                                     f3*(verf(coset(ax, ay, az), coset(0, 0, lb - 2), n) + &
     629       359311 :                                         f4*verf(coset(ax, ay, az), coset(0, 0, lb - 2), n + 1))
     630              :                               ELSE
     631              :                                  vnuc(coset(ax, ay, az), coset(0, 0, lb), n) = &
     632              :                                     rbp(3)*vnuc(coset(ax, ay, az), coset(0, 0, lb - 1), n) - &
     633              :                                     rcp(3)*vnuc(coset(ax, ay, az), coset(0, 0, lb - 1), n + 1) + &
     634              :                                     fz*(vnuc(coset(ax, ay, az - 1), coset(0, 0, lb - 1), n) - &
     635              :                                         vnuc(coset(ax, ay, az - 1), coset(0, 0, lb - 1), n + 1)) + &
     636              :                                     f3*(vnuc(coset(ax, ay, az), coset(0, 0, lb - 2), n) - &
     637       294285 :                                         vnuc(coset(ax, ay, az), coset(0, 0, lb - 2), n + 1))
     638              :                                  verf(coset(ax, ay, az), coset(0, 0, lb), n) = &
     639              :                                     rbp(3)*verf(coset(ax, ay, az), coset(0, 0, lb - 1), n) + &
     640              :                                     rpw(3)*verf(coset(ax, ay, az), coset(0, 0, lb - 1), n + 1) + &
     641              :                                     fz*(verf(coset(ax, ay, az - 1), coset(0, 0, lb - 1), n) + &
     642              :                                         f4*verf(coset(ax, ay, az - 1), coset(0, 0, lb - 1), n + 1)) + &
     643              :                                     f3*(verf(coset(ax, ay, az), coset(0, 0, lb - 2), n) + &
     644       294285 :                                         f4*verf(coset(ax, ay, az), coset(0, 0, lb - 2), n + 1))
     645              :                               END IF
     646              : 
     647              : !                   *** Shift of angular momentum component y from a to b ***
     648              : 
     649       653596 :                               IF (ay == 0) THEN
     650       359311 :                                  bz = lb - 1
     651              :                                  vnuc(coset(ax, ay, az), coset(0, 1, bz), n) = &
     652              :                                     rbp(2)*vnuc(coset(ax, ay, az), coset(0, 0, bz), n) - &
     653       359311 :                                     rcp(2)*vnuc(coset(ax, ay, az), coset(0, 0, bz), n + 1)
     654              :                                  verf(coset(ax, ay, az), coset(0, 1, bz), n) = &
     655              :                                     rbp(2)*verf(coset(ax, ay, az), coset(0, 0, bz), n) + &
     656       359311 :                                     rpw(2)*verf(coset(ax, ay, az), coset(0, 0, bz), n + 1)
     657       725359 :                                  DO by = 2, lb
     658       366048 :                                     bz = lb - by
     659       366048 :                                     f3 = f2*REAL(by - 1, dp)
     660              :                                     vnuc(coset(ax, ay, az), coset(0, by, bz), n) = &
     661              :                                        rbp(2)*vnuc(coset(ax, ay, az), coset(0, by - 1, bz), n) - &
     662              :                                        rcp(2)*vnuc(coset(ax, ay, az), coset(0, by - 1, bz), n + 1) + &
     663              :                                        f3*(vnuc(coset(ax, ay, az), coset(0, by - 2, bz), n) - &
     664       366048 :                                            vnuc(coset(ax, ay, az), coset(0, by - 2, bz), n + 1))
     665              :                                     verf(coset(ax, ay, az), coset(0, by, bz), n) = &
     666              :                                        rbp(2)*verf(coset(ax, ay, az), coset(0, by - 1, bz), n) + &
     667              :                                        rpw(2)*verf(coset(ax, ay, az), coset(0, by - 1, bz), n + 1) + &
     668              :                                        f3*(verf(coset(ax, ay, az), coset(0, by - 2, bz), n) + &
     669       725359 :                                            f4*verf(coset(ax, ay, az), coset(0, by - 2, bz), n + 1))
     670              :                                  END DO
     671              :                               ELSE
     672       294285 :                                  bz = lb - 1
     673              :                                  vnuc(coset(ax, ay, az), coset(0, 1, bz), n) = &
     674              :                                     rbp(2)*vnuc(coset(ax, ay, az), coset(0, 0, bz), n) - &
     675              :                                     rcp(2)*vnuc(coset(ax, ay, az), coset(0, 0, bz), n + 1) + &
     676              :                                     fy*(vnuc(coset(ax, ay - 1, az), coset(0, 0, bz), n) - &
     677       294285 :                                         vnuc(coset(ax, ay - 1, az), coset(0, 0, bz), n + 1))
     678              :                                  verf(coset(ax, ay, az), coset(0, 1, bz), n) = &
     679              :                                     rbp(2)*verf(coset(ax, ay, az), coset(0, 0, bz), n) + &
     680              :                                     rpw(2)*verf(coset(ax, ay, az), coset(0, 0, bz), n + 1) + &
     681              :                                     fy*(verf(coset(ax, ay - 1, az), coset(0, 0, bz), n) + &
     682       294285 :                                         f4*verf(coset(ax, ay - 1, az), coset(0, 0, bz), n + 1))
     683       596436 :                                  DO by = 2, lb
     684       302151 :                                     bz = lb - by
     685       302151 :                                     f3 = f2*REAL(by - 1, dp)
     686              :                                     vnuc(coset(ax, ay, az), coset(0, by, bz), n) = &
     687              :                                        rbp(2)*vnuc(coset(ax, ay, az), coset(0, by - 1, bz), n) - &
     688              :                                        rcp(2)*vnuc(coset(ax, ay, az), coset(0, by - 1, bz), n + 1) + &
     689              :                                        fy*(vnuc(coset(ax, ay - 1, az), coset(0, by - 1, bz), n) - &
     690              :                                            vnuc(coset(ax, ay - 1, az), coset(0, by - 1, bz), n + 1)) + &
     691              :                                        f3*(vnuc(coset(ax, ay, az), coset(0, by - 2, bz), n) - &
     692       302151 :                                            vnuc(coset(ax, ay, az), coset(0, by - 2, bz), n + 1))
     693              :                                     verf(coset(ax, ay, az), coset(0, by, bz), n) = &
     694              :                                        rbp(2)*verf(coset(ax, ay, az), coset(0, by - 1, bz), n) + &
     695              :                                        rpw(2)*verf(coset(ax, ay, az), coset(0, by - 1, bz), n + 1) + &
     696              :                                        fy*(verf(coset(ax, ay - 1, az), coset(0, by - 1, bz), n) + &
     697              :                                            f4*verf(coset(ax, ay - 1, az), &
     698              :                                                    coset(0, by - 1, bz), n + 1)) + &
     699              :                                        f3*(verf(coset(ax, ay, az), coset(0, by - 2, bz), n) + &
     700       596436 :                                            f4*verf(coset(ax, ay, az), coset(0, by - 2, bz), n + 1))
     701              :                                  END DO
     702              :                               END IF
     703              : 
     704              : !                   *** Shift of angular momentum component x from a to b ***
     705              : 
     706      1012907 :                               IF (ax == 0) THEN
     707      1084670 :                                  DO by = 0, lb - 1
     708       725359 :                                     bz = lb - 1 - by
     709              :                                     vnuc(coset(ax, ay, az), coset(1, by, bz), n) = &
     710              :                                        rbp(1)*vnuc(coset(ax, ay, az), coset(0, by, bz), n) - &
     711       725359 :                                        rcp(1)*vnuc(coset(ax, ay, az), coset(0, by, bz), n + 1)
     712              :                                     verf(coset(ax, ay, az), coset(1, by, bz), n) = &
     713              :                                        rbp(1)*verf(coset(ax, ay, az), coset(0, by, bz), n) + &
     714      1084670 :                                        rpw(1)*verf(coset(ax, ay, az), coset(0, by, bz), n + 1)
     715              :                                  END DO
     716       725359 :                                  DO bx = 2, lb
     717       366048 :                                     f3 = f2*REAL(bx - 1, dp)
     718      1099354 :                                     DO by = 0, lb - bx
     719       373995 :                                        bz = lb - bx - by
     720              :                                        vnuc(coset(ax, ay, az), coset(bx, by, bz), n) = &
     721              :                                           rbp(1)*vnuc(coset(ax, ay, az), coset(bx - 1, by, bz), n) - &
     722              :                                           rcp(1)*vnuc(coset(ax, ay, az), &
     723              :                                                       coset(bx - 1, by, bz), n + 1) + &
     724              :                                           f3*(vnuc(coset(ax, ay, az), coset(bx - 2, by, bz), n) - &
     725       373995 :                                               vnuc(coset(ax, ay, az), coset(bx - 2, by, bz), n + 1))
     726              :                                        verf(coset(ax, ay, az), coset(bx, by, bz), n) = &
     727              :                                           rbp(1)*verf(coset(ax, ay, az), coset(bx - 1, by, bz), n) + &
     728              :                                           rpw(1)*verf(coset(ax, ay, az), &
     729              :                                                       coset(bx - 1, by, bz), n + 1) + &
     730              :                                           f3*(verf(coset(ax, ay, az), coset(bx - 2, by, bz), n) + &
     731       740043 :                                               f4*verf(coset(ax, ay, az), coset(bx - 2, by, bz), n + 1))
     732              :                                     END DO
     733              :                                  END DO
     734              :                               ELSE
     735       890721 :                                  DO by = 0, lb - 1
     736       596436 :                                     bz = lb - 1 - by
     737              :                                     vnuc(coset(ax, ay, az), coset(1, by, bz), n) = &
     738              :                                        rbp(1)*vnuc(coset(ax, ay, az), coset(0, by, bz), n) - &
     739              :                                        rcp(1)*vnuc(coset(ax, ay, az), coset(0, by, bz), n + 1) + &
     740              :                                        fx*(vnuc(coset(ax - 1, ay, az), coset(0, by, bz), n) - &
     741       596436 :                                            vnuc(coset(ax - 1, ay, az), coset(0, by, bz), n + 1))
     742              :                                     verf(coset(ax, ay, az), coset(1, by, bz), n) = &
     743              :                                        rbp(1)*verf(coset(ax, ay, az), coset(0, by, bz), n) + &
     744              :                                        rpw(1)*verf(coset(ax, ay, az), coset(0, by, bz), n + 1) + &
     745              :                                        fx*(verf(coset(ax - 1, ay, az), coset(0, by, bz), n) + &
     746       890721 :                                            f4*verf(coset(ax - 1, ay, az), coset(0, by, bz), n + 1))
     747              :                                  END DO
     748       596436 :                                  DO bx = 2, lb
     749       302151 :                                     f3 = f2*REAL(bx - 1, dp)
     750       908088 :                                     DO by = 0, lb - bx
     751       311652 :                                        bz = lb - bx - by
     752              :                                        vnuc(coset(ax, ay, az), coset(bx, by, bz), n) = &
     753              :                                           rbp(1)*vnuc(coset(ax, ay, az), coset(bx - 1, by, bz), n) - &
     754              :                                           rcp(1)*vnuc(coset(ax, ay, az), &
     755              :                                                       coset(bx - 1, by, bz), n + 1) + &
     756              :                                           fx*(vnuc(coset(ax - 1, ay, az), coset(bx - 1, by, bz), n) - &
     757              :                                               vnuc(coset(ax - 1, ay, az), &
     758              :                                                    coset(bx - 1, by, bz), n + 1)) + &
     759              :                                           f3*(vnuc(coset(ax, ay, az), coset(bx - 2, by, bz), n) - &
     760       311652 :                                               vnuc(coset(ax, ay, az), coset(bx - 2, by, bz), n + 1))
     761              :                                        verf(coset(ax, ay, az), coset(bx, by, bz), n) = &
     762              :                                           rbp(1)*verf(coset(ax, ay, az), coset(bx - 1, by, bz), n) + &
     763              :                                           rpw(1)*verf(coset(ax, ay, az), &
     764              :                                                       coset(bx - 1, by, bz), n + 1) + &
     765              :                                           fx*(verf(coset(ax - 1, ay, az), &
     766              :                                                    coset(bx - 1, by, bz), n) + &
     767              :                                               f4*verf(coset(ax - 1, ay, az), &
     768              :                                                       coset(bx - 1, by, bz), n + 1)) + &
     769              :                                           f3*(verf(coset(ax, ay, az), coset(bx - 2, by, bz), n) + &
     770       613803 :                                               f4*verf(coset(ax, ay, az), coset(bx - 2, by, bz), n + 1))
     771              :                                     END DO
     772              :                                  END DO
     773              :                               END IF
     774              : 
     775              :                            END DO
     776              :                         END DO
     777              :                      END DO
     778              : 
     779              :                   END DO
     780              : 
     781              :                END IF
     782              : 
     783              :             ELSE
     784              : 
     785       698343 :                IF (lb_max > 0) THEN
     786              : 
     787              : !           *** Vertical recurrence steps: [s|A(0)|s] -> [s|A(0)|b] ***
     788              : !           ***                            [ss||s]    -> [sb||s]    ***
     789              : 
     790      1300708 :                   rbp(:) = rap(:) - rab(:)
     791              : 
     792              : !           *** [s|A(0)|p]{n} = (Pi - Bi)*[s|A(0)|s]{n} - ***
     793              : !           ***                 (Pi - Ci)*[s|A(0)|s]{n+1} ***
     794              : !           *** [sp||s]{n}    = (Pi - Bi)*[ss||s]{n} +    ***
     795              : !           ***                 (Wi - Pi)*[ss||s]{n+1}    ***
     796              : 
     797       697018 :                   DO n = 1, nmax - 1
     798       371841 :                      vnuc(1, 2, n) = rbp(1)*vnuc(1, 1, n) - rcp(1)*vnuc(1, 1, n + 1)
     799       371841 :                      verf(1, 2, n) = rbp(1)*verf(1, 1, n) + rpw(1)*verf(1, 1, n + 1)
     800       371841 :                      vnuc(1, 3, n) = rbp(2)*vnuc(1, 1, n) - rcp(2)*vnuc(1, 1, n + 1)
     801       371841 :                      verf(1, 3, n) = rbp(2)*verf(1, 1, n) + rpw(2)*verf(1, 1, n + 1)
     802       371841 :                      vnuc(1, 4, n) = rbp(3)*vnuc(1, 1, n) - rcp(3)*vnuc(1, 1, n + 1)
     803       697018 :                      verf(1, 4, n) = rbp(3)*verf(1, 1, n) + rpw(3)*verf(1, 1, n + 1)
     804              :                   END DO
     805              : 
     806              : !           *** [s|A(0)|b]{n} = (Pi - Bi)*[s|A(0)|b-1i]{n} -       ***
     807              : !           ***                 (Pi - Ci)*[s|A(0)|b-1i]{n+1} +     ***
     808              : !           ***                 f2*Ni(b-1i)*([s|A(0)|b-2i]{n} -    ***
     809              : !           ***                              [s|A(0)|b-2i]{n+1}    ***
     810              : !           *** [sb||s]{n}    = (Pi - Bi)*[s(b-1i)||s]{n} +        ***
     811              : !           ***                 (Wi - Pi)*[s(b-1i)||s]{n+1} +      ***
     812              : !           ***                 f2*Ni(b-1i)*(   [s(b-2i)||s]{n} +  ***
     813              : !           ***                              f4*[s(b-2i)||s]{n+1}) ***
     814              : 
     815       371841 :                   DO lb = 2, lb_max
     816              : 
     817       419920 :                      DO n = 1, nmax - lb
     818              : 
     819              : !               *** Increase the angular momentum component z of function b ***
     820              : 
     821              :                         vnuc(1, coset(0, 0, lb), n) = &
     822              :                            rbp(3)*vnuc(1, coset(0, 0, lb - 1), n) - &
     823              :                            rcp(3)*vnuc(1, coset(0, 0, lb - 1), n + 1) + &
     824              :                            f2*REAL(lb - 1, dp)*(vnuc(1, coset(0, 0, lb - 2), n) - &
     825        48079 :                                                 vnuc(1, coset(0, 0, lb - 2), n + 1))
     826              :                         verf(1, coset(0, 0, lb), n) = &
     827              :                            rbp(3)*verf(1, coset(0, 0, lb - 1), n) + &
     828              :                            rpw(3)*verf(1, coset(0, 0, lb - 1), n + 1) + &
     829              :                            f2*REAL(lb - 1, dp)*(verf(1, coset(0, 0, lb - 2), n) + &
     830        48079 :                                                 f4*verf(1, coset(0, 0, lb - 2), n + 1))
     831              : 
     832              : !               *** Increase the angular momentum component y of function b ***
     833              : 
     834        48079 :                         bz = lb - 1
     835              :                         vnuc(1, coset(0, 1, bz), n) = &
     836              :                            rbp(2)*vnuc(1, coset(0, 0, bz), n) - &
     837        48079 :                            rcp(2)*vnuc(1, coset(0, 0, bz), n + 1)
     838              :                         verf(1, coset(0, 1, bz), n) = &
     839              :                            rbp(2)*verf(1, coset(0, 0, bz), n) + &
     840        48079 :                            rpw(2)*verf(1, coset(0, 0, bz), n + 1)
     841              : 
     842        97810 :                         DO by = 2, lb
     843        49731 :                            bz = lb - by
     844              :                            vnuc(1, coset(0, by, bz), n) = &
     845              :                               rbp(2)*vnuc(1, coset(0, by - 1, bz), n) - &
     846              :                               rcp(2)*vnuc(1, coset(0, by - 1, bz), n + 1) + &
     847              :                               f2*REAL(by - 1, dp)*(vnuc(1, coset(0, by - 2, bz), n) - &
     848        49731 :                                                    vnuc(1, coset(0, by - 2, bz), n + 1))
     849              :                            verf(1, coset(0, by, bz), n) = &
     850              :                               rbp(2)*verf(1, coset(0, by - 1, bz), n) + &
     851              :                               rpw(2)*verf(1, coset(0, by - 1, bz), n + 1) + &
     852              :                               f2*REAL(by - 1, dp)*(verf(1, coset(0, by - 2, bz), n) + &
     853        97810 :                                                    f4*verf(1, coset(0, by - 2, bz), n + 1))
     854              :                         END DO
     855              : 
     856              : !               *** Increase the angular momentum component x of function b ***
     857              : 
     858       145889 :                         DO by = 0, lb - 1
     859        97810 :                            bz = lb - 1 - by
     860              :                            vnuc(1, coset(1, by, bz), n) = &
     861              :                               rbp(1)*vnuc(1, coset(0, by, bz), n) - &
     862        97810 :                               rcp(1)*vnuc(1, coset(0, by, bz), n + 1)
     863              :                            verf(1, coset(1, by, bz), n) = &
     864              :                               rbp(1)*verf(1, coset(0, by, bz), n) + &
     865       145889 :                               rpw(1)*verf(1, coset(0, by, bz), n + 1)
     866              :                         END DO
     867              : 
     868       144474 :                         DO bx = 2, lb
     869        49731 :                            f3 = f2*REAL(bx - 1, dp)
     870       149460 :                            DO by = 0, lb - bx
     871        51650 :                               bz = lb - bx - by
     872              :                               vnuc(1, coset(bx, by, bz), n) = &
     873              :                                  rbp(1)*vnuc(1, coset(bx - 1, by, bz), n) - &
     874              :                                  rcp(1)*vnuc(1, coset(bx - 1, by, bz), n + 1) + &
     875              :                                  f3*(vnuc(1, coset(bx - 2, by, bz), n) - &
     876        51650 :                                      vnuc(1, coset(bx - 2, by, bz), n + 1))
     877              :                               verf(1, coset(bx, by, bz), n) = &
     878              :                                  rbp(1)*verf(1, coset(bx - 1, by, bz), n) + &
     879              :                                  rpw(1)*verf(1, coset(bx - 1, by, bz), n + 1) + &
     880              :                                  f3*(verf(1, coset(bx - 2, by, bz), n) + &
     881       101381 :                                      f4*verf(1, coset(bx - 2, by, bz), n + 1))
     882              :                            END DO
     883              :                         END DO
     884              : 
     885              :                      END DO
     886              : 
     887              :                   END DO
     888              : 
     889              :                END IF
     890              : 
     891              :             END IF
     892              : 
     893              : !       *** Add the contribution of the current pair ***
     894              : !       *** of primitive Gaussian-type functions     ***
     895              : 
     896              : !JT
     897      2319775 :             IF (do_dkh) THEN
     898            0 :                DO j = 1, ncoset(lb_max1)
     899            0 :                   DO i = ncoset(la_min1 - 1) + 1, ncoset(la_max1 - maxder_local)
     900            0 :                      vnabc(na + i, nb + j) = vnabc(na + i, nb + j) + cerf*verf(i, j, 1)
     901              :                   END DO
     902              :                END DO
     903            0 :                DO j = 1, ncoset(lb_max1)
     904            0 :                   DO i = ncoset(la_min1 - 1) + 1, ncoset(la_max1 - maxder_local)
     905            0 :                      vabc(na + i, nb + j) = vabc(na + i, nb + j) - zc*vnuc(i, j, 1)
     906              :                   END DO
     907              :                END DO
     908              :             ELSE
     909      9737748 :                DO j = 1, ncoset(lb_max1) !JT
     910     29434769 :                   DO i = ncoset(la_min1 - 1) + 1, ncoset(la_max1 - maxder_local) !JT
     911              :                      vabc(na + i, nb + j) = vabc(na + i, nb + j) - &
     912     27114994 :                                             zc*vnuc(i, j, 1) + cerf*verf(i, j, 1)
     913              :                   END DO
     914              :                END DO
     915              :             END IF
     916              : !JT
     917              : 
     918      2319775 :             IF (PRESENT(maxder)) THEN
     919      3448473 :                DO j = 1, ncoset(lb_max1) !JT
     920     26179265 :                   DO i = 1, ncoset(la_max1) !JT
     921              :                      vabc_plus(nap + i, nb + j) = vabc_plus(nap + i, nb + j) - &
     922     25381412 :                                                   zc*vnuc(i, j, 1) + cerf*verf(i, j, 1)
     923              :                   END DO
     924              :                END DO
     925              :             END IF
     926              : !JTs
     927      2319775 :             IF (do_dkh) THEN
     928              :                ! *********** Calculate pVp matrix **************
     929              :                ! [pa|V|pb]=4*zeta*zetb*[a+i|V|b+i]-2*zetb*Ni(a)*[a-i|V|b+i]-2*zeta*Ni(b)*[a+i|V|b-i]+Ni(a)*Ni(b)*[a-i|V|b-i]
     930              :                ! Every integral has been calculated before (except [-1|V|-1],[a|V|-1] and [-1|V|b],
     931              :                ! which do not contribute, because their prefactor Ni(a) or Ni(b) is zero)
     932              :                ! and is given by verf/vnuc(coset(ax,ay,az),coset(bx,by,bz),1)
     933              :                ! ***********************************************
     934            0 :                ftaz = 2.0_dp*zeta(ipgf)
     935            0 :                ftbz = 2.0_dp*zetb(jpgf)
     936            0 :                nxx = 1
     937            0 :                nyy = 2
     938            0 :                nzz = 3
     939            0 :                nxy = 4
     940            0 :                nxz = 5
     941            0 :                nyx = 6
     942            0 :                nyz = 7
     943            0 :                nzx = 8
     944            0 :                nzy = 9
     945            0 :                DO la = 0, la_max1
     946            0 :                   DO ax = 0, la
     947            0 :                      fax = REAL(ax, dp)
     948            0 :                      DO ay = 0, la - ax
     949            0 :                         fay = REAL(ay, dp)
     950            0 :                         az = la - ax - ay
     951            0 :                         faz = REAL(az, dp)
     952            0 :                         pVpa = coset(ax, ay, az)
     953            0 :                         coamx = coset(ax - 1, ay, az)
     954            0 :                         coamy = coset(ax, ay - 1, az)
     955            0 :                         coamz = coset(ax, ay, az - 1)
     956            0 :                         coapx = coset(ax + 1, ay, az)
     957            0 :                         coapy = coset(ax, ay + 1, az)
     958            0 :                         coapz = coset(ax, ay, az + 1)
     959            0 :                         DO lb = 0, lb_max1
     960            0 :                            DO bx = 0, lb
     961            0 :                               fbx = REAL(bx, dp)
     962            0 :                               DO by = 0, lb - bx
     963            0 :                                  fby = REAL(by, dp)
     964            0 :                                  bz = lb - bx - by
     965            0 :                                  fbz = REAL(bz, dp)
     966            0 :                                  pVpb = coset(bx, by, bz)
     967            0 :                                  cobmx = coset(bx - 1, by, bz)
     968            0 :                                  cobmy = coset(bx, by - 1, bz)
     969            0 :                                  cobmz = coset(bx, by, bz - 1)
     970            0 :                                  cobpx = coset(bx + 1, by, bz)
     971            0 :                                  cobpy = coset(bx, by + 1, bz)
     972            0 :                                  cobpz = coset(bx, by, bz + 1)
     973            0 :                                  IF (dkh_erfc) THEN
     974              :                                     pVp(pVpa, pVpb) = ftaz*ftbz*(-zc*vnuc(coapx, cobpx, 1) + cerf*verf(coapx, cobpx, 1)) - &
     975              :                                                       ftaz*fbx*(-zc*vnuc(coapx, cobmx, 1) + cerf*verf(coapx, cobmx, 1)) - &
     976              :                                                       ftbz*fax*(-zc*vnuc(coamx, cobpx, 1) + cerf*verf(coamx, cobpx, 1)) + &
     977              :                                                       fax*fbx*(-zc*vnuc(coamx, cobmx, 1) + cerf*verf(coamx, cobmx, 1)) + &
     978              :                                                       ftaz*ftbz*(-zc*vnuc(coapy, cobpy, 1) + cerf*verf(coapy, cobpy, 1)) - &
     979              :                                                       ftaz*fby*(-zc*vnuc(coapy, cobmy, 1) + cerf*verf(coapy, cobmy, 1)) - &
     980              :                                                       ftbz*fay*(-zc*vnuc(coamy, cobpy, 1) + cerf*verf(coamy, cobpy, 1)) + &
     981              :                                                       fay*fby*(-zc*vnuc(coamy, cobmy, 1) + cerf*verf(coamy, cobmy, 1)) + &
     982              :                                                       ftaz*ftbz*(-zc*vnuc(coapz, cobpz, 1) + cerf*verf(coapz, cobpz, 1)) - &
     983              :                                                       ftaz*fbz*(-zc*vnuc(coapz, cobmz, 1) + cerf*verf(coapz, cobmz, 1)) - &
     984              :                                                       ftbz*faz*(-zc*vnuc(coamz, cobpz, 1) + cerf*verf(coamz, cobpz, 1)) + &
     985            0 :                                                       faz*fbz*(-zc*vnuc(coamz, cobmz, 1) + cerf*verf(coamz, cobmz, 1))
     986              :                                  ELSE
     987              :                                     pVp(pVpa, pVpb) = ftaz*ftbz*(-zc*vnuc(coapx, cobpx, 1)) - &
     988              :                                                       ftaz*fbx*(-zc*vnuc(coapx, cobmx, 1)) - &
     989              :                                                       ftbz*fax*(-zc*vnuc(coamx, cobpx, 1)) + &
     990              :                                                       fax*fbx*(-zc*vnuc(coamx, cobmx, 1)) + &
     991              :                                                       ftaz*ftbz*(-zc*vnuc(coapy, cobpy, 1)) - &
     992              :                                                       ftaz*fby*(-zc*vnuc(coapy, cobmy, 1)) - &
     993              :                                                       ftbz*fay*(-zc*vnuc(coamy, cobpy, 1)) + &
     994              :                                                       fay*fby*(-zc*vnuc(coamy, cobmy, 1)) + &
     995              :                                                       ftaz*ftbz*(-zc*vnuc(coapz, cobpz, 1)) - &
     996              :                                                       ftaz*fbz*(-zc*vnuc(coapz, cobmz, 1)) - &
     997              :                                                       ftbz*faz*(-zc*vnuc(coamz, cobpz, 1)) + &
     998            0 :                                                       faz*fbz*(-zc*vnuc(coamz, cobmz, 1))
     999              :                                  END IF
    1000              :                               END DO
    1001              :                            END DO
    1002              :                         END DO
    1003              :                      END DO
    1004              :                   END DO
    1005              :                END DO
    1006              : 
    1007            0 :                DO j = 1, ncoset(lb_max1)
    1008            0 :                   DO i = ncoset(la_min1 - 1) + 1, ncoset(la_max1 - maxder_local)
    1009            0 :                      pVp_sum(na + i, nb + j) = pVp_sum(na + i, nb + j) + pVp(i, j)
    1010              :                   END DO
    1011              :                END DO
    1012              :             END IF
    1013              : !JTe
    1014      4246245 :             nb = nb + ncoset(lb_max1) !JT
    1015              : 
    1016              :          END DO
    1017              : 
    1018      1926470 :          na = na + ncoset(la_max1 - maxder_local) !JT
    1019      3546943 :          nap = nap + ncoset(la_max1) !JT
    1020              : 
    1021              :       END DO
    1022              : 
    1023      1620473 :    END SUBROUTINE verfc
    1024              : 
    1025              : END MODULE ai_verfc
        

Generated by: LCOV version 2.0-1