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_precond_solver_default
27 : USE kinds, ONLY: dp
28 : USE message_passing, ONLY: mp_para_env_release,&
29 : mp_para_env_type
30 : #include "./base/base_uses.f90"
31 :
32 : IMPLICIT NONE
33 :
34 : PRIVATE
35 :
36 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
37 :
38 : PUBLIC :: preconditioner_type, preconditioner_p_type
39 : PUBLIC :: init_preconditioner
40 : PUBLIC :: preconditioner_in_use
41 : PUBLIC :: destroy_preconditioner
42 :
43 : ! **************************************************************************************************
44 : TYPE preconditioner_type
45 : ! PRIVATE
46 : TYPE(dbcsr_type), POINTER :: sparse_matrix => NULL()
47 : TYPE(cp_fm_type), POINTER :: fm => NULL()
48 : TYPE(cp_cfm_type), POINTER :: complex_fm => NULL()
49 : LOGICAL :: owns_complex_fm = .TRUE.
50 : TYPE(dbcsr_type), POINTER :: dbcsr_matrix => NULL()
51 : TYPE(dbcsr_type), POINTER :: max_ev_vector => NULL()
52 : TYPE(dbcsr_type), POINTER :: min_ev_vector => NULL()
53 : TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
54 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
55 : TYPE(cp_blacs_env_type), POINTER :: ctxt => NULL()
56 : INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
57 : REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
58 : REAL(KIND=dp) :: energy_gap = -1.0_dp
59 : REAL(KIND=dp) :: condition_num = -1.0_dp
60 : INTEGER :: polynomial_degree = 8
61 : REAL(KIND=dp) :: polynomial_min = -1.0_dp, polynomial_max = -1.0_dp
62 : END TYPE preconditioner_type
63 :
64 : ! **************************************************************************************************
65 : TYPE preconditioner_p_type
66 : TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
67 : END TYPE preconditioner_p_type
68 :
69 : CONTAINS
70 :
71 : ! **************************************************************************************************
72 :
73 : ! **************************************************************************************************
74 : !> \brief ...
75 : !> \param preconditioner ...
76 : !> \return ...
77 : ! **************************************************************************************************
78 446 : FUNCTION preconditioner_in_use(preconditioner)
79 : TYPE(preconditioner_type) :: preconditioner
80 : LOGICAL :: preconditioner_in_use
81 :
82 446 : preconditioner_in_use = .NOT. (preconditioner%in_use == 0)
83 446 : END FUNCTION preconditioner_in_use
84 :
85 : ! **************************************************************************************************
86 : !> \brief ...
87 : !> \param preconditioner_env ...
88 : !> \param para_env ...
89 : !> \param blacs_env ...
90 : ! **************************************************************************************************
91 7444 : SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
92 :
93 : TYPE(preconditioner_type) :: preconditioner_env
94 : TYPE(mp_para_env_type), POINTER :: para_env
95 : TYPE(cp_blacs_env_type), POINTER :: blacs_env
96 :
97 7444 : NULLIFY (preconditioner_env%sparse_matrix)
98 7444 : NULLIFY (preconditioner_env%fm)
99 7444 : NULLIFY (preconditioner_env%complex_fm)
100 7444 : preconditioner_env%owns_complex_fm = .TRUE.
101 7444 : NULLIFY (preconditioner_env%dbcsr_matrix)
102 7444 : NULLIFY (preconditioner_env%occ_evals)
103 7444 : NULLIFY (preconditioner_env%full_evals)
104 7444 : NULLIFY (preconditioner_env%inverse_history)
105 7444 : NULLIFY (preconditioner_env%max_ev_vector)
106 7444 : NULLIFY (preconditioner_env%min_ev_vector)
107 7444 : preconditioner_env%solver = ot_precond_solver_default
108 7444 : preconditioner_env%para_env => para_env
109 7444 : preconditioner_env%ctxt => blacs_env
110 : !inverse is used for filtering in update set it to something huge to
111 : ! avoid filtering if the information is not available
112 7444 : preconditioner_env%condition_num = -1.0_dp
113 7444 : preconditioner_env%polynomial_degree = 8
114 7444 : preconditioner_env%polynomial_min = -1.0_dp
115 7444 : preconditioner_env%polynomial_max = -1.0_dp
116 7444 : preconditioner_env%ihistory = 0
117 :
118 7444 : CALL preconditioner_env%para_env%retain()
119 7444 : CALL preconditioner_env%ctxt%retain()
120 :
121 7444 : END SUBROUTINE init_preconditioner
122 :
123 : ! **************************************************************************************************
124 : !> \brief ...
125 : !> \param preconditioner_env ...
126 : ! **************************************************************************************************
127 7444 : SUBROUTINE destroy_preconditioner(preconditioner_env)
128 :
129 : TYPE(preconditioner_type) :: preconditioner_env
130 :
131 : CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner'
132 :
133 : INTEGER :: handle, i
134 :
135 7444 : CALL timeset(routineN, handle)
136 :
137 7444 : IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
138 2 : CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
139 2 : NULLIFY (preconditioner_env%sparse_matrix)
140 : END IF
141 :
142 7444 : IF (ASSOCIATED(preconditioner_env%fm)) THEN
143 1676 : CALL cp_fm_release(preconditioner_env%fm)
144 1676 : DEALLOCATE (preconditioner_env%fm)
145 : NULLIFY (preconditioner_env%fm)
146 : END IF
147 7444 : IF (preconditioner_env%owns_complex_fm) THEN
148 7434 : IF (ASSOCIATED(preconditioner_env%complex_fm)) THEN
149 458 : CALL cp_cfm_release(preconditioner_env%complex_fm)
150 458 : DEALLOCATE (preconditioner_env%complex_fm)
151 : END IF
152 : END IF
153 7444 : NULLIFY (preconditioner_env%complex_fm)
154 7444 : preconditioner_env%owns_complex_fm = .TRUE.
155 7444 : IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
156 4732 : CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
157 : END IF
158 7444 : IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
159 2001 : CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
160 : END IF
161 7444 : IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
162 2001 : CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
163 : END IF
164 7444 : IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
165 3866 : DEALLOCATE (preconditioner_env%occ_evals)
166 : END IF
167 7444 : IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
168 3866 : DEALLOCATE (preconditioner_env%full_evals)
169 : END IF
170 7444 : IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
171 0 : DO i = 1, SIZE(preconditioner_env%inverse_history)
172 0 : CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
173 : END DO
174 0 : DEALLOCATE (preconditioner_env%inverse_history)
175 : END IF
176 7444 : CALL mp_para_env_release(preconditioner_env%para_env)
177 7444 : CALL cp_blacs_env_release(preconditioner_env%ctxt)
178 :
179 7444 : preconditioner_env%in_use = 0
180 7444 : preconditioner_env%cholesky_use = cholesky_reduce
181 :
182 7444 : CALL timestop(handle)
183 :
184 7444 : END SUBROUTINE destroy_preconditioner
185 :
186 0 : END MODULE preconditioner_types
|