123 SUBROUTINE ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, &
124 energy_only, delta, qs_ot_env)
126 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mo_array
127 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_dedc
130 REAL(kind=
dp) :: energy
131 LOGICAL,
INTENT(INOUT) :: energy_only
132 REAL(kind=
dp) :: delta
133 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
135 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_scf_mini'
137 INTEGER :: handle, ispin, k, n, nspin
138 REAL(kind=
dp) :: ener_nondiag, trace
139 TYPE(
cp_1d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: expectation_values, occupation_numbers, &
142 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_dedc_scaled
145 CALL timeset(routinen, handle)
150 nspin =
SIZE(mo_array)
152 ALLOCATE (occupation_numbers(nspin))
153 ALLOCATE (scaling_factor(nspin))
155 IF (qs_ot_env(1)%settings%do_ener)
THEN
156 ALLOCATE (expectation_values(nspin))
160 CALL get_mo_set(mo_set=mo_array(ispin), occupation_numbers=occupation_numbers(ispin)%array)
161 ALLOCATE (scaling_factor(ispin)%array(
SIZE(occupation_numbers(ispin)%array)))
162 scaling_factor(ispin)%array = 2.0_dp*occupation_numbers(ispin)%array
163 IF (qs_ot_env(1)%settings%do_ener)
THEN
164 ALLOCATE (expectation_values(ispin)%array(
SIZE(occupation_numbers(ispin)%array)))
169 IF (qs_ot_env(1)%settings%do_ener)
THEN
170 cpassert(qs_ot_env(1)%settings%do_rotation)
173 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
174 cpassert(qs_ot_env(1)%settings%do_ener)
178 IF (.NOT. energy_only)
THEN
179 IF (qs_ot_env(1)%settings%do_rotation)
THEN
180 DO ispin = 1,
SIZE(qs_ot_env)
181 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
182 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
183 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mo_coeff, matrix_dedc(ispin)%matrix, &
184 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
185 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_chc)
187 CALL dbcsr_scale_by_vector(qs_ot_env(ispin)%matrix_buf1, alpha=scaling_factor(ispin)%array, side=
'right')
189 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%matrix_buf1, &
190 0.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
196 IF (qs_ot_env(1)%settings%do_ener)
THEN
197 DO ispin = 1,
SIZE(mo_array)
198 CALL dbcsr_get_diag(qs_ot_env(ispin)%rot_mat_chc, expectation_values(ispin)%array)
199 qs_ot_env(ispin)%ener_gx = expectation_values(ispin)%array
201 smear=smear, eval_deriv=qs_ot_env(ispin)%ener_gx)
208 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
209 DO ispin = 1,
SIZE(qs_ot_env)
210 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
211 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
212 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
213 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
214 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
221 ener_nondiag = 0.0_dp
222 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
223 DO ispin = 1,
SIZE(qs_ot_env)
225 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
226 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
227 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
228 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
229 0.0_dp, qs_ot_env(ispin)%matrix_buf2)
232 CALL dbcsr_get_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
233 expectation_values(ispin)%array = expectation_values(ispin)%array - qs_ot_env(ispin)%ener_x
234 CALL dbcsr_set_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
237 CALL dbcsr_dot(qs_ot_env(ispin)%matrix_buf2, qs_ot_env(ispin)%matrix_buf2, trace)
238 ener_nondiag = ener_nondiag + 0.5_dp*qs_ot_env(1)%settings%nondiag_energy_strength*trace
241 IF (.NOT. energy_only)
THEN
243 qs_ot_env(ispin)%ener_gx = qs_ot_env(ispin)%ener_gx - &
244 qs_ot_env(1)%settings%nondiag_energy_strength*expectation_values(ispin)%array
247 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_chc, qs_ot_env(ispin)%rot_mat_u, &
248 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
249 CALL dbcsr_multiply(
'N',
'N', 2.0_dp*qs_ot_env(1)%settings%nondiag_energy_strength, &
250 qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%matrix_buf2, &
251 1.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
259 ALLOCATE (matrix_dedc_scaled(
SIZE(matrix_dedc)))
260 DO ispin = 1,
SIZE(matrix_dedc)
261 ALLOCATE (matrix_dedc_scaled(ispin)%matrix)
262 CALL dbcsr_copy(matrix_dedc_scaled(ispin)%matrix, matrix_dedc(ispin)%matrix)
266 IF (qs_ot_env(1)%settings%occupation_preconditioner)
THEN
267 scaling_factor(ispin)%array = 2.0_dp
269 CALL dbcsr_scale_by_vector(matrix_dedc_scaled(ispin)%matrix, alpha=scaling_factor(ispin)%array, side=
'right')
273 qs_ot_env(1)%etotal = energy + ener_nondiag
275 CALL ot_mini(qs_ot_env, matrix_dedc_scaled)
277 delta = qs_ot_env(1)%delta
278 energy_only = qs_ot_env(1)%energy_only
281 DO ispin = 1,
SIZE(qs_ot_env)
282 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
283 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
284 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
286 IF (
ASSOCIATED(matrix_s))
THEN
287 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_x, &
288 0.0_dp, qs_ot_env(ispin)%matrix_sx)
290 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_x)
292 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
296 qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_gx_old, &
297 qs_ot_env(ispin)%matrix_dx, qs_ot_env(ispin), qs_ot_env(1))
299 cpabort(
"Algorithm not yet implemented")
303 IF (qs_ot_env(1)%restricted)
THEN
309 IF (qs_ot_env(1)%settings%do_ener)
THEN
310 DO ispin = 1,
SIZE(mo_array)
311 mo_array(ispin)%eigenvalues = qs_ot_env(ispin)%ener_x
318 DO ispin = 1,
SIZE(scaling_factor)
319 DEALLOCATE (scaling_factor(ispin)%array)
321 DEALLOCATE (scaling_factor)
322 IF (qs_ot_env(1)%settings%do_ener)
THEN
323 DO ispin = 1,
SIZE(expectation_values)
324 DEALLOCATE (expectation_values(ispin)%array)
326 DEALLOCATE (expectation_values)
328 DEALLOCATE (occupation_numbers)
329 DO ispin = 1,
SIZE(matrix_dedc_scaled)
331 DEALLOCATE (matrix_dedc_scaled(ispin)%matrix)
333 DEALLOCATE (matrix_dedc_scaled)
335 CALL timestop(handle)
348 SUBROUTINE ot_scf_init(mo_array, matrix_s, qs_ot_env, matrix_ks, broyden_adaptive_sigma)
350 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
352 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
354 REAL(kind=
dp) :: broyden_adaptive_sigma
356 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_scf_init'
358 INTEGER :: handle, ispin, k, n, nspin
363 CALL timeset(routinen, handle)
365 DO ispin = 1,
SIZE(mo_array)
366 IF (.NOT.
ASSOCIATED(mo_array(ispin)%mo_coeff_b))
THEN
367 cpabort(
"Shouldn't get there")
372 n=mo_array(ispin)%nmo, &
373 sym=dbcsr_type_no_symmetry)
378 DO ispin = 1,
SIZE(qs_ot_env)
379 qs_ot_env(ispin)%broyden_adaptive_sigma = broyden_adaptive_sigma
385 nspin =
SIZE(qs_ot_env)
390 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff, mo_coeff=mo_coeff_fm)
393 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
396 CALL qs_ot_allocate(qs_ot_env(ispin), matrix_ks, mo_coeff_fm%matrix_struct)
399 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_c0, mo_coeff)
400 IF (
ASSOCIATED(matrix_s))
THEN
401 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_c0, &
402 0.0_dp, qs_ot_env(ispin)%matrix_sc0)
404 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sc0, qs_ot_env(ispin)%matrix_c0)
411 CALL dbcsr_set(qs_ot_env(ispin)%matrix_x, 0.0_dp)
412 CALL dbcsr_set(qs_ot_env(ispin)%matrix_sx, 0.0_dp)
414 IF (qs_ot_env(ispin)%settings%do_rotation)
THEN
415 CALL dbcsr_set(qs_ot_env(ispin)%rot_mat_x, 0.0_dp)
418 IF (qs_ot_env(ispin)%settings%do_ener)
THEN
419 is_equal =
SIZE(qs_ot_env(ispin)%ener_x) ==
SIZE(mo_array(ispin)%eigenvalues)
421 qs_ot_env(ispin)%ener_x = mo_array(ispin)%eigenvalues
424 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
427 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
429 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_c0)
430 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_sc0)
432 cpabort(
"Algorithm not yet implemented")
436 CALL timestop(handle)