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

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Interface to the Libint-Library
      10              : !> \par History
      11              : !>      11.2006 created [Manuel Guidon]
      12              : !>      11.2019 Fixed potential_id initial values (A. Bussy)
      13              : !> \author Manuel Guidon
      14              : ! **************************************************************************************************
      15              : MODULE hfx_libint_interface
      16              : 
      17              :    USE cell_types,                      ONLY: cell_type,&
      18              :                                               real_to_scaled
      19              :    USE gamma,                           ONLY: fgamma => fgamma_0
      20              :    USE hfx_contraction_methods,         ONLY: contract
      21              :    USE hfx_types,                       ONLY: hfx_pgf_product_list,&
      22              :                                               hfx_potential_type
      23              :    USE input_constants,                 ONLY: &
      24              :         do_potential_coulomb, do_potential_gaussian, do_potential_id, do_potential_long, &
      25              :         do_potential_mix_cl, do_potential_mix_cl_trunc, do_potential_mix_lg, do_potential_short, &
      26              :         do_potential_truncated
      27              :    USE kinds,                           ONLY: dp,&
      28              :                                               int_8
      29              :    USE libint_wrapper,                  ONLY: cp_libint_get_derivs,&
      30              :                                               cp_libint_get_eris,&
      31              :                                               cp_libint_set_params_eri,&
      32              :                                               cp_libint_set_params_eri_deriv,&
      33              :                                               cp_libint_set_params_eri_screen,&
      34              :                                               cp_libint_t,&
      35              :                                               get_ssss_f_val,&
      36              :                                               prim_data_f_size
      37              :    USE mathconstants,                   ONLY: pi
      38              :    USE orbital_pointers,                ONLY: nco
      39              :    USE t_c_g0,                          ONLY: t_c_g0_n
      40              : #include "./base/base_uses.f90"
      41              : 
      42              :    IMPLICIT NONE
      43              :    PRIVATE
      44              :    PUBLIC :: evaluate_eri, &
      45              :              evaluate_deriv_eri, &
      46              :              evaluate_eri_screen
      47              : 
      48              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
      49              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm2 = [4, 5, 6, 1, 2, 3, 7, 8, 9, 10, 11, 12]
      50              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm3 = [1, 2, 3, 4, 5, 6, 10, 11, 12, 7, 8, 9]
      51              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm4 = [4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9]
      52              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm5 = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6]
      53              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm6 = [7, 8, 9, 10, 11, 12, 4, 5, 6, 1, 2, 3]
      54              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm7 = [10, 11, 12, 7, 8, 9, 1, 2, 3, 4, 5, 6]
      55              :    INTEGER, DIMENSION(12), PARAMETER :: full_perm8 = [10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3]
      56              : 
      57              : !***
      58              : 
      59              : CONTAINS
      60              : 
      61              : ! **************************************************************************************************
      62              : !> \brief Fill data structure used in libint
      63              : !> \param A ...
      64              : !> \param B ...
      65              : !> \param C ...
      66              : !> \param D ...
      67              : !> \param Zeta_A ...
      68              : !> \param Zeta_B ...
      69              : !> \param Zeta_C ...
      70              : !> \param Zeta_D ...
      71              : !> \param m_max ...
      72              : !> \param potential_parameter ...
      73              : !> \param libint ...
      74              : !> \param R11 ...
      75              : !> \param R22 ...
      76              : !> \par History
      77              : !>      03.2007 created [Manuel Guidon]
      78              : !> \author Manuel Guidon
      79              : ! **************************************************************************************************
      80     96382482 :    SUBROUTINE build_quartet_data_screen(A, B, C, D, Zeta_A, Zeta_B, Zeta_C, Zeta_D, m_max, &
      81              :                                         potential_parameter, libint, R11, R22)
      82              : 
      83              :       REAL(KIND=dp)                                      :: A(3), B(3), C(3), D(3)
      84              :       REAL(KIND=dp), INTENT(IN)                          :: Zeta_A, Zeta_B, Zeta_C, Zeta_D
      85              :       INTEGER, INTENT(IN)                                :: m_max
      86              :       TYPE(hfx_potential_type)                           :: potential_parameter
      87              :       TYPE(cp_libint_t)                                  :: libint
      88              :       REAL(dp)                                           :: R11, R22
      89              : 
      90              :       INTEGER                                            :: i
      91              :       LOGICAL                                            :: use_gamma
      92              :       REAL(KIND=dp) :: AB(3), AB2, CD(3), CD2, den, Eta, EtaInv, factor, G(3), num, omega2, &
      93              :          omega_corr, omega_corr2, P(3), PQ(3), PQ2, Q(3), R, R1, R2, Rho, RhoInv, S1234, ssss, T, &
      94              :          tmp, W(3), Zeta, ZetaInv, ZetapEtaInv
      95              :       REAL(KIND=dp), DIMENSION(prim_data_f_size)         :: F, Fm
      96              : 
      97     96382482 :       Zeta = Zeta_A + Zeta_B
      98     96382482 :       ZetaInv = 1.0_dp/Zeta
      99     96382482 :       Eta = Zeta_C + Zeta_D
     100     96382482 :       EtaInv = 1.0_dp/Eta
     101     96382482 :       ZetapEtaInv = Zeta + Eta
     102     96382482 :       ZetapEtaInv = 1.0_dp/ZetapEtaInv
     103     96382482 :       Rho = Zeta*Eta*ZetapEtaInv
     104     96382482 :       RhoInv = 1.0_dp/Rho
     105              : 
     106    385529928 :       DO i = 1, 3
     107    289147446 :          P(i) = (Zeta_A*A(i) + Zeta_B*B(i))*ZetaInv
     108    289147446 :          Q(i) = (Zeta_C*C(i) + Zeta_D*D(i))*EtaInv
     109    289147446 :          AB(i) = A(i) - B(i)
     110    289147446 :          CD(i) = C(i) - D(i)
     111    289147446 :          PQ(i) = P(i) - Q(i)
     112    385529928 :          W(i) = (Zeta*P(i) + Eta*Q(i))*ZetapEtaInv
     113              :       END DO
     114              : 
     115    385529928 :       AB2 = DOT_PRODUCT(AB, AB)
     116    385529928 :       CD2 = DOT_PRODUCT(CD, CD)
     117    385529928 :       PQ2 = DOT_PRODUCT(PQ, PQ)
     118              : 
     119     96382482 :       S1234 = EXP((-Zeta_A*Zeta_B*ZetaInv*AB2) + (-Zeta_C*Zeta_D*EtaInv*CD2))
     120     96382482 :       T = Rho*PQ2
     121              : 
     122    109708422 :       SELECT CASE (potential_parameter%potential_type)
     123              :       CASE (do_potential_truncated)
     124     13325940 :          R = potential_parameter%cutoff_radius*SQRT(rho)
     125     13325940 :          R1 = R11
     126     13325940 :          R2 = R22
     127     13325940 :          IF (PQ2 > (R1 + R2 + potential_parameter%cutoff_radius)**2) THEN
     128            0 :             RETURN
     129              :          END IF
     130     13325940 :          CALL t_c_g0_n(F(1), use_gamma, R, T, m_max)
     131     13325940 :          IF (use_gamma) CALL fgamma(m_max, T, F(1))
     132     13325940 :          factor = 2.0_dp*Pi*RhoInv
     133              :       CASE (do_potential_coulomb)
     134     74713134 :          CALL fgamma(m_max, T, F(1))
     135     74713134 :          factor = 2.0_dp*Pi*RhoInv
     136              :       CASE (do_potential_short)
     137      3091812 :          R = potential_parameter%cutoff_radius*SQRT(rho)
     138      3091812 :          R1 = R11
     139      3091812 :          R2 = R22
     140      3091812 :          IF (PQ2 > (R1 + R2 + potential_parameter%cutoff_radius)**2) THEN
     141              :             RETURN
     142              :          END IF
     143      3091812 :          CALL fgamma(m_max, T, F(1))
     144      3091812 :          omega2 = potential_parameter%omega**2
     145      3091812 :          omega_corr2 = omega2/(omega2 + Rho)
     146      3091812 :          omega_corr = SQRT(omega_corr2)
     147      3091812 :          T = T*omega_corr2
     148      3091812 :          CALL fgamma(m_max, T, Fm)
     149      3091812 :          tmp = -omega_corr
     150     11625504 :          DO i = 1, m_max + 1
     151      8533692 :             F(i) = F(i) + Fm(i)*tmp
     152     11625504 :             tmp = tmp*omega_corr2
     153              :          END DO
     154      3091812 :          factor = 2.0_dp*Pi*RhoInv
     155              :       CASE (do_potential_long)
     156      1007172 :          omega2 = potential_parameter%omega**2
     157      1007172 :          omega_corr2 = omega2/(omega2 + Rho)
     158      1007172 :          omega_corr = SQRT(omega_corr2)
     159      1007172 :          T = T*omega_corr2
     160      1007172 :          CALL fgamma(m_max, T, F(1))
     161      1007172 :          tmp = omega_corr
     162      3623880 :          DO i = 1, m_max + 1
     163      2616708 :             F(i) = F(i)*tmp
     164      3623880 :             tmp = tmp*omega_corr2
     165              :          END DO
     166      1007172 :          factor = 2.0_dp*Pi*RhoInv
     167              :       CASE (do_potential_mix_cl)
     168      2770026 :          CALL fgamma(m_max, T, F(1))
     169      2770026 :          omega2 = potential_parameter%omega**2
     170      2770026 :          omega_corr2 = omega2/(omega2 + Rho)
     171      2770026 :          omega_corr = SQRT(omega_corr2)
     172      2770026 :          T = T*omega_corr2
     173      2770026 :          CALL fgamma(m_max, T, Fm)
     174      2770026 :          tmp = omega_corr
     175      9537228 :          DO i = 1, m_max + 1
     176      6767202 :             F(i) = F(i)*potential_parameter%scale_coulomb + Fm(i)*tmp*potential_parameter%scale_longrange
     177      9537228 :             tmp = tmp*omega_corr2
     178              :          END DO
     179      2770026 :          factor = 2.0_dp*Pi*RhoInv
     180              :       CASE (do_potential_mix_cl_trunc)
     181              : 
     182              :          ! truncated
     183       959298 :          R = potential_parameter%cutoff_radius*SQRT(rho)
     184       959298 :          R1 = R11
     185       959298 :          R2 = R22
     186       959298 :          IF (PQ2 > (R1 + R2 + potential_parameter%cutoff_radius)**2) THEN
     187              :             RETURN
     188              :          END IF
     189       959298 :          CALL t_c_g0_n(F(1), use_gamma, R, T, m_max)
     190       959298 :          IF (use_gamma) CALL fgamma(m_max, T, F(1))
     191              : 
     192              :          ! Coulomb
     193       959298 :          CALL fgamma(m_max, T, Fm)
     194              : 
     195      3419052 :          DO i = 1, m_max + 1
     196              :             F(i) = F(i)*(potential_parameter%scale_coulomb + potential_parameter%scale_longrange) - &
     197      3419052 :                    Fm(i)*potential_parameter%scale_longrange
     198              :          END DO
     199              : 
     200              :          ! longrange
     201       959298 :          omega2 = potential_parameter%omega**2
     202       959298 :          omega_corr2 = omega2/(omega2 + Rho)
     203       959298 :          omega_corr = SQRT(omega_corr2)
     204       959298 :          T = T*omega_corr2
     205       959298 :          CALL fgamma(m_max, T, Fm)
     206       959298 :          tmp = omega_corr
     207      3419052 :          DO i = 1, m_max + 1
     208      2459754 :             F(i) = F(i) + Fm(i)*tmp*potential_parameter%scale_longrange
     209      3419052 :             tmp = tmp*omega_corr2
     210              :          END DO
     211       959298 :          factor = 2.0_dp*Pi*RhoInv
     212              : 
     213              :       CASE (do_potential_gaussian)
     214            0 :          omega2 = potential_parameter%omega**2
     215            0 :          T = -omega2*T/(Rho + omega2)
     216            0 :          tmp = 1.0_dp
     217            0 :          DO i = 1, m_max + 1
     218            0 :             F(i) = EXP(T)*tmp
     219            0 :             tmp = tmp*omega2/(Rho + omega2)
     220              :          END DO
     221            0 :          factor = (Pi/(Rho + omega2))**(1.5_dp)
     222              :       CASE (do_potential_mix_lg)
     223       272700 :          omega2 = potential_parameter%omega**2
     224       272700 :          omega_corr2 = omega2/(omega2 + Rho)
     225       272700 :          omega_corr = SQRT(omega_corr2)
     226       272700 :          T = T*omega_corr2
     227       272700 :          CALL fgamma(m_max, T, Fm)
     228       272700 :          tmp = omega_corr*2.0_dp*Pi*RhoInv*potential_parameter%scale_longrange
     229       981720 :          DO i = 1, m_max + 1
     230       709020 :             Fm(i) = Fm(i)*tmp
     231       981720 :             tmp = tmp*omega_corr2
     232              :          END DO
     233              :          T = Rho*PQ2
     234       272700 :          T = -omega2*T/(Rho + omega2)
     235       272700 :          tmp = (Pi/(Rho + omega2))**(1.5_dp)*potential_parameter%scale_gaussian
     236       981720 :          DO i = 1, m_max + 1
     237       709020 :             F(i) = EXP(T)*tmp + Fm(i)
     238       981720 :             tmp = tmp*omega2/(Rho + omega2)
     239              :          END DO
     240       242400 :          factor = 1.0_dp
     241              :       CASE (do_potential_id)
     242       242400 :          ssss = -Zeta_A*Zeta_B*ZetaInv*AB2
     243              : 
     244       242400 :          num = (Zeta_A + Zeta_B)*Zeta_C
     245       242400 :          den = Zeta_A + Zeta_B + Zeta_C
     246       969600 :          ssss = ssss - num/den*SUM((P - C)**2)
     247              : 
     248       969600 :          G(:) = (Zeta_A*A(:) + Zeta_B*B(:) + Zeta_C*C(:))/den
     249       242400 :          num = den*Zeta_D
     250       242400 :          den = den + Zeta_D
     251       969600 :          ssss = ssss - num/den*SUM((G - D)**2)
     252              : 
     253      5332800 :          F(:) = EXP(ssss)
     254       242400 :          factor = 1.0_dp
     255    110910120 :          IF (S1234 > EPSILON(0.0_dp)) factor = 1.0_dp/S1234
     256              :       END SELECT
     257              : 
     258     96382482 :       tmp = (Pi*ZetapEtaInv)**3
     259     96382482 :       factor = factor*S1234*SQRT(tmp)
     260              : 
     261    370948356 :       DO i = 1, m_max + 1
     262    370948356 :          F(i) = F(i)*factor
     263              :       END DO
     264              : 
     265     96382482 :       CALL cp_libint_set_params_eri_screen(libint, A, B, C, D, P, Q, W, ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
     266              : 
     267              :    END SUBROUTINE build_quartet_data_screen
     268              : 
     269              : ! **************************************************************************************************
     270              : !> \brief Fill data structure used in libderiv
     271              : !> \param libint ...
     272              : !> \param A ...
     273              : !> \param B ...
     274              : !> \param C ...
     275              : !> \param D ...
     276              : !> \param Zeta_A ...
     277              : !> \param Zeta_B ...
     278              : !> \param Zeta_C ...
     279              : !> \param Zeta_D ...
     280              : !> \param ZetaInv ...
     281              : !> \param EtaInv ...
     282              : !> \param ZetapEtaInv ...
     283              : !> \param Rho ...
     284              : !> \param RhoInv ...
     285              : !> \param P ...
     286              : !> \param Q ...
     287              : !> \param W ...
     288              : !> \param m_max ...
     289              : !> \param F ...
     290              : !> \par History
     291              : !>      03.2007 created [Manuel Guidon]
     292              : !> \author Manuel Guidon
     293              : ! **************************************************************************************************
     294    106214495 :    SUBROUTINE build_deriv_data(libint, A, B, C, D, &
     295              :                                Zeta_A, Zeta_B, Zeta_C, Zeta_D, &
     296              :                                ZetaInv, EtaInv, ZetapEtaInv, Rho, RhoInv, &
     297    106214495 :                                P, Q, W, m_max, F)
     298              : 
     299              :       TYPE(cp_libint_t)                                  :: libint
     300              :       REAL(KIND=dp), INTENT(IN)                          :: A(3), B(3), C(3), D(3)
     301              :       REAL(dp), INTENT(IN)                               :: Zeta_A, Zeta_B, Zeta_C, Zeta_D, ZetaInv, &
     302              :                                                             EtaInv, ZetapEtaInv, Rho, RhoInv, &
     303              :                                                             P(3), Q(3), W(3)
     304              :       INTEGER, INTENT(IN)                                :: m_max
     305              :       REAL(KIND=dp), DIMENSION(:)                        :: F
     306              : 
     307              :       MARK_USED(D) ! todo: fix
     308              :       MARK_USED(Zeta_C)
     309              :       MARK_USED(RhoInv)
     310              : 
     311              :       CALL cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, &
     312    106214495 :                                           ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
     313              : 
     314    106214495 :    END SUBROUTINE build_deriv_data
     315              : 
     316              : ! **************************************************************************************************
     317              : !> \brief Evaluates derivatives of electron repulsion integrals for a primitive quartet
     318              : !> \param deriv ...
     319              : !> \param nproducts ...
     320              : !> \param pgf_product_list ...
     321              : !> \param n_a ...
     322              : !> \param n_b ...
     323              : !> \param n_c ...
     324              : !> \param n_d ...
     325              : !> \param ncoa ...
     326              : !> \param ncob ...
     327              : !> \param ncoc ...
     328              : !> \param ncod ...
     329              : !> \param nsgfa ...
     330              : !> \param nsgfb ...
     331              : !> \param nsgfc ...
     332              : !> \param nsgfd ...
     333              : !> \param primitives ...
     334              : !> \param max_contraction ...
     335              : !> \param tmp_max_all ...
     336              : !> \param eps_schwarz ...
     337              : !> \param neris ...
     338              : !> \param Zeta_A ...
     339              : !> \param Zeta_B ...
     340              : !> \param Zeta_C ...
     341              : !> \param Zeta_D ...
     342              : !> \param ZetaInv ...
     343              : !> \param EtaInv ...
     344              : !> \param s_offset_a ...
     345              : !> \param s_offset_b ...
     346              : !> \param s_offset_c ...
     347              : !> \param s_offset_d ...
     348              : !> \param nl_a ...
     349              : !> \param nl_b ...
     350              : !> \param nl_c ...
     351              : !> \param nl_d ...
     352              : !> \param nsoa ...
     353              : !> \param nsob ...
     354              : !> \param nsoc ...
     355              : !> \param nsod ...
     356              : !> \param sphi_a ...
     357              : !> \param sphi_b ...
     358              : !> \param sphi_c ...
     359              : !> \param sphi_d ...
     360              : !> \param work ...
     361              : !> \param work2 ...
     362              : !> \param work_forces ...
     363              : !> \param buffer1 ...
     364              : !> \param buffer2 ...
     365              : !> \param primitives_tmp ...
     366              : !> \param use_virial ...
     367              : !> \param work_virial ...
     368              : !> \param work2_virial ...
     369              : !> \param primitives_tmp_virial ...
     370              : !> \param primitives_virial ...
     371              : !> \param cell ...
     372              : !> \param tmp_max_all_virial ...
     373              : !> \par History
     374              : !>      03.2007 created [Manuel Guidon]
     375              : !>      08.2007 refactured permutation part [Manuel Guidon]
     376              : !> \author Manuel Guidon
     377              : ! **************************************************************************************************
     378     34023121 :    SUBROUTINE evaluate_deriv_eri(deriv, nproducts, pgf_product_list, &
     379              :                                  n_a, n_b, n_c, n_d, &
     380              :                                  ncoa, ncob, ncoc, ncod, &
     381              :                                  nsgfa, nsgfb, nsgfc, nsgfd, &
     382     34023121 :                                  primitives, max_contraction, tmp_max_all, &
     383              :                                  eps_schwarz, neris, &
     384              :                                  Zeta_A, Zeta_B, Zeta_C, Zeta_D, ZetaInv, EtaInv, &
     385              :                                  s_offset_a, s_offset_b, s_offset_c, s_offset_d, &
     386              :                                  nl_a, nl_b, nl_c, nl_d, nsoa, nsob, nsoc, nsod, &
     387     34023121 :                                  sphi_a, sphi_b, sphi_c, sphi_d, &
     388     34023121 :                                  work, work2, work_forces, buffer1, buffer2, primitives_tmp, &
     389     34023121 :                                  use_virial, work_virial, work2_virial, primitives_tmp_virial, &
     390     34023121 :                                  primitives_virial, cell, tmp_max_all_virial)
     391              : 
     392              :       TYPE(cp_libint_t)                                  :: deriv
     393              :       INTEGER, INTENT(IN)                                :: nproducts
     394              :       TYPE(hfx_pgf_product_list), DIMENSION(nproducts)   :: pgf_product_list
     395              :       INTEGER, INTENT(IN)                                :: n_a, n_b, n_c, n_d, ncoa, ncob, ncoc, &
     396              :                                                             ncod, nsgfa, nsgfb, nsgfc, nsgfd
     397              :       REAL(dp), &
     398              :          DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd, 12)       :: primitives
     399              :       REAL(dp)                                           :: max_contraction, tmp_max_all, eps_schwarz
     400              :       INTEGER(int_8)                                     :: neris
     401              :       REAL(dp), INTENT(IN)                               :: Zeta_A, Zeta_B, Zeta_C, Zeta_D, ZetaInv, &
     402              :                                                             EtaInv
     403              :       INTEGER                                            :: s_offset_a, s_offset_b, s_offset_c, &
     404              :                                                             s_offset_d, nl_a, nl_b, nl_c, nl_d, &
     405              :                                                             nsoa, nsob, nsoc, nsod
     406              :       REAL(dp), DIMENSION(ncoa, nsoa*nl_a)               :: sphi_a
     407              :       REAL(dp), DIMENSION(ncob, nsob*nl_b)               :: sphi_b
     408              :       REAL(dp), DIMENSION(ncoc, nsoc*nl_c)               :: sphi_c
     409              :       REAL(dp), DIMENSION(ncod, nsod*nl_d)               :: sphi_d
     410              :       REAL(dp) :: work(ncoa*ncob*ncoc*ncod, 12), work2(ncoa, ncob, ncoc, ncod, 12), &
     411              :          work_forces(ncoa*ncob*ncoc*ncod, 12)
     412              :       REAL(dp), DIMENSION(ncoa*ncob*ncoc*ncod)           :: buffer1, buffer2
     413              :       REAL(dp), DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
     414              :          nl_c, nsod*nl_d)                                :: primitives_tmp
     415              :       LOGICAL, INTENT(IN)                                :: use_virial
     416              :       REAL(dp) :: work_virial(ncoa*ncob*ncoc*ncod, 12, 3), &
     417              :          work2_virial(ncoa, ncob, ncoc, ncod, 12, 3)
     418              :       REAL(dp), DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
     419              :          nl_c, nsod*nl_d)                                :: primitives_tmp_virial
     420              :       REAL(dp), &
     421              :          DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd, 12, 3)    :: primitives_virial
     422              :       TYPE(cell_type), POINTER                           :: cell
     423              :       REAL(dp)                                           :: tmp_max_all_virial
     424              : 
     425              :       INTEGER                                            :: a_mysize(1), i, j, k, l, m, m_max, &
     426              :                                                             mysize, n, p1, p2, p3, p4, perm_case
     427              :       LOGICAL                                            :: direct_contract
     428              :       REAL(dp)                                           :: A(3), AB(3), B(3), C(3), CD(3), D(3), &
     429              :                                                             P(3), Q(3), Rho, RhoInv, scoord(12), &
     430              :                                                             tmp_max, tmp_max_virial, W(3), &
     431              :                                                             ZetapEtaInv
     432              : 
     433     34023121 :       m_max = n_a + n_b + n_c + n_d
     434     34023121 :       m_max = m_max + 1
     435     34023121 :       mysize = ncoa*ncob*ncoc*ncod
     436     68046242 :       a_mysize = mysize
     437              : 
     438   4875120841 :       work = 0.0_dp
     439   9252283381 :       work2 = 0.0_dp
     440              : 
     441     34023121 :       IF (use_virial) THEN
     442    858372308 :          work_virial = 0.0_dp
     443   1480522004 :          work2_virial = 0.0_dp
     444              :       END IF
     445              : 
     446     34023121 :       perm_case = 1
     447     34023121 :       IF (n_a < n_b) THEN
     448      3455831 :          perm_case = perm_case + 1
     449              :       END IF
     450     34023121 :       IF (n_c < n_d) THEN
     451      5774825 :          perm_case = perm_case + 2
     452              :       END IF
     453     34023121 :       IF (n_a + n_b > n_c + n_d) THEN
     454      6474563 :          perm_case = perm_case + 4
     455              :       END IF
     456              : 
     457              :       SELECT CASE (perm_case)
     458              :       CASE (1)
     459     86051775 :          DO i = 1, nproducts
     460    259517456 :             A = pgf_product_list(i)%ra
     461    259517456 :             B = pgf_product_list(i)%rb
     462    259517456 :             C = pgf_product_list(i)%rc
     463    259517456 :             D = pgf_product_list(i)%rd
     464     64879364 :             Rho = pgf_product_list(i)%Rho
     465              :             RhoInv = pgf_product_list(i)%RhoInv
     466    259517456 :             P = pgf_product_list(i)%P
     467    259517456 :             Q = pgf_product_list(i)%Q
     468    259517456 :             W = pgf_product_list(i)%W
     469    259517456 :             AB = pgf_product_list(i)%AB
     470    259517456 :             CD = pgf_product_list(i)%CD
     471     64879364 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     472              : 
     473              :             CALL build_deriv_data(deriv, A, B, C, D, &
     474              :                                   Zeta_A, Zeta_B, Zeta_C, Zeta_D, &
     475              :                                   ZetaInv, EtaInv, ZetapEtaInv, Rho, RhoInv, &
     476     64879364 :                                   P, Q, W, m_max, pgf_product_list(i)%Fm)
     477     64879364 :             CALL cp_libint_get_derivs(n_d, n_c, n_b, n_a, deriv, work_forces, a_mysize)
     478    259517456 :             DO k = 4, 6
     479   1999320179 :                DO j = 1, mysize
     480              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     481              :                                                work_forces(j, k + 3) + &
     482   1934440815 :                                                work_forces(j, k + 6))
     483              :                END DO
     484              :             END DO
     485    843431732 :             DO k = 1, 12
     486   7802642624 :                DO j = 1, mysize
     487   7737763260 :                   work(j, k) = work(j, k) + work_forces(j, k)
     488              :                END DO
     489              :             END DO
     490     64879364 :             neris = neris + 12*mysize
     491     86051775 :             IF (use_virial) THEN
     492     13737793 :                CALL real_to_scaled(scoord(1:3), A, cell)
     493     13737793 :                CALL real_to_scaled(scoord(4:6), B, cell)
     494     13737793 :                CALL real_to_scaled(scoord(7:9), C, cell)
     495     13737793 :                CALL real_to_scaled(scoord(10:12), D, cell)
     496    178591309 :                DO k = 1, 12
     497   1426369861 :                   DO j = 1, mysize
     498   5155967724 :                      DO m = 1, 3
     499   4991114208 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     500              :                      END DO
     501              :                   END DO
     502              :                END DO
     503              :             END IF
     504              :          END DO
     505              : 
     506    275241343 :          DO n = 1, 12
     507              :             tmp_max = 0.0_dp
     508   2347467036 :             DO i = 1, mysize
     509   2347467036 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     510              :             END DO
     511    254068932 :             tmp_max = tmp_max*max_contraction
     512    254068932 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     513              : 
     514    634167859 :             DO i = 1, ncoa
     515    358926516 :                p1 = (i - 1)*ncob
     516   1012052748 :                DO j = 1, ncob
     517    399057300 :                   p2 = (p1 + j - 1)*ncoc
     518   1864762248 :                   DO k = 1, ncoc
     519   1106778432 :                      p3 = (p2 + k - 1)*ncod
     520   3599233836 :                      DO l = 1, ncod
     521   2093398104 :                         p4 = p3 + l
     522   3200176536 :                         work2(i, j, k, l, full_perm1(n)) = work(p4, n)
     523              :                      END DO
     524              :                   END DO
     525              :                END DO
     526              :             END DO
     527              :          END DO
     528     21172411 :          IF (use_virial) THEN
     529      6339801 :             DO n = 1, 12
     530              :                tmp_max_virial = 0.0_dp
     531    114225456 :                DO i = 1, mysize
     532              :                   tmp_max_virial = MAX(tmp_max_virial, &
     533    114225456 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
     534              :                END DO
     535      5852124 :                tmp_max_virial = tmp_max_virial*max_contraction
     536      5852124 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
     537              : 
     538     16801569 :                DO i = 1, ncoa
     539     10461768 :                   p1 = (i - 1)*ncob
     540     30447876 :                   DO j = 1, ncob
     541     14133984 :                      p2 = (p1 + j - 1)*ncoc
     542     70588716 :                      DO k = 1, ncoc
     543     45992964 :                         p3 = (p2 + k - 1)*ncod
     544    168500280 :                         DO l = 1, ncod
     545    108373332 :                            p4 = p3 + l
     546    479486292 :                            work2_virial(i, j, k, l, full_perm1(n), 1:3) = work_virial(p4, n, 1:3)
     547              :                         END DO
     548              :                      END DO
     549              :                   END DO
     550              :                END DO
     551              :             END DO
     552              :          END IF
     553              :       CASE (2)
     554      6242248 :          DO i = 1, nproducts
     555     19496868 :             A = pgf_product_list(i)%ra
     556     19496868 :             B = pgf_product_list(i)%rb
     557     19496868 :             C = pgf_product_list(i)%rc
     558     19496868 :             D = pgf_product_list(i)%rd
     559      4874217 :             Rho = pgf_product_list(i)%Rho
     560              :             RhoInv = pgf_product_list(i)%RhoInv
     561     19496868 :             P = pgf_product_list(i)%P
     562     19496868 :             Q = pgf_product_list(i)%Q
     563     19496868 :             W = pgf_product_list(i)%W
     564     19496868 :             AB = pgf_product_list(i)%AB
     565     19496868 :             CD = pgf_product_list(i)%CD
     566      4874217 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     567              : 
     568              :             CALL build_deriv_data(deriv, B, A, C, D, &
     569              :                                   Zeta_B, Zeta_A, Zeta_C, Zeta_D, &
     570              :                                   ZetaInv, EtaInv, ZetapEtaInv, Rho, RhoInv, &
     571      4874217 :                                   P, Q, W, m_max, pgf_product_list(i)%Fm)
     572      4874217 :             CALL cp_libint_get_derivs(n_d, n_c, n_a, n_b, deriv, work_forces, a_mysize)
     573     19496868 :             DO k = 4, 6
     574    350195730 :                DO j = 1, mysize
     575              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     576              :                                                work_forces(j, k + 3) + &
     577    345321513 :                                                work_forces(j, k + 6))
     578              :                END DO
     579              :             END DO
     580     63364821 :             DO k = 1, 12
     581   1386160269 :                DO j = 1, mysize
     582   1381286052 :                   work(j, k) = work(j, k) + work_forces(j, k)
     583              :                END DO
     584              :             END DO
     585      4874217 :             neris = neris + 12*mysize
     586      6242248 :             IF (use_virial) THEN
     587       796892 :                CALL real_to_scaled(scoord(1:3), B, cell)
     588       796892 :                CALL real_to_scaled(scoord(4:6), A, cell)
     589       796892 :                CALL real_to_scaled(scoord(7:9), C, cell)
     590       796892 :                CALL real_to_scaled(scoord(10:12), D, cell)
     591     10359596 :                DO k = 1, 12
     592    208367660 :                   DO j = 1, mysize
     593    801594960 :                      DO m = 1, 3
     594    792032256 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     595              :                      END DO
     596              :                   END DO
     597              :                END DO
     598              :             END IF
     599              : 
     600              :          END DO
     601     17784403 :          DO n = 1, 12
     602              :             tmp_max = 0.0_dp
     603    442178724 :             DO i = 1, mysize
     604    442178724 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     605              :             END DO
     606     16416372 :             tmp_max = tmp_max*max_contraction
     607     16416372 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     608              : 
     609     70203499 :             DO j = 1, ncob
     610     52419096 :                p1 = (j - 1)*ncoa
     611    123152772 :                DO i = 1, ncoa
     612     54317304 :                   p2 = (p1 + i - 1)*ncoc
     613    304601256 :                   DO k = 1, ncoc
     614    197864856 :                      p3 = (p2 + k - 1)*ncod
     615    677944512 :                      DO l = 1, ncod
     616    425762352 :                         p4 = p3 + l
     617    623627208 :                         work2(i, j, k, l, full_perm2(n)) = work(p4, n)
     618              :                      END DO
     619              :                   END DO
     620              :                END DO
     621              :             END DO
     622              :          END DO
     623      1368031 :          IF (use_virial) THEN
     624      1290653 :             DO n = 1, 12
     625              :                tmp_max_virial = 0.0_dp
     626     34981980 :                DO i = 1, mysize
     627              :                   tmp_max_virial = MAX(tmp_max_virial, &
     628     34981980 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
     629              :                END DO
     630      1191372 :                tmp_max_virial = tmp_max_virial*max_contraction
     631      1191372 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
     632              : 
     633      5141141 :                DO j = 1, ncob
     634      3850488 :                   p1 = (j - 1)*ncoa
     635      9076668 :                   DO i = 1, ncoa
     636      4034808 :                      p2 = (p1 + i - 1)*ncoc
     637     22502016 :                      DO k = 1, ncoc
     638     14616720 :                         p3 = (p2 + k - 1)*ncod
     639     52442136 :                         DO l = 1, ncod
     640     33790608 :                            p4 = p3 + l
     641    149779152 :                            work2_virial(i, j, k, l, full_perm2(n), 1:3) = work_virial(p4, n, 1:3)
     642              :                         END DO
     643              :                      END DO
     644              :                   END DO
     645              :                END DO
     646              :             END DO
     647              :          END IF
     648              :       CASE (3)
     649     17975483 :          DO i = 1, nproducts
     650     54892024 :             A = pgf_product_list(i)%ra
     651     54892024 :             B = pgf_product_list(i)%rb
     652     54892024 :             C = pgf_product_list(i)%rc
     653     54892024 :             D = pgf_product_list(i)%rd
     654     13723006 :             Rho = pgf_product_list(i)%Rho
     655              :             RhoInv = pgf_product_list(i)%RhoInv
     656     54892024 :             P = pgf_product_list(i)%P
     657     54892024 :             Q = pgf_product_list(i)%Q
     658     54892024 :             W = pgf_product_list(i)%W
     659     54892024 :             AB = pgf_product_list(i)%AB
     660     54892024 :             CD = pgf_product_list(i)%CD
     661     13723006 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     662              : 
     663              :             CALL build_deriv_data(deriv, A, B, D, C, &
     664              :                                   Zeta_A, Zeta_B, Zeta_D, Zeta_C, &
     665              :                                   ZetaInv, EtaInv, ZetapEtaInv, Rho, RhoInv, &
     666     13723006 :                                   P, Q, W, m_max, pgf_product_list(i)%Fm)
     667     13723006 :             CALL cp_libint_get_derivs(n_c, n_d, n_b, n_a, deriv, work_forces, a_mysize)
     668     54892024 :             DO k = 4, 6
     669    488335975 :                DO j = 1, mysize
     670              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     671              :                                                work_forces(j, k + 3) + &
     672    474612969 :                                                work_forces(j, k + 6))
     673              :                END DO
     674              :             END DO
     675    178399078 :             DO k = 1, 12
     676   1912174882 :                DO j = 1, mysize
     677   1898451876 :                   work(j, k) = work(j, k) + work_forces(j, k)
     678              :                END DO
     679              :             END DO
     680     13723006 :             neris = neris + 12*mysize
     681     17975483 :             IF (use_virial) THEN
     682      2206592 :                CALL real_to_scaled(scoord(1:3), A, cell)
     683      2206592 :                CALL real_to_scaled(scoord(4:6), B, cell)
     684      2206592 :                CALL real_to_scaled(scoord(7:9), D, cell)
     685      2206592 :                CALL real_to_scaled(scoord(10:12), C, cell)
     686     28685696 :                DO k = 1, 12
     687    233705804 :                   DO j = 1, mysize
     688    846559536 :                      DO m = 1, 3
     689    820080432 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     690              :                      END DO
     691              :                   END DO
     692              :                END DO
     693              :             END IF
     694              : 
     695              :          END DO
     696     55282201 :          DO n = 1, 12
     697              :             tmp_max = 0.0_dp
     698    627248244 :             DO i = 1, mysize
     699    627248244 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     700              :             END DO
     701     51029724 :             tmp_max = tmp_max*max_contraction
     702     51029724 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     703              : 
     704    145043641 :             DO i = 1, ncoa
     705     89761440 :                p1 = (i - 1)*ncob
     706    239793948 :                DO j = 1, ncob
     707     99002784 :                   p2 = (p1 + j - 1)*ncod
     708    578537304 :                   DO l = 1, ncod
     709    389773080 :                      p3 = (p2 + l - 1)*ncoc
     710   1064994384 :                      DO k = 1, ncoc
     711    576218520 :                         p4 = p3 + k
     712    965991600 :                         work2(i, j, k, l, full_perm3(n)) = work(p4, n)
     713              :                      END DO
     714              :                   END DO
     715              :                END DO
     716              :             END DO
     717              :          END DO
     718      4252477 :          IF (use_virial) THEN
     719      1864213 :             DO n = 1, 12
     720              :                tmp_max_virial = 0.0_dp
     721     32257128 :                DO i = 1, mysize
     722              :                   tmp_max_virial = MAX(tmp_max_virial, &
     723     32257128 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
     724              :                END DO
     725      1720812 :                tmp_max_virial = tmp_max_virial*max_contraction
     726      1720812 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
     727              : 
     728      5377297 :                DO i = 1, ncoa
     729      3513084 :                   p1 = (i - 1)*ncob
     730      9518388 :                   DO j = 1, ncob
     731      4284492 :                      p2 = (p1 + j - 1)*ncod
     732     26087412 :                      DO l = 1, ncod
     733     18289836 :                         p3 = (p2 + l - 1)*ncoc
     734     53110644 :                         DO k = 1, ncoc
     735     30536316 :                            p4 = p3 + k
     736    140435100 :                            work2_virial(i, j, k, l, full_perm3(n), 1:3) = work_virial(p4, n, 1:3)
     737              :                         END DO
     738              :                      END DO
     739              :                   END DO
     740              :                END DO
     741              :             END DO
     742              :          END IF
     743              :       CASE (4)
     744      3173155 :          DO i = 1, nproducts
     745      9670064 :             A = pgf_product_list(i)%ra
     746      9670064 :             B = pgf_product_list(i)%rb
     747      9670064 :             C = pgf_product_list(i)%rc
     748      9670064 :             D = pgf_product_list(i)%rd
     749      2417516 :             Rho = pgf_product_list(i)%Rho
     750              :             RhoInv = pgf_product_list(i)%RhoInv
     751      9670064 :             P = pgf_product_list(i)%P
     752      9670064 :             Q = pgf_product_list(i)%Q
     753      9670064 :             W = pgf_product_list(i)%W
     754      9670064 :             AB = pgf_product_list(i)%AB
     755      9670064 :             CD = pgf_product_list(i)%CD
     756      2417516 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     757              :             CALL build_deriv_data(deriv, B, A, D, C, &
     758              :                                   Zeta_B, Zeta_A, Zeta_D, Zeta_C, &
     759              :                                   ZetaInv, EtaInv, ZetapEtaInv, Rho, RhoInv, &
     760      2417516 :                                   P, Q, W, m_max, pgf_product_list(i)%Fm)
     761      2417516 :             CALL cp_libint_get_derivs(n_c, n_d, n_a, n_b, deriv, work_forces, a_mysize)
     762      9670064 :             DO k = 4, 6
     763    133711466 :                DO j = 1, mysize
     764              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     765              :                                                work_forces(j, k + 3) + &
     766    131293950 :                                                work_forces(j, k + 6))
     767              :                END DO
     768              :             END DO
     769     31427708 :             DO k = 1, 12
     770    527593316 :                DO j = 1, mysize
     771    525175800 :                   work(j, k) = work(j, k) + work_forces(j, k)
     772              :                END DO
     773              :             END DO
     774      2417516 :             neris = neris + 12*mysize
     775      3173155 :             IF (use_virial) THEN
     776       390264 :                CALL real_to_scaled(scoord(1:3), B, cell)
     777       390264 :                CALL real_to_scaled(scoord(4:6), A, cell)
     778       390264 :                CALL real_to_scaled(scoord(7:9), D, cell)
     779       390264 :                CALL real_to_scaled(scoord(10:12), C, cell)
     780      5073432 :                DO k = 1, 12
     781     67099776 :                   DO j = 1, mysize
     782    252788544 :                      DO m = 1, 3
     783    248105376 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     784              :                      END DO
     785              :                   END DO
     786              :                END DO
     787              :             END IF
     788              : 
     789              :          END DO
     790      9823307 :          DO n = 1, 12
     791              :             tmp_max = 0.0_dp
     792    192620904 :             DO i = 1, mysize
     793    192620904 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     794              :             END DO
     795      9067668 :             tmp_max = tmp_max*max_contraction
     796      9067668 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     797              : 
     798     38403383 :             DO j = 1, ncob
     799     28580076 :                p1 = (j - 1)*ncoa
     800     67785900 :                DO i = 1, ncoa
     801     30138156 :                   p2 = (p1 + i - 1)*ncod
     802    177169932 :                   DO l = 1, ncod
     803    118451700 :                      p3 = (p2 + l - 1)*ncoc
     804    332143092 :                      DO k = 1, ncoc
     805    183553236 :                         p4 = p3 + k
     806    302004936 :                         work2(i, j, k, l, full_perm4(n)) = work(p4, n)
     807              :                      END DO
     808              :                   END DO
     809              :                END DO
     810              :             END DO
     811              :          END DO
     812       755639 :          IF (use_virial) THEN
     813       671112 :             DO n = 1, 12
     814              :                tmp_max_virial = 0.0_dp
     815     14514984 :                DO i = 1, mysize
     816              :                   tmp_max_virial = MAX(tmp_max_virial, &
     817     14514984 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
     818              :                END DO
     819       619488 :                tmp_max_virial = tmp_max_virial*max_contraction
     820       619488 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
     821              : 
     822      2640168 :                DO j = 1, ncob
     823      1969056 :                   p1 = (j - 1)*ncoa
     824      4705056 :                   DO i = 1, ncoa
     825      2116512 :                      p2 = (p1 + i - 1)*ncod
     826     12508056 :                      DO l = 1, ncod
     827      8422488 :                         p3 = (p2 + l - 1)*ncoc
     828     24434496 :                         DO k = 1, ncoc
     829     13895496 :                            p4 = p3 + k
     830     64004472 :                            work2_virial(i, j, k, l, full_perm4(n), 1:3) = work_virial(p4, n, 1:3)
     831              :                         END DO
     832              :                      END DO
     833              :                   END DO
     834              :                END DO
     835              :             END DO
     836              :          END IF
     837              :       CASE (5)
     838     18697627 :          DO i = 1, nproducts
     839     56833804 :             A = pgf_product_list(i)%ra
     840     56833804 :             B = pgf_product_list(i)%rb
     841     56833804 :             C = pgf_product_list(i)%rc
     842     56833804 :             D = pgf_product_list(i)%rd
     843     14208451 :             Rho = pgf_product_list(i)%Rho
     844              :             RhoInv = pgf_product_list(i)%RhoInv
     845     56833804 :             P = pgf_product_list(i)%P
     846     56833804 :             Q = pgf_product_list(i)%Q
     847     56833804 :             W = pgf_product_list(i)%W
     848     56833804 :             AB = pgf_product_list(i)%AB
     849     56833804 :             CD = pgf_product_list(i)%CD
     850     14208451 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     851              :             CALL build_deriv_data(deriv, C, D, A, B, &
     852              :                                   Zeta_C, Zeta_D, Zeta_A, Zeta_B, &
     853              :                                   EtaInv, ZetaInv, ZetapEtaInv, Rho, RhoInv, &
     854     14208451 :                                   Q, P, W, m_max, pgf_product_list(i)%Fm)
     855     14208451 :             CALL cp_libint_get_derivs(n_b, n_a, n_d, n_c, deriv, work_forces, a_mysize)
     856     56833804 :             DO k = 4, 6
     857    546971905 :                DO j = 1, mysize
     858              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     859              :                                                work_forces(j, k + 3) + &
     860    532763454 :                                                work_forces(j, k + 6))
     861              :                END DO
     862              :             END DO
     863    184709863 :             DO k = 1, 12
     864   2145262267 :                DO j = 1, mysize
     865   2131053816 :                   work(j, k) = work(j, k) + work_forces(j, k)
     866              :                END DO
     867              :             END DO
     868     14208451 :             neris = neris + 12*mysize
     869     18697627 :             IF (use_virial) THEN
     870      2454373 :                CALL real_to_scaled(scoord(1:3), C, cell)
     871      2454373 :                CALL real_to_scaled(scoord(4:6), D, cell)
     872      2454373 :                CALL real_to_scaled(scoord(7:9), A, cell)
     873      2454373 :                CALL real_to_scaled(scoord(10:12), B, cell)
     874     31906849 :                DO k = 1, 12
     875    311832949 :                   DO j = 1, mysize
     876   1149156876 :                      DO m = 1, 3
     877   1119704400 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     878              :                      END DO
     879              :                   END DO
     880              :                END DO
     881              :             END IF
     882              : 
     883              :          END DO
     884     58359288 :          DO n = 1, 12
     885              :             tmp_max = 0.0_dp
     886    691445016 :             DO i = 1, mysize
     887    691445016 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     888              :             END DO
     889     53870112 :             tmp_max = tmp_max*max_contraction
     890     53870112 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     891              : 
     892    132292308 :             DO k = 1, ncoc
     893     73933020 :                p1 = (k - 1)*ncod
     894    206439480 :                DO l = 1, ncod
     895     78636348 :                   p2 = (p1 + l - 1)*ncoa
     896    454252320 :                   DO i = 1, ncoa
     897    301682952 :                      p3 = (p2 + i - 1)*ncob
     898   1017894204 :                      DO j = 1, ncob
     899    637574904 :                         p4 = p3 + j
     900    939257856 :                         work2(i, j, k, l, full_perm5(n)) = work(p4, n)
     901              :                      END DO
     902              :                   END DO
     903              :                END DO
     904              :             END DO
     905              :          END DO
     906      4489176 :          IF (use_virial) THEN
     907      2282215 :             DO n = 1, 12
     908              :                tmp_max_virial = 0.0_dp
     909     45229476 :                DO i = 1, mysize
     910              :                   tmp_max_virial = MAX(tmp_max_virial, &
     911     45229476 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
     912              :                END DO
     913      2106660 :                tmp_max_virial = tmp_max_virial*max_contraction
     914      2106660 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
     915              : 
     916      5820403 :                DO k = 1, ncoc
     917      3538188 :                   p1 = (k - 1)*ncod
     918      9603444 :                   DO l = 1, ncod
     919      3958596 :                      p2 = (p1 + l - 1)*ncoa
     920     23185224 :                      DO i = 1, ncoa
     921     15688440 :                         p3 = (p2 + i - 1)*ncob
     922     62769852 :                         DO j = 1, ncob
     923     43122816 :                            p4 = p3 + j
     924    188179704 :                            work2_virial(i, j, k, l, full_perm5(n), 1:3) = work_virial(p4, n, 1:3)
     925              :                         END DO
     926              :                      END DO
     927              :                   END DO
     928              :                END DO
     929              :             END DO
     930              :          END IF
     931              :       CASE (6)
     932      4871735 :          DO i = 1, nproducts
     933     14612228 :             A = pgf_product_list(i)%ra
     934     14612228 :             B = pgf_product_list(i)%rb
     935     14612228 :             C = pgf_product_list(i)%rc
     936     14612228 :             D = pgf_product_list(i)%rd
     937      3653057 :             Rho = pgf_product_list(i)%Rho
     938              :             RhoInv = pgf_product_list(i)%RhoInv
     939     14612228 :             P = pgf_product_list(i)%P
     940     14612228 :             Q = pgf_product_list(i)%Q
     941     14612228 :             W = pgf_product_list(i)%W
     942     14612228 :             AB = pgf_product_list(i)%AB
     943     14612228 :             CD = pgf_product_list(i)%CD
     944      3653057 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
     945              : 
     946              :             CALL build_deriv_data(deriv, C, D, B, A, &
     947              :                                   Zeta_C, Zeta_D, Zeta_B, Zeta_A, &
     948              :                                   EtaInv, ZetaInv, ZetapEtaInv, Rho, RhoInv, &
     949      3653057 :                                   Q, P, W, m_max, pgf_product_list(i)%Fm)
     950      3653057 :             CALL cp_libint_get_derivs(n_a, n_b, n_d, n_c, deriv, work_forces, a_mysize)
     951     14612228 :             DO k = 4, 6
     952    139785551 :                DO j = 1, mysize
     953              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
     954              :                                                work_forces(j, k + 3) + &
     955    136132494 :                                                work_forces(j, k + 6))
     956              :                END DO
     957              :             END DO
     958     47489741 :             DO k = 1, 12
     959    548183033 :                DO j = 1, mysize
     960    544529976 :                   work(j, k) = work(j, k) + work_forces(j, k)
     961              :                END DO
     962              :             END DO
     963      3653057 :             neris = neris + 12*mysize
     964      4871735 :             IF (use_virial) THEN
     965       439512 :                CALL real_to_scaled(scoord(1:3), C, cell)
     966       439512 :                CALL real_to_scaled(scoord(4:6), D, cell)
     967       439512 :                CALL real_to_scaled(scoord(7:9), B, cell)
     968       439512 :                CALL real_to_scaled(scoord(10:12), A, cell)
     969      5713656 :                DO k = 1, 12
     970     53754828 :                   DO j = 1, mysize
     971    197438832 :                      DO m = 1, 3
     972    192164688 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
     973              :                      END DO
     974              :                   END DO
     975              :                END DO
     976              :             END IF
     977              : 
     978              :          END DO
     979     15842814 :          DO n = 1, 12
     980              :             tmp_max = 0.0_dp
     981    201747672 :             DO i = 1, mysize
     982    201747672 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
     983              :             END DO
     984     14624136 :             tmp_max = tmp_max*max_contraction
     985     14624136 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
     986              : 
     987     34585014 :             DO k = 1, ncoc
     988     18742200 :                p1 = (k - 1)*ncod
     989     55038144 :                DO l = 1, ncod
     990     21671808 :                   p2 = (p1 + l - 1)*ncob
     991    137111160 :                   DO j = 1, ncob
     992     96697152 :                      p3 = (p2 + j - 1)*ncoa
     993    305492496 :                      DO i = 1, ncoa
     994    187123536 :                         p4 = p3 + i
     995    283820688 :                         work2(i, j, k, l, full_perm6(n)) = work(p4, n)
     996              :                      END DO
     997              :                   END DO
     998              :                END DO
     999              :             END DO
    1000              :          END DO
    1001      1218678 :          IF (use_virial) THEN
    1002       843440 :             DO n = 1, 12
    1003              :                tmp_max_virial = 0.0_dp
    1004     16339668 :                DO i = 1, mysize
    1005              :                   tmp_max_virial = MAX(tmp_max_virial, &
    1006     16339668 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
    1007              :                END DO
    1008       778560 :                tmp_max_virial = tmp_max_virial*max_contraction
    1009       778560 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
    1010              : 
    1011      1978136 :                DO k = 1, ncoc
    1012      1134696 :                   p1 = (k - 1)*ncod
    1013      3342648 :                   DO l = 1, ncod
    1014      1429392 :                      p2 = (p1 + l - 1)*ncob
    1015      9578364 :                      DO j = 1, ncob
    1016      7014276 :                         p3 = (p2 + j - 1)*ncoa
    1017     24004776 :                         DO i = 1, ncoa
    1018     15561108 :                            p4 = p3 + i
    1019     69258708 :                            work2_virial(i, j, k, l, full_perm6(n), 1:3) = work_virial(p4, n, 1:3)
    1020              :                         END DO
    1021              :                      END DO
    1022              :                   END DO
    1023              :                END DO
    1024              :             END DO
    1025              :          END IF
    1026              :       CASE (7)
    1027      2841811 :          DO i = 1, nproducts
    1028      8754340 :             A = pgf_product_list(i)%ra
    1029      8754340 :             B = pgf_product_list(i)%rb
    1030      8754340 :             C = pgf_product_list(i)%rc
    1031      8754340 :             D = pgf_product_list(i)%rd
    1032      2188585 :             Rho = pgf_product_list(i)%Rho
    1033              :             RhoInv = pgf_product_list(i)%RhoInv
    1034      8754340 :             P = pgf_product_list(i)%P
    1035      8754340 :             Q = pgf_product_list(i)%Q
    1036      8754340 :             W = pgf_product_list(i)%W
    1037      8754340 :             AB = pgf_product_list(i)%AB
    1038      8754340 :             CD = pgf_product_list(i)%CD
    1039      2188585 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1040              : 
    1041              :             CALL build_deriv_data(deriv, D, C, A, B, &
    1042              :                                   Zeta_D, Zeta_C, Zeta_A, Zeta_B, &
    1043              :                                   EtaInv, ZetaInv, ZetapEtaInv, Rho, RhoInv, &
    1044      2188585 :                                   Q, P, W, m_max, pgf_product_list(i)%Fm)
    1045      2188585 :             CALL cp_libint_get_derivs(n_b, n_a, n_c, n_d, deriv, work_forces, a_mysize)
    1046      8754340 :             DO k = 4, 6
    1047    213726838 :                DO j = 1, mysize
    1048              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
    1049              :                                                work_forces(j, k + 3) + &
    1050    211538253 :                                                work_forces(j, k + 6))
    1051              :                END DO
    1052              :             END DO
    1053     28451605 :             DO k = 1, 12
    1054    848341597 :                DO j = 1, mysize
    1055    846153012 :                   work(j, k) = work(j, k) + work_forces(j, k)
    1056              :                END DO
    1057              :             END DO
    1058      2188585 :             neris = neris + 12*mysize
    1059      2841811 :             IF (use_virial) THEN
    1060       387133 :                CALL real_to_scaled(scoord(1:3), D, cell)
    1061       387133 :                CALL real_to_scaled(scoord(4:6), C, cell)
    1062       387133 :                CALL real_to_scaled(scoord(7:9), A, cell)
    1063       387133 :                CALL real_to_scaled(scoord(10:12), B, cell)
    1064      5032729 :                DO k = 1, 12
    1065    140390209 :                   DO j = 1, mysize
    1066    546075516 :                      DO m = 1, 3
    1067    541429920 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
    1068              :                      END DO
    1069              :                   END DO
    1070              :                END DO
    1071              :             END IF
    1072              : 
    1073              :          END DO
    1074      8491938 :          DO n = 1, 12
    1075              :             tmp_max = 0.0_dp
    1076    279958536 :             DO i = 1, mysize
    1077    279958536 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
    1078              :             END DO
    1079      7838712 :             tmp_max = tmp_max*max_contraction
    1080      7838712 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
    1081              : 
    1082     32745030 :             DO l = 1, ncod
    1083     24253092 :                p1 = (l - 1)*ncoc
    1084     56789712 :                DO k = 1, ncoc
    1085     24697908 :                   p2 = (p1 + k - 1)*ncoa
    1086    150110496 :                   DO i = 1, ncoa
    1087    101159496 :                      p3 = (p2 + i - 1)*ncob
    1088    397977228 :                      DO j = 1, ncob
    1089    272119824 :                         p4 = p3 + j
    1090    373279320 :                         work2(i, j, k, l, full_perm7(n)) = work(p4, n)
    1091              :                      END DO
    1092              :                   END DO
    1093              :                END DO
    1094              :             END DO
    1095              :          END DO
    1096       653226 :          IF (use_virial) THEN
    1097       649454 :             DO n = 1, 12
    1098              :                tmp_max_virial = 0.0_dp
    1099     22159320 :                DO i = 1, mysize
    1100              :                   tmp_max_virial = MAX(tmp_max_virial, &
    1101     22159320 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
    1102              :                END DO
    1103       599496 :                tmp_max_virial = tmp_max_virial*max_contraction
    1104       599496 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
    1105              : 
    1106      2504534 :                DO l = 1, ncod
    1107      1855080 :                   p1 = (l - 1)*ncoc
    1108      4346520 :                   DO k = 1, ncoc
    1109      1891944 :                      p2 = (p1 + k - 1)*ncoa
    1110     10990800 :                      DO i = 1, ncoa
    1111      7243776 :                         p3 = (p2 + i - 1)*ncob
    1112     30695544 :                         DO j = 1, ncob
    1113     21559824 :                            p4 = p3 + j
    1114     93483072 :                            work2_virial(i, j, k, l, full_perm7(n), 1:3) = work_virial(p4, n, 1:3)
    1115              :                         END DO
    1116              :                      END DO
    1117              :                   END DO
    1118              :                END DO
    1119              :             END DO
    1120              :          END IF
    1121              :       CASE (8)
    1122       383782 :          DO i = 1, nproducts
    1123      1081196 :             A = pgf_product_list(i)%ra
    1124      1081196 :             B = pgf_product_list(i)%rb
    1125      1081196 :             C = pgf_product_list(i)%rc
    1126      1081196 :             D = pgf_product_list(i)%rd
    1127       270299 :             Rho = pgf_product_list(i)%Rho
    1128              :             RhoInv = pgf_product_list(i)%RhoInv
    1129      1081196 :             P = pgf_product_list(i)%P
    1130      1081196 :             Q = pgf_product_list(i)%Q
    1131      1081196 :             W = pgf_product_list(i)%W
    1132      1081196 :             AB = pgf_product_list(i)%AB
    1133      1081196 :             CD = pgf_product_list(i)%CD
    1134       270299 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1135              : 
    1136              :             CALL build_deriv_data(deriv, D, C, B, A, &
    1137              :                                   Zeta_D, Zeta_C, Zeta_B, Zeta_A, &
    1138              :                                   EtaInv, ZetaInv, ZetapEtaInv, Rho, RhoInv, &
    1139       270299 :                                   Q, P, W, m_max, pgf_product_list(i)%Fm)
    1140       270299 :             CALL cp_libint_get_derivs(n_a, n_b, n_c, n_d, deriv, work_forces, a_mysize)
    1141      1081196 :             DO k = 4, 6
    1142     34572644 :                DO j = 1, mysize
    1143              :                   work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
    1144              :                                                work_forces(j, k + 3) + &
    1145     34302345 :                                                work_forces(j, k + 6))
    1146              :                END DO
    1147              :             END DO
    1148      3513887 :             DO k = 1, 12
    1149    137479679 :                DO j = 1, mysize
    1150    137209380 :                   work(j, k) = work(j, k) + work_forces(j, k)
    1151              :                END DO
    1152              :             END DO
    1153       270299 :             neris = neris + 12*mysize
    1154       383782 :             IF (use_virial) THEN
    1155        22360 :                CALL real_to_scaled(scoord(1:3), D, cell)
    1156        22360 :                CALL real_to_scaled(scoord(4:6), C, cell)
    1157        22360 :                CALL real_to_scaled(scoord(7:9), B, cell)
    1158        22360 :                CALL real_to_scaled(scoord(10:12), A, cell)
    1159       290680 :                DO k = 1, 12
    1160     11617720 :                   DO j = 1, mysize
    1161     45576480 :                      DO m = 1, 3
    1162     45308160 :                         work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(INT((k - 1)/3)*3 + m)
    1163              :                      END DO
    1164              :                   END DO
    1165              :                END DO
    1166              :             END IF
    1167              : 
    1168              :          END DO
    1169      1475279 :          DO n = 1, 12
    1170              :             tmp_max = 0.0_dp
    1171     58431588 :             DO i = 1, mysize
    1172     58431588 :                tmp_max = MAX(tmp_max, ABS(work(i, n)))
    1173              :             END DO
    1174      1361796 :             tmp_max = tmp_max*max_contraction
    1175      1361796 :             tmp_max_all = MAX(tmp_max_all, tmp_max)
    1176              : 
    1177      5995655 :             DO l = 1, ncod
    1178      4520376 :                p1 = (l - 1)*ncoc
    1179     10402548 :                DO k = 1, ncoc
    1180      4520376 :                   p2 = (p1 + k - 1)*ncob
    1181     36163008 :                   DO j = 1, ncob
    1182     27122256 :                      p3 = (p2 + j - 1)*ncoa
    1183     88712424 :                      DO i = 1, ncoa
    1184     57069792 :                         p4 = p3 + i
    1185     84192048 :                         work2(i, j, k, l, full_perm8(n)) = work(p4, n)
    1186              :                      END DO
    1187              :                   END DO
    1188              :                END DO
    1189              :             END DO
    1190              :          END DO
    1191     34136604 :          IF (use_virial) THEN
    1192       119730 :             DO n = 1, 12
    1193              :                tmp_max_virial = 0.0_dp
    1194      4973976 :                DO i = 1, mysize
    1195              :                   tmp_max_virial = MAX(tmp_max_virial, &
    1196      4973976 :                                        ABS(work_virial(i, n, 1)), ABS(work_virial(i, n, 2)), ABS(work_virial(i, n, 3)))
    1197              :                END DO
    1198       110520 :                tmp_max_virial = tmp_max_virial*max_contraction
    1199       110520 :                tmp_max_all_virial = MAX(tmp_max_all_virial, tmp_max_virial)
    1200              : 
    1201       488154 :                DO l = 1, ncod
    1202       368424 :                   p1 = (l - 1)*ncoc
    1203       847368 :                   DO k = 1, ncoc
    1204       368424 :                      p2 = (p1 + k - 1)*ncob
    1205      2947392 :                      DO j = 1, ncob
    1206      2210544 :                         p3 = (p2 + j - 1)*ncoa
    1207      7442424 :                         DO i = 1, ncoa
    1208      4863456 :                            p4 = p3 + i
    1209     21664368 :                            work2_virial(i, j, k, l, full_perm8(n), 1:3) = work_virial(p4, n, 1:3)
    1210              :                         END DO
    1211              :                      END DO
    1212              :                   END DO
    1213              :                END DO
    1214              :             END DO
    1215              :          END IF
    1216              :       END SELECT
    1217              : 
    1218     34023121 :       IF (.NOT. use_virial) THEN
    1219     32941535 :          IF (tmp_max_all < eps_schwarz) RETURN
    1220              :       END IF
    1221              : 
    1222              :       direct_contract = (s_offset_a == 0 .AND. s_offset_b == 0 .AND. &
    1223              :                          s_offset_c == 0 .AND. s_offset_d == 0 .AND. &
    1224              :                          nsgfa == nsoa*nl_a .AND. nsgfb == nsob*nl_b .AND. &
    1225     29385084 :                          nsgfc == nsoc*nl_c .AND. nsgfd == nsod*nl_d)
    1226              : 
    1227     29385084 :       IF (tmp_max_all >= eps_schwarz) THEN
    1228     29224671 :          IF (direct_contract) THEN
    1229     74823762 :             DO i = 1, 12
    1230              :                CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1231              :                              n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2(1, 1, 1, 1, i), &
    1232              :                              sphi_a, &
    1233              :                              sphi_b, &
    1234              :                              sphi_c, &
    1235              :                              sphi_d, &
    1236              :                              primitives(1, 1, 1, 1, i), &
    1237     74823762 :                              buffer1, buffer2)
    1238              :             END DO
    1239              :          ELSE
    1240    305096961 :             DO i = 1, 12
    1241  19197727008 :                primitives_tmp(:, :, :, :) = 0.0_dp
    1242              :                CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1243              :                              n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2(1, 1, 1, 1, i), &
    1244              :                              sphi_a, &
    1245              :                              sphi_b, &
    1246              :                              sphi_c, &
    1247              :                              sphi_d, &
    1248              :                              primitives_tmp(1, 1, 1, 1), &
    1249    281627964 :                              buffer1, buffer2)
    1250              : 
    1251              :                primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    1252              :                           s_offset_b + 1:s_offset_b + nsob*nl_b, &
    1253              :                           s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    1254              :                           s_offset_d + 1:s_offset_d + nsod*nl_d, i) = &
    1255              :                   primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    1256              :                              s_offset_b + 1:s_offset_b + nsob*nl_b, &
    1257              :                              s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    1258  19221196005 :                              s_offset_d + 1:s_offset_d + nsod*nl_d, i) + primitives_tmp(:, :, :, :)
    1259              :             END DO
    1260              :          END IF
    1261              :       END IF
    1262              : 
    1263     29385084 :       IF (use_virial .AND. tmp_max_all_virial >= eps_schwarz) THEN
    1264       933078 :          IF (direct_contract) THEN
    1265      3254329 :             DO i = 1, 12
    1266     12266317 :                DO m = 1, 3
    1267              :                   CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1268              :                                 n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2_virial(1, 1, 1, 1, i, m), &
    1269              :                                 sphi_a, &
    1270              :                                 sphi_b, &
    1271              :                                 sphi_c, &
    1272              :                                 sphi_d, &
    1273              :                                 primitives_virial(1, 1, 1, 1, i, m), &
    1274     12015984 :                                 buffer1, buffer2)
    1275              :                END DO
    1276              :             END DO
    1277              :          ELSE
    1278      8875685 :             DO i = 1, 12
    1279     33454505 :                DO m = 1, 3
    1280   4740944724 :                   primitives_tmp_virial(:, :, :, :) = 0.0_dp
    1281              :                   CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1282              :                                 n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2_virial(1, 1, 1, 1, i, m), &
    1283              :                                 sphi_a, &
    1284              :                                 sphi_b, &
    1285              :                                 sphi_c, &
    1286              :                                 sphi_d, &
    1287              :                                 primitives_tmp_virial(1, 1, 1, 1), &
    1288     24578820 :                                 buffer1, buffer2)
    1289              : 
    1290              :                   primitives_virial(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    1291              :                                     s_offset_b + 1:s_offset_b + nsob*nl_b, &
    1292              :                                     s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    1293              :                                     s_offset_d + 1:s_offset_d + nsod*nl_d, i, m) = &
    1294              :                      primitives_virial(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    1295              :                                        s_offset_b + 1:s_offset_b + nsob*nl_b, &
    1296              :                                        s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    1297   4749137664 :                                        s_offset_d + 1:s_offset_d + nsod*nl_d, i, m) + primitives_tmp_virial(:, :, :, :)
    1298              :                END DO
    1299              :             END DO
    1300              :          END IF
    1301              :       END IF
    1302              : 
    1303              :    END SUBROUTINE evaluate_deriv_eri
    1304              : 
    1305              : ! **************************************************************************************************
    1306              : !> \brief Evaluates max-abs values of  electron repulsion integrals for a primitive quartet
    1307              : !> \param libint ...
    1308              : !> \param A ...
    1309              : !> \param B ...
    1310              : !> \param C ...
    1311              : !> \param D ...
    1312              : !> \param Zeta_A ...
    1313              : !> \param Zeta_B ...
    1314              : !> \param Zeta_C ...
    1315              : !> \param Zeta_D ...
    1316              : !> \param n_a ...
    1317              : !> \param n_b ...
    1318              : !> \param n_c ...
    1319              : !> \param n_d ...
    1320              : !> \param max_val ...
    1321              : !> \param potential_parameter ...
    1322              : !> \param R1 ...
    1323              : !> \param R2 ...
    1324              : !> \param p_work ...
    1325              : !> \par History
    1326              : !>      03.2007 created [Manuel Guidon]
    1327              : !>      08.2007 refactured permutation part [Manuel Guidon]
    1328              : !> \author Manuel Guidon
    1329              : ! **************************************************************************************************
    1330     96382482 :    SUBROUTINE evaluate_eri_screen(libint, A, B, C, D, Zeta_A, Zeta_B, Zeta_C, Zeta_D, &
    1331              :                                   n_a, n_b, n_c, n_d, &
    1332              :                                   max_val, potential_parameter, R1, R2, &
    1333              :                                   p_work)
    1334              : 
    1335              :       TYPE(cp_libint_t)                                  :: libint
    1336              :       REAL(dp), INTENT(IN)                               :: A(3), B(3), C(3), D(3), Zeta_A, Zeta_B, &
    1337              :                                                             Zeta_C, Zeta_D
    1338              :       INTEGER, INTENT(IN)                                :: n_a, n_b, n_c, n_d
    1339              :       REAL(dp), INTENT(INOUT)                            :: max_val
    1340              :       TYPE(hfx_potential_type)                           :: potential_parameter
    1341              :       REAL(dp)                                           :: R1, R2
    1342              :       REAL(dp), DIMENSION(:), POINTER                    :: p_work
    1343              : 
    1344              :       INTEGER                                            :: a_mysize(1), i, m_max, mysize, perm_case
    1345              : 
    1346     96382482 :       m_max = n_a + n_b + n_c + n_d
    1347     96382482 :       mysize = nco(n_a)*nco(n_b)*nco(n_c)*nco(n_d)
    1348    192764964 :       a_mysize = mysize
    1349              : 
    1350     96382482 :       IF (m_max /= 0) THEN
    1351     60006726 :          perm_case = 1
    1352     60006726 :          IF (n_a < n_b) THEN
    1353     24401196 :             perm_case = perm_case + 1
    1354              :          END IF
    1355     60006726 :          IF (n_c < n_d) THEN
    1356     24401196 :             perm_case = perm_case + 2
    1357              :          END IF
    1358     60006726 :          IF (n_a + n_b > n_c + n_d) THEN
    1359            0 :             perm_case = perm_case + 4
    1360              :          END IF
    1361              : 
    1362     35605530 :          SELECT CASE (perm_case)
    1363              :          CASE (1)
    1364              :             CALL build_quartet_data_screen(A, B, C, D, Zeta_A, Zeta_B, Zeta_C, Zeta_D, m_max, &
    1365     35605530 :                                            potential_parameter, libint, R1, R2)
    1366              : 
    1367     35605530 :             CALL cp_libint_get_eris(n_d, n_c, n_b, n_a, libint, p_work, a_mysize)
    1368   3056048304 :             DO i = 1, mysize
    1369   3056048304 :                max_val = MAX(max_val, ABS(p_work(i)))
    1370              :             END DO
    1371              :          CASE (2)
    1372              :             CALL build_quartet_data_screen(B, A, C, D, Zeta_B, Zeta_A, Zeta_C, Zeta_D, m_max, &
    1373            0 :                                            potential_parameter, libint, R1, R2)
    1374              : 
    1375            0 :             CALL cp_libint_get_eris(n_d, n_c, n_a, n_b, libint, p_work, a_mysize)
    1376            0 :             DO i = 1, mysize
    1377            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1378              :             END DO
    1379              :          CASE (3)
    1380              :             CALL build_quartet_data_screen(A, B, D, C, Zeta_A, Zeta_B, Zeta_D, Zeta_C, m_max, &
    1381            0 :                                            potential_parameter, libint, R1, R2)
    1382              : 
    1383            0 :             CALL cp_libint_get_eris(n_c, n_d, n_b, n_a, libint, p_work, a_mysize)
    1384            0 :             DO i = 1, mysize
    1385            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1386              :             END DO
    1387              :          CASE (4)
    1388              :             CALL build_quartet_data_screen(B, A, D, C, Zeta_B, Zeta_A, Zeta_D, Zeta_C, m_max, &
    1389     24401196 :                                            potential_parameter, libint, R1, R2)
    1390              : 
    1391     24401196 :             CALL cp_libint_get_eris(n_c, n_d, n_a, n_b, libint, p_work, a_mysize)
    1392   1098038670 :             DO i = 1, mysize
    1393   1098038670 :                max_val = MAX(max_val, ABS(p_work(i)))
    1394              :             END DO
    1395              :          CASE (5)
    1396              :             CALL build_quartet_data_screen(C, D, A, B, Zeta_C, Zeta_D, Zeta_A, Zeta_B, m_max, &
    1397            0 :                                            potential_parameter, libint, R1, R2)
    1398              : 
    1399            0 :             CALL cp_libint_get_eris(n_b, n_a, n_d, n_c, libint, p_work, a_mysize)
    1400            0 :             DO i = 1, mysize
    1401            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1402              :             END DO
    1403              :          CASE (6)
    1404              :             CALL build_quartet_data_screen(C, D, B, A, Zeta_C, Zeta_D, Zeta_B, Zeta_A, m_max, &
    1405            0 :                                            potential_parameter, libint, R1, R2)
    1406              : 
    1407            0 :             CALL cp_libint_get_eris(n_a, n_b, n_d, n_c, libint, p_work, a_mysize)
    1408            0 :             DO i = 1, mysize
    1409            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1410              :             END DO
    1411              :          CASE (7)
    1412              :             CALL build_quartet_data_screen(D, C, A, B, Zeta_D, Zeta_C, Zeta_A, Zeta_B, m_max, &
    1413            0 :                                            potential_parameter, libint, R1, R2)
    1414              : 
    1415            0 :             CALL cp_libint_get_eris(n_b, n_a, n_c, n_d, libint, p_work, a_mysize)
    1416            0 :             DO i = 1, mysize
    1417            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1418              :             END DO
    1419              :          CASE (8)
    1420              :             CALL build_quartet_data_screen(D, C, B, A, Zeta_D, Zeta_C, Zeta_B, Zeta_A, m_max, &
    1421            0 :                                            potential_parameter, libint, R1, R2)
    1422              : 
    1423            0 :             CALL cp_libint_get_eris(n_a, n_b, n_c, n_d, libint, p_work, a_mysize)
    1424     60006726 :             DO i = 1, mysize
    1425            0 :                max_val = MAX(max_val, ABS(p_work(i)))
    1426              :             END DO
    1427              :          END SELECT
    1428              :       ELSE
    1429              :          CALL build_quartet_data_screen(A, B, C, D, Zeta_A, Zeta_B, Zeta_C, Zeta_D, m_max, &
    1430     36375756 :                                         potential_parameter, libint, R1, R2)
    1431     36375756 :          max_val = ABS(get_ssss_f_val(libint))
    1432              :       END IF
    1433              : 
    1434     96382482 :    END SUBROUTINE evaluate_eri_screen
    1435              : 
    1436              : ! **************************************************************************************************
    1437              : !> \brief Evaluate electron repulsion integrals for a primitive quartet
    1438              : !> \param libint ...
    1439              : !> \param nproducts ...
    1440              : !> \param pgf_product_list ...
    1441              : !> \param n_a ...
    1442              : !> \param n_b ...
    1443              : !> \param n_c ...
    1444              : !> \param n_d ...
    1445              : !> \param ncoa ...
    1446              : !> \param ncob ...
    1447              : !> \param ncoc ...
    1448              : !> \param ncod ...
    1449              : !> \param nsgfa ...
    1450              : !> \param nsgfb ...
    1451              : !> \param nsgfc ...
    1452              : !> \param nsgfd ...
    1453              : !> \param primitives ...
    1454              : !> \param max_contraction ...
    1455              : !> \param tmp_max ...
    1456              : !> \param eps_schwarz ...
    1457              : !> \param neris ...
    1458              : !> \param ZetaInv ...
    1459              : !> \param EtaInv ...
    1460              : !> \param s_offset_a ...
    1461              : !> \param s_offset_b ...
    1462              : !> \param s_offset_c ...
    1463              : !> \param s_offset_d ...
    1464              : !> \param nl_a ...
    1465              : !> \param nl_b ...
    1466              : !> \param nl_c ...
    1467              : !> \param nl_d ...
    1468              : !> \param nsoa ...
    1469              : !> \param nsob ...
    1470              : !> \param nsoc ...
    1471              : !> \param nsod ...
    1472              : !> \param sphi_a ...
    1473              : !> \param sphi_b ...
    1474              : !> \param sphi_c ...
    1475              : !> \param sphi_d ...
    1476              : !> \param work ...
    1477              : !> \param work2 ...
    1478              : !> \param buffer1 ...
    1479              : !> \param buffer2 ...
    1480              : !> \param primitives_tmp ...
    1481              : !> \param p_work ...
    1482              : !> \par History
    1483              : !>      11.2006 created [Manuel Guidon]
    1484              : !>      08.2007 refactured permutation part [Manuel Guidon]
    1485              : !> \author Manuel Guidon
    1486              : ! **************************************************************************************************
    1487    173975894 :    SUBROUTINE evaluate_eri(libint, nproducts, pgf_product_list, &
    1488              :                            n_a, n_b, n_c, n_d, &
    1489              :                            ncoa, ncob, ncoc, ncod, &
    1490              :                            nsgfa, nsgfb, nsgfc, nsgfd, &
    1491    173975894 :                            primitives, max_contraction, tmp_max, &
    1492              :                            eps_schwarz, neris, &
    1493              :                            ZetaInv, EtaInv, &
    1494              :                            s_offset_a, s_offset_b, s_offset_c, s_offset_d, &
    1495              :                            nl_a, nl_b, nl_c, nl_d, nsoa, nsob, nsoc, nsod, &
    1496    173975894 :                            sphi_a, sphi_b, sphi_c, sphi_d, work, work2, buffer1, buffer2, &
    1497    173975894 :                            primitives_tmp, p_work)
    1498              : 
    1499              :       TYPE(cp_libint_t)                                  :: libint
    1500              :       INTEGER, INTENT(IN)                                :: nproducts
    1501              :       TYPE(hfx_pgf_product_list), DIMENSION(nproducts)   :: pgf_product_list
    1502              :       INTEGER, INTENT(IN)                                :: n_a, n_b, n_c, n_d, ncoa, ncob, ncoc, &
    1503              :                                                             ncod, nsgfa, nsgfb, nsgfc, nsgfd
    1504              :       REAL(dp), DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd)    :: primitives
    1505              :       REAL(dp)                                           :: max_contraction, tmp_max, eps_schwarz
    1506              :       INTEGER(int_8)                                     :: neris
    1507              :       REAL(dp), INTENT(IN)                               :: ZetaInv, EtaInv
    1508              :       INTEGER                                            :: s_offset_a, s_offset_b, s_offset_c, &
    1509              :                                                             s_offset_d, nl_a, nl_b, nl_c, nl_d, &
    1510              :                                                             nsoa, nsob, nsoc, nsod
    1511              :       REAL(dp), DIMENSION(ncoa, nsoa*nl_a), INTENT(IN)   :: sphi_a
    1512              :       REAL(dp), DIMENSION(ncob, nsob*nl_b), INTENT(IN)   :: sphi_b
    1513              :       REAL(dp), DIMENSION(ncoc, nsoc*nl_c), INTENT(IN)   :: sphi_c
    1514              :       REAL(dp), DIMENSION(ncod, nsod*nl_d), INTENT(IN)   :: sphi_d
    1515              :       REAL(dp), TARGET                                   :: work(ncoa*ncob*ncoc*ncod)
    1516              :       REAL(dp)                                           :: work2(ncoa, ncob, ncoc, ncod)
    1517              :       REAL(dp), DIMENSION(ncoa*ncob*ncoc*ncod)           :: buffer1, buffer2
    1518              :       REAL(dp), DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
    1519              :          nl_c, nsod*nl_d)                                :: primitives_tmp
    1520              :       REAL(dp), DIMENSION(:), POINTER                    :: p_work
    1521              : 
    1522              :       INTEGER                                            :: a_mysize(1), i, j, k, l, m_max, mysize, &
    1523              :                                                             p1, p2, p3, p4, perm_case
    1524              :       LOGICAL                                            :: direct_contract
    1525              :       REAL(dp)                                           :: A(3), AB(3), B(3), C(3), CD(3), D(3), &
    1526              :                                                             P(3), Q(3), Rho, RhoInv, W(3), &
    1527              :                                                             ZetapEtaInv
    1528    173975894 :       REAL(dp), DIMENSION(:), POINTER                    :: eri_src
    1529              :       REAL(KIND=dp), DIMENSION(prim_data_f_size)         :: F
    1530              : 
    1531     31024167 :       IF (nproducts == 0) RETURN
    1532              : 
    1533    173975894 :       m_max = n_a + n_b + n_c + n_d
    1534    173975894 :       mysize = ncoa*ncob*ncoc*ncod
    1535    347951788 :       a_mysize = mysize
    1536              : 
    1537    173975894 :       IF (m_max /= 0) THEN
    1538    258088063 :          IF (nproducts > 1) work(1:mysize) = 0.0_dp
    1539    137713987 :          perm_case = 1
    1540    137713987 :          IF (n_a < n_b) THEN
    1541     32338477 :             perm_case = perm_case + 1
    1542              :          END IF
    1543    137713987 :          IF (n_c < n_d) THEN
    1544     39426443 :             perm_case = perm_case + 2
    1545              :          END IF
    1546    137713987 :          IF (n_a + n_b > n_c + n_d) THEN
    1547     47546943 :             perm_case = perm_case + 4
    1548              :          END IF
    1549              :          SELECT CASE (perm_case)
    1550              :          CASE (1)
    1551    215137227 :             DO i = 1, nproducts
    1552    667038732 :                A = pgf_product_list(i)%ra
    1553    667038732 :                B = pgf_product_list(i)%rb
    1554    667038732 :                C = pgf_product_list(i)%rc
    1555    667038732 :                D = pgf_product_list(i)%rd
    1556    166759683 :                Rho = pgf_product_list(i)%Rho
    1557    166759683 :                RhoInv = pgf_product_list(i)%RhoInv
    1558    667038732 :                P = pgf_product_list(i)%P
    1559    667038732 :                Q = pgf_product_list(i)%Q
    1560    667038732 :                W = pgf_product_list(i)%W
    1561    667038732 :                AB = pgf_product_list(i)%AB
    1562    667038732 :                CD = pgf_product_list(i)%CD
    1563    166759683 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1564    658616982 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1565              : 
    1566              :                CALL build_quartet_data(libint, A, B, C, D, ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    1567    166759683 :                                        P, Q, W, m_max, F)
    1568    166759683 :                CALL cp_libint_get_eris(n_d, n_c, n_b, n_a, libint, p_work, a_mysize)
    1569   3586600785 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1570    215137227 :                neris = neris + mysize
    1571              :             END DO
    1572     48377544 :             IF (nproducts == 1) THEN
    1573     45986415 :                eri_src => p_work
    1574              :             ELSE
    1575      2391129 :                eri_src => work
    1576              :             END IF
    1577   1204274484 :             DO i = 1, mysize
    1578   1204274484 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1579              :             END DO
    1580     48377544 :             tmp_max = tmp_max*max_contraction
    1581     48377544 :             IF (tmp_max < eps_schwarz) THEN
    1582              :                RETURN
    1583              :             END IF
    1584              : 
    1585    119717839 :             DO i = 1, ncoa
    1586     78720148 :                p1 = (i - 1)*ncob
    1587    220534811 :                DO j = 1, ncob
    1588    100816972 :                   p2 = (p1 + j - 1)*ncoc
    1589    585373571 :                   DO k = 1, ncoc
    1590    405836451 :                      p3 = (p2 + k - 1)*ncod
    1591   1535382360 :                      DO l = 1, ncod
    1592   1028728937 :                         p4 = p3 + l
    1593   1434565388 :                         work2(i, j, k, l) = eri_src(p4)
    1594              :                      END DO
    1595              :                   END DO
    1596              :                END DO
    1597              :             END DO
    1598              :          CASE (2)
    1599     35978927 :             DO i = 1, nproducts
    1600    104174180 :                A = pgf_product_list(i)%ra
    1601    104174180 :                B = pgf_product_list(i)%rb
    1602    104174180 :                C = pgf_product_list(i)%rc
    1603    104174180 :                D = pgf_product_list(i)%rd
    1604     26043545 :                Rho = pgf_product_list(i)%Rho
    1605     26043545 :                RhoInv = pgf_product_list(i)%RhoInv
    1606    104174180 :                P = pgf_product_list(i)%P
    1607    104174180 :                Q = pgf_product_list(i)%Q
    1608    104174180 :                W = pgf_product_list(i)%W
    1609    104174180 :                AB = pgf_product_list(i)%AB
    1610    104174180 :                CD = pgf_product_list(i)%CD
    1611     26043545 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1612    124114453 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1613              : 
    1614              :                CALL build_quartet_data(libint, B, A, C, D, &
    1615              :                                        ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    1616     26043545 :                                        P, Q, W, m_max, F)
    1617              : 
    1618     26043545 :                CALL cp_libint_get_eris(n_d, n_c, n_a, n_b, libint, p_work, a_mysize)
    1619    788821427 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1620     35978927 :                neris = neris + mysize
    1621              :             END DO
    1622      9935382 :             IF (nproducts == 1) THEN
    1623      9341391 :                eri_src => p_work
    1624              :             ELSE
    1625       593991 :                eri_src => work
    1626              :             END IF
    1627    427017532 :             DO i = 1, mysize
    1628    427017532 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1629              :             END DO
    1630      9935382 :             tmp_max = tmp_max*max_contraction
    1631      9935382 :             IF (tmp_max < eps_schwarz) THEN
    1632              :                RETURN
    1633              :             END IF
    1634              : 
    1635     34555262 :             DO j = 1, ncob
    1636     26889440 :                p1 = (j - 1)*ncoa
    1637     64488980 :                DO i = 1, ncoa
    1638     29933718 :                   p2 = (p1 + i - 1)*ncoc
    1639    184752369 :                   DO k = 1, ncoc
    1640    127929211 :                      p3 = (p2 + k - 1)*ncod
    1641    500488336 :                      DO l = 1, ncod
    1642    342625407 :                         p4 = p3 + l
    1643    470554618 :                         work2(i, j, k, l) = eri_src(p4)
    1644              :                      END DO
    1645              :                   END DO
    1646              :                END DO
    1647              :             END DO
    1648              :          CASE (3)
    1649     92374290 :             DO i = 1, nproducts
    1650    269789016 :                A = pgf_product_list(i)%ra
    1651    269789016 :                B = pgf_product_list(i)%rb
    1652    269789016 :                C = pgf_product_list(i)%rc
    1653    269789016 :                D = pgf_product_list(i)%rd
    1654     67447254 :                Rho = pgf_product_list(i)%Rho
    1655     67447254 :                RhoInv = pgf_product_list(i)%RhoInv
    1656    269789016 :                P = pgf_product_list(i)%P
    1657    269789016 :                Q = pgf_product_list(i)%Q
    1658    269789016 :                W = pgf_product_list(i)%W
    1659    269789016 :                AB = pgf_product_list(i)%AB
    1660    269789016 :                CD = pgf_product_list(i)%CD
    1661     67447254 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1662    254312765 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1663              : 
    1664              :                CALL build_quartet_data(libint, A, B, D, C, &
    1665              :                                        ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    1666     67447254 :                                        P, Q, W, m_max, F)
    1667              : 
    1668     67447254 :                CALL cp_libint_get_eris(n_c, n_d, n_b, n_a, libint, p_work, a_mysize)
    1669   1037295234 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1670     92374290 :                neris = neris + mysize
    1671              :             END DO
    1672     24927036 :             IF (nproducts == 1) THEN
    1673     23713563 :                eri_src => p_work
    1674              :             ELSE
    1675      1213473 :                eri_src => work
    1676              :             END IF
    1677    462156411 :             DO i = 1, mysize
    1678    462156411 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1679              :             END DO
    1680     24927036 :             tmp_max = tmp_max*max_contraction
    1681     24927036 :             IF (tmp_max < eps_schwarz) THEN
    1682              :                RETURN
    1683              :             END IF
    1684              : 
    1685     57921660 :             DO i = 1, ncoa
    1686     38547224 :                p1 = (i - 1)*ncob
    1687    104643572 :                DO j = 1, ncob
    1688     46721912 :                   p2 = (p1 + j - 1)*ncod
    1689    300393575 :                   DO l = 1, ncod
    1690    215124439 :                      p3 = (p2 + l - 1)*ncoc
    1691    627568124 :                      DO k = 1, ncoc
    1692    365721773 :                         p4 = p3 + k
    1693    580846212 :                         work2(i, j, k, l) = eri_src(p4)
    1694              :                      END DO
    1695              :                   END DO
    1696              :                END DO
    1697              :             END DO
    1698              :          CASE (4)
    1699     21933328 :             DO i = 1, nproducts
    1700     60024984 :                A = pgf_product_list(i)%ra
    1701     60024984 :                B = pgf_product_list(i)%rb
    1702     60024984 :                C = pgf_product_list(i)%rc
    1703     60024984 :                D = pgf_product_list(i)%rd
    1704     15006246 :                Rho = pgf_product_list(i)%Rho
    1705     15006246 :                RhoInv = pgf_product_list(i)%RhoInv
    1706     60024984 :                P = pgf_product_list(i)%P
    1707     60024984 :                Q = pgf_product_list(i)%Q
    1708     60024984 :                W = pgf_product_list(i)%W
    1709     60024984 :                AB = pgf_product_list(i)%AB
    1710     60024984 :                CD = pgf_product_list(i)%CD
    1711     15006246 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1712     68265950 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1713              : 
    1714              :                CALL build_quartet_data(libint, B, A, D, C, &
    1715              :                                        ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    1716     15006246 :                                        P, Q, W, m_max, F)
    1717              : 
    1718     15006246 :                CALL cp_libint_get_eris(n_c, n_d, n_a, n_b, libint, p_work, a_mysize)
    1719    323472516 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1720     21933328 :                neris = neris + mysize
    1721              :             END DO
    1722      6927082 :             IF (nproducts == 1) THEN
    1723      6576340 :                eri_src => p_work
    1724              :             ELSE
    1725       350742 :                eri_src => work
    1726              :             END IF
    1727    242205375 :             DO i = 1, mysize
    1728    242205375 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1729              :             END DO
    1730      6927082 :             tmp_max = tmp_max*max_contraction
    1731      6927082 :             IF (tmp_max < eps_schwarz) THEN
    1732              :                RETURN
    1733              :             END IF
    1734              : 
    1735     25031141 :             DO j = 1, ncob
    1736     19453264 :                p1 = (j - 1)*ncoa
    1737     47388043 :                DO i = 1, ncoa
    1738     22356902 :                   p2 = (p1 + i - 1)*ncod
    1739    147031228 :                   DO l = 1, ncod
    1740    105221062 :                      p3 = (p2 + l - 1)*ncoc
    1741    328520378 :                      DO k = 1, ncoc
    1742    200942414 :                         p4 = p3 + k
    1743    306163476 :                         work2(i, j, k, l) = eri_src(p4)
    1744              :                      END DO
    1745              :                   END DO
    1746              :                END DO
    1747              :             END DO
    1748              :          CASE (5)
    1749     98786540 :             DO i = 1, nproducts
    1750    288709796 :                A = pgf_product_list(i)%ra
    1751    288709796 :                B = pgf_product_list(i)%rb
    1752    288709796 :                C = pgf_product_list(i)%rc
    1753    288709796 :                D = pgf_product_list(i)%rd
    1754     72177449 :                Rho = pgf_product_list(i)%Rho
    1755     72177449 :                RhoInv = pgf_product_list(i)%RhoInv
    1756    288709796 :                P = pgf_product_list(i)%P
    1757    288709796 :                Q = pgf_product_list(i)%Q
    1758    288709796 :                W = pgf_product_list(i)%W
    1759    288709796 :                AB = pgf_product_list(i)%AB
    1760    288709796 :                CD = pgf_product_list(i)%CD
    1761     72177449 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1762    273788098 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1763              : 
    1764              :                CALL build_quartet_data(libint, C, D, A, B, &
    1765              :                                        EtaInv, ZetaInv, ZetapEtaInv, Rho, &
    1766     72177449 :                                        Q, P, W, m_max, F)
    1767              : 
    1768     72177449 :                CALL cp_libint_get_eris(n_b, n_a, n_d, n_c, libint, p_work, a_mysize)
    1769   1176234881 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1770     98786540 :                neris = neris + mysize
    1771              :             END DO
    1772     26609091 :             IF (nproducts == 1) THEN
    1773     25241334 :                eri_src => p_work
    1774              :             ELSE
    1775      1367757 :                eri_src => work
    1776              :             END IF
    1777    587762658 :             DO i = 1, mysize
    1778    587762658 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1779              :             END DO
    1780     26609091 :             tmp_max = tmp_max*max_contraction
    1781     26609091 :             IF (tmp_max < eps_schwarz) THEN
    1782              :                RETURN
    1783              :             END IF
    1784              : 
    1785     51699016 :             DO k = 1, ncoc
    1786     30746492 :                p1 = (k - 1)*ncod
    1787     86980216 :                DO l = 1, ncod
    1788     35281200 :                   p2 = (p1 + l - 1)*ncoa
    1789    225920178 :                   DO i = 1, ncoa
    1790    159892486 :                      p3 = (p2 + i - 1)*ncob
    1791    658611942 :                      DO j = 1, ncob
    1792    463438256 :                         p4 = p3 + j
    1793    623330742 :                         work2(i, j, k, l) = eri_src(p4)
    1794              :                      END DO
    1795              :                   END DO
    1796              :                END DO
    1797              :             END DO
    1798              :          CASE (6)
    1799     40462358 :             DO i = 1, nproducts
    1800    108387324 :                A = pgf_product_list(i)%ra
    1801    108387324 :                B = pgf_product_list(i)%rb
    1802    108387324 :                C = pgf_product_list(i)%rc
    1803    108387324 :                D = pgf_product_list(i)%rd
    1804     27096831 :                Rho = pgf_product_list(i)%Rho
    1805     27096831 :                RhoInv = pgf_product_list(i)%RhoInv
    1806    108387324 :                P = pgf_product_list(i)%P
    1807    108387324 :                Q = pgf_product_list(i)%Q
    1808    108387324 :                W = pgf_product_list(i)%W
    1809    108387324 :                AB = pgf_product_list(i)%AB
    1810    108387324 :                CD = pgf_product_list(i)%CD
    1811     27096831 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1812     97609575 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1813              : 
    1814              :                CALL build_quartet_data(libint, C, D, B, A, &
    1815              :                                        EtaInv, ZetaInv, ZetapEtaInv, Rho, &
    1816     27096831 :                                        Q, P, W, m_max, F)
    1817              : 
    1818     27096831 :                CALL cp_libint_get_eris(n_a, n_b, n_d, n_c, libint, p_work, a_mysize)
    1819    343528467 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1820     40462358 :                neris = neris + mysize
    1821              :             END DO
    1822     13365527 :             IF (nproducts == 1) THEN
    1823     12705188 :                eri_src => p_work
    1824              :             ELSE
    1825       660339 :                eri_src => work
    1826              :             END IF
    1827    219809296 :             DO i = 1, mysize
    1828    219809296 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1829              :             END DO
    1830     13365527 :             tmp_max = tmp_max*max_contraction
    1831     13365527 :             IF (tmp_max < eps_schwarz) THEN
    1832              :                RETURN
    1833              :             END IF
    1834              : 
    1835     22460211 :             DO k = 1, ncoc
    1836     13064108 :                p1 = (k - 1)*ncod
    1837     37662233 :                DO l = 1, ncod
    1838     15202022 :                   p2 = (p1 + l - 1)*ncob
    1839    104038669 :                   DO j = 1, ncob
    1840     75772539 :                      p3 = (p2 + j - 1)*ncoa
    1841    248657308 :                      DO i = 1, ncoa
    1842    157682747 :                         p4 = p3 + i
    1843    233455286 :                         work2(i, j, k, l) = eri_src(p4)
    1844              :                      END DO
    1845              :                   END DO
    1846              :                END DO
    1847              :             END DO
    1848              :          CASE (7)
    1849     17741929 :             DO i = 1, nproducts
    1850     49120360 :                A = pgf_product_list(i)%ra
    1851     49120360 :                B = pgf_product_list(i)%rb
    1852     49120360 :                C = pgf_product_list(i)%rc
    1853     49120360 :                D = pgf_product_list(i)%rd
    1854     12280090 :                Rho = pgf_product_list(i)%Rho
    1855     12280090 :                RhoInv = pgf_product_list(i)%RhoInv
    1856     49120360 :                P = pgf_product_list(i)%P
    1857     49120360 :                Q = pgf_product_list(i)%Q
    1858     49120360 :                W = pgf_product_list(i)%W
    1859     49120360 :                AB = pgf_product_list(i)%AB
    1860     49120360 :                CD = pgf_product_list(i)%CD
    1861     12280090 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1862     65760204 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1863              : 
    1864              :                CALL build_quartet_data(libint, D, C, A, B, &
    1865              :                                        EtaInv, ZetaInv, ZetapEtaInv, Rho, &
    1866     12280090 :                                        Q, P, W, m_max, F)
    1867              : 
    1868     12280090 :                CALL cp_libint_get_eris(n_b, n_a, n_c, n_d, libint, p_work, a_mysize)
    1869    473619280 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1870     17741929 :                neris = neris + mysize
    1871              :             END DO
    1872      5461839 :             IF (nproducts == 1) THEN
    1873      5204308 :                eri_src => p_work
    1874              :             ELSE
    1875       257531 :                eri_src => work
    1876              :             END IF
    1877    356937860 :             DO i = 1, mysize
    1878    356937860 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1879              :             END DO
    1880      5461839 :             tmp_max = tmp_max*max_contraction
    1881      5461839 :             IF (tmp_max < eps_schwarz) THEN
    1882              :                RETURN
    1883              :             END IF
    1884              : 
    1885     17633404 :             DO l = 1, ncod
    1886     13658476 :                p1 = (l - 1)*ncoc
    1887     32972424 :                DO k = 1, ncoc
    1888     15339020 :                   p2 = (p1 + k - 1)*ncoa
    1889    108126153 :                   DO i = 1, ncoa
    1890     79128657 :                      p3 = (p2 + i - 1)*ncob
    1891    380920368 :                      DO j = 1, ncob
    1892    286452691 :                         p4 = p3 + j
    1893    365581348 :                         work2(i, j, k, l) = eri_src(p4)
    1894              :                      END DO
    1895              :                   END DO
    1896              :                END DO
    1897              :             END DO
    1898              :          CASE (8)
    1899      5314258 :             DO i = 1, nproducts
    1900     12815088 :                A = pgf_product_list(i)%ra
    1901     12815088 :                B = pgf_product_list(i)%rb
    1902     12815088 :                C = pgf_product_list(i)%rc
    1903     12815088 :                D = pgf_product_list(i)%rd
    1904      3203772 :                Rho = pgf_product_list(i)%Rho
    1905      3203772 :                RhoInv = pgf_product_list(i)%RhoInv
    1906     12815088 :                P = pgf_product_list(i)%P
    1907     12815088 :                Q = pgf_product_list(i)%Q
    1908     12815088 :                W = pgf_product_list(i)%W
    1909     12815088 :                AB = pgf_product_list(i)%AB
    1910     12815088 :                CD = pgf_product_list(i)%CD
    1911      3203772 :                ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1912     18196977 :                F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1913              : 
    1914              :                CALL build_quartet_data(libint, D, C, B, A, &
    1915              :                                        EtaInv, ZetaInv, ZetapEtaInv, Rho, &
    1916      3203772 :                                        Q, P, W, m_max, F)
    1917              : 
    1918      3203772 :                CALL cp_libint_get_eris(n_a, n_b, n_c, n_d, libint, p_work, a_mysize)
    1919     95679816 :                IF (nproducts > 1) work(1:mysize) = work(1:mysize) + p_work(1:mysize)
    1920      5314258 :                neris = neris + mysize
    1921              :             END DO
    1922      2110486 :             IF (nproducts == 1) THEN
    1923      2050185 :                eri_src => p_work
    1924              :             ELSE
    1925        60301 :                eri_src => work
    1926              :             END IF
    1927    109939570 :             DO i = 1, mysize
    1928    109939570 :                tmp_max = MAX(tmp_max, ABS(eri_src(i)))
    1929              :             END DO
    1930      2110486 :             tmp_max = tmp_max*max_contraction
    1931      2110486 :             IF (tmp_max < eps_schwarz) THEN
    1932              :                RETURN
    1933              :             END IF
    1934              : 
    1935    145284148 :             DO l = 1, ncod
    1936      5906323 :                p1 = (l - 1)*ncoc
    1937     13536804 :                DO k = 1, ncoc
    1938      5966643 :                   p2 = (p1 + k - 1)*ncob
    1939     48742708 :                   DO j = 1, ncob
    1940     36869742 :                      p3 = (p2 + j - 1)*ncoa
    1941    129303237 :                      DO i = 1, ncoa
    1942     86466852 :                         p4 = p3 + i
    1943    123336594 :                         work2(i, j, k, l) = eri_src(p4)
    1944              :                      END DO
    1945              :                   END DO
    1946              :                END DO
    1947              :             END DO
    1948              :          END SELECT
    1949              :       ELSE
    1950     36261907 :          work(1) = 0.0_dp
    1951    160450054 :          DO i = 1, nproducts
    1952    496752588 :             A = pgf_product_list(i)%ra
    1953    496752588 :             B = pgf_product_list(i)%rb
    1954    496752588 :             C = pgf_product_list(i)%rc
    1955    496752588 :             D = pgf_product_list(i)%rd
    1956    124188147 :             Rho = pgf_product_list(i)%Rho
    1957    124188147 :             RhoInv = pgf_product_list(i)%RhoInv
    1958    496752588 :             P = pgf_product_list(i)%P
    1959    496752588 :             Q = pgf_product_list(i)%Q
    1960    496752588 :             W = pgf_product_list(i)%W
    1961    124188147 :             ZetapEtaInv = pgf_product_list(i)%ZetapEtaInv
    1962    248376294 :             F(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
    1963              : 
    1964              :             CALL build_quartet_data(libint, A, B, C, D, & !todo: check
    1965              :                                     ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    1966    124188147 :                                     P, Q, W, m_max, F)
    1967    124188147 :             work(1) = work(1) + F(1)
    1968    160450054 :             neris = neris + mysize
    1969              :          END DO
    1970     36261907 :          work2(1, 1, 1, 1) = work(1)
    1971     36261907 :          tmp_max = max_contraction*ABS(work(1))
    1972     36261907 :          IF (tmp_max < eps_schwarz) RETURN
    1973              :       END IF
    1974              : 
    1975    142951727 :       IF (tmp_max < eps_schwarz) RETURN
    1976              :       direct_contract = (s_offset_a == 0 .AND. s_offset_b == 0 .AND. &
    1977              :                          s_offset_c == 0 .AND. s_offset_d == 0 .AND. &
    1978              :                          nsgfa == nsoa*nl_a .AND. nsgfb == nsob*nl_b .AND. &
    1979    142951727 :                          nsgfc == nsoc*nl_c .AND. nsgfd == nsod*nl_d)
    1980              :       IF (direct_contract) THEN
    1981              :          CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1982              :                        n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2, &
    1983              :                        sphi_a, &
    1984              :                        sphi_b, &
    1985              :                        sphi_c, &
    1986              :                        sphi_d, &
    1987              :                        primitives, &
    1988     30991082 :                        buffer1, buffer2)
    1989              :       ELSE
    1990   8152798261 :          primitives_tmp = 0.0_dp
    1991              : 
    1992              :          CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
    1993              :                        n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2, &
    1994              :                        sphi_a, &
    1995              :                        sphi_b, &
    1996              :                        sphi_c, &
    1997              :                        sphi_d, &
    1998              :                        primitives_tmp, &
    1999    111960645 :                        buffer1, buffer2)
    2000              : 
    2001              :          primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    2002              :                     s_offset_b + 1:s_offset_b + nsob*nl_b, &
    2003              :                     s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    2004              :                     s_offset_d + 1:s_offset_d + nsod*nl_d) = &
    2005              :             primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
    2006              :                        s_offset_b + 1:s_offset_b + nsob*nl_b, &
    2007              :                        s_offset_c + 1:s_offset_c + nsoc*nl_c, &
    2008   8152798261 :                        s_offset_d + 1:s_offset_d + nsod*nl_d) + primitives_tmp(:, :, :, :)
    2009              :       END IF
    2010              : 
    2011    173975894 :    END SUBROUTINE evaluate_eri
    2012              : 
    2013              : ! **************************************************************************************************
    2014              : !> \brief Fill data structure used in libint
    2015              : !> \param libint ...
    2016              : !> \param A ...
    2017              : !> \param B ...
    2018              : !> \param C ...
    2019              : !> \param D ...
    2020              : !> \param ZetaInv ...
    2021              : !> \param EtaInv ...
    2022              : !> \param ZetapEtaInv ...
    2023              : !> \param Rho ...
    2024              : !> \param P ...
    2025              : !> \param Q ...
    2026              : !> \param W ...
    2027              : !> \param m_max ...
    2028              : !> \param F ...
    2029              : !> \par History
    2030              : !>      03.2007 created [Manuel Guidon]
    2031              : !> \author Manuel Guidon
    2032              : ! **************************************************************************************************
    2033    514203017 :    SUBROUTINE build_quartet_data(libint, A, B, C, D, &
    2034              :                                  ZetaInv, EtaInv, ZetapEtaInv, Rho, &
    2035    514203017 :                                  P, Q, W, m_max, F)
    2036              : 
    2037              :       TYPE(cp_libint_t)                                  :: libint
    2038              :       REAL(KIND=dp), INTENT(IN)                          :: A(3), B(3), C(3), D(3)
    2039              :       REAL(dp), INTENT(IN)                               :: ZetaInv, EtaInv, ZetapEtaInv, Rho, P(3), &
    2040              :                                                             Q(3), W(3)
    2041              :       INTEGER, INTENT(IN)                                :: m_max
    2042              :       REAL(KIND=dp), DIMENSION(:)                        :: F
    2043              : 
    2044    514203017 :       CALL cp_libint_set_params_eri(libint, A, B, C, D, ZetaInv, EtaInv, ZetapEtaInv, Rho, P, Q, W, m_max, F)
    2045    514203017 :    END SUBROUTINE build_quartet_data
    2046              : 
    2047              : END MODULE hfx_libint_interface
        

Generated by: LCOV version 2.0-1