Skip to content

Commit

Permalink
HFX: Add longrange potential for ADMM
Browse files Browse the repository at this point in the history
  • Loading branch information
Frederick Stein authored and fstein93 committed Mar 12, 2020
1 parent f37d4cf commit 5bfd09c
Show file tree
Hide file tree
Showing 5 changed files with 473 additions and 2 deletions.
190 changes: 188 additions & 2 deletions src/hfx_admm_utils.F
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ MODULE hfx_admm_utils
USE input_constants, ONLY: &
do_admm_aux_exch_func_bee, do_admm_aux_exch_func_default, do_admm_aux_exch_func_none, &
do_admm_aux_exch_func_opt, do_admm_aux_exch_func_pbex, do_potential_coulomb, &
do_potential_short, do_potential_truncated, xc_funct_no_shortcut
do_potential_long, do_potential_mix_cl, do_potential_mix_cl_trunc, do_potential_short, &
do_potential_truncated, xc_funct_no_shortcut
USE input_section_types, ONLY: section_vals_duplicate,&
section_vals_get,&
section_vals_get_subs_vals,&
Expand Down Expand Up @@ -799,7 +800,7 @@ SUBROUTINE create_admm_xc_section(qs_env, xc_section, admm_env)
INTEGER :: hfx_potential_type, ifun, iounit, nfun
LOGICAL :: funct_found
REAL(dp) :: cutoff_radius, hfx_fraction, omega, &
scale_x
scale_coulomb, scale_longrange, scale_x
TYPE(cp_logger_type), POINTER :: logger
TYPE(section_vals_type), POINTER :: xc_fun, xc_fun_section
Expand Down Expand Up @@ -881,6 +882,47 @@ SUBROUTINE create_admm_xc_section(qs_env, xc_section, admm_env)
r_val=0.0_dp)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=-hfx_fraction)
CASE (do_potential_long)
omega = qs_env%x_data(1, 1)%potential_parameter%omega
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=hfx_fraction)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=-hfx_fraction)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
CASE (do_potential_mix_cl)
omega = qs_env%x_data(1, 1)%potential_parameter%omega
scale_coulomb = qs_env%x_data(1, 1)%potential_parameter%scale_coulomb
scale_longrange = qs_env%x_data(1, 1)%potential_parameter%scale_longrange
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=hfx_fraction*scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=-hfx_fraction*(scale_longrange + scale_coulomb))
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
CASE (do_potential_mix_cl_trunc)
omega = qs_env%x_data(1, 1)%potential_parameter%omega
cutoff_radius = qs_env%x_data(1, 1)%potential_parameter%cutoff_radius
scale_coulomb = qs_env%x_data(1, 1)%potential_parameter%scale_coulomb
scale_longrange = qs_env%x_data(1, 1)%potential_parameter%scale_longrange
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%SCALE_X", &
r_val=hfx_fraction*(scale_longrange + scale_coulomb))
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%CUTOFF_RADIUS", &
r_val=cutoff_radius)
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=hfx_fraction*scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=-hfx_fraction*(scale_longrange + scale_coulomb))
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
CASE DEFAULT
CPABORT("")
END SELECT
Expand Down Expand Up @@ -945,6 +987,42 @@ SUBROUTINE create_admm_xc_section(qs_env, xc_section, admm_env)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
END IF
CASE (do_potential_long)
omega = qs_env%x_data(1, 1)%potential_parameter%omega
ifun = 0
funct_found = .FALSE.
DO
ifun = ifun + 1
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
IF (xc_fun%section%name == "XWPBE") THEN
funct_found = .TRUE.
END IF
END DO
IF (.NOT. funct_found) THEN
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=-hfx_fraction)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=hfx_fraction)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
ELSE
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
scale_x = scale_x - hfx_fraction
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
scale_x = scale_x + hfx_fraction
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
END IF
CASE (do_potential_truncated)
cutoff_radius = qs_env%x_data(1, 1)%potential_parameter%cutoff_radius
ifun = 0
Expand Down Expand Up @@ -999,6 +1077,114 @@ SUBROUTINE create_admm_xc_section(qs_env, xc_section, admm_env)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
END IF
CASE (do_potential_mix_cl_trunc)
cutoff_radius = qs_env%x_data(1, 1)%potential_parameter%cutoff_radius
omega = qs_env%x_data(1, 1)%potential_parameter%omega
scale_coulomb = qs_env%x_data(1, 1)%potential_parameter%scale_coulomb
scale_longrange = qs_env%x_data(1, 1)%potential_parameter%scale_longrange
ifun = 0
funct_found = .FALSE.
DO
ifun = ifun + 1
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
IF (xc_fun%section%name == "PBE_HOLE_T_C_LR") THEN
funct_found = .TRUE.
END IF
END DO
IF (.NOT. funct_found) THEN
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%SCALE_X", &
r_val=-hfx_fraction*(scale_coulomb + scale_longrange))
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%CUTOFF_RADIUS", &
r_val=cutoff_radius)
ELSE
CALL section_vals_val_get(xc_fun_section, "PBE_HOLE_T_C_LR%SCALE_X", &
r_val=scale_x)
scale_x = scale_x - hfx_fraction*(scale_coulomb + scale_longrange)
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%SCALE_X", &
r_val=scale_x)
CALL section_vals_val_set(xc_fun_section, "PBE_HOLE_T_C_LR%CUTOFF_RADIUS", &
r_val=cutoff_radius)
END IF
ifun = 0
funct_found = .FALSE.
DO
ifun = ifun + 1
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
IF (xc_fun%section%name == "XWPBE") THEN
funct_found = .TRUE.
END IF
END DO
IF (.NOT. funct_found) THEN
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=hfx_fraction*(scale_coulomb + scale_longrange))
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=-hfx_fraction*scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
ELSE
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
scale_x = scale_x + hfx_fraction*(scale_coulomb + scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
scale_x = scale_x - hfx_fraction*scale_longrange
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
END IF
CASE (do_potential_mix_cl)
omega = qs_env%x_data(1, 1)%potential_parameter%omega
scale_coulomb = qs_env%x_data(1, 1)%potential_parameter%scale_coulomb
scale_longrange = qs_env%x_data(1, 1)%potential_parameter%scale_longrange
ifun = 0
funct_found = .FALSE.
DO
ifun = ifun + 1
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
IF (xc_fun%section%name == "XWPBE") THEN
funct_found = .TRUE.
END IF
END DO
IF (.NOT. funct_found) THEN
CALL section_vals_val_set(xc_fun_section, "XWPBE%_SECTION_PARAMETERS_", &
l_val=.TRUE.)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=hfx_fraction*(scale_coulomb + scale_longrange))
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=-hfx_fraction*scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
ELSE
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
scale_x = scale_x + hfx_fraction*(scale_coulomb + scale_longrange)
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X0", &
r_val=scale_x)
CALL section_vals_val_get(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
scale_x = scale_x - hfx_fraction*scale_longrange
CALL section_vals_val_set(xc_fun_section, "XWPBE%SCALE_X", &
r_val=scale_x)
CALL section_vals_val_set(xc_fun_section, "XWPBE%OMEGA", &
r_val=omega)
END IF
END SELECT
Expand Down
93 changes: 93 additions & 0 deletions tests/QS/regtest-hfx-wfn-fitting/CH4-HSE06_2.inp
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
&FORCE_EVAL
METHOD Quickstep
&DFT
BASIS_SET_FILE_NAME BASIS_MOLOPT
POTENTIAL_FILE_NAME GTH_POTENTIALS
&MGRID
CUTOFF 100
REL_CUTOFF 30
&END MGRID
&QS
METHOD GPW
EPS_PGF_ORB 1.0E-12
EPS_FILTER_MATRIX 0.0e0
&END QS
&AUXILIARY_DENSITY_MATRIX_METHOD
METHOD BASIS_PROJECTION
ADMM_PURIFICATION_METHOD MO_DIAG
&END
&POISSON
PERIODIC NONE
PSOLVER MT
&END
&SCF
EPS_SCF 1.0E-6
SCF_GUESS ATOMIC
MAX_SCF 10
&OT ON
&END
&END SCF
&XC
&XC_FUNCTIONAL
&XWPBE
SCALE_X -0.25
SCALE_X0 1.0
OMEGA 0.11
&END
&PBE
SCALE_X 0.0
SCALE_C 1.0
&END PBE
&END XC_FUNCTIONAL
&HF
&SCREENING
EPS_SCHWARZ 1.0E-6
SCREEN_ON_INITIAL_P FALSE
&END
&MEMORY
MAX_MEMORY 900
EPS_STORAGE_SCALING 0.1
&END
&INTERACTION_POTENTIAL
# For HSE SHORTRANGE is better, we use MIX_CL just for testing purposes here
POTENTIAL_TYPE MIX_CL
SCALE_LONGRANGE -1.0
SCALE_COULOMB 1.0
OMEGA 0.11
&END
FRACTION 0.25
&END
&END XC
&END DFT
&SUBSYS
&CELL
ABC 8.0 8.0 8.0
PERIODIC NONE
&END CELL
&COORD
C 0.0000 0.0000 0.0000
H 0.6297 0.6297 0.6297
H -0.6297 -0.6297 0.6297
H -0.6297 0.6297 -0.6297
H 0.6297 -0.6297 -0.6297
&END COORD
&KIND H
BASIS_SET TZV2P-MOLOPT-GTH
BASIS_SET AUX_FIT SZV-MOLOPT-GTH
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET TZV2P-MOLOPT-GTH
BASIS_SET AUX_FIT SZV-MOLOPT-GTH
POTENTIAL GTH-PBE-q4
&END KIND
&END SUBSYS
&END FORCE_EVAL
&GLOBAL
PROJECT CH4-HSE06
PRINT_LEVEL MEDIUM
RUN_TYPE ENERGY_FORCE
&TIMINGS
THRESHOLD 0.000000001
&END
&END GLOBAL

0 comments on commit 5bfd09c

Please sign in to comment.