diff --git a/src/hfx_admm_utils.F b/src/hfx_admm_utils.F index 58c54faf97..5d859c6d55 100644 --- a/src/hfx_admm_utils.F +++ b/src/hfx_admm_utils.F @@ -270,10 +270,6 @@ CONTAINS CPABORT("GAPW ADMM not implemented for MCWEENY or NONE_DM purification.") END IF - IF (admm_env%do_gapw .AND. qs_env%run_rtp) THEN - CPABORT("GAPW ADMM not implemented for real-time propagation.") - END IF - IF (dft_control%do_admm_dm .AND. .NOT. ASSOCIATED(admm_env%admm_dm)) THEN CALL admm_dm_create(admm_env%admm_dm, dft_control%admm_control, nspins=dft_control%nspins, natoms=natoms) END IF diff --git a/src/qs_ks_methods.F b/src/qs_ks_methods.F index b20a308dcc..bb39513879 100644 --- a/src/qs_ks_methods.F +++ b/src/qs_ks_methods.F @@ -775,6 +775,7 @@ CONTAINS IF (dft_control%do_admm) THEN !Single atom contribution to the AUX matrices + !Note: also update ks_aux_fit matrix in case of rtp CALL admm_update_ks_atom(qs_env, calculate_forces) END IF END IF diff --git a/src/rtp_admm_methods.F b/src/rtp_admm_methods.F index 96ef1bd93f..4be1e51652 100644 --- a/src/rtp_admm_methods.F +++ b/src/rtp_admm_methods.F @@ -35,7 +35,8 @@ MODULE rtp_admm_methods do_admm_purify_none USE input_section_types, ONLY: section_vals_get_subs_vals,& section_vals_type - USE kinds, ONLY: dp + USE kinds, ONLY: default_string_length,& + dp USE mathconstants, ONLY: one,& zero USE message_passing, ONLY: mp_para_env_type @@ -45,11 +46,13 @@ MODULE rtp_admm_methods USE qs_environment_types, ONLY: get_qs_env,& qs_environment_type,& set_qs_env + USE qs_gapw_densities, ONLY: prepare_gapw_den USE qs_kind_types, ONLY: get_qs_kind_set,& qs_kind_type USE qs_ks_types, ONLY: qs_ks_env_type USE qs_mo_types, ONLY: get_mo_set,& mo_set_type + USE qs_rho_atom_methods, ONLY: calculate_rho_atom_coeff USE qs_rho_types, ONLY: qs_rho_get,& qs_rho_set,& qs_rho_type @@ -81,8 +84,9 @@ CONTAINS CHARACTER(LEN=*), PARAMETER :: routineN = 'rtp_admm_calc_rho_aux' + CHARACTER(LEN=default_string_length) :: basis_type INTEGER :: handle, ispin, nspins - LOGICAL :: s_mstruct_changed + LOGICAL :: gapw, s_mstruct_changed REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r_aux TYPE(admm_type), POINTER :: admm_env TYPE(cp_fm_type), DIMENSION(:), POINTER :: rtp_coeff_aux_fit @@ -115,10 +119,7 @@ CONTAINS CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit, task_list_aux_fit=task_list_aux_fit, & matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, mos_aux_fit=mos_aux_fit, & rho_aux_fit=rho_aux_fit) - - IF (admm_env%do_gapw) THEN - CPABORT("GAPW ADMM not implemented for real time propagation") - END IF + gapw = admm_env%do_gapw nspins = dft_control%nspins @@ -141,6 +142,13 @@ CONTAINS matrix_p_aux_im(ispin)%matrix, & ispin) + !IF GAPW, only do the soft basis with PW + basis_type = "AUX_FIT" + IF (gapw) THEN + basis_type = "AUX_FIT_SOFT" + task_list_aux_fit => admm_env%admm_gapw_env%task_list + END IF + CALL calculate_rho_elec(matrix_p=matrix_p_aux(ispin)%matrix, & rho=rho_r_aux(ispin), & rho_gspace=rho_g_aux(ispin), & @@ -148,6 +156,18 @@ CONTAINS ks_env=ks_env, soft_valid=.FALSE., & basis_type="AUX_FIT", & task_list_external=task_list_aux_fit) + + !IF GAPW, also need to atomic densities + IF (gapw) THEN + CALL calculate_rho_atom_coeff(qs_env, matrix_p_aux, & + rho_atom_set=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, & + qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, & + oce=admm_env%admm_gapw_env%oce, sab=admm_env%sab_aux_fit, & + para_env=para_env) + + CALL prepare_gapw_den(qs_env, local_rho_set=admm_env%admm_gapw_env%local_rho_set, & + do_rho0=.FALSE., kind_set_external=admm_env%admm_gapw_env%admm_kind_set) + END IF END DO CALL set_qs_env(qs_env, admm_env=admm_env) CALL qs_rho_set(rho_aux_fit, rho_r_valid=.TRUE., rho_g_valid=.TRUE.) @@ -432,6 +452,8 @@ CONTAINS matrix_ks_im=matrix_ks_im) CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, matrix_ks_aux_fit_im=matrix_ks_aux_fit_im) + !note: the GAPW contribution to ks_aux_fit taken care of in qs_ks_methods.F/update_admm_ks_atom + DO ispin = 1, dft_control%nspins SELECT CASE (admm_env%purification_method) diff --git a/tests/QS/regtest-admm-gapw/H2O-admm-emd.inp b/tests/QS/regtest-admm-gapw/H2O-admm-emd.inp new file mode 100644 index 0000000000..d4225c1aa6 --- /dev/null +++ b/tests/QS/regtest-admm-gapw/H2O-admm-emd.inp @@ -0,0 +1,95 @@ + +&FORCE_EVAL + METHOD QUICKSTEP + &DFT + &AUXILIARY_DENSITY_MATRIX_METHOD + METHOD BASIS_PROJECTION + ADMM_PURIFICATION_METHOD NONE + &END + &REAL_TIME_PROPAGATION + MAX_ITER 7 + MAT_EXP ARNOLDI + PROPAGATOR ETRS + EXP_ACCURACY 1.0E-11 + EPS_ITER 1.0E-2 + INITIAL_WFN SCF_WFN + &END + BASIS_SET_FILE_NAME BASIS_MOLOPT + BASIS_SET_FILE_NAME BASIS_ADMM + POTENTIAL_FILE_NAME POTENTIAL + &MGRID + CUTOFF 100 + &END MGRID + &QS + EPS_DEFAULT 1.0E-10 + METHOD GAPW + FORCE_PAW + &END QS + &POISSON + PERIODIC NONE + PSOLVER MT + &END + + &SCF + MAX_SCF 5 + EPS_SCF 1.0E-6 + SCF_GUESS ATOMIC + &OT ON + ROTATION + &END OT + &END SCF + &XC + &XC_FUNCTIONAL NONE + &END XC_FUNCTIONAL + &HF + &SCREENING + EPS_SCHWARZ 1.0E-10 + EPS_SCHWARZ_FORCES 1.0E-10 + SCREEN_ON_INITIAL_P FALSE + &END + &INTERACTION_POTENTIAL + POTENTIAL_TYPE COULOMB + &END + &MEMORY + MAX_MEMORY 50 + EPS_STORAGE_SCALING 0.1 + TREAT_FORCES_IN_CORE TRUE + &END + &END + &END XC + &END DFT + &SUBSYS + &CELL + ABC 8.0 8.0 8.0 + PERIODIC NONE + &END CELL + &COORD + O 0.000000 0.000000 -0.065587 + H 0.000000 -0.757136 0.520545 + H 0.000000 0.757136 0.520545 + &END COORD + &KIND H + BASIS_SET ORB DZVP-MOLOPT-GTH + POTENTIAL GTH-PBE-q1 + BASIS_SET AUX_FIT cFIT3 + &END KIND + &KIND O + BASIS_SET ORB DZVP-MOLOPT-GTH + POTENTIAL GTH-PBE-q6 + BASIS_SET AUX_FIT cFIT3 + &END KIND + &END SUBSYS +&END FORCE_EVAL +&GLOBAL + PROJECT H2O-hybrid-EMD + RUN_TYPE EHRENFEST_DYN + PRINT_LEVEL MEDIUM +&END GLOBAL +&MOTION + &MD + ENSEMBLE NVE + STEPS 2 + TIMESTEP [au_t] 0.25 + TEMPERATURE 300.0 + &END MD +&END MOTION diff --git a/tests/QS/regtest-admm-gapw/TEST_FILES b/tests/QS/regtest-admm-gapw/TEST_FILES index 0a50573b5e..4bbb16eeb9 100644 --- a/tests/QS/regtest-admm-gapw/TEST_FILES +++ b/tests/QS/regtest-admm-gapw/TEST_FILES @@ -17,4 +17,6 @@ MD-2-ALL.inp 1 5e-10 # GAPW_XC tests H2-geo-XC.inp 1 5e-10 -1.15201574159787 H2O-ADMMP-XC.inp 1 1e-12 -16.85600729246631 +# GAPW ADMM with RTP +H2O-admm-emd.inp 2 1e-10 -0.167597110002E+02 #EOF