LCOV - code coverage report
Current view: top level - src - xtb_parameters.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:71c3ab0) Lines: 88.2 % 321 283
Test Date: 2026-07-25 06:35:44 Functions: 100.0 % 12 12

            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 Read xTB parameters.
      10              : !> \author JGH (10.2018)
      11              : ! **************************************************************************************************
      12              : MODULE xtb_parameters
      13              : 
      14              :    USE basis_set_types,                 ONLY: allocate_sto_basis_set,&
      15              :                                               create_gto_from_sto_basis,&
      16              :                                               deallocate_sto_basis_set,&
      17              :                                               gto_basis_set_type,&
      18              :                                               set_sto_basis_set,&
      19              :                                               sto_basis_set_type
      20              :    USE cp_control_types,                ONLY: xtb_control_type
      21              :    USE cp_parser_methods,               ONLY: parser_get_next_line,&
      22              :                                               parser_get_object
      23              :    USE cp_parser_types,                 ONLY: cp_parser_type,&
      24              :                                               parser_create,&
      25              :                                               parser_release
      26              :    USE kinds,                           ONLY: default_string_length,&
      27              :                                               dp
      28              :    USE message_passing,                 ONLY: mp_para_env_type
      29              :    USE periodic_table,                  ONLY: get_ptable_info,&
      30              :                                               ptable
      31              :    USE physcon,                         ONLY: bohr,&
      32              :                                               evolt
      33              :    USE string_utilities,                ONLY: uppercase
      34              :    USE xtb_types,                       ONLY: xtb_atom_type
      35              : #include "./base/base_uses.f90"
      36              : 
      37              :    IMPLICIT NONE
      38              : 
      39              :    PRIVATE
      40              : 
      41              :    INTEGER, PARAMETER, PRIVATE :: nelem = 106
      42              :    !   H                                                                      He
      43              :    !   Li Be                                                 B  C  N  O  F    Ne
      44              :    !   Na Mg                                                 Al Si P  S  Cl   Ar
      45              :    !   K  Ca Sc                Ti V  Cr Mn Fe Co Ni Cu Zn    Ga Ge As Se Br   Kr
      46              :    !   Rb Sr Y                 Zr Nb Mo Tc Ru Rh Pd Ag Cd    In Sn Sb Te I    Xe
      47              :    !   Cs Ba La Ce-Lu          Hf Ta W  Re Os Ir Pt Au Hg    Tl Pb Bi Po At   Rn
      48              :    !   Fr Ra Ac Th Pa U        Np Pu Am Cm Bk Cf Es Fm Md    No Lr Rf Ha 106
      49              : 
      50              : !&<
      51              :    ! Element Valence
      52              :    INTEGER, DIMENSION(0:nelem), &
      53              :      PARAMETER, PRIVATE :: zval = [-1, & !    0
      54              :                                      1, 2, & !    2
      55              :                                      1, 2, 3, 4, 5, 6, 7, 8, & !   10
      56              :                                      1, 2, 3, 4, 5, 6, 7, 8, & !   18
      57              :                                      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & !   36
      58              :                                      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & !   54
      59              :                                      1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, &
      60              :                                      4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & !   86
      61              :                                     -1, -1, -1, 4, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
      62              : !&>
      63              : 
      64              : !&<
      65              :    ! Element Pauling Electronegativity
      66              :    REAL(KIND=dp), DIMENSION(0:nelem), &
      67              :       PARAMETER, PRIVATE :: eneg = [0.00_dp, & ! 0
      68              :                                      2.20_dp, 3.00_dp, & ! 2
      69              :                                      0.98_dp, 1.57_dp, 2.04_dp, 2.55_dp, 3.04_dp, 3.44_dp, 3.98_dp, 4.50_dp, & ! 10
      70              :                                      0.93_dp, 1.31_dp, 1.61_dp, 1.90_dp, 2.19_dp, 2.58_dp, 3.16_dp, 3.50_dp, & ! 18
      71              :                                      0.82_dp, 1.00_dp, 1.36_dp, 1.54_dp, 1.63_dp, 1.66_dp, 1.55_dp, 1.83_dp, &
      72              :                                      1.88_dp, 1.91_dp, 1.90_dp, 1.65_dp, 1.81_dp, 2.01_dp, 2.18_dp, 2.55_dp, &
      73              :                                      2.96_dp, 3.00_dp, & ! 36
      74              :                                      0.82_dp, 0.95_dp, 1.22_dp, 1.33_dp, 1.60_dp, 2.16_dp, 1.90_dp, 2.20_dp, &
      75              :                                      2.28_dp, 2.20_dp, 1.93_dp, 1.69_dp, 1.78_dp, 1.96_dp, 2.05_dp, 2.10_dp, &
      76              :                                      2.66_dp, 2.60_dp, & ! 54
      77              :                                      0.79_dp, 0.89_dp, 1.10_dp, &
      78              :                                      1.12_dp, 1.13_dp, 1.14_dp, 1.15_dp, 1.17_dp, 1.18_dp, 1.20_dp, 1.21_dp, &
      79              :                                      1.22_dp, 1.23_dp, 1.24_dp, 1.25_dp, 1.26_dp, 1.27_dp, & ! Lanthanides
      80              :                                      1.30_dp, 1.50_dp, 2.36_dp, 1.90_dp, 2.20_dp, 2.20_dp, 2.28_dp, 2.54_dp, &
      81              :                                      2.00_dp, 2.04_dp, 2.33_dp, 2.02_dp, 2.00_dp, 2.20_dp, 2.20_dp, & ! 86
      82              :                                      0.70_dp, 0.89_dp, 1.10_dp, &
      83              :                                      1.30_dp, 1.50_dp, 1.38_dp, 1.36_dp, 1.28_dp, 1.30_dp, 1.30_dp, 1.30_dp, &
      84              :                                      1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.50_dp, & !  Actinides
      85              :                                      1.50_dp, 1.50_dp, 1.50_dp]
      86              : !&>
      87              : 
      88              : !&<
      89              :    ! Shell occupation
      90              :    INTEGER, DIMENSION(1:5, 0:nelem) :: occupation = RESHAPE([0,0,0,0,0, & ! 0
      91              :       1,0,0,0,0,  2,0,0,0,0, & ! 2
      92              :       1,0,0,0,0,  2,0,0,0,0,  2,1,0,0,0,  2,2,0,0,0,  2,3,0,0,0,  2,4,0,0,0,  2,5,0,0,0,  2,6,0,0,0, & ! 10
      93              :       1,0,0,0,0,  2,0,0,0,0,  2,1,0,0,0,  2,2,0,0,0,  2,3,0,0,0,  2,4,0,0,0,  2,5,0,0,0,  2,6,0,0,0, & ! 18
      94              :       1,0,0,0,0,  2,0,0,0,0,  2,0,1,0,0,  2,0,2,0,0,  2,0,3,0,0,  2,0,4,0,0,  2,0,5,0,0,  2,0,6,0,0, &
      95              :       2,0,7,0,0,  2,0,8,0,0,  2,0,9,0,0,  2,0,0,0,0, 2,1,0,0,0,  2,2,0,0,0,  2,3,0,0,0,  2,4,0,0,0,  2,5,0,0,0, 2,6,0,0,0, & ! 36
      96              :       1,0,0,0,0,  2,0,0,0,0,  2,0,1,0,0,  2,0,2,0,0,  2,0,3,0,0,  2,0,4,0,0,  2,0,5,0,0,  2,0,6,0,0, & !
      97              :       2,0,7,0,0,  2,0,8,0,0,  2,0,9,0,0,  2,0,0,0,0, 2,1,0,0,0,  2,2,0,0,0,  2,3,0,0,0,  2,4,0,0,0,  2,5,0,0,0, 2,6,0,0,0, & ! 54
      98              :       1,0,0,0,0,  2,0,0,0,0,  2,0,1,0,0, &
      99              :       2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0, &
     100              :       2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0,  2,0,1,0,0, & ! Lanthanides
     101              :       2,0,2,0,0,  2,0,3,0,0,  2,0,4,0,0,  2,0,5,0,0,  2,0,6,0,0,  2,0,7,0,0,  2,0,8,0,0,  2,0,9,0,0, &
     102              :       2,0,0,0,0, 2,1,0,0,0,  2,2,0,0,0,  2,3,0,0,0,  2,4,0,0,0,  2,5,0,0,0,  2,6,0,0,0, & ! 86 (last element defined)
     103              :       0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0, & !
     104              :       0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0, &
     105              :       0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0, & ! Actinides
     106              :       0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0], [5, nelem+1])
     107              : !&>
     108              : 
     109              : !&<
     110              :    ! COVALENT RADII
     111              :    ! based on "Atomic Radii of the Elements," M. Mantina, R. Valero, C. J. Cramer, and D. G. Truhlar,
     112              :    ! in CRC Handbook of Chemistry and Physics, 91st Edition (2010-2011),
     113              :    ! edited by W. M. Haynes (CRC Press, Boca Raton, FL, 2010), pages 9-49-9-50;
     114              :    ! corrected Nov. 17, 2010 for the 92nd edition.
     115              :    REAL(KIND=dp), DIMENSION(0:nelem), &
     116              :       PARAMETER, PRIVATE :: crad = [0.00_dp, & ! 0
     117              :                                      0.32_dp, 0.37_dp, & ! 2
     118              :                                      1.30_dp, 0.99_dp, 0.84_dp, 0.75_dp, 0.71_dp, 0.64_dp, 0.60_dp, 0.62_dp, & ! 10
     119              :                                      1.60_dp, 1.40_dp, 1.24_dp, 1.14_dp, 1.09_dp, 1.04_dp, 1.00_dp, 1.01_dp, & ! 18
     120              :                                      2.00_dp, 1.74_dp, 1.59_dp, 1.48_dp, 1.44_dp, 1.30_dp, 1.29_dp, 1.24_dp, &
     121              :                                      1.18_dp, 1.17_dp, 1.22_dp, 1.20_dp, 1.23_dp, 1.20_dp, 1.20_dp, 1.18_dp, &
     122              :                                      1.17_dp, 1.16_dp, & ! 36
     123              :                                      2.15_dp, 1.90_dp, 1.76_dp, 1.64_dp, 1.56_dp, 1.46_dp, 1.38_dp, 1.36_dp, &
     124              :                                      1.34_dp, 1.30_dp, 1.36_dp, 1.40_dp, 1.42_dp, 1.40_dp, 1.40_dp, 1.37_dp, &
     125              :                                      1.36_dp, 1.36_dp, & ! 54
     126              :                                      2.38_dp, 2.06_dp, 1.94_dp, &
     127              :                                      1.84_dp, 1.90_dp, 1.88_dp, 1.86_dp, 1.85_dp, 1.83_dp, 1.82_dp, 1.81_dp, &
     128              :                                      1.80_dp, 1.79_dp, 1.77_dp, 1.77_dp, 1.78_dp, 1.74_dp, & ! Lanthanides
     129              :                                      1.64_dp, 1.58_dp, 1.50_dp, 1.41_dp, 1.36_dp, 1.32_dp, 1.30_dp, 1.30_dp, &
     130              :                                      1.32_dp, 1.44_dp, 1.45_dp, 1.50_dp, 1.42_dp, 1.48_dp, 1.46_dp, & ! 86
     131              :                                      2.42_dp, 2.11_dp, 2.01_dp, &
     132              :                                      1.90_dp, 1.84_dp, 1.83_dp, 1.80_dp, 1.80_dp, 1.51_dp, 0.96_dp, 1.54_dp, &
     133              :                                      1.83_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, & !  Actinides
     134              :                                      1.50_dp, 1.50_dp, 1.50_dp]
     135              : !&>
     136              : 
     137              : !&<
     138              :    ! Charge Limits (Mulliken)
     139              :    REAL(KIND=dp), DIMENSION(0:nelem), &
     140              :       PARAMETER, PRIVATE :: clmt = [0.00_dp, & ! 0
     141              :                                      1.05_dp, 1.25_dp, & ! 2
     142              :                                      1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, & ! 10
     143              :                                      1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, & ! 18
     144              :                                      1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
     145              :                                      3.50_dp, 3.50_dp, 3.50_dp, 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
     146              :                                      1.25_dp, 1.00_dp, & ! 36
     147              :                                      1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
     148              :                                      3.50_dp, 3.50_dp, 3.50_dp, 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
     149              :                                      1.25_dp, 1.00_dp, & ! 54
     150              :                                      1.05_dp, 2.05_dp, 3.00_dp, &
     151              :                                      3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
     152              :                                      3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, & ! Lanthanides
     153              :                                      3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
     154              :                                      2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 1.25_dp, 1.00_dp, & ! 86
     155              :                                      1.05_dp, 2.05_dp, 3.00_dp, &
     156              :                                      3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
     157              :                                      3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, & !  Actinides
     158              :                                      3.00_dp, 3.00_dp, 3.00_dp]
     159              : !&>
     160              : 
     161              : ! *** Global parameters ***
     162              : 
     163              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_parameters'
     164              : 
     165              : ! *** Public data types ***
     166              : 
     167              :    PUBLIC :: xtb_parameters_init, xtb_parameters_set, init_xtb_basis, xtb_set_kab
     168              :    PUBLIC :: xtb_spinpol_init, xtb_spinpol_ext
     169              :    PUBLIC :: metal, early3d, pp_gfn0
     170              : 
     171              : CONTAINS
     172              : 
     173              : ! **************************************************************************************************
     174              : !> \brief ...
     175              : !> \param param ...
     176              : !> \param gfn_type ...
     177              : !> \param element_symbol ...
     178              : !> \param parameter_file_path ...
     179              : !> \param parameter_file_name ...
     180              : !> \param para_env ...
     181              : ! **************************************************************************************************
     182         2256 :    SUBROUTINE xtb_parameters_init(param, gfn_type, element_symbol, &
     183              :                                   parameter_file_path, parameter_file_name, &
     184              :                                   para_env)
     185              : 
     186              :       TYPE(xtb_atom_type), POINTER                       :: param
     187              :       INTEGER, INTENT(IN)                                :: gfn_type
     188              :       CHARACTER(LEN=2), INTENT(IN)                       :: element_symbol
     189              :       CHARACTER(LEN=*), INTENT(IN)                       :: parameter_file_path, parameter_file_name
     190              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     191              : 
     192         3730 :       SELECT CASE (gfn_type)
     193              :       CASE (0)
     194              :          CALL xtb0_parameters_init(param, element_symbol, parameter_file_path, &
     195         1474 :                                    parameter_file_name, para_env)
     196              :       CASE (1)
     197              :          CALL xtb1_parameters_init(param, element_symbol, parameter_file_path, &
     198          782 :                                    parameter_file_name, para_env)
     199              :       CASE (2)
     200            0 :          CPABORT("gfn_type = 2 not yet supported")
     201              :       CASE DEFAULT
     202         2256 :          CPABORT("Wrong gfn_type")
     203              :       END SELECT
     204              : 
     205         2256 :    END SUBROUTINE xtb_parameters_init
     206              : 
     207              : ! **************************************************************************************************
     208              : !> \brief ...
     209              : !> \param param ...
     210              : !> \param element_symbol ...
     211              : !> \param parameter_file_path ...
     212              : !> \param parameter_file_name ...
     213              : !> \param para_env ...
     214              : ! **************************************************************************************************
     215         2948 :    SUBROUTINE xtb0_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
     216              :                                    para_env)
     217              : 
     218              :       TYPE(xtb_atom_type), POINTER                       :: param
     219              :       CHARACTER(LEN=2), INTENT(IN)                       :: element_symbol
     220              :       CHARACTER(LEN=*), INTENT(IN)                       :: parameter_file_path, parameter_file_name
     221              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     222              : 
     223              :       CHARACTER(len=2)                                   :: esym
     224              :       CHARACTER(len=default_string_length)               :: aname, atag, filename
     225              :       INTEGER                                            :: i, l, zin, znum
     226              :       LOGICAL                                            :: at_end, found
     227              :       TYPE(cp_parser_type)                               :: parser
     228              : 
     229         1474 :       filename = ADJUSTL(TRIM(parameter_file_path))//ADJUSTL(TRIM(parameter_file_name))
     230         1474 :       CALL parser_create(parser, filename, apply_preprocessing=.FALSE., para_env=para_env)
     231         1474 :       found = .FALSE.
     232              :       znum = 0
     233         1474 :       CALL get_ptable_info(element_symbol, znum)
     234              :       DO
     235              :          at_end = .FALSE.
     236       554742 :          CALL parser_get_next_line(parser, 1, at_end)
     237       554742 :          IF (at_end) EXIT
     238       554742 :          CALL parser_get_object(parser, aname)
     239       554742 :          CALL uppercase(aname)
     240       554742 :          IF (aname == "$Z") THEN
     241        27298 :             CALL parser_get_object(parser, zin)
     242        27298 :             IF (zin == znum) THEN
     243        26628 :                found = .TRUE.
     244              :                DO
     245        26628 :                   CALL parser_get_next_line(parser, 1, at_end)
     246        26628 :                   IF (at_end) THEN
     247            0 :                      CPABORT("Incomplete xTB parameter file")
     248              :                   END IF
     249        26628 :                   CALL parser_get_object(parser, aname)
     250        26628 :                   CALL uppercase(aname)
     251         1474 :                   SELECT CASE (aname)
     252              :                   CASE ("AO")
     253         1474 :                      CALL parser_get_object(parser, atag)
     254         1474 :                      CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
     255              :                   CASE ("LEV")
     256         4960 :                      DO i = 1, param%nshell
     257         4960 :                         CALL parser_get_object(parser, param%hen(i))
     258              :                      END DO
     259              :                   CASE ("EXP")
     260         4960 :                      DO i = 1, param%nshell
     261         4960 :                         CALL parser_get_object(parser, param%zeta(i))
     262              :                      END DO
     263              :                   CASE ("EN")
     264          616 :                      CALL parser_get_object(parser, param%en)
     265              :                   CASE ("GAM")
     266         1474 :                      CALL parser_get_object(parser, param%eta)
     267              :                   CASE ("KQAT2")
     268         1474 :                      CALL parser_get_object(parser, param%kqat2)
     269              :                   CASE ("KCNS")
     270         1474 :                      CALL parser_get_object(parser, param%kcn(1))
     271         1474 :                      param%kcn(1) = param%kcn(1)*0.1_dp !from orig xtb code
     272              :                   CASE ("KCNP")
     273         1254 :                      CALL parser_get_object(parser, param%kcn(2))
     274         1254 :                      param%kcn(2) = param%kcn(2)*0.1_dp !from orig xtb code
     275              :                   CASE ("KCND")
     276          538 :                      CALL parser_get_object(parser, param%kcn(3))
     277          538 :                      param%kcn(3) = param%kcn(3)*0.1_dp !from orig xtb code
     278              :                   CASE ("REPA")
     279         1474 :                      CALL parser_get_object(parser, param%alpha)
     280              :                   CASE ("REPB")
     281         1474 :                      CALL parser_get_object(parser, param%zneff)
     282              :                   CASE ("POLYS")
     283         1474 :                      CALL parser_get_object(parser, param%kpoly(1))
     284              :                   CASE ("POLYP")
     285         1254 :                      CALL parser_get_object(parser, param%kpoly(2))
     286              :                   CASE ("POLYD")
     287          538 :                      CALL parser_get_object(parser, param%kpoly(3))
     288              :                   CASE ("KQS")
     289         1474 :                      CALL parser_get_object(parser, param%kq(1))
     290              :                   CASE ("KQP")
     291         1254 :                      CALL parser_get_object(parser, param%kq(2))
     292              :                   CASE ("KQD")
     293          538 :                      CALL parser_get_object(parser, param%kq(3))
     294              :                   CASE ("XI")
     295         1474 :                      CALL parser_get_object(parser, param%xi)
     296              :                   CASE ("KAPPA")
     297         1474 :                      CALL parser_get_object(parser, param%kappa0)
     298              :                   CASE ("ALPG")
     299         1474 :                      CALL parser_get_object(parser, param%alpg)
     300              :                   CASE ("$END")
     301            0 :                      EXIT
     302              :                   CASE DEFAULT
     303        26628 :                      CPABORT("Unknown parameter in xTB file")
     304              :                   END SELECT
     305              :                END DO
     306              :             ELSE
     307              :                CYCLE
     308              :             END IF
     309              :             EXIT
     310              :          END IF
     311              :       END DO
     312         1474 :       IF (found) THEN
     313         1474 :          param%typ = "STANDARD"
     314         1474 :          param%symbol = element_symbol
     315         1474 :          param%defined = .TRUE.
     316         1474 :          param%z = znum
     317         1474 :          param%aname = ptable(znum)%name
     318         4960 :          param%lmax = MAXVAL(param%lval(1:param%nshell))
     319         1474 :          param%natorb = 0
     320         4960 :          DO i = 1, param%nshell
     321         3486 :             l = param%lval(i)
     322         4960 :             param%natorb = param%natorb + (2*l + 1)
     323              :          END DO
     324         1474 :          param%zeff = zval(znum)
     325              :       ELSE
     326            0 :          esym = element_symbol
     327            0 :          CALL uppercase(esym)
     328            0 :          IF ("X " == esym) THEN
     329            0 :             param%typ = "GHOST"
     330            0 :             param%symbol = element_symbol
     331            0 :             param%defined = .FALSE.
     332            0 :             param%z = 0
     333            0 :             param%aname = "X "
     334            0 :             param%lmax = 0
     335            0 :             param%natorb = 0
     336            0 :             param%nshell = 0
     337            0 :             param%zeff = 0.0_dp
     338              :          ELSE
     339            0 :             param%defined = .FALSE.
     340              :             CALL cp_warn(__LOCATION__, "xTB parameters for element "//element_symbol// &
     341            0 :                          " were not found in the parameter file "//ADJUSTL(TRIM(filename)))
     342              :          END IF
     343              :       END IF
     344         1474 :       CALL parser_release(parser)
     345              : 
     346         4422 :    END SUBROUTINE xtb0_parameters_init
     347              : 
     348              : ! **************************************************************************************************
     349              : !> \brief ...
     350              : !> \param param ...
     351              : !> \param element_symbol ...
     352              : !> \param parameter_file_path ...
     353              : !> \param parameter_file_name ...
     354              : !> \param para_env ...
     355              : ! **************************************************************************************************
     356         1564 :    SUBROUTINE xtb1_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
     357              :                                    para_env)
     358              : 
     359              :       TYPE(xtb_atom_type), POINTER                       :: param
     360              :       CHARACTER(LEN=2), INTENT(IN)                       :: element_symbol
     361              :       CHARACTER(LEN=*), INTENT(IN)                       :: parameter_file_path, parameter_file_name
     362              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     363              : 
     364              :       CHARACTER(len=2)                                   :: esym
     365              :       CHARACTER(len=default_string_length)               :: aname, atag, filename
     366              :       INTEGER                                            :: i, l, zin, znum
     367              :       LOGICAL                                            :: at_end, found
     368              :       TYPE(cp_parser_type)                               :: parser
     369              : 
     370          782 :       filename = ADJUSTL(TRIM(parameter_file_path))//ADJUSTL(TRIM(parameter_file_name))
     371          782 :       CALL parser_create(parser, filename, apply_preprocessing=.FALSE., para_env=para_env)
     372          782 :       found = .FALSE.
     373              :       znum = 0
     374          782 :       CALL get_ptable_info(element_symbol, znum)
     375              :       DO
     376              :          at_end = .FALSE.
     377        90874 :          CALL parser_get_next_line(parser, 1, at_end)
     378        90874 :          IF (at_end) EXIT
     379        90872 :          CALL parser_get_object(parser, aname)
     380        90872 :          CALL uppercase(aname)
     381        90874 :          IF (aname == "$Z") THEN
     382         6002 :             CALL parser_get_object(parser, zin)
     383         6002 :             IF (zin == znum) THEN
     384         7570 :                found = .TRUE.
     385              :                DO
     386         7570 :                   CALL parser_get_next_line(parser, 1, at_end)
     387         7570 :                   IF (at_end) THEN
     388            0 :                      CPABORT("Incomplete xTB parameter file")
     389              :                   END IF
     390         7570 :                   CALL parser_get_object(parser, aname)
     391         7570 :                   CALL uppercase(aname)
     392          780 :                   SELECT CASE (aname)
     393              :                   CASE ("AO")
     394          780 :                      CALL parser_get_object(parser, atag)
     395          780 :                      CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
     396              :                   CASE ("LEV")
     397         2436 :                      DO i = 1, param%nshell
     398         2436 :                         CALL parser_get_object(parser, param%hen(i))
     399              :                      END DO
     400              :                   CASE ("EXP")
     401         2436 :                      DO i = 1, param%nshell
     402         2436 :                         CALL parser_get_object(parser, param%zeta(i))
     403              :                      END DO
     404              :                   CASE ("GAM")
     405          780 :                      CALL parser_get_object(parser, param%eta)
     406              :                   CASE ("GAM3")
     407          488 :                      CALL parser_get_object(parser, param%xgamma)
     408              :                   CASE ("CXB")
     409           12 :                      CALL parser_get_object(parser, param%kx)
     410              :                   CASE ("REPA")
     411          780 :                      CALL parser_get_object(parser, param%alpha)
     412              :                   CASE ("REPB")
     413          780 :                      CALL parser_get_object(parser, param%zneff)
     414              :                   CASE ("POLYS")
     415          488 :                      CALL parser_get_object(parser, param%kpoly(1))
     416              :                   CASE ("POLYP")
     417          488 :                      CALL parser_get_object(parser, param%kpoly(2))
     418              :                   CASE ("POLYD")
     419           96 :                      CALL parser_get_object(parser, param%kpoly(3))
     420              :                   CASE ("LPARP")
     421          478 :                      CALL parser_get_object(parser, param%kappa(2))
     422              :                   CASE ("LPARD")
     423           60 :                      CALL parser_get_object(parser, param%kappa(3))
     424              :                   CASE ("$END")
     425            0 :                      EXIT
     426              :                   CASE DEFAULT
     427         7570 :                      CPABORT("Unknown parameter in xTB file")
     428              :                   END SELECT
     429              :                END DO
     430              :             ELSE
     431              :                CYCLE
     432              :             END IF
     433              :             EXIT
     434              :          END IF
     435              :       END DO
     436          782 :       IF (found) THEN
     437          780 :          param%typ = "STANDARD"
     438          780 :          param%symbol = element_symbol
     439          780 :          param%defined = .TRUE.
     440          780 :          param%z = znum
     441          780 :          param%aname = ptable(znum)%name
     442         2436 :          param%lmax = MAXVAL(param%lval(1:param%nshell))
     443          780 :          param%natorb = 0
     444         2436 :          DO i = 1, param%nshell
     445         1656 :             l = param%lval(i)
     446         2436 :             param%natorb = param%natorb + (2*l + 1)
     447              :          END DO
     448          780 :          param%zeff = zval(znum)
     449              :       ELSE
     450            2 :          esym = element_symbol
     451            2 :          CALL uppercase(esym)
     452            2 :          IF ("X " == esym) THEN
     453            2 :             param%typ = "GHOST"
     454            2 :             param%symbol = element_symbol
     455            2 :             param%defined = .FALSE.
     456            2 :             param%z = 0
     457            2 :             param%aname = "X "
     458            2 :             param%lmax = 0
     459            2 :             param%natorb = 0
     460            2 :             param%nshell = 0
     461            2 :             param%zeff = 0.0_dp
     462              :          ELSE
     463            0 :             param%defined = .FALSE.
     464              :             CALL cp_warn(__LOCATION__, "xTB parameters for element "//element_symbol// &
     465            0 :                          " were not found in the parameter file "//ADJUSTL(TRIM(filename)))
     466              :          END IF
     467              :       END IF
     468          782 :       CALL parser_release(parser)
     469              : 
     470         2346 :    END SUBROUTINE xtb1_parameters_init
     471              : 
     472              : ! **************************************************************************************************
     473              : !> \brief ...
     474              : !> \param param ...
     475              : !> \param gfn_type ...
     476              : !> \param element_symbol ...
     477              : !> \param parameter_file_path ...
     478              : !> \param spinpol_param_file_name ...
     479              : !> \param para_env ...
     480              : ! **************************************************************************************************
     481          116 :    SUBROUTINE xtb_spinpol_init(param, gfn_type, element_symbol, parameter_file_path, spinpol_param_file_name, &
     482              :                                para_env)
     483              : 
     484              :       TYPE(xtb_atom_type), POINTER                       :: param
     485              :       INTEGER, INTENT(IN)                                :: gfn_type
     486              :       CHARACTER(LEN=2), INTENT(IN)                       :: element_symbol
     487              :       CHARACTER(LEN=*), INTENT(IN)                       :: parameter_file_path, &
     488              :                                                             spinpol_param_file_name
     489              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     490              : 
     491              :       CHARACTER(len=default_string_length)               :: filename
     492              :       INTEGER                                            :: zin, znum
     493              :       LOGICAL                                            :: at_end
     494              :       TYPE(cp_parser_type)                               :: parser
     495              : 
     496           58 :       SELECT CASE (gfn_type)
     497              :       CASE (0)
     498            0 :          CPABORT("gfn_type = 0: No spin polarisation possible!")
     499              :       CASE (1)
     500              :          ! OK
     501              :       CASE (2)
     502            0 :          CPABORT("gfn_type = 2 not yet supported")
     503              :       CASE DEFAULT
     504            0 :          CPABORT("Wrong gfn_type")
     505              :       END SELECT
     506              : 
     507           58 :       filename = ADJUSTL(TRIM(parameter_file_path))//ADJUSTL(TRIM(spinpol_param_file_name))
     508           58 :       CALL parser_create(parser, filename, apply_preprocessing=.FALSE., para_env=para_env)
     509              :       znum = 0
     510          754 :       param%wall = 0.0_dp
     511           58 :       CALL get_ptable_info(element_symbol, znum)
     512         4904 :       DO
     513              :          at_end = .FALSE.
     514         4962 :          CALL parser_get_next_line(parser, 1, at_end)
     515         4962 :          IF (at_end) EXIT
     516         4904 :          CALL parser_get_object(parser, zin)
     517         4962 :          IF (zin == znum) THEN
     518           58 :             CALL parser_get_object(parser, param%wall(1, 1))
     519           58 :             CALL parser_get_object(parser, param%wall(1, 2))
     520           58 :             CALL parser_get_object(parser, param%wall(2, 2))
     521           58 :             CALL parser_get_object(parser, param%wall(1, 3))
     522           58 :             CALL parser_get_object(parser, param%wall(2, 3))
     523           58 :             CALL parser_get_object(parser, param%wall(3, 3))
     524           58 :             param%wall(2, 1) = param%wall(1, 2)
     525           58 :             param%wall(3, 1) = param%wall(1, 3)
     526           58 :             param%wall(3, 2) = param%wall(2, 3)
     527              :          END IF
     528              :       END DO
     529           58 :       CALL parser_release(parser)
     530              : 
     531          174 :    END SUBROUTINE xtb_spinpol_init
     532              : 
     533              : ! **************************************************************************************************
     534              : !> \brief ...
     535              : !> \param param ...
     536              : !> \param gfn_type ...
     537              : !> \param xtb_control ...
     538              : ! **************************************************************************************************
     539           58 :    SUBROUTINE xtb_spinpol_ext(param, gfn_type, xtb_control)
     540              :       TYPE(xtb_atom_type), POINTER                       :: param
     541              :       INTEGER, INTENT(IN)                                :: gfn_type
     542              :       TYPE(xtb_control_type), INTENT(IN), POINTER        :: xtb_control
     543              : 
     544              :       INTEGER                                            :: i
     545              : 
     546           58 :       SELECT CASE (gfn_type)
     547              :       CASE (0)
     548            0 :          CPABORT("gfn_type = 0: No spin polarisation possible!")
     549              :       CASE (1)
     550              :          ! OK
     551              :       CASE (2)
     552            0 :          CPABORT("gfn_type = 2 not yet supported")
     553              :       CASE DEFAULT
     554           58 :          CPABORT("Wrong gfn_type")
     555              :       END SELECT
     556              : 
     557           58 :       IF (param%defined) THEN
     558           58 :          IF (ASSOCIATED(xtb_control%spinpol_type)) THEN
     559           12 :             DO i = 1, SIZE(xtb_control%spinpol_type)
     560           12 :                IF (xtb_control%spinpol_type(i) == param%z) THEN
     561            6 :                   param%wall(1, 1) = xtb_control%spinpol_vals(1, i)
     562            6 :                   param%wall(1, 2) = xtb_control%spinpol_vals(2, i)
     563            6 :                   param%wall(2, 2) = xtb_control%spinpol_vals(3, i)
     564            6 :                   param%wall(1, 3) = xtb_control%spinpol_vals(4, i)
     565            6 :                   param%wall(2, 3) = xtb_control%spinpol_vals(5, i)
     566            6 :                   param%wall(3, 3) = xtb_control%spinpol_vals(6, i)
     567            6 :                   param%wall(2, 1) = param%wall(1, 2)
     568            6 :                   param%wall(3, 1) = param%wall(1, 3)
     569            6 :                   param%wall(3, 2) = param%wall(2, 3)
     570            6 :                   EXIT
     571              :                END IF
     572              :             END DO
     573              :          END IF
     574              :       END IF
     575              : 
     576           58 :    END SUBROUTINE xtb_spinpol_ext
     577              : 
     578              : ! **************************************************************************************************
     579              : !> \brief Read atom parameters for xTB Hamiltonian from input file
     580              : !> \param param ...
     581              : ! **************************************************************************************************
     582         2256 :    SUBROUTINE xtb_parameters_set(param)
     583              : 
     584              :       TYPE(xtb_atom_type), POINTER                       :: param
     585              : 
     586              :       INTEGER                                            :: i, is, l, na
     587              :       REAL(KIND=dp), DIMENSION(5)                        :: kp
     588              : 
     589         2256 :       IF (param%defined) THEN
     590              :          ! AO to shell pointer
     591              :          ! AO to l-qn pointer
     592         2254 :          na = 0
     593         7396 :          DO is = 1, param%nshell
     594         5142 :             l = param%lval(is)
     595        18558 :             DO i = 1, 2*l + 1
     596        11162 :                na = na + 1
     597        11162 :                param%nao(na) = is
     598        16304 :                param%lao(na) = l
     599              :             END DO
     600              :          END DO
     601              :          !
     602         2254 :          i = param%z
     603              :          ! Electronegativity
     604         2254 :          param%electronegativity = eneg(i)
     605         2254 :          IF (param%en == 0.0_dp) param%en = eneg(i)
     606              :          ! covalent radius
     607         2254 :          param%rcov = crad(i)*bohr
     608              :          ! shell occupances
     609        13524 :          param%occupation(:) = occupation(:, i)
     610              :          ! check for consistency
     611        13524 :          IF (ABS(param%zeff - SUM(param%occupation)) > 1.E-10_dp) THEN
     612            0 :             CALL cp_abort(__LOCATION__, "Element <"//TRIM(param%aname)//"> has inconsistent shell occupations")
     613              :          END IF
     614              :          ! orbital energies [evolt] -> [a.u.]
     615        13524 :          param%hen = param%hen/evolt
     616              :          ! some forgotten scaling parameters (not in orig. paper)
     617         2254 :          param%xgamma = 0.1_dp*param%xgamma
     618        13524 :          param%kpoly(:) = 0.01_dp*param%kpoly(:)
     619        13524 :          param%kappa(:) = 0.1_dp*param%kappa(:)
     620              :          ! we have 1/6 g * q**3 (not 1/3)
     621         2254 :          param%xgamma = -2.0_dp*param%xgamma
     622              :          ! we need kpoly in shell order
     623        13524 :          kp(:) = param%kpoly(:)
     624        13524 :          param%kpoly(:) = 0.0_dp
     625         7396 :          DO is = 1, param%nshell
     626         5142 :             l = param%lval(is)
     627         7396 :             param%kpoly(is) = kp(l + 1)
     628              :          END DO
     629              :          ! kx
     630         2254 :          param%kx = 0.1_dp*param%kx
     631         2254 :          IF (param%kx < -5._dp) THEN
     632              :             ! use defaults
     633         4462 :             SELECT CASE (param%z)
     634              :             CASE DEFAULT
     635         2220 :                param%kx = 0.0_dp
     636              :             CASE (35) ! Br
     637           12 :                param%kx = 0.1_dp*0.381742_dp
     638              :             CASE (53) ! I
     639           10 :                param%kx = 0.1_dp*0.321944_dp
     640              :             CASE (85) ! At
     641         2242 :                param%kx = 0.1_dp*0.220000_dp
     642              :             END SELECT
     643              :          END IF
     644              :          ! chmax
     645         2254 :          param%chmax = clmt(i)
     646              :       END IF
     647              : 
     648         2256 :    END SUBROUTINE xtb_parameters_set
     649              : 
     650              : ! **************************************************************************************************
     651              : !> \brief ...
     652              : !> \param param ...
     653              : !> \param gto_basis_set ...
     654              : !> \param ngauss ...
     655              : ! **************************************************************************************************
     656         2254 :    SUBROUTINE init_xtb_basis(param, gto_basis_set, ngauss)
     657              : 
     658              :       TYPE(xtb_atom_type), POINTER                       :: param
     659              :       TYPE(gto_basis_set_type), POINTER                  :: gto_basis_set
     660              :       INTEGER, INTENT(IN)                                :: ngauss
     661              : 
     662         2254 :       CHARACTER(LEN=6), DIMENSION(:), POINTER            :: symbol
     663              :       INTEGER                                            :: i, nshell
     664         2254 :       INTEGER, DIMENSION(:), POINTER                     :: lq, nq
     665         2254 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: zet
     666              :       TYPE(sto_basis_set_type), POINTER                  :: sto_basis_set
     667              : 
     668         2254 :       IF (ASSOCIATED(param)) THEN
     669         2254 :          IF (param%defined) THEN
     670         2254 :             NULLIFY (sto_basis_set)
     671         2254 :             CALL allocate_sto_basis_set(sto_basis_set)
     672         2254 :             nshell = param%nshell
     673              : 
     674         6762 :             ALLOCATE (symbol(1:nshell))
     675         7396 :             symbol = ""
     676         7396 :             DO i = 1, nshell
     677         2254 :                SELECT CASE (param%lval(i))
     678              :                CASE (0)
     679         2766 :                   WRITE (symbol(i), '(I1,A1)') param%nval(i), "S"
     680              :                CASE (1)
     681         1742 :                   WRITE (symbol(i), '(I1,A1)') param%nval(i), "P"
     682              :                CASE (2)
     683          634 :                   WRITE (symbol(i), '(I1,A1)') param%nval(i), "D"
     684              :                CASE (3)
     685            0 :                   WRITE (symbol(i), '(I1,A1)') param%nval(i), "F"
     686              :                CASE DEFAULT
     687         5142 :                   CPABORT('BASIS SET OUT OF RANGE (lval)')
     688              :                END SELECT
     689              :             END DO
     690              : 
     691         2254 :             IF (nshell > 0) THEN
     692        13524 :                ALLOCATE (nq(nshell), lq(nshell), zet(nshell))
     693        14792 :                nq(1:nshell) = param%nval(1:nshell)
     694        14792 :                lq(1:nshell) = param%lval(1:nshell)
     695        14792 :                zet(1:nshell) = param%zeta(1:nshell)
     696              :                CALL set_sto_basis_set(sto_basis_set, name=param%aname, nshell=nshell, symbol=symbol, &
     697         2254 :                                       nq=nq, lq=lq, zet=zet)
     698         2254 :                CALL create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss=ngauss, ortho=.TRUE.)
     699              :             END IF
     700              : 
     701              :             ! this will remove the allocated arrays
     702         2254 :             CALL deallocate_sto_basis_set(sto_basis_set)
     703         2254 :             DEALLOCATE (symbol, nq, lq, zet)
     704              :          END IF
     705              : 
     706              :       ELSE
     707            0 :          CPABORT("The pointer param is not associated")
     708              :       END IF
     709              : 
     710         2254 :    END SUBROUTINE init_xtb_basis
     711              : 
     712              : ! **************************************************************************************************
     713              : !> \brief ...
     714              : !> \param za ...
     715              : !> \param zb ...
     716              : !> \param xtb_control ...
     717              : !> \return ...
     718              : ! **************************************************************************************************
     719        27826 :    FUNCTION xtb_set_kab(za, zb, xtb_control) RESULT(kab)
     720              : 
     721              :       INTEGER, INTENT(IN)                                :: za, zb
     722              :       TYPE(xtb_control_type), INTENT(IN), POINTER        :: xtb_control
     723              :       REAL(KIND=dp)                                      :: kab
     724              : 
     725              :       INTEGER                                            :: j, z
     726              :       LOGICAL                                            :: custom
     727              : 
     728        27826 :       kab = 1.0_dp
     729        27826 :       custom = .FALSE.
     730              : 
     731        27826 :       IF (xtb_control%kab_nval > 0) THEN
     732           28 :          DO j = 1, xtb_control%kab_nval
     733              :             IF ((za == xtb_control%kab_types(1, j) .AND. &
     734           28 :                  zb == xtb_control%kab_types(2, j)) .OR. &
     735              :                 (za == xtb_control%kab_types(2, j) .AND. &
     736            0 :                  zb == xtb_control%kab_types(1, j))) THEN
     737           28 :                custom = .TRUE.
     738           28 :                kab = xtb_control%kab_vals(j)
     739              :                EXIT
     740              :             END IF
     741              :          END DO
     742              :       END IF
     743              : 
     744              :       IF (.NOT. custom) THEN
     745        27798 :          IF (za == 1 .OR. zb == 1) THEN
     746              :             ! hydrogen
     747        15788 :             z = za + zb - 1
     748         3904 :             SELECT CASE (z)
     749              :             CASE (1)
     750         3904 :                kab = 0.96_dp
     751              :             CASE (5)
     752            0 :                kab = 0.95_dp
     753              :             CASE (7)
     754          760 :                kab = 1.04_dp
     755              :             CASE (28)
     756            0 :                kab = 0.90_dp
     757              :             CASE (75)
     758            0 :                kab = 0.80_dp
     759              :             CASE (78)
     760        15788 :                kab = 0.80_dp
     761              :             END SELECT
     762        12010 :          ELSE IF (za == 5 .OR. zb == 5) THEN
     763              :             ! Boron
     764            0 :             z = za + zb - 5
     765            0 :             SELECT CASE (z)
     766              :             CASE (15)
     767            0 :                kab = 0.97_dp
     768              :             END SELECT
     769        12010 :          ELSE IF (za == 7 .OR. zb == 7) THEN
     770              :             ! Nitrogen
     771         2008 :             z = za + zb - 7
     772            0 :             SELECT CASE (z)
     773              :             CASE (14)
     774              :                !xtb orig code parameter file
     775              :                ! in the paper this is Kab for B-Si
     776         2008 :                kab = 1.01_dp
     777              :             END SELECT
     778        10002 :          ELSE IF (za > 20 .AND. za < 30) THEN
     779              :             ! 3d
     780          178 :             IF (zb > 20 .AND. zb < 30) THEN
     781              :                ! 3d
     782              :                kab = 1.10_dp
     783           86 :             ELSE IF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
     784              :                ! 4d/5d/4f
     785            0 :                kab = 0.50_dp*(1.20_dp + 1.10_dp)
     786              :             END IF
     787         9824 :          ELSE IF ((za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80)) THEN
     788              :             ! 4d/5d/4f
     789           30 :             IF (zb > 20 .AND. zb < 30) THEN
     790              :                ! 3d
     791              :                kab = 0.50_dp*(1.20_dp + 1.10_dp)
     792           30 :             ELSE IF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
     793              :                ! 4d/5d/4f
     794           28 :                kab = 1.20_dp
     795              :             END IF
     796              :          END IF
     797              :       END IF
     798              : 
     799        27826 :    END FUNCTION xtb_set_kab
     800              : 
     801              : ! **************************************************************************************************
     802              : !> \brief ...
     803              : !> \param atag ...
     804              : !> \param nshell ...
     805              : !> \param nval ...
     806              : !> \param lval ...
     807              : !> \return ...
     808              : ! **************************************************************************************************
     809         2254 :    SUBROUTINE xtb_get_shells(atag, nshell, nval, lval)
     810              :       CHARACTER(len=*)                                   :: atag
     811              :       INTEGER                                            :: nshell
     812              :       INTEGER, DIMENSION(:)                              :: nval, lval
     813              : 
     814              :       CHARACTER(LEN=1)                                   :: ltag
     815              :       CHARACTER(LEN=10)                                  :: aotag
     816              :       INTEGER                                            :: i, j
     817              : 
     818         2254 :       aotag = ADJUSTL(TRIM(atag))
     819         2254 :       nshell = LEN(TRIM(aotag))/2
     820         7396 :       DO i = 1, nshell
     821         5142 :          j = (i - 1)*2 + 1
     822         5142 :          READ (aotag(j:j), FMT="(i1)") nval(i)
     823         5142 :          READ (aotag(j + 1:j + 1), FMT="(A1)") ltag
     824         5142 :          CALL uppercase(ltag)
     825         2254 :          SELECT CASE (ltag)
     826              :          CASE ("S")
     827         2766 :             lval(i) = 0
     828              :          CASE ("P")
     829         1742 :             lval(i) = 1
     830              :          CASE ("D")
     831         5142 :             lval(i) = 2
     832              :          CASE DEFAULT
     833              :          END SELECT
     834              :       END DO
     835              : 
     836         2254 :    END SUBROUTINE xtb_get_shells
     837              : 
     838              : ! **************************************************************************************************
     839              : !> \brief ...
     840              : !> \param z ...
     841              : !> \return ...
     842              : ! **************************************************************************************************
     843        10232 :    FUNCTION metal(z) RESULT(ismetal)
     844              :       INTEGER                                            :: z
     845              :       LOGICAL                                            :: ismetal
     846              : 
     847        10232 :       SELECT CASE (z)
     848              :       CASE DEFAULT
     849        10110 :          ismetal = .TRUE.
     850              :       CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
     851        10232 :          ismetal = .FALSE.
     852              :       END SELECT
     853              : 
     854        10232 :    END FUNCTION metal
     855              : 
     856              : ! **************************************************************************************************
     857              : !> \brief ...
     858              : !> \param z ...
     859              : !> \return ...
     860              : ! **************************************************************************************************
     861        10110 :    FUNCTION early3d(z) RESULT(isearly3d)
     862              :       INTEGER                                            :: z
     863              :       LOGICAL                                            :: isearly3d
     864              : 
     865        10110 :       isearly3d = .FALSE.
     866        10110 :       IF (z >= 21 .AND. z <= 24) isearly3d = .TRUE.
     867              : 
     868        10110 :    END FUNCTION early3d
     869              : 
     870              : ! **************************************************************************************************
     871              : !> \brief ...
     872              : !> \param za ...
     873              : !> \param zb ...
     874              : !> \return ...
     875              : ! **************************************************************************************************
     876        12308 :    FUNCTION pp_gfn0(za, zb) RESULT(pparm)
     877              :       INTEGER                                            :: za, zb
     878              :       REAL(KIND=dp)                                      :: pparm
     879              : 
     880        12308 :       pparm = 1.0_dp
     881        12308 :       IF ((za > 20 .AND. za < 30) .OR. (za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80)) THEN
     882          470 :          IF ((zb > 20 .AND. zb < 30) .OR. (zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
     883          220 :             pparm = 1.1_dp
     884          220 :             IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
     885              :                IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
     886           26 :                   pparm = 0.9_dp
     887              :                END IF
     888              :             END IF
     889              :          END IF
     890              :       END IF
     891              : 
     892        12308 :    END FUNCTION pp_gfn0
     893              : 
     894              : END MODULE xtb_parameters
     895              : 
        

Generated by: LCOV version 2.0-1