Line data Source code
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 buffer for the diis of the scf
10 : !> \par History
11 : !> 02.2003 rewamped [fawzi]
12 : !> \author Matthias Krack
13 : ! **************************************************************************************************
14 : MODULE qs_diis_types
15 : USE cp_cfm_types, ONLY: cp_cfm_release,&
16 : cp_cfm_type
17 : USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
18 : dbcsr_release
19 : USE cp_fm_types, ONLY: cp_fm_release,&
20 : cp_fm_type
21 : USE kinds, ONLY: dp
22 : #include "./base/base_uses.f90"
23 :
24 : IMPLICIT NONE
25 : PRIVATE
26 :
27 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
28 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_diis_types'
29 :
30 : PUBLIC :: qs_diis_buffer_type
31 : PUBLIC :: qs_diis_b_release
32 : PUBLIC :: qs_diis_buffer_type_sparse, &
33 : qs_diis_b_release_sparse, &
34 : qs_diis_buffer_type_kp, &
35 : qs_diis_b_release_kp
36 :
37 : ! **************************************************************************************************
38 : !> \brief keeps a buffer with the previous values of s,p,k
39 : !> \par History
40 : !> 02.2003 rewamped [fawzi]
41 : !> \author Matthias Krack
42 : ! **************************************************************************************************
43 : TYPE qs_diis_buffer_type
44 : INTEGER :: nbuffer = -1
45 : INTEGER :: ncall = -1
46 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: error => NULL()
47 : TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: param => NULL()
48 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix => NULL()
49 : END TYPE qs_diis_buffer_type
50 :
51 : ! **************************************************************************************************
52 : !> \brief build array of pointers to diis buffers
53 : !> \param diis_buffer the diis buffer pointer
54 : !> \par History
55 : !> 02.2003 created [fawzi]
56 : !> \author fawzi
57 : ! **************************************************************************************************
58 : TYPE qs_diis_buffer_p_type
59 : TYPE(qs_diis_buffer_type), POINTER :: diis_buffer => NULL()
60 : END TYPE qs_diis_buffer_p_type
61 :
62 : ! **************************************************************************************************
63 : !> \brief build array of pointers to diis buffers for sparse matrix case
64 : !> \param diis_buffer the diis buffer pointer
65 : !> \par History
66 : !> 10.2014 Modified from non-sparse case by Fredy W. Aquino
67 : !> \author fwaq
68 : ! **************************************************************************************************
69 : TYPE qs_diis_buffer_type_sparse
70 : INTEGER :: nbuffer = -1
71 : INTEGER :: ncall = -1
72 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: error => NULL()
73 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: param => NULL()
74 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix => NULL()
75 : END TYPE qs_diis_buffer_type_sparse
76 :
77 : TYPE qs_diis_buffer_p_type_sparse
78 : TYPE(qs_diis_buffer_type_sparse), POINTER :: diis_buffer => NULL()
79 : END TYPE qs_diis_buffer_p_type_sparse
80 :
81 : ! **************************************************************************************************
82 : !> \brief build arrau of pointers to diis buffers in the k-point (complex full matrices) case
83 : !> \note we keep the overlap matrix and 1 parameter matrix per k-point, in the corresponding kp subgroup
84 : !> \par History
85 : !> 04.2023 created
86 : !> \author Augustin Bussy
87 : ! **************************************************************************************************
88 : TYPE qs_diis_buffer_type_kp
89 : INTEGER :: nbuffer = -1
90 : INTEGER :: ncall = -1
91 : TYPE(cp_cfm_type), DIMENSION(:), POINTER :: smat => NULL()
92 : TYPE(cp_cfm_type), DIMENSION(:, :, :), POINTER :: param => NULL()
93 : TYPE(cp_cfm_type), DIMENSION(:, :, :), POINTER :: error => NULL()
94 : COMPLEX(KIND=dp), DIMENSION(:, :), POINTER :: b_matrix => NULL()
95 : END TYPE qs_diis_buffer_type_kp
96 :
97 : TYPE qs_diis_buffer_p_type_kp
98 : TYPE(qs_diis_buffer_type_kp), POINTER :: diis_buffer => NULL()
99 : END TYPE qs_diis_buffer_p_type_kp
100 :
101 : CONTAINS
102 :
103 : ! **************************************************************************************************
104 : !> \brief releases the given diis buffer (see doc/ReferenceCounting.html)
105 : !> \param diis_buffer the buffer to release
106 : !> \par History
107 : !> 02.2003 created [fawzi]
108 : !> \author fawzi
109 : ! **************************************************************************************************
110 3260 : SUBROUTINE qs_diis_b_release(diis_buffer)
111 : TYPE(qs_diis_buffer_type), INTENT(INOUT) :: diis_buffer
112 :
113 3260 : IF (ASSOCIATED(diis_buffer%b_matrix)) THEN
114 2938 : DEALLOCATE (diis_buffer%b_matrix)
115 : END IF
116 3260 : CALL cp_fm_release(diis_buffer%error)
117 3260 : CALL cp_fm_release(diis_buffer%param)
118 :
119 3260 : END SUBROUTINE qs_diis_b_release
120 :
121 : ! **************************************************************************************************
122 : !> \brief releases the given diis buffer (see doc/ReferenceCounting.html)
123 : !> \param diis_buffer the buffer to release
124 : !> \par History
125 : !> 10-11-14 created [FA] modified from qs_diis_b_release
126 : !> \author Fredy W. Aquino
127 : ! **************************************************************************************************
128 4 : SUBROUTINE qs_diis_b_release_sparse(diis_buffer)
129 :
130 : TYPE(qs_diis_buffer_type_sparse), INTENT(INOUT) :: diis_buffer
131 :
132 : INTEGER :: i, j
133 :
134 4 : IF (ASSOCIATED(diis_buffer%b_matrix)) THEN
135 4 : DEALLOCATE (diis_buffer%b_matrix)
136 : END IF
137 4 : IF (ASSOCIATED(diis_buffer%error)) THEN
138 10 : DO j = 1, SIZE(diis_buffer%error, 2)
139 34 : DO i = 1, SIZE(diis_buffer%error, 1)
140 24 : CALL dbcsr_release(diis_buffer%error(i, j)%matrix)
141 30 : DEALLOCATE (diis_buffer%error(i, j)%matrix)
142 : END DO
143 : END DO
144 4 : DEALLOCATE (diis_buffer%error)
145 : END IF
146 4 : IF (ASSOCIATED(diis_buffer%param)) THEN
147 10 : DO j = 1, SIZE(diis_buffer%param, 2)
148 34 : DO i = 1, SIZE(diis_buffer%param, 1)
149 24 : CALL dbcsr_release(diis_buffer%param(i, j)%matrix)
150 30 : DEALLOCATE (diis_buffer%param(i, j)%matrix)
151 : END DO
152 : END DO
153 4 : DEALLOCATE (diis_buffer%param)
154 : END IF
155 4 : END SUBROUTINE qs_diis_b_release_sparse
156 :
157 : ! **************************************************************************************************
158 : !> \brief releases the given diis KP buffer
159 : !> \param diis_buffer the buffer to release
160 : ! **************************************************************************************************
161 130 : SUBROUTINE qs_diis_b_release_kp(diis_buffer)
162 : TYPE(qs_diis_buffer_type_kp), INTENT(INOUT) :: diis_buffer
163 :
164 : INTEGER :: i, j, k
165 :
166 130 : IF (ASSOCIATED(diis_buffer%b_matrix)) THEN
167 94 : DEALLOCATE (diis_buffer%b_matrix)
168 : END IF
169 130 : IF (ASSOCIATED(diis_buffer%smat)) THEN
170 568 : DO i = 1, SIZE(diis_buffer%smat)
171 568 : CALL cp_cfm_release(diis_buffer%smat(i))
172 : END DO
173 94 : DEALLOCATE (diis_buffer%smat)
174 : END IF
175 130 : IF (ASSOCIATED(diis_buffer%error)) THEN
176 568 : DO k = 1, SIZE(diis_buffer%error, 3)
177 1172 : DO j = 1, SIZE(diis_buffer%error, 2)
178 3494 : DO i = 1, SIZE(diis_buffer%error, 1)
179 3020 : CALL cp_cfm_release(diis_buffer%error(i, j, k))
180 : END DO
181 : END DO
182 : END DO
183 94 : DEALLOCATE (diis_buffer%error)
184 : END IF
185 130 : IF (ASSOCIATED(diis_buffer%param)) THEN
186 568 : DO k = 1, SIZE(diis_buffer%param, 3)
187 1172 : DO j = 1, SIZE(diis_buffer%param, 2)
188 3494 : DO i = 1, SIZE(diis_buffer%param, 1)
189 3020 : CALL cp_cfm_release(diis_buffer%param(i, j, k))
190 : END DO
191 : END DO
192 : END DO
193 94 : DEALLOCATE (diis_buffer%param)
194 : END IF
195 130 : END SUBROUTINE qs_diis_b_release_kp
196 0 : END MODULE qs_diis_types
|