(git:66ce584)
Loading...
Searching...
No Matches
preconditioner_types.F
Go to the documentation of this file.
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 types of preconditioners
10!> \par History
11!> Separate types from construction and application
12!> \author Joost VandeVondele (09.2002)
13! **************************************************************************************************
17 USE cp_cfm_types, ONLY: cp_cfm_release,&
23 USE cp_fm_types, ONLY: cp_fm_release,&
29 USE kinds, ONLY: dp
32#include "./base/base_uses.f90"
33
34 IMPLICIT NONE
35
36 PRIVATE
37
38 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
39
42 PUBLIC :: init_preconditioner
43 PUBLIC :: preconditioner_in_use
46
47! **************************************************************************************************
49 INTEGER :: nrow_global = 0, ncol_global = 0
50 INTEGER :: nrow_local = 0, ncol_local = 0, num_pe = 0
51 INTEGER, ALLOCATABLE, DIMENSION(:) :: global_columns
52 INTEGER, ALLOCATABLE, DIMENSION(:) :: local_rows, local_columns
53 INTEGER, ALLOCATABLE, DIMENSION(:) :: send_counts, send_displacements
54 INTEGER, ALLOCATABLE, DIMENSION(:) :: recv_counts, recv_displacements
55 INTEGER, ALLOCATABLE, DIMENSION(:) :: send_local_rows, send_local_columns
56 INTEGER, ALLOCATABLE, DIMENSION(:) :: recv_global_rows, recv_global_columns
58
59! **************************************************************************************************
61! PRIVATE
62 TYPE(dbcsr_type), POINTER :: sparse_matrix => null()
63 TYPE(cp_fm_type), POINTER :: fm => null()
64 TYPE(cp_cfm_type), POINTER :: complex_fm => null()
65 TYPE(cp_cfm_type), POINTER :: occ_rotation_complex => null()
66 LOGICAL :: owns_complex_fm = .true.
67 TYPE(cp_fm_type), POINTER :: base_fm => null()
68 TYPE(dbcsr_type), POINTER :: dbcsr_matrix => null()
69 TYPE(dbcsr_type), POINTER :: base_dbcsr_matrix => null()
70 TYPE(dbcsr_type), POINTER :: occ_rotation_dbcsr => null()
71 TYPE(dbcsr_type), POINTER :: max_ev_vector => null()
72 TYPE(dbcsr_type), POINTER :: min_ev_vector => null()
73 TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => null()
74 TYPE(mp_para_env_type), POINTER :: para_env => null()
75 TYPE(cp_blacs_env_type), POINTER :: ctxt => null()
76 TYPE(cp_fm_type), POINTER :: occ_rotation => null()
77 INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
78 REAL(kind=dp), DIMENSION(:), POINTER :: occ_evals => null(), full_evals => null()
79 REAL(kind=dp) :: energy_gap = -1.0_dp
80 REAL(kind=dp) :: condition_num = -1.0_dp
81 INTEGER :: polynomial_degree = 8
82 REAL(kind=dp) :: polynomial_min = -1.0_dp, polynomial_max = -1.0_dp
83 INTEGER :: spectral_rank = 0
84 INTEGER :: spectral_max_rank = 48
85 REAL(kind=dp) :: spectral_reference = 0.0_dp, spectral_window = 1.0_dp, &
86 spectral_base_scale = 1.0_dp
87 INTEGER :: low_rank_base = ot_low_rank_base_overlap
88 INTEGER :: lattice_fft_mode = ot_lattice_fft_off
89 LOGICAL :: lattice_fft_active = .false.
90 INTEGER, DIMENSION(3) :: lattice_dims = [1, 1, 1]
91 INTEGER :: lattice_block_size = 0
92 INTEGER :: lattice_local_cells = 0
93 REAL(kind=dp) :: lattice_projection_error = 0.0_dp, &
94 lattice_corrected_projection_error = 0.0_dp, &
95 lattice_cost_ratio = 0.0_dp, &
96 lattice_storage_ratio = 0.0_dp
97 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: lattice_inverse_k
98 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: lattice_state_inverse_k
99 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: lattice_occ_vectors, lattice_occ_dual
100 INTEGER, ALLOCATABLE, DIMENSION(:) :: lattice_local_indices
101 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: lattice_local_operator, &
102 lattice_local_coarse_inverse
103 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: lattice_state_local_indices
104 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: lattice_state_local_operator, &
105 lattice_state_local_coarse_inverse
106 TYPE(lattice_rhs_distribution_type) :: lattice_rhs_distribution
107 END TYPE preconditioner_type
108
109! **************************************************************************************************
113
114CONTAINS
115
116! **************************************************************************************************
117
118! **************************************************************************************************
119!> \brief ...
120!> \param preconditioner ...
121!> \return ...
122! **************************************************************************************************
123 FUNCTION preconditioner_in_use(preconditioner)
125 LOGICAL :: preconditioner_in_use
126
127 preconditioner_in_use = .NOT. (preconditioner%in_use == 0)
128 END FUNCTION preconditioner_in_use
129
130! **************************************************************************************************
131!> \brief ...
132!> \param preconditioner_env ...
133!> \param para_env ...
134!> \param blacs_env ...
135! **************************************************************************************************
136 SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
137
138 TYPE(preconditioner_type) :: preconditioner_env
139 TYPE(mp_para_env_type), POINTER :: para_env
140 TYPE(cp_blacs_env_type), POINTER :: blacs_env
141
142 NULLIFY (preconditioner_env%sparse_matrix)
143 NULLIFY (preconditioner_env%fm)
144 NULLIFY (preconditioner_env%complex_fm)
145 NULLIFY (preconditioner_env%occ_rotation_complex)
146 preconditioner_env%owns_complex_fm = .true.
147 NULLIFY (preconditioner_env%base_fm)
148 NULLIFY (preconditioner_env%dbcsr_matrix)
149 NULLIFY (preconditioner_env%base_dbcsr_matrix)
150 NULLIFY (preconditioner_env%occ_rotation_dbcsr)
151 NULLIFY (preconditioner_env%occ_rotation)
152 NULLIFY (preconditioner_env%occ_evals)
153 NULLIFY (preconditioner_env%full_evals)
154 NULLIFY (preconditioner_env%inverse_history)
155 NULLIFY (preconditioner_env%max_ev_vector)
156 NULLIFY (preconditioner_env%min_ev_vector)
157 preconditioner_env%solver = ot_precond_solver_default
158 preconditioner_env%para_env => para_env
159 preconditioner_env%ctxt => blacs_env
160 !inverse is used for filtering in update set it to something huge to
161 ! avoid filtering if the information is not available
162 preconditioner_env%condition_num = -1.0_dp
163 preconditioner_env%polynomial_degree = 8
164 preconditioner_env%polynomial_min = -1.0_dp
165 preconditioner_env%polynomial_max = -1.0_dp
166 preconditioner_env%spectral_rank = 0
167 preconditioner_env%spectral_max_rank = 48
168 preconditioner_env%spectral_reference = 0.0_dp
169 preconditioner_env%spectral_window = 1.0_dp
170 preconditioner_env%spectral_base_scale = 1.0_dp
171 preconditioner_env%low_rank_base = ot_low_rank_base_overlap
172 preconditioner_env%lattice_fft_mode = ot_lattice_fft_off
173 preconditioner_env%lattice_fft_active = .false.
174 preconditioner_env%lattice_dims = [1, 1, 1]
175 preconditioner_env%lattice_block_size = 0
176 preconditioner_env%lattice_local_cells = 0
177 preconditioner_env%lattice_projection_error = 0.0_dp
178 preconditioner_env%lattice_corrected_projection_error = 0.0_dp
179 preconditioner_env%lattice_cost_ratio = 0.0_dp
180 preconditioner_env%lattice_storage_ratio = 0.0_dp
181 preconditioner_env%ihistory = 0
182
183 CALL preconditioner_env%para_env%retain()
184 CALL preconditioner_env%ctxt%retain()
185
186 END SUBROUTINE init_preconditioner
187
188! **************************************************************************************************
189!> \brief ...
190!> \param preconditioner_env ...
191! **************************************************************************************************
192 SUBROUTINE destroy_preconditioner(preconditioner_env)
193
194 TYPE(preconditioner_type) :: preconditioner_env
195
196 CHARACTER(len=*), PARAMETER :: routinen = 'destroy_preconditioner'
197
198 INTEGER :: handle, i
199
200 CALL timeset(routinen, handle)
201
202 IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
203 CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
204 NULLIFY (preconditioner_env%sparse_matrix)
205 END IF
206
207 IF (ASSOCIATED(preconditioner_env%fm)) THEN
208 CALL cp_fm_release(preconditioner_env%fm)
209 DEALLOCATE (preconditioner_env%fm)
210 NULLIFY (preconditioner_env%fm)
211 END IF
212 IF (preconditioner_env%owns_complex_fm) THEN
213 IF (ASSOCIATED(preconditioner_env%complex_fm)) THEN
214 CALL cp_cfm_release(preconditioner_env%complex_fm)
215 DEALLOCATE (preconditioner_env%complex_fm)
216 END IF
217 END IF
218 NULLIFY (preconditioner_env%complex_fm)
219 preconditioner_env%owns_complex_fm = .true.
220 IF (ASSOCIATED(preconditioner_env%occ_rotation_complex)) THEN
221 CALL cp_cfm_release(preconditioner_env%occ_rotation_complex)
222 DEALLOCATE (preconditioner_env%occ_rotation_complex)
223 NULLIFY (preconditioner_env%occ_rotation_complex)
224 END IF
225 IF (ASSOCIATED(preconditioner_env%base_fm)) THEN
226 CALL cp_fm_release(preconditioner_env%base_fm)
227 DEALLOCATE (preconditioner_env%base_fm)
228 NULLIFY (preconditioner_env%base_fm)
229 END IF
230 IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
231 CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
232 END IF
233 IF (ASSOCIATED(preconditioner_env%base_dbcsr_matrix)) THEN
234 CALL dbcsr_release_p(preconditioner_env%base_dbcsr_matrix)
235 END IF
236 IF (ASSOCIATED(preconditioner_env%occ_rotation_dbcsr)) THEN
237 CALL dbcsr_release_p(preconditioner_env%occ_rotation_dbcsr)
238 END IF
239 IF (ASSOCIATED(preconditioner_env%occ_rotation)) THEN
240 CALL cp_fm_release(preconditioner_env%occ_rotation)
241 DEALLOCATE (preconditioner_env%occ_rotation)
242 NULLIFY (preconditioner_env%occ_rotation)
243 END IF
244 IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
245 CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
246 END IF
247 IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
248 CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
249 END IF
250 IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
251 DEALLOCATE (preconditioner_env%occ_evals)
252 END IF
253 IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
254 DEALLOCATE (preconditioner_env%full_evals)
255 END IF
256 IF (ALLOCATED(preconditioner_env%lattice_inverse_k)) THEN
257 DEALLOCATE (preconditioner_env%lattice_inverse_k)
258 END IF
259 IF (ALLOCATED(preconditioner_env%lattice_state_inverse_k)) THEN
260 DEALLOCATE (preconditioner_env%lattice_state_inverse_k)
261 END IF
262 IF (ALLOCATED(preconditioner_env%lattice_occ_vectors)) THEN
263 DEALLOCATE (preconditioner_env%lattice_occ_vectors)
264 END IF
265 IF (ALLOCATED(preconditioner_env%lattice_occ_dual)) THEN
266 DEALLOCATE (preconditioner_env%lattice_occ_dual)
267 END IF
268 IF (ALLOCATED(preconditioner_env%lattice_local_indices)) THEN
269 DEALLOCATE (preconditioner_env%lattice_local_indices)
270 END IF
271 IF (ALLOCATED(preconditioner_env%lattice_local_operator)) THEN
272 DEALLOCATE (preconditioner_env%lattice_local_operator)
273 END IF
274 IF (ALLOCATED(preconditioner_env%lattice_local_coarse_inverse)) THEN
275 DEALLOCATE (preconditioner_env%lattice_local_coarse_inverse)
276 END IF
277 IF (ALLOCATED(preconditioner_env%lattice_state_local_indices)) THEN
278 DEALLOCATE (preconditioner_env%lattice_state_local_indices)
279 END IF
280 IF (ALLOCATED(preconditioner_env%lattice_state_local_operator)) THEN
281 DEALLOCATE (preconditioner_env%lattice_state_local_operator)
282 END IF
283 IF (ALLOCATED(preconditioner_env%lattice_state_local_coarse_inverse)) THEN
284 DEALLOCATE (preconditioner_env%lattice_state_local_coarse_inverse)
285 END IF
286 CALL release_lattice_rhs_distribution(preconditioner_env%lattice_rhs_distribution)
287 IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
288 DO i = 1, SIZE(preconditioner_env%inverse_history)
289 CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
290 END DO
291 DEALLOCATE (preconditioner_env%inverse_history)
292 END IF
293 CALL mp_para_env_release(preconditioner_env%para_env)
294 CALL cp_blacs_env_release(preconditioner_env%ctxt)
295
296 preconditioner_env%in_use = 0
297 preconditioner_env%cholesky_use = cholesky_reduce
298
299 CALL timestop(handle)
300
301 END SUBROUTINE destroy_preconditioner
302
303! **************************************************************************************************
304!> \brief Release a cached lattice right-hand-side communication map.
305!> \param distribution ...
306! **************************************************************************************************
307 SUBROUTINE release_lattice_rhs_distribution(distribution)
308
309 TYPE(lattice_rhs_distribution_type), INTENT(INOUT) :: distribution
310
311 IF (ALLOCATED(distribution%global_columns)) DEALLOCATE (distribution%global_columns)
312 IF (ALLOCATED(distribution%local_rows)) DEALLOCATE (distribution%local_rows)
313 IF (ALLOCATED(distribution%local_columns)) DEALLOCATE (distribution%local_columns)
314 IF (ALLOCATED(distribution%send_counts)) DEALLOCATE (distribution%send_counts)
315 IF (ALLOCATED(distribution%send_displacements)) DEALLOCATE (distribution%send_displacements)
316 IF (ALLOCATED(distribution%recv_counts)) DEALLOCATE (distribution%recv_counts)
317 IF (ALLOCATED(distribution%recv_displacements)) DEALLOCATE (distribution%recv_displacements)
318 IF (ALLOCATED(distribution%send_local_rows)) DEALLOCATE (distribution%send_local_rows)
319 IF (ALLOCATED(distribution%send_local_columns)) DEALLOCATE (distribution%send_local_columns)
320 IF (ALLOCATED(distribution%recv_global_rows)) DEALLOCATE (distribution%recv_global_rows)
321 IF (ALLOCATED(distribution%recv_global_columns)) DEALLOCATE (distribution%recv_global_columns)
322 distribution%nrow_global = 0
323 distribution%ncol_global = 0
324 distribution%nrow_local = 0
325 distribution%ncol_local = 0
326 distribution%num_pe = 0
327
329
330END MODULE preconditioner_types
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public dbcsr_release_p(matrix)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ot_low_rank_base_overlap
integer, parameter, public cholesky_reduce
integer, parameter, public ot_precond_solver_default
integer, parameter, public ot_lattice_fft_off
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
types of preconditioners
subroutine, public release_lattice_rhs_distribution(distribution)
Release a cached lattice right-hand-side communication map.
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
subroutine, public destroy_preconditioner(preconditioner_env)
...
logical function, public preconditioner_in_use(preconditioner)
...
computes preconditioners, and implements methods to apply them currently used in qs_ot
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
represent a full matrix
stores all the informations relevant to an mpi environment