127 SUBROUTINE ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, &
128 energy_only, delta, qs_ot_env)
130 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mo_array
131 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_dedc
134 REAL(kind=
dp) :: energy
135 LOGICAL,
INTENT(INOUT) :: energy_only
136 REAL(kind=
dp) :: delta
137 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
139 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_scf_mini'
141 INTEGER :: handle, ispin, k, n, nspin
142 REAL(kind=
dp) :: ener_nondiag, trace
143 TYPE(
cp_1d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: expectation_values, occupation_numbers, &
146 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_dedc_scaled
149 CALL timeset(routinen, handle)
154 nspin =
SIZE(mo_array)
156 ALLOCATE (occupation_numbers(nspin))
157 ALLOCATE (scaling_factor(nspin))
159 IF (qs_ot_env(1)%settings%do_ener)
THEN
160 ALLOCATE (expectation_values(nspin))
164 CALL get_mo_set(mo_set=mo_array(ispin), occupation_numbers=occupation_numbers(ispin)%array)
165 ALLOCATE (scaling_factor(ispin)%array(
SIZE(occupation_numbers(ispin)%array)))
166 scaling_factor(ispin)%array = 2.0_dp*occupation_numbers(ispin)%array
167 IF (qs_ot_env(1)%settings%do_ener)
THEN
168 ALLOCATE (expectation_values(ispin)%array(
SIZE(occupation_numbers(ispin)%array)))
173 IF (qs_ot_env(1)%settings%do_ener)
THEN
174 cpassert(qs_ot_env(1)%settings%do_rotation)
177 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
178 cpassert(qs_ot_env(1)%settings%do_ener)
182 IF (.NOT. energy_only)
THEN
183 IF (qs_ot_env(1)%settings%do_rotation)
THEN
184 DO ispin = 1,
SIZE(qs_ot_env)
185 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
186 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
187 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mo_coeff, matrix_dedc(ispin)%matrix, &
188 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
189 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_chc)
191 CALL dbcsr_scale_by_vector(qs_ot_env(ispin)%matrix_buf1, alpha=scaling_factor(ispin)%array, side=
'right')
193 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%matrix_buf1, &
194 0.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
200 IF (qs_ot_env(1)%settings%do_ener)
THEN
201 DO ispin = 1,
SIZE(mo_array)
202 CALL dbcsr_get_diag(qs_ot_env(ispin)%rot_mat_chc, expectation_values(ispin)%array)
203 qs_ot_env(ispin)%ener_gx = expectation_values(ispin)%array
205 smear=smear, eval_deriv=qs_ot_env(ispin)%ener_gx)
212 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
213 DO ispin = 1,
SIZE(qs_ot_env)
214 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
215 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
216 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
217 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
218 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
225 ener_nondiag = 0.0_dp
226 IF (qs_ot_env(1)%settings%add_nondiag_energy)
THEN
227 DO ispin = 1,
SIZE(qs_ot_env)
229 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
230 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
231 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
232 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
233 0.0_dp, qs_ot_env(ispin)%matrix_buf2)
236 CALL dbcsr_get_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
237 expectation_values(ispin)%array = expectation_values(ispin)%array - qs_ot_env(ispin)%ener_x
238 CALL dbcsr_set_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
241 CALL dbcsr_dot(qs_ot_env(ispin)%matrix_buf2, qs_ot_env(ispin)%matrix_buf2, trace)
242 ener_nondiag = ener_nondiag + 0.5_dp*qs_ot_env(1)%settings%nondiag_energy_strength*trace
245 IF (.NOT. energy_only)
THEN
247 qs_ot_env(ispin)%ener_gx = qs_ot_env(ispin)%ener_gx - &
248 qs_ot_env(1)%settings%nondiag_energy_strength*expectation_values(ispin)%array
251 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_chc, qs_ot_env(ispin)%rot_mat_u, &
252 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
253 CALL dbcsr_multiply(
'N',
'N', 2.0_dp*qs_ot_env(1)%settings%nondiag_energy_strength, &
254 qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%matrix_buf2, &
255 1.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
263 ALLOCATE (matrix_dedc_scaled(
SIZE(matrix_dedc)))
264 DO ispin = 1,
SIZE(matrix_dedc)
265 ALLOCATE (matrix_dedc_scaled(ispin)%matrix)
266 CALL dbcsr_copy(matrix_dedc_scaled(ispin)%matrix, matrix_dedc(ispin)%matrix)
270 IF (qs_ot_env(1)%settings%occupation_preconditioner)
THEN
271 scaling_factor(ispin)%array = 2.0_dp
273 CALL dbcsr_scale_by_vector(matrix_dedc_scaled(ispin)%matrix, alpha=scaling_factor(ispin)%array, side=
'right')
277 qs_ot_env(1)%etotal = energy + ener_nondiag
279 CALL ot_mini(qs_ot_env, matrix_dedc_scaled)
281 delta = qs_ot_env(1)%delta
282 energy_only = qs_ot_env(1)%energy_only
285 DO ispin = 1,
SIZE(qs_ot_env)
286 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
287 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
288 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
290 IF (
ASSOCIATED(matrix_s))
THEN
291 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_x, &
292 0.0_dp, qs_ot_env(ispin)%matrix_sx)
294 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_x)
296 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
300 qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_gx_old, &
301 qs_ot_env(ispin)%matrix_dx, qs_ot_env(ispin), qs_ot_env(1))
303 cpabort(
"Algorithm not yet implemented")
307 IF (qs_ot_env(1)%restricted)
THEN
313 IF (qs_ot_env(1)%settings%do_ener)
THEN
314 DO ispin = 1,
SIZE(mo_array)
315 mo_array(ispin)%eigenvalues = qs_ot_env(ispin)%ener_x
322 DO ispin = 1,
SIZE(scaling_factor)
323 DEALLOCATE (scaling_factor(ispin)%array)
325 DEALLOCATE (scaling_factor)
326 IF (qs_ot_env(1)%settings%do_ener)
THEN
327 DO ispin = 1,
SIZE(expectation_values)
328 DEALLOCATE (expectation_values(ispin)%array)
330 DEALLOCATE (expectation_values)
332 DEALLOCATE (occupation_numbers)
333 DO ispin = 1,
SIZE(matrix_dedc_scaled)
335 DEALLOCATE (matrix_dedc_scaled(ispin)%matrix)
337 DEALLOCATE (matrix_dedc_scaled)
339 CALL timestop(handle)
354 SUBROUTINE ot_scf_init(mo_array, matrix_s, qs_ot_env, matrix_ks, broyden_adaptive_sigma)
356 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
358 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
360 REAL(kind=
dp) :: broyden_adaptive_sigma
362 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_scf_init'
364 INTEGER :: handle, ispin, k, n, nspin
369 CALL timeset(routinen, handle)
371 DO ispin = 1,
SIZE(mo_array)
372 IF (.NOT.
ASSOCIATED(mo_array(ispin)%mo_coeff_b))
THEN
373 cpabort(
"Shouldn't get there")
378 n=mo_array(ispin)%nmo, &
379 sym=dbcsr_type_no_symmetry)
384 DO ispin = 1,
SIZE(qs_ot_env)
385 qs_ot_env(ispin)%broyden_adaptive_sigma = broyden_adaptive_sigma
391 nspin =
SIZE(qs_ot_env)
396 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff, mo_coeff=mo_coeff_fm)
399 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
402 CALL qs_ot_allocate(qs_ot_env(ispin), matrix_ks, mo_coeff_fm%matrix_struct)
405 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_c0, mo_coeff)
406 IF (
ASSOCIATED(matrix_s))
THEN
407 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_c0, &
408 0.0_dp, qs_ot_env(ispin)%matrix_sc0)
410 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sc0, qs_ot_env(ispin)%matrix_c0)
417 CALL dbcsr_set(qs_ot_env(ispin)%matrix_x, 0.0_dp)
418 CALL dbcsr_set(qs_ot_env(ispin)%matrix_sx, 0.0_dp)
420 IF (qs_ot_env(ispin)%settings%do_rotation)
THEN
421 CALL dbcsr_set(qs_ot_env(ispin)%rot_mat_x, 0.0_dp)
424 IF (qs_ot_env(ispin)%settings%do_ener)
THEN
425 is_equal =
SIZE(qs_ot_env(ispin)%ener_x) ==
SIZE(mo_array(ispin)%eigenvalues)
427 qs_ot_env(ispin)%ener_x = mo_array(ispin)%eigenvalues
430 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
433 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
435 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_c0)
436 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_sc0)
438 cpabort(
"Algorithm not yet implemented")
442 CALL timestop(handle)