(git:b279b6b)
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 ! **************************************************************************************************
15 MODULE admm_utils
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
31  USE parallel_gemm_api, ONLY: parallel_gemm
32 #include "./base/base_uses.f90"
33 
34  IMPLICIT NONE
35  PRIVATE
36 
37  PUBLIC :: admm_correct_for_eigenvalues, &
39 
40  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'admm_utils'
41 
42 !***
43 
44 CONTAINS
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 
178 END 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