LCOV - code coverage report
Current view: top level - src/aobasis - aux_basis_set.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 115 115 100.0 %
Date: 2024-11-21 06:45:46 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \par History
      10             : !>      none
      11             : !> \author JGH (11.2017)
      12             : ! **************************************************************************************************
      13             : MODULE aux_basis_set
      14             : 
      15             :    USE basis_set_types,                 ONLY: gto_basis_set_type
      16             :    USE kinds,                           ONLY: default_string_length,&
      17             :                                               dp
      18             :    USE lapack,                          ONLY: lapack_spotrf
      19             :    USE orbital_pointers,                ONLY: indco,&
      20             :                                               nco,&
      21             :                                               ncoset,&
      22             :                                               nso
      23             :    USE orbital_symbols,                 ONLY: cgf_symbol,&
      24             :                                               sgf_symbol
      25             : #include "../base/base_uses.f90"
      26             : 
      27             :    IMPLICIT NONE
      28             : 
      29             :    PRIVATE
      30             : 
      31             : ! *** Global parameters (only in this module)
      32             : 
      33             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'aux_basis_set'
      34             : 
      35             : ! *** Public subroutines ***
      36             : 
      37             :    PUBLIC :: create_aux_basis
      38             : 
      39             : CONTAINS
      40             : 
      41             : ! **************************************************************************************************
      42             : !> \brief create a basis in GTO form
      43             : !> \param aux_basis ...
      44             : !> \param bsname ...
      45             : !> \param nsets ...
      46             : !> \param lmin ...
      47             : !> \param lmax ...
      48             : !> \param nl ...
      49             : !> \param npgf ...
      50             : !> \param zet ...
      51             : !> \version 1.0
      52             : ! **************************************************************************************************
      53         308 :    SUBROUTINE create_aux_basis(aux_basis, bsname, nsets, lmin, lmax, nl, npgf, zet)
      54             : 
      55             :       TYPE(gto_basis_set_type), POINTER                  :: aux_basis
      56             :       CHARACTER(LEN=default_string_length)               :: bsname
      57             :       INTEGER, INTENT(IN)                                :: nsets
      58             :       INTEGER, DIMENSION(:), INTENT(IN)                  :: lmin, lmax
      59             :       INTEGER, DIMENSION(0:, :), INTENT(IN)              :: nl
      60             :       INTEGER, DIMENSION(:), INTENT(IN)                  :: npgf
      61             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: zet
      62             : 
      63             :       INTEGER                                            :: i, ico, info, iset, ishell, j, l, &
      64             :                                                             lshell, m, maxco, maxpgf, maxshell, &
      65             :                                                             ncgf, ns, nsgf, nx
      66             :       REAL(KIND=dp)                                      :: za, zb, zetab
      67         308 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: so
      68             : 
      69         308 :       CPASSERT(.NOT. ASSOCIATED(aux_basis))
      70         308 :       ALLOCATE (aux_basis)
      71             :       !
      72         308 :       aux_basis%name = bsname
      73         308 :       aux_basis%aliases = bsname
      74         308 :       aux_basis%nset = nsets
      75             :       !
      76             :       ALLOCATE (aux_basis%npgf(nsets), aux_basis%nshell(nsets), &
      77        1848 :                 aux_basis%lmax(nsets), aux_basis%lmin(nsets))
      78        1316 :       aux_basis%lmax(1:nsets) = lmax(1:nsets)
      79        1316 :       aux_basis%lmin(1:nsets) = lmin(1:nsets)
      80        1316 :       aux_basis%npgf(1:nsets) = npgf(1:nsets)
      81        1316 :       DO iset = 1, nsets
      82        1008 :          aux_basis%nshell(iset) = 0
      83        3218 :          DO l = lmin(iset), lmax(iset)
      84        2910 :             aux_basis%nshell(iset) = aux_basis%nshell(iset) + nl(l, iset)
      85             :          END DO
      86             :       END DO
      87        1316 :       maxpgf = MAXVAL(npgf(1:nsets))
      88        1316 :       maxshell = MAXVAL(aux_basis%nshell(1:nsets))
      89        1232 :       ALLOCATE (aux_basis%zet(maxpgf, nsets))
      90        6474 :       aux_basis%zet(1:maxpgf, 1:nsets) = zet(1:maxpgf, 1:nsets)
      91             : 
      92        1232 :       ALLOCATE (aux_basis%n(maxshell, nsets))
      93         924 :       ALLOCATE (aux_basis%l(maxshell, nsets))
      94        1540 :       ALLOCATE (aux_basis%gcc(maxpgf, maxshell, nsets))
      95             : 
      96        1316 :       DO iset = 1, nsets
      97        1008 :          ns = 0
      98        3218 :          DO l = lmin(iset), lmax(iset)
      99        8990 :             DO i = 1, nl(l, iset)
     100        6080 :                ns = ns + 1
     101        6080 :                aux_basis%l(ns, iset) = l
     102        7982 :                aux_basis%n(ns, iset) = l + i
     103             :             END DO
     104             :          END DO
     105             :       END DO
     106             : 
     107             :       ! contraction
     108      102442 :       aux_basis%gcc = 0.0_dp
     109        1316 :       DO iset = 1, nsets
     110        1008 :          ns = 0
     111        3218 :          DO l = lmin(iset), lmax(iset)
     112        1902 :             nx = aux_basis%npgf(iset)
     113        7608 :             ALLOCATE (so(nx, nx))
     114        1902 :             CPASSERT(nx >= nl(l, iset))
     115        8898 :             DO i = 1, nx
     116        6996 :                za = (2.0_dp*zet(i, iset))**(0.25_dp*(2*l + 3))
     117       41578 :                DO j = i, nx
     118       32680 :                   zb = (2.0_dp*zet(j, iset))**(0.25_dp*(2*l + 3))
     119       32680 :                   zetab = zet(i, iset) + zet(j, iset)
     120       32680 :                   so(i, j) = za*zb/zetab**(l + 1.5_dp)
     121       39676 :                   so(j, i) = so(i, j)
     122             :                END DO
     123             :             END DO
     124        1902 :             info = 0
     125        1902 :             CALL lapack_spotrf("U", nx, so, nx, info)
     126        1902 :             CPASSERT(info == 0)
     127        1902 :             CALL dtrtri("U", "N", nx, so, nx, info)
     128        1902 :             CPASSERT(info == 0)
     129        7982 :             DO i = ns + 1, ns + nl(l, iset)
     130       32048 :                DO j = 1, i - ns
     131       30146 :                   aux_basis%gcc(j, i, iset) = so(j, i - ns)
     132             :                END DO
     133             :             END DO
     134        1902 :             IF (nl(l, iset) < nx) THEN
     135         326 :                i = ns + nl(l, iset)
     136        1242 :                DO j = nl(l, iset) + 1, nx
     137        1242 :                   aux_basis%gcc(j, i, iset) = 1.0_dp
     138             :                END DO
     139             :             END IF
     140        1902 :             ns = ns + nl(l, iset)
     141        2910 :             DEALLOCATE (so)
     142             :          END DO
     143             :       END DO
     144             : 
     145             :       ! Initialise the depending aux_basis structures
     146         924 :       ALLOCATE (aux_basis%first_cgf(maxshell, nsets))
     147         924 :       ALLOCATE (aux_basis%first_sgf(maxshell, nsets))
     148         924 :       ALLOCATE (aux_basis%last_cgf(maxshell, nsets))
     149         924 :       ALLOCATE (aux_basis%last_sgf(maxshell, nsets))
     150         616 :       ALLOCATE (aux_basis%ncgf_set(nsets))
     151         616 :       ALLOCATE (aux_basis%nsgf_set(nsets))
     152             : 
     153         308 :       maxco = 0
     154         308 :       ncgf = 0
     155         308 :       nsgf = 0
     156        1316 :       DO iset = 1, nsets
     157        1008 :          aux_basis%ncgf_set(iset) = 0
     158        1008 :          aux_basis%nsgf_set(iset) = 0
     159        7088 :          DO ishell = 1, aux_basis%nshell(iset)
     160        6080 :             lshell = aux_basis%l(ishell, iset)
     161        6080 :             aux_basis%first_cgf(ishell, iset) = ncgf + 1
     162        6080 :             ncgf = ncgf + nco(lshell)
     163        6080 :             aux_basis%last_cgf(ishell, iset) = ncgf
     164             :             aux_basis%ncgf_set(iset) = &
     165        6080 :                aux_basis%ncgf_set(iset) + nco(lshell)
     166        6080 :             aux_basis%first_sgf(ishell, iset) = nsgf + 1
     167        6080 :             nsgf = nsgf + nso(lshell)
     168        6080 :             aux_basis%last_sgf(ishell, iset) = nsgf
     169             :             aux_basis%nsgf_set(iset) = &
     170        7088 :                aux_basis%nsgf_set(iset) + nso(lshell)
     171             :          END DO
     172        1316 :          maxco = MAX(maxco, npgf(iset)*ncoset(lmax(iset)))
     173             :       END DO
     174         308 :       aux_basis%ncgf = ncgf
     175         308 :       aux_basis%nsgf = nsgf
     176             : 
     177         924 :       ALLOCATE (aux_basis%lx(ncgf))
     178         616 :       ALLOCATE (aux_basis%ly(ncgf))
     179         616 :       ALLOCATE (aux_basis%lz(ncgf))
     180         924 :       ALLOCATE (aux_basis%m(nsgf))
     181         924 :       ALLOCATE (aux_basis%cgf_symbol(ncgf))
     182         924 :       ALLOCATE (aux_basis%sgf_symbol(nsgf))
     183             : 
     184         308 :       ncgf = 0
     185         308 :       nsgf = 0
     186             : 
     187        1316 :       DO iset = 1, nsets
     188        7396 :          DO ishell = 1, aux_basis%nshell(iset)
     189        6080 :             lshell = aux_basis%l(ishell, iset)
     190       25652 :             DO ico = ncoset(lshell - 1) + 1, ncoset(lshell)
     191       19572 :                ncgf = ncgf + 1
     192       19572 :                aux_basis%lx(ncgf) = indco(1, ico)
     193       19572 :                aux_basis%ly(ncgf) = indco(2, ico)
     194       19572 :                aux_basis%lz(ncgf) = indco(3, ico)
     195             :                aux_basis%cgf_symbol(ncgf) = &
     196             :                   cgf_symbol(aux_basis%n(ishell, iset), (/aux_basis%lx(ncgf), &
     197             :                                                           aux_basis%ly(ncgf), &
     198       84368 :                                                           aux_basis%lz(ncgf)/))
     199             :             END DO
     200       24012 :             DO m = -lshell, lshell
     201       16924 :                nsgf = nsgf + 1
     202       16924 :                aux_basis%m(nsgf) = m
     203             :                aux_basis%sgf_symbol(nsgf) = &
     204       23004 :                   sgf_symbol(aux_basis%n(ishell, iset), lshell, m)
     205             :             END DO
     206             :          END DO
     207             :       END DO
     208             : 
     209             :       ! orbital radii (initialize later)
     210         308 :       aux_basis%kind_radius = 0.0_dp
     211         308 :       aux_basis%short_kind_radius = 0.0_dp
     212         924 :       ALLOCATE (aux_basis%set_radius(nsets))
     213         924 :       ALLOCATE (aux_basis%pgf_radius(maxpgf, nsets))
     214        1316 :       aux_basis%set_radius = 0.0_dp
     215        6474 :       aux_basis%pgf_radius = 0.0_dp
     216             : 
     217             :       ! basis transformation matrices
     218        1232 :       ALLOCATE (aux_basis%cphi(maxco, ncgf))
     219        1232 :       ALLOCATE (aux_basis%sphi(maxco, nsgf))
     220         924 :       ALLOCATE (aux_basis%scon(maxco, nsgf))
     221         924 :       ALLOCATE (aux_basis%norm_cgf(ncgf))
     222         308 :       aux_basis%norm_type = 2
     223             : 
     224         308 :    END SUBROUTINE create_aux_basis
     225             : 
     226             : END MODULE aux_basis_set

Generated by: LCOV version 1.15