18 USE dbcsr_api,
ONLY: dbcsr_add,&
21 dbcsr_deallocate_matrix,&
32 #include "./base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'admm_utils'
53 INTEGER,
INTENT(IN) :: ispin
54 TYPE(admm_type),
POINTER :: admm_env
55 TYPE(dbcsr_type),
POINTER :: ks_matrix
57 INTEGER :: nao_aux_fit, nao_orb
58 TYPE(dbcsr_type),
POINTER :: work
60 nao_aux_fit = admm_env%nao_aux_fit
61 nao_orb = admm_env%nao_orb
63 IF (.NOT. admm_env%block_dm)
THEN
64 SELECT CASE (admm_env%purification_method)
69 CALL dbcsr_create(work, template=ks_matrix, name=
'work', matrix_type=dbcsr_type_symmetric)
71 CALL dbcsr_copy(work, ks_matrix)
72 CALL dbcsr_set(work, 0.0_dp)
73 CALL copy_fm_to_dbcsr(admm_env%ks_to_be_merged(ispin), work, keep_sparsity=.true.)
75 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
78 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
79 1.0_dp, admm_env%K(ispin), admm_env%A, 0.0_dp, &
80 admm_env%work_aux_orb)
81 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
82 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
83 admm_env%H_corr(ispin))
87 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
88 CALL dbcsr_deallocate_matrix(work)
94 CALL dbcsr_create(work, template=ks_matrix, name=
'work', matrix_type=dbcsr_type_symmetric)
96 CALL dbcsr_copy(work, ks_matrix)
97 CALL dbcsr_set(work, 0.0_dp)
98 CALL copy_fm_to_dbcsr(admm_env%ks_to_be_merged(ispin), work, keep_sparsity=.true.)
101 CALL parallel_gemm(
'N',
'N', nao_aux_fit, nao_orb, nao_aux_fit, &
102 1.0_dp, admm_env%K(ispin), admm_env%A, 0.0_dp, &
103 admm_env%work_aux_orb)
104 CALL parallel_gemm(
'T',
'N', nao_orb, nao_orb, nao_aux_fit, &
105 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
106 admm_env%H_corr(ispin))
110 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
111 CALL dbcsr_deallocate_matrix(work)
127 INTEGER,
INTENT(IN) :: ispin
128 TYPE(admm_type),
POINTER :: admm_env
129 TYPE(dbcsr_type),
POINTER :: ks_matrix
131 INTEGER :: nao_aux_fit, nao_orb
132 TYPE(dbcsr_type),
POINTER :: work
134 nao_aux_fit = admm_env%nao_aux_fit
135 nao_orb = admm_env%nao_orb
137 IF (.NOT. admm_env%block_dm)
THEN
138 SELECT CASE (admm_env%purification_method)
143 CALL dbcsr_create(work, template=ks_matrix, name=
'work', matrix_type=dbcsr_type_symmetric)
145 CALL dbcsr_copy(work, ks_matrix)
146 CALL dbcsr_set(work, 0.0_dp)
149 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
153 CALL dbcsr_set(work, 0.0_dp)
154 CALL copy_fm_to_dbcsr(admm_env%ks_to_be_merged(ispin), work, keep_sparsity=.true.)
156 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
157 CALL dbcsr_deallocate_matrix(work)
162 CALL dbcsr_create(work, template=ks_matrix, name=
'work', matrix_type=dbcsr_type_symmetric)
164 CALL dbcsr_copy(work, ks_matrix)
165 CALL dbcsr_set(work, 0.0_dp)
169 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
170 CALL dbcsr_deallocate_matrix(work)
Types and set/get functions for auxiliary density matrix methods.
Contains methods used in the context of density fitting.
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
DBCSR operations in CP2K.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Defines the basic variable types.
integer, parameter, public dp
basic linear algebra operations for full matrixes