66 LOGICAL :: owns_complex_fm = .true.
70 TYPE(
dbcsr_type),
POINTER :: occ_rotation_dbcsr => null()
73 TYPE(
dbcsr_p_type),
POINTER,
DIMENSION(:) :: inverse_history => 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
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
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)
158 preconditioner_env%para_env => para_env
159 preconditioner_env%ctxt => blacs_env
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
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
183 CALL preconditioner_env%para_env%retain()
184 CALL preconditioner_env%ctxt%retain()
196 CHARACTER(len=*),
PARAMETER :: routinen =
'destroy_preconditioner'
200 CALL timeset(routinen, handle)
202 IF (
ASSOCIATED(preconditioner_env%sparse_matrix))
THEN
204 NULLIFY (preconditioner_env%sparse_matrix)
207 IF (
ASSOCIATED(preconditioner_env%fm))
THEN
209 DEALLOCATE (preconditioner_env%fm)
210 NULLIFY (preconditioner_env%fm)
212 IF (preconditioner_env%owns_complex_fm)
THEN
213 IF (
ASSOCIATED(preconditioner_env%complex_fm))
THEN
215 DEALLOCATE (preconditioner_env%complex_fm)
218 NULLIFY (preconditioner_env%complex_fm)
219 preconditioner_env%owns_complex_fm = .true.
220 IF (
ASSOCIATED(preconditioner_env%occ_rotation_complex))
THEN
222 DEALLOCATE (preconditioner_env%occ_rotation_complex)
223 NULLIFY (preconditioner_env%occ_rotation_complex)
225 IF (
ASSOCIATED(preconditioner_env%base_fm))
THEN
227 DEALLOCATE (preconditioner_env%base_fm)
228 NULLIFY (preconditioner_env%base_fm)
230 IF (
ASSOCIATED(preconditioner_env%dbcsr_matrix))
THEN
233 IF (
ASSOCIATED(preconditioner_env%base_dbcsr_matrix))
THEN
236 IF (
ASSOCIATED(preconditioner_env%occ_rotation_dbcsr))
THEN
239 IF (
ASSOCIATED(preconditioner_env%occ_rotation))
THEN
241 DEALLOCATE (preconditioner_env%occ_rotation)
242 NULLIFY (preconditioner_env%occ_rotation)
244 IF (
ASSOCIATED(preconditioner_env%max_ev_vector))
THEN
247 IF (
ASSOCIATED(preconditioner_env%min_ev_vector))
THEN
250 IF (
ASSOCIATED(preconditioner_env%occ_evals))
THEN
251 DEALLOCATE (preconditioner_env%occ_evals)
253 IF (
ASSOCIATED(preconditioner_env%full_evals))
THEN
254 DEALLOCATE (preconditioner_env%full_evals)
256 IF (
ALLOCATED(preconditioner_env%lattice_inverse_k))
THEN
257 DEALLOCATE (preconditioner_env%lattice_inverse_k)
259 IF (
ALLOCATED(preconditioner_env%lattice_state_inverse_k))
THEN
260 DEALLOCATE (preconditioner_env%lattice_state_inverse_k)
262 IF (
ALLOCATED(preconditioner_env%lattice_occ_vectors))
THEN
263 DEALLOCATE (preconditioner_env%lattice_occ_vectors)
265 IF (
ALLOCATED(preconditioner_env%lattice_occ_dual))
THEN
266 DEALLOCATE (preconditioner_env%lattice_occ_dual)
268 IF (
ALLOCATED(preconditioner_env%lattice_local_indices))
THEN
269 DEALLOCATE (preconditioner_env%lattice_local_indices)
271 IF (
ALLOCATED(preconditioner_env%lattice_local_operator))
THEN
272 DEALLOCATE (preconditioner_env%lattice_local_operator)
274 IF (
ALLOCATED(preconditioner_env%lattice_local_coarse_inverse))
THEN
275 DEALLOCATE (preconditioner_env%lattice_local_coarse_inverse)
277 IF (
ALLOCATED(preconditioner_env%lattice_state_local_indices))
THEN
278 DEALLOCATE (preconditioner_env%lattice_state_local_indices)
280 IF (
ALLOCATED(preconditioner_env%lattice_state_local_operator))
THEN
281 DEALLOCATE (preconditioner_env%lattice_state_local_operator)
283 IF (
ALLOCATED(preconditioner_env%lattice_state_local_coarse_inverse))
THEN
284 DEALLOCATE (preconditioner_env%lattice_state_local_coarse_inverse)
287 IF (
ASSOCIATED(preconditioner_env%inverse_history))
THEN
288 DO i = 1,
SIZE(preconditioner_env%inverse_history)
291 DEALLOCATE (preconditioner_env%inverse_history)
296 preconditioner_env%in_use = 0
299 CALL timestop(handle)
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