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 types of preconditioners
10 : !> \par History
11 : !> Separate types from construction and application
12 : !> \author Joost VandeVondele (09.2002)
13 : ! **************************************************************************************************
14 : MODULE preconditioner_types
15 : USE cp_blacs_env, ONLY: cp_blacs_env_release,&
16 : cp_blacs_env_type
17 : USE cp_cfm_types, ONLY: cp_cfm_release,&
18 : cp_cfm_type
19 : USE cp_dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
20 : dbcsr_p_type,&
21 : dbcsr_release_p,&
22 : dbcsr_type
23 : USE cp_fm_types, ONLY: cp_fm_release,&
24 : cp_fm_type
25 : USE input_constants, ONLY: cholesky_reduce,&
26 : ot_low_rank_base_overlap,&
27 : ot_precond_solver_default
28 : USE kinds, ONLY: dp
29 : USE message_passing, ONLY: mp_para_env_release,&
30 : mp_para_env_type
31 : #include "./base/base_uses.f90"
32 :
33 : IMPLICIT NONE
34 :
35 : PRIVATE
36 :
37 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
38 :
39 : PUBLIC :: preconditioner_type, preconditioner_p_type
40 : PUBLIC :: init_preconditioner
41 : PUBLIC :: preconditioner_in_use
42 : PUBLIC :: destroy_preconditioner
43 :
44 : ! **************************************************************************************************
45 : TYPE preconditioner_type
46 : ! PRIVATE
47 : TYPE(dbcsr_type), POINTER :: sparse_matrix => NULL()
48 : TYPE(cp_fm_type), POINTER :: fm => NULL()
49 : TYPE(cp_cfm_type), POINTER :: complex_fm => NULL()
50 : LOGICAL :: owns_complex_fm = .TRUE.
51 : TYPE(cp_fm_type), POINTER :: base_fm => NULL()
52 : TYPE(dbcsr_type), POINTER :: dbcsr_matrix => NULL()
53 : TYPE(dbcsr_type), POINTER :: base_dbcsr_matrix => NULL()
54 : TYPE(dbcsr_type), POINTER :: max_ev_vector => NULL()
55 : TYPE(dbcsr_type), POINTER :: min_ev_vector => NULL()
56 : TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
57 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
58 : TYPE(cp_blacs_env_type), POINTER :: ctxt => NULL()
59 : INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
60 : REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
61 : REAL(KIND=dp) :: energy_gap = -1.0_dp
62 : REAL(KIND=dp) :: condition_num = -1.0_dp
63 : INTEGER :: polynomial_degree = 8
64 : REAL(KIND=dp) :: polynomial_min = -1.0_dp, polynomial_max = -1.0_dp
65 : INTEGER :: spectral_rank = 0
66 : REAL(KIND=dp) :: spectral_reference = 0.0_dp, spectral_window = 1.0_dp, &
67 : spectral_base_scale = 1.0_dp
68 : INTEGER :: low_rank_base = ot_low_rank_base_overlap
69 : INTEGER, DIMENSION(3) :: lattice_dims = [1, 1, 1]
70 : INTEGER :: lattice_block_size = 0
71 : REAL(KIND=dp) :: lattice_projection_error = 0.0_dp
72 : COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: lattice_inverse_k
73 : END TYPE preconditioner_type
74 :
75 : ! **************************************************************************************************
76 : TYPE preconditioner_p_type
77 : TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
78 : END TYPE preconditioner_p_type
79 :
80 : CONTAINS
81 :
82 : ! **************************************************************************************************
83 :
84 : ! **************************************************************************************************
85 : !> \brief ...
86 : !> \param preconditioner ...
87 : !> \return ...
88 : ! **************************************************************************************************
89 446 : FUNCTION preconditioner_in_use(preconditioner)
90 : TYPE(preconditioner_type) :: preconditioner
91 : LOGICAL :: preconditioner_in_use
92 :
93 446 : preconditioner_in_use = .NOT. (preconditioner%in_use == 0)
94 446 : END FUNCTION preconditioner_in_use
95 :
96 : ! **************************************************************************************************
97 : !> \brief ...
98 : !> \param preconditioner_env ...
99 : !> \param para_env ...
100 : !> \param blacs_env ...
101 : ! **************************************************************************************************
102 7554 : SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
103 :
104 : TYPE(preconditioner_type) :: preconditioner_env
105 : TYPE(mp_para_env_type), POINTER :: para_env
106 : TYPE(cp_blacs_env_type), POINTER :: blacs_env
107 :
108 7554 : NULLIFY (preconditioner_env%sparse_matrix)
109 7554 : NULLIFY (preconditioner_env%fm)
110 7554 : NULLIFY (preconditioner_env%complex_fm)
111 7554 : preconditioner_env%owns_complex_fm = .TRUE.
112 7554 : NULLIFY (preconditioner_env%base_fm)
113 7554 : NULLIFY (preconditioner_env%dbcsr_matrix)
114 7554 : NULLIFY (preconditioner_env%base_dbcsr_matrix)
115 7554 : NULLIFY (preconditioner_env%occ_evals)
116 7554 : NULLIFY (preconditioner_env%full_evals)
117 7554 : NULLIFY (preconditioner_env%inverse_history)
118 7554 : NULLIFY (preconditioner_env%max_ev_vector)
119 7554 : NULLIFY (preconditioner_env%min_ev_vector)
120 7554 : preconditioner_env%solver = ot_precond_solver_default
121 7554 : preconditioner_env%para_env => para_env
122 7554 : preconditioner_env%ctxt => blacs_env
123 : !inverse is used for filtering in update set it to something huge to
124 : ! avoid filtering if the information is not available
125 7554 : preconditioner_env%condition_num = -1.0_dp
126 7554 : preconditioner_env%polynomial_degree = 8
127 7554 : preconditioner_env%polynomial_min = -1.0_dp
128 7554 : preconditioner_env%polynomial_max = -1.0_dp
129 7554 : preconditioner_env%spectral_rank = 0
130 7554 : preconditioner_env%spectral_reference = 0.0_dp
131 7554 : preconditioner_env%spectral_window = 1.0_dp
132 7554 : preconditioner_env%spectral_base_scale = 1.0_dp
133 7554 : preconditioner_env%low_rank_base = ot_low_rank_base_overlap
134 30216 : preconditioner_env%lattice_dims = [1, 1, 1]
135 7554 : preconditioner_env%lattice_block_size = 0
136 7554 : preconditioner_env%lattice_projection_error = 0.0_dp
137 7554 : preconditioner_env%ihistory = 0
138 :
139 7554 : CALL preconditioner_env%para_env%retain()
140 7554 : CALL preconditioner_env%ctxt%retain()
141 :
142 7554 : END SUBROUTINE init_preconditioner
143 :
144 : ! **************************************************************************************************
145 : !> \brief ...
146 : !> \param preconditioner_env ...
147 : ! **************************************************************************************************
148 7554 : SUBROUTINE destroy_preconditioner(preconditioner_env)
149 :
150 : TYPE(preconditioner_type) :: preconditioner_env
151 :
152 : CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner'
153 :
154 : INTEGER :: handle, i
155 :
156 7554 : CALL timeset(routineN, handle)
157 :
158 7554 : IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
159 2 : CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
160 2 : NULLIFY (preconditioner_env%sparse_matrix)
161 : END IF
162 :
163 7554 : IF (ASSOCIATED(preconditioner_env%fm)) THEN
164 1732 : CALL cp_fm_release(preconditioner_env%fm)
165 1732 : DEALLOCATE (preconditioner_env%fm)
166 : NULLIFY (preconditioner_env%fm)
167 : END IF
168 7554 : IF (preconditioner_env%owns_complex_fm) THEN
169 7544 : IF (ASSOCIATED(preconditioner_env%complex_fm)) THEN
170 460 : CALL cp_cfm_release(preconditioner_env%complex_fm)
171 460 : DEALLOCATE (preconditioner_env%complex_fm)
172 : END IF
173 : END IF
174 7554 : NULLIFY (preconditioner_env%complex_fm)
175 7554 : preconditioner_env%owns_complex_fm = .TRUE.
176 7554 : IF (ASSOCIATED(preconditioner_env%base_fm)) THEN
177 0 : CALL cp_fm_release(preconditioner_env%base_fm)
178 0 : DEALLOCATE (preconditioner_env%base_fm)
179 : NULLIFY (preconditioner_env%base_fm)
180 : END IF
181 7554 : IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
182 4784 : CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
183 : END IF
184 7554 : IF (ASSOCIATED(preconditioner_env%base_dbcsr_matrix)) THEN
185 2 : CALL dbcsr_release_p(preconditioner_env%base_dbcsr_matrix)
186 : END IF
187 7554 : IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
188 2057 : CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
189 : END IF
190 7554 : IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
191 2057 : CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
192 : END IF
193 7554 : IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
194 3918 : DEALLOCATE (preconditioner_env%occ_evals)
195 : END IF
196 7554 : IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
197 3918 : DEALLOCATE (preconditioner_env%full_evals)
198 : END IF
199 7554 : IF (ALLOCATED(preconditioner_env%lattice_inverse_k)) THEN
200 2 : DEALLOCATE (preconditioner_env%lattice_inverse_k)
201 : END IF
202 7554 : IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
203 0 : DO i = 1, SIZE(preconditioner_env%inverse_history)
204 0 : CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
205 : END DO
206 0 : DEALLOCATE (preconditioner_env%inverse_history)
207 : END IF
208 7554 : CALL mp_para_env_release(preconditioner_env%para_env)
209 7554 : CALL cp_blacs_env_release(preconditioner_env%ctxt)
210 :
211 7554 : preconditioner_env%in_use = 0
212 7554 : preconditioner_env%cholesky_use = cholesky_reduce
213 :
214 7554 : CALL timestop(handle)
215 :
216 7554 : END SUBROUTINE destroy_preconditioner
217 :
218 0 : END MODULE preconditioner_types
|