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

            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 Initialization for solid harmonic Gaussian (SHG) integral scheme. Scheme for calculation
      10              : !>        of contracted, spherical Gaussian integrals using the solid harmonics. Initialization of
      11              : !>        the contraction matrices
      12              : !> \par History
      13              : !>      created [08.2016]
      14              : !> \author Dorothea Golze
      15              : ! **************************************************************************************************
      16              : MODULE generic_shg_integrals_init
      17              :    USE basis_set_types,                 ONLY: gto_basis_set_type
      18              :    USE kinds,                           ONLY: dp
      19              :    USE mathconstants,                   ONLY: fac,&
      20              :                                               ifac,&
      21              :                                               pi
      22              : #include "../base/base_uses.f90"
      23              : 
      24              :    IMPLICIT NONE
      25              : 
      26              :    PRIVATE
      27              : 
      28              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'generic_shg_integrals_init'
      29              : 
      30              :    PUBLIC :: contraction_matrix_shg, contraction_matrix_shg_mix, contraction_matrix_shg_rx2m
      31              : 
      32              : ! **************************************************************************************************
      33              : 
      34              : CONTAINS
      35              : 
      36              : ! **************************************************************************************************
      37              : !> \brief contraction matrix for SHG integrals
      38              : !> \param basis ...
      39              : !> \param scon_shg contraction matrix
      40              : ! **************************************************************************************************
      41     15393246 :    SUBROUTINE contraction_matrix_shg(basis, scon_shg)
      42              : 
      43              :       TYPE(gto_basis_set_type), POINTER                  :: basis
      44              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: scon_shg
      45              : 
      46              :       INTEGER                                            :: ipgf, iset, ishell, l, maxpgf, maxshell, &
      47              :                                                             nset
      48     15393246 :       INTEGER, DIMENSION(:), POINTER                     :: npgf, nshell
      49              :       REAL(KIND=dp)                                      :: aif, gcc
      50     15393246 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: norm
      51     15393246 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: zet
      52              : 
      53     15393246 :       nset = basis%nset
      54     15393246 :       npgf => basis%npgf
      55     15393246 :       nshell => basis%nshell
      56     15393246 :       zet => basis%zet
      57              : 
      58     15393246 :       maxpgf = SIZE(basis%gcc, 1)
      59     15393246 :       maxshell = SIZE(basis%gcc, 2)
      60     61572984 :       ALLOCATE (norm(basis%nset, maxshell))
      61     76966230 :       ALLOCATE (scon_shg(maxpgf, maxshell, nset))
      62     86076268 :       scon_shg = 0.0_dp
      63              : 
      64     15393246 :       CALL basis_norm_shg(basis, norm)
      65              : 
      66     38949850 :       DO iset = 1, nset
      67     62509444 :          DO ishell = 1, nshell(iset)
      68     23559594 :             l = basis%l(ishell, iset)
      69     70679416 :             DO ipgf = 1, npgf(iset)
      70     23563218 :                aif = 1.0_dp/((2._dp*zet(ipgf, iset))**l)
      71     23563218 :                gcc = basis%gcc(ipgf, ishell, iset)
      72     47122812 :                scon_shg(ipgf, ishell, iset) = norm(iset, ishell)*gcc*aif
      73              :             END DO
      74              :          END DO
      75              :       END DO
      76              : 
      77     15393246 :       DEALLOCATE (norm)
      78              : 
      79     15393246 :    END SUBROUTINE contraction_matrix_shg
      80              : 
      81              : !***************************************************************************************************
      82              : !> \brief normalization solid harmonic Gaussians (SHG)
      83              : !> \param basis ...
      84              : !> \param norm ...
      85              : ! **************************************************************************************************
      86     15393546 :    SUBROUTINE basis_norm_shg(basis, norm)
      87              : 
      88              :       TYPE(gto_basis_set_type), POINTER                  :: basis
      89              :       REAL(dp), DIMENSION(:, :), INTENT(INOUT)           :: norm
      90              : 
      91              :       INTEGER                                            :: ipgf, iset, ishell, jpgf, l
      92              :       REAL(KIND=dp)                                      :: aai, aaj, cci, ccj, expa, ppl
      93              : 
      94     54355594 :       norm = 0._dp
      95              : 
      96     38952086 :       DO iset = 1, basis%nset
      97     62516644 :          DO ishell = 1, basis%nshell(iset)
      98     23564558 :             l = basis%l(ishell, iset)
      99     23564558 :             expa = 0.5_dp*REAL(2*l + 3, dp)
     100     23564558 :             ppl = fac(2*l + 2)*pi**(1.5_dp)/fac(l + 1)
     101     23564558 :             ppl = ppl/(2._dp**REAL(2*l + 1, dp))
     102     23564558 :             ppl = ppl/REAL(2*l + 1, dp)
     103     47136364 :             DO ipgf = 1, basis%npgf(iset)
     104     23571806 :                cci = basis%gcc(ipgf, ishell, iset)
     105     23571806 :                aai = basis%zet(ipgf, iset)
     106     70756426 :                DO jpgf = 1, basis%npgf(iset)
     107     23620062 :                   ccj = basis%gcc(jpgf, ishell, iset)
     108     23620062 :                   aaj = basis%zet(jpgf, iset)
     109     47191868 :                   norm(iset, ishell) = norm(iset, ishell) + cci*ccj*ppl/(aai + aaj)**expa
     110              :                END DO
     111              :             END DO
     112     47123098 :             norm(iset, ishell) = 1.0_dp/SQRT(norm(iset, ishell))
     113              :          END DO
     114              :       END DO
     115              : 
     116     15393546 :    END SUBROUTINE basis_norm_shg
     117              : 
     118              : ! **************************************************************************************************
     119              : !> \brief mixed contraction matrix for SHG integrals [aba] and [abb] for orbital and ri basis
     120              : !>        at the same atom
     121              : !> \param orb_basis orbital basis
     122              : !> \param ri_basis   ...
     123              : !> \param orb_index index for orbital basis
     124              : !> \param ri_index index for ri basis
     125              : !> \param scon_mix mixed contraction matrix
     126              : ! **************************************************************************************************
     127          150 :    SUBROUTINE contraction_matrix_shg_mix(orb_basis, ri_basis, orb_index, ri_index, scon_mix)
     128              : 
     129              :       TYPE(gto_basis_set_type), POINTER                  :: orb_basis, ri_basis
     130              :       INTEGER, DIMENSION(:, :, :), POINTER               :: orb_index, ri_index
     131              :       REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER      :: scon_mix
     132              : 
     133              :       INTEGER :: forb, fri, iil, il, ipgf, iset, ishell, jpgf, jset, jshell, l, l1, l2, lmax_orb, &
     134              :          lmax_ri, maxpgf_orb, maxpgf_ri, maxshell_orb, maxshell_ri, nf_orb, nf_ri, nl, nl_max, &
     135              :          nset_orb, nset_ri
     136          150 :       INTEGER, DIMENSION(:), POINTER                     :: npgf_orb, npgf_ri, nshell_orb, nshell_ri
     137              :       REAL(KIND=dp)                                      :: cjf, const, const1, const2, gcc_orb, &
     138              :                                                             gcc_ri, prefac, scon1, scon2, zet
     139          150 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: shg_fac
     140          150 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: norm_orb, norm_ri, zet_orb, zet_ri
     141              : 
     142          150 :       nset_orb = orb_basis%nset
     143          150 :       npgf_orb => orb_basis%npgf
     144          150 :       nshell_orb => orb_basis%nshell
     145          150 :       zet_orb => orb_basis%zet
     146          150 :       nset_ri = ri_basis%nset
     147          150 :       npgf_ri => ri_basis%npgf
     148          150 :       nshell_ri => ri_basis%nshell
     149          150 :       zet_ri => ri_basis%zet
     150              : 
     151          150 :       maxpgf_orb = SIZE(orb_basis%gcc, 1)
     152          150 :       maxshell_orb = SIZE(orb_basis%gcc, 2)
     153          600 :       ALLOCATE (norm_orb(nset_orb, maxshell_orb))
     154          150 :       maxpgf_ri = SIZE(ri_basis%gcc, 1)
     155          150 :       maxshell_ri = SIZE(ri_basis%gcc, 2)
     156          600 :       ALLOCATE (norm_ri(nset_ri, maxshell_ri))
     157              : 
     158          150 :       CALL basis_norm_shg(orb_basis, norm_orb)
     159          150 :       CALL basis_norm_shg(ri_basis, norm_ri)
     160              : 
     161          750 :       ALLOCATE (orb_index(maxpgf_orb, maxshell_orb, nset_orb))
     162          750 :       ALLOCATE (ri_index(maxpgf_ri, maxshell_ri, nset_ri))
     163              : 
     164              :       !** index orbital basis set
     165          150 :       nf_orb = 0
     166          344 :       DO iset = 1, nset_orb
     167          864 :          DO ishell = 1, nshell_orb(iset)
     168         4094 :             DO ipgf = 1, npgf_orb(iset)
     169         3380 :                nf_orb = nf_orb + 1
     170         3900 :                orb_index(ipgf, ishell, iset) = nf_orb
     171              :             END DO
     172              :          END DO
     173              :       END DO
     174              : 
     175              :       !** index ri basis set
     176              :       nf_ri = 0
     177         1892 :       DO iset = 1, nset_ri
     178         6336 :          DO ishell = 1, nshell_ri(iset)
     179        11394 :             DO ipgf = 1, npgf_ri(iset)
     180         5208 :                nf_ri = nf_ri + 1
     181         9652 :                ri_index(ipgf, ishell, iset) = nf_ri
     182              :             END DO
     183              :          END DO
     184              :       END DO
     185              : 
     186          344 :       lmax_orb = MAXVAL(orb_basis%lmax)
     187         1892 :       lmax_ri = MAXVAL(ri_basis%lmax)
     188          150 :       nl_max = INT((lmax_orb + lmax_ri)/2) + 1
     189          900 :       ALLOCATE (scon_mix(nl_max, nf_ri, nf_orb, nl_max))
     190      2043224 :       scon_mix = 0.0_dp
     191              : 
     192          450 :       ALLOCATE (shg_fac(0:nl_max - 1))
     193          150 :       shg_fac(0) = 1.0_dp
     194              : 
     195          344 :       DO iset = 1, nset_orb
     196          864 :          DO ishell = 1, nshell_orb(iset)
     197          520 :             l1 = orb_basis%l(ishell, iset)
     198          520 :             const1 = SQRT(1.0_dp/REAL(2*l1 + 1, dp))
     199         7054 :             DO jset = 1, nset_ri
     200        23662 :                DO jshell = 1, nshell_ri(jset)
     201        16802 :                   l2 = ri_basis%l(jshell, jset)
     202        16802 :                   const2 = SQRT(1.0_dp/REAL(2*l2 + 1, dp))
     203        16802 :                   nl = INT((l1 + l2)/2)
     204        16802 :                   IF (l1 == 0 .OR. l2 == 0) nl = 0
     205        48748 :                   DO il = 0, nl
     206        25606 :                      l = l1 + l2 - 2*il
     207        25606 :                      const = const1*const2*2.0_dp*SQRT(pi*REAL(2*l + 1, dp))
     208        37330 :                      DO iil = 1, il
     209              :                         shg_fac(iil) = fac(l + iil - 1)*ifac(l)*REAL(l, dp) &
     210        37330 :                                        *fac(il)/fac(il - iil)/fac(iil)
     211              :                      END DO
     212       216144 :                      DO ipgf = 1, npgf_orb(iset)
     213       173736 :                         forb = orb_index(ipgf, ishell, iset)
     214       173736 :                         gcc_orb = orb_basis%gcc(ipgf, ishell, iset)
     215       173736 :                         scon1 = norm_orb(iset, ishell)*gcc_orb
     216       397072 :                         DO jpgf = 1, npgf_ri(jset)
     217       197730 :                            fri = ri_index(jpgf, jshell, jset)
     218       197730 :                            gcc_ri = ri_basis%gcc(jpgf, jshell, jset)
     219       197730 :                            scon2 = norm_ri(jset, jshell)*gcc_ri
     220       197730 :                            zet = zet_orb(ipgf, iset) + zet_ri(jpgf, jset)
     221       197730 :                            cjf = 1.0_dp/((2._dp*zet)**l)
     222       197730 :                            prefac = const*cjf*scon1*scon2
     223       655656 :                            DO iil = 0, il
     224       481920 :                               scon_mix(iil + 1, fri, forb, il + 1) = prefac*shg_fac(iil)/zet**iil
     225              :                            END DO
     226              :                         END DO
     227              :                      END DO
     228              :                   END DO
     229              :                END DO
     230              :             END DO
     231              :          END DO
     232              :       END DO
     233              : 
     234          150 :       DEALLOCATE (norm_orb, norm_ri, shg_fac)
     235              : 
     236          150 :    END SUBROUTINE contraction_matrix_shg_mix
     237              : 
     238              : ! **************************************************************************************************
     239              : !> \brief ...
     240              : !> \param basis ...
     241              : !> \param m ...
     242              : !> \param scon_shg ...
     243              : !> \param scon_rx2m ...
     244              : ! **************************************************************************************************
     245            2 :    SUBROUTINE contraction_matrix_shg_rx2m(basis, m, scon_shg, scon_rx2m)
     246              : 
     247              :       TYPE(gto_basis_set_type), POINTER                  :: basis
     248              :       INTEGER, INTENT(IN)                                :: m
     249              :       REAL(KIND=dp), DIMENSION(:, :, :), INTENT(IN)      :: scon_shg
     250              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :)  :: scon_rx2m
     251              : 
     252              :       INTEGER                                            :: ipgf, iset, ishell, j, l, maxpgf, &
     253              :                                                             maxshell, nset
     254            2 :       INTEGER, DIMENSION(:), POINTER                     :: npgf, nshell
     255            2 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: shg_fac
     256            2 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: zet
     257              : 
     258            2 :       npgf => basis%npgf
     259            2 :       nshell => basis%nshell
     260            2 :       zet => basis%zet
     261            2 :       nset = basis%nset
     262              : 
     263            2 :       maxpgf = SIZE(basis%gcc, 1)
     264            2 :       maxshell = SIZE(basis%gcc, 2)
     265           12 :       ALLOCATE (scon_rx2m(maxpgf, m + 1, maxshell, nset))
     266            2 :       scon_rx2m = 0.0_dp
     267            6 :       ALLOCATE (shg_fac(0:m))
     268            2 :       shg_fac(0) = 1.0_dp
     269              : 
     270           22 :       DO iset = 1, nset
     271           88 :          DO ishell = 1, nshell(iset)
     272           66 :             l = basis%l(ishell, iset)
     273          264 :             DO j = 1, m
     274              :                shg_fac(j) = fac(l + j - 1)*ifac(l)*REAL(l, dp) &
     275          264 :                             *fac(m)/fac(m - j)/fac(j)
     276              :             END DO
     277          152 :             DO ipgf = 1, npgf(iset)
     278          396 :                DO j = 0, m
     279              :                   scon_rx2m(ipgf, j + 1, ishell, iset) = scon_shg(ipgf, ishell, iset) &
     280          330 :                                                          *shg_fac(j)/zet(ipgf, iset)**j
     281              :                END DO
     282              :             END DO
     283              :          END DO
     284              :       END DO
     285              : 
     286            2 :       DEALLOCATE (shg_fac)
     287              : 
     288            2 :    END SUBROUTINE contraction_matrix_shg_rx2m
     289              : 
     290              : END MODULE generic_shg_integrals_init
        

Generated by: LCOV version 2.0-1