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 for excited states potential energies
10 : !> \par History
11 : !> 2020.01 created
12 : !> \author JGH
13 : ! **************************************************************************************************
14 : MODULE exstates_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 input_constants, ONLY: xc_kernel_method_best
20 : USE input_section_types, ONLY: section_vals_type,&
21 : section_vals_val_get
22 : USE kinds, ONLY: dp
23 : USE pw_types, ONLY: pw_r3d_rs_type
24 : USE qs_local_rho_types, ONLY: local_rho_set_release,&
25 : local_rho_type
26 : #include "./base/base_uses.f90"
27 :
28 : IMPLICIT NONE
29 :
30 : PRIVATE
31 :
32 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'exstates_types'
33 :
34 : PUBLIC :: excited_energy_type, exstate_release, exstate_create
35 : PUBLIC :: exstate_matrix_release, exstate_potential_release
36 : PUBLIC :: wfn_history_type
37 :
38 : ! *****************************************************************************
39 :
40 : TYPE wfn_history_type
41 : INTEGER :: state = -1
42 : REAL(KIND=dp) :: evalue = 0.0_dp
43 : TYPE(cp_fm_type), POINTER, DIMENSION(:) :: evect => NULL()
44 : TYPE(cp_fm_type), POINTER, DIMENSION(:) :: cpmos => NULL()
45 : REAL(KIND=dp) :: xsval = 0.0_dp, gsval = 0.0_dp, gsmin = 0.0_dp
46 : END TYPE wfn_history_type
47 :
48 : ! *****************************************************************************
49 : !> \brief Contains information on the excited states energy
50 : !> \par History
51 : !> 01.2020 created
52 : !> \author JGH
53 : ! *****************************************************************************
54 : TYPE excited_energy_type
55 : INTEGER :: state = -1
56 : REAL(KIND=dp) :: evalue = 0.0_dp
57 : INTEGER :: xc_kernel_method = -1
58 : REAL(KIND=dp) :: eps_delta_rho = 1.E-02_dp
59 : INTEGER :: diff_order = -1
60 : LOGICAL :: debug_forces = .FALSE.
61 : TYPE(cp_fm_type), POINTER, DIMENSION(:) :: evect => NULL()
62 : TYPE(cp_fm_type), POINTER, DIMENSION(:) :: cpmos => NULL()
63 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe => NULL()
64 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz => NULL()
65 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe_admm => NULL()
66 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_px1 => NULL()
67 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_px1_admm => NULL()
68 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_px1_asymm => NULL()
69 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_px1_admm_asymm => NULL()
70 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_wx1 => NULL()
71 : TYPE(pw_r3d_rs_type) :: vh_rspace = pw_r3d_rs_type()
72 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc_rspace => NULL()
73 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vtau_rspace => NULL()
74 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vadmm_rspace => NULL()
75 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vadmm_tau_rspace => NULL()
76 : TYPE(local_rho_type), POINTER :: local_rho_set => NULL()
77 : TYPE(local_rho_type), POINTER :: local_rho_set_admm => NULL()
78 : TYPE(wfn_history_type) :: wfn_history = wfn_history_type()
79 : TYPE(cp_fm_type), POINTER, DIMENSION(:, :) :: bse_w_matrix_MO => NULL()
80 : TYPE(cp_fm_type), POINTER, DIMENSION(:, :) :: bse_a_matrix_MO => NULL()
81 : REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: gw_eigen
82 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks => NULL()
83 : END TYPE excited_energy_type
84 :
85 : CONTAINS
86 :
87 : ! **************************************************************************************************
88 : !> \brief ...
89 : !> \param ex_env ...
90 : ! **************************************************************************************************
91 8664 : SUBROUTINE exstate_release(ex_env)
92 : TYPE(excited_energy_type), POINTER :: ex_env
93 :
94 8664 : IF (ASSOCIATED(ex_env)) THEN
95 :
96 8664 : CALL cp_fm_release(ex_env%evect)
97 8664 : CALL cp_fm_release(ex_env%cpmos)
98 : !
99 8664 : CALL cp_fm_release(ex_env%bse_w_matrix_MO)
100 8664 : CALL cp_fm_release(ex_env%bse_a_matrix_MO)
101 : !
102 8664 : CALL exstate_matrix_release(ex_env)
103 : !
104 8664 : CALL exstate_potential_release(ex_env)
105 : !
106 8664 : CALL cp_fm_release(ex_env%wfn_history%evect)
107 8664 : CALL cp_fm_release(ex_env%wfn_history%cpmos)
108 :
109 8664 : IF (ALLOCATED(ex_env%gw_eigen)) THEN
110 4 : DEALLOCATE (ex_env%gw_eigen)
111 : END IF
112 :
113 8664 : DEALLOCATE (ex_env)
114 :
115 : END IF
116 :
117 8664 : END SUBROUTINE exstate_release
118 :
119 : ! **************************************************************************************************
120 : !> \brief ...
121 : !> \param ex_env ...
122 : ! **************************************************************************************************
123 8664 : SUBROUTINE exstate_matrix_release(ex_env)
124 : TYPE(excited_energy_type), POINTER :: ex_env
125 :
126 8664 : IF (ASSOCIATED(ex_env)) THEN
127 8664 : IF (ASSOCIATED(ex_env%matrix_ks)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_ks)
128 8664 : NULLIFY (ex_env%matrix_ks)
129 8664 : IF (ASSOCIATED(ex_env%matrix_pe)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_pe)
130 8664 : NULLIFY (ex_env%matrix_pe)
131 8664 : IF (ASSOCIATED(ex_env%matrix_hz)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_hz)
132 8664 : NULLIFY (ex_env%matrix_hz)
133 8664 : IF (ASSOCIATED(ex_env%matrix_pe_admm)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_pe_admm)
134 8664 : NULLIFY (ex_env%matrix_pe_admm)
135 8664 : IF (ASSOCIATED(ex_env%matrix_px1)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_px1)
136 8664 : NULLIFY (ex_env%matrix_px1)
137 8664 : IF (ASSOCIATED(ex_env%matrix_px1_admm)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_px1_admm)
138 8664 : NULLIFY (ex_env%matrix_px1_admm)
139 8664 : IF (ASSOCIATED(ex_env%matrix_px1_asymm)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_px1_asymm)
140 8664 : NULLIFY (ex_env%matrix_px1_asymm)
141 8664 : IF (ASSOCIATED(ex_env%matrix_px1_admm_asymm)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_px1_admm_asymm)
142 8664 : NULLIFY (ex_env%matrix_px1_admm_asymm)
143 8664 : IF (ASSOCIATED(ex_env%matrix_wx1)) CALL dbcsr_deallocate_matrix_set(ex_env%matrix_wx1)
144 8664 : NULLIFY (ex_env%matrix_wx1)
145 : END IF
146 :
147 8664 : END SUBROUTINE exstate_matrix_release
148 :
149 : ! **************************************************************************************************
150 : !> \brief ...
151 : !> \param ex_env ...
152 : ! **************************************************************************************************
153 9306 : SUBROUTINE exstate_potential_release(ex_env)
154 : TYPE(excited_energy_type), POINTER :: ex_env
155 :
156 : INTEGER :: iab
157 :
158 9306 : IF (ASSOCIATED(ex_env)) THEN
159 9306 : IF (ASSOCIATED(ex_env%vh_rspace%pw_grid)) THEN
160 642 : CALL ex_env%vh_rspace%release()
161 : END IF
162 9306 : IF (ASSOCIATED(ex_env%vxc_rspace)) THEN
163 1392 : DO iab = 1, SIZE(ex_env%vxc_rspace)
164 1392 : CALL ex_env%vxc_rspace(iab)%release()
165 : END DO
166 642 : DEALLOCATE (ex_env%vxc_rspace)
167 642 : NULLIFY (ex_env%vxc_rspace)
168 : END IF
169 9306 : IF (ASSOCIATED(ex_env%vtau_rspace)) THEN
170 0 : DO iab = 1, SIZE(ex_env%vtau_rspace)
171 0 : CALL ex_env%vtau_rspace(iab)%release()
172 : END DO
173 0 : DEALLOCATE (ex_env%vtau_rspace)
174 0 : NULLIFY (ex_env%vtau_rspace)
175 : END IF
176 9306 : IF (ASSOCIATED(ex_env%vadmm_rspace)) THEN
177 180 : DO iab = 1, SIZE(ex_env%vadmm_rspace)
178 180 : CALL ex_env%vadmm_rspace(iab)%release()
179 : END DO
180 86 : DEALLOCATE (ex_env%vadmm_rspace)
181 86 : NULLIFY (ex_env%vadmm_rspace)
182 : END IF
183 9306 : IF (ASSOCIATED(ex_env%vadmm_tau_rspace)) THEN
184 0 : DO iab = 1, SIZE(ex_env%vadmm_tau_rspace)
185 0 : CALL ex_env%vadmm_tau_rspace(iab)%release()
186 : END DO
187 0 : DEALLOCATE (ex_env%vadmm_tau_rspace)
188 0 : NULLIFY (ex_env%vadmm_tau_rspace)
189 : END IF
190 9306 : IF (ASSOCIATED(ex_env%local_rho_set)) THEN
191 156 : CALL local_rho_set_release(ex_env%local_rho_set)
192 156 : NULLIFY (ex_env%local_rho_set)
193 : END IF
194 9306 : IF (ASSOCIATED(ex_env%local_rho_set_admm)) THEN
195 24 : CALL local_rho_set_release(ex_env%local_rho_set_admm)
196 24 : NULLIFY (ex_env%local_rho_set_admm)
197 : END IF
198 : END IF
199 :
200 9306 : END SUBROUTINE exstate_potential_release
201 :
202 : ! **************************************************************************************************
203 : !> \brief Allocates and intitializes exstate_env
204 : !> \param ex_env the object to create
205 : !> \param excited_state ...
206 : !> \param dft_section ...
207 : !> \par History
208 : !> 2020.01 created
209 : !> \author JGH
210 : ! **************************************************************************************************
211 8664 : SUBROUTINE exstate_create(ex_env, excited_state, dft_section)
212 : TYPE(excited_energy_type), POINTER :: ex_env
213 : LOGICAL, INTENT(IN) :: excited_state
214 : TYPE(section_vals_type), POINTER :: dft_section
215 :
216 8664 : CPASSERT(.NOT. ASSOCIATED(ex_env))
217 8664 : ALLOCATE (ex_env)
218 : ex_env%evalue = 0.0_dp
219 : NULLIFY (ex_env%evect)
220 : NULLIFY (ex_env%cpmos)
221 : NULLIFY (ex_env%bse_w_matrix_MO)
222 : NULLIFY (ex_env%bse_a_matrix_MO)
223 8664 : IF (excited_state) THEN
224 440 : CALL section_vals_val_get(dft_section, "EXCITED_STATES%STATE", i_val=ex_env%state)
225 : CALL section_vals_val_get(dft_section, "EXCITED_STATES%XC_KERNEL_METHOD", &
226 440 : i_val=ex_env%xc_kernel_method)
227 : CALL section_vals_val_get(dft_section, "EXCITED_STATES%DEBUG_FORCES", &
228 440 : l_val=ex_env%debug_forces)
229 : CALL section_vals_val_get(dft_section, "EXCITED_STATES%EPS_DELTA_RHO", &
230 440 : r_val=ex_env%eps_delta_rho)
231 : CALL section_vals_val_get(dft_section, "EXCITED_STATES%DIFF_ORDER", &
232 440 : i_val=ex_env%diff_order)
233 : ELSE
234 8224 : ex_env%state = 0
235 8224 : ex_env%xc_kernel_method = xc_kernel_method_best
236 : END IF
237 8664 : ex_env%wfn_history%evalue = 0.0_dp
238 8664 : ex_env%wfn_history%state = ex_env%state
239 8664 : ex_env%wfn_history%xsval = 1.0_dp
240 8664 : ex_env%wfn_history%gsval = 1.0_dp
241 8664 : ex_env%wfn_history%gsmin = 1.0_dp
242 8664 : NULLIFY (ex_env%wfn_history%cpmos)
243 8664 : NULLIFY (ex_env%wfn_history%evect)
244 :
245 8664 : END SUBROUTINE exstate_create
246 :
247 0 : END MODULE exstates_types
|