LCOV - code coverage report
Current view: top level - src/aobasis - ai_oneelectron.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:7b91db8) Lines: 356 375 94.9 %
Date: 2025-06-18 07:02:16 Functions: 2 2 100.0 %

          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 Calculation of general three-center integrals over Cartesian
      10             : !>      Gaussian-type functions and a spherical operator centered at position C
      11             : !>
      12             : !>      <a|V(local)|b> = <a|F(|r-C|)|b>
      13             : !> \par Literature
      14             : !>      S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
      15             : !> \par History
      16             : !>      - Based in part on code by MK
      17             : !> \par Parameters
      18             : !>      -  ax,ay,az   : Angular momentum index numbers of orbital a.
      19             : !>      -  bx,by,bz   : Angular momentum index numbers of orbital b.
      20             : !>      -  coset      : Cartesian orbital set pointer.
      21             : !>      -  dab        : Distance between the atomic centers a and b.
      22             : !>      -  dac        : Distance between the atomic centers a and c.
      23             : !>      -  dbc        : Distance between the atomic centers b and c.
      24             : !>      -  l{a,b}     : Angular momentum quantum number of shell a or b.
      25             : !>      -  l{a,b}_max : Maximum angular momentum quantum number of shell a or b.
      26             : !>      -  ncoset     : Number of Cartesian orbitals up to l.
      27             : !>      -  rab        : Distance vector between the atomic centers a and b.
      28             : !>      -  rac        : Distance vector between the atomic centers a and c.
      29             : !>      -  rbc        : Distance vector between the atomic centers b and c.
      30             : !>      -  rpgf{a,b,c}: Radius of the primitive Gaussian-type function a or b.
      31             : !>      -  zet{a,b}   : Exponents of the Gaussian-type functions a or b.
      32             : !> \author jhu (05.2011)
      33             : ! **************************************************************************************************
      34             : MODULE ai_oneelectron
      35             : 
      36             :    USE kinds,                           ONLY: dp
      37             :    USE orbital_pointers,                ONLY: coset,&
      38             :                                               ncoset
      39             : #include "../base/base_uses.f90"
      40             : 
      41             :    IMPLICIT NONE
      42             : 
      43             :    PRIVATE
      44             : 
      45             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_oneelectron'
      46             : 
      47             : ! *** Public subroutines ***
      48             : 
      49             :    PUBLIC :: os_3center, os_2center
      50             : 
      51             : CONTAINS
      52             : 
      53             : ! **************************************************************************************************
      54             : !> \brief   Calculation of three-center integrals <a|c|b> over
      55             : !>           Cartesian Gaussian functions and a spherical potential
      56             : !>
      57             : !> \param la_max_set ...
      58             : !> \param la_min_set ...
      59             : !> \param npgfa ...
      60             : !> \param rpgfa ...
      61             : !> \param zeta ...
      62             : !> \param lb_max_set ...
      63             : !> \param lb_min_set ...
      64             : !> \param npgfb ...
      65             : !> \param rpgfb ...
      66             : !> \param zetb ...
      67             : !> \param auxint ...
      68             : !> \param rpgfc ...
      69             : !> \param rab ...
      70             : !> \param dab ...
      71             : !> \param rac ...
      72             : !> \param dac ...
      73             : !> \param rbc ...
      74             : !> \param dbc ...
      75             : !> \param vab ...
      76             : !> \param s ...
      77             : !> \param pab ...
      78             : !> \param force_a ...
      79             : !> \param force_b ...
      80             : !> \param fs ...
      81             : !> \param vab2 The derivative of the 3-center integrals according to the weighting factors.
      82             : !> \param vab2_work ...
      83             : !> \param deltaR DIMENSION(3, natoms), weighting factors of the derivatives for each atom and direction
      84             : !> \param iatom ...
      85             : !> \param jatom ...
      86             : !> \param katom ...
      87             : !> \date    May 2011
      88             : !> \author  Juerg Hutter
      89             : !> \version 1.0
      90             : !> \note    Extended by the derivatives for DFPT [Sandra Luber, Edward Ditler, 2021]
      91             : ! **************************************************************************************************
      92    34945148 :    SUBROUTINE os_3center(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
      93    34945148 :                          lb_max_set, lb_min_set, npgfb, rpgfb, zetb, auxint, rpgfc, &
      94    69890296 :                          rab, dab, rac, dac, rbc, dbc, vab, s, pab, force_a, force_b, fs, &
      95    69890296 :                          vab2, vab2_work, deltaR, iatom, jatom, katom)
      96             :       INTEGER, INTENT(IN)                                :: la_max_set, la_min_set, npgfa
      97             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa, zeta
      98             :       INTEGER, INTENT(IN)                                :: lb_max_set, lb_min_set, npgfb
      99             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfb, zetb
     100             :       REAL(KIND=dp), DIMENSION(0:, :), INTENT(IN)        :: auxint
     101             :       REAL(KIND=dp), INTENT(IN)                          :: rpgfc
     102             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rab
     103             :       REAL(KIND=dp), INTENT(IN)                          :: dab
     104             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
     105             :       REAL(KIND=dp), INTENT(IN)                          :: dac
     106             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rbc
     107             :       REAL(KIND=dp), INTENT(IN)                          :: dbc
     108             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: vab
     109             :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT)   :: s
     110             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN), &
     111             :          OPTIONAL                                        :: pab
     112             :       REAL(KIND=dp), DIMENSION(3), INTENT(OUT), OPTIONAL :: force_a, force_b
     113             :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
     114             :          OPTIONAL                                        :: fs, vab2, vab2_work
     115             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN), &
     116             :          OPTIONAL                                        :: deltaR
     117             :       INTEGER, INTENT(IN), OPTIONAL                      :: iatom, jatom, katom
     118             : 
     119             :       INTEGER :: ax, ay, az, bx, by, bz, cda, cdax, cday, cdaz, cdb, cdbx, cdby, cdbz, coa, coamx, &
     120             :          coamy, coamz, coapx, coapy, coapz, cob, cobmx, cobmy, cobmz, cobpx, cobpy, cobpz, da, &
     121             :          da_max, dax, day, daz, db, db_max, dbx, dby, dbz, i, ia, iap, iax, iay, iaz, ib, ibm, &
     122             :          ibx, iby, ibz, idir, ii(3), iim(3), ij, ipgf, ir, ir1, ir2, irm(3), irr(3), irx, iry, &
     123             :          irz, ix, ixx(1), j, jj(3), jjp(3), jpgf, la, la_max, la_min, lb, lb_max, lb_min, llr, m, &
     124             :          ma, mb, mmax, na, nb
     125    34945148 :       INTEGER, ALLOCATABLE, DIMENSION(:, :)              :: iiap
     126             :       LOGICAL                                            :: calculate_force_a, calculate_force_b
     127             :       REAL(KIND=dp)                                      :: aai, abx, fax, fay, faz, fbx, fby, fbz, &
     128             :                                                             ftz, orho, rho, s1, s2
     129             :       REAL(KIND=dp), DIMENSION(3)                        :: pai, pbi, pci
     130             : 
     131    34945148 :       IF (PRESENT(pab)) THEN
     132     8963078 :          CPASSERT(PRESENT(fs))
     133     8963078 :          IF (PRESENT(force_a)) THEN
     134             :             calculate_force_a = .TRUE.
     135             :          ELSE
     136           0 :             calculate_force_a = .FALSE.
     137             :          END IF
     138     8963078 :          IF (PRESENT(force_b)) THEN
     139             :             calculate_force_b = .TRUE.
     140             :          ELSE
     141           0 :             calculate_force_b = .FALSE.
     142             :          END IF
     143             :       ELSE
     144             :          calculate_force_a = .FALSE.
     145             :          calculate_force_b = .FALSE.
     146             :       END IF
     147             : 
     148     8963078 :       IF (calculate_force_a) THEN
     149     8963078 :          da_max = 1
     150     8963078 :          force_a = 0.0_dp
     151             :       ELSE
     152             :          da_max = 0
     153             :       END IF
     154             : 
     155    34945148 :       IF (calculate_force_b) THEN
     156     8963078 :          db_max = 1
     157     8963078 :          force_b = 0.0_dp
     158             :       ELSE
     159             :          db_max = 0
     160             :       END IF
     161             : 
     162    34945148 :       IF (PRESENT(vab2)) THEN
     163         870 :          da_max = 1
     164         870 :          db_max = 1
     165             :       END IF
     166             : 
     167    34945148 :       la_max = la_max_set + da_max
     168    34945148 :       la_min = MAX(0, la_min_set - da_max)
     169             : 
     170    34945148 :       lb_max = lb_max_set + db_max
     171    34945148 :       lb_min = MAX(0, lb_min_set - db_max)
     172             : 
     173    34945148 :       mmax = la_max + lb_max
     174             : 
     175             :       ! precalculate indices for horizontal recursion
     176   104835444 :       ALLOCATE (iiap(ncoset(mmax), 3))
     177   159075239 :       DO ma = 0, mmax
     178   478050123 :          DO iax = 0, ma
     179  1134730830 :             DO iay = 0, ma - iax
     180   691625855 :                iaz = ma - iax - iay
     181   691625855 :                ia = coset(iax, iay, iaz)
     182   691625855 :                jj(1) = iax; jj(2) = iay; jj(3) = iaz
     183   691625855 :                jjp = jj
     184   691625855 :                jjp(1) = jjp(1) + 1
     185   691625855 :                iap = coset(jjp(1), jjp(2), jjp(3))
     186   691625855 :                iiap(ia, 1) = iap
     187   691625855 :                jjp = jj
     188   691625855 :                jjp(2) = jjp(2) + 1
     189   691625855 :                iap = coset(jjp(1), jjp(2), jjp(3))
     190   691625855 :                iiap(ia, 2) = iap
     191   691625855 :                jjp = jj
     192   691625855 :                jjp(3) = jjp(3) + 1
     193   691625855 :                iap = coset(jjp(1), jjp(2), jjp(3))
     194  1010600739 :                iiap(ia, 3) = iap
     195             :             END DO
     196             :          END DO
     197             :       END DO
     198             : 
     199             : !   *** Loop over all pairs of primitive Gaussian-type functions ***
     200             : 
     201    34945148 :       na = 0
     202             : 
     203   154913027 :       DO ipgf = 1, npgfa
     204             : 
     205             : !     *** Screening ***
     206   119967879 :          IF (rpgfa(ipgf) + rpgfc < dac) THEN
     207    75249771 :             na = na + ncoset(la_max_set)
     208    75249771 :             CYCLE
     209             :          END IF
     210             : 
     211    44718108 :          nb = 0
     212             : 
     213   204272435 :          DO jpgf = 1, npgfb
     214             : 
     215             : !       *** Screening ***
     216   159554327 :             IF ((rpgfb(jpgf) + rpgfc < dbc) .OR. &
     217             :                 (rpgfa(ipgf) + rpgfb(jpgf) < dab)) THEN
     218   101232176 :                nb = nb + ncoset(lb_max_set)
     219   101232176 :                CYCLE
     220             :             END IF
     221             : 
     222             : !       *** Calculate some prefactors ***
     223    58322151 :             rho = zeta(ipgf) + zetb(jpgf)
     224   233288604 :             pai(:) = zetb(jpgf)/rho*rab(:)
     225   233288604 :             pbi(:) = -zeta(ipgf)/rho*rab(:)
     226   233288604 :             pci(:) = -(zeta(ipgf)*rac(:) + zetb(jpgf)*rbc(:))/rho
     227    58322151 :             orho = 0.5_dp/rho
     228             : 
     229    58322151 :             ij = (ipgf - 1)*npgfb + jpgf
     230   270671515 :             s(1, 1, 1:mmax + 1) = auxint(0:mmax, ij)
     231             : 
     232    58322151 :             IF (la_max > 0) THEN
     233             : !         *** Recurrence steps: [s|c|s] -> [a|c|s]               ***
     234             : !         *** [a|c|s](m) = (Pi - Ai)*[a-1i|c|s](m) -             ***
     235             : !         ***              (Pi - Ci)*[a-1i|c|s](m+1)) +          ***
     236             : !         ***              Ni(a-1i)/2(a+b)*[a-2i|c|s](m) -       ***
     237             : !         ***              Ni(a-1i)/2(a+b)*[a-2i|c|s](m+1)       ***
     238   202789724 :                DO llr = 1, mmax
     239   202789724 :                   IF (llr == 1) THEN
     240   202789724 :                      DO m = 0, mmax - llr
     241   151673210 :                         s1 = s(1, 1, m + 1)
     242   151673210 :                         s2 = s(1, 1, m + 2)
     243   151673210 :                         s(2, 1, m + 1) = pai(1)*s1 - pci(1)*s2 ! [px|o|s]
     244   151673210 :                         s(3, 1, m + 1) = pai(2)*s1 - pci(2)*s2 ! [py|o|s]
     245   202789724 :                         s(4, 1, m + 1) = pai(3)*s1 - pci(3)*s2 ! [pz|o|s]
     246             :                      END DO
     247   100556696 :                   ELSE IF (llr == 2) THEN
     248   149791499 :                      DO m = 0, mmax - llr
     249   100556696 :                         s1 = s(1, 1, m + 1) - s(1, 1, m + 2)
     250   100556696 :                         s(5, 1, m + 1) = pai(1)*s(2, 1, m + 1) - pci(1)*s(2, 1, m + 2) + orho*s1 ! [dx2|o|s]
     251   100556696 :                         s(6, 1, m + 1) = pai(1)*s(3, 1, m + 1) - pci(1)*s(3, 1, m + 2) ! [dxy|o|s]
     252   100556696 :                         s(7, 1, m + 1) = pai(1)*s(4, 1, m + 1) - pci(1)*s(4, 1, m + 2) ! [dxz|o|s]
     253   100556696 :                         s(8, 1, m + 1) = pai(2)*s(3, 1, m + 1) - pci(2)*s(3, 1, m + 2) + orho*s1 ! [dy2|o|s]
     254   100556696 :                         s(9, 1, m + 1) = pai(2)*s(4, 1, m + 1) - pci(2)*s(4, 1, m + 2) ! [dyz|o|s]
     255   149791499 :                         s(10, 1, m + 1) = pai(3)*s(4, 1, m + 1) - pci(3)*s(4, 1, m + 2) + orho*s1 ! [dz2|o|s]
     256             :                      END DO
     257    51321893 :                   ELSE IF (llr == 3) THEN
     258    77230814 :                      DO m = 0, mmax - llr
     259             :                         s(11, 1, m + 1) = pai(1)*s(5, 1, m + 1) - pci(1)*s(5, 1, m + 2) & ! [fx3 |o|s]
     260    51321893 :                                           + 2._dp*orho*(s(2, 1, m + 1) - s(2, 1, m + 2))
     261             :                         s(12, 1, m + 1) = pai(1)*s(6, 1, m + 1) - pci(1)*s(6, 1, m + 2) & ! [fx2y|o|s]
     262    51321893 :                                           + orho*(s(3, 1, m + 1) - s(3, 1, m + 2))
     263             :                         s(13, 1, m + 1) = pai(1)*s(7, 1, m + 1) - pci(1)*s(7, 1, m + 2) & ! [fx2z|o|s]
     264    51321893 :                                           + orho*(s(4, 1, m + 1) - s(4, 1, m + 2))
     265             :                         s(14, 1, m + 1) = pai(2)*s(6, 1, m + 1) - pci(2)*s(6, 1, m + 2) & ! [fxy2|o|s]
     266    51321893 :                                           + orho*(s(2, 1, m + 1) - s(2, 1, m + 2))
     267    51321893 :                         s(15, 1, m + 1) = pai(1)*s(9, 1, m + 1) - pci(1)*s(9, 1, m + 2) ! [fxyz|o|s]
     268             :                         s(16, 1, m + 1) = pai(3)*s(7, 1, m + 1) - pci(3)*s(7, 1, m + 2) & ! [fxz2|o|s]
     269    51321893 :                                           + orho*(s(2, 1, m + 1) - s(2, 1, m + 2))
     270             :                         s(17, 1, m + 1) = pai(2)*s(8, 1, m + 1) - pci(2)*s(8, 1, m + 2) & ! [fy3 |o|s]
     271    51321893 :                                           + 2._dp*orho*(s(3, 1, m + 1) - s(3, 1, m + 2))
     272             :                         s(18, 1, m + 1) = pai(2)*s(9, 1, m + 1) - pci(2)*s(9, 1, m + 2) & ! [fy2z|o|s]
     273    51321893 :                                           + orho*(s(4, 1, m + 1) - s(4, 1, m + 2))
     274             :                         s(19, 1, m + 1) = pai(3)*s(9, 1, m + 1) - pci(3)*s(9, 1, m + 2) & ! [fyz2|o|s]
     275    51321893 :                                           + orho*(s(3, 1, m + 1) - s(3, 1, m + 2))
     276             :                         s(20, 1, m + 1) = pai(3)*s(10, 1, m + 1) - pci(3)*s(10, 1, m + 2) & ! [fz3 |o|s]
     277    77230814 :                                           + 2._dp*orho*(s(4, 1, m + 1) - s(4, 1, m + 2))
     278             :                      END DO
     279    25412972 :                   ELSE IF (llr == 4) THEN
     280    43807676 :                      DO m = 0, mmax - llr
     281             :                         s(21, 1, m + 1) = pai(1)*s(11, 1, m + 1) - pci(1)*s(11, 1, m + 2) & ! [gx4  |s|s]
     282    25412972 :                                           + 3._dp*orho*(s(5, 1, m + 1) - s(5, 1, m + 2))
     283             :                         s(22, 1, m + 1) = pai(1)*s(12, 1, m + 1) - pci(1)*s(12, 1, m + 2) & ! [gx3y |s|s]
     284    25412972 :                                           + 2._dp*orho*(s(6, 1, m + 1) - s(6, 1, m + 2))
     285             :                         s(23, 1, m + 1) = pai(1)*s(13, 1, m + 1) - pci(1)*s(13, 1, m + 2) & ! [gx3z |s|s]
     286    25412972 :                                           + 2._dp*orho*(s(7, 1, m + 1) - s(7, 1, m + 2))
     287             :                         s(24, 1, m + 1) = pai(1)*s(14, 1, m + 1) - pci(1)*s(14, 1, m + 2) & ! [gx2y2|s|s]
     288    25412972 :                                           + orho*(s(8, 1, m + 1) - s(8, 1, m + 2))
     289             :                         s(25, 1, m + 1) = pai(1)*s(15, 1, m + 1) - pci(1)*s(15, 1, m + 2) & ! [gx2yz|s|s]
     290    25412972 :                                           + orho*(s(9, 1, m + 1) - s(9, 1, m + 2))
     291             :                         s(26, 1, m + 1) = pai(1)*s(16, 1, m + 1) - pci(1)*s(16, 1, m + 2) & ! [gx2z2|s|s]
     292    25412972 :                                           + orho*(s(10, 1, m + 1) - s(10, 1, m + 2))
     293    25412972 :                         s(27, 1, m + 1) = pai(1)*s(17, 1, m + 1) - pci(1)*s(17, 1, m + 2) ! [gxy3 |s|s]
     294    25412972 :                         s(28, 1, m + 1) = pai(1)*s(18, 1, m + 1) - pci(1)*s(18, 1, m + 2) ! [gxy2z|s|s]
     295    25412972 :                         s(29, 1, m + 1) = pai(1)*s(19, 1, m + 1) - pci(1)*s(19, 1, m + 2) ! [gxyz2|s|s]
     296    25412972 :                         s(30, 1, m + 1) = pai(1)*s(20, 1, m + 1) - pci(1)*s(20, 1, m + 2) ! [gxz3 |s|s]
     297             :                         s(31, 1, m + 1) = pai(2)*s(17, 1, m + 1) - pci(2)*s(17, 1, m + 2) & ! [gy4  |s|s]
     298    25412972 :                                           + 3._dp*orho*(s(8, 1, m + 1) - s(8, 1, m + 2))
     299             :                         s(32, 1, m + 1) = pai(2)*s(18, 1, m + 1) - pci(2)*s(18, 1, m + 2) & ! [gy3z |s|s]
     300    25412972 :                                           + 2._dp*orho*(s(9, 1, m + 1) - s(9, 1, m + 2))
     301             :                         s(33, 1, m + 1) = pai(2)*s(19, 1, m + 1) - pci(2)*s(19, 1, m + 2) & ! [gy2z2|s|s]
     302    25412972 :                                           + orho*(s(10, 1, m + 1) - s(10, 1, m + 2))
     303    25412972 :                         s(34, 1, m + 1) = pai(2)*s(20, 1, m + 1) - pci(2)*s(20, 1, m + 2) ! [gyz3 |s|s]
     304             :                         s(35, 1, m + 1) = pai(3)*s(20, 1, m + 1) - pci(3)*s(20, 1, m + 2) & ! [gz4  |s|s]
     305    43807676 :                                           + 3._dp*orho*(s(10, 1, m + 1) - s(10, 1, m + 2))
     306             :                      END DO
     307             :                   ELSE
     308    51810421 :                      DO irx = 0, llr
     309   218556202 :                         DO iry = 0, llr - irx
     310   166745781 :                            irz = llr - irx - iry
     311   166745781 :                            irr(1) = irx; irr(2) = iry; irr(3) = irz
     312   833728905 :                            ixx = MAXLOC(irr)
     313   166745781 :                            ix = ixx(1)
     314   166745781 :                            ir = coset(irx, iry, irz)
     315   166745781 :                            irm = irr
     316   166745781 :                            irm(ix) = irm(ix) - 1
     317   166745781 :                            aai = REAL(MAX(irm(ix), 0), dp)*orho
     318   166745781 :                            ir1 = coset(irm(1), irm(2), irm(3))
     319   166745781 :                            irm(ix) = irm(ix) - 1
     320   166745781 :                            ir2 = coset(irm(1), irm(2), irm(3))
     321   438853748 :                            DO m = 0, mmax - llr
     322             :                               s(ir, 1, m + 1) = pai(ix)*s(ir1, 1, m + 1) - pci(ix)*s(ir1, 1, m + 2) &
     323   394061595 :                                                 + aai*(s(ir2, 1, m + 1) - s(ir2, 1, m + 2))
     324             :                            END DO
     325             :                         END DO
     326             :                      END DO
     327             :                   END IF
     328             :                END DO
     329             : 
     330             : !         *** Horizontal recurrence steps ***
     331             : !         *** [a|c|b+1i] = [a+1i|c|b] + (Ai - Bi)*[a|c|b] ***
     332             : 
     333   125818609 :                DO mb = 1, lb_max
     334   304621111 :                   DO ibx = 0, mb
     335   569668549 :                      DO iby = 0, mb - ibx
     336   316163952 :                         ibz = mb - ibx - iby
     337   316163952 :                         ib = coset(ibx, iby, ibz)
     338   316163952 :                         ii(1) = ibx; ii(2) = iby; ii(3) = ibz
     339  1580819760 :                         ixx = MAXLOC(ii)
     340   316163952 :                         ix = ixx(1)
     341   316163952 :                         abx = -rab(ix)
     342   316163952 :                         iim = ii
     343   316163952 :                         iim(ix) = iim(ix) - 1
     344   316163952 :                         ibm = coset(iim(1), iim(2), iim(3))
     345  4826264601 :                         DO ia = 1, ncoset(mmax - mb)
     346  4331298147 :                            iap = iiap(ia, ix)
     347  4647462099 :                            s(ia, ib, 1) = s(iap, ibm, 1) + abx*s(ia, ibm, 1)
     348             :                         END DO
     349             :                      END DO
     350             :                   END DO
     351             :                END DO
     352             : 
     353     7205637 :             ELSE IF (lb_max > 0) THEN
     354             : 
     355             : !         *** Recurrence steps: [s|c|s] -> [s|c|b]               ***
     356             : !         *** [s|c|b](m) = (Pi - Bi)*[s|c|b-1i](m) -             ***
     357             : !         ***              (Pi - Ci)*[s|c|b-1i](m+1)) +          ***
     358             : !         ***              Ni(b-1i)/2(a+b)*[s|c|b-2i](m) -       ***
     359             : !         ***              Ni(b-1i)/2(a+b)*[s|c|b-2i](m+1)       ***
     360     4479677 :                DO llr = 1, lb_max
     361     4479677 :                   IF (llr == 1) THEN
     362     4479677 :                      DO m = 0, lb_max - llr
     363     2354003 :                         s1 = s(1, 1, m + 1)
     364     2354003 :                         s2 = s(1, 1, m + 2)
     365     2354003 :                         s(1, 2, m + 1) = pbi(1)*s1 - pci(1)*s2 ! [px|o|s]
     366     2354003 :                         s(1, 3, m + 1) = pbi(2)*s1 - pci(2)*s2 ! [py|o|s]
     367     4479677 :                         s(1, 4, m + 1) = pbi(3)*s1 - pci(3)*s2 ! [pz|o|s]
     368             :                      END DO
     369      228329 :                   ELSE IF (llr == 2) THEN
     370      445016 :                      DO m = 0, lb_max - llr
     371      228329 :                         s1 = s(1, 1, m + 1) - s(1, 1, m + 2)
     372      228329 :                         s(1, 5, m + 1) = pbi(1)*s(1, 2, m + 1) - pci(1)*s(1, 2, m + 2) + orho*s1 ! [dx2|o|s]
     373      228329 :                         s(1, 6, m + 1) = pbi(1)*s(1, 3, m + 1) - pci(1)*s(1, 3, m + 2) ! [dxy|o|s]
     374      228329 :                         s(1, 7, m + 1) = pbi(1)*s(1, 4, m + 1) - pci(1)*s(1, 4, m + 2) ! [dxz|o|s]
     375      228329 :                         s(1, 8, m + 1) = pbi(2)*s(1, 3, m + 1) - pci(2)*s(1, 3, m + 2) + orho*s1 ! [dy2|o|s]
     376      228329 :                         s(1, 9, m + 1) = pbi(2)*s(1, 4, m + 1) - pci(2)*s(1, 4, m + 2) ! [dyz|o|s]
     377      445016 :                         s(1, 10, m + 1) = pbi(3)*s(1, 4, m + 1) - pci(3)*s(1, 4, m + 2) + orho*s1 ! [dz2|o|s]
     378             :                      END DO
     379       11642 :                   ELSE IF (llr == 3) THEN
     380       23202 :                      DO m = 0, lb_max - llr
     381             :                         s(1, 11, m + 1) = pbi(1)*s(1, 5, m + 1) - pci(1)*s(1, 5, m + 2) & ! [fx3 |o|s]
     382       11642 :                                           + 2._dp*orho*(s(1, 2, m + 1) - s(1, 2, m + 2))
     383             :                         s(1, 12, m + 1) = pbi(1)*s(1, 6, m + 1) - pci(1)*s(1, 6, m + 2) & ! [fx2y|o|s]
     384       11642 :                                           + orho*(s(1, 3, m + 1) - s(1, 3, m + 2))
     385             :                         s(1, 13, m + 1) = pbi(1)*s(1, 7, m + 1) - pci(1)*s(1, 7, m + 2) & ! [fx2z|o|s]
     386       11642 :                                           + orho*(s(1, 4, m + 1) - s(1, 4, m + 2))
     387             :                         s(1, 14, m + 1) = pbi(2)*s(1, 6, m + 1) - pci(2)*s(1, 6, m + 2) & ! [fxy2|o|s]
     388       11642 :                                           + orho*(s(1, 2, m + 1) - s(1, 2, m + 2))
     389       11642 :                         s(1, 15, m + 1) = pbi(1)*s(1, 9, m + 1) - pci(1)*s(1, 9, m + 2) ! [fxyz|o|s]
     390             :                         s(1, 16, m + 1) = pbi(3)*s(1, 7, m + 1) - pci(3)*s(1, 7, m + 2) & ! [fxz2|o|s]
     391       11642 :                                           + orho*(s(1, 2, m + 1) - s(1, 2, m + 2))
     392             :                         s(1, 17, m + 1) = pbi(2)*s(1, 8, m + 1) - pci(2)*s(1, 8, m + 2) & ! [fy3 |o|s]
     393       11642 :                                           + 2._dp*orho*(s(1, 3, m + 1) - s(1, 3, m + 2))
     394             :                         s(1, 18, m + 1) = pbi(2)*s(1, 9, m + 1) - pci(2)*s(1, 9, m + 2) & ! [fy2z|o|s]
     395       11642 :                                           + orho*(s(1, 4, m + 1) - s(1, 4, m + 2))
     396             :                         s(1, 19, m + 1) = pbi(3)*s(1, 9, m + 1) - pci(3)*s(1, 9, m + 2) & ! [fyz2|o|s]
     397       11642 :                                           + orho*(s(1, 3, m + 1) - s(1, 3, m + 2))
     398             :                         s(1, 20, m + 1) = pbi(3)*s(1, 10, m + 1) - pci(3)*s(1, 10, m + 2) & ! [fz3 |o|s]
     399       23202 :                                           + 2._dp*orho*(s(1, 4, m + 1) - s(1, 4, m + 2))
     400             :                      END DO
     401             :                   ELSE
     402         492 :                      DO irx = 0, llr
     403        1722 :                         DO iry = 0, llr - irx
     404        1230 :                            irz = llr - irx - iry
     405        1230 :                            irr(1) = irx; irr(2) = iry; irr(3) = irz
     406        6150 :                            ixx = MAXLOC(irr)
     407        1230 :                            ix = ixx(1)
     408        1230 :                            ir = coset(irx, iry, irz)
     409        1230 :                            irm = irr
     410        1230 :                            irm(ix) = irm(ix) - 1
     411        1230 :                            aai = REAL(MAX(irm(ix), 0), dp)
     412        1230 :                            ir1 = coset(irm(1), irm(2), irm(3))
     413        1230 :                            irm(ix) = irm(ix) - 1
     414        1230 :                            ir2 = coset(irm(1), irm(2), irm(3))
     415        2870 :                            DO m = 0, lb_max - llr
     416             :                               s(1, ir, m + 1) = pbi(ix)*s(1, ir1, m + 1) - pci(ix)*s(1, ir1, m + 2) &
     417        2460 :                                                 + aai*orho*(s(1, ir2, m + 1) - s(1, ir2, m + 2))
     418             :                            END DO
     419             :                         END DO
     420             :                      END DO
     421             :                   END IF
     422             :                END DO
     423             : 
     424             :             END IF
     425             : 
     426             : !       *** Store the primitive three-center overlap integrals ***
     427   311192419 :             DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     428  1722266346 :                DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     429  1663944195 :                   vab(na + i, nb + j) = vab(na + i, nb + j) + s(i, j, 1)
     430             :                END DO
     431             :             END DO
     432             : 
     433             : !       *** Calculate the requested derivatives with respect  ***
     434             : !       *** to the nuclear coordinates of the atomic center a ***
     435             : 
     436    74539500 :             DO da = 0, da_max - 1
     437    16217349 :                ftz = 2.0_dp*zeta(ipgf)
     438    90756849 :                DO dax = 0, da
     439    48652047 :                   DO day = 0, da - dax
     440    16217349 :                      daz = da - dax - day
     441    16217349 :                      cda = coset(dax, day, daz)
     442    16217349 :                      cdax = coset(dax + 1, day, daz)
     443    16217349 :                      cday = coset(dax, day + 1, daz)
     444    16217349 :                      cdaz = coset(dax, day, daz + 1)
     445             : 
     446             : !             *** [da/dAi|c|b] = 2*zeta*[a+1i|c|b] - Ni(a)[a-1i|c|b] ***
     447             : 
     448    63205888 :                      DO la = la_min_set, la_max - da - 1
     449    97594279 :                         DO ax = 0, la
     450    50605740 :                            fax = REAL(ax, dp)
     451   155473798 :                            DO ay = 0, la - ax
     452    74096868 :                               fay = REAL(ay, dp)
     453    74096868 :                               az = la - ax - ay
     454    74096868 :                               faz = REAL(az, dp)
     455    74096868 :                               coa = coset(ax, ay, az)
     456    74096868 :                               coamx = coset(ax - 1, ay, az)
     457    74096868 :                               coamy = coset(ax, ay - 1, az)
     458    74096868 :                               coamz = coset(ax, ay, az - 1)
     459    74096868 :                               coapx = coset(ax + 1, ay, az)
     460    74096868 :                               coapy = coset(ax, ay + 1, az)
     461    74096868 :                               coapz = coset(ax, ay, az + 1)
     462   557702069 :                               DO cob = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     463   432999461 :                                  fs(coa, cob, cdax) = ftz*s(coapx, cob, cda) - fax*s(coamx, cob, cda)
     464   432999461 :                                  fs(coa, cob, cday) = ftz*s(coapy, cob, cda) - fay*s(coamy, cob, cda)
     465   507096329 :                                  fs(coa, cob, cdaz) = ftz*s(coapz, cob, cda) - faz*s(coamz, cob, cda)
     466             :                               END DO
     467             :                            END DO
     468             :                         END DO
     469             :                      END DO
     470             :                   END DO
     471             : 
     472             :                END DO
     473             :             END DO
     474             : 
     475             :             ! DFPT for APTs
     476    58322151 :             IF (PRESENT(vab2_work)) THEN
     477       28512 :                DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     478       72090 :                   DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     479       43578 :                      vab2_work(na + i, nb + j, 1) = vab2_work(na + i, nb + j, 1) + fs(i, j, 2)
     480       43578 :                      vab2_work(na + i, nb + j, 2) = vab2_work(na + i, nb + j, 2) + fs(i, j, 3)
     481       62676 :                      vab2_work(na + i, nb + j, 3) = vab2_work(na + i, nb + j, 3) + fs(i, j, 4)
     482             :                   END DO
     483             :                END DO
     484             :             END IF
     485             : 
     486             : !       *** Calculate the force contribution for the atomic center a ***
     487             : 
     488    58322151 :             IF (calculate_force_a) THEN
     489    90437902 :                DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     490   523393785 :                   DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     491   432955883 :                      force_a(1) = force_a(1) + pab(na + i, nb + j)*fs(i, j, 2)
     492   432955883 :                      force_a(2) = force_a(2) + pab(na + i, nb + j)*fs(i, j, 3)
     493   507185850 :                      force_a(3) = force_a(3) + pab(na + i, nb + j)*fs(i, j, 4)
     494             :                   END DO
     495             :                END DO
     496             :             END IF
     497             : 
     498             : !       *** Calculate the requested derivatives with respect  ***
     499             : !       *** to the nuclear coordinates of the atomic center b ***
     500             : 
     501    74539500 :             DO db = 0, db_max - 1
     502    16217349 :                ftz = 2.0_dp*zetb(jpgf)
     503    90756849 :                DO dbx = 0, db
     504    48652047 :                   DO dby = 0, db - dbx
     505    16217349 :                      dbz = db - dbx - dby
     506    16217349 :                      cdb = coset(dbx, dby, dbz)
     507    16217349 :                      cdbx = coset(dbx + 1, dby, dbz)
     508    16217349 :                      cdby = coset(dbx, dby + 1, dbz)
     509    16217349 :                      cdbz = coset(dbx, dby, dbz + 1)
     510             : 
     511             : !             *** [a|c|db/dBi] = 2*zetb*[a|c|b+1i] - Ni(b)[a|c|b-1i] ***
     512             : 
     513    63254184 :                      DO lb = lb_min_set, lb_max - db - 1
     514    97741656 :                         DO bx = 0, lb
     515    50704821 :                            fbx = REAL(bx, dp)
     516   155773372 :                            DO by = 0, lb - bx
     517    74249065 :                               fby = REAL(by, dp)
     518    74249065 :                               bz = lb - bx - by
     519    74249065 :                               fbz = REAL(bz, dp)
     520    74249065 :                               cob = coset(bx, by, bz)
     521    74249065 :                               cobmx = coset(bx - 1, by, bz)
     522    74249065 :                               cobmy = coset(bx, by - 1, bz)
     523    74249065 :                               cobmz = coset(bx, by, bz - 1)
     524    74249065 :                               cobpx = coset(bx + 1, by, bz)
     525    74249065 :                               cobpy = coset(bx, by + 1, bz)
     526    74249065 :                               cobpz = coset(bx, by, bz + 1)
     527   557953347 :                               DO coa = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     528   432999461 :                                  fs(coa, cob, cdbx) = ftz*s(coa, cobpx, cdb) - fbx*s(coa, cobmx, cdb)
     529   432999461 :                                  fs(coa, cob, cdby) = ftz*s(coa, cobpy, cdb) - fby*s(coa, cobmy, cdb)
     530   507248526 :                                  fs(coa, cob, cdbz) = ftz*s(coa, cobpz, cdb) - fbz*s(coa, cobmz, cdb)
     531             :                               END DO
     532             :                            END DO
     533             :                         END DO
     534             :                      END DO
     535             : 
     536             :                   END DO
     537             :                END DO
     538             :             END DO
     539             : 
     540             :             ! DFPT for APTs
     541    58322151 :             IF (PRESENT(vab2_work)) THEN
     542       28512 :                DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     543       72090 :                   DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     544       43578 :                      vab2_work(na + i, nb + j, 4) = vab2_work(na + i, nb + j, 4) + fs(i, j, 2)
     545       43578 :                      vab2_work(na + i, nb + j, 5) = vab2_work(na + i, nb + j, 5) + fs(i, j, 3)
     546       62676 :                      vab2_work(na + i, nb + j, 6) = vab2_work(na + i, nb + j, 6) + fs(i, j, 4)
     547             :                   END DO
     548             :                END DO
     549             : 
     550        9414 :                CPASSERT(PRESENT(iatom) .AND. PRESENT(jatom) .AND. PRESENT(katom))
     551        9414 :                CPASSERT(PRESENT(deltaR))
     552       37656 :                DO idir = 1, 3
     553       94950 :                   DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     554      216270 :                      DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     555             :                         vab2(na + i, nb + j, idir) = vab2(na + i, nb + j, idir) &
     556             :                                                      + vab2_work(na + i, nb + j, idir)*deltaR(idir, iatom) &
     557             :                                                      - vab2_work(na + i, nb + j, idir)*deltaR(idir, katom) &
     558             :                                                      + vab2_work(na + i, nb + j, idir + 3)*deltaR(idir, jatom) &
     559      188028 :                                                      - vab2_work(na + i, nb + j, idir + 3)*deltaR(idir, katom)
     560             :                      END DO
     561             :                   END DO
     562             :                END DO
     563             :             END IF
     564             : 
     565             : !       *** Calculate the force contribution for the atomic center b ***
     566             : 
     567    58322151 :             IF (calculate_force_b) THEN
     568    90437902 :                DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set)
     569   523393785 :                   DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     570   432955883 :                      force_b(1) = force_b(1) + pab(na + i, nb + j)*fs(i, j, 2)
     571   432955883 :                      force_b(2) = force_b(2) + pab(na + i, nb + j)*fs(i, j, 3)
     572   507185850 :                      force_b(3) = force_b(3) + pab(na + i, nb + j)*fs(i, j, 4)
     573             :                   END DO
     574             :                END DO
     575             :             END IF
     576             : 
     577   103040259 :             nb = nb + ncoset(lb_max_set)
     578             : 
     579             :          END DO
     580             : 
     581    79663256 :          na = na + ncoset(la_max_set)
     582             : 
     583             :       END DO
     584             : 
     585    34945148 :       DEALLOCATE (iiap)
     586             : 
     587    34945148 :    END SUBROUTINE os_3center
     588             : ! **************************************************************************************************
     589             : !> \brief   Calculation of two-center integrals <a|c> over
     590             : !>          Cartesian Gaussian functions and a spherical potential
     591             : !>
     592             : !> \param la_max_set ...
     593             : !> \param la_min_set ...
     594             : !> \param npgfa ...
     595             : !> \param rpgfa ...
     596             : !> \param zeta ...
     597             : !> \param auxint ...
     598             : !> \param rpgfc ...
     599             : !> \param rac ...
     600             : !> \param dac ...
     601             : !> \param va ...
     602             : !> \param dva ...
     603             : !> \date    December 2017
     604             : !> \author  Juerg Hutter
     605             : !> \version 1.0
     606             : ! **************************************************************************************************
     607         328 :    SUBROUTINE os_2center(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
     608         656 :                          auxint, rpgfc, rac, dac, va, dva)
     609             :       INTEGER, INTENT(IN)                                :: la_max_set, la_min_set, npgfa
     610             :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: rpgfa, zeta
     611             :       REAL(KIND=dp), DIMENSION(0:, :), INTENT(IN)        :: auxint
     612             :       REAL(KIND=dp), INTENT(IN)                          :: rpgfc
     613             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rac
     614             :       REAL(KIND=dp), INTENT(IN)                          :: dac
     615             :       REAL(KIND=dp), DIMENSION(:), INTENT(INOUT)         :: va
     616             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT), &
     617             :          OPTIONAL                                        :: dva
     618             : 
     619             :       INTEGER :: ax, ay, az, coa, coamx, coamy, coamz, coapx, coapy, coapz, da_max, i, ipgf, ir, &
     620             :          ir1, ir2, irm(3), irr(3), irx, iry, irz, ix, ixx(1), la, la_max, la_min, llr, m, mmax, na
     621             :       REAL(KIND=dp)                                      :: aai, fax, fay, faz, ftz, orho, s1
     622         328 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: s
     623             : 
     624         328 :       IF (PRESENT(dva)) THEN
     625             :          da_max = 1
     626             :       ELSE
     627         164 :          da_max = 0
     628             :       END IF
     629             : 
     630         328 :       la_max = la_max_set + da_max
     631         328 :       la_min = MAX(0, la_min_set - da_max)
     632             : 
     633         328 :       mmax = la_max
     634             : 
     635        1312 :       ALLOCATE (s(ncoset(mmax), mmax + 1))
     636         328 :       na = 0
     637         656 :       DO ipgf = 1, npgfa
     638         328 :          IF (rpgfa(ipgf) + rpgfc < dac) THEN
     639           0 :             na = na + ncoset(la_max_set)
     640           0 :             CYCLE
     641             :          END IF
     642        1260 :          s(1, 1:mmax + 1) = auxint(0:mmax, ipgf)
     643         328 :          IF (la_max > 0) THEN
     644             :             ! Recurrence steps: [s|c] -> [a|c]
     645             :             ! [a|c](m) = (Ci - Ai)*[a-1i|c](m+1) +
     646             :             !             Ni(a-1i)/2a*[a-2i|c](m) -
     647             :             !             Ni(a-1i)/2a*[a-2i|c](m+1)
     648             :             !
     649             : 
     650         268 :             orho = 0.5_dp/zeta(ipgf)
     651             : 
     652         872 :             DO llr = 1, mmax
     653         872 :                IF (llr == 1) THEN
     654         872 :                   DO m = 0, mmax - llr
     655         604 :                      s1 = s(1, m + 2)
     656         604 :                      s(2, m + 1) = -rac(1)*s1 ! [px|o]
     657         604 :                      s(3, m + 1) = -rac(2)*s1 ! [py|o]
     658         872 :                      s(4, m + 1) = -rac(3)*s1 ! [pz|o]
     659             :                   END DO
     660         336 :                ELSE IF (llr == 2) THEN
     661         544 :                   DO m = 0, mmax - llr
     662         336 :                      s1 = s(1, m + 1) - s(1, m + 2)
     663         336 :                      s(5, m + 1) = -rac(1)*s(2, m + 2) + orho*s1 ! [dx2|o]
     664         336 :                      s(6, m + 1) = -rac(1)*s(3, m + 2) ! [dxy|o]
     665         336 :                      s(7, m + 1) = -rac(1)*s(4, m + 2) ! [dxz|o]
     666         336 :                      s(8, m + 1) = -rac(2)*s(3, m + 2) + orho*s1 ! [dy2|o]
     667         336 :                      s(9, m + 1) = -rac(2)*s(4, m + 2) ! [dyz|o]
     668         544 :                      s(10, m + 1) = -rac(3)*s(4, m + 2) + orho*s1 ! [dz2|o]
     669             :                   END DO
     670         128 :                ELSE IF (llr == 3) THEN
     671         244 :                   DO m = 0, mmax - llr
     672         128 :                      s(11, m + 1) = -rac(1)*s(5, m + 2) + 2._dp*orho*(s(2, m + 1) - s(2, m + 2)) ! [fx3 |o]
     673         128 :                      s(12, m + 1) = -rac(1)*s(6, m + 2) + orho*(s(3, m + 1) - s(3, m + 2)) ! [fx2y|o]
     674         128 :                      s(13, m + 1) = -rac(1)*s(7, m + 2) + orho*(s(4, m + 1) - s(4, m + 2)) ! [fx2z|o]
     675         128 :                      s(14, m + 1) = -rac(2)*s(6, m + 2) + orho*(s(2, m + 1) - s(2, m + 2)) ! [fxy2|o]
     676         128 :                      s(15, m + 1) = -rac(1)*s(9, m + 2) ! [fxyz|o]
     677         128 :                      s(16, m + 1) = -rac(3)*s(7, m + 2) + orho*(s(2, m + 1) - s(2, m + 2)) ! [fxz2|o]
     678         128 :                      s(17, m + 1) = -rac(2)*s(8, m + 2) + 2._dp*orho*(s(3, m + 1) - s(3, m + 2)) ! [fy3 |o]
     679         128 :                      s(18, m + 1) = -rac(2)*s(9, m + 2) + orho*(s(4, m + 1) - s(4, m + 2)) ! [fy2z|o]
     680         128 :                      s(19, m + 1) = -rac(3)*s(9, m + 2) + orho*(s(3, m + 1) - s(3, m + 2)) ! [fyz2|o]
     681         244 :                      s(20, m + 1) = -rac(3)*s(10, m + 2) + 2._dp*orho*(s(4, m + 1) - s(4, m + 2)) ! [fz3 |o]
     682             :                   END DO
     683          12 :                ELSE IF (llr == 4) THEN
     684          24 :                   DO m = 0, mmax - llr
     685          12 :                      s(21, m + 1) = -rac(1)*s(11, m + 2) + 3._dp*orho*(s(5, m + 1) - s(5, m + 2)) ! [gx4  |s]
     686          12 :                      s(22, m + 1) = -rac(1)*s(12, m + 2) + 2._dp*orho*(s(6, m + 1) - s(6, m + 2)) ! [gx3y |s]
     687          12 :                      s(23, m + 1) = -rac(1)*s(13, m + 2) + 2._dp*orho*(s(7, m + 1) - s(7, m + 2)) ! [gx3z |s]
     688          12 :                      s(24, m + 1) = -rac(1)*s(14, m + 2) + orho*(s(8, m + 1) - s(8, m + 2)) ! [gx2y2|s]
     689          12 :                      s(25, m + 1) = -rac(1)*s(15, m + 2) + orho*(s(9, m + 1) - s(9, m + 2)) ! [gx2yz|s]
     690          12 :                      s(26, m + 1) = -rac(1)*s(16, m + 2) + orho*(s(10, m + 1) - s(10, m + 2)) ! [gx2z2|s]
     691          12 :                      s(27, m + 1) = -rac(1)*s(17, m + 2) ! [gxy3 |s]
     692          12 :                      s(28, m + 1) = -rac(1)*s(18, m + 2) ! [gxy2z|s]
     693          12 :                      s(29, m + 1) = -rac(1)*s(19, m + 2) ! [gxyz2|s]
     694          12 :                      s(30, m + 1) = -rac(1)*s(20, m + 2) ! [gxz3 |s]
     695          12 :                      s(31, m + 1) = -rac(2)*s(17, m + 2) + 3._dp*orho*(s(8, m + 1) - s(8, m + 2)) ! [gy4  |s]
     696          12 :                      s(32, m + 1) = -rac(2)*s(18, m + 2) + 2._dp*orho*(s(9, m + 1) - s(9, m + 2)) ! [gy3z |s]
     697          12 :                      s(33, m + 1) = -rac(2)*s(19, m + 2) + orho*(s(10, m + 1) - s(10, m + 2)) ! [gy2z2|s]
     698          12 :                      s(34, m + 1) = -rac(2)*s(20, m + 2) ! [gyz3 |s]
     699          24 :                      s(35, m + 1) = -rac(3)*s(20, m + 2) + 3._dp*orho*(s(10, m + 1) - s(10, m + 2)) ! [gz4  |s]
     700             :                   END DO
     701             :                ELSE
     702           0 :                   DO irx = 0, llr
     703           0 :                      DO iry = 0, llr - irx
     704           0 :                         irz = llr - irx - iry
     705           0 :                         irr(1) = irx; irr(2) = iry; irr(3) = irz
     706           0 :                         ixx = MAXLOC(irr)
     707           0 :                         ix = ixx(1)
     708           0 :                         ir = coset(irx, iry, irz)
     709           0 :                         irm = irr
     710           0 :                         irm(ix) = irm(ix) - 1
     711           0 :                         aai = REAL(MAX(irm(ix), 0), dp)*orho
     712           0 :                         ir1 = coset(irm(1), irm(2), irm(3))
     713           0 :                         irm(ix) = irm(ix) - 1
     714           0 :                         ir2 = coset(irm(1), irm(2), irm(3))
     715           0 :                         DO m = 0, mmax - llr
     716           0 :                            s(ir, m + 1) = -rac(ix)*s(ir1, m + 2) + aai*(s(ir2, m + 1) - s(ir2, m + 2))
     717             :                         END DO
     718             :                      END DO
     719             :                   END DO
     720             :                END IF
     721             :             END DO
     722             : 
     723             :          END IF
     724             : 
     725             :          ! Store the primitive three-center overlap integrals
     726        2404 :          DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set)
     727        2404 :             va(na + i) = va(na + i) + s(i, 1)
     728             :          END DO
     729             : 
     730             :          ! Calculate the requested derivatives with respect  ***
     731             :          ! to the nuclear coordinates of the atomic center a ***
     732             :          ! [da/dAi|c] = 2*zeta*[a+1i|c] - Ni(a)[a-1i|c] ***
     733         328 :          IF (PRESENT(dva)) THEN
     734         164 :             ftz = 2.0_dp*zeta(ipgf)
     735         450 :             DO la = la_min_set, la_max_set
     736        1048 :                DO ax = 0, la
     737         598 :                   fax = REAL(ax, dp)
     738        1922 :                   DO ay = 0, la - ax
     739        1038 :                      fay = REAL(ay, dp)
     740        1038 :                      az = la - ax - ay
     741        1038 :                      faz = REAL(az, dp)
     742        1038 :                      coa = coset(ax, ay, az)
     743        1038 :                      coamx = coset(ax - 1, ay, az)
     744        1038 :                      coamy = coset(ax, ay - 1, az)
     745        1038 :                      coamz = coset(ax, ay, az - 1)
     746        1038 :                      coapx = coset(ax + 1, ay, az)
     747        1038 :                      coapy = coset(ax, ay + 1, az)
     748        1038 :                      coapz = coset(ax, ay, az + 1)
     749        1038 :                      dva(na + coa, 1) = dva(na + coa, 1) + ftz*s(coapx, 1) - fax*s(coamx, 1)
     750        1038 :                      dva(na + coa, 2) = dva(na + coa, 2) + ftz*s(coapy, 1) - fay*s(coamy, 1)
     751        1636 :                      dva(na + coa, 3) = dva(na + coa, 3) + ftz*s(coapz, 1) - faz*s(coamz, 1)
     752             :                   END DO
     753             :                END DO
     754             :             END DO
     755             :          END IF
     756             : 
     757         656 :          na = na + ncoset(la_max_set)
     758             : 
     759             :       END DO
     760             : 
     761         328 :       DEALLOCATE (s)
     762             : 
     763         328 :    END SUBROUTINE os_2center
     764             : ! **************************************************************************************************
     765             : 
     766             : END MODULE ai_oneelectron

Generated by: LCOV version 1.15