Refactoring of vdW pairpotential code. (#3671)

This commit is contained in:
Juerg Hutter 2024-09-10 16:41:43 +02:00 committed by GitHub
parent c0268dfdea
commit e8dbeb2e75
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 3528 additions and 3265 deletions

View file

@ -531,10 +531,13 @@ list(
qs_diis.F
qs_diis_types.F
qs_dispersion_nonloc.F
qs_dispersion_d2.F
qs_dispersion_d3.F
qs_dispersion_d4.F
qs_dispersion_pairpot.F
qs_dispersion_types.F
qs_dispersion_utils.F
qs_dispersion_cnum.F
qs_dos.F
qs_efield_berry.F
qs_efield_local.F

1206
src/qs_dispersion_cnum.F Normal file

File diff suppressed because it is too large Load diff

258
src/qs_dispersion_d2.F Normal file
View file

@ -0,0 +1,258 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculation of D2 dispersion
!> \author JGH
! **************************************************************************************************
MODULE qs_dispersion_d2
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind,&
get_atomic_kind_set
USE atprop_types, ONLY: atprop_array_init,&
atprop_type
USE cell_types, ONLY: cell_type
USE kinds, ONLY: dp
USE physcon, ONLY: bohr,&
kjmol
USE qs_dispersion_types, ONLY: qs_atom_dispersion_type,&
qs_dispersion_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_force_types, ONLY: qs_force_type
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE qs_neighbor_list_types, ONLY: get_iterator_info,&
neighbor_list_iterate,&
neighbor_list_iterator_create,&
neighbor_list_iterator_p_type,&
neighbor_list_iterator_release,&
neighbor_list_set_p_type
USE virial_methods, ONLY: virial_pair_force
USE virial_types, ONLY: virial_type
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_d2'
PUBLIC :: calculate_dispersion_d2_pairpot, dftd2_param
! **************************************************************************************************
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param dispersion_env ...
!> \param evdw ...
!> \param calculate_forces ...
!> \param atevdw ...
! **************************************************************************************************
SUBROUTINE calculate_dispersion_d2_pairpot(qs_env, dispersion_env, evdw, calculate_forces, atevdw)
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(qs_dispersion_type), POINTER :: dispersion_env
REAL(KIND=dp), INTENT(OUT) :: evdw
LOGICAL, INTENT(IN) :: calculate_forces
REAL(KIND=dp), DIMENSION(:), OPTIONAL :: atevdw
CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_dispersion_d2_pairpot'
INTEGER :: atom_a, atom_b, handle, iatom, ikind, &
jatom, jkind, mepos, natom, nkind, &
num_pe, za, zb
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
LOGICAL :: atenergy, atex, atstress, floating_a, &
ghost_a, use_virial
LOGICAL, ALLOCATABLE, DIMENSION(:) :: dodisp, floating, ghost
REAL(KIND=dp) :: c6, dd, devdw, dfdmp, dr, er, fac, fdmp, &
rcc, rcut, s6, xp
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: c6d2, radd2
REAL(KIND=dp), DIMENSION(3) :: fdij, rij
REAL(KIND=dp), DIMENSION(3, 3) :: pv_virial_thread
REAL(KIND=dp), DIMENSION(:), POINTER :: atener
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstr
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_vdw
TYPE(qs_atom_dispersion_type), POINTER :: disp_a
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(virial_type), POINTER :: virial
CALL timeset(routineN, handle)
evdw = 0._dp
NULLIFY (atomic_kind_set, qs_kind_set, sab_vdw)
CALL get_qs_env(qs_env=qs_env, nkind=nkind, natom=natom, atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, cell=cell, virial=virial, atprop=atprop)
! atomic energy and stress arrays
atenergy = atprop%energy
IF (atenergy) THEN
CALL atprop_array_init(atprop%atevdw, natom)
atener => atprop%atevdw
END IF
atstress = atprop%stress
atstr => atprop%atstress
! external atomic energy
atex = .FALSE.
IF (PRESENT(atevdw)) THEN
atex = .TRUE.
END IF
NULLIFY (force)
CALL get_qs_env(qs_env=qs_env, force=force)
CALL get_atomic_kind_set(atomic_kind_set, atom_of_kind=atom_of_kind, kind_of=kind_of)
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
pv_virial_thread(:, :) = 0._dp
ALLOCATE (dodisp(nkind), ghost(nkind), floating(nkind), atomnumber(nkind), c6d2(nkind), radd2(nkind))
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp_a, ghost=ghost_a, floating=floating_a)
dodisp(ikind) = disp_a%defined
ghost(ikind) = ghost_a
floating(ikind) = floating_a
atomnumber(ikind) = za
c6d2(ikind) = disp_a%c6
radd2(ikind) = disp_a%vdw_radii
END DO
rcut = 2._dp*dispersion_env%rc_disp
s6 = dispersion_env%scaling
dd = dispersion_env%exp_pre
sab_vdw => dispersion_env%sab_vdw
num_pe = 1
CALL neighbor_list_iterator_create(nl_iterator, sab_vdw, nthread=num_pe)
mepos = 0
DO WHILE (neighbor_list_iterate(nl_iterator, mepos=mepos) == 0)
CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rij)
IF (ghost(ikind) .OR. ghost(jkind) .OR. floating(ikind) .OR. floating(jkind)) CYCLE
IF (.NOT. (dodisp(ikind) .AND. dodisp(jkind))) CYCLE
za = atomnumber(ikind)
zb = atomnumber(jkind)
! vdW potential
dr = SQRT(SUM(rij(:)**2))
IF (dr <= rcut) THEN
fac = 1._dp
IF (iatom == jatom) fac = 0.5_dp
IF (dr > 0.001_dp) THEN
c6 = SQRT(c6d2(ikind)*c6d2(jkind))
rcc = radd2(ikind) + radd2(jkind)
er = EXP(-dd*(dr/rcc - 1._dp))
fdmp = 1._dp/(1._dp + er)
xp = s6*c6/dr**6
evdw = evdw - xp*fdmp*fac
IF (calculate_forces) THEN
dfdmp = dd/rcc*er*fdmp*fdmp
devdw = -xp*(-6._dp*fdmp/dr + dfdmp)
fdij(:) = devdw*rij(:)/dr*fac
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
force(ikind)%dispersion(:, atom_a) = force(ikind)%dispersion(:, atom_a) - fdij(:)
force(jkind)%dispersion(:, atom_b) = force(jkind)%dispersion(:, atom_b) + fdij(:)
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rij)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rij)
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rij)
END IF
END IF
IF (atenergy) THEN
atener(iatom) = atener(iatom) - 0.5_dp*xp*fdmp*fac
atener(jatom) = atener(jatom) - 0.5_dp*xp*fdmp*fac
END IF
IF (atex) THEN
atevdw(iatom) = atevdw(iatom) - 0.5_dp*xp*fdmp*fac
atevdw(jatom) = atevdw(jatom) - 0.5_dp*xp*fdmp*fac
END IF
END IF
END IF
END DO
virial%pv_virial = virial%pv_virial + pv_virial_thread
CALL neighbor_list_iterator_release(nl_iterator)
DEALLOCATE (dodisp, ghost, floating, atomnumber, radd2, c6d2)
CALL timestop(handle)
END SUBROUTINE calculate_dispersion_d2_pairpot
! **************************************************************************************************
!> \brief ...
!> \param z ...
!> \param c6 ...
!> \param r ...
!> \param found ...
! **************************************************************************************************
SUBROUTINE dftd2_param(z, c6, r, found)
INTEGER, INTENT(in) :: z
REAL(KIND=dp), INTENT(inout) :: c6, r
LOGICAL, INTENT(inout) :: found
REAL(KIND=dp), DIMENSION(54), PARAMETER :: c6val = (/0.14_dp, 0.08_dp, 1.61_dp, 1.61_dp, &
3.13_dp, 1.75_dp, 1.23_dp, 0.70_dp, 0.75_dp, 0.63_dp, 5.71_dp, 5.71_dp, 10.79_dp, 9.23_dp,&
7.84_dp, 5.57_dp, 5.07_dp, 4.61_dp, 10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, &
10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, 10.80_dp, 16.99_dp, 17.10_dp, &
16.37_dp, 12.64_dp, 12.47_dp, 12.01_dp, 24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, &
24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, 24.67_dp, 37.32_dp, 38.71_dp, &
38.44_dp, 31.74_dp, 31.50_dp, 29.99_dp/)
REAL(KIND=dp), DIMENSION(54), PARAMETER :: rval = (/1.001_dp, 1.012_dp, 0.825_dp, 1.408_dp, &
1.485_dp, 1.452_dp, 1.397_dp, 1.342_dp, 1.287_dp, 1.243_dp, 1.144_dp, 1.364_dp, 1.639_dp, &
1.716_dp, 1.705_dp, 1.683_dp, 1.639_dp, 1.595_dp, 1.485_dp, 1.474_dp, 1.562_dp, 1.562_dp, &
1.562_dp, 1.562_dp, 1.562_dp, 1.562_dp, 1.562_dp, 1.562_dp, 1.562_dp, 1.562_dp, 1.650_dp, &
1.727_dp, 1.760_dp, 1.771_dp, 1.749_dp, 1.727_dp, 1.628_dp, 1.606_dp, 1.639_dp, 1.639_dp, &
1.639_dp, 1.639_dp, 1.639_dp, 1.639_dp, 1.639_dp, 1.639_dp, 1.639_dp, 1.639_dp, 1.672_dp, &
1.804_dp, 1.881_dp, 1.892_dp, 1.892_dp, 1.881_dp/)
!
! GRIMME DISPERSION PARAMETERS
! Stefan Grimme, Semiempirical GGA-Type Density Functional Constructed
! with a Long-Range Dispersion Correction, J. Comp. Chem. 27: 1787-1799 (2006)
! doi:10.1002/jcc.20495
!
! Conversion factor [Jnm^6mol^-1] -> [a.u.] : 17.34527758021901
! Conversion factor [A] -> [a.u.] : 1.889726132885643
!
! C6 values in [Jnm^6/mol]
! vdW radii [A]
IF (z > 0 .AND. z <= 54) THEN
found = .TRUE.
c6 = c6val(z)*1000._dp*bohr**6/kjmol
r = rval(z)*bohr
ELSE
found = .FALSE.
END IF
END SUBROUTINE dftd2_param
! **************************************************************************************************
END MODULE qs_dispersion_d2

1126
src/qs_dispersion_d3.F Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -23,18 +23,17 @@ MODULE qs_dispersion_utils
USE input_section_types, ONLY: section_vals_get_subs_vals,&
section_vals_type,&
section_vals_val_get
USE kinds, ONLY: dp
USE kinds, ONLY: default_string_length,&
dp
USE physcon, ONLY: bohr,&
kjmol
USE qs_dispersion_pairpot, ONLY: qs_scaling_dftd3,&
qs_scaling_dftd3bj,&
qs_scaling_init
USE qs_dispersion_types, ONLY: qs_atom_dispersion_type,&
qs_dispersion_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE string_utilities, ONLY: uppercase
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -93,7 +92,7 @@ CONTAINS
IF (.NOT. explicit) THEN
CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
CPASSERT(exfun)
CALL qs_scaling_init(dispersion_env%scaling, vdw_section)
CALL qs_scaling_dftd2(dispersion_env%scaling, vdw_section)
ELSE
CALL section_vals_val_get(pp_section, "SCALING", r_val=dispersion_env%scaling)
END IF
@ -184,8 +183,6 @@ CONTAINS
END IF
END SUBROUTINE qs_dispersion_env_set
! **************************************************************************************************
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
@ -322,6 +319,833 @@ CONTAINS
END SUBROUTINE qs_write_dispersion
! **************************************************************************************************
!> \brief ...
!> \param scaling ...
!> \param vdw_section ...
! **************************************************************************************************
SUBROUTINE qs_scaling_dftd2(scaling, vdw_section)
REAL(KIND=dp), INTENT(inout) :: scaling
TYPE(section_vals_type), POINTER :: vdw_section
CHARACTER(LEN=default_string_length) :: functional
CALL section_vals_val_get(vdw_section, "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", c_val=functional)
SELECT CASE (TRIM(functional))
CASE DEFAULT
! unknown functional
CPABORT("No DFT-D2 s6 value available for this functional:"//TRIM(functional))
CASE ("BLYP")
scaling = 1.20_dp
CASE ("B3LYP")
scaling = 1.05_dp
CASE ("TPSS")
scaling = 1.00_dp
CASE ("PBE")
scaling = 0.75_dp
CASE ("PBE0")
scaling = 0.6_dp
CASE ("B2PLYP")
scaling = 0.55_dp
CASE ("BP86")
scaling = 1.05_dp
CASE ("B97")
scaling = 1.25_dp
END SELECT
END SUBROUTINE qs_scaling_dftd2
! **************************************************************************************************
!> \brief ...
!> \param s6 ...
!> \param sr6 ...
!> \param s8 ...
!> \param vdw_section ...
! **************************************************************************************************
SUBROUTINE qs_scaling_dftd3(s6, sr6, s8, vdw_section)
REAL(KIND=dp), INTENT(inout) :: s6, sr6, s8
TYPE(section_vals_type), POINTER :: vdw_section
CHARACTER(LEN=default_string_length) :: functional
CALL section_vals_val_get(vdw_section, "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", c_val=functional)
CALL uppercase(functional)
! values for different functionals from:
! https://www.chemie.uni-bonn.de/grimme/de/software/dft-d3
! L. Goerigk et al. PCCP 2017, 32147-32744, SI
SELECT CASE (TRIM(functional))
CASE DEFAULT
! unknown functional
CPABORT("No DFT-D3 values available for this functional:"//TRIM(functional))
CASE ("B1B95")
s6 = 1.000_dp
sr6 = 1.613_dp
s8 = 1.868_dp
CASE ("B2GPPLYP")
! L. Goerigk and S. Grimme
! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
s6 = 0.56_dp
sr6 = 1.586_dp
s8 = 0.760_dp
CASE ("B2PLYP")
! L. Goerigk and S. Grimme
! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
s6 = 0.64_dp
sr6 = 1.427_dp
s8 = 1.022_dp
CASE ("DSD-BLYP")
! L. Goerigk and S. Grimme
! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
s6 = 0.50_dp
sr6 = 1.569_dp
s8 = 0.705_dp
CASE ("B3LYP")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.261_dp
s8 = 1.703_dp
CASE ("B97-D")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 0.892_dp
s8 = 0.909_dp
CASE ("BHLYP")
s6 = 1.000_dp
sr6 = 1.370_dp
s8 = 1.442_dp
CASE ("BLYP")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.094_dp
s8 = 1.682_dp
CASE ("BP86")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.139_dp
s8 = 1.683_dp
CASE ("BPBE")
s6 = 1.000_dp
sr6 = 1.087_dp
s8 = 2.033_dp
CASE ("MPWLYP")
s6 = 1.000_dp
sr6 = 1.239_dp
s8 = 1.098_dp
CASE ("PBE")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.217_dp
s8 = 0.722_dp
CASE ("PBEHPBE")
s6 = 1.000_dp
sr6 = 1.5703_dp
s8 = 1.4010_dp
CASE ("PBE0")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.287_dp
s8 = 0.928_dp
CASE ("PW6B95")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.532_dp
s8 = 0.862_dp
CASE ("PWB6K")
s6 = 1.000_dp
sr6 = 1.660_dp
s8 = 0.550_dp
CASE ("REVPBE")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 0.923_dp
s8 = 1.010_dp
CASE ("RPBE")
s6 = 1.000_dp
sr6 = 0.872_dp
s8 = 0.514_dp
CASE ("TPSS")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.166_dp
s8 = 1.105_dp
CASE ("TPSS0")
! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
s6 = 1.000_dp
sr6 = 1.252_dp
s8 = 1.242_dp
CASE ("TPSSH")
s6 = 1.000_dp
sr6 = 1.223_dp
s8 = 1.219_dp
CASE ("B1LYP")
s6 = 1.000_dp
sr6 = 1.3725_dp
s8 = 1.9467_dp
CASE ("B1P86")
s6 = 1.000_dp
sr6 = 1.1815_dp
s8 = 1.1209_dp
CASE ("B3P86")
s6 = 1.000_dp
sr6 = 1.1897_dp
s8 = 1.1961_dp
CASE ("B3PW91")
s6 = 1.000_dp
sr6 = 1.176_dp
s8 = 1.775_dp
CASE ("BMK")
s6 = 1.000_dp
sr6 = 1.931_dp
s8 = 2.168_dp
CASE ("CAMB3LYP")
s6 = 1.000_dp
sr6 = 1.378_dp
s8 = 1.217_dp
CASE ("LCWPBE")
s6 = 1.000_dp
sr6 = 1.355_dp
s8 = 1.279_dp
CASE ("M052X")
s6 = 1.000_dp
sr6 = 1.417_dp
s8 = 0.000_dp
CASE ("M05")
s6 = 1.000_dp
sr6 = 1.373_dp
s8 = 0.595_dp
CASE ("M062X")
s6 = 1.000_dp
sr6 = 1.619_dp
s8 = 0.000_dp
CASE ("M06HF")
s6 = 1.000_dp
sr6 = 1.446_dp
s8 = 0.000_dp
CASE ("M06L")
s6 = 1.000_dp
sr6 = 1.581_dp
s8 = 0.000_dp
CASE ("M06N")
s6 = 1.000_dp
sr6 = 1.325_dp
s8 = 0.000_dp
CASE ("HCTH120")
s6 = 1.000_dp
sr6 = 1.221_dp
s8 = 1.206_dp
CASE ("HCTH407")
s6 = 1.000_dp
sr6 = 4.0426_dp
s8 = 2.7694_dp
CASE ("MPW2PLYP")
s6 = 1.000_dp
sr6 = 1.5527_dp
s8 = 0.7529_dp
CASE ("PKZB")
s6 = 1.000_dp
sr6 = 0.6327_dp
s8 = 0.000_dp
CASE ("PTPSS")
s6 = 0.750_dp
sr6 = 1.541_dp
s8 = 0.879_dp
CASE ("PWPB95")
s6 = 0.820_dp
sr6 = 1.557_dp
s8 = 0.705_dp
CASE ("OLYP")
s6 = 1.000_dp
sr6 = 0.806_dp
s8 = 1.764_dp
CASE ("OPBE")
s6 = 1.000_dp
sr6 = 0.837_dp
s8 = 2.055_dp
CASE ("OTPSS")
s6 = 1.000_dp
sr6 = 1.128_dp
s8 = 1.494_dp
CASE ("PBE1KCIS")
s6 = 1.000_dp
sr6 = 3.6355_dp
s8 = 1.7934_dp
CASE ("PBE38")
s6 = 1.000_dp
sr6 = 1.333_dp
s8 = 0.998_dp
CASE ("PBEH1PBE")
s6 = 1.000_dp
sr6 = 1.3719_dp
s8 = 1.0430_dp
CASE ("PBESOL")
s6 = 1.000_dp
sr6 = 1.345_dp
s8 = 0.612_dp
CASE ("REVSSB")
s6 = 1.000_dp
sr6 = 1.221_dp
s8 = 0.560_dp
CASE ("REVTPSS")
s6 = 1.000_dp
sr6 = 1.3491_dp
s8 = 1.3666_dp
CASE ("SSB")
s6 = 1.000_dp
sr6 = 1.215_dp
s8 = 0.663_dp
CASE ("B97-1")
s6 = 1.000_dp
sr6 = 3.7924_dp
s8 = 1.6418_dp
CASE ("B97-2")
s6 = 1.000_dp
sr6 = 1.7066_dp
s8 = 2.4661_dp
CASE ("B98")
s6 = 1.000_dp
sr6 = 2.6895_dp
s8 = 1.9078_dp
CASE ("BOP")
s6 = 1.000_dp
sr6 = 0.929_dp
s8 = 1.975_dp
CASE ("HISS")
s6 = 1.000_dp
sr6 = 1.3338_dp
s8 = 0.7615_dp
CASE ("HSE03")
s6 = 1.000_dp
sr6 = 1.3944_dp
s8 = 1.0156_dp
CASE ("HSE06")
s6 = 1.000_dp
sr6 = 1.129_dp
s8 = 0.109_dp
CASE ("M08HX")
s6 = 1.000_dp
sr6 = 1.6247_dp
s8 = 0.000_dp
CASE ("MN15L")
s6 = 1.000_dp
sr6 = 3.3388_dp
s8 = 0.000_dp
CASE ("MPWPW91")
s6 = 1.0000_dp
sr6 = 1.3725_dp
s8 = 1.9467_dp
CASE ("MPW1B95")
s6 = 1.000_dp
sr6 = 1.605_dp
s8 = 1.118_dp
CASE ("MPW1KCIS")
s6 = 1.000_dp
sr6 = 1.7231_dp
s8 = 2.2917_dp
CASE ("MPW1LYP")
s6 = 1.000_dp
sr6 = 2.0512_dp
s8 = 1.9529_dp
CASE ("MPW1PW91")
s6 = 1.000_dp
sr6 = 1.2892_dp
s8 = 1.4758_dp
CASE ("MPWB1K")
s6 = 1.000_dp
sr6 = 1.671_dp
s8 = 1.061_dp
CASE ("MPWKCIS1K")
s6 = 1.000_dp
sr6 = 1.4853_dp
s8 = 1.7553_dp
CASE ("O3LYP")
s6 = 1.000_dp
sr6 = 1.4060_dp
s8 = 1.8058_dp
CASE ("PW1PW")
s6 = 1.000_dp
sr6 = 1.4968_dp
s8 = 1.1786_dp
CASE ("PW91P86")
s6 = 1.0000_dp
sr6 = 2.1040_dp
s8 = 0.8747_dp
CASE ("REVPBE0")
s6 = 1.000_dp
sr6 = 0.949_dp
s8 = 0.792_dp
CASE ("REVPBE38")
s6 = 1.000_dp
sr6 = 1.021_dp
s8 = 0.862_dp
CASE ("REVTPSSh")
s6 = 1.000_dp
sr6 = 1.3224_dp
s8 = 1.2504_dp
CASE ("REVTPSS0")
s6 = 1.000_dp
sr6 = 1.2881_dp
s8 = 1.0649_dp
CASE ("TPSS1KCIS")
s6 = 1.000_dp
sr6 = 1.7729_dp
s8 = 2.0902_dp
CASE ("THCTHHYB")
s6 = 1.000_dp
sr6 = 1.5001_dp
s8 = 1.6302_dp
CASE ("RPW86PBE")
s6 = 1.000_dp
sr6 = 1.224_dp
s8 = 0.901_dp
CASE ("SCAN")
s6 = 1.000_dp
sr6 = 1.324_dp
s8 = 0.000_dp
CASE ("THCTH")
s6 = 1.000_dp
sr6 = 0.932_dp
s8 = 0.5662_dp
CASE ("XLYP")
s6 = 1.0000_dp
sr6 = 0.9384_dp
s8 = 0.7447_dp
CASE ("X3LYP")
s6 = 1.000_dp
sr6 = 1.0000_dp
s8 = 0.2990_dp
END SELECT
END SUBROUTINE qs_scaling_dftd3
! **************************************************************************************************
!> \brief ...
!> \param s6 ...
!> \param a1 ...
!> \param s8 ...
!> \param a2 ...
!> \param vdw_section ...
! **************************************************************************************************
SUBROUTINE qs_scaling_dftd3bj(s6, a1, s8, a2, vdw_section)
REAL(KIND=dp), INTENT(inout) :: s6, a1, s8, a2
TYPE(section_vals_type), POINTER :: vdw_section
CHARACTER(LEN=default_string_length) :: functional
CALL section_vals_val_get(vdw_section, "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", c_val=functional)
! values for different functionals from:
! http://www.thch.uni-bonn.de/tc/downloads/DFT-D3/functionalsbj.html
! L. Goerigk et al. PCCP 2017, 32147-32744, SI
SELECT CASE (TRIM(functional))
CASE DEFAULT
! unknown functional
CPABORT("No DFT-D3(BJ) values available for this functional:"//TRIM(functional))
CASE ("B1B95")
s6 = 1.0000_dp
a1 = 0.2092_dp
s8 = 1.4507_dp
a2 = 5.5545_dp
CASE ("B2GPPLYP")
s6 = 0.5600_dp
a1 = 0.0000_dp
s8 = 0.2597_dp
a2 = 6.3332_dp
CASE ("B3PW91")
s6 = 1.0000_dp
a1 = 0.4312_dp
s8 = 2.8524_dp
a2 = 4.4693_dp
CASE ("BHLYP")
s6 = 1.0000_dp
a1 = 0.2793_dp
s8 = 1.0354_dp
a2 = 4.9615_dp
CASE ("BMK")
s6 = 1.0000_dp
a1 = 0.1940_dp
s8 = 2.0860_dp
a2 = 5.9197_dp
CASE ("BOP")
s6 = 1.0000_dp
a1 = 0.4870_dp
s8 = 3.2950_dp
a2 = 3.5043_dp
CASE ("BPBE")
s6 = 1.0000_dp
a1 = 0.4567_dp
s8 = 4.0728_dp
a2 = 4.3908_dp
CASE ("B97-3c")
s6 = 1.0000_dp
a1 = 0.3700_dp
s8 = 1.5000_dp
a2 = 4.1000_dp
CASE ("CAMB3LYP")
s6 = 1.0000_dp
a1 = 0.3708_dp
s8 = 2.0674_dp
a2 = 5.4743_dp
CASE ("DSDBLYP")
s6 = 0.5000_dp
a1 = 0.0000_dp
s8 = 0.2130_dp
a2 = 6.0519_dp
CASE ("DSDPBEP86")
s6 = 0.4180_dp
a1 = 0.0000_dp
s8 = 0.0000_dp
a2 = 5.6500_dp
CASE ("DSDPBEB95")
s6 = 0.6100_dp
a1 = 0.0000_dp
s8 = 0.0000_dp
a2 = 6.2000_dp
CASE ("LCWPBE")
s6 = 1.0000_dp
a1 = 0.3919_dp
s8 = 1.8541_dp
a2 = 5.0897_dp
CASE ("LCWhPBE")
s6 = 1.0000_dp
a1 = 0.2746_dp
s8 = 1.1908_dp
a2 = 5.3157_dp
CASE ("MPW1B95")
s6 = 1.0000_dp
a1 = 0.1955_dp
s8 = 1.0508_dp
a2 = 6.4177_dp
CASE ("MPW2PLYP")
s6 = 0.6600_dp
a1 = 0.4105_dp
s8 = 0.6223_dp
a2 = 5.0136_dp
CASE ("MPWB1K")
s6 = 1.0000_dp
a1 = 0.1474_dp
s8 = 0.9499_dp
a2 = 6.6223_dp
CASE ("MPWLYP")
s6 = 1.0000_dp
a1 = 0.4831_dp
s8 = 2.0077_dp
a2 = 4.5323_dp
CASE ("OLYP")
s6 = 1.0000_dp
a1 = 0.5299_dp
s8 = 2.6205_dp
a2 = 2.8065_dp
CASE ("OPBE")
s6 = 1.0000_dp
a1 = 0.5512_dp
s8 = 3.3816_dp
a2 = 2.9444_dp
CASE ("OTPSS")
s6 = 1.0000_dp
a1 = 0.4634_dp
s8 = 2.7495_dp
a2 = 4.3153_dp
CASE ("PBE38")
s6 = 1.0000_dp
a1 = 0.3995_dp
s8 = 1.4623_dp
a2 = 5.1405_dp
CASE ("PBEsol")
s6 = 1.0000_dp
a1 = 0.4466_dp
s8 = 2.9491_dp
a2 = 6.1742_dp
CASE ("PTPSS")
s6 = 0.7500_dp
a1 = 0.0000_dp
s8 = 0.2804_dp
a2 = 6.5745_dp
CASE ("PWB6K")
s6 = 1.0000_dp
a1 = 0.1805_dp
s8 = 0.9383_dp
a2 = 7.7627_dp
CASE ("revSSB")
s6 = 1.0000_dp
a1 = 0.4720_dp
s8 = 0.4389_dp
a2 = 4.0986_dp
CASE ("SSB")
s6 = 1.0000_dp
a1 = -0.0952_dp
s8 = -0.1744_dp
a2 = 5.2170_dp
CASE ("TPSSh")
s6 = 1.0000_dp
a1 = 0.4529_dp
s8 = 2.2382_dp
a2 = 4.6550_dp
CASE ("HCTH120")
s6 = 1.0000_dp
a1 = 0.3563_dp
s8 = 1.0821_dp
a2 = 4.3359_dp
CASE ("B2PLYP")
s6 = 0.6400_dp
a1 = 0.3065_dp
s8 = 0.9147_dp
a2 = 5.0570_dp
CASE ("B1LYP")
s6 = 1.0000_dp
a1 = 0.1986_dp
s8 = 2.1167_dp
a2 = 5.3875_dp
CASE ("B1P86")
s6 = 1.0000_dp
a1 = 0.4724_dp
s8 = 3.5681_dp
a2 = 4.9858_dp
CASE ("B3LYP")
s6 = 1.0000_dp
a1 = 0.3981_dp
s8 = 1.9889_dp
a2 = 4.4211_dp
CASE ("B3P86")
s6 = 1.0000_dp
a1 = 0.4601_dp
s8 = 3.3211_dp
a2 = 4.9294_dp
CASE ("B97-1")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.4814_dp
a2 = 6.2279_dp
CASE ("B97-2")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.9448_dp
a2 = 5.4603_dp
CASE ("B97-D")
s6 = 1.0000_dp
a1 = 0.5545_dp
s8 = 2.2609_dp
a2 = 3.2297_dp
CASE ("B98")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.7086_dp
a2 = 6.0672_dp
CASE ("BLYP")
s6 = 1.0000_dp
a1 = 0.4298_dp
s8 = 2.6996_dp
a2 = 4.2359_dp
CASE ("BP86")
s6 = 1.0000_dp
a1 = 0.3946_dp
s8 = 3.2822_dp
a2 = 4.8516_dp
CASE ("DSD-BLYP")
s6 = 0.5000_dp
a1 = 0.0000_dp
s8 = 0.2130_dp
a2 = 6.0519_dp
CASE ("HCTH407")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.6490_dp
a2 = 4.8162_dp
CASE ("HISS")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.6112_dp
a2 = 7.3539_dp
CASE ("HSE03")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.1243_dp
a2 = 6.8889_dp
CASE ("HSE06")
s6 = 1.0000_dp
a1 = 0.3830_dp
s8 = 2.3100_dp
a2 = 5.6850_dp
CASE ("M11")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 2.8112_dp
a2 = 10.1389_dp
CASE ("MN12SX")
s6 = 1.0000_dp
a1 = 0.0983_dp
s8 = 1.1674_dp
a2 = 8.0259_dp
CASE ("MN15")
s6 = 1.0000_dp
a1 = 2.0971_dp
s8 = 0.7862_dp
a2 = 7.5923_dp
CASE ("mPWPW91")
s6 = 1.0000_dp
a1 = 0.3168_dp
s8 = 1.7974_dp
a2 = 4.7732_dp
CASE ("MPW1PW91")
s6 = 1.0000_dp
a1 = 0.3342_dp
s8 = 1.8744_dp
a2 = 4.9819_dp
CASE ("MPW1KCIS")
s6 = 1.0000_dp
a1 = 0.0576_dp
s8 = 1.0893_dp
a2 = 5.5314_dp
CASE ("MPWKCIS1K")
s6 = 1.0000_dp
a1 = 0.0855_dp
s8 = 1.2875_dp
a2 = 5.8961_dp
CASE ("N12SX")
s6 = 1.0000_dp
a1 = 0.3283_dp
s8 = 2.4900_dp
a2 = 5.7898_dp
CASE ("O3LYP")
s6 = 1.0000_dp
a1 = 0.0963_dp
s8 = 1.8171_dp
a2 = 5.9940_dp
CASE ("PBE0")
s6 = 1.0000_dp
a1 = 0.4145_dp
s8 = 1.2177_dp
a2 = 4.8593_dp
CASE ("PBE")
s6 = 1.0000_dp
a1 = 0.4289_dp
s8 = 0.7875_dp
a2 = 4.4407_dp
CASE ("PBEhPBE")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.1152_dp
a2 = 6.7184_dp
CASE ("PBEh1PBE")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.4877_dp
a2 = 7.0385_dp
CASE ("PBE1KCIS")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.7688_dp
a2 = 6.2794_dp
CASE ("PW6B95")
s6 = 1.0000_dp
a1 = 0.2076_dp
s8 = 0.7257_dp
a2 = 6.3750_dp
CASE ("PWPB95")
s6 = 0.8200_dp
a1 = 0.0000_dp
s8 = 0.2904_dp
a2 = 7.3141_dp
CASE ("revPBE0")
s6 = 1.0000_dp
a1 = 0.4679_dp
s8 = 1.7588_dp
a2 = 3.7619_dp
CASE ("revPBE38")
s6 = 1.0000_dp
a1 = 0.4309_dp
s8 = 1.4760_dp
a2 = 3.9446_dp
CASE ("revPBE")
s6 = 1.0000_dp
a1 = 0.5238_dp
s8 = 2.3550_dp
a2 = 3.5016_dp
CASE ("revTPSS")
s6 = 1.0000_dp
a1 = 0.4426_dp
s8 = 1.4023_dp
a2 = 4.4723_dp
CASE ("revTPSS0")
s6 = 1.0000_dp
a1 = 0.2218_dp
s8 = 1.6151_dp
a2 = 5.7985_dp
CASE ("revTPSSh")
s6 = 1.0000_dp
a1 = 0.2660_dp
s8 = 1.4076_dp
a2 = 5.3761_dp
CASE ("RPBE")
s6 = 1.0000_dp
a1 = 0.1820_dp
s8 = 0.8318_dp
a2 = 4.0094_dp
CASE ("RPW86PBE")
s6 = 1.0000_dp
a1 = 0.4613_dp
s8 = 1.3845_dp
a2 = 4.5062_dp
CASE ("SCAN")
s6 = 1.0000_dp
a1 = 0.538_dp
s8 = 0.0000_dp
a2 = 5.420_dp
CASE ("SOGGA11X")
s6 = 1.0000_dp
a1 = 0.1330_dp
s8 = 1.1426_dp
a2 = 5.7381_dp
CASE ("TPSS0")
s6 = 1.0000_dp
a1 = 0.3768_dp
s8 = 1.2576_dp
a2 = 4.5865_dp
CASE ("TPSS1KCIS")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.0542_dp
a2 = 6.0201_dp
CASE ("TPSS")
s6 = 1.0000_dp
a1 = 0.4535_dp
s8 = 1.9435_dp
a2 = 4.4752_dp
CASE ("tHCTH")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 1.2626_dp
a2 = 5.6162_dp
CASE ("tHCTHhyb")
s6 = 1.0000_dp
a1 = 0.0000_dp
s8 = 0.9585_dp
a2 = 6.2303_dp
CASE ("XLYP")
s6 = 1.0000_dp
a1 = 0.0809_dp
s8 = 1.5669_dp
a2 = 5.3166_dp
CASE ("X3LYP")
s6 = 1.0000_dp
a1 = 0.2022_dp
s8 = 1.5744_dp
a2 = 5.4184_dp
END SELECT
END SUBROUTINE qs_scaling_dftd3bj
! **************************************************************************************************
END MODULE qs_dispersion_utils

View file

@ -70,7 +70,7 @@ MODULE xtb_matrices
USE particle_types, ONLY: particle_type
USE qs_charge_mixing, ONLY: charge_mixing
USE qs_condnum, ONLY: overlap_condnum
USE qs_dispersion_pairpot, ONLY: d3_cnumber,&
USE qs_dispersion_cnum, ONLY: d3_cnumber,&
dcnum_distribute,&
dcnum_type
USE qs_dispersion_types, ONLY: qs_dispersion_type