LCOV - code coverage report
Current view: top level - src/aobasis - basis_set_container_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 69 80 86.2 %
Date: 2024-11-21 06:45:46 Functions: 5 6 83.3 %

          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             : !>      - Container to hold basis sets
      11             : !> \author JGH (09.07.2015)
      12             : ! **************************************************************************************************
      13             : MODULE basis_set_container_types
      14             : 
      15             :    USE basis_set_types,                 ONLY: deallocate_gto_basis_set,&
      16             :                                               gto_basis_set_type
      17             :    USE kinds,                           ONLY: default_string_length
      18             : #include "../base/base_uses.f90"
      19             : 
      20             :    IMPLICIT NONE
      21             : 
      22             :    PRIVATE
      23             : 
      24             :    ! Global parameters (only in this module)
      25             : 
      26             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'basis_set_container_types'
      27             : 
      28             : ! **************************************************************************************************
      29             :    INTEGER, PARAMETER                       :: unknown_basis = 100, &
      30             :                                                orbital_basis = 101, &
      31             :                                                auxiliary_basis = 102, &
      32             :                                                ri_aux_basis = 103, &
      33             :                                                lri_aux_basis = 104, &
      34             :                                                aux_fit_basis = 105, &
      35             :                                                soft_basis = 106, &
      36             :                                                gapw_1c_basis = 107, &
      37             :                                                mao_basis = 108, &
      38             :                                                harris_basis = 109, &
      39             :                                                aux_gw_basis = 110, &
      40             :                                                ri_hxc_basis = 111, &
      41             :                                                ri_k_basis = 112, &
      42             :                                                ri_xas_basis = 113, &
      43             :                                                aux_fit_soft_basis = 114, &
      44             :                                                ri_hfx_basis = 115, &
      45             :                                                p_lri_aux_basis = 116, &
      46             :                                                aux_opt_basis = 117, &
      47             :                                                min_basis = 118, &
      48             :                                                tda_k_basis = 119, &
      49             :                                                rhoin_basis = 120
      50             : ! **************************************************************************************************
      51             :    TYPE basis_set_container_type
      52             :       PRIVATE
      53             :       CHARACTER(LEN=default_string_length)       :: basis_type = ""
      54             :       INTEGER                                    :: basis_type_nr = 0
      55             :       TYPE(gto_basis_set_type), POINTER          :: basis_set => NULL()
      56             :    END TYPE basis_set_container_type
      57             : ! **************************************************************************************************
      58             : 
      59             :    PUBLIC :: basis_set_container_type
      60             : 
      61             :    PUBLIC :: remove_basis_set_container, &
      62             :              add_basis_set_to_container, get_basis_from_container, &
      63             :              remove_basis_from_container
      64             : 
      65             : ! **************************************************************************************************
      66             : 
      67             : CONTAINS
      68             : 
      69             : ! **************************************************************************************************
      70             : !> \brief ...
      71             : !> \param basis ...
      72             : ! **************************************************************************************************
      73       12985 :    SUBROUTINE remove_basis_set_container(basis)
      74             :       TYPE(basis_set_container_type), DIMENSION(:), &
      75             :          INTENT(inout)                                   :: basis
      76             : 
      77             :       INTEGER                                            :: i
      78             : 
      79      272685 :       DO i = 1, SIZE(basis)
      80      259700 :          basis(i)%basis_type = ""
      81      259700 :          basis(i)%basis_type_nr = 0
      82      272685 :          IF (ASSOCIATED(basis(i)%basis_set)) THEN
      83       19102 :             CALL deallocate_gto_basis_set(basis(i)%basis_set)
      84             :          END IF
      85             :       END DO
      86             : 
      87       12985 :    END SUBROUTINE remove_basis_set_container
      88             : 
      89             : ! **************************************************************************************************
      90             : !> \brief ...
      91             : !> \param basis_set_type ...
      92             : !> \return ...
      93             : ! **************************************************************************************************
      94    15998118 :    FUNCTION get_basis_type(basis_set_type) RESULT(basis_type_nr)
      95             :       CHARACTER(len=*)                                   :: basis_set_type
      96             :       INTEGER                                            :: basis_type_nr
      97             : 
      98             :       SELECT CASE (basis_set_type)
      99             :       CASE ("ORB")
     100      116514 :          basis_type_nr = orbital_basis
     101             :       CASE ("AUX")
     102      116514 :          basis_type_nr = auxiliary_basis
     103             :       CASE ("MIN")
     104       17070 :          basis_type_nr = min_basis
     105             :       CASE ("RI_AUX")
     106     4058908 :          basis_type_nr = ri_aux_basis
     107             :       CASE ("RI_HXC")
     108       75061 :          basis_type_nr = ri_hxc_basis
     109             :       CASE ("RI_HFX")
     110       12393 :          basis_type_nr = ri_hfx_basis
     111             :       CASE ("RI_K")
     112       51922 :          basis_type_nr = ri_k_basis
     113             :       CASE ("LRI_AUX")
     114       79807 :          basis_type_nr = lri_aux_basis
     115             :       CASE ("P_LRI_AUX")
     116       18040 :          basis_type_nr = p_lri_aux_basis
     117             :       CASE ("AUX_FIT")
     118      178965 :          basis_type_nr = aux_fit_basis
     119             :       CASE ("AUX_FIT_SOFT")
     120        6302 :          basis_type_nr = aux_fit_soft_basis
     121             :       CASE ("ORB_SOFT")
     122       43200 :          basis_type_nr = soft_basis
     123             :       CASE ("GAPW_1C")
     124     2162249 :          basis_type_nr = gapw_1c_basis
     125             :       CASE ("TDA_HFX")
     126       16836 :          basis_type_nr = tda_k_basis
     127             :       CASE ("MAO")
     128      120760 :          basis_type_nr = mao_basis
     129             :       CASE ("HARRIS")
     130      138708 :          basis_type_nr = harris_basis
     131             :       CASE ("AUX_GW")
     132       24508 :          basis_type_nr = aux_gw_basis
     133             :       CASE ("RI_XAS")
     134       17878 :          basis_type_nr = ri_xas_basis
     135             :       CASE ("AUX_OPT")
     136       20380 :          basis_type_nr = aux_opt_basis
     137             :       CASE ("RHOIN")
     138       69030 :          basis_type_nr = rhoin_basis
     139             :       CASE DEFAULT
     140    15998118 :          basis_type_nr = unknown_basis
     141             :       END SELECT
     142             : 
     143    15998118 :    END FUNCTION get_basis_type
     144             : 
     145             : ! **************************************************************************************************
     146             : !> \brief ...
     147             : !> \param container ...
     148             : !> \param basis_set ...
     149             : !> \param basis_set_type ...
     150             : ! **************************************************************************************************
     151       38220 :    SUBROUTINE add_basis_set_to_container(container, basis_set, basis_set_type)
     152             :       TYPE(basis_set_container_type), DIMENSION(:), &
     153             :          INTENT(inout)                                   :: container
     154             :       TYPE(gto_basis_set_type), POINTER                  :: basis_set
     155             :       CHARACTER(len=*)                                   :: basis_set_type
     156             : 
     157             :       INTEGER                                            :: i
     158             :       LOGICAL                                            :: success
     159             : 
     160       19110 :       success = .FALSE.
     161       29131 :       DO i = 1, SIZE(container)
     162       29131 :          IF (container(i)%basis_type_nr == 0) THEN
     163       19110 :             container(i)%basis_type = basis_set_type
     164       19110 :             container(i)%basis_set => basis_set
     165       19110 :             container(i)%basis_type_nr = get_basis_type(basis_set_type)
     166             :             success = .TRUE.
     167             :             EXIT
     168             :          END IF
     169             :       END DO
     170           0 :       CPASSERT(success)
     171             : 
     172       19110 :    END SUBROUTINE add_basis_set_to_container
     173             : 
     174             : ! **************************************************************************************************
     175             : !> \brief ...
     176             : !> \param container ...
     177             : !> \param inum ...
     178             : !> \param basis_type ...
     179             : ! **************************************************************************************************
     180        1936 :    SUBROUTINE remove_basis_from_container(container, inum, basis_type)
     181             :       TYPE(basis_set_container_type), DIMENSION(:), &
     182             :          INTENT(inout)                                   :: container
     183             :       INTEGER, INTENT(IN), OPTIONAL                      :: inum
     184             :       CHARACTER(len=*), OPTIONAL                         :: basis_type
     185             : 
     186             :       INTEGER                                            :: basis_nr, i, ibas
     187             : 
     188        1936 :       IF (PRESENT(inum)) THEN
     189           0 :          CPASSERT(inum <= SIZE(container))
     190           0 :          CPASSERT(inum >= 1)
     191             :          ibas = inum
     192        1936 :       ELSE IF (PRESENT(basis_type)) THEN
     193        1936 :          basis_nr = get_basis_type(basis_type)
     194        1936 :          ibas = 0
     195       40504 :          DO i = 1, SIZE(container)
     196       40504 :             IF (container(i)%basis_type_nr == basis_nr) THEN
     197             :                ibas = i
     198             :                EXIT
     199             :             END IF
     200             :          END DO
     201             :       ELSE
     202           0 :          CPABORT("")
     203             :       END IF
     204             :       !
     205        1936 :       IF (ibas /= 0) THEN
     206           8 :          container(ibas)%basis_type = ""
     207           8 :          container(ibas)%basis_type_nr = 0
     208           8 :          IF (ASSOCIATED(container(ibas)%basis_set)) THEN
     209           8 :             CALL deallocate_gto_basis_set(container(ibas)%basis_set)
     210             :          END IF
     211             :          ! shift other basis sets
     212         152 :          DO i = ibas + 1, SIZE(container)
     213         144 :             IF (container(i)%basis_type_nr == 0) CYCLE
     214           0 :             container(i - 1)%basis_type = container(i)%basis_type
     215           0 :             container(i - 1)%basis_set => container(i)%basis_set
     216           0 :             container(i - 1)%basis_type_nr = container(i)%basis_type_nr
     217           0 :             container(i)%basis_type = ""
     218           0 :             container(i)%basis_type_nr = 0
     219         152 :             NULLIFY (container(i)%basis_set)
     220             :          END DO
     221             :       END IF
     222             : 
     223        1936 :    END SUBROUTINE remove_basis_from_container
     224             : 
     225             : ! **************************************************************************************************
     226             : !> \brief Retrieve a basis set from the container
     227             : !> \param container ...
     228             : !> \param basis_set ...
     229             : !> \param inumbas ...
     230             : !> \param basis_type ...
     231             : ! **************************************************************************************************
     232    33792558 :    SUBROUTINE get_basis_from_container(container, basis_set, inumbas, basis_type)
     233             :       TYPE(basis_set_container_type), DIMENSION(:), &
     234             :          INTENT(inout)                                   :: container
     235             :       TYPE(gto_basis_set_type), POINTER                  :: basis_set
     236             :       INTEGER, OPTIONAL                                  :: inumbas
     237             :       CHARACTER(len=*), OPTIONAL                         :: basis_type
     238             : 
     239             :       INTEGER                                            :: basis_nr, i
     240             : 
     241    16896279 :       IF (PRESENT(inumbas)) THEN
     242      919207 :          CPASSERT(inumbas <= SIZE(container))
     243      919207 :          CPASSERT(inumbas >= 1)
     244      919207 :          basis_set => container(inumbas)%basis_set
     245      919207 :          IF (PRESENT(basis_type)) THEN
     246      919207 :             basis_type = container(inumbas)%basis_type
     247             :          END IF
     248    15977072 :       ELSE IF (PRESENT(basis_type)) THEN
     249    15977072 :          NULLIFY (basis_set)
     250    15977072 :          basis_nr = get_basis_type(basis_type)
     251    46400520 :          DO i = 1, SIZE(container)
     252    46400520 :             IF (container(i)%basis_type_nr == basis_nr) THEN
     253    14901026 :                basis_set => container(i)%basis_set
     254    14901026 :                EXIT
     255             :             END IF
     256             :          END DO
     257             :       ELSE
     258           0 :          CPABORT("")
     259             :       END IF
     260             : 
     261    16896279 :    END SUBROUTINE get_basis_from_container
     262             : ! **************************************************************************************************
     263             : 
     264           0 : END MODULE basis_set_container_types

Generated by: LCOV version 1.15