(git:374b731)
Loading...
Searching...
No Matches
admm_utils.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Contains methods used in the context of density fitting
10!> \par History
11!> 04.2008 created [Manuel Guidon]
12!> 02.2013 moved from admm_methods
13!> \author Manuel Guidon
14! **************************************************************************************************
16 USE admm_types, ONLY: admm_type
18 USE dbcsr_api, ONLY: dbcsr_add,&
19 dbcsr_copy,&
20 dbcsr_create,&
21 dbcsr_deallocate_matrix,&
22 dbcsr_set,&
23 dbcsr_type,&
24 dbcsr_type_symmetric
30 USE kinds, ONLY: dp
32#include "./base/base_uses.f90"
33
34 IMPLICIT NONE
35 PRIVATE
36
39
40 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'admm_utils'
41
42!***
43
44CONTAINS
45
46! **************************************************************************************************
47!> \brief ...
48!> \param ispin ...
49!> \param admm_env ...
50!> \param ks_matrix ...
51! **************************************************************************************************
52 SUBROUTINE admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
53 INTEGER, INTENT(IN) :: ispin
54 TYPE(admm_type), POINTER :: admm_env
55 TYPE(dbcsr_type), POINTER :: ks_matrix
56
57 INTEGER :: nao_aux_fit, nao_orb
58 TYPE(dbcsr_type), POINTER :: work
59
60 nao_aux_fit = admm_env%nao_aux_fit
61 nao_orb = admm_env%nao_orb
62
63 IF (.NOT. admm_env%block_dm) THEN
64 SELECT CASE (admm_env%purification_method)
66 !* remove what has been added and add the correction
67 NULLIFY (work)
68 ALLOCATE (work)
69 CALL dbcsr_create(work, template=ks_matrix, name='work', matrix_type=dbcsr_type_symmetric)
70
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.)
74
75 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
76
77 ! ** calculate A^T*H_tilde*A
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))
84
85 CALL copy_fm_to_dbcsr(admm_env%H_corr(ispin), work, keep_sparsity=.true.)
86
87 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
88 CALL dbcsr_deallocate_matrix(work)
89
91 !* remove what has been added and add the correction
92 NULLIFY (work)
93 ALLOCATE (work)
94 CALL dbcsr_create(work, template=ks_matrix, name='work', matrix_type=dbcsr_type_symmetric)
95
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.)
99
100 ! ** calculate A^T*H_tilde*A
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))
107
108 CALL copy_fm_to_dbcsr(admm_env%H_corr(ispin), work, keep_sparsity=.true.)
109
110 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
111 CALL dbcsr_deallocate_matrix(work)
112
114 ! do nothing
115 END SELECT
116 END IF
117
118 END SUBROUTINE admm_correct_for_eigenvalues
119
120! **************************************************************************************************
121!> \brief ...
122!> \param ispin ...
123!> \param admm_env ...
124!> \param ks_matrix ...
125! **************************************************************************************************
126 SUBROUTINE admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
127 INTEGER, INTENT(IN) :: ispin
128 TYPE(admm_type), POINTER :: admm_env
129 TYPE(dbcsr_type), POINTER :: ks_matrix
130
131 INTEGER :: nao_aux_fit, nao_orb
132 TYPE(dbcsr_type), POINTER :: work
133
134 nao_aux_fit = admm_env%nao_aux_fit
135 nao_orb = admm_env%nao_orb
136
137 IF (.NOT. admm_env%block_dm) THEN
138 SELECT CASE (admm_env%purification_method)
140 !* remove what has been added and add the correction
141 NULLIFY (work)
142 ALLOCATE (work)
143 CALL dbcsr_create(work, template=ks_matrix, name='work', matrix_type=dbcsr_type_symmetric)
144
145 CALL dbcsr_copy(work, ks_matrix)
146 CALL dbcsr_set(work, 0.0_dp)
147 CALL copy_fm_to_dbcsr(admm_env%H_corr(ispin), work, keep_sparsity=.true.)
148
149 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
150
151 CALL copy_fm_to_dbcsr(admm_env%H_corr(ispin), work, keep_sparsity=.true.)
152
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.)
155
156 CALL dbcsr_add(ks_matrix, work, 1.0_dp, 1.0_dp)
157 CALL dbcsr_deallocate_matrix(work)
158
160 NULLIFY (work)
161 ALLOCATE (work)
162 CALL dbcsr_create(work, template=ks_matrix, name='work', matrix_type=dbcsr_type_symmetric)
163
164 CALL dbcsr_copy(work, ks_matrix)
165 CALL dbcsr_set(work, 0.0_dp)
166
167 CALL copy_fm_to_dbcsr(admm_env%H_corr(ispin), work, keep_sparsity=.true.)
168
169 CALL dbcsr_add(ks_matrix, work, 1.0_dp, -1.0_dp)
170 CALL dbcsr_deallocate_matrix(work)
171
173 ! do nothing
174 END SELECT
175 END IF
176 END SUBROUTINE admm_uncorrect_for_eigenvalues
177
178END MODULE admm_utils
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
Contains methods used in the context of density fitting.
Definition admm_utils.F:15
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
Definition admm_utils.F:127
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
Definition admm_utils.F:53
DBCSR operations in CP2K.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_purify_mo_no_diag
integer, parameter, public do_admm_purify_none
integer, parameter, public do_admm_purify_cauchy_subspace
integer, parameter, public do_admm_purify_cauchy
integer, parameter, public do_admm_purify_mo_diag
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
basic linear algebra operations for full matrixes
stores some data used in wavefunction fitting
Definition admm_types.F:120