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