LCOV - code coverage report
Current view: top level - src - qs_tddfpt2_stda_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 97.7 % 86 84
Test Date: 2025-07-25 12:55:17 Functions: 62.5 % 8 5

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : ! **************************************************************************************************
       8              : !> \brief Simplified Tamm Dancoff approach (sTDA).
       9              : ! **************************************************************************************************
      10              : MODULE qs_tddfpt2_stda_types
      11              : 
      12              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      13              :                                               get_atomic_kind
      14              :    USE cp_control_types,                ONLY: dft_control_type,&
      15              :                                               stda_control_type
      16              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      17              :                                               cp_logger_type
      18              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      19              :                                               cp_print_key_unit_nr
      20              :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      21              :                                               section_vals_type
      22              :    USE kinds,                           ONLY: dp
      23              :    USE physcon,                         ONLY: evolt
      24              :    USE qs_environment_types,            ONLY: get_qs_env,&
      25              :                                               qs_environment_type
      26              :    USE qs_kind_types,                   ONLY: qs_kind_type
      27              : #include "./base/base_uses.f90"
      28              : 
      29              :    IMPLICIT NONE
      30              : 
      31              :    PRIVATE
      32              : 
      33              :    TYPE stda_kind_type
      34              :       CHARACTER(LEN=2)                            :: symbol = "" !element symbol
      35              :       INTEGER                                     :: z = -1 !atomic_number
      36              :       INTEGER                                     :: kind_number = -1 !kind number
      37              :       REAL(KIND=dp)                               :: hardness_param = -1.0_dp !hardness_parameter eta
      38              :       REAL(KIND=dp)                               :: rcut = -1.0_dp !cutoff radius for short-range Coulomb
      39              :    END TYPE
      40              : 
      41              :    TYPE stda_kind_p_type
      42              :       TYPE(stda_kind_type), POINTER               :: kind_param => NULL()
      43              :    END TYPE
      44              : 
      45              :    TYPE stda_env_type
      46              :       !fraction of non-local HF exchange
      47              :       REAL(KIND=dp)                                :: hfx_fraction = -1.0_dp
      48              :       LOGICAL                                      :: do_exchange = .FALSE.
      49              :       ! empirical parameters
      50              :       REAL(KIND=dp)                                :: alpha_param = -1.0_dp
      51              :       REAL(KIND=dp)                                :: beta_param = -1.0_dp
      52              :       ! filter for TD matrix
      53              :       REAL(KIND=dp)                                :: eps_td_filter = -1.0_dp
      54              :       TYPE(stda_kind_p_type), DIMENSION(:), POINTER:: kind_param_set => NULL()
      55              :       !number of atomic orbitals, number of occupied orbitals
      56              :       INTEGER, DIMENSION(2)                        :: n_ao = -1
      57              :       INTEGER, DIMENSION(2)                        :: nactive = -1
      58              :    END TYPE
      59              : 
      60              :    !PARAMETERS
      61              : !&<
      62              :    INTEGER, PARAMETER, PRIVATE :: nelem = 103
      63              :    !   H                                                                      He
      64              :    !   Li Be                                                 B  C  N  O  F    Ne
      65              :    !   Na Mg                                                 Al Si P  S  Cl   Ar
      66              :    !   K  Ca Sc                Ti V  Cr Mn Fe Co Ni Cu Zn    Ga Ge As Se Br   Kr
      67              :    !   Rb Sr Y                 Zr Nb Mo Tc Ru Rh Pd Ag Cd    In Sn Sb Te I    Xe
      68              :    !   Cs Ba La Ce-Lu          Hf Ta W  Re Os Ir Pt Au Hg    Tl Pb Bi Po At   Rn
      69              :    !   Fr Ra Ac Th Pa U        Np Pu Am Cm Bk Cf Es Fm Md    No Lr  103
      70              : 
      71              :    REAL(KIND=dp), DIMENSION(1:nelem), PARAMETER, PRIVATE:: hardness = &
      72              :          (/6.4299544220_dp, 12.544911890_dp, & ! 2 H-He
      73              :            2.3745866560_dp, 3.4967633530_dp, 4.6190089720_dp, 5.7409789220_dp, &
      74              :            6.8624665290_dp, 7.9854357010_dp, 9.1064753720_dp, 10.23034050_dp, & ! 8 Li-Ne
      75              :            2.444141360_dp, 3.0146513830_dp, 3.5849070740_dp, 4.15513090_dp, &
      76              :            4.7258039740_dp, 5.2959792410_dp, 5.8661864840_dp, 6.4366187140_dp, & ! 8 Na-Ar
      77              :            2.3273178360_dp, 2.7587238140_dp, 2.8581921140_dp, 2.9578300430_dp, &
      78              :            3.0573410060_dp, 3.1567254290_dp, 3.2563827230_dp, 3.3559314050_dp, &
      79              :            3.4556091170_dp, 3.5550133130_dp, 3.6544183480_dp, 3.7541601450_dp, &
      80              :            4.1855197930_dp, 4.6166272460_dp, 5.0662145070_dp, 5.4794960970_dp, &
      81              :            5.9110996450_dp, 6.3418467680_dp, & ! 18 K-Kr
      82              :            2.1204582570_dp, 2.5373700480_dp, 2.6335468980_dp, 2.7297528930_dp, &
      83              :            2.8259738860_dp, 2.9221296040_dp, 3.0183708780_dp, 3.1145981770_dp, &
      84              :            3.210756280_dp, 3.3069474480_dp, 3.4031948570_dp, 3.4993761390_dp, &
      85              :            3.9163692460_dp, 4.3332332190_dp, 4.7500787860_dp, 5.1669793270_dp, &
      86              :            5.5838871020_dp, 6.000897330_dp, & ! 18 Rb-Xe
      87              :            0.6829150240_dp, 0.9200946840_dp, 1.1570887860_dp, 1.39427570_dp, &
      88              :            1.6314731730_dp, 1.8684389980_dp, 2.1056577930_dp, 2.3426646420_dp, &
      89              :            2.5798149820_dp, 2.8170264230_dp, 3.0540365330_dp, 3.2911692310_dp, &
      90              :            3.5282971610_dp, 3.7655249290_dp, 4.0025547030_dp, 4.2394783410_dp, &
      91              :            4.4765830210_dp, 4.7065224490_dp, 4.9508466940_dp, 5.1879311720_dp, &
      92              :            5.4256076210_dp, 5.6619144310_dp, 5.900042920_dp, 6.1367145320_dp, &
      93              :            6.3741299770_dp, 6.6102656130_dp, 1.7043485810_dp, 1.9413526120_dp, &
      94              :            2.178491510_dp, 2.4158121060_dp, 2.6527780840_dp, 2.8899554570_dp, & ! 32 Cs-Rn
      95              :            0.9882529880_dp, 1.2819499970_dp, 1.3497250380_dp, 1.4175257380_dp, &
      96              :            1.9368567520_dp, 2.2305576050_dp, 2.5241204960_dp, 3.0436128480_dp, &
      97              :            3.4168675260_dp, 3.4049844440_dp, 3.9244199680_dp, 4.2180813280_dp, &
      98              :            4.5115926320_dp, 4.8050928950_dp, 5.0989816210_dp, 5.3926054620_dp, &
      99              :            5.4606987930_dp/) ! 17 Fr-Lr
     100              : !&>
     101              : 
     102              :    REAL(KIND=dp), DIMENSION(2), PARAMETER, PRIVATE:: alpha = (/1.420_dp, 0.480_dp/)
     103              :    REAL(KIND=dp), DIMENSION(2), PARAMETER, PRIVATE:: beta = (/0.200_dp, 1.830_dp/)
     104              : 
     105              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_stda_types'
     106              : 
     107              :    PUBLIC:: stda_env_type, &
     108              :             allocate_stda_env, deallocate_stda_env, stda_init_param
     109              : 
     110              : CONTAINS
     111              : 
     112              : ! **************************************************************************************************
     113              : !> \brief Get the parameters needed for an sTDA calculation
     114              : !> \param qs_env ...
     115              : !> \param stda_kernel ...
     116              : !> \param stda_control ...
     117              : ! **************************************************************************************************
     118          402 :    SUBROUTINE stda_init_param(qs_env, stda_kernel, stda_control)
     119              : 
     120              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     121              :       TYPE(stda_env_type)                                :: stda_kernel
     122              :       TYPE(stda_control_type)                            :: stda_control
     123              : 
     124              :       INTEGER                                            :: ikind, log_unit, nkind
     125              :       REAL(KIND=dp)                                      :: eta, fxx, rcut
     126          402 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     127              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     128              :       TYPE(cp_logger_type), POINTER                      :: logger
     129              :       TYPE(dft_control_type), POINTER                    :: dft_control
     130              :       TYPE(section_vals_type), POINTER                   :: tddfpt_print_section
     131              :       TYPE(stda_kind_type), POINTER                      :: kind_param
     132              : 
     133          402 :       NULLIFY (logger)
     134          804 :       logger => cp_get_default_logger()
     135              : 
     136          402 :       CPASSERT(ASSOCIATED(stda_kernel%kind_param_set))
     137              : 
     138          402 :       NULLIFY (atomic_kind_set)
     139          402 :       CALL get_qs_env(qs_env, dft_control=dft_control, atomic_kind_set=atomic_kind_set)
     140          402 :       nkind = SIZE(atomic_kind_set)
     141              : 
     142          402 :       NULLIFY (tddfpt_print_section)
     143          402 :       tddfpt_print_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%TDDFPT%PRINT")
     144          402 :       log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, "PROGRAM_BANNER", extension=".tddfptLog")
     145              : 
     146         1264 :       DO ikind = 1, nkind
     147          862 :          atomic_kind => atomic_kind_set(ikind)
     148          862 :          kind_param => stda_kernel%kind_param_set(ikind)%kind_param
     149              :          ! element symbol, kind_number, atomic number
     150              :          CALL get_atomic_kind(atomic_kind, &
     151              :                               element_symbol=stda_kernel%kind_param_set(ikind)%kind_param%symbol, &
     152              :                               kind_number=stda_kernel%kind_param_set(ikind)%kind_param%kind_number, &
     153         1264 :                               z=stda_kernel%kind_param_set(ikind)%kind_param%z)
     154              :       END DO
     155              : 
     156          402 :       IF (stda_control%do_exchange) THEN ! option to switch off exchange
     157              :          ! HFx_fraction
     158          370 :          stda_kernel%do_exchange = .TRUE.
     159          370 :          stda_kernel%hfx_fraction = stda_control%hfx_fraction
     160              :       ELSE
     161           32 :          stda_kernel%do_exchange = .FALSE.
     162           32 :          stda_kernel%hfx_fraction = 0.0_dp
     163              :       END IF
     164              : 
     165              :       ! alpha and beta parameter
     166          402 :       IF (stda_control%mn_alpha < -98.0_dp) THEN
     167          400 :          IF (dft_control%qs_control%xtb) THEN
     168          200 :             stda_kernel%alpha_param = 2.0_dp
     169              :          ELSE
     170          200 :             stda_kernel%alpha_param = alpha(1) + stda_kernel%hfx_fraction*alpha(2)
     171              :          END IF
     172              :       ELSE
     173            2 :          stda_kernel%alpha_param = stda_control%mn_alpha
     174              :       END IF
     175          402 :       IF (stda_control%mn_beta < -98.0_dp) THEN
     176          400 :          IF (dft_control%qs_control%xtb) THEN
     177          200 :             stda_kernel%beta_param = 4.0_dp
     178              :          ELSE
     179          200 :             stda_kernel%beta_param = beta(1) + stda_kernel%hfx_fraction*beta(2)
     180              :          END IF
     181              :       ELSE
     182            2 :          stda_kernel%beta_param = stda_control%mn_beta
     183              :       END IF
     184              : 
     185              :       ! TD Filter
     186          402 :       stda_kernel%eps_td_filter = stda_control%eps_td_filter
     187              : 
     188         1264 :       DO ikind = 1, nkind
     189              :          ! hardness parameter
     190              :          stda_kernel%kind_param_set(ikind)%kind_param%hardness_param = &
     191          862 :             hardness(stda_kernel%kind_param_set(ikind)%kind_param%z)*2.0_dp/evolt
     192              :          ! rcut parameter
     193          862 :          eta = stda_kernel%kind_param_set(ikind)%kind_param%hardness_param
     194          862 :          fxx = 2.0_dp*eta**2*stda_control%coulomb_sr_eps
     195          862 :          fxx = 0.5_dp*(1.0_dp/fxx)**0.33333_dp
     196          862 :          rcut = stda_control%coulomb_sr_cut
     197         1264 :          stda_kernel%kind_param_set(ikind)%kind_param%rcut = MIN(rcut, fxx)
     198              :       END DO
     199              : 
     200          402 :       IF (log_unit > 0) THEN
     201          201 :          IF (.NOT. stda_kernel%do_exchange) THEN
     202           16 :             WRITE (log_unit, "(T2,A,T78,A3)") "sTDA| Exchange term is not used!"
     203              :          END IF
     204          201 :          WRITE (log_unit, "(T2,A,T71,F10.4)") "sTDA| HFX Fraction", stda_kernel%hfx_fraction
     205          201 :          WRITE (log_unit, "(T2,A,T71,F10.4)") "sTDA| Mataga-Nishimoto exponent (C)", stda_kernel%alpha_param
     206          201 :          WRITE (log_unit, "(T2,A,T71,F10.4)") "sTDA| Mataga-Nishimoto exponent (X)", stda_kernel%beta_param
     207          201 :          WRITE (log_unit, "(T2,A,T61,E20.8)") "sTDA| TD matrix filter", stda_kernel%eps_td_filter
     208              :       END IF
     209          402 :       CALL cp_print_key_finished_output(log_unit, logger, tddfpt_print_section, "PROGRAM_BANNER")
     210              : 
     211          402 :    END SUBROUTINE stda_init_param
     212              : ! **************************************************************************************************
     213              : !> \brief Allocate the sTDA environment
     214              : !> \param qs_env ...
     215              : !> \param stda_kernel ...
     216              : !> \param n_ao ...
     217              : !> \param nactive ...
     218              : ! **************************************************************************************************
     219          402 :    SUBROUTINE allocate_stda_env(qs_env, stda_kernel, n_ao, nactive)
     220              : 
     221              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     222              :       TYPE(stda_env_type)                                :: stda_kernel
     223              :       INTEGER, INTENT(IN)                                :: n_ao
     224              :       INTEGER, DIMENSION(:), INTENT(IN)                  :: nactive
     225              : 
     226              :       INTEGER                                            :: ii, nkind
     227          402 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     228              :       TYPE(stda_kind_type), POINTER                      :: kind_param
     229              : 
     230          402 :       stda_kernel%hfx_fraction = 0.0_dp
     231          402 :       stda_kernel%alpha_param = 0.0_dp
     232          402 :       stda_kernel%beta_param = 0.0_dp
     233         1206 :       stda_kernel%nactive = 0
     234         1206 :       stda_kernel%nactive(1:2) = nactive(1:2)
     235         1206 :       stda_kernel%n_ao = n_ao
     236          402 :       NULLIFY (stda_kernel%kind_param_set)
     237              : 
     238              :       ! initialize stda_kind_parameters
     239          402 :       CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
     240          402 :       nkind = SIZE(qs_kind_set)
     241              : 
     242         2068 :       ALLOCATE (stda_kernel%kind_param_set(nkind))
     243         1264 :       DO ii = 1, nkind
     244          862 :          NULLIFY (kind_param)
     245          862 :          CALL allocate_stda_kind_param(kind_param)
     246         1264 :          stda_kernel%kind_param_set(ii)%kind_param => kind_param
     247              :       END DO
     248              : 
     249          402 :    END SUBROUTINE allocate_stda_env
     250              : ! **************************************************************************************************
     251              : !> \brief Deallocate the sTDA environment
     252              : !> \param stda_kernel ...
     253              : ! **************************************************************************************************
     254          402 :    SUBROUTINE deallocate_stda_env(stda_kernel)
     255              : 
     256              :       TYPE(stda_env_type)                                :: stda_kernel
     257              : 
     258              :       INTEGER                                            :: ii
     259              :       TYPE(stda_kind_type), POINTER                      :: kind_param
     260              : 
     261              :       ! deallocate stda_kind_parameters
     262          402 :       IF (ASSOCIATED(stda_kernel%kind_param_set)) THEN
     263         1264 :          DO ii = 1, SIZE(stda_kernel%kind_param_set)
     264          862 :             kind_param => stda_kernel%kind_param_set(ii)%kind_param
     265         1264 :             CALL deallocate_stda_kind_param(kind_param)
     266              :          END DO
     267          402 :          DEALLOCATE (stda_kernel%kind_param_set)
     268              :          NULLIFY (stda_kernel%kind_param_set)
     269              :       END IF
     270              : 
     271          402 :    END SUBROUTINE deallocate_stda_env
     272              : ! **************************************************************************************************
     273              : !> \brief Allocate sTDA kind parameter
     274              : !> \param kind_param ...
     275              : ! **************************************************************************************************
     276          862 :    SUBROUTINE allocate_stda_kind_param(kind_param)
     277              : 
     278              :       TYPE(stda_kind_type), POINTER                      :: kind_param
     279              : 
     280          862 :       IF (ASSOCIATED(kind_param)) &
     281            0 :          CALL deallocate_stda_kind_param(kind_param)
     282              : 
     283          862 :       ALLOCATE (kind_param)
     284              : 
     285          862 :       kind_param%symbol = ""
     286          862 :       kind_param%z = 0
     287          862 :       kind_param%kind_number = 0
     288          862 :       kind_param%hardness_param = 0.0_dp
     289          862 :       kind_param%rcut = 0.0_dp
     290              : 
     291          862 :    END SUBROUTINE allocate_stda_kind_param
     292              : ! **************************************************************************************************
     293              : !> \brief Deallocate sTDA kind parameter
     294              : !> \param kind_param ...
     295              : ! **************************************************************************************************
     296          862 :    SUBROUTINE deallocate_stda_kind_param(kind_param)
     297              : 
     298              :       TYPE(stda_kind_type), POINTER                      :: kind_param
     299              : 
     300          862 :       CPASSERT(ASSOCIATED(kind_param))
     301          862 :       DEALLOCATE (kind_param)
     302              :       NULLIFY (kind_param)
     303              : 
     304          862 :    END SUBROUTINE deallocate_stda_kind_param
     305              : 
     306            0 : END MODULE qs_tddfpt2_stda_types
        

Generated by: LCOV version 2.0-1