mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-21 06:25:15 -04:00
Harris and EHT methods: enable LS solver (#3780)
This commit is contained in:
parent
f0c9f40c45
commit
d41ea5a552
14 changed files with 580 additions and 206 deletions
|
|
@ -649,6 +649,7 @@ list(
|
|||
qs_neighbor_list_types.F
|
||||
qs_nl_hash_table_types.F
|
||||
qs_nonscf.F
|
||||
qs_nonscf_utils.F
|
||||
qs_o3c_methods.F
|
||||
qs_o3c_types.F
|
||||
qs_oce_methods.F
|
||||
|
|
|
|||
115
src/dm_ls_scf.F
115
src/dm_ls_scf.F
|
|
@ -37,13 +37,9 @@ MODULE dm_ls_scf
|
|||
density_matrix_tc2,&
|
||||
density_matrix_trs4,&
|
||||
ls_scf_init_matrix_S
|
||||
USE dm_ls_scf_qs, ONLY: ls_scf_dm_to_ks,&
|
||||
ls_scf_init_qs,&
|
||||
ls_scf_qs_atomic_guess,&
|
||||
matrix_ls_create,&
|
||||
matrix_ls_to_qs,&
|
||||
matrix_qs_to_ls,&
|
||||
rho_mixing_ls_init
|
||||
USE dm_ls_scf_qs, ONLY: &
|
||||
ls_nonscf_energy, ls_nonscf_ks, ls_scf_dm_to_ks, ls_scf_init_qs, ls_scf_qs_atomic_guess, &
|
||||
matrix_ls_create, matrix_ls_to_qs, matrix_qs_to_ls, rho_mixing_ls_init
|
||||
USE dm_ls_scf_types, ONLY: ls_scf_env_type
|
||||
USE ec_env_types, ONLY: energy_correction_type
|
||||
USE input_constants, ONLY: ls_cluster_atomic,&
|
||||
|
|
@ -78,6 +74,7 @@ MODULE dm_ls_scf
|
|||
USE qs_environment_types, ONLY: get_qs_env,&
|
||||
qs_environment_type
|
||||
USE qs_ks_types, ONLY: qs_ks_env_type
|
||||
USE qs_nonscf_utils, ONLY: qs_nonscf_print_summary
|
||||
USE qs_scf_post_gpw, ONLY: qs_scf_post_moments,&
|
||||
write_mo_free_results
|
||||
USE qs_scf_post_tb, ONLY: scf_post_calculation_tb
|
||||
|
|
@ -100,33 +97,43 @@ CONTAINS
|
|||
!> \brief perform an linear scaling scf procedure: entry point
|
||||
!>
|
||||
!> \param qs_env ...
|
||||
!> \param nonscf ...
|
||||
!> \par History
|
||||
!> 2010.10 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_scf(qs_env)
|
||||
SUBROUTINE ls_scf(qs_env, nonscf)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: nonscf
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_scf'
|
||||
|
||||
INTEGER :: handle
|
||||
LOGICAL :: pao_is_done
|
||||
LOGICAL :: do_scf, pao_is_done
|
||||
TYPE(ls_scf_env_type), POINTER :: ls_scf_env
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
do_scf = .TRUE.
|
||||
IF (PRESENT(nonscf)) do_scf = .NOT. nonscf
|
||||
|
||||
CALL get_qs_env(qs_env, ls_scf_env=ls_scf_env)
|
||||
CALL pao_optimization_start(qs_env, ls_scf_env)
|
||||
|
||||
pao_is_done = .FALSE.
|
||||
DO WHILE (.NOT. pao_is_done)
|
||||
CALL ls_scf_init_scf(qs_env, ls_scf_env)
|
||||
CALL pao_update(qs_env, ls_scf_env, pao_is_done)
|
||||
CALL ls_scf_main(qs_env, ls_scf_env)
|
||||
CALL pao_post_scf(qs_env, ls_scf_env, pao_is_done)
|
||||
IF (do_scf) THEN
|
||||
CALL pao_optimization_start(qs_env, ls_scf_env)
|
||||
pao_is_done = .FALSE.
|
||||
DO WHILE (.NOT. pao_is_done)
|
||||
CALL ls_scf_init_scf(qs_env, ls_scf_env, .FALSE.)
|
||||
CALL pao_update(qs_env, ls_scf_env, pao_is_done)
|
||||
CALL ls_scf_main(qs_env, ls_scf_env, .FALSE.)
|
||||
CALL pao_post_scf(qs_env, ls_scf_env, pao_is_done)
|
||||
CALL ls_scf_post(qs_env, ls_scf_env)
|
||||
END DO
|
||||
CALL pao_optimization_end(ls_scf_env)
|
||||
ELSE
|
||||
CALL ls_scf_init_scf(qs_env, ls_scf_env, .TRUE.)
|
||||
CALL ls_scf_main(qs_env, ls_scf_env, .TRUE.)
|
||||
CALL ls_scf_post(qs_env, ls_scf_env)
|
||||
END DO
|
||||
|
||||
CALL pao_optimization_end(ls_scf_env)
|
||||
END IF
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
|
|
@ -136,13 +143,15 @@ CONTAINS
|
|||
!> \brief initialization needed for scf
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
!> \param nonscf ...
|
||||
!> \par History
|
||||
!> 2010.10 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_scf_init_scf(qs_env, ls_scf_env)
|
||||
SUBROUTINE ls_scf_init_scf(qs_env, ls_scf_env, nonscf)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
LOGICAL, INTENT(IN) :: nonscf
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_scf_init_scf'
|
||||
|
||||
|
|
@ -210,7 +219,7 @@ CONTAINS
|
|||
CALL ls_scf_init_matrix_s(matrix_s(1)%matrix, ls_scf_env)
|
||||
|
||||
! get the initial guess for the SCF
|
||||
CALL ls_scf_initial_guess(qs_env, ls_scf_env)
|
||||
CALL ls_scf_initial_guess(qs_env, ls_scf_env, nonscf)
|
||||
|
||||
IF (ls_scf_env%do_rho_mixing) THEN
|
||||
CALL rho_mixing_ls_init(qs_env, ls_scf_env)
|
||||
|
|
@ -232,13 +241,15 @@ CONTAINS
|
|||
!> \brief deal with the scf initial guess
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
!> \param nonscf ...
|
||||
!> \par History
|
||||
!> 2012.11 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_scf_initial_guess(qs_env, ls_scf_env)
|
||||
SUBROUTINE ls_scf_initial_guess(qs_env, ls_scf_env, nonscf)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
LOGICAL, INTENT(IN) :: nonscf
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_scf_initial_guess'
|
||||
INTEGER, PARAMETER :: aspc_guess = 2, atomic_guess = 1, &
|
||||
|
|
@ -279,7 +290,8 @@ CONTAINS
|
|||
! how to get the initial guess
|
||||
SELECT CASE (initial_guess_type)
|
||||
CASE (atomic_guess)
|
||||
CALL ls_scf_qs_atomic_guess(qs_env, ls_scf_env%energy_init)
|
||||
CALL ls_scf_qs_atomic_guess(qs_env, ls_scf_env, ls_scf_env%energy_init, nonscf)
|
||||
IF (unit_nr > 0) WRITE (unit_nr, '()')
|
||||
CASE (restart_guess)
|
||||
project_name = logger%iter_info%project_name
|
||||
DO ispin = 1, SIZE(ls_scf_env%matrix_p)
|
||||
|
|
@ -293,7 +305,11 @@ CONTAINS
|
|||
END DO
|
||||
|
||||
! directly go to computing the corresponding energy and ks matrix
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, ls_scf_env%energy_init, iscf=0)
|
||||
IF (nonscf) THEN
|
||||
CALL ls_nonscf_ks(qs_env, ls_scf_env, ls_scf_env%energy_init)
|
||||
ELSE
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, ls_scf_env%energy_init, iscf=0)
|
||||
END IF
|
||||
CASE (aspc_guess)
|
||||
CALL cite_reference(Kolafa2004)
|
||||
CALL cite_reference(Kuhne2007)
|
||||
|
|
@ -346,7 +362,11 @@ CONTAINS
|
|||
END IF
|
||||
|
||||
! compute corresponding energy and ks matrix
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, ls_scf_env%energy_init, iscf=0)
|
||||
IF (nonscf) THEN
|
||||
CALL ls_nonscf_ks(qs_env, ls_scf_env, ls_scf_env%energy_init)
|
||||
ELSE
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, ls_scf_env%energy_init, iscf=0)
|
||||
END IF
|
||||
END SELECT
|
||||
|
||||
IF (unit_nr > 0) THEN
|
||||
|
|
@ -440,13 +460,15 @@ CONTAINS
|
|||
!> \brief Main SCF routine. Can we keep it clean ?
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
!> \param nonscf ...
|
||||
!> \par History
|
||||
!> 2010.10 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_scf_main(qs_env, ls_scf_env)
|
||||
SUBROUTINE ls_scf_main(qs_env, ls_scf_env, nonscf)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: nonscf
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_scf_main'
|
||||
|
||||
|
|
@ -456,7 +478,7 @@ CONTAINS
|
|||
LOGICAL :: check_convergence, diis_step, do_transport, extra_scf, maxscf_reached, &
|
||||
scf_converged, should_stop, transm_maxscf_reached, transm_scf_converged
|
||||
REAL(KIND=dp) :: energy_diff, energy_new, energy_old, &
|
||||
eps_diis, t1, t2
|
||||
eps_diis, t1, t2, tdiag
|
||||
TYPE(cp_logger_type), POINTER :: logger
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
|
||||
TYPE(dbcsr_type), ALLOCATABLE, DIMENSION(:) :: matrix_ks_deviation, matrix_mixing_old
|
||||
|
|
@ -560,7 +582,9 @@ CONTAINS
|
|||
ELSE
|
||||
! turn the KS matrix in a density matrix
|
||||
DO ispin = 1, nspin
|
||||
IF (ls_scf_env%do_rho_mixing) THEN
|
||||
IF (nonscf) THEN
|
||||
CALL dbcsr_copy(matrix_mixing_old(ispin), ls_scf_env%matrix_ks(ispin))
|
||||
ELSEIF (ls_scf_env%do_rho_mixing) THEN
|
||||
CALL dbcsr_copy(matrix_mixing_old(ispin), ls_scf_env%matrix_ks(ispin))
|
||||
ELSE
|
||||
IF (iscf == 1) THEN
|
||||
|
|
@ -652,14 +676,16 @@ CONTAINS
|
|||
CALL density_matrix_tc2(ls_scf_env%matrix_p(ispin), matrix_mixing_old(ispin), ls_scf_env%matrix_s_sqrt_inv, &
|
||||
nelectron_spin_real, ls_scf_env%eps_filter, ls_scf_env%homo_spin(ispin), &
|
||||
ls_scf_env%lumo_spin(ispin), non_monotonic=ls_scf_env%non_monotonic, &
|
||||
eps_lanczos=ls_scf_env%eps_lanczos, max_iter_lanczos=ls_scf_env%max_iter_lanczos)
|
||||
eps_lanczos=ls_scf_env%eps_lanczos, max_iter_lanczos=ls_scf_env%max_iter_lanczos, &
|
||||
iounit=-1)
|
||||
CASE (ls_scf_trs4)
|
||||
CALL density_matrix_trs4(ls_scf_env%matrix_p(ispin), matrix_mixing_old(ispin), ls_scf_env%matrix_s_sqrt_inv, &
|
||||
nelectron_spin_real, ls_scf_env%eps_filter, ls_scf_env%homo_spin(ispin), &
|
||||
ls_scf_env%lumo_spin(ispin), ls_scf_env%mu_spin(ispin), &
|
||||
dynamic_threshold=ls_scf_env%dynamic_threshold, &
|
||||
matrix_ks_deviation=matrix_ks_deviation(ispin), &
|
||||
eps_lanczos=ls_scf_env%eps_lanczos, max_iter_lanczos=ls_scf_env%max_iter_lanczos)
|
||||
eps_lanczos=ls_scf_env%eps_lanczos, max_iter_lanczos=ls_scf_env%max_iter_lanczos, &
|
||||
iounit=-1)
|
||||
CASE (ls_scf_pexsi)
|
||||
IF (ls_scf_env%has_s_preconditioner) &
|
||||
CPABORT("S preconditioning not implemented in combination with the PEXSI library. ")
|
||||
|
|
@ -684,22 +710,31 @@ CONTAINS
|
|||
END IF
|
||||
|
||||
! compute the corresponding new energy KS matrix and new energy
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, energy_new, iscf)
|
||||
IF (nonscf) THEN
|
||||
CALL ls_nonscf_energy(qs_env, ls_scf_env)
|
||||
ELSE
|
||||
CALL ls_scf_dm_to_ks(qs_env, ls_scf_env, energy_new, iscf)
|
||||
END IF
|
||||
|
||||
IF (ls_scf_env%do_pexsi) THEN
|
||||
CALL pexsi_to_qs(ls_scf_env, qs_env, kTS=ls_scf_env%pexsi%kTS)
|
||||
END IF
|
||||
|
||||
! report current SCF loop
|
||||
energy_diff = energy_new - energy_old
|
||||
energy_old = energy_new
|
||||
|
||||
t2 = m_walltime()
|
||||
IF (unit_nr > 0) THEN
|
||||
WRITE (unit_nr, *)
|
||||
WRITE (unit_nr, '(T2,A,I6,F20.9,F20.9,F12.6)') "SCF", iscf, energy_new, energy_diff, t2 - t1
|
||||
WRITE (unit_nr, *)
|
||||
CALL m_flush(unit_nr)
|
||||
IF (nonscf) THEN
|
||||
tdiag = t2 - t1
|
||||
CALL qs_nonscf_print_summary(qs_env, tdiag, ls_scf_env%nelectron_total, unit_nr)
|
||||
EXIT
|
||||
ELSE
|
||||
! report current SCF loop
|
||||
energy_diff = energy_new - energy_old
|
||||
energy_old = energy_new
|
||||
IF (unit_nr > 0) THEN
|
||||
WRITE (unit_nr, *)
|
||||
WRITE (unit_nr, '(T2,A,I6,F20.9,F20.9,F12.6)') "SCF", iscf, energy_new, energy_diff, t2 - t1
|
||||
WRITE (unit_nr, *)
|
||||
CALL m_flush(unit_nr)
|
||||
END IF
|
||||
END IF
|
||||
|
||||
IF (do_transport) THEN
|
||||
|
|
|
|||
|
|
@ -137,7 +137,8 @@ CONTAINS
|
|||
CALL matrix_sqrt_Newton_Schulz(ls_scf_env%matrix_s_sqrt, ls_scf_env%matrix_s_sqrt_inv, &
|
||||
ls_scf_env%matrix_s, ls_scf_env%eps_filter, &
|
||||
ls_scf_env%s_sqrt_order, &
|
||||
ls_scf_env%eps_lanczos, ls_scf_env%max_iter_lanczos)
|
||||
ls_scf_env%eps_lanczos, ls_scf_env%max_iter_lanczos, &
|
||||
iounit=-1)
|
||||
CASE DEFAULT
|
||||
CPABORT("Unknown sqrt method.")
|
||||
END SELECT
|
||||
|
|
@ -211,7 +212,8 @@ CONTAINS
|
|||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE compute_matrix_preconditioner(matrix_s, preconditioner_type, ls_mstruct, &
|
||||
matrix_bs_sqrt, matrix_bs_sqrt_inv, threshold, order, eps_lanczos, max_iter_lanczos)
|
||||
matrix_bs_sqrt, matrix_bs_sqrt_inv, threshold, order, &
|
||||
eps_lanczos, max_iter_lanczos)
|
||||
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: matrix_s
|
||||
INTEGER :: preconditioner_type
|
||||
|
|
@ -291,7 +293,8 @@ CONTAINS
|
|||
! XXXXXXXXXXX
|
||||
CALL matrix_sqrt_Newton_Schulz(matrix_bs_sqrt, matrix_bs_sqrt_inv, matrix_bs, &
|
||||
threshold=MIN(threshold, 1.0E-10_dp), order=order, &
|
||||
eps_lanczos=eps_lanczos, max_iter_lanczos=max_iter_lanczos)
|
||||
eps_lanczos=eps_lanczos, max_iter_lanczos=max_iter_lanczos, &
|
||||
iounit=-1)
|
||||
END SELECT
|
||||
|
||||
CALL dbcsr_release(matrix_bs)
|
||||
|
|
@ -526,7 +529,7 @@ CONTAINS
|
|||
|
||||
SELECT CASE (sign_method)
|
||||
CASE (ls_scf_sign_ns)
|
||||
CALL matrix_sign_Newton_Schulz(matrix_sign, matrix_ssqrtinv_ks_ssqrtinv, threshold, sign_order)
|
||||
CALL matrix_sign_Newton_Schulz(matrix_sign, matrix_ssqrtinv_ks_ssqrtinv, threshold, sign_order, iounit=-1)
|
||||
CASE (ls_scf_sign_proot)
|
||||
CALL matrix_sign_proot(matrix_sign, matrix_ssqrtinv_ks_ssqrtinv, threshold, sign_order)
|
||||
CASE (ls_scf_sign_submatrix)
|
||||
|
|
@ -547,7 +550,7 @@ CONTAINS
|
|||
! compute sign(inv(S)*H-I*mu)
|
||||
SELECT CASE (sign_method)
|
||||
CASE (ls_scf_sign_ns)
|
||||
CALL matrix_sign_Newton_Schulz(matrix_sign, matrix_sinv_ks, threshold, sign_order)
|
||||
CALL matrix_sign_Newton_Schulz(matrix_sign, matrix_sinv_ks, threshold, sign_order, iounit=-1)
|
||||
CASE (ls_scf_sign_proot)
|
||||
CALL matrix_sign_proot(matrix_sign, matrix_sinv_ks, threshold, sign_order)
|
||||
CASE (ls_scf_sign_submatrix)
|
||||
|
|
@ -574,7 +577,8 @@ CONTAINS
|
|||
0.0_dp, matrix_tmp, filter_eps=threshold)
|
||||
CALL dbcsr_add(matrix_tmp, matrix_p_ud, 1.0_dp, -1.0_dp)
|
||||
frob_matrix = dbcsr_frobenius_norm(matrix_tmp)
|
||||
IF (unit_nr > 0) WRITE (unit_nr, '(T2,A,F20.12)') "Deviation from idempotency: ", frob_matrix
|
||||
IF (unit_nr > 0 .AND. frob_matrix > 0.001_dp) &
|
||||
WRITE (unit_nr, '(T2,A,F20.12)') "Deviation from idempotency: ", frob_matrix
|
||||
|
||||
IF (sign_symmetric) THEN
|
||||
CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_s_sqrt_inv, matrix_p_ud, &
|
||||
|
|
@ -684,7 +688,8 @@ CONTAINS
|
|||
0.0_dp, matrix_tmp, filter_eps=threshold)
|
||||
CALL dbcsr_add(matrix_tmp, matrix_p_ud, 1.0_dp, -1.0_dp)
|
||||
frob_matrix = dbcsr_frobenius_norm(matrix_tmp)
|
||||
IF (unit_nr > 0) WRITE (unit_nr, '(T2,A,F20.12)') "Deviation from idempotency: ", frob_matrix
|
||||
IF (unit_nr > 0 .AND. frob_matrix > 0.001_dp) &
|
||||
WRITE (unit_nr, '(T2,A,F20.12)') "Deviation from idempotency: ", frob_matrix
|
||||
|
||||
CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_s_sqrt_inv, matrix_p_ud, &
|
||||
0.0_dp, matrix_tmp, filter_eps=threshold)
|
||||
|
|
@ -712,6 +717,7 @@ CONTAINS
|
|||
!> \param max_iter_lanczos ...
|
||||
!> \param eps_lanczos ...
|
||||
!> \param converged ...
|
||||
!> \param iounit ...
|
||||
!> \par History
|
||||
!> 2012.06 created [Florian Thoele]
|
||||
!> \author Florian Thoele
|
||||
|
|
@ -719,7 +725,7 @@ CONTAINS
|
|||
SUBROUTINE density_matrix_trs4(matrix_p, matrix_ks, matrix_s_sqrt_inv, &
|
||||
nelectron, threshold, e_homo, e_lumo, e_mu, &
|
||||
dynamic_threshold, matrix_ks_deviation, &
|
||||
max_iter_lanczos, eps_lanczos, converged)
|
||||
max_iter_lanczos, eps_lanczos, converged, iounit)
|
||||
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: matrix_p
|
||||
TYPE(dbcsr_type), INTENT(IN) :: matrix_ks, matrix_s_sqrt_inv
|
||||
|
|
@ -731,6 +737,7 @@ CONTAINS
|
|||
INTEGER, INTENT(IN) :: max_iter_lanczos
|
||||
REAL(KIND=dp), INTENT(IN) :: eps_lanczos
|
||||
LOGICAL, INTENT(OUT), OPTIONAL :: converged
|
||||
INTEGER, INTENT(IN), OPTIONAL :: iounit
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'density_matrix_trs4'
|
||||
INTEGER, PARAMETER :: max_iter = 100
|
||||
|
|
@ -756,11 +763,15 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
IF (PRESENT(iounit)) THEN
|
||||
unit_nr = iounit
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
END IF
|
||||
END IF
|
||||
|
||||
do_dyn_threshold = .FALSE.
|
||||
|
|
@ -1010,11 +1021,12 @@ CONTAINS
|
|||
!> \param non_monotonic ...
|
||||
!> \param eps_lanczos ...
|
||||
!> \param max_iter_lanczos ...
|
||||
!> \param iounit ...
|
||||
!> \author Jonathan Mullin
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE density_matrix_tc2(matrix_p, matrix_ks, matrix_s_sqrt_inv, &
|
||||
nelectron, threshold, e_homo, e_lumo, &
|
||||
non_monotonic, eps_lanczos, max_iter_lanczos)
|
||||
non_monotonic, eps_lanczos, max_iter_lanczos, iounit)
|
||||
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: matrix_p
|
||||
TYPE(dbcsr_type), INTENT(IN) :: matrix_ks, matrix_s_sqrt_inv
|
||||
|
|
@ -1024,6 +1036,7 @@ CONTAINS
|
|||
LOGICAL, INTENT(IN), OPTIONAL :: non_monotonic
|
||||
REAL(KIND=dp), INTENT(IN) :: eps_lanczos
|
||||
INTEGER, INTENT(IN) :: max_iter_lanczos
|
||||
INTEGER, INTENT(IN), OPTIONAL :: iounit
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'density_matrix_tc2'
|
||||
INTEGER, PARAMETER :: max_iter = 100
|
||||
|
|
@ -1040,11 +1053,15 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
IF (PRESENT(iounit)) THEN
|
||||
unit_nr = iounit
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
END IF
|
||||
END IF
|
||||
|
||||
do_non_monotonic = .FALSE.
|
||||
|
|
|
|||
|
|
@ -47,12 +47,15 @@ MODULE dm_ls_scf_qs
|
|||
pw_r3d_rs_type
|
||||
USE qs_atomic_block, ONLY: calculate_atomic_block_dm
|
||||
USE qs_collocate_density, ONLY: calculate_rho_elec
|
||||
USE qs_core_energies, ONLY: calculate_ptrace
|
||||
USE qs_density_mixing_types, ONLY: direct_mixing_nr,&
|
||||
gspace_mixing_nr
|
||||
USE qs_energy_types, ONLY: qs_energy_type
|
||||
USE qs_environment_types, ONLY: get_qs_env,&
|
||||
qs_environment_type
|
||||
USE qs_gspace_mixing, ONLY: gspace_mixing
|
||||
USE qs_harris_types, ONLY: harris_type
|
||||
USE qs_harris_utils, ONLY: harris_density_update
|
||||
USE qs_initial_guess, ONLY: calculate_mopac_dm
|
||||
USE qs_kind_types, ONLY: qs_kind_type
|
||||
USE qs_ks_methods, ONLY: qs_ks_update_qs_env
|
||||
|
|
@ -78,8 +81,8 @@ MODULE dm_ls_scf_qs
|
|||
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dm_ls_scf_qs'
|
||||
|
||||
PUBLIC :: matrix_ls_create, matrix_qs_to_ls, matrix_ls_to_qs, ls_scf_init_qs, &
|
||||
ls_scf_dm_to_ks, ls_scf_qs_atomic_guess, write_matrix_to_cube, rho_mixing_ls_init, &
|
||||
matrix_decluster
|
||||
ls_nonscf_ks, ls_nonscf_energy, ls_scf_dm_to_ks, ls_scf_qs_atomic_guess, &
|
||||
write_matrix_to_cube, rho_mixing_ls_init, matrix_decluster
|
||||
|
||||
CONTAINS
|
||||
|
||||
|
|
@ -448,20 +451,24 @@ CONTAINS
|
|||
! **************************************************************************************************
|
||||
!> \brief get an atomic initial guess
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
!> \param energy ...
|
||||
!> \param nonscf ...
|
||||
!> \par History
|
||||
!> 2012.11 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_scf_qs_atomic_guess(qs_env, energy)
|
||||
SUBROUTINE ls_scf_qs_atomic_guess(qs_env, ls_scf_env, energy, nonscf)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
REAL(KIND=dp) :: energy
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: nonscf
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_scf_qs_atomic_guess'
|
||||
|
||||
INTEGER :: handle, nspin, unit_nr
|
||||
INTEGER, DIMENSION(2) :: nelectron_spin
|
||||
LOGICAL :: has_unit_metric
|
||||
LOGICAL :: do_scf, has_unit_metric
|
||||
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
|
||||
TYPE(cp_logger_type), POINTER :: logger
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
|
||||
|
|
@ -513,11 +520,16 @@ CONTAINS
|
|||
nspin, nelectron_spin, unit_nr, para_env)
|
||||
END IF
|
||||
|
||||
CALL qs_rho_update_rho(rho, qs_env=qs_env)
|
||||
CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.TRUE.)
|
||||
CALL qs_ks_update_qs_env(qs_env, calculate_forces=.FALSE., just_energy=.FALSE.)
|
||||
|
||||
energy = qs_energy%total
|
||||
do_scf = .TRUE.
|
||||
IF (PRESENT(nonscf)) do_scf = .NOT. nonscf
|
||||
IF (do_scf) THEN
|
||||
CALL qs_rho_update_rho(rho, qs_env=qs_env)
|
||||
CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.TRUE.)
|
||||
CALL qs_ks_update_qs_env(qs_env, calculate_forces=.FALSE., just_energy=.FALSE.)
|
||||
energy = qs_energy%total
|
||||
ELSE
|
||||
CALL ls_nonscf_ks(qs_env, ls_scf_env, energy)
|
||||
END IF
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
|
|
@ -604,6 +616,105 @@ CONTAINS
|
|||
|
||||
END SUBROUTINE ls_scf_dm_to_ks
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief use the external density in ls_scf_env to compute the new KS matrix
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
!> \param energy_new ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_nonscf_ks(qs_env, ls_scf_env, energy_new)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
REAL(KIND=dp) :: energy_new
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_nonscf_ks'
|
||||
|
||||
INTEGER :: handle, ispin, nspin
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
|
||||
TYPE(harris_type), POINTER :: harris_env
|
||||
TYPE(mp_para_env_type), POINTER :: para_env
|
||||
TYPE(qs_energy_type), POINTER :: energy
|
||||
TYPE(qs_rho_type), POINTER :: rho
|
||||
|
||||
NULLIFY (energy, rho, rho_ao)
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
nspin = ls_scf_env%nspins
|
||||
CALL get_qs_env(qs_env, para_env=para_env, energy=energy, rho=rho)
|
||||
CALL qs_rho_get(rho, rho_ao=rho_ao)
|
||||
|
||||
! set the new density matrix
|
||||
DO ispin = 1, nspin
|
||||
CALL matrix_ls_to_qs(rho_ao(ispin)%matrix, ls_scf_env%matrix_p(ispin), &
|
||||
ls_scf_env%ls_mstruct, covariant=.FALSE.)
|
||||
END DO
|
||||
|
||||
IF (qs_env%harris_method) THEN
|
||||
CALL get_qs_env(qs_env, harris_env=harris_env)
|
||||
CALL harris_density_update(qs_env, harris_env)
|
||||
END IF
|
||||
! compute the corresponding KS matrix and new energy
|
||||
CALL qs_rho_update_rho(rho, qs_env=qs_env)
|
||||
IF (ls_scf_env%do_rho_mixing) THEN
|
||||
CPABORT("P mixing not implemented in linear scaling NONSCF. ")
|
||||
END IF
|
||||
|
||||
CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.TRUE.)
|
||||
CALL qs_ks_update_qs_env(qs_env, calculate_forces=.FALSE., &
|
||||
just_energy=.FALSE., print_active=.TRUE.)
|
||||
energy_new = energy%total
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
END SUBROUTINE ls_nonscf_ks
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief use the new density matrix in ls_scf_env to compute the new energy
|
||||
!> \param qs_env ...
|
||||
!> \param ls_scf_env ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE ls_nonscf_energy(qs_env, ls_scf_env)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
TYPE(ls_scf_env_type) :: ls_scf_env
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'ls_nonscf_energy'
|
||||
|
||||
INTEGER :: handle, ispin, nspin
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h, matrix_ks, rho_ao
|
||||
TYPE(mp_para_env_type), POINTER :: para_env
|
||||
TYPE(qs_energy_type), POINTER :: energy
|
||||
TYPE(qs_rho_type), POINTER :: rho
|
||||
|
||||
NULLIFY (energy, rho, rho_ao)
|
||||
CALL timeset(routineN, handle)
|
||||
IF (qs_env%qmmm) THEN
|
||||
CPABORT("NYA")
|
||||
END IF
|
||||
|
||||
nspin = ls_scf_env%nspins
|
||||
CALL get_qs_env(qs_env, para_env=para_env, energy=energy, rho=rho)
|
||||
CALL qs_rho_get(rho, rho_ao=rho_ao)
|
||||
|
||||
! set the new density matrix
|
||||
DO ispin = 1, nspin
|
||||
CALL matrix_ls_to_qs(rho_ao(ispin)%matrix, ls_scf_env%matrix_p(ispin), &
|
||||
ls_scf_env%ls_mstruct, covariant=.FALSE.)
|
||||
END DO
|
||||
|
||||
CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.TRUE.)
|
||||
|
||||
! band energy : Tr(PH)
|
||||
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
|
||||
CALL calculate_ptrace(matrix_ks, rho_ao, energy%band, nspin)
|
||||
! core energy : Tr(Ph)
|
||||
energy%total = energy%total - energy%core
|
||||
CALL get_qs_env(qs_env, matrix_h=matrix_h)
|
||||
CALL calculate_ptrace(matrix_h, rho_ao, energy%core, nspin)
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
END SUBROUTINE ls_nonscf_energy
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief ...
|
||||
!> \param qs_env ...
|
||||
|
|
|
|||
|
|
@ -672,16 +672,17 @@ CONTAINS
|
|||
!> \param matrix ...
|
||||
!> \param threshold ...
|
||||
!> \param sign_order ...
|
||||
!> \param iounit ...
|
||||
!> \par History
|
||||
!> 2010.10 created [Joost VandeVondele]
|
||||
!> 2019.05 extended to order byxond 2 [Robert Schade]
|
||||
!> \author Joost VandeVondele, Robert Schade
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE matrix_sign_Newton_Schulz(matrix_sign, matrix, threshold, sign_order)
|
||||
SUBROUTINE matrix_sign_Newton_Schulz(matrix_sign, matrix, threshold, sign_order, iounit)
|
||||
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: matrix_sign, matrix
|
||||
REAL(KIND=dp), INTENT(IN) :: threshold
|
||||
INTEGER, INTENT(IN), OPTIONAL :: sign_order
|
||||
INTEGER, INTENT(IN), OPTIONAL :: sign_order, iounit
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'matrix_sign_Newton_Schulz'
|
||||
|
||||
|
|
@ -696,11 +697,15 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
IF (PRESENT(iounit)) THEN
|
||||
unit_nr = iounit
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
END IF
|
||||
END IF
|
||||
|
||||
IF (PRESENT(sign_order)) THEN
|
||||
|
|
@ -1059,8 +1064,6 @@ CONTAINS
|
|||
symmetrize = .FALSE.
|
||||
CALL matrix_sqrt_proot(matrix_sqrt, matrix_sqrt_inv, matrix2, threshold, order, &
|
||||
0.01_dp, 100, symmetrize, converged)
|
||||
! call matrix_sqrt_Newton_Schulz(matrix_sqrt, matrix_sqrt_inv, matrix2, threshold, order, &
|
||||
! 0.01_dp,100, symmetrize,converged)
|
||||
|
||||
CALL dbcsr_multiply("N", "N", 1.0_dp, matrix, matrix_sqrt_inv, 0.0_dp, matrix_sign, &
|
||||
filter_eps=threshold, flop=flop1)
|
||||
|
|
@ -1615,18 +1618,20 @@ CONTAINS
|
|||
!> \param max_iter_lanczos ...
|
||||
!> \param symmetrize ...
|
||||
!> \param converged ...
|
||||
!> \param iounit ...
|
||||
!> \par History
|
||||
!> 2010.10 created [Joost VandeVondele]
|
||||
!> \author Joost VandeVondele
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE matrix_sqrt_Newton_Schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, &
|
||||
eps_lanczos, max_iter_lanczos, symmetrize, converged)
|
||||
eps_lanczos, max_iter_lanczos, symmetrize, converged, iounit)
|
||||
TYPE(dbcsr_type), INTENT(INOUT) :: matrix_sqrt, matrix_sqrt_inv, matrix
|
||||
REAL(KIND=dp), INTENT(IN) :: threshold
|
||||
INTEGER, INTENT(IN) :: order
|
||||
REAL(KIND=dp), INTENT(IN) :: eps_lanczos
|
||||
INTEGER, INTENT(IN) :: max_iter_lanczos
|
||||
LOGICAL, OPTIONAL :: symmetrize, converged
|
||||
INTEGER, INTENT(IN), OPTIONAL :: iounit
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'matrix_sqrt_Newton_Schulz'
|
||||
|
||||
|
|
@ -1642,11 +1647,15 @@ CONTAINS
|
|||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
IF (PRESENT(iounit)) THEN
|
||||
unit_nr = iounit
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
logger => cp_get_default_logger()
|
||||
IF (logger%para_env%is_source()) THEN
|
||||
unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
|
||||
ELSE
|
||||
unit_nr = -1
|
||||
END IF
|
||||
END IF
|
||||
|
||||
IF (PRESENT(converged)) converged = .FALSE.
|
||||
|
|
|
|||
|
|
@ -878,7 +878,7 @@ CONTAINS
|
|||
pao%need_initial_scf = .FALSE.
|
||||
pao%preopt_dm_file = "" ! load only for first MD step
|
||||
ELSE
|
||||
CALL ls_scf_qs_atomic_guess(qs_env, ls_scf_env%energy_init)
|
||||
CALL ls_scf_qs_atomic_guess(qs_env, ls_scf_env, ls_scf_env%energy_init)
|
||||
IF (pao%iw > 0) WRITE (pao%iw, '(A,F20.9)') &
|
||||
" PAO| Energy from initial atomic guess:", ls_scf_env%energy_init
|
||||
pao%need_initial_scf = .TRUE.
|
||||
|
|
|
|||
|
|
@ -282,6 +282,7 @@ CONTAINS
|
|||
END IF
|
||||
DEALLOCATE (density, coef)
|
||||
END DO
|
||||
harris_env%rhoin%frozen = .TRUE.
|
||||
END IF
|
||||
CASE DEFAULT
|
||||
CPABORT("Illeagal value of harris_env%density_source")
|
||||
|
|
|
|||
133
src/qs_nonscf.F
133
src/qs_nonscf.F
|
|
@ -19,14 +19,13 @@ MODULE qs_nonscf
|
|||
USE cp_log_handling, ONLY: cp_get_default_logger,&
|
||||
cp_logger_get_default_io_unit,&
|
||||
cp_logger_type
|
||||
USE dm_ls_scf, ONLY: ls_scf
|
||||
USE input_section_types, ONLY: section_vals_get_subs_vals,&
|
||||
section_vals_type
|
||||
USE kinds, ONLY: dp
|
||||
USE kpoint_types, ONLY: kpoint_type
|
||||
USE machine, ONLY: m_flush,&
|
||||
m_walltime
|
||||
USE machine, ONLY: m_walltime
|
||||
USE message_passing, ONLY: mp_para_env_type
|
||||
USE qs_charges_types, ONLY: qs_charges_type
|
||||
USE qs_core_energies, ONLY: calculate_ptrace
|
||||
USE qs_energy_types, ONLY: qs_energy_type
|
||||
USE qs_environment_types, ONLY: get_qs_env,&
|
||||
|
|
@ -36,6 +35,7 @@ MODULE qs_nonscf
|
|||
USE qs_ks_types, ONLY: qs_ks_did_change,&
|
||||
qs_ks_env_type
|
||||
USE qs_mo_types, ONLY: mo_set_type
|
||||
USE qs_nonscf_utils, ONLY: qs_nonscf_print_summary
|
||||
USE qs_rho_types, ONLY: qs_rho_get,&
|
||||
qs_rho_type
|
||||
USE qs_scf, ONLY: init_scf_loop
|
||||
|
|
@ -75,18 +75,17 @@ CONTAINS
|
|||
TYPE(qs_scf_env_type), POINTER :: scf_env
|
||||
TYPE(scf_control_type), POINTER :: scf_control
|
||||
|
||||
CALL get_qs_env(qs_env, scf_env=scf_env, scf_control=scf_control, &
|
||||
dft_control=dft_control)
|
||||
CALL get_qs_env(qs_env, dft_control=dft_control)
|
||||
|
||||
IF (dft_control%qs_control%do_ls_scf) THEN
|
||||
! Density matrix based solver
|
||||
|
||||
CPABORT("NOT AVAILABLE")
|
||||
!CALL ls_scf(qs_env=qs_env)
|
||||
CALL ls_scf(qs_env, nonscf=.TRUE.)
|
||||
|
||||
ELSE
|
||||
! Wavefunction based solver
|
||||
|
||||
CALL get_qs_env(qs_env, scf_env=scf_env, scf_control=scf_control)
|
||||
IF (.NOT. ASSOCIATED(scf_env)) THEN
|
||||
CALL qs_scf_env_initialize(qs_env, scf_env)
|
||||
CALL set_qs_env(qs_env, scf_env=scf_env)
|
||||
|
|
@ -219,128 +218,10 @@ CONTAINS
|
|||
t2 = m_walltime()
|
||||
tdiag = t2 - t1
|
||||
|
||||
CALL qs_nonscf_print_summary(qs_env, tdiag, iounit)
|
||||
CALL qs_nonscf_print_summary(qs_env, tdiag, scf_env%nelectron, iounit)
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
END SUBROUTINE do_nonscf
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief writes a summary of information after diagonalization
|
||||
!> \param qs_env ...
|
||||
!> \param tdiag ...
|
||||
!> \param iounit ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE qs_nonscf_print_summary(qs_env, tdiag, iounit)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
REAL(KIND=dp), INTENT(IN) :: tdiag
|
||||
INTEGER, INTENT(IN) :: iounit
|
||||
|
||||
INTEGER :: nelectron_total
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r
|
||||
TYPE(dft_control_type), POINTER :: dft_control
|
||||
TYPE(qs_charges_type), POINTER :: qs_charges
|
||||
TYPE(qs_energy_type), POINTER :: energy
|
||||
TYPE(qs_rho_type), POINTER :: rho
|
||||
TYPE(qs_scf_env_type), POINTER :: scf_env
|
||||
|
||||
IF (iounit > 0) THEN
|
||||
CALL get_qs_env(qs_env=qs_env, energy=energy, dft_control=dft_control)
|
||||
IF (qs_env%harris_method) THEN
|
||||
CPASSERT(.NOT. dft_control%qs_control%gapw)
|
||||
CPASSERT(.NOT. dft_control%qs_control%gapw_xc)
|
||||
|
||||
CALL get_qs_env(qs_env=qs_env, rho=rho, scf_env=scf_env, qs_charges=qs_charges)
|
||||
nelectron_total = scf_env%nelectron
|
||||
CALL qs_rho_get(rho, tot_rho_r=tot_rho_r)
|
||||
WRITE (UNIT=iounit, FMT="(/,(T3,A,T41,2F20.10))") &
|
||||
"Electronic density on regular grids: ", &
|
||||
SUM(tot_rho_r), &
|
||||
SUM(tot_rho_r) + nelectron_total, &
|
||||
"Core density on regular grids:", &
|
||||
qs_charges%total_rho_core_rspace, &
|
||||
qs_charges%total_rho_core_rspace - REAL(nelectron_total + dft_control%charge, dp)
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T41,F20.10)") &
|
||||
"Total charge density on r-space grids: ", &
|
||||
SUM(tot_rho_r) + &
|
||||
qs_charges%total_rho_core_rspace, &
|
||||
"Total charge density g-space grids: ", &
|
||||
qs_charges%total_rho_gspace
|
||||
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%band
|
||||
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Overlap energy of the core charge distribution:", energy%core_overlap, &
|
||||
"Self energy of the core charge distribution: ", energy%core_self, &
|
||||
"Hartree energy: ", energy%hartree, &
|
||||
"Exchange-correlation energy: ", energy%exc
|
||||
IF (energy%dispersion /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (energy%gcp /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"gCP energy: ", energy%gcp
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
|
||||
ELSEIF (dft_control%qs_control%semi_empirical) THEN
|
||||
CPABORT("NONSCF not available")
|
||||
ELSEIF (dft_control%qs_control%dftb) THEN
|
||||
CPASSERT(energy%dftb3 == 0.0_dp)
|
||||
energy%total = energy%total + energy%band + energy%qmmm_el
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%total
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Repulsive potential energy: ", energy%repulsive, &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
ELSEIF (dft_control%qs_control%xtb) THEN
|
||||
energy%total = energy%total + energy%band + energy%qmmm_el
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%total
|
||||
CPASSERT(dft_control%qs_control%xtb_control%gfn_type == 0)
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Repulsive potential energy: ", energy%repulsive, &
|
||||
"SRB Correction energy: ", energy%srb, &
|
||||
"Charge equilibration energy: ", energy%eeq, &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Correction for nonbonded interactions: ", energy%xtb_nonbonded
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
ELSE
|
||||
CPABORT("NONSCF not available")
|
||||
END IF
|
||||
IF (dft_control%smear) THEN
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Electronic entropic energy:", energy%kTS
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Fermi energy:", energy%efermi
|
||||
END IF
|
||||
IF (energy%qmmm_el /= 0.0_dp) THEN
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"QM/MM Electrostatic energy: ", energy%qmmm_el
|
||||
IF (qs_env%qmmm_env_qm%image_charge) THEN
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"QM/MM image charge energy: ", energy%image_charge
|
||||
END IF
|
||||
END IF
|
||||
|
||||
WRITE (UNIT=iounit, FMT="(/,(T3,A,T56,F25.14))") &
|
||||
"Total energy: ", energy%total
|
||||
|
||||
CALL m_flush(iounit)
|
||||
END IF
|
||||
|
||||
END SUBROUTINE qs_nonscf_print_summary
|
||||
|
||||
END MODULE qs_nonscf
|
||||
|
|
|
|||
152
src/qs_nonscf_utils.F
Normal file
152
src/qs_nonscf_utils.F
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
!--------------------------------------------------------------------------------------------------!
|
||||
! 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 Routines for Quickstep NON-SCF run.
|
||||
!> \par History
|
||||
!> - initial setup [JGH, 2024]
|
||||
!> \author JGH (13.05.2024)
|
||||
! **************************************************************************************************
|
||||
MODULE qs_nonscf_utils
|
||||
USE cp_control_types, ONLY: dft_control_type
|
||||
USE kinds, ONLY: dp
|
||||
USE machine, ONLY: m_flush
|
||||
USE qs_charges_types, ONLY: qs_charges_type
|
||||
USE qs_energy_types, ONLY: qs_energy_type
|
||||
USE qs_environment_types, ONLY: get_qs_env,&
|
||||
qs_environment_type
|
||||
USE qs_rho_types, ONLY: qs_rho_get,&
|
||||
qs_rho_type
|
||||
#include "./base/base_uses.f90"
|
||||
|
||||
IMPLICIT NONE
|
||||
|
||||
PRIVATE
|
||||
|
||||
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_nonscf_utils'
|
||||
|
||||
PUBLIC :: qs_nonscf_print_summary
|
||||
|
||||
CONTAINS
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief writes a summary of information after diagonalization
|
||||
!> \param qs_env ...
|
||||
!> \param tdiag ...
|
||||
!> \param nelectron_total ...
|
||||
!> \param iounit ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE qs_nonscf_print_summary(qs_env, tdiag, nelectron_total, iounit)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
REAL(KIND=dp), INTENT(IN) :: tdiag
|
||||
INTEGER, INTENT(IN) :: nelectron_total, iounit
|
||||
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r
|
||||
TYPE(dft_control_type), POINTER :: dft_control
|
||||
TYPE(qs_charges_type), POINTER :: qs_charges
|
||||
TYPE(qs_energy_type), POINTER :: energy
|
||||
TYPE(qs_rho_type), POINTER :: rho
|
||||
|
||||
IF (iounit > 0) THEN
|
||||
CALL get_qs_env(qs_env=qs_env, energy=energy, dft_control=dft_control)
|
||||
IF (qs_env%harris_method) THEN
|
||||
CPASSERT(.NOT. dft_control%qs_control%gapw)
|
||||
CPASSERT(.NOT. dft_control%qs_control%gapw_xc)
|
||||
|
||||
CALL get_qs_env(qs_env=qs_env, rho=rho, qs_charges=qs_charges)
|
||||
CALL qs_rho_get(rho, tot_rho_r=tot_rho_r)
|
||||
WRITE (UNIT=iounit, FMT="(/,(T3,A,T41,2F20.10))") &
|
||||
"Electronic density on regular grids: ", &
|
||||
SUM(tot_rho_r), &
|
||||
SUM(tot_rho_r) + nelectron_total, &
|
||||
"Core density on regular grids:", &
|
||||
qs_charges%total_rho_core_rspace, &
|
||||
qs_charges%total_rho_core_rspace - REAL(nelectron_total + dft_control%charge, dp)
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T41,F20.10)") &
|
||||
"Total charge density on r-space grids: ", &
|
||||
SUM(tot_rho_r) + &
|
||||
qs_charges%total_rho_core_rspace, &
|
||||
"Total charge density g-space grids: ", &
|
||||
qs_charges%total_rho_gspace
|
||||
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%band
|
||||
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Overlap energy of the core charge distribution:", energy%core_overlap, &
|
||||
"Self energy of the core charge distribution: ", energy%core_self, &
|
||||
"Hartree energy: ", energy%hartree, &
|
||||
"Exchange-correlation energy: ", energy%exc
|
||||
IF (energy%dispersion /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (energy%gcp /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"gCP energy: ", energy%gcp
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
|
||||
ELSEIF (dft_control%qs_control%semi_empirical) THEN
|
||||
CPABORT("NONSCF not available")
|
||||
ELSEIF (dft_control%qs_control%dftb) THEN
|
||||
CPASSERT(energy%dftb3 == 0.0_dp)
|
||||
energy%total = energy%total + energy%band + energy%qmmm_el
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%total
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Repulsive potential energy: ", energy%repulsive, &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
ELSEIF (dft_control%qs_control%xtb) THEN
|
||||
energy%total = energy%total + energy%band + energy%qmmm_el
|
||||
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
|
||||
"Diagonalization", "Time:", tdiag, energy%total
|
||||
CPASSERT(dft_control%qs_control%xtb_control%gfn_type == 0)
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Core Hamiltonian energy: ", energy%core, &
|
||||
"Repulsive potential energy: ", energy%repulsive, &
|
||||
"SRB Correction energy: ", energy%srb, &
|
||||
"Charge equilibration energy: ", energy%eeq, &
|
||||
"Dispersion energy: ", energy%dispersion
|
||||
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Correction for nonbonded interactions: ", energy%xtb_nonbonded
|
||||
IF (energy%efield /= 0.0_dp) &
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"Electric field interaction energy: ", energy%efield
|
||||
ELSE
|
||||
CPABORT("NONSCF not available")
|
||||
END IF
|
||||
IF (dft_control%smear) THEN
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Electronic entropic energy:", energy%kTS
|
||||
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
|
||||
"Fermi energy:", energy%efermi
|
||||
END IF
|
||||
IF (energy%qmmm_el /= 0.0_dp) THEN
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"QM/MM Electrostatic energy: ", energy%qmmm_el
|
||||
IF (qs_env%qmmm_env_qm%image_charge) THEN
|
||||
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
|
||||
"QM/MM image charge energy: ", energy%image_charge
|
||||
END IF
|
||||
END IF
|
||||
|
||||
WRITE (UNIT=iounit, FMT="(/,(T3,A,T56,F25.14))") &
|
||||
"Total energy: ", energy%total
|
||||
|
||||
CALL m_flush(iounit)
|
||||
END IF
|
||||
|
||||
END SUBROUTINE qs_nonscf_print_summary
|
||||
|
||||
END MODULE qs_nonscf_utils
|
||||
|
|
@ -3,4 +3,5 @@
|
|||
# see regtest/TEST_FILES
|
||||
2H2O_t01.inp 11 1e-010 -34.570515851298339
|
||||
ft1.inp 0
|
||||
fl1.inp 0
|
||||
#EOF
|
||||
|
|
|
|||
79
tests/QS/regtest-harris/fl1.inp
Normal file
79
tests/QS/regtest-harris/fl1.inp
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT cc02
|
||||
RUN_TYPE DEBUG
|
||||
&END GLOBAL
|
||||
|
||||
&DEBUG
|
||||
CHECK_ATOM_FORCE 1 xyz
|
||||
DE 0.001
|
||||
DEBUG_DIPOLE .FALSE.
|
||||
DEBUG_FORCES .TRUE.
|
||||
DEBUG_POLARIZABILITY .FALSE.
|
||||
DEBUG_STRESS_TENSOR .FALSE.
|
||||
EPS_NO_ERROR_CHECK 1.E-4
|
||||
MAX_RELATIVE_ERROR 0.05
|
||||
STOP_ON_MISMATCH T
|
||||
&END DEBUG
|
||||
|
||||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
|
||||
POTENTIAL_FILE_NAME POTENTIAL_UZH
|
||||
&HARRIS_METHOD ON
|
||||
&END HARRIS_METHOD
|
||||
&LS_SCF
|
||||
EPS_FILTER 1.0E-7
|
||||
MATRIX_CLUSTER_TYPE ATOMIC
|
||||
MU -0.20
|
||||
NON_MONOTONIC T
|
||||
PURIFICATION_METHOD TC2
|
||||
REPORT_ALL_SPARSITIES OFF
|
||||
S_PRECONDITIONER MOLECULAR
|
||||
&END LS_SCF
|
||||
&MGRID
|
||||
CUTOFF 300
|
||||
REL_CUTOFF 60
|
||||
&END MGRID
|
||||
&QS
|
||||
EPS_DEFAULT 1.E-14
|
||||
LS_SCF
|
||||
&END QS
|
||||
&XC
|
||||
&VDW_POTENTIAL
|
||||
DISPERSION_FUNCTIONAL PAIR_POTENTIAL
|
||||
&PAIR_POTENTIAL
|
||||
PARAMETER_FILE_NAME dftd3.dat
|
||||
REFERENCE_FUNCTIONAL PBE
|
||||
TYPE DFTD3(BJ)
|
||||
&END PAIR_POTENTIAL
|
||||
&END VDW_POTENTIAL
|
||||
&XC_FUNCTIONAL PBE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&END DFT
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC 6.0 6.0 6.0
|
||||
&END CELL
|
||||
&COORD
|
||||
O 0.094933 -0.000368 0.895642
|
||||
C -0.031077 -0.000121 -0.307326
|
||||
H -0.090437 0.947608 -0.895642
|
||||
H -0.094933 -0.947608 -0.895562
|
||||
&END COORD
|
||||
&KIND H
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q1
|
||||
POTENTIAL GTH-GGA-q1
|
||||
&END KIND
|
||||
&KIND C
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q4
|
||||
POTENTIAL GTH-GGA-q4
|
||||
&END KIND
|
||||
&KIND O
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q6
|
||||
POTENTIAL GTH-GGA-q6
|
||||
&END KIND
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -19,4 +19,6 @@ SiC-stress.inp 0
|
|||
ch2o_eeq.inp 1 1.0E-11 -7.84498782090161
|
||||
ch2o_eloc.inp 0
|
||||
ch2o_eper.inp 0
|
||||
ch2o_ls1.inp 1 1.0E-12 -6.46515972056537
|
||||
ch2o_ls2.inp 0
|
||||
#EOF
|
||||
|
|
|
|||
38
tests/xTB/regtest-gfn0/ch2o_ls1.inp
Normal file
38
tests/xTB/regtest-gfn0/ch2o_ls1.inp
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT CH2O
|
||||
RUN_TYPE ENERGY
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
&DFT
|
||||
&LS_SCF
|
||||
EPS_FILTER 1.0E-7
|
||||
MATRIX_CLUSTER_TYPE ATOMIC
|
||||
MU -0.20
|
||||
NON_MONOTONIC T
|
||||
PURIFICATION_METHOD TC2
|
||||
REPORT_ALL_SPARSITIES OFF
|
||||
S_PRECONDITIONER MOLECULAR
|
||||
&END LS_SCF
|
||||
&QS
|
||||
LS_SCF
|
||||
METHOD xTB
|
||||
&XTB
|
||||
GFN_TYPE 0
|
||||
&END XTB
|
||||
&END QS
|
||||
&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
|
||||
47
tests/xTB/regtest-gfn0/ch2o_ls2.inp
Normal file
47
tests/xTB/regtest-gfn0/ch2o_ls2.inp
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT CH2O
|
||||
RUN_TYPE DEBUG
|
||||
&END GLOBAL
|
||||
|
||||
&DEBUG
|
||||
DEBUG_FORCES T
|
||||
DEBUG_STRESS_TENSOR F
|
||||
DX 0.0001
|
||||
EPS_NO_ERROR_CHECK 0.000001
|
||||
STOP_ON_MISMATCH T
|
||||
&END DEBUG
|
||||
|
||||
&FORCE_EVAL
|
||||
&DFT
|
||||
&LS_SCF
|
||||
EPS_FILTER 1.0E-7
|
||||
MATRIX_CLUSTER_TYPE ATOMIC
|
||||
MU -0.20
|
||||
NON_MONOTONIC T
|
||||
PURIFICATION_METHOD TC2
|
||||
REPORT_ALL_SPARSITIES OFF
|
||||
S_PRECONDITIONER MOLECULAR
|
||||
&END LS_SCF
|
||||
&QS
|
||||
LS_SCF
|
||||
METHOD xTB
|
||||
&XTB
|
||||
GFN_TYPE 0
|
||||
VDW_POTENTIAL DFTD3
|
||||
&END XTB
|
||||
&END QS
|
||||
&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
|
||||
Loading…
Add table
Add a link
Reference in a new issue