Skip to content

Commit

Permalink
KPOINTS| Implementation of the DIIS/Diag. solver
Browse files Browse the repository at this point in the history
  • Loading branch information
abussy committed Apr 13, 2023
1 parent a5f008f commit b234498
Show file tree
Hide file tree
Showing 17 changed files with 715 additions and 107 deletions.
8 changes: 8 additions & 0 deletions src/kpoint_types.F
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ MODULE kpoint_types
USE message_passing, ONLY: mp_para_env_release,&
mp_para_env_type
USE physcon, ONLY: angstrom
USE qs_diis_types, ONLY: qs_diis_b_release_kp,&
qs_diis_buffer_type_kp
USE qs_matrix_pools, ONLY: mpools_release,&
qs_matrix_pools_type
USE qs_mo_types, ONLY: deallocate_mo_set,&
Expand Down Expand Up @@ -162,6 +164,7 @@ MODULE kpoint_types
TYPE(kpoint_sym_p_type), DIMENSION(:), &
POINTER :: kp_sym => Null()
TYPE(qs_matrix_pools_type), POINTER :: mpools => Null()
TYPE(qs_diis_buffer_type_kp), POINTER :: scf_diis_buffer => Null()
END TYPE kpoint_type
! **************************************************************************************************
Expand Down Expand Up @@ -261,6 +264,11 @@ SUBROUTINE kpoint_release(kpoint)
DEALLOCATE (kpoint%kp_sym)
END IF
IF (ASSOCIATED(kpoint%scf_diis_buffer)) THEN
CALL qs_diis_b_release_kp(kpoint%scf_diis_buffer)
DEALLOCATE (kpoint%scf_diis_buffer)
END IF
DEALLOCATE (kpoint)
END IF
Expand Down
3 changes: 2 additions & 1 deletion src/qs_band_structure.F
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ SUBROUTINE calculate_kp_orbitals(qs_env, kpoint, scheme, nadd, mp_grid, kpgenera
OPTIONAL :: kpgeneral
INTEGER, INTENT(IN), OPTIONAL :: group_size_ext

LOGICAL :: diis_step
TYPE(cp_blacs_env_type), POINTER :: blacs_env
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_s
TYPE(dft_control_type), POINTER :: dft_control
Expand All @@ -331,7 +332,7 @@ SUBROUTINE calculate_kp_orbitals(qs_env, kpoint, scheme, nadd, mp_grid, kpgenera

CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s, &
scf_env=scf_env, scf_control=scf_control)
CALL do_general_diag_kp(matrix_ks, matrix_s, kpoint, scf_env, scf_control, .FALSE.)
CALL do_general_diag_kp(matrix_ks, matrix_s, kpoint, scf_env, scf_control, .FALSE., diis_step)

END SUBROUTINE calculate_kp_orbitals

Expand Down
465 changes: 448 additions & 17 deletions src/qs_diis.F

Large diffs are not rendered by default.

89 changes: 75 additions & 14 deletions src/qs_diis_types.F
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
!> \author Matthias Krack
! **************************************************************************************************
MODULE qs_diis_types
USE cp_cfm_types, ONLY: cp_cfm_release,&
cp_cfm_type
USE cp_fm_types, ONLY: cp_fm_release,&
cp_fm_type
USE dbcsr_api, ONLY: dbcsr_p_type,&
Expand All @@ -28,7 +30,9 @@ MODULE qs_diis_types
PUBLIC :: qs_diis_buffer_type
PUBLIC :: qs_diis_b_release
PUBLIC :: qs_diis_buffer_type_sparse, &
qs_diis_b_release_sparse
qs_diis_b_release_sparse, &
qs_diis_buffer_type_kp, &
qs_diis_b_release_kp

! **************************************************************************************************
!> \brief keeps a buffer with the previous values of s,p,k
Expand All @@ -38,7 +42,7 @@ MODULE qs_diis_types
! **************************************************************************************************
TYPE qs_diis_buffer_type
INTEGER :: nbuffer, ncall
TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: error, PARAMETER
TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: error, param
REAL(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix
END TYPE qs_diis_buffer_type

Expand All @@ -62,14 +66,32 @@ MODULE qs_diis_types
! **************************************************************************************************
TYPE qs_diis_buffer_type_sparse
INTEGER :: nbuffer, ncall
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: error, PARAMETER
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: error, param
REAL(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix
END TYPE qs_diis_buffer_type_sparse

TYPE qs_diis_buffer_p_type_sparse
TYPE(qs_diis_buffer_type_sparse), POINTER :: diis_buffer
END TYPE qs_diis_buffer_p_type_sparse

! **************************************************************************************************
!> \brief build arrau of pointers to diis buffers in the k-point (complex full matrices) case
!> \note we keep the overlap matrix and 1 parameter matrix per k-point, in the corresponding kp subgroup
!> \par History
!> 04.2023 created
!> \author Augustin Bussy
! **************************************************************************************************
TYPE qs_diis_buffer_type_kp
INTEGER :: nbuffer, ncall
TYPE(cp_cfm_type), DIMENSION(:), POINTER :: smat
TYPE(cp_cfm_type), DIMENSION(:, :, :), POINTER :: param, error
COMPLEX(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix
END TYPE qs_diis_buffer_type_kp

TYPE qs_diis_buffer_p_type_kp
TYPE(qs_diis_buffer_type_kp), POINTER :: diis_buffer
END TYPE qs_diis_buffer_p_type_kp

CONTAINS

! **************************************************************************************************
Expand All @@ -95,13 +117,13 @@ SUBROUTINE qs_diis_b_release(diis_buffer)
END DO
DEALLOCATE (diis_buffer%error)
END IF
IF (ASSOCIATED(diis_buffer%parameter)) THEN
DO j = 1, SIZE(diis_buffer%parameter, 2)
DO i = 1, SIZE(diis_buffer%parameter, 1)
CALL cp_fm_release(diis_buffer%parameter(i, j))
IF (ASSOCIATED(diis_buffer%param)) THEN
DO j = 1, SIZE(diis_buffer%param, 2)
DO i = 1, SIZE(diis_buffer%param, 1)
CALL cp_fm_release(diis_buffer%param(i, j))
END DO
END DO
DEALLOCATE (diis_buffer%parameter)
DEALLOCATE (diis_buffer%param)
END IF
END SUBROUTINE qs_diis_b_release

Expand Down Expand Up @@ -130,15 +152,54 @@ SUBROUTINE qs_diis_b_release_sparse(diis_buffer)
END DO
DEALLOCATE (diis_buffer%error)
END IF
IF (ASSOCIATED(diis_buffer%parameter)) THEN
DO j = 1, SIZE(diis_buffer%parameter, 2)
DO i = 1, SIZE(diis_buffer%parameter, 1)
CALL dbcsr_release(diis_buffer%parameter(i, j)%matrix)
DEALLOCATE (diis_buffer%parameter(i, j)%matrix)
IF (ASSOCIATED(diis_buffer%param)) THEN
DO j = 1, SIZE(diis_buffer%param, 2)
DO i = 1, SIZE(diis_buffer%param, 1)
CALL dbcsr_release(diis_buffer%param(i, j)%matrix)
DEALLOCATE (diis_buffer%param(i, j)%matrix)
END DO
END DO
DEALLOCATE (diis_buffer%parameter)
DEALLOCATE (diis_buffer%param)
END IF
END SUBROUTINE qs_diis_b_release_sparse

! **************************************************************************************************
!> \brief releases the given diis KP buffer
!> \param diis_buffer the buffer to release
! **************************************************************************************************
SUBROUTINE qs_diis_b_release_kp(diis_buffer)
TYPE(qs_diis_buffer_type_kp), INTENT(INOUT) :: diis_buffer

INTEGER :: i, j, k

IF (ASSOCIATED(diis_buffer%b_matrix)) THEN
DEALLOCATE (diis_buffer%b_matrix)
END IF
IF (ASSOCIATED(diis_buffer%smat)) THEN
DO i = 1, SIZE(diis_buffer%smat)
CALL cp_cfm_release(diis_buffer%smat(i))
END DO
DEALLOCATE (diis_buffer%smat)
END IF
IF (ASSOCIATED(diis_buffer%error)) THEN
DO k = 1, SIZE(diis_buffer%error, 3)
DO j = 1, SIZE(diis_buffer%error, 2)
DO i = 1, SIZE(diis_buffer%error, 1)
CALL cp_cfm_release(diis_buffer%error(i, j, k))
END DO
END DO
END DO
DEALLOCATE (diis_buffer%error)
END IF
IF (ASSOCIATED(diis_buffer%param)) THEN
DO k = 1, SIZE(diis_buffer%param, 3)
DO j = 1, SIZE(diis_buffer%param, 2)
DO i = 1, SIZE(diis_buffer%param, 1)
CALL cp_cfm_release(diis_buffer%param(i, j, k))
END DO
END DO
END DO
DEALLOCATE (diis_buffer%param)
END IF
END SUBROUTINE qs_diis_b_release_kp
END MODULE qs_diis_types
28 changes: 21 additions & 7 deletions src/qs_scf.F
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@ MODULE qs_scf
USE qs_density_matrices, ONLY: calculate_density_matrix
USE qs_density_mixing_types, ONLY: gspace_mixing_nr
USE qs_diis, ONLY: qs_diis_b_clear,&
qs_diis_b_create
qs_diis_b_clear_kp,&
qs_diis_b_create,&
qs_diis_b_create_kp
USE qs_energy_types, ONLY: qs_energy_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type,&
Expand Down Expand Up @@ -645,24 +647,28 @@ SUBROUTINE init_scf_loop(scf_env, qs_env, scf_section)
CHARACTER(LEN=*), PARAMETER :: routineN = 'init_scf_loop'

INTEGER :: handle, ispin, nmo, number_of_OT_envs
LOGICAL :: do_rotation, has_unit_metric, is_full_all
LOGICAL :: do_kpoints, do_rotation, &
has_unit_metric, is_full_all
TYPE(cp_fm_type), POINTER :: mo_coeff
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
TYPE(dbcsr_type), POINTER :: orthogonality_metric
TYPE(dft_control_type), POINTER :: dft_control
TYPE(kpoint_type), POINTER :: kpoints
TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
TYPE(scf_control_type), POINTER :: scf_control

CALL timeset(routineN, handle)

NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff)
NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)

CPASSERT(ASSOCIATED(scf_env))
CPASSERT(ASSOCIATED(qs_env))

CALL get_qs_env(qs_env=qs_env, &
scf_control=scf_control, &
dft_control=dft_control, &
do_kpoints=do_kpoints, &
kpoints=kpoints, &
mos=mos)

! if using mo_coeff_b then copy to fm
Expand Down Expand Up @@ -697,11 +703,19 @@ SUBROUTINE init_scf_loop(scf_env, qs_env, scf_section)

CASE (general_diag_method_nr, special_diag_method_nr, block_krylov_diag_method_nr)
IF (.NOT. scf_env%skip_diis) THEN
IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
ALLOCATE (scf_env%scf_diis_buffer)
CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
IF (do_kpoints) THEN
IF (.NOT. ASSOCIATED(kpoints%scf_diis_buffer)) THEN
ALLOCATE (kpoints%scf_diis_buffer)
CALL qs_diis_b_create_kp(kpoints%scf_diis_buffer, nbuffer=scf_control%max_diis)
END IF
CALL qs_diis_b_clear_kp(kpoints%scf_diis_buffer)
ELSE
IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
ALLOCATE (scf_env%scf_diis_buffer)
CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
END IF
CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
END IF
CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
END IF

CASE (ot_diag_method_nr)
Expand Down

0 comments on commit b234498

Please sign in to comment.