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 needed for a for a Energy Correction
10 : !> \par History
11 : !> 2019.09 created
12 : !> \author JGH
13 : ! **************************************************************************************************
14 : MODULE ec_env_types
15 : USE cp_dbcsr_api, ONLY: dbcsr_p_type
16 : USE cp_dbcsr_operations, ONLY: dbcsr_deallocate_matrix_set
17 : USE cp_fm_types, ONLY: cp_fm_release,&
18 : cp_fm_type
19 : USE dm_ls_scf_types, ONLY: ls_scf_env_type,&
20 : ls_scf_release
21 : USE hfx_types, ONLY: hfx_release,&
22 : hfx_type
23 : USE input_section_types, ONLY: section_vals_release,&
24 : section_vals_type
25 : USE kinds, ONLY: dp
26 : USE kpoint_types, ONLY: kpoint_release,&
27 : kpoint_type
28 : USE pw_types, ONLY: pw_r3d_rs_type
29 : USE qs_dispersion_types, ONLY: qs_dispersion_release,&
30 : qs_dispersion_type
31 : USE qs_force_types, ONLY: deallocate_qs_force,&
32 : qs_force_type
33 : USE qs_local_rho_types, ONLY: local_rho_set_release,&
34 : local_rho_type
35 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type,&
36 : release_neighbor_list_sets
37 : USE qs_oce_types, ONLY: deallocate_oce_set,&
38 : oce_matrix_type
39 : USE qs_p_env_types, ONLY: p_env_release,&
40 : qs_p_env_type
41 : USE qs_period_efield_types, ONLY: efield_berry_release,&
42 : efield_berry_type
43 : USE scf_control_types, ONLY: smear_type
44 : USE task_list_types, ONLY: deallocate_task_list,&
45 : task_list_type
46 : #include "./base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 :
50 : PRIVATE
51 :
52 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ec_env_types'
53 :
54 : PUBLIC :: energy_correction_type, ec_env_release
55 : PUBLIC :: ec_env_matrix_release, ec_env_potential_release
56 :
57 : ! *****************************************************************************
58 : !> \brief Contains information on the energy correction functional for KG
59 : !> \par History
60 : !> 03.2014 created
61 : !> \author JGH
62 : ! *****************************************************************************
63 : TYPE energy_correction_type
64 : CHARACTER(len=20) :: ec_name = ""
65 : INTEGER :: energy_functional = 0
66 : INTEGER :: ks_solver = 0
67 : INTEGER :: factorization = 0
68 : INTEGER :: ec_initial_guess = 0
69 : REAL(KIND=dp) :: eps_default = 0.0_dp
70 : LOGICAL :: do_ec_admm = .FALSE.
71 : LOGICAL :: do_ec_hfx = .FALSE.
72 : LOGICAL :: should_update = .FALSE.
73 : LOGICAL :: use_ls_solver = .FALSE.
74 : LOGICAL :: reuse_hfx = .FALSE.
75 : LOGICAL :: basis_inconsistent = .FALSE.
76 : ! debug
77 : LOGICAL :: debug_forces = .FALSE.
78 : LOGICAL :: debug_stress = .FALSE.
79 : LOGICAL :: debug_external = .FALSE.
80 : REAL(KIND=dp) :: orbrot_index = 0.0_dp
81 : REAL(KIND=dp) :: phase_index = 0.0_dp
82 : ! basis set
83 : CHARACTER(len=20) :: basis = ""
84 : LOGICAL :: mao = .FALSE.
85 : ! Skip EC calculation if ground-state didnt converge
86 : LOGICAL :: do_skip = .FALSE., skip_ec = .FALSE.
87 : ! MAO basis
88 : INTEGER :: mao_max_iter = 0
89 : REAL(KIND=dp) :: mao_eps_grad = 0.0_dp
90 : REAL(KIND=dp) :: mao_eps1 = 0.0_dp
91 : INTEGER :: mao_iolevel = 0
92 : !
93 : TYPE(smear_type) :: smear
94 : ! energy components
95 : REAL(KIND=dp) :: etotal = 0.0_dp, old_etotal = 0.0_dp
96 : REAL(KIND=dp) :: eband = 0.0_dp, ecore = 0.0_dp, exc = 0.0_dp, &
97 : ehartree = 0.0_dp, vhxc = 0.0_dp
98 : REAL(KIND=dp) :: edispersion = 0.0_dp, efield_elec = 0.0_dp, &
99 : efield_nuclear = 0.0_dp, ex = 0.0_dp, exc_aux_fit = 0.0_dp
100 : REAL(KIND=dp) :: exc1 = 0.0_dp, exc1_aux_fit = 0.0_dp, ehartree_1c = 0.0_dp
101 : REAL(KIND=dp) :: ekTS = 0.0_dp
102 : ! forces
103 : TYPE(qs_force_type), DIMENSION(:), POINTER :: force => Null()
104 : ! full neighbor lists and corresponding task list
105 : TYPE(neighbor_list_set_p_type), &
106 : DIMENSION(:), POINTER :: sab_orb => Null(), sac_ppl => Null(), &
107 : sac_ae => Null(), sap_ppnl => Null(), &
108 : sab_kp => Null(), sab_kp_nosym => Null(), &
109 : sap_oce => Null()
110 : TYPE(task_list_type), POINTER :: task_list => Null()
111 : TYPE(task_list_type), POINTER :: task_list_soft => Null()
112 : ! the XC function to be used for the correction, dispersion info
113 : TYPE(section_vals_type), POINTER :: xc_section => Null()
114 : TYPE(qs_dispersion_type), POINTER :: dispersion_env => Null()
115 : ! kpoint information
116 : LOGICAL :: do_kpoints = .FALSE.
117 : TYPE(kpoint_type), POINTER :: kpoints => Null()
118 : ! matrices in complete basis
119 : ! KS: Kohn-Sham; H: Core; S: overlap; T: kinetic energy;
120 : ! P: Harris density, W: Harris energy weighted density
121 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks => Null(), &
122 : matrix_h => Null(), &
123 : matrix_s => Null(), &
124 : matrix_t => Null(), &
125 : matrix_p => Null(), &
126 : matrix_w => Null()
127 : ! GAPW
128 : TYPE(local_rho_type), POINTER :: local_rho_set => NULL()
129 : TYPE(local_rho_type), POINTER :: local_rho_set_admm => NULL()
130 : TYPE(oce_matrix_type), POINTER :: oce => NULL()
131 : ! reduce basis
132 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mao_coef => Null()
133 : ! external energy calclulation
134 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mo_occ => NULL()
135 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: cpmos => NULL()
136 : ! CP equations
137 : TYPE(qs_p_env_type), POINTER :: p_env => Null()
138 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz => Null(), matrix_wz => Null(), &
139 : matrix_z => Null(), z_admm => Null()
140 : ! Harris (rhoout), and response density (rhoz) on grid
141 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rhoout_r => Null(), &
142 : rhoz_r => Null()
143 : ! potentials from input density
144 : TYPE(pw_r3d_rs_type) :: vh_rspace = pw_r3d_rs_type()
145 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc_rspace => Null(), &
146 : vtau_rspace => Null(), &
147 : vadmm_rspace => Null()
148 : ! efield
149 : TYPE(efield_berry_type), POINTER :: efield => NULL()
150 : ! LS matrices and types
151 : TYPE(ls_scf_env_type), POINTER :: ls_env => Null()
152 : ! Environment for Hartree-Fock exchange
153 : TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data => Null()
154 : ! ADMM XC environments
155 : TYPE(section_vals_type), POINTER :: xc_section_primary => Null(), &
156 : xc_section_aux => Null()
157 : ! External
158 : CHARACTER(len=40) :: exresp_fn = ""
159 : CHARACTER(len=40) :: exresperr_fn = ""
160 : CHARACTER(len=40) :: exresult_fn = ""
161 : LOGICAL :: do_error = .FALSE.
162 : CHARACTER(len=1) :: error_method = "E"
163 : REAL(KIND=dp) :: error_cutoff = 0.0_dp
164 : INTEGER :: error_subspace = 0
165 : REAL(KIND=dp), DIMENSION(3, 3) :: rpv = 0.0_dp
166 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: rf => NULL()
167 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: cpref => NULL()
168 : END TYPE energy_correction_type
169 :
170 : CONTAINS
171 :
172 : ! **************************************************************************************************
173 : !> \brief ...
174 : !> \param ec_env ...
175 : ! **************************************************************************************************
176 7704 : SUBROUTINE ec_env_release(ec_env)
177 : TYPE(energy_correction_type), POINTER :: ec_env
178 :
179 : CHARACTER(LEN=*), PARAMETER :: routineN = 'ec_env_release'
180 :
181 : INTEGER :: handle
182 :
183 7704 : CALL timeset(routineN, handle)
184 :
185 7704 : IF (ASSOCIATED(ec_env)) THEN
186 : ! neighbor lists
187 7704 : CALL release_neighbor_list_sets(ec_env%sab_orb)
188 7704 : CALL release_neighbor_list_sets(ec_env%sac_ppl)
189 7704 : CALL release_neighbor_list_sets(ec_env%sac_ae)
190 7704 : CALL release_neighbor_list_sets(ec_env%sap_ppnl)
191 7704 : CALL release_neighbor_list_sets(ec_env%sab_kp)
192 7704 : CALL release_neighbor_list_sets(ec_env%sab_kp_nosym)
193 7704 : CALL release_neighbor_list_sets(ec_env%sap_oce)
194 : ! forces
195 7704 : IF (ASSOCIATED(ec_env%force)) CALL deallocate_qs_force(ec_env%force)
196 : ! operator matrices
197 7704 : IF (ASSOCIATED(ec_env%matrix_ks)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_ks)
198 7704 : IF (ASSOCIATED(ec_env%matrix_h)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_h)
199 7704 : IF (ASSOCIATED(ec_env%matrix_s)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_s)
200 7704 : IF (ASSOCIATED(ec_env%matrix_t)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_t)
201 7704 : IF (ASSOCIATED(ec_env%matrix_p)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_p)
202 7704 : IF (ASSOCIATED(ec_env%matrix_w)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_w)
203 : ! GAPW
204 7704 : IF (ASSOCIATED(ec_env%oce)) CALL deallocate_oce_set(ec_env%oce)
205 : ! task lists for collocate/integrate
206 7704 : IF (ASSOCIATED(ec_env%task_list)) THEN
207 286 : CALL deallocate_task_list(ec_env%task_list)
208 : END IF
209 7704 : IF (ASSOCIATED(ec_env%task_list_soft)) THEN
210 50 : CALL deallocate_task_list(ec_env%task_list_soft)
211 : END IF
212 : ! reduced basis
213 7704 : IF (ASSOCIATED(ec_env%mao_coef)) CALL dbcsr_deallocate_matrix_set(ec_env%mao_coef)
214 : ! dispersion environment
215 7704 : IF (ASSOCIATED(ec_env%dispersion_env)) THEN
216 286 : CALL qs_dispersion_release(ec_env%dispersion_env)
217 : END IF
218 :
219 7704 : CALL ec_env_matrix_release(ec_env)
220 :
221 : ! kpoints
222 7704 : CALL kpoint_release(ec_env%kpoints)
223 :
224 7704 : IF (ASSOCIATED(ec_env%p_env)) THEN
225 266 : CALL p_env_release(ec_env%p_env)
226 266 : DEALLOCATE (ec_env%p_env)
227 : END IF
228 : ! potential
229 7704 : CALL ec_env_potential_release(ec_env)
230 : !
231 7704 : CALL efield_berry_release(ec_env%efield)
232 :
233 7704 : IF (ASSOCIATED(ec_env%ls_env)) THEN
234 22 : CALL ls_scf_release(ec_env%ls_env)
235 : END IF
236 :
237 7704 : IF (.NOT. ec_env%reuse_hfx) THEN
238 7688 : IF (ASSOCIATED(ec_env%x_data)) CALL hfx_release(ec_env%x_data)
239 : END IF
240 :
241 7704 : IF (ASSOCIATED(ec_env%xc_section_aux)) CALL section_vals_release(ec_env%xc_section_aux)
242 7704 : IF (ASSOCIATED(ec_env%xc_section_primary)) CALL section_vals_release(ec_env%xc_section_primary)
243 :
244 7704 : CALL cp_fm_release(ec_env%mo_occ)
245 7704 : CALL cp_fm_release(ec_env%cpmos)
246 7704 : CALL cp_fm_release(ec_env%cpref)
247 :
248 7704 : IF (ASSOCIATED(ec_env%rf)) THEN
249 16 : DEALLOCATE (ec_env%rf)
250 : END IF
251 :
252 7704 : DEALLOCATE (ec_env)
253 :
254 : END IF
255 :
256 7704 : NULLIFY (ec_env)
257 :
258 7704 : CALL timestop(handle)
259 :
260 7704 : END SUBROUTINE ec_env_release
261 :
262 : ! **************************************************************************************************
263 : !> \brief ...
264 : !> \param ec_env ...
265 : ! **************************************************************************************************
266 7704 : SUBROUTINE ec_env_matrix_release(ec_env)
267 : TYPE(energy_correction_type), POINTER :: ec_env
268 :
269 7704 : IF (ASSOCIATED(ec_env)) THEN
270 7704 : IF (ASSOCIATED(ec_env%matrix_hz)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_hz)
271 7704 : NULLIFY (ec_env%matrix_hz)
272 7704 : IF (ASSOCIATED(ec_env%matrix_wz)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_wz)
273 7704 : NULLIFY (ec_env%matrix_wz)
274 7704 : IF (ASSOCIATED(ec_env%matrix_z)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_z)
275 7704 : NULLIFY (ec_env%matrix_z)
276 7704 : IF (ASSOCIATED(ec_env%z_admm)) CALL dbcsr_deallocate_matrix_set(ec_env%z_admm)
277 7704 : NULLIFY (ec_env%z_admm)
278 : END IF
279 :
280 7704 : END SUBROUTINE ec_env_matrix_release
281 :
282 : ! **************************************************************************************************
283 : !> \brief ...
284 : !> \param ec_env ...
285 : ! **************************************************************************************************
286 8380 : SUBROUTINE ec_env_potential_release(ec_env)
287 : TYPE(energy_correction_type), POINTER :: ec_env
288 :
289 : INTEGER :: iab
290 :
291 8380 : IF (ASSOCIATED(ec_env)) THEN
292 8380 : IF (ASSOCIATED(ec_env%vh_rspace%pw_grid)) THEN
293 676 : CALL ec_env%vh_rspace%release()
294 : END IF
295 8380 : IF (ASSOCIATED(ec_env%vxc_rspace)) THEN
296 1358 : DO iab = 1, SIZE(ec_env%vxc_rspace)
297 1358 : CALL ec_env%vxc_rspace(iab)%release()
298 : END DO
299 676 : DEALLOCATE (ec_env%vxc_rspace)
300 676 : NULLIFY (ec_env%vxc_rspace)
301 : END IF
302 8380 : IF (ASSOCIATED(ec_env%vtau_rspace)) THEN
303 64 : DO iab = 1, SIZE(ec_env%vtau_rspace)
304 64 : CALL ec_env%vtau_rspace(iab)%release()
305 : END DO
306 32 : DEALLOCATE (ec_env%vtau_rspace)
307 32 : NULLIFY (ec_env%vtau_rspace)
308 : END IF
309 8380 : IF (ASSOCIATED(ec_env%vadmm_rspace)) THEN
310 124 : DO iab = 1, SIZE(ec_env%vadmm_rspace)
311 124 : CALL ec_env%vadmm_rspace(iab)%release()
312 : END DO
313 62 : DEALLOCATE (ec_env%vadmm_rspace)
314 62 : NULLIFY (ec_env%vadmm_rspace)
315 : END IF
316 8380 : IF (ASSOCIATED(ec_env%local_rho_set)) THEN
317 146 : CALL local_rho_set_release(ec_env%local_rho_set)
318 146 : NULLIFY (ec_env%local_rho_set)
319 : END IF
320 8380 : IF (ASSOCIATED(ec_env%local_rho_set_admm)) THEN
321 30 : CALL local_rho_set_release(ec_env%local_rho_set_admm)
322 30 : NULLIFY (ec_env%local_rho_set_admm)
323 : END IF
324 : END IF
325 :
326 8380 : END SUBROUTINE ec_env_potential_release
327 :
328 0 : END MODULE ec_env_types
|