using the preferred vdw_corr input wrapper (tentative)

This commit is contained in:
Hsin-Yu Ko 2020-11-16 10:04:28 -05:00
parent af88bcce3f
commit f0762dc13b
4 changed files with 26 additions and 6 deletions

View File

@ -47,6 +47,7 @@ MODULE cp_restart_new
!
USE control_flags, ONLY : gamma_only, force_pairing, trhow, &
tksw, do_makov_payne, smallmem, &
do_mbd, &
llondon, lxdm, ts_vdw, tfor, tpre
USE control_flags, ONLY : lwfpbe0nscf, lwfnscf, lwf ! Lingzhu Kong
USE constants, ONLY : e2
@ -774,7 +775,7 @@ MODULE cp_restart_new
Hubbard_U, hubba_dum, Hubbard_dum(1,:), Hubbard_dum(2,:), Hubbard_dum(3,:), &
Hubbard_dum, &
vdw_corr, scal6, lon_rcut, vdw_isolated)
CALL set_vdw_corr (vdw_corr, llondon, ldftd3, ts_vdw, lxdm )
CALL set_vdw_corr (vdw_corr, llondon, ldftd3, ts_vdw, do_mbd, lxdm )
IF ( ldftd3 ) CALL errore('cp_readfile','DFT-D3 not implemented',1)
!
lsda_ = output_obj%magnetization%lsda

View File

@ -6,17 +6,18 @@
! or http://www.gnu.org/copyleft/gpl.txt .
!
!
SUBROUTINE set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw, lxdm )
SUBROUTINE set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw, do_mdb, lxdm )
USE io_global, ONLY: stdout
!
IMPLICIT NONE
CHARACTER(LEN=*), INTENT(in) :: vdw_corr
LOGICAL, INTENT(out) :: llondon, ldftd3, ts_vdw, lxdm
LOGICAL, INTENT(out) :: llondon, ldftd3, ts_vdw, do_mdb, lxdm
!
llondon= .FALSE.
ldftd3 = .FALSE.
ts_vdw = .FALSE.
do_mdb = .FALSE.
lxdm = .FALSE.
SELECT CASE( TRIM( vdw_corr ) )
@ -29,6 +30,9 @@ SUBROUTINE set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw, lxdm )
CASE( 'TS', 'ts', 'ts-vdw', 'ts-vdW', 'tkatchenko-scheffler' )
ts_vdw = .TRUE.
CASE( 'MBD', 'mbd', 'many-body-dispersion' )
do_mdb = .TRUE.
CASE( 'XDM', 'xdm' )
lxdm = .TRUE.

View File

@ -172,6 +172,7 @@ SUBROUTINE iosys()
tq_smoothing_ => tq_smoothing, &
tbeta_smoothing_ => tbeta_smoothing, &
ts_vdw_ => ts_vdw, &
do_mbd_ => do_mbd, &
lecrpa_ => lecrpa, &
scf_must_converge_=> scf_must_converge, &
treinit_gvecs_ => treinit_gvecs, &
@ -263,6 +264,7 @@ SUBROUTINE iosys()
vdw_corr, london, london_s6, london_rcut, london_c6, &
london_rvdw, dftd3_threebody, dftd3_version, &
ts_vdw, ts_vdw_isolated, ts_vdw_econv_thr, &
do_mbd, &
xdm, xdm_a1, xdm_a2, lforcet, &
one_atom_occupations, &
esm_bc, esm_efield, esm_w, esm_nfit, esm_a, &
@ -1322,7 +1324,7 @@ SUBROUTINE iosys()
!
! VdW CORRECTIONS (SEMI-EMPIRICAL)
!
CALL set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw_, lxdm)
CALL set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw_, do_mbd_, lxdm)
!
IF ( london ) THEN
CALL infomsg("iosys","london is obsolete, use ""vdw_corr='grimme-d2'"" instead")
@ -1339,6 +1341,11 @@ SUBROUTINE iosys()
vdw_corr='TS'
ts_vdw_ = .TRUE.
END IF
IF ( do_mbd ) THEN
CALL infomsg("iosys","do_mbd is obsolete, use ""vdw_corr='MBD'"" instead")
vdw_corr='MBD'
do_mbd_ = .TRUE.
END IF
IF ( llondon.AND.lxdm .OR. llondon.AND.ts_vdw_ .OR. lxdm.AND.ts_vdw_ .OR. &
ldftd3.AND.llondon .OR. ldftd3.AND.lxdm .OR. ldftd3.AND.ts_vdw ) &
CALL errore("iosys","must choose a unique vdW correction!", 1)

View File

@ -68,6 +68,7 @@ MODULE pw_restart_new
lscf, gamma_only, &
tqr, tq_smoothing, tbeta_smoothing, &
noinv, smallmem, &
do_mbd, &
llondon, lxdm, ts_vdw, scf_error, n_scf_steps
USE constants, ONLY : e2
USE realus, ONLY : real_space
@ -370,7 +371,7 @@ MODULE pw_restart_new
ECUTVCUT = ectuvcut_opt, LOCAL_THR = loc_thr_p )
END IF
empirical_vdw = (llondon .OR. ldftd3 .OR. lxdm .OR. ts_vdw )
empirical_vdw = (llondon .OR. ldftd3 .OR. lxdm .OR. ts_vdw .OR. do_mbd )
dft_is_vdw = dft_is_nonlocc()
IF ( dft_is_vdw .OR. empirical_vdw ) THEN
ALLOCATE (vdw_obj)
@ -409,6 +410,13 @@ MODULE pw_restart_new
ts_vdw_isolated_pt => ts_vdw_isolated_
ts_vdw_econv_thr_ = vdw_econv_thr
ts_vdw_econv_thr_pt => ts_vdw_econv_thr_
ELSE IF ( do_mbd ) THEN
! FIXME
!dispersion_energy_term = 2._DP * EtsvdW/e2
!ts_vdw_isolated_ = vdw_isolated
!ts_vdw_isolated_pt => ts_vdw_isolated_
!ts_vdw_econv_thr_ = vdw_econv_thr
!ts_vdw_econv_thr_pt => ts_vdw_econv_thr_
END IF
ELSE
vdw_corr_ = 'none'
@ -1089,7 +1097,7 @@ MODULE pw_restart_new
Hubbard_U, Hubbard_U_back, Hubbard_J0, Hubbard_alpha, Hubbard_beta, Hubbard_J, &
vdw_corr, scal6, lon_rcut, vdw_isolated )
!! More DFT initializations
CALL set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw, lxdm )
CALL set_vdw_corr ( vdw_corr, llondon, ldftd3, ts_vdw, do_mbd, lxdm )
CALL enforce_input_dft ( dft_name, .TRUE. )
IF ( dft_is_hybrid() ) THEN
ecutvcut=ecutvcut*e2