LCOV - code coverage report
Current view: top level - src - xtb_potentials.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 97.1 % 421 409
Test Date: 2025-07-25 12:55:17 Functions: 88.9 % 9 8

            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              : ! **************************************************************************************************
       9              : !> \brief xTB (repulsive) pair potentials
      10              : !>        Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
      11              : !>                   JCTC 13, 1989-2009, (2017)
      12              : !>                   DOI: 10.1021/acs.jctc.7b00118
      13              : !> \author JGH
      14              : ! **************************************************************************************************
      15              : MODULE xtb_potentials
      16              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      17              :                                               get_atomic_kind,&
      18              :                                               get_atomic_kind_set
      19              :    USE atprop_types,                    ONLY: atprop_type
      20              :    USE cp_control_types,                ONLY: dft_control_type,&
      21              :                                               xtb_control_type
      22              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      23              :                                               cp_logger_get_default_io_unit,&
      24              :                                               cp_logger_type,&
      25              :                                               cp_to_string
      26              :    USE ewald_environment_types,         ONLY: ewald_env_get,&
      27              :                                               ewald_environment_type
      28              :    USE fparser,                         ONLY: evalfd,&
      29              :                                               finalizef
      30              :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      31              :                                               section_vals_type,&
      32              :                                               section_vals_val_get
      33              :    USE kinds,                           ONLY: default_string_length,&
      34              :                                               dp
      35              :    USE message_passing,                 ONLY: mp_para_env_type
      36              :    USE pair_potential,                  ONLY: init_genpot
      37              :    USE pair_potential_types,            ONLY: not_initialized,&
      38              :                                               pair_potential_p_type,&
      39              :                                               pair_potential_pp_create,&
      40              :                                               pair_potential_pp_release,&
      41              :                                               pair_potential_pp_type,&
      42              :                                               pair_potential_single_clean,&
      43              :                                               pair_potential_single_copy,&
      44              :                                               pair_potential_single_type
      45              :    USE pair_potential_util,             ONLY: ener_pot
      46              :    USE particle_types,                  ONLY: particle_type
      47              :    USE qs_dispersion_cnum,              ONLY: dcnum_type
      48              :    USE qs_environment_types,            ONLY: get_qs_env,&
      49              :                                               qs_environment_type
      50              :    USE qs_force_types,                  ONLY: qs_force_type
      51              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      52              :                                               qs_kind_type
      53              :    USE qs_neighbor_list_types,          ONLY: get_iterator_info,&
      54              :                                               neighbor_list_iterate,&
      55              :                                               neighbor_list_iterator_create,&
      56              :                                               neighbor_list_iterator_p_type,&
      57              :                                               neighbor_list_iterator_release,&
      58              :                                               neighbor_list_set_p_type
      59              :    USE string_utilities,                ONLY: compress,&
      60              :                                               uppercase
      61              :    USE virial_methods,                  ONLY: virial_pair_force
      62              :    USE virial_types,                    ONLY: virial_type
      63              :    USE xtb_types,                       ONLY: get_xtb_atom_param,&
      64              :                                               xtb_atom_type
      65              : #include "./base/base_uses.f90"
      66              : 
      67              :    IMPLICIT NONE
      68              : 
      69              :    TYPE neighbor_atoms_type
      70              :       REAL(KIND=dp), DIMENSION(:, :), POINTER     :: coord => NULL()
      71              :       REAL(KIND=dp), DIMENSION(:), POINTER        :: rab => NULL()
      72              :       INTEGER, DIMENSION(:), POINTER              :: katom => NULL()
      73              :    END TYPE neighbor_atoms_type
      74              : 
      75              :    PRIVATE
      76              : 
      77              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_potentials'
      78              : 
      79              :    PUBLIC :: xtb_pp_radius, repulsive_potential, srb_potential
      80              :    PUBLIC :: nonbonded_correction, xb_interaction
      81              :    PUBLIC :: neighbor_atoms_type
      82              : 
      83              : CONTAINS
      84              : 
      85              : ! **************************************************************************************************
      86              : !> \brief ...
      87              : !> \param qs_env ...
      88              : !> \param erep ...
      89              : !> \param kf ...
      90              : !> \param enscale ...
      91              : !> \param calculate_forces ...
      92              : ! **************************************************************************************************
      93         5224 :    SUBROUTINE repulsive_potential(qs_env, erep, kf, enscale, calculate_forces)
      94              :       TYPE(qs_environment_type), POINTER                 :: qs_env
      95              :       REAL(dp), INTENT(INOUT)                            :: erep
      96              :       REAL(dp), INTENT(IN)                               :: kf, enscale
      97              :       LOGICAL, INTENT(IN)                                :: calculate_forces
      98              : 
      99              :       CHARACTER(len=*), PARAMETER :: routineN = 'repulsive_potential'
     100              : 
     101              :       INTEGER                                            :: atom_a, atom_b, handle, iatom, ikind, &
     102              :                                                             jatom, jkind, za, zb
     103         5224 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind
     104              :       INTEGER, DIMENSION(3)                              :: cell
     105              :       LOGICAL                                            :: defined, use_virial
     106              :       REAL(KIND=dp)                                      :: alphaa, alphab, den2, den4, derepij, dr, &
     107              :                                                             ena, enb, ens, erepij, f1, sal, &
     108              :                                                             zneffa, zneffb
     109              :       REAL(KIND=dp), DIMENSION(3)                        :: force_rr, rij
     110         5224 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     111              :       TYPE(atprop_type), POINTER                         :: atprop
     112              :       TYPE(neighbor_list_iterator_p_type), &
     113         5224 :          DIMENSION(:), POINTER                           :: nl_iterator
     114              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     115         5224 :          POINTER                                         :: sab_xtb_pp
     116         5224 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
     117         5224 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     118              :       TYPE(virial_type), POINTER                         :: virial
     119              :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b
     120              : 
     121         5224 :       CALL timeset(routineN, handle)
     122              : 
     123         5224 :       erep = 0._dp
     124              : 
     125              :       CALL get_qs_env(qs_env=qs_env, &
     126              :                       atomic_kind_set=atomic_kind_set, &
     127              :                       qs_kind_set=qs_kind_set, &
     128              :                       atprop=atprop, &
     129         5224 :                       sab_xtb_pp=sab_xtb_pp)
     130         5224 :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
     131              : 
     132         5224 :       IF (calculate_forces) THEN
     133          540 :          CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
     134          540 :          use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
     135              :       END IF
     136              : 
     137         5224 :       CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
     138       107841 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     139              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     140       102617 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     141       102617 :          CALL get_qs_kind(qs_kind_set(ikind), zatom=za, xtb_parameter=xtb_atom_a)
     142       102617 :          CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
     143       102617 :          IF (.NOT. defined) CYCLE
     144       102617 :          CALL get_qs_kind(qs_kind_set(jkind), zatom=zb, xtb_parameter=xtb_atom_b)
     145       102617 :          CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
     146       102617 :          IF (.NOT. defined) CYCLE
     147              : 
     148       410468 :          dr = SQRT(SUM(rij(:)**2))
     149              :          ! repulsive potential
     150       107841 :          IF (dr > 0.001_dp) THEN
     151              : 
     152              :             ! atomic parameters
     153        83233 :             CALL get_xtb_atom_param(xtb_atom_a, en=ena, alpha=alphaa, zneff=zneffa)
     154        83233 :             CALL get_xtb_atom_param(xtb_atom_b, en=enb, alpha=alphab, zneff=zneffb)
     155              : 
     156              :             ! scaling (not in papers! but in code)
     157        83233 :             den2 = (ena - enb)**2
     158        83233 :             den4 = den2*den2
     159        83233 :             sal = SQRT(alphaa*alphab)
     160        83233 :             ens = 1.0_dp + (0.01_dp*den2 + 0.01_dp*den4)*enscale
     161              : 
     162        83233 :             erepij = zneffa*zneffb/dr*EXP(-ens*sal*dr**kf)
     163        83233 :             erep = erep + erepij
     164        83233 :             IF (atprop%energy) THEN
     165         3458 :                atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*erepij
     166         3458 :                atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*erepij
     167              :             END IF
     168        83233 :             IF (calculate_forces .AND. (iatom /= jatom .OR. dr > 0.001_dp)) THEN
     169         9934 :                derepij = -(1.0_dp/dr + ens*sal*kf*dr**(kf - 1.0_dp))*erepij
     170         9934 :                force_rr(1) = derepij*rij(1)/dr
     171         9934 :                force_rr(2) = derepij*rij(2)/dr
     172         9934 :                force_rr(3) = derepij*rij(3)/dr
     173         9934 :                atom_a = atom_of_kind(iatom)
     174         9934 :                atom_b = atom_of_kind(jatom)
     175        39736 :                force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
     176        39736 :                force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
     177         9934 :                IF (use_virial) THEN
     178         6164 :                   f1 = 1.0_dp
     179         6164 :                   IF (iatom == jatom) f1 = 0.5_dp
     180         6164 :                   CALL virial_pair_force(virial%pv_virial, -f1, force_rr, rij)
     181              :                END IF
     182              :             END IF
     183              :          END IF
     184              : 
     185              :       END DO
     186         5224 :       CALL neighbor_list_iterator_release(nl_iterator)
     187              : 
     188         5224 :       CALL timestop(handle)
     189              : 
     190        10448 :    END SUBROUTINE repulsive_potential
     191              : 
     192              : ! **************************************************************************************************
     193              : !> \brief ...
     194              : !> \param qs_env ...
     195              : !> \param esrb ...
     196              : !> \param calculate_forces ...
     197              : !> \param xtb_control ...
     198              : !> \param cnumbers ...
     199              : !> \param dcnum ...
     200              : ! **************************************************************************************************
     201         1646 :    SUBROUTINE srb_potential(qs_env, esrb, calculate_forces, xtb_control, cnumbers, dcnum)
     202              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     203              :       REAL(dp), INTENT(INOUT)                            :: esrb
     204              :       LOGICAL, INTENT(IN)                                :: calculate_forces
     205              :       TYPE(xtb_control_type), POINTER                    :: xtb_control
     206              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: cnumbers
     207              :       TYPE(dcnum_type), DIMENSION(:), INTENT(IN)         :: dcnum
     208              : 
     209              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'srb_potential'
     210              :       REAL(KIND=dp), DIMENSION(5:9), PARAMETER :: &
     211              :          cnfac = (/0.05646607_dp, 0.10514203_dp, 0.09753494_dp, 0.30470380_dp, 0.23261783_dp/), &
     212              :          ensrb = (/2.20568300_dp, 2.49640820_dp, 2.81007174_dp, 4.51078438_dp, 4.67476223_dp/), &
     213              :          r0srb = (/1.35974851_dp, 0.98310699_dp, 0.98423007_dp, 0.76716063_dp, 1.06139799_dp/)
     214              : 
     215              :       INTEGER                                            :: atom_a, atom_b, atom_c, handle, i, &
     216              :                                                             iatom, ikind, jatom, jkind, katom, &
     217              :                                                             kkind, za, zb
     218         1646 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, kind_of
     219              :       INTEGER, DIMENSION(3)                              :: cell
     220              :       LOGICAL                                            :: defined, use_virial
     221              :       REAL(KIND=dp)                                      :: c1srb, c2srb, den1, den2, desrbij, dr, &
     222              :                                                             dr0, drk, enta, entb, esrbij, etasrb, &
     223              :                                                             f1, fhua, fhub, gscal, ksrb, rra0, &
     224              :                                                             rrb0, shift
     225              :       REAL(KIND=dp), DIMENSION(3)                        :: fdik, force_rr, rij, rik
     226         1646 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     227              :       TYPE(atprop_type), POINTER                         :: atprop
     228              :       TYPE(neighbor_list_iterator_p_type), &
     229         1646 :          DIMENSION(:), POINTER                           :: nl_iterator
     230              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     231         1646 :          POINTER                                         :: sab_xtb_pp
     232         1646 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
     233         1646 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     234              :       TYPE(virial_type), POINTER                         :: virial
     235              :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b
     236              : 
     237         1646 :       CALL timeset(routineN, handle)
     238              : 
     239         1646 :       esrb = 0._dp
     240              : 
     241              :       CALL get_qs_env(qs_env=qs_env, &
     242              :                       atomic_kind_set=atomic_kind_set, &
     243              :                       qs_kind_set=qs_kind_set, &
     244              :                       atprop=atprop, &
     245         1646 :                       sab_xtb_pp=sab_xtb_pp)
     246              :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, &
     247         1646 :                                kind_of=kind_of)
     248              : 
     249         1646 :       IF (calculate_forces) THEN
     250           42 :          CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
     251           42 :          use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
     252              :       END IF
     253              : 
     254              :       ! SRB parameters
     255         1646 :       ksrb = xtb_control%ksrb
     256         1646 :       etasrb = xtb_control%esrb
     257         1646 :       c1srb = xtb_control%c1srb*0.01_dp
     258         1646 :       c2srb = xtb_control%c2srb*0.01_dp
     259         1646 :       gscal = xtb_control%gscal
     260         1646 :       shift = xtb_control%shift
     261              : 
     262         1646 :       CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
     263        26770 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     264              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     265        25124 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     266        25124 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     267        25124 :          CALL get_xtb_atom_param(xtb_atom_a, z=za, electronegativity=enta, defined=defined)
     268        25124 :          IF (.NOT. defined) CYCLE
     269        25124 :          CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     270        25124 :          CALL get_xtb_atom_param(xtb_atom_b, z=zb, electronegativity=entb, defined=defined)
     271        25124 :          IF (.NOT. defined) CYCLE
     272              : 
     273       100496 :          dr = SQRT(SUM(rij(:)**2))
     274              :          ! short-ranged correction term
     275        26770 :          IF (dr > 0.001_dp) THEN
     276        21249 :          IF (za >= 5 .AND. za <= 9 .AND. zb >= 5 .AND. zb <= 9 .AND. za /= zb) THEN
     277          539 :             rra0 = r0srb(za) + cnfac(za)*cnumbers(iatom) + shift
     278          539 :             rrb0 = r0srb(zb) + cnfac(zb)*cnumbers(jatom) + shift
     279          539 :             den1 = ABS(ensrb(za) - ensrb(zb))
     280          539 :             dr0 = (rra0 + rrb0)*(1._dp - c1srb*den1 - c2srb*den1*den1)
     281          539 :             den2 = (enta - entb)**2
     282          539 :             esrbij = ksrb*EXP(-etasrb*(1._dp + gscal*den2)*(dr - dr0)**2)
     283          539 :             esrb = esrb + esrbij
     284          539 :             IF (atprop%energy) THEN
     285            0 :                atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*esrbij
     286            0 :                atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*esrbij
     287              :             END IF
     288          539 :             IF (calculate_forces) THEN
     289           17 :                desrbij = 2.0_dp*esrbij*(-etasrb*(1._dp + gscal*den2)*(dr - dr0))
     290           17 :                force_rr(1) = desrbij*rij(1)/dr
     291           17 :                force_rr(2) = desrbij*rij(2)/dr
     292           17 :                force_rr(3) = desrbij*rij(3)/dr
     293           17 :                atom_a = atom_of_kind(iatom)
     294           17 :                atom_b = atom_of_kind(jatom)
     295           68 :                force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
     296           68 :                force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
     297           17 :                IF (use_virial) THEN
     298            1 :                   f1 = 1.0_dp
     299            1 :                   IF (iatom == jatom) f1 = 0.5_dp
     300            1 :                   CALL virial_pair_force(virial%pv_virial, -f1, force_rr, rij)
     301              :                END IF
     302              :                ! coordination number derivatives
     303              :                ! iatom
     304           17 :                fhua = -desrbij*cnfac(za)*(1._dp - c1srb*den1 - c2srb*den1*den1)
     305           68 :                DO i = 1, dcnum(iatom)%neighbors
     306           51 :                   katom = dcnum(iatom)%nlist(i)
     307           51 :                   kkind = kind_of(katom)
     308           51 :                   atom_c = atom_of_kind(katom)
     309          204 :                   rik = dcnum(iatom)%rik(:, i)
     310          204 :                   drk = SQRT(SUM(rik(:)**2))
     311           68 :                   IF (drk > 1.e-3_dp) THEN
     312          204 :                      fdik(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
     313          204 :                      force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fdik(:)
     314          204 :                      force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fdik(:)
     315           51 :                      IF (use_virial) THEN
     316            3 :                         CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
     317              :                      END IF
     318              :                   END IF
     319              :                END DO
     320              :                ! jatom
     321           17 :                fhub = -desrbij*cnfac(zb)*(1._dp - c1srb*den1 - c2srb*den1*den1)
     322           34 :                DO i = 1, dcnum(jatom)%neighbors
     323           17 :                   katom = dcnum(jatom)%nlist(i)
     324           17 :                   kkind = kind_of(katom)
     325           17 :                   atom_c = atom_of_kind(katom)
     326           68 :                   rik = dcnum(jatom)%rik(:, i)
     327           68 :                   drk = SQRT(SUM(rik(:)**2))
     328           34 :                   IF (drk > 1.e-3_dp) THEN
     329           68 :                      fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
     330           68 :                      force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) - fdik(:)
     331           68 :                      force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fdik(:)
     332           17 :                      IF (use_virial) THEN
     333            1 :                         CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
     334              :                      END IF
     335              :                   END IF
     336              :                END DO
     337              :             END IF
     338              :          END IF
     339              :          END IF
     340              : 
     341              :       END DO
     342         1646 :       CALL neighbor_list_iterator_release(nl_iterator)
     343              : 
     344         1646 :       CALL timestop(handle)
     345              : 
     346         3292 :    END SUBROUTINE srb_potential
     347              : 
     348              : ! **************************************************************************************************
     349              : !> \brief ...
     350              : !> \param qs_kind_set ...
     351              : !> \param ppradius ...
     352              : !> \param eps_pair ...
     353              : !> \param kfparam ...
     354              : ! **************************************************************************************************
     355          944 :    SUBROUTINE xtb_pp_radius(qs_kind_set, ppradius, eps_pair, kfparam)
     356              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     357              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: ppradius
     358              :       REAL(KIND=dp), INTENT(IN)                          :: eps_pair, kfparam
     359              : 
     360              :       INTEGER                                            :: ikind, ir, jkind, nkind
     361              :       LOGICAL                                            :: defa, defb
     362              :       REAL(KIND=dp)                                      :: alphaa, alphab, erep, rab, rab0, rcova, &
     363              :                                                             rcovb, saa, zneffa, zneffb
     364              :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b
     365              : 
     366         8336 :       ppradius = 0.0_dp
     367          944 :       nkind = SIZE(ppradius, 1)
     368         3040 :       DO ikind = 1, nkind
     369         2096 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     370         2096 :          CALL get_xtb_atom_param(xtb_atom_a, rcov=rcova, alpha=alphaa, zneff=zneffa, defined=defa)
     371         2096 :          IF (.NOT. defa) CYCLE
     372         8828 :          DO jkind = ikind, nkind
     373         3694 :             CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     374         3694 :             CALL get_xtb_atom_param(xtb_atom_b, rcov=rcovb, alpha=alphab, zneff=zneffb, defined=defb)
     375         3694 :             IF (.NOT. defb) CYCLE
     376              :             rab = 0.0_dp
     377        26018 :             DO ir = 1, 24
     378        26018 :                rab = rab + 1.0_dp
     379        26018 :                saa = SQRT(alphaa*alphab)
     380        26018 :                erep = zneffa*zneffb/rab*EXP(-saa*rab**kfparam)
     381        26018 :                IF (erep < eps_pair) EXIT
     382              :             END DO
     383         3692 :             rab0 = rcova + rcovb
     384         3692 :             rab = MAX(rab, rab0 + 2.0_dp)
     385         3692 :             ppradius(ikind, jkind) = rab
     386         9482 :             ppradius(jkind, ikind) = ppradius(ikind, jkind)
     387              :          END DO
     388              :       END DO
     389              : 
     390          944 :    END SUBROUTINE xtb_pp_radius
     391              : 
     392              : ! **************************************************************************************************
     393              : !> \brief ...
     394              : !> \param qs_env ...
     395              : !> \param exb ...
     396              : !> \param calculate_forces ...
     397              : ! **************************************************************************************************
     398         3578 :    SUBROUTINE xb_interaction(qs_env, exb, calculate_forces)
     399              : 
     400              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     401              :       REAL(KIND=dp), INTENT(INOUT)                       :: exb
     402              :       LOGICAL, INTENT(IN)                                :: calculate_forces
     403              : 
     404              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'xb_interaction'
     405              : 
     406              :       INTEGER                                            :: atom_a, atom_b, handle, iatom, ikind, &
     407              :                                                             jatom, jkind, na, natom, nkind, zat
     408         3578 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, kind_of
     409              :       INTEGER, DIMENSION(3)                              :: cell
     410              :       LOGICAL                                            :: defined, use_virial
     411              :       REAL(KIND=dp)                                      :: dr, kx2, kxr, rcova, rcovb
     412         3578 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: kx
     413         3578 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: rcab
     414              :       REAL(KIND=dp), DIMENSION(3)                        :: rij
     415         3578 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     416              :       TYPE(atprop_type), POINTER                         :: atprop
     417              :       TYPE(dft_control_type), POINTER                    :: dft_control
     418              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     419              :       TYPE(neighbor_atoms_type), ALLOCATABLE, &
     420         3578 :          DIMENSION(:)                                    :: neighbor_atoms
     421              :       TYPE(neighbor_list_iterator_p_type), &
     422         3578 :          DIMENSION(:), POINTER                           :: nl_iterator
     423              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     424         3578 :          POINTER                                         :: sab_xb, sab_xtb_pp
     425         3578 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     426         3578 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
     427         3578 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     428              :       TYPE(virial_type), POINTER                         :: virial
     429              :       TYPE(xtb_atom_type), POINTER                       :: xtb_atom_a, xtb_atom_b
     430              :       TYPE(xtb_control_type), POINTER                    :: xtb_control
     431              : 
     432         3578 :       CALL timeset(routineN, handle)
     433              : 
     434              :       CALL get_qs_env(qs_env=qs_env, &
     435              :                       atomic_kind_set=atomic_kind_set, &
     436              :                       qs_kind_set=qs_kind_set, &
     437              :                       para_env=para_env, &
     438              :                       atprop=atprop, &
     439              :                       dft_control=dft_control, &
     440              :                       sab_xb=sab_xb, &
     441         3578 :                       sab_xtb_pp=sab_xtb_pp)
     442              : 
     443         3578 :       nkind = SIZE(atomic_kind_set)
     444         3578 :       xtb_control => dft_control%qs_control%xtb_control
     445              : 
     446              :       ! global parameters
     447         3578 :       kxr = xtb_control%kxr
     448         3578 :       kx2 = xtb_control%kx2
     449              : 
     450         3578 :       NULLIFY (particle_set)
     451         3578 :       CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
     452         3578 :       natom = SIZE(particle_set)
     453         3578 :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
     454         3578 :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
     455              : 
     456         3578 :       IF (calculate_forces) THEN
     457          498 :          CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
     458          886 :          use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
     459              :       END IF
     460              : 
     461              :       ! list of neighbor atoms for XB term
     462        19570 :       ALLOCATE (neighbor_atoms(nkind))
     463        12414 :       DO ikind = 1, nkind
     464         8836 :          NULLIFY (neighbor_atoms(ikind)%coord)
     465         8836 :          NULLIFY (neighbor_atoms(ikind)%rab)
     466         8836 :          NULLIFY (neighbor_atoms(ikind)%katom)
     467         8836 :          CALL get_atomic_kind(atomic_kind_set(ikind), z=zat, natom=na)
     468        12414 :          IF (zat == 17 .OR. zat == 35 .OR. zat == 53 .OR. zat == 85) THEN
     469          174 :             ALLOCATE (neighbor_atoms(ikind)%coord(3, na))
     470          290 :             neighbor_atoms(ikind)%coord(1:3, 1:na) = 0.0_dp
     471          174 :             ALLOCATE (neighbor_atoms(ikind)%rab(na))
     472          116 :             neighbor_atoms(ikind)%rab(1:na) = HUGE(0.0_dp)
     473          174 :             ALLOCATE (neighbor_atoms(ikind)%katom(na))
     474          116 :             neighbor_atoms(ikind)%katom(1:na) = 0
     475              :          END IF
     476              :       END DO
     477              :       ! kx parameters
     478        10734 :       ALLOCATE (kx(nkind))
     479        12414 :       DO ikind = 1, nkind
     480         8836 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     481        12414 :          CALL get_xtb_atom_param(xtb_atom_a, kx=kx(ikind))
     482              :       END DO
     483              :       !
     484        14312 :       ALLOCATE (rcab(nkind, nkind))
     485        12414 :       DO ikind = 1, nkind
     486         8836 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     487         8836 :          CALL get_xtb_atom_param(xtb_atom_a, rcov=rcova)
     488        36886 :          DO jkind = 1, nkind
     489        24472 :             CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     490        24472 :             CALL get_xtb_atom_param(xtb_atom_b, rcov=rcovb)
     491        33308 :             rcab(ikind, jkind) = kxr*(rcova + rcovb)
     492              :          END DO
     493              :       END DO
     494              : 
     495         3578 :       CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
     496        81071 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     497              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     498        77493 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     499        77493 :          CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
     500        77493 :          CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
     501        77493 :          IF (.NOT. defined) CYCLE
     502        77493 :          CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
     503        77493 :          CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
     504        77493 :          IF (.NOT. defined) CYCLE
     505              : 
     506       309972 :          dr = SQRT(SUM(rij(:)**2))
     507              : 
     508              :          ! neighbor atom for XB term
     509        81071 :          IF (dr > 1.e-3_dp) THEN
     510        61984 :             IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
     511           82 :                atom_a = atom_of_kind(iatom)
     512           82 :                IF (dr < neighbor_atoms(ikind)%rab(atom_a)) THEN
     513           41 :                   neighbor_atoms(ikind)%rab(atom_a) = dr
     514          164 :                   neighbor_atoms(ikind)%coord(1:3, atom_a) = rij(1:3)
     515           41 :                   neighbor_atoms(ikind)%katom(atom_a) = jatom
     516              :                END IF
     517              :             END IF
     518        61984 :             IF (ASSOCIATED(neighbor_atoms(jkind)%rab)) THEN
     519          111 :                atom_b = atom_of_kind(jatom)
     520          111 :                IF (dr < neighbor_atoms(jkind)%rab(atom_b)) THEN
     521           74 :                   neighbor_atoms(jkind)%rab(atom_b) = dr
     522          296 :                   neighbor_atoms(jkind)%coord(1:3, atom_b) = -rij(1:3)
     523           74 :                   neighbor_atoms(jkind)%katom(atom_b) = iatom
     524              :                END IF
     525              :             END IF
     526              :          END IF
     527              : 
     528              :       END DO
     529         3578 :       CALL neighbor_list_iterator_release(nl_iterator)
     530              : 
     531         3578 :       exb = 0.0_dp
     532         3578 :       CALL xb_neighbors(neighbor_atoms, para_env)
     533              :       CALL xb_energy(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
     534         3578 :                      calculate_forces, use_virial, force, virial, atprop)
     535              : 
     536        12414 :       DO ikind = 1, nkind
     537         8836 :          IF (ASSOCIATED(neighbor_atoms(ikind)%coord)) THEN
     538           58 :             DEALLOCATE (neighbor_atoms(ikind)%coord)
     539              :          END IF
     540         8836 :          IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
     541           58 :             DEALLOCATE (neighbor_atoms(ikind)%rab)
     542              :          END IF
     543        12414 :          IF (ASSOCIATED(neighbor_atoms(ikind)%katom)) THEN
     544           58 :             DEALLOCATE (neighbor_atoms(ikind)%katom)
     545              :          END IF
     546              :       END DO
     547         3578 :       DEALLOCATE (neighbor_atoms)
     548         3578 :       DEALLOCATE (kx, rcab)
     549              : 
     550         3578 :       CALL timestop(handle)
     551              : 
     552         7156 :    END SUBROUTINE xb_interaction
     553              : 
     554              : ! **************************************************************************************************
     555              : !> \brief  Distributes the neighbor atom information to all processors
     556              : !>
     557              : !> \param neighbor_atoms ...
     558              : !> \param para_env ...
     559              : !> \par History
     560              : !>       1.2019 JGH
     561              : !> \version 1.1
     562              : ! **************************************************************************************************
     563         3578 :    SUBROUTINE xb_neighbors(neighbor_atoms, para_env)
     564              :       TYPE(neighbor_atoms_type), DIMENSION(:), &
     565              :          INTENT(INOUT)                                   :: neighbor_atoms
     566              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     567              : 
     568              :       INTEGER                                            :: iatom, ikind, natom, nkind
     569         3578 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: matom
     570         3578 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: dmloc
     571         3578 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: coord
     572              : 
     573         3578 :       nkind = SIZE(neighbor_atoms)
     574        12414 :       DO ikind = 1, nkind
     575        12414 :          IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
     576           58 :             natom = SIZE(neighbor_atoms(ikind)%rab)
     577          406 :             ALLOCATE (dmloc(2*natom), matom(natom), coord(3, natom))
     578          174 :             dmloc = 0.0_dp
     579          116 :             DO iatom = 1, natom
     580           58 :                dmloc(2*iatom - 1) = neighbor_atoms(ikind)%rab(iatom)
     581          116 :                dmloc(2*iatom) = REAL(para_env%mepos, KIND=dp)
     582              :             END DO
     583           58 :             CALL para_env%minloc(dmloc)
     584          290 :             coord = 0.0_dp
     585          116 :             matom = 0
     586          116 :             DO iatom = 1, natom
     587           58 :                neighbor_atoms(ikind)%rab(iatom) = dmloc(2*iatom - 1)
     588          116 :                IF (NINT(dmloc(2*iatom)) == para_env%mepos) THEN
     589          116 :                   coord(1:3, iatom) = neighbor_atoms(ikind)%coord(1:3, iatom)
     590           29 :                   matom(iatom) = neighbor_atoms(ikind)%katom(iatom)
     591              :                END IF
     592              :             END DO
     593           58 :             CALL para_env%sum(coord)
     594          290 :             neighbor_atoms(ikind)%coord(1:3, :) = coord(1:3, :)
     595           58 :             CALL para_env%sum(matom)
     596          116 :             neighbor_atoms(ikind)%katom(:) = matom(:)
     597           58 :             DEALLOCATE (dmloc, matom, coord)
     598              :          END IF
     599              :       END DO
     600              : 
     601         3578 :    END SUBROUTINE xb_neighbors
     602              : 
     603              : ! **************************************************************************************************
     604              : !> \brief  Computes a correction for nonbonded interactions based on a generic potential
     605              : !>
     606              : !> \param enonbonded energy contribution
     607              : !> \param force ...
     608              : !> \param qs_env ...
     609              : !> \param xtb_control ...
     610              : !> \param sab_xtb_nonbond ...
     611              : !> \param atomic_kind_set ...
     612              : !> \param calculate_forces ...
     613              : !> \param use_virial ...
     614              : !> \param virial ...
     615              : !> \param atprop ...
     616              : !> \param atom_of_kind ..
     617              : !> \par History
     618              : !>      12.2018 JGH
     619              : !> \version 1.1
     620              : ! **************************************************************************************************
     621           68 :    SUBROUTINE nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
     622           34 :                                    atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
     623              :       REAL(dp), INTENT(INOUT)                            :: enonbonded
     624              :       TYPE(qs_force_type), DIMENSION(:), INTENT(INOUT), &
     625              :          POINTER                                         :: force
     626              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     627              :       TYPE(xtb_control_type), POINTER                    :: xtb_control
     628              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     629              :          INTENT(IN), POINTER                             :: sab_xtb_nonbond
     630              :       TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
     631              :          POINTER                                         :: atomic_kind_set
     632              :       LOGICAL, INTENT(IN)                                :: calculate_forces, use_virial
     633              :       TYPE(virial_type), INTENT(IN), POINTER             :: virial
     634              :       TYPE(atprop_type), INTENT(IN), POINTER             :: atprop
     635              :       INTEGER, DIMENSION(:), INTENT(IN)                  :: atom_of_kind
     636              : 
     637              :       CHARACTER(len=*), PARAMETER :: routineN = 'nonbonded_correction'
     638              : 
     639              :       CHARACTER(LEN=default_string_length)               :: def_error, this_error
     640              :       INTEGER                                            :: atom_i, atom_j, handle, iatom, ikind, &
     641              :                                                             jatom, jkind, kk, ntype
     642              :       INTEGER, DIMENSION(3)                              :: cell
     643              :       LOGICAL                                            :: do_ewald
     644              :       REAL(KIND=dp)                                      :: dedf, dr, dx, energy_cutoff, err, fval, &
     645              :                                                             lerr, rcut
     646              :       REAL(KIND=dp), DIMENSION(3)                        :: fij, rij
     647              :       TYPE(ewald_environment_type), POINTER              :: ewald_env
     648              :       TYPE(neighbor_list_iterator_p_type), &
     649           34 :          DIMENSION(:), POINTER                           :: nl_iterator
     650              :       TYPE(pair_potential_p_type), POINTER               :: nonbonded
     651              :       TYPE(pair_potential_pp_type), POINTER              :: potparm
     652              :       TYPE(pair_potential_single_type), POINTER          :: pot
     653              :       TYPE(section_vals_type), POINTER                   :: nonbonded_section
     654              : 
     655           34 :       CALL timeset(routineN, handle)
     656              : 
     657              :       NULLIFY (nonbonded)
     658           34 :       NULLIFY (potparm)
     659           34 :       NULLIFY (ewald_env)
     660           34 :       nonbonded => xtb_control%nonbonded
     661           34 :       do_ewald = xtb_control%do_ewald
     662           34 :       CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
     663              : 
     664           34 :       ntype = SIZE(atomic_kind_set)
     665           34 :       CALL pair_potential_pp_create(potparm, ntype)
     666              :       !Assign input and potential info to potparm_nonbond
     667           34 :       CALL force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
     668              :       !Initialize genetic potential
     669           34 :       CALL init_genpot(potparm, ntype)
     670              : 
     671           34 :       NULLIFY (pot)
     672           34 :       enonbonded = 0._dp
     673           34 :       energy_cutoff = 0._dp
     674              : 
     675           34 :       CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_nonbond)
     676          227 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     677              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     678          193 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     679          193 :          pot => potparm%pot(ikind, jkind)%pot
     680          193 :          dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
     681          193 :          rcut = SQRT(pot%rcutsq)
     682          193 :          IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
     683           25 :             fval = 1.0_dp
     684           25 :             IF (ikind == jkind) fval = 0.5_dp
     685              :             ! splines not implemented
     686           25 :             enonbonded = enonbonded + fval*ener_pot(pot, dr, energy_cutoff)
     687           25 :             IF (atprop%energy) THEN
     688           16 :                atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
     689           16 :                atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
     690              :             END IF
     691              :          END IF
     692              : 
     693          193 :          IF (calculate_forces) THEN
     694              : 
     695           93 :             kk = SIZE(pot%type)
     696           93 :             IF (kk /= 1) THEN
     697            0 :                CALL cp_warn(__LOCATION__, "Generic potential with type > 1 not implemented.")
     698            0 :                CPABORT("pot type")
     699              :             END IF
     700              :             ! rmin and rmax and rcut
     701           93 :             IF ((pot%set(kk)%rmin /= not_initialized) .AND. (dr < pot%set(kk)%rmin)) CYCLE
     702              :             ! An upper boundary for the potential definition was defined
     703           93 :             IF ((pot%set(kk)%rmax /= not_initialized) .AND. (dr >= pot%set(kk)%rmax)) CYCLE
     704              :             ! If within limits let's compute the potential...
     705           93 :             IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
     706              : 
     707            9 :                NULLIFY (nonbonded_section)
     708            9 :                nonbonded_section => section_vals_get_subs_vals(qs_env%input, "DFT%QS%xTB%NONBONDED")
     709            9 :                CALL section_vals_val_get(nonbonded_section, "DX", r_val=dx)
     710            9 :                CALL section_vals_val_get(nonbonded_section, "ERROR_LIMIT", r_val=lerr)
     711              : 
     712            9 :                dedf = fval*evalfd(pot%set(kk)%gp%myid, 1, pot%set(kk)%gp%values, dx, err)
     713            9 :                IF (ABS(err) > lerr) THEN
     714            1 :                   WRITE (this_error, "(A,G12.6,A)") "(", err, ")"
     715            1 :                   WRITE (def_error, "(A,G12.6,A)") "(", lerr, ")"
     716            1 :                   CALL compress(this_error, .TRUE.)
     717            1 :                   CALL compress(def_error, .TRUE.)
     718              :                   CALL cp_warn(__LOCATION__, &
     719              :                                'ASSERTION (cond) failed at line '//cp_to_string(__LINE__)// &
     720              :                                ' Error '//TRIM(this_error)//' in computing numerical derivatives larger then'// &
     721            1 :                                TRIM(def_error)//' .')
     722              :                END IF
     723              : 
     724            9 :                atom_i = atom_of_kind(iatom)
     725            9 :                atom_j = atom_of_kind(jatom)
     726              : 
     727           36 :                fij(1:3) = dedf*rij(1:3)/pot%set(kk)%gp%values(1)
     728              : 
     729           36 :                force(ikind)%repulsive(:, atom_i) = force(ikind)%repulsive(:, atom_i) - fij(:)
     730           36 :                force(jkind)%repulsive(:, atom_j) = force(jkind)%repulsive(:, atom_j) + fij(:)
     731              : 
     732            9 :                IF (use_virial) THEN
     733            8 :                   CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
     734              :                END IF
     735              : 
     736              :             END IF
     737              :          END IF
     738          193 :          NULLIFY (pot)
     739              :       END DO
     740           34 :       CALL neighbor_list_iterator_release(nl_iterator)
     741           34 :       CALL finalizef()
     742              : 
     743           34 :       IF (ASSOCIATED(potparm)) THEN
     744           34 :          CALL pair_potential_pp_release(potparm)
     745              :       END IF
     746              : 
     747           34 :       CALL timestop(handle)
     748              : 
     749           34 :    END SUBROUTINE nonbonded_correction
     750              : 
     751              : ! **************************************************************************************************
     752              : !> \brief ...
     753              : !> \param atomic_kind_set ...
     754              : !> \param nonbonded ...
     755              : !> \param potparm ...
     756              : !> \param ewald_env ...
     757              : !> \param do_ewald ...
     758              : ! **************************************************************************************************
     759           34 :    SUBROUTINE force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
     760              : 
     761              :       ! routine based on force_field_pack_nonbond
     762              :       TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
     763              :          POINTER                                         :: atomic_kind_set
     764              :       TYPE(pair_potential_p_type), INTENT(IN), POINTER   :: nonbonded
     765              :       TYPE(pair_potential_pp_type), INTENT(INOUT), &
     766              :          POINTER                                         :: potparm
     767              :       TYPE(ewald_environment_type), INTENT(IN), POINTER  :: ewald_env
     768              :       LOGICAL, INTENT(IN)                                :: do_ewald
     769              : 
     770              :       CHARACTER(LEN=default_string_length)               :: name_atm_a, name_atm_a_local, &
     771              :                                                             name_atm_b, name_atm_b_local
     772              :       INTEGER                                            :: ikind, ingp, iw, jkind
     773              :       LOGICAL                                            :: found
     774              :       REAL(KIND=dp)                                      :: ewald_rcut
     775              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     776              :       TYPE(cp_logger_type), POINTER                      :: logger
     777              :       TYPE(pair_potential_single_type), POINTER          :: pot
     778              : 
     779           34 :       NULLIFY (pot, logger)
     780              : 
     781           34 :       logger => cp_get_default_logger()
     782           34 :       iw = cp_logger_get_default_io_unit(logger)
     783              : 
     784          170 :       DO ikind = 1, SIZE(atomic_kind_set)
     785          136 :          atomic_kind => atomic_kind_set(ikind)
     786          136 :          CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_a_local)
     787          510 :          DO jkind = ikind, SIZE(atomic_kind_set)
     788          340 :             atomic_kind => atomic_kind_set(jkind)
     789          340 :             CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_b_local)
     790          340 :             found = .FALSE.
     791          340 :             name_atm_a = name_atm_a_local
     792          340 :             name_atm_b = name_atm_b_local
     793          340 :             CALL uppercase(name_atm_a)
     794          340 :             CALL uppercase(name_atm_b)
     795          340 :             pot => potparm%pot(ikind, jkind)%pot
     796          340 :             IF (ASSOCIATED(nonbonded)) THEN
     797          680 :                DO ingp = 1, SIZE(nonbonded%pot)
     798          340 :                   IF ((TRIM(nonbonded%pot(ingp)%pot%at1) == "*") .OR. &
     799              :                       (TRIM(nonbonded%pot(ingp)%pot%at2) == "*")) CYCLE
     800              : 
     801              :                   !IF (iw > 0) WRITE (iw, *) "TESTING ", TRIM(name_atm_a), TRIM(name_atm_b), &
     802              :                   !   " with ", TRIM(nonbonded%pot(ingp)%pot%at1), &
     803              :                   !   TRIM(nonbonded%pot(ingp)%pot%at2)
     804              :                   IF ((((name_atm_a) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
     805          340 :                        ((name_atm_b) == (nonbonded%pot(ingp)%pot%at2))) .OR. &
     806              :                       (((name_atm_b) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
     807          340 :                        ((name_atm_a) == (nonbonded%pot(ingp)%pot%at2)))) THEN
     808           34 :                      CALL pair_potential_single_copy(nonbonded%pot(ingp)%pot, pot)
     809              :                      ! multiple potential not implemented, simply overwriting
     810           34 :                      IF (found) &
     811              :                         CALL cp_warn(__LOCATION__, &
     812              :                                      "Multiple NONBONDED declaration: "//TRIM(name_atm_a)// &
     813            0 :                                      " and "//TRIM(name_atm_b)//" OVERWRITING! ")
     814              :                      !IF (iw > 0) WRITE (iw, *) "    FOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
     815              :                      found = .TRUE.
     816              :                   END IF
     817              :                END DO
     818              :             END IF
     819          476 :             IF (.NOT. found) THEN
     820          306 :                CALL pair_potential_single_clean(pot)
     821              :                !IF (iw > 0) WRITE (iw, *) " NOTFOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
     822              :             END IF
     823              :          END DO !jkind
     824              :       END DO !ikind
     825              : 
     826              :       ! Cutoff is defined always as the maximum between the FF and Ewald
     827           34 :       IF (do_ewald) THEN
     828           16 :          CALL ewald_env_get(ewald_env, rcut=ewald_rcut)
     829           16 :          pot%rcutsq = MAX(pot%rcutsq, ewald_rcut*ewald_rcut)
     830              :          !IF (iw > 0) WRITE (iw, *) " RCUT     ", SQRT(pot%rcutsq), ewald_rcut
     831              :       END IF
     832              : 
     833           34 :    END SUBROUTINE force_field_pack_nonbond_pot_correction
     834              : 
     835              : ! **************************************************************************************************
     836              : !> \brief  Computes the interaction term between Br/I/At and donor atoms
     837              : !>
     838              : !> \param exb ...
     839              : !> \param neighbor_atoms ...
     840              : !> \param atom_of_kind ...
     841              : !> \param kind_of ...
     842              : !> \param sab_xb ...
     843              : !> \param kx ...
     844              : !> \param kx2 ...
     845              : !> \param rcab ...
     846              : !> \param calculate_forces ...
     847              : !> \param use_virial ...
     848              : !> \param force ...
     849              : !> \param virial ...
     850              : !> \param atprop ...
     851              : !> \par History
     852              : !>      12.2018 JGH
     853              : !> \version 1.1
     854              : ! **************************************************************************************************
     855         3578 :    SUBROUTINE xb_energy(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
     856              :                         calculate_forces, use_virial, force, virial, atprop)
     857              :       REAL(dp), INTENT(INOUT)                            :: exb
     858              :       TYPE(neighbor_atoms_type), DIMENSION(:), &
     859              :          INTENT(IN)                                      :: neighbor_atoms
     860              :       INTEGER, DIMENSION(:), INTENT(IN)                  :: atom_of_kind, kind_of
     861              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     862              :          POINTER                                         :: sab_xb
     863              :       REAL(dp), DIMENSION(:), INTENT(IN)                 :: kx
     864              :       REAL(dp), INTENT(IN)                               :: kx2
     865              :       REAL(dp), DIMENSION(:, :), INTENT(IN)              :: rcab
     866              :       LOGICAL, INTENT(IN)                                :: calculate_forces, use_virial
     867              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
     868              :       TYPE(virial_type), POINTER                         :: virial
     869              :       TYPE(atprop_type), POINTER                         :: atprop
     870              : 
     871              :       INTEGER                                            :: atom_a, atom_b, atom_c, iatom, ikind, &
     872              :                                                             jatom, jkind, katom, kkind
     873              :       INTEGER, DIMENSION(3)                              :: cell
     874              :       REAL(KIND=dp)                                      :: alp, aterm, cosa, daterm, ddab, ddax, &
     875              :                                                             ddbx, ddr, ddr12, ddr6, deval, dr, &
     876              :                                                             drab, drax, drbx, eval, xy
     877              :       REAL(KIND=dp), DIMENSION(3)                        :: fia, fij, fja, ria, rij, rja
     878              :       TYPE(neighbor_list_iterator_p_type), &
     879         3578 :          DIMENSION(:), POINTER                           :: nl_iterator
     880              : 
     881              :       ! exonent in angular term
     882         3578 :       alp = 6.0_dp
     883              :       ! loop over all atom pairs
     884         3578 :       CALL neighbor_list_iterator_create(nl_iterator, sab_xb)
     885         3590 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     886              :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
     887           12 :                                 iatom=iatom, jatom=jatom, r=rij, cell=cell)
     888              :          ! ikind, iatom : Halogen
     889              :          ! jkind, jatom : Donor
     890           12 :          atom_a = atom_of_kind(iatom)
     891           12 :          katom = neighbor_atoms(ikind)%katom(atom_a)
     892           12 :          IF (katom == 0) CYCLE
     893           12 :          dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
     894           12 :          ddr = rcab(ikind, jkind)/dr
     895           12 :          ddr6 = ddr**6
     896           12 :          ddr12 = ddr6*ddr6
     897           12 :          eval = kx(ikind)*(ddr12 - kx2*ddr6)/(1.0_dp + ddr12)
     898              :          ! angle
     899           48 :          ria(1:3) = neighbor_atoms(ikind)%coord(1:3, atom_a)
     900           48 :          rja(1:3) = rij(1:3) - ria(1:3)
     901           12 :          drax = ria(1)**2 + ria(2)**2 + ria(3)**2
     902           12 :          drbx = dr*dr
     903           12 :          drab = rja(1)**2 + rja(2)**2 + rja(3)**2
     904           12 :          xy = SQRT(drbx*drax)
     905              :          ! cos angle B-X-A
     906           12 :          cosa = (drbx + drax - drab)/xy
     907           12 :          aterm = (0.5_dp - 0.25_dp*cosa)**alp
     908              :          !
     909           12 :          exb = exb + aterm*eval
     910           12 :          IF (atprop%energy) THEN
     911            0 :             atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*aterm*eval
     912            0 :             atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*aterm*eval
     913              :          END IF
     914              :          !
     915         3590 :          IF (calculate_forces) THEN
     916            6 :             kkind = kind_of(katom)
     917            6 :             atom_b = atom_of_kind(jatom)
     918            6 :             atom_c = atom_of_kind(katom)
     919              :             !
     920            6 :             deval = 6.0_dp*kx(ikind)*ddr6*(kx2*ddr12 + 2.0_dp*ddr6 - kx2)/(1.0_dp + ddr12)**2
     921            6 :             deval = -rcab(ikind, jkind)*deval/(dr*dr)/ddr
     922           24 :             fij(1:3) = aterm*deval*rij(1:3)/dr
     923           24 :             force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:)
     924           24 :             force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:)
     925            6 :             IF (use_virial) THEN
     926            0 :                CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
     927              :             END IF
     928              :             !
     929            6 :             fij(1:3) = 0.0_dp
     930            6 :             fia(1:3) = 0.0_dp
     931            6 :             fja(1:3) = 0.0_dp
     932            6 :             daterm = -0.25_dp*alp*(0.5_dp - 0.25_dp*cosa)**(alp - 1.0_dp)
     933            6 :             ddbx = 0.5_dp*(drab - drax + drbx)/xy/drbx
     934            6 :             ddax = 0.5_dp*(drab + drax - drbx)/xy/drax
     935            6 :             ddab = -1._dp/xy
     936           24 :             fij(1:3) = 2.0_dp*daterm*ddbx*rij(1:3)*eval
     937           24 :             fia(1:3) = 2.0_dp*daterm*ddax*ria(1:3)*eval
     938           24 :             fja(1:3) = 2.0_dp*daterm*ddab*rja(1:3)*eval
     939           24 :             force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:) - fia(:)
     940           24 :             force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:) + fja(:)
     941           24 :             force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fia(:) - fja(:)
     942            6 :             IF (use_virial) THEN
     943            0 :                CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
     944            0 :                CALL virial_pair_force(virial%pv_virial, -1._dp, fia, ria)
     945            0 :                CALL virial_pair_force(virial%pv_virial, -1._dp, fja, rja)
     946              :             END IF
     947              :          END IF
     948              :       END DO
     949         3578 :       CALL neighbor_list_iterator_release(nl_iterator)
     950              : 
     951         3578 :    END SUBROUTINE xb_energy
     952              : 
     953            0 : END MODULE xtb_potentials
        

Generated by: LCOV version 2.0-1