Skip to content

Commit

Permalink
LS: reuse matrix_s_sqrt_inv when using sign_symmetric
Browse files Browse the repository at this point in the history
  • Loading branch information
michaellass authored and oschuett committed Mar 12, 2020
1 parent 46d7e16 commit e5e83c5
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 19 deletions.
5 changes: 3 additions & 2 deletions src/dm_ls_scf.F
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,8 @@ SUBROUTINE ls_scf_main(qs_env, ls_scf_env)
CALL density_matrix_sign(ls_scf_env%matrix_p(ispin), ls_scf_env%mu_spin(ispin), ls_scf_env%fixed_mu, &
ls_scf_env%sign_method, ls_scf_env%sign_order, matrix_mixing_old(ispin), &
ls_scf_env%matrix_s, ls_scf_env%matrix_s_inv, nelectron_spin_real, &
ls_scf_env%eps_filter, ls_scf_env%sign_symmetric, ls_scf_env%submatrix_sign_method)
ls_scf_env%eps_filter, ls_scf_env%sign_symmetric, ls_scf_env%submatrix_sign_method, &
ls_scf_env%matrix_s_sqrt_inv)
CASE (ls_scf_tc2)
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), &
Expand Down Expand Up @@ -981,7 +982,7 @@ SUBROUTINE post_scf_mu_scan(ls_scf_env)
ls_scf_env%sign_order, ls_scf_env%matrix_ks(ispin), &
ls_scf_env%matrix_s, ls_scf_env%matrix_s_inv, &
ls_scf_env%eps_filter, ls_scf_env%sign_symmetric, &
ls_scf_env%submatrix_sign_method)
ls_scf_env%submatrix_sign_method, ls_scf_env%matrix_s_sqrt_inv)
ENDDO

t2 = m_walltime()
Expand Down
3 changes: 3 additions & 0 deletions src/dm_ls_scf_create.F
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,9 @@ SUBROUTINE ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
.AND. .NOT. ls_scf_env%sign_symmetric) &
CPABORT("DIRECT submatrix sign method requires SIGN_SYMMETRIC being set.")

! sign_symmetric requires computation of s_sqrt
IF (ls_scf_env%sign_symmetric) ls_scf_env%use_s_sqrt = .TRUE.

! an undocumented feature ... allows for just doing the initial guess, no expensive stuff
IF (ls_scf_env%max_scf < 0) THEN
ls_scf_env%needs_s_inv = .FALSE.
Expand Down
30 changes: 15 additions & 15 deletions src/dm_ls_scf_methods.F
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,14 @@ END SUBROUTINE apply_matrix_preconditioner
!> \param threshold ...
!> \param sign_symmetric ...
!> \param submatrix_sign_method ...
!> \param matrix_s_sqrt_inv ...
!> \par History
!> 2010.10 created [Joost VandeVondele]
!> \author Joost VandeVondele
! **************************************************************************************************
SUBROUTINE density_matrix_sign(matrix_p, mu, fixed_mu, sign_method, sign_order, matrix_ks, &
matrix_s, matrix_s_inv, nelectron, threshold, sign_symmetric, submatrix_sign_method)
matrix_s, matrix_s_inv, nelectron, threshold, sign_symmetric, submatrix_sign_method, &
matrix_s_sqrt_inv)

TYPE(dbcsr_type), INTENT(INOUT) :: matrix_p
REAL(KIND=dp), INTENT(INOUT) :: mu
Expand All @@ -387,6 +389,7 @@ SUBROUTINE density_matrix_sign(matrix_p, mu, fixed_mu, sign_method, sign_order,
REAL(KIND=dp), INTENT(IN) :: threshold
LOGICAL, OPTIONAL :: sign_symmetric
INTEGER, OPTIONAL :: submatrix_sign_method
TYPE(dbcsr_type), INTENT(IN), OPTIONAL :: matrix_s_sqrt_inv

CHARACTER(LEN=*), PARAMETER :: routineN = 'density_matrix_sign', &
routineP = moduleN//':'//routineN
Expand Down Expand Up @@ -428,7 +431,8 @@ SUBROUTINE density_matrix_sign(matrix_p, mu, fixed_mu, sign_method, sign_order,

CALL density_matrix_sign_fixed_mu(matrix_p, trace, mu, sign_method, sign_order, &
matrix_ks, matrix_s, matrix_s_inv, threshold, &
do_sign_symmetric, used_submatrix_sign_method)
do_sign_symmetric, used_submatrix_sign_method, &
matrix_s_sqrt_inv)
IF (unit_nr > 0) WRITE (unit_nr, '(T2,A,I2,1X,F13.9,1X,F15.9)') &
"Density matrix: iter, mu, trace error: ", iter, mu, trace - nelectron

Expand Down Expand Up @@ -466,12 +470,14 @@ END SUBROUTINE density_matrix_sign
!> \param threshold ...
!> \param sign_symmetric ...
!> \param submatrix_sign_method ...
!> \param matrix_s_sqrt_inv ...
!> \par History
!> 2010.10 created [Joost VandeVondele]
!> \author Joost VandeVondele
! **************************************************************************************************
SUBROUTINE density_matrix_sign_fixed_mu(matrix_p, trace, mu, sign_method, sign_order, matrix_ks, &
matrix_s, matrix_s_inv, threshold, sign_symmetric, submatrix_sign_method)
matrix_s, matrix_s_inv, threshold, sign_symmetric, submatrix_sign_method, &
matrix_s_sqrt_inv)

TYPE(dbcsr_type), INTENT(INOUT) :: matrix_p
REAL(KIND=dp), INTENT(OUT) :: trace
Expand All @@ -481,16 +487,16 @@ SUBROUTINE density_matrix_sign_fixed_mu(matrix_p, trace, mu, sign_method, sign_o
REAL(KIND=dp), INTENT(IN) :: threshold
LOGICAL :: sign_symmetric
INTEGER :: submatrix_sign_method
TYPE(dbcsr_type), INTENT(IN), OPTIONAL :: matrix_s_sqrt_inv

CHARACTER(LEN=*), PARAMETER :: routineN = 'density_matrix_sign_fixed_mu', &
routineP = moduleN//':'//routineN

INTEGER :: handle, unit_nr
LOGICAL :: converged
REAL(KIND=dp) :: frob_matrix
TYPE(cp_logger_type), POINTER :: logger
TYPE(dbcsr_type) :: matrix_p_ud, matrix_s_sqrt, matrix_s_sqrt_inv, matrix_sign, &
matrix_sinv_ks, matrix_ssqrtinv_ks_ssqrtinv, matrix_ssqrtinv_ks_ssqrtinv2, matrix_tmp
TYPE(dbcsr_type) :: matrix_p_ud, matrix_sign, matrix_sinv_ks, matrix_ssqrtinv_ks_ssqrtinv, &
matrix_ssqrtinv_ks_ssqrtinv2, matrix_tmp

CALL timeset(routineN, handle)

Expand All @@ -504,14 +510,9 @@ SUBROUTINE density_matrix_sign_fixed_mu(matrix_p, trace, mu, sign_method, sign_o
CALL dbcsr_create(matrix_sign, template=matrix_s, matrix_type=dbcsr_type_no_symmetry)

IF (sign_symmetric) THEN
CALL dbcsr_create(matrix_s_sqrt, template=matrix_s, matrix_type=dbcsr_type_no_symmetry)
CALL dbcsr_create(matrix_s_sqrt_inv, template=matrix_s, matrix_type=dbcsr_type_no_symmetry)
CALL matrix_sqrt_Newton_Schulz(matrix_s_sqrt, matrix_s_sqrt_inv, matrix_s, threshold, sign_order, &
1.0E-10_dp, 100, symmetrize=.TRUE., converged=converged) !FIXME
CALL dbcsr_release(matrix_s_sqrt)
IF (.NOT. converged) THEN
CPABORT("sqrt inv did not converge")
ENDIF

IF (.NOT. PRESENT(matrix_s_sqrt_inv)) &
CPABORT("Argument matrix_s_sqrt_inv required if sign_symmetric is set")

CALL dbcsr_create(matrix_ssqrtinv_ks_ssqrtinv, template=matrix_s, matrix_type=dbcsr_type_no_symmetry)
CALL dbcsr_create(matrix_ssqrtinv_ks_ssqrtinv2, template=matrix_s, matrix_type=dbcsr_type_no_symmetry)
Expand Down Expand Up @@ -579,7 +580,6 @@ SUBROUTINE density_matrix_sign_fixed_mu(matrix_p, trace, mu, sign_method, sign_o
0.0_dp, matrix_p, filter_eps=threshold)
CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_p, matrix_s_sqrt_inv, &
0.0_dp, matrix_p, filter_eps=threshold)
CALL dbcsr_release(matrix_s_sqrt_inv)
ELSE

! get P=PS*inv(S)
Expand Down
4 changes: 2 additions & 2 deletions tests/QS/regtest-dm-ls-scf-4/TEST_FILES
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ H2O-dft-ls-NEWTONSCHULZ4.inp 11 2e-13
H2O-dft-ls-NEWTONSCHULZ5.inp 11 2e-13 -17.031737706145982
H2O-dft-ls-NEWTONSCHULZ6.inp 11 2e-13 -17.031737706145911
H2O-dft-ls-NEWTONSCHULZ7.inp 11 2e-13 -17.031737706152430
H2O-dft-ls-NEWTONSCHULZ-SYMMETRIC.inp 11 2e-13 -17.031737715609236
H2O-dft-ls-NEWTONSCHULZ-SYMMETRIC.inp 11 2e-13 -17.031737705902110
H2O-dft-ls-SUBMATRIX-NS.inp 11 2e-13 -17.031737705902103
H2O-dft-ls-SUBMATRIX-NS3.inp 11 2e-13 -17.031737706145982
H2O-dft-ls-SUBMATRIX-DIRECT.inp 11 2e-13 -17.031737715853119
H2O-dft-ls-SUBMATRIX-DIRECT.inp 11 2e-13 -17.031737706145982
#EOF

0 comments on commit e5e83c5

Please sign in to comment.