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