LCOV - code coverage report
Current view: top level - src/aobasis - soft_basis_set.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 100.0 % 157 157
Test Date: 2026-11-04 00:58:17 Functions: 100.0 % 1 1

            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              : !> \par History
      10              : !>      none
      11              : !> \author MI (08.01.2004)
      12              : ! **************************************************************************************************
      13              : MODULE soft_basis_set
      14              : 
      15              :    USE ao_util,                         ONLY: exp_radius
      16              :    USE basis_set_types,                 ONLY: copy_gto_basis_set,&
      17              :                                               deallocate_gto_basis_set,&
      18              :                                               get_gto_basis_set,&
      19              :                                               gto_basis_set_type,&
      20              :                                               init_cphi_and_sphi
      21              :    USE kinds,                           ONLY: default_string_length,&
      22              :                                               dp
      23              :    USE memory_utilities,                ONLY: reallocate
      24              :    USE orbital_pointers,                ONLY: indco,&
      25              :                                               nco,&
      26              :                                               ncoset,&
      27              :                                               nso
      28              :    USE orbital_symbols,                 ONLY: cgf_symbol,&
      29              :                                               sgf_symbol
      30              : #include "../base/base_uses.f90"
      31              : 
      32              :    IMPLICIT NONE
      33              : 
      34              :    PRIVATE
      35              : 
      36              : ! *** Global parameters (only in this module)
      37              : 
      38              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'soft_basis_set'
      39              : 
      40              :    INTEGER, PARAMETER :: max_name_length = 60
      41              : 
      42              : ! *** Public subroutines ***
      43              : 
      44              :    PUBLIC :: create_soft_basis
      45              : 
      46              : CONTAINS
      47              : 
      48              : ! **************************************************************************************************
      49              : !> \brief   create the soft basis from a GTO basis
      50              : !> \param orb_basis ...
      51              : !> \param soft_basis ...
      52              : !> \param eps_fit ...
      53              : !> \param rc ...
      54              : !> \param paw_atom ...
      55              : !> \param paw_type_forced ...
      56              : !> \param gpw_r3d_rs_type_forced ...
      57              : !> \version 1.0
      58              : ! **************************************************************************************************
      59         3112 :    SUBROUTINE create_soft_basis(orb_basis, soft_basis, eps_fit, rc, paw_atom, &
      60              :                                 paw_type_forced, gpw_r3d_rs_type_forced)
      61              : 
      62              :       TYPE(gto_basis_set_type), POINTER                  :: orb_basis, soft_basis
      63              :       REAL(dp), INTENT(IN)                               :: eps_fit, rc
      64              :       LOGICAL, INTENT(OUT)                               :: paw_atom
      65              :       LOGICAL, INTENT(IN)                                :: paw_type_forced, gpw_r3d_rs_type_forced
      66              : 
      67              :       CHARACTER(LEN=default_string_length)               :: bsname
      68              :       INTEGER :: ico, ipgf, ipgf_s, iset, iset_s, ishell, lshell, lshell_old, m, maxco, maxpgf, &
      69              :          maxpgf_s, maxshell, maxshell_s, ncgf, nset, nset_s, nsgf
      70         3112 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: iset_s2h
      71         3112 :       INTEGER, DIMENSION(:), POINTER                     :: lmax, lmin, npgf, nshell
      72         3112 :       INTEGER, DIMENSION(:, :), POINTER                  :: l, n
      73              :       LOGICAL                                            :: my_gpw_r3d_rs_type_forced
      74              :       REAL(KIND=dp)                                      :: minzet, radius
      75         3112 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: zet
      76         3112 :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: gcc
      77              : 
      78         3112 :       NULLIFY (gcc, l, lmax, lmin, n, npgf, nshell, zet)
      79         3112 :       paw_atom = .FALSE.
      80         3112 :       my_gpw_r3d_rs_type_forced = gpw_r3d_rs_type_forced
      81         3112 :       IF (paw_type_forced) THEN
      82          188 :          paw_atom = .TRUE.
      83              :          my_gpw_r3d_rs_type_forced = .FALSE.
      84              :       END IF
      85         2924 :       IF (.NOT. my_gpw_r3d_rs_type_forced) THEN
      86              :          CALL get_gto_basis_set(gto_basis_set=orb_basis, name=bsname, &
      87         3062 :                                 maxpgf=maxpgf, maxshell=maxshell, nset=nset)
      88              : 
      89         3062 :          soft_basis%name = TRIM(bsname)//"_soft"
      90              : 
      91         3062 :          CALL reallocate(npgf, 1, nset)
      92         3062 :          CALL reallocate(nshell, 1, nset)
      93         3062 :          CALL reallocate(lmax, 1, nset)
      94         3062 :          CALL reallocate(lmin, 1, nset)
      95              : 
      96         3062 :          CALL reallocate(n, 1, maxshell, 1, nset)
      97         3062 :          CALL reallocate(l, 1, maxshell, 1, nset)
      98              : 
      99         3062 :          CALL reallocate(zet, 1, maxpgf, 1, nset)
     100         3062 :          CALL reallocate(gcc, 1, maxpgf, 1, maxshell, 1, nset)
     101              : 
     102         9186 :          ALLOCATE (iset_s2h(nset))
     103              : 
     104         3062 :          iset_s2h = 0
     105         3062 :          iset_s = 0
     106         3062 :          maxpgf_s = 0
     107         3062 :          maxshell_s = 0
     108              : 
     109        11596 :          DO iset = 1, nset ! iset
     110         8534 :             minzet = orb_basis%zet(orb_basis%npgf(iset), iset)
     111        20682 :             DO ipgf = orb_basis%npgf(iset) - 1, 1, -1
     112        20682 :                IF (orb_basis%zet(ipgf, iset) < minzet) THEN
     113           84 :                   minzet = orb_basis%zet(ipgf, iset)
     114              :                END IF
     115              :             END DO
     116         8534 :             radius = exp_radius(orb_basis%lmax(iset), minzet, eps_fit, 1.0_dp)
     117              : 
     118              :             !      The soft basis contains this set
     119         8534 :             iset_s = iset_s + 1
     120         8534 :             nshell(iset_s) = orb_basis%nshell(iset)
     121         8534 :             lmax(iset_s) = orb_basis%lmax(iset)
     122         8534 :             lmin(iset_s) = orb_basis%lmin(iset)
     123              : 
     124         8534 :             iset_s2h(iset_s) = iset
     125              : 
     126        22280 :             DO ishell = 1, nshell(iset_s)
     127        13746 :                n(ishell, iset_s) = orb_basis%n(ishell, iset)
     128        22280 :                l(ishell, iset_s) = orb_basis%l(ishell, iset)
     129              :             END DO
     130              : 
     131         8534 :             IF (nshell(iset_s) > maxshell_s) THEN
     132         3616 :                maxshell_s = nshell(iset_s)
     133              :             END IF
     134              : 
     135         8534 :             IF (radius < rc) THEN
     136              :                ! The soft basis does not contain this set
     137              :                ! For the moment I keep the set as a dummy set
     138              :                ! with no exponents, in order to have the right number of contractions
     139              :                ! In a second time it can be taken away, by creating a pointer
     140              :                ! which connects the remaining sets to the right contraction index
     141          714 :                paw_atom = .TRUE.
     142          714 :                npgf(iset_s) = 0
     143          714 :                CYCLE
     144              :             END IF
     145              : 
     146         7820 :             ipgf_s = 0
     147        25656 :             DO ipgf = 1, orb_basis%npgf(iset) ! ipgf
     148        17836 :                IF (orb_basis%zet(ipgf, iset) > 100.0_dp) THEN
     149              :                   ! The soft basis does not contain this exponent
     150          890 :                   paw_atom = .TRUE.
     151          890 :                   CYCLE
     152              :                END IF
     153              : 
     154              :                radius = exp_radius(orb_basis%lmax(iset), orb_basis%zet(ipgf, iset), &
     155        16946 :                                    eps_fit, 1.0_dp)
     156        16946 :                IF (radius < rc) THEN
     157              :                   ! The soft basis does not contain this exponent
     158         3764 :                   paw_atom = .TRUE.
     159         3764 :                   CYCLE
     160              :                END IF
     161              : 
     162              :                ! The soft basis contains this exponent
     163        13182 :                ipgf_s = ipgf_s + 1
     164        13182 :                zet(ipgf_s, iset_s) = orb_basis%zet(ipgf, iset)
     165              : 
     166        13182 :                lshell_old = orb_basis%l(1, iset)
     167        13182 :                radius = exp_radius(lshell_old, zet(ipgf_s, iset_s), eps_fit, 1.0_dp)
     168              : 
     169        49590 :                DO ishell = 1, nshell(iset_s)
     170        28588 :                   lshell = orb_basis%l(ishell, iset)
     171        28588 :                   IF (lshell == lshell_old) THEN
     172              :                   ELSE
     173         5366 :                      lshell_old = lshell
     174         5366 :                      radius = exp_radius(lshell_old, zet(ipgf_s, iset_s), eps_fit, 1.0_dp)
     175              :                   END IF
     176        41770 :                   IF (radius < rc) THEN
     177           20 :                      gcc(ipgf_s, ishell, iset_s) = 0.0_dp
     178           20 :                      paw_atom = .TRUE.
     179              :                   ELSE
     180        28568 :                      gcc(ipgf_s, ishell, iset_s) = orb_basis%gcc(ipgf, ishell, iset)
     181              :                   END IF
     182              :                END DO
     183              :             END DO
     184         7820 :             npgf(iset_s) = ipgf_s
     185        10882 :             IF (ipgf_s > maxpgf_s) THEN
     186         3406 :                maxpgf_s = ipgf_s
     187              :             END IF
     188              :          END DO
     189         3062 :          nset_s = iset_s
     190         3062 :          IF (paw_atom) THEN
     191         2624 :             soft_basis%nset = nset_s
     192         2624 :             CALL reallocate(soft_basis%lmax, 1, nset_s)
     193         2624 :             CALL reallocate(soft_basis%lmin, 1, nset_s)
     194         2624 :             CALL reallocate(soft_basis%npgf, 1, nset_s)
     195         2624 :             CALL reallocate(soft_basis%nshell, 1, nset_s)
     196         2624 :             CALL reallocate(soft_basis%n, 1, maxshell_s, 1, nset_s)
     197         2624 :             CALL reallocate(soft_basis%l, 1, maxshell_s, 1, nset_s)
     198         2624 :             CALL reallocate(soft_basis%zet, 1, maxpgf_s, 1, nset_s)
     199         2624 :             CALL reallocate(soft_basis%gcc, 1, maxpgf_s, 1, maxshell_s, 1, nset_s)
     200              : 
     201              :             ! *** Copy the basis set information into the data structure ***
     202              : 
     203        10246 :             DO iset = 1, nset_s
     204         7622 :                soft_basis%lmax(iset) = lmax(iset)
     205         7622 :                soft_basis%lmin(iset) = lmin(iset)
     206         7622 :                soft_basis%npgf(iset) = npgf(iset)
     207         7622 :                soft_basis%nshell(iset) = nshell(iset)
     208        19954 :                DO ishell = 1, nshell(iset)
     209        12332 :                   soft_basis%n(ishell, iset) = n(ishell, iset)
     210        12332 :                   soft_basis%l(ishell, iset) = l(ishell, iset)
     211        45156 :                   DO ipgf = 1, npgf(iset)
     212        37534 :                      soft_basis%gcc(ipgf, ishell, iset) = gcc(ipgf, ishell, iset)
     213              :                   END DO
     214              :                END DO
     215        21868 :                DO ipgf = 1, npgf(iset)
     216        19244 :                   soft_basis%zet(ipgf, iset) = zet(ipgf, iset)
     217              :                END DO
     218              :             END DO
     219              : 
     220              :             ! *** Initialise the depending soft_basis pointers ***
     221         2624 :             CALL reallocate(soft_basis%set_radius, 1, nset_s)
     222         2624 :             CALL reallocate(soft_basis%pgf_radius, 1, maxpgf_s, 1, nset_s)
     223         2624 :             CALL reallocate(soft_basis%first_cgf, 1, maxshell_s, 1, nset_s)
     224         2624 :             CALL reallocate(soft_basis%first_sgf, 1, maxshell_s, 1, nset_s)
     225         2624 :             CALL reallocate(soft_basis%last_cgf, 1, maxshell_s, 1, nset_s)
     226         2624 :             CALL reallocate(soft_basis%last_sgf, 1, maxshell_s, 1, nset_s)
     227         2624 :             CALL reallocate(soft_basis%ncgf_set, 1, nset_s)
     228         2624 :             CALL reallocate(soft_basis%nsgf_set, 1, nset_s)
     229              : 
     230         2624 :             maxco = 0
     231         2624 :             ncgf = 0
     232         2624 :             nsgf = 0
     233              : 
     234        10246 :             DO iset = 1, nset_s
     235         7622 :                soft_basis%ncgf_set(iset) = 0
     236         7622 :                soft_basis%nsgf_set(iset) = 0
     237        19954 :                DO ishell = 1, nshell(iset)
     238        12332 :                   lshell = soft_basis%l(ishell, iset)
     239        12332 :                   soft_basis%first_cgf(ishell, iset) = ncgf + 1
     240        12332 :                   ncgf = ncgf + nco(lshell)
     241        12332 :                   soft_basis%last_cgf(ishell, iset) = ncgf
     242              :                   soft_basis%ncgf_set(iset) = &
     243        12332 :                      soft_basis%ncgf_set(iset) + nco(lshell)
     244        12332 :                   soft_basis%first_sgf(ishell, iset) = nsgf + 1
     245        12332 :                   nsgf = nsgf + nso(lshell)
     246        12332 :                   soft_basis%last_sgf(ishell, iset) = nsgf
     247              :                   soft_basis%nsgf_set(iset) = &
     248        19954 :                      soft_basis%nsgf_set(iset) + nso(lshell)
     249              :                END DO
     250        10246 :                maxco = MAX(maxco, npgf(iset)*ncoset(lmax(iset)))
     251              :             END DO
     252         2624 :             soft_basis%ncgf = ncgf
     253         2624 :             soft_basis%nsgf = nsgf
     254              : 
     255         2624 :             CALL reallocate(soft_basis%cphi, 1, maxco, 1, ncgf)
     256         2624 :             CALL reallocate(soft_basis%sphi, 1, maxco, 1, nsgf)
     257         2624 :             CALL reallocate(soft_basis%scon, 1, maxco, 1, nsgf)
     258         2624 :             CALL reallocate(soft_basis%lx, 1, ncgf)
     259         2624 :             CALL reallocate(soft_basis%ly, 1, ncgf)
     260         2624 :             CALL reallocate(soft_basis%lz, 1, ncgf)
     261         2624 :             CALL reallocate(soft_basis%m, 1, nsgf)
     262         2624 :             CALL reallocate(soft_basis%norm_cgf, 1, ncgf)
     263         7872 :             ALLOCATE (soft_basis%cgf_symbol(ncgf))
     264         7872 :             ALLOCATE (soft_basis%sgf_symbol(nsgf))
     265              : 
     266         2624 :             ncgf = 0
     267         2624 :             nsgf = 0
     268              : 
     269        10246 :             DO iset = 1, nset_s
     270        22578 :                DO ishell = 1, nshell(iset)
     271        12332 :                   lshell = soft_basis%l(ishell, iset)
     272        41294 :                   DO ico = ncoset(lshell - 1) + 1, ncoset(lshell)
     273        28962 :                      ncgf = ncgf + 1
     274        28962 :                      soft_basis%lx(ncgf) = indco(1, ico)
     275        28962 :                      soft_basis%ly(ncgf) = indco(2, ico)
     276        28962 :                      soft_basis%lz(ncgf) = indco(3, ico)
     277              :                      soft_basis%cgf_symbol(ncgf) = &
     278              :                         cgf_symbol(n(ishell, iset), [soft_basis%lx(ncgf), &
     279              :                                                      soft_basis%ly(ncgf), &
     280       128180 :                                                      soft_basis%lz(ncgf)])
     281              :                   END DO
     282        47186 :                   DO m = -lshell, lshell
     283        27232 :                      nsgf = nsgf + 1
     284        27232 :                      soft_basis%m(nsgf) = m
     285              :                      soft_basis%sgf_symbol(nsgf) = &
     286        39564 :                         sgf_symbol(n(ishell, iset), lshell, m)
     287              :                   END DO
     288              :                END DO
     289              :             END DO
     290              : 
     291              :             ! *** Normalization factor of the contracted Gaussians ***
     292         2624 :             soft_basis%norm_type = orb_basis%norm_type
     293        60548 :             soft_basis%norm_cgf = orb_basis%norm_cgf
     294              :             ! *** Initialize the transformation matrices ***
     295         2624 :             CALL init_cphi_and_sphi(soft_basis)
     296              :          END IF
     297              : 
     298         6124 :          DEALLOCATE (gcc, l, lmax, lmin, n, npgf, nshell, zet, iset_s2h)
     299              :       END IF
     300              : 
     301         3112 :       IF (.NOT. paw_atom) THEN
     302          488 :          CALL deallocate_gto_basis_set(soft_basis)
     303          488 :          CALL copy_gto_basis_set(orb_basis, soft_basis)
     304          488 :          CALL get_gto_basis_set(gto_basis_set=orb_basis, name=bsname)
     305          488 :          soft_basis%name = TRIM(bsname)//"_soft"
     306              :       END IF
     307              : 
     308         3112 :    END SUBROUTINE create_soft_basis
     309              : 
     310              : END MODULE soft_basis_set
        

Generated by: LCOV version 2.0-1