Options for DFTB vdW: UFF|D2|D3|D3(BJ) (#2431)

* Add D2/D3/D3BJ options to DFTB/xTB

* Fix DFTB/D2 + regtest

* Remove extra options for vdW correction for xTB
This commit is contained in:
Juerg Hutter 2022-12-05 14:04:54 +01:00 committed by GitHub
parent 71e3cc1810
commit 2cd2f20ff9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 361 additions and 20 deletions

View file

@ -81,8 +81,11 @@ MODULE cp_control_types
REAL(KIND=dp) :: hb_sr_para
REAL(KIND=dp) :: eps_disp
REAL(KIND=dp) :: epscn
REAL(KIND=dp) :: exp_pre
REAL(KIND=dp) :: scaling
REAL(KIND=dp) :: rcdisp
REAL(KIND=dp), DIMENSION(3) :: sd3
REAL(KIND=dp), DIMENSION(4) :: sd3bj
LOGICAL :: do_ewald
CHARACTER(LEN=default_path_length) :: sk_file_path
CHARACTER(LEN=default_path_length) :: sk_file_list

View file

@ -1084,10 +1084,19 @@ CONTAINS
r_val=qs_control%dftb_control%rcdisp)
CALL section_vals_val_get(dftb_parameter, "COORDINATION_CUTOFF", &
r_val=qs_control%dftb_control%epscn)
CALL section_vals_val_get(dftb_parameter, "D2_EXP_PRE", &
r_val=qs_control%dftb_control%exp_pre)
CALL section_vals_val_get(dftb_parameter, "D2_SCALING", &
r_val=qs_control%dftb_control%scaling)
CALL section_vals_val_get(dftb_parameter, "D3_SCALING", r_vals=scal)
qs_control%dftb_control%sd3(1) = scal(1)
qs_control%dftb_control%sd3(2) = scal(2)
qs_control%dftb_control%sd3(3) = scal(3)
CALL section_vals_val_get(dftb_parameter, "D3BJ_SCALING", r_vals=scal)
qs_control%dftb_control%sd3bj(1) = scal(1)
qs_control%dftb_control%sd3bj(2) = scal(2)
qs_control%dftb_control%sd3bj(3) = scal(3)
qs_control%dftb_control%sd3bj(4) = scal(4)
CALL section_vals_val_get(dftb_parameter, "DISPERSION_PARAMETER_FILE", &
c_val=qs_control%dftb_control%dispersion_parameter_file)

View file

@ -1139,8 +1139,11 @@ MODULE input_constants
do_cosma = 2
! Dispersion DFTB
INTEGER, PARAMETER, PUBLIC :: dispersion_uff = 100, &
dispersion_d3 = 200
INTEGER, PARAMETER, PUBLIC :: dispersion_none = 0, &
dispersion_uff = 100, &
dispersion_d3 = 200, &
dispersion_d3bj = 210, &
dispersion_d2 = 300
! Transport section
INTEGER, PARAMETER, PUBLIC :: transport_localscf = 1, &

View file

@ -18,7 +18,9 @@ MODULE input_cp2k_tb
Porezag1995,&
Seifert1996,&
Zhechkov2005
USE input_constants, ONLY: dispersion_d3,&
USE input_constants, ONLY: dispersion_d2,&
dispersion_d3,&
dispersion_d3bj,&
dispersion_uff,&
slater
USE input_cp2k_mm, ONLY: create_GENPOT_section
@ -254,11 +256,13 @@ CONTAINS
CALL keyword_create(keyword, __LOCATION__, name="DISPERSION_TYPE", &
description="Use dispersion correction of the specified type."// &
" Dispersion correction has to be switched on in the DFTB section.", &
usage="DISPERSION_TYPE (UFF|D3)", &
enum_c_vals=s2a("UFF", "D3"), &
enum_i_vals=(/dispersion_uff, dispersion_d3/), &
usage="DISPERSION_TYPE (UFF|D3|D3(BJ)|D2)", &
enum_c_vals=s2a("UFF", "D3", "D3(BJ)", "D2"), &
enum_i_vals=(/dispersion_uff, dispersion_d3, dispersion_d3bj, dispersion_d2/), &
enum_desc=s2a("Uses the UFF force field for a pair potential dispersion correction.", &
"Uses the Grimme D3 method (simplified) for a pair potential dispersion correction."), &
"Uses the Grimme D3 method (simplified) for a pair potential dispersion correction.", &
"Uses the Grimme D3 method (simplified) with Becke-Johnson attenuation.", &
"Uses the Grimme D2 method for pair potential dispersion correction."), &
default_i_val=dispersion_uff)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
@ -298,6 +302,25 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D3BJ_SCALING", &
description="Scaling parameters (s6,a1,s8,a2) for the D3(BJ) dispersion method,", &
usage="D3BJ_SCALING 1.0 1.0 1.0 1.0", n_var=4, &
default_r_vals=(/0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp/))
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D2_SCALING", &
description="Scaling parameter for the D2 dispersion method,", &
usage="D2_SCALING 1.0", default_r_val=1.0_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D2_EXP_PRE", &
description="Exp prefactor for damping for the D2 dispersion method,", &
usage="EXP_PRE 2.0", default_r_val=2.0_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="HB_SR_PARAM", &
description="Uses a modified version for the GAMMA within the SCC-DFTB scheme, "// &
"specifically tuned for hydrogen bonds. Specify the exponent used in the exponential.", &

View file

@ -17,7 +17,9 @@ MODULE qs_dftb_dispersion
USE cp_control_types, ONLY: dft_control_type,&
dftb_control_type
USE cp_para_types, ONLY: cp_para_env_type
USE input_constants, ONLY: dispersion_d3,&
USE input_constants, ONLY: dispersion_d2,&
dispersion_d3,&
dispersion_d3bj,&
dispersion_uff
USE kinds, ONLY: dp
USE message_passing, ONLY: mp_sum
@ -81,7 +83,7 @@ CONTAINS
SELECT CASE (dftb_control%dispersion_type)
CASE (dispersion_uff)
CALL calculate_dispersion_uff(qs_env, para_env, calculate_forces)
CASE (dispersion_d3)
CASE (dispersion_d3, dispersion_d3bj, dispersion_d2)
CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
CALL calculate_dispersion_pairpot(qs_env, dispersion_env, &
energy%dispersion, calculate_forces)

View file

@ -90,7 +90,8 @@ MODULE qs_dispersion_pairpot
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_pairpot'
PUBLIC :: qs_dispersion_pairpot_init, calculate_dispersion_pairpot, &
qs_scaling_init, qs_scaling_dftd3, qs_scaling_dftd3bj
qs_scaling_init, qs_scaling_dftd3, qs_scaling_dftd3bj, &
qs_dispersion_setcn
TYPE dcnum_type
INTEGER :: neighbors
@ -350,6 +351,62 @@ CONTAINS
END SUBROUTINE qs_dispersion_pairpot_init
! **************************************************************************************************
!> \brief ...
!> \param atomic_kind_set ...
!> \param qs_kind_set ...
!> \param dispersion_env ...
!> \param para_env ...
! **************************************************************************************************
SUBROUTINE qs_dispersion_setcn(atomic_kind_set, qs_kind_set, dispersion_env, para_env)
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(qs_dispersion_type), POINTER :: dispersion_env
TYPE(cp_para_env_type), POINTER :: para_env
CHARACTER(len=*), PARAMETER :: routineN = 'qs_dispersion_setcn'
CHARACTER(LEN=default_string_length) :: filename
INTEGER :: i, ikind, max_elem, maxc, nkind
REAL(KIND=dp) :: dum
TYPE(qs_atom_dispersion_type), POINTER :: disp
nkind = SIZE(atomic_kind_set)
IF (dispersion_env%type /= xc_vdw_fun_pairpot) THEN
DO ikind = 1, nkind
ALLOCATE (disp)
disp%type = dftd3_pp
disp%defined = .TRUE.
CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
END DO
END IF
max_elem = 94
maxc = 5
dispersion_env%max_elem = max_elem
dispersion_env%maxc = maxc
ALLOCATE (dispersion_env%maxci(max_elem))
ALLOCATE (dispersion_env%c6ab(max_elem, max_elem, maxc, maxc, 3))
ALLOCATE (dispersion_env%r0ab(max_elem, max_elem))
ALLOCATE (dispersion_env%rcov(max_elem))
ALLOCATE (dispersion_env%r2r4(max_elem))
ALLOCATE (dispersion_env%cn(max_elem))
! get filename of parameter file
filename = dispersion_env%parameter_file_name
CALL dftd3_c6_param(dispersion_env%c6ab, dispersion_env%maxci, filename, para_env)
CALL setr0ab(dispersion_env%r0ab, dispersion_env%rcov, dispersion_env%r2r4)
! the default coordination numbers
CALL setcn(dispersion_env%cn)
DO i = 1, max_elem
dum = 0.5_dp*dispersion_env%r2r4(i)*REAL(i, dp)**0.5_dp
dispersion_env%r2r4(i) = SQRT(dum)
END DO
dispersion_env%k1 = 16.0_dp
dispersion_env%k2 = 4._dp/3._dp
dispersion_env%k3 = -4._dp
dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*bohr
dispersion_env%alp = 14._dp
END SUBROUTINE qs_dispersion_setcn
! **************************************************************************************************
!> \brief ...

View file

@ -95,14 +95,14 @@ MODULE qs_environment
USE hfx_types, ONLY: compare_hfx_sections,&
hfx_create
USE input_constants, ONLY: &
dispersion_d3, do_et_ddapc, do_method_am1, do_method_dftb, do_method_gapw, &
do_method_gapw_xc, do_method_gpw, do_method_lrigpw, do_method_mndo, do_method_mndod, &
do_method_ofgpw, do_method_pdg, do_method_pm3, do_method_pm6, do_method_pm6fm, &
do_method_pnnl, do_method_rigpw, do_method_rm1, do_method_xtb, do_qmmm_gauss, &
do_qmmm_swave, general_roks, kg_tnadd_embed_ri, rel_none, rel_trans_atom, &
vdw_pairpot_dftd3, vdw_pairpot_dftd3bj, wfi_aspc_nr, wfi_linear_ps_method_nr, &
wfi_linear_wf_method_nr, wfi_ps_method_nr, wfi_use_guess_method_nr, xc_vdw_fun_none, &
xc_vdw_fun_nonloc, xc_vdw_fun_pairpot
dispersion_d2, dispersion_d3, dispersion_d3bj, do_et_ddapc, do_method_am1, do_method_dftb, &
do_method_gapw, do_method_gapw_xc, do_method_gpw, do_method_lrigpw, do_method_mndo, &
do_method_mndod, do_method_ofgpw, do_method_pdg, do_method_pm3, do_method_pm6, &
do_method_pm6fm, do_method_pnnl, do_method_rigpw, do_method_rm1, do_method_xtb, &
do_qmmm_gauss, do_qmmm_swave, general_roks, kg_tnadd_embed_ri, rel_none, rel_trans_atom, &
vdw_pairpot_dftd2, vdw_pairpot_dftd3, vdw_pairpot_dftd3bj, wfi_aspc_nr, &
wfi_linear_ps_method_nr, wfi_linear_wf_method_nr, wfi_ps_method_nr, &
wfi_use_guess_method_nr, xc_vdw_fun_none, xc_vdw_fun_nonloc, xc_vdw_fun_pairpot
USE input_section_types, ONLY: section_vals_get,&
section_vals_get_subs_vals,&
section_vals_type,&
@ -1242,6 +1242,30 @@ CONTAINS
dispersion_env%nd3_exclude_pair = 0
dispersion_env%parameter_file_name = dftb_control%dispersion_parameter_file
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, para_env=para_env)
ELSEIF (dftb_control%dispersion .AND. dftb_control%dispersion_type == dispersion_d3bj) THEN
dispersion_env%type = xc_vdw_fun_pairpot
dispersion_env%pp_type = vdw_pairpot_dftd3bj
dispersion_env%eps_cn = dftb_control%epscn
dispersion_env%s6 = dftb_control%sd3bj(1)
dispersion_env%a1 = dftb_control%sd3bj(2)
dispersion_env%s8 = dftb_control%sd3bj(3)
dispersion_env%a2 = dftb_control%sd3bj(4)
dispersion_env%domol = .FALSE.
dispersion_env%kgc8 = 0._dp
dispersion_env%rc_disp = dftb_control%rcdisp
dispersion_env%exp_pre = 0._dp
dispersion_env%scaling = 0._dp
dispersion_env%nd3_exclude_pair = 0
dispersion_env%parameter_file_name = dftb_control%dispersion_parameter_file
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, para_env=para_env)
ELSEIF (dftb_control%dispersion .AND. dftb_control%dispersion_type == dispersion_d2) THEN
dispersion_env%type = xc_vdw_fun_pairpot
dispersion_env%pp_type = vdw_pairpot_dftd2
dispersion_env%exp_pre = dftb_control%exp_pre
dispersion_env%scaling = dftb_control%scaling
dispersion_env%parameter_file_name = dftb_control%dispersion_parameter_file
dispersion_env%rc_disp = dftb_control%rcdisp
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, para_env=para_env)
ELSE
dispersion_env%type = xc_vdw_fun_none
END IF

View file

@ -833,7 +833,7 @@ CONTAINS
CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
sab_vdw => dispersion_env%sab_vdw
sab_cn => dispersion_env%sab_cn
IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
IF (dispersion_env%type == xc_vdw_fun_pairpot .OR. xtb) THEN
c_radius(:) = dispersion_env%rc_disp
default_present = .TRUE. !include all atoms in vdW (even without basis)
CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
@ -841,9 +841,10 @@ CONTAINS
subcells=subcells, operator_type="PP", nlname="sab_vdw")
dispersion_env%sab_vdw => sab_vdw
IF (dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
IF (xtb .OR. dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
! Build the neighbor lists for coordination numbers as needed by the DFT-D3 method
! This is also needed for the xTB Hamiltonian
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=zat)
c_radius(ikind) = 4._dp*ptable(zat)%covalent_radius*bohr

View file

@ -0,0 +1,8 @@
# runs are executed in the same order as in this file
# the second field tells which test should be run in order to compare with the last available output
# see regtest/TEST_FILES
tb_uff.inp 1 1.0E-14 -5.75463073188988
tb_d3.inp 1 1.0E-14 -5.76288772623661
tb_d3bj.inp 1 1.0E-14 -5.76508211988679
tb_d2.inp 1 1.0E-14 -5.85163052938608
#EOF

View file

@ -0,0 +1,53 @@
#CPQA INCLUDE DFTB/scc/scc_parameter
#CPQA INCLUDE ../uff_table
#CPQA INCLUDE DFTB/scc/oo.spl
#CPQA INCLUDE DFTB/scc/oc.spl
#CPQA INCLUDE DFTB/scc/oh.spl
#CPQA INCLUDE DFTB/scc/co.spl
#CPQA INCLUDE DFTB/scc/cc.spl
#CPQA INCLUDE DFTB/scc/ch.spl
#CPQA INCLUDE DFTB/scc/ho.spl
#CPQA INCLUDE DFTB/scc/hc.spl
#CPQA INCLUDE DFTB/scc/hh.spl
&FORCE_EVAL
&DFT
&QS
METHOD DFTB
&DFTB
SELF_CONSISTENT T
DISPERSION T
ORTHOGONAL_BASIS F
DO_EWALD F
&PARAMETER
PARAM_FILE_PATH DFTB/scc
PARAM_FILE_NAME scc_parameter
DISPERSION_TYPE D2
D2_SCALING 1.10
D2_EXP_PRE 2.50
&END PARAMETER
&END DFTB
&END QS
&SCF
SCF_GUESS ATOMIC
MAX_SCF 20
&END SCF
&END DFT
&SUBSYS
&CELL
ABC 20.0 20.0 20.0
PERIODIC NONE
&END CELL
&COORD
O 0.051368 0.000000 0.000000
C 1.278612 0.000000 0.000000
H 1.870460 0.939607 0.000000
H 1.870460 -0.939607 0.000000
&END COORD
&END SUBSYS
&END FORCE_EVAL
&GLOBAL
PROJECT test_vdw
RUN_TYPE GEO_OPT
PRINT_LEVEL LOW
&END GLOBAL

View file

@ -0,0 +1,53 @@
#CPQA INCLUDE DFTB/scc/scc_parameter
#CPQA INCLUDE ../uff_table
#CPQA INCLUDE DFTB/scc/oo.spl
#CPQA INCLUDE DFTB/scc/oc.spl
#CPQA INCLUDE DFTB/scc/oh.spl
#CPQA INCLUDE DFTB/scc/co.spl
#CPQA INCLUDE DFTB/scc/cc.spl
#CPQA INCLUDE DFTB/scc/ch.spl
#CPQA INCLUDE DFTB/scc/ho.spl
#CPQA INCLUDE DFTB/scc/hc.spl
#CPQA INCLUDE DFTB/scc/hh.spl
&FORCE_EVAL
&DFT
&QS
METHOD DFTB
&DFTB
SELF_CONSISTENT T
DISPERSION T
ORTHOGONAL_BASIS F
DO_EWALD F
&PARAMETER
PARAM_FILE_PATH DFTB/scc
PARAM_FILE_NAME scc_parameter
DISPERSION_TYPE D3
DISPERSION_PARAMETER_FILE dftd3.dat
D3_SCALING 1.0 1.5 1.5
&END PARAMETER
&END DFTB
&END QS
&SCF
SCF_GUESS ATOMIC
MAX_SCF 20
&END SCF
&END DFT
&SUBSYS
&CELL
ABC 20.0 20.0 20.0
PERIODIC NONE
&END CELL
&COORD
O 0.051368 0.000000 0.000000
C 1.278612 0.000000 0.000000
H 1.870460 0.939607 0.000000
H 1.870460 -0.939607 0.000000
&END COORD
&END SUBSYS
&END FORCE_EVAL
&GLOBAL
PROJECT test_vdw
RUN_TYPE GEO_OPT
PRINT_LEVEL LOW
&END GLOBAL

View file

@ -0,0 +1,53 @@
#CPQA INCLUDE DFTB/scc/scc_parameter
#CPQA INCLUDE ../uff_table
#CPQA INCLUDE DFTB/scc/oo.spl
#CPQA INCLUDE DFTB/scc/oc.spl
#CPQA INCLUDE DFTB/scc/oh.spl
#CPQA INCLUDE DFTB/scc/co.spl
#CPQA INCLUDE DFTB/scc/cc.spl
#CPQA INCLUDE DFTB/scc/ch.spl
#CPQA INCLUDE DFTB/scc/ho.spl
#CPQA INCLUDE DFTB/scc/hc.spl
#CPQA INCLUDE DFTB/scc/hh.spl
&FORCE_EVAL
&DFT
&QS
METHOD DFTB
&DFTB
SELF_CONSISTENT T
DISPERSION T
ORTHOGONAL_BASIS F
DO_EWALD F
&PARAMETER
PARAM_FILE_PATH DFTB/scc
PARAM_FILE_NAME scc_parameter
DISPERSION_TYPE D3(BJ)
DISPERSION_PARAMETER_FILE dftd3.dat
D3BJ_SCALING 1.0 0.4 1.5 4.0
&END PARAMETER
&END DFTB
&END QS
&SCF
SCF_GUESS ATOMIC
MAX_SCF 20
&END SCF
&END DFT
&SUBSYS
&CELL
ABC 20.0 20.0 20.0
PERIODIC NONE
&END CELL
&COORD
O 0.051368 0.000000 0.000000
C 1.278612 0.000000 0.000000
H 1.870460 0.939607 0.000000
H 1.870460 -0.939607 0.000000
&END COORD
&END SUBSYS
&END FORCE_EVAL
&GLOBAL
PROJECT test_vdw
RUN_TYPE GEO_OPT
PRINT_LEVEL LOW
&END GLOBAL

View file

@ -0,0 +1,51 @@
#CPQA INCLUDE DFTB/scc/scc_parameter
#CPQA INCLUDE ../uff_table
#CPQA INCLUDE DFTB/scc/oo.spl
#CPQA INCLUDE DFTB/scc/oc.spl
#CPQA INCLUDE DFTB/scc/oh.spl
#CPQA INCLUDE DFTB/scc/co.spl
#CPQA INCLUDE DFTB/scc/cc.spl
#CPQA INCLUDE DFTB/scc/ch.spl
#CPQA INCLUDE DFTB/scc/ho.spl
#CPQA INCLUDE DFTB/scc/hc.spl
#CPQA INCLUDE DFTB/scc/hh.spl
&FORCE_EVAL
&DFT
&QS
METHOD DFTB
&DFTB
SELF_CONSISTENT T
DISPERSION T
ORTHOGONAL_BASIS F
DO_EWALD F
&PARAMETER
PARAM_FILE_PATH DFTB/scc
PARAM_FILE_NAME scc_parameter
UFF_FORCE_FIELD ../uff_table
&END PARAMETER
&END DFTB
&END QS
&SCF
SCF_GUESS ATOMIC
MAX_SCF 20
&END SCF
&END DFT
&SUBSYS
&CELL
ABC 20.0 20.0 20.0
PERIODIC NONE
&END CELL
&COORD
O 0.051368 0.000000 0.000000
C 1.278612 0.000000 0.000000
H 1.870460 0.939607 0.000000
H 1.870460 -0.939607 0.000000
&END COORD
&END SUBSYS
&END FORCE_EVAL
&GLOBAL
PROJECT test_vdw
RUN_TYPE GEO_OPT
PRINT_LEVEL LOW
&END GLOBAL

View file

@ -332,3 +332,4 @@ Fist/regtest-plumed2 plumed2
Fist/regtest-quip quip
Fist/regtest-16
QS/regtest-rtp-4
DFTB/regtest-vdw