(git:936074a)
Loading...
Searching...
No Matches
qs_scf_diagonalization.F
Go to the documentation of this file.
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 Different diagonalization schemes that can be used
10!> for the iterative solution of the eigenvalue problem
11!> \par History
12!> started from routines previously located in the qs_scf module
13!> 05.2009
14! **************************************************************************************************
19 USE cp_cfm_diag, ONLY: cp_cfm_geeig,&
21 USE cp_cfm_types, ONLY: cp_cfm_create,&
29 USE cp_dbcsr_api, ONLY: &
31 dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, &
32 dbcsr_type_symmetric
51 USE cp_fm_types, ONLY: &
59 USE input_constants, ONLY: &
64 USE kinds, ONLY: dp
69 USE kpoint_types, ONLY: get_kpoint_info,&
72 USE machine, ONLY: m_flush,&
74 USE mathconstants, ONLY: gaussi,&
75 z_one,&
76 z_zero
93 USE qs_ks_types, ONLY: qs_ks_did_change,&
95 USE qs_matrix_pools, ONLY: mpools_get,&
103 USE qs_mo_types, ONLY: get_mo_set,&
109 USE qs_rho_types, ONLY: qs_rho_get,&
121 USE qs_scf_types, ONLY: qs_scf_env_type,&
124#include "./base/base_uses.f90"
125
126 IMPLICIT NONE
127
128 PRIVATE
129
130 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_diagonalization'
131
135
136CONTAINS
137
138! **************************************************************************************************
139!> \brief the inner loop of scf, specific to diagonalization with S matrix
140!> basically, in goes the ks matrix out goes a new p matrix
141!> \param scf_env ...
142!> \param mos ...
143!> \param matrix_ks ...
144!> \param matrix_s ...
145!> \param scf_control ...
146!> \param scf_section ...
147!> \param diis_step ...
148!> \par History
149!> 03.2006 created [Joost VandeVondele]
150! **************************************************************************************************
151
152 SUBROUTINE general_eigenproblem(scf_env, mos, matrix_ks, &
153 matrix_s, scf_control, scf_section, &
154 diis_step)
155
156 TYPE(qs_scf_env_type), POINTER :: scf_env
157 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos
158 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
159 TYPE(scf_control_type), POINTER :: scf_control
160 TYPE(section_vals_type), POINTER :: scf_section
161 LOGICAL, INTENT(INOUT) :: diis_step
162
163 INTEGER :: ispin, nspin
164 LOGICAL :: do_level_shift, owns_ortho, use_jacobi
165 REAL(kind=dp) :: diis_error, eps_diis
166 TYPE(cp_fm_type), POINTER :: ortho
167 TYPE(dbcsr_type), POINTER :: ortho_dbcsr
168
169 nspin = SIZE(matrix_ks)
170 NULLIFY (ortho, ortho_dbcsr)
171
172 DO ispin = 1, nspin
173 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, &
174 scf_env%scf_work1(ispin))
175 END DO
176
177 eps_diis = scf_control%eps_diis
178
179 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis) THEN
180 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
181 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
182 eps_diis, scf_control%nmixing, &
183 s_matrix=matrix_s, &
184 scf_section=scf_section)
185 ELSE
186 diis_step = .false.
187 END IF
188
189 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
190 ((scf_control%density_guess == core_guess) .OR. &
191 (scf_env%iter_count > 1)))
192
193 IF ((scf_env%iter_count > 1) .AND. &
194 (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi)) THEN
195 use_jacobi = .true.
196 ELSE
197 use_jacobi = .false.
198 END IF
199
200 IF (diis_step) THEN
201 scf_env%iter_param = diis_error
202 IF (use_jacobi) THEN
203 scf_env%iter_method = "DIIS/Jacobi"
204 ELSE
205 scf_env%iter_method = "DIIS/Diag."
206 END IF
207 ELSE
208 IF (scf_env%mixing_method == 0) THEN
209 scf_env%iter_method = "NoMix/Diag."
210 ELSE IF (scf_env%mixing_method == 1) THEN
211 scf_env%iter_param = scf_env%p_mix_alpha
212 IF (use_jacobi) THEN
213 scf_env%iter_method = "P_Mix/Jacobi"
214 ELSE
215 scf_env%iter_method = "P_Mix/Diag."
216 END IF
217 ELSEIF (scf_env%mixing_method > 1) THEN
218 scf_env%iter_param = scf_env%mixing_store%alpha
219 IF (use_jacobi) THEN
220 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Jacobi"
221 ELSE
222 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Diag."
223 END IF
224 END IF
225 END IF
226
227 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
228 ortho_dbcsr => scf_env%ortho_dbcsr
229 DO ispin = 1, nspin
230 CALL eigensolver_dbcsr(matrix_ks=matrix_ks(ispin)%matrix, matrix_ks_fm=scf_env%scf_work1(ispin), &
231 mo_set=mos(ispin), &
232 ortho_dbcsr=ortho_dbcsr, &
233 ksbuf1=scf_env%buf1_dbcsr, ksbuf2=scf_env%buf2_dbcsr)
234 END DO
235
236 ELSE IF (scf_env%cholesky_method > cholesky_off) THEN
237 IF (scf_env%cholesky_method == cholesky_inverse) THEN
238 ortho => scf_env%ortho_m1
239 ELSE
240 ortho => scf_env%ortho
241 END IF
242
243 owns_ortho = .false.
244 IF (.NOT. ASSOCIATED(ortho)) THEN
245 ALLOCATE (ortho)
246 owns_ortho = .true.
247 END IF
248
249 DO ispin = 1, nspin
250 IF (do_level_shift) THEN
251 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
252 mo_set=mos(ispin), &
253 ortho=ortho, &
254 work=scf_env%scf_work2, &
255 cholesky_method=scf_env%cholesky_method, &
256 do_level_shift=do_level_shift, &
257 level_shift=scf_control%level_shift, &
258 matrix_u_fm=scf_env%ortho, &
259 use_jacobi=use_jacobi)
260 ELSE
261 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
262 mo_set=mos(ispin), &
263 ortho=ortho, &
264 work=scf_env%scf_work2, &
265 cholesky_method=scf_env%cholesky_method, &
266 do_level_shift=do_level_shift, &
267 level_shift=scf_control%level_shift, &
268 use_jacobi=use_jacobi)
269 END IF
270 END DO
271
272 IF (owns_ortho) DEALLOCATE (ortho)
273 ELSE
274 ortho => scf_env%ortho
275
276 owns_ortho = .false.
277 IF (.NOT. ASSOCIATED(ortho)) THEN
278 ALLOCATE (ortho)
279 owns_ortho = .true.
280 END IF
281
282 IF (do_level_shift) THEN
283 DO ispin = 1, nspin
284 IF (ASSOCIATED(scf_env%scf_work1_red) .AND. ASSOCIATED(scf_env%scf_work2_red) &
285 .AND. ASSOCIATED(scf_env%ortho_red) .AND. ASSOCIATED(scf_env%ortho_m1_red)) THEN
286 CALL eigensolver_symm(matrix_ks_fm=scf_env%scf_work1(ispin), &
287 mo_set=mos(ispin), &
288 ortho=ortho, &
289 work=scf_env%scf_work2, &
290 do_level_shift=do_level_shift, &
291 level_shift=scf_control%level_shift, &
292 matrix_u_fm=scf_env%ortho_m1, &
293 use_jacobi=use_jacobi, &
294 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
295 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
296 ortho_red=scf_env%ortho_red, &
297 work_red=scf_env%scf_work2_red, &
298 matrix_u_fm_red=scf_env%ortho_m1_red)
299 ELSE
300 CALL eigensolver_symm(matrix_ks_fm=scf_env%scf_work1(ispin), &
301 mo_set=mos(ispin), &
302 ortho=ortho, &
303 work=scf_env%scf_work2, &
304 do_level_shift=do_level_shift, &
305 level_shift=scf_control%level_shift, &
306 matrix_u_fm=scf_env%ortho_m1, &
307 use_jacobi=use_jacobi, &
308 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
309 END IF
310 END DO
311 ELSE
312 DO ispin = 1, nspin
313 IF (ASSOCIATED(scf_env%scf_work1_red) .AND. ASSOCIATED(scf_env%scf_work2_red) &
314 .AND. ASSOCIATED(scf_env%ortho_red)) THEN
315 CALL eigensolver_symm(matrix_ks_fm=scf_env%scf_work1(ispin), &
316 mo_set=mos(ispin), &
317 ortho=ortho, &
318 work=scf_env%scf_work2, &
319 do_level_shift=do_level_shift, &
320 level_shift=scf_control%level_shift, &
321 use_jacobi=use_jacobi, &
322 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
323 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
324 ortho_red=scf_env%ortho_red, &
325 work_red=scf_env%scf_work2_red)
326 ELSE
327 CALL eigensolver_symm(matrix_ks_fm=scf_env%scf_work1(ispin), &
328 mo_set=mos(ispin), &
329 ortho=ortho, &
330 work=scf_env%scf_work2, &
331 do_level_shift=do_level_shift, &
332 level_shift=scf_control%level_shift, &
333 use_jacobi=use_jacobi, &
334 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
335 END IF
336 END DO
337 END IF
338
339 IF (owns_ortho) DEALLOCATE (ortho)
340 END IF
341
342 END SUBROUTINE general_eigenproblem
343
344! **************************************************************************************************
345!> \brief ...
346!> \param scf_env ...
347!> \param mos ...
348!> \param matrix_ks ...
349!> \param matrix_s ...
350!> \param scf_control ...
351!> \param scf_section ...
352!> \param diis_step ...
353!> \param probe ...
354! **************************************************************************************************
355 SUBROUTINE do_general_diag(scf_env, mos, matrix_ks, &
356 matrix_s, scf_control, scf_section, &
357 diis_step, probe)
358
359 TYPE(qs_scf_env_type), POINTER :: scf_env
360 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
361 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
362 TYPE(scf_control_type), POINTER :: scf_control
363 TYPE(section_vals_type), POINTER :: scf_section
364 LOGICAL, INTENT(INOUT) :: diis_step
365 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
366 POINTER :: probe
367
368 INTEGER :: ispin, nspin
369 REAL(kind=dp) :: total_zeff_corr
370
371 nspin = SIZE(matrix_ks)
372
373 CALL general_eigenproblem(scf_env, mos, matrix_ks, &
374 matrix_s, scf_control, scf_section, diis_step)
375
376 total_zeff_corr = 0.0_dp
377 total_zeff_corr = scf_env%sum_zeff_corr
378
379 IF (abs(total_zeff_corr) > 0.0_dp) THEN
380 CALL set_mo_occupation(mo_array=mos, &
381 smear=scf_control%smear, tot_zeff_corr=total_zeff_corr)
382 ELSE
383 IF (PRESENT(probe) .EQV. .true.) THEN
384 scf_control%smear%do_smear = .false.
385 CALL set_mo_occupation(mo_array=mos, &
386 smear=scf_control%smear, &
387 probe=probe)
388 ELSE
389 CALL set_mo_occupation(mo_array=mos, &
390 smear=scf_control%smear)
391 END IF
392 END IF
393
394 DO ispin = 1, nspin
395 CALL calculate_density_matrix(mos(ispin), &
396 scf_env%p_mix_new(ispin, 1)%matrix)
397 END DO
398
399 END SUBROUTINE do_general_diag
400
401! **************************************************************************************************
402!> \brief Kpoint diagonalization routine
403!> Transforms matrices to kpoint, distributes kpoint groups, performs
404!> general diagonalization (no storgae of overlap decomposition), stores
405!> MOs, calculates occupation numbers, calculates density matrices
406!> in kpoint representation, transforms density matrices to real space
407!> \param matrix_ks Kohn-sham matrices (RS indices, global)
408!> \param matrix_s Overlap matrices (RS indices, global)
409!> \param kpoints Kpoint environment
410!> \param scf_env SCF environment
411!> \param scf_control SCF control variables
412!> \param update_p ...
413!> \param diis_step ...
414!> \param diis_error ...
415!> \param qs_env ...
416!> \param probe ...
417!> \par History
418!> 08.2014 created [JGH]
419! **************************************************************************************************
420 SUBROUTINE do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, &
421 diis_step, diis_error, qs_env, probe)
422
423 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_s
424 TYPE(kpoint_type), POINTER :: kpoints
425 TYPE(qs_scf_env_type), POINTER :: scf_env
426 TYPE(scf_control_type), POINTER :: scf_control
427 LOGICAL, INTENT(IN) :: update_p
428 LOGICAL, INTENT(INOUT) :: diis_step
429 REAL(dp), INTENT(INOUT), OPTIONAL :: diis_error
430 TYPE(qs_environment_type), OPTIONAL, POINTER :: qs_env
431 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
432 POINTER :: probe
433
434 CHARACTER(len=*), PARAMETER :: routinen = 'do_general_diag_kp'
435
436 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:) :: coeffs
437 INTEGER :: handle, ib, igroup, ik, ikp, indx, &
438 ispin, jb, kplocal, nb, nkp, &
439 nkp_groups, nspin
440 INTEGER, DIMENSION(2) :: kp_range
441 INTEGER, DIMENSION(:, :), POINTER :: kp_dist
442 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
443 LOGICAL :: do_diis, my_kpgrp, use_real_wfn
444 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
445 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp
446 TYPE(copy_info_type), ALLOCATABLE, DIMENSION(:, :) :: info
447 TYPE(cp_cfm_type) :: cksmat, cmos, csmat, cwork
448 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_ao_fm_pools
449 TYPE(cp_fm_struct_type), POINTER :: matrix_struct, mo_struct
450 TYPE(cp_fm_type) :: fmdummy, fmlocal, rksmat, rsmat
451 TYPE(cp_fm_type), DIMENSION(:), POINTER :: fmwork
452 TYPE(cp_fm_type), POINTER :: imos, mo_coeff, rmos
453 TYPE(dbcsr_type), POINTER :: cmatrix, rmatrix, tmpmat
454 TYPE(kpoint_env_type), POINTER :: kp
455 TYPE(mp_para_env_type), POINTER :: para_env, para_env_global
456 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
457 POINTER :: sab_nl
458 TYPE(qs_matrix_pools_type), POINTER :: mpools
459 TYPE(section_vals_type), POINTER :: scf_section
460
461 CALL timeset(routinen, handle)
462
463 NULLIFY (sab_nl)
464 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
465 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_nl, &
466 cell_to_index=cell_to_index)
467 cpassert(ASSOCIATED(sab_nl))
468 kplocal = kp_range(2) - kp_range(1) + 1
469
470 !Whether we use DIIS for k-points
471 do_diis = .false.
472 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis .AND. .NOT. use_real_wfn &
473 .AND. PRESENT(diis_error) .AND. PRESENT(qs_env)) do_diis = .true.
474
475 ! allocate some work matrices
476 ALLOCATE (rmatrix, cmatrix, tmpmat)
477 CALL dbcsr_create(rmatrix, template=matrix_ks(1, 1)%matrix, &
478 matrix_type=dbcsr_type_symmetric)
479 CALL dbcsr_create(cmatrix, template=matrix_ks(1, 1)%matrix, &
480 matrix_type=dbcsr_type_antisymmetric)
481 CALL dbcsr_create(tmpmat, template=matrix_ks(1, 1)%matrix, &
482 matrix_type=dbcsr_type_no_symmetry)
483 CALL cp_dbcsr_alloc_block_from_nbl(rmatrix, sab_nl)
484 CALL cp_dbcsr_alloc_block_from_nbl(cmatrix, sab_nl)
485
486 fmwork => scf_env%scf_work1
487
488 ! fm pools to be used within a kpoint group
489 CALL get_kpoint_info(kpoints, mpools=mpools)
490 CALL mpools_get(mpools, ao_ao_fm_pools=ao_ao_fm_pools)
491
492 CALL fm_pool_create_fm(ao_ao_fm_pools(1)%pool, fmlocal)
493 CALL cp_fm_get_info(fmlocal, matrix_struct=matrix_struct)
494
495 IF (use_real_wfn) THEN
496 CALL cp_fm_create(rksmat, matrix_struct)
497 CALL cp_fm_create(rsmat, matrix_struct)
498 ELSE
499 CALL cp_cfm_create(cksmat, matrix_struct)
500 CALL cp_cfm_create(csmat, matrix_struct)
501 CALL cp_cfm_create(cwork, matrix_struct)
502 kp => kpoints%kp_env(1)%kpoint_env
503 CALL get_mo_set(kp%mos(1, 1), mo_coeff=mo_coeff)
504 CALL cp_fm_get_info(mo_coeff, matrix_struct=mo_struct)
505 CALL cp_cfm_create(cmos, mo_struct)
506 END IF
507
508 para_env => kpoints%blacs_env_all%para_env
509 nspin = SIZE(matrix_ks, 1)
510 ALLOCATE (info(kplocal*nspin*nkp_groups, 4))
511
512 ! Setup and start all the communication
513 indx = 0
514 DO ikp = 1, kplocal
515 DO ispin = 1, nspin
516 DO igroup = 1, nkp_groups
517 ! number of current kpoint
518 ik = kp_dist(1, igroup) + ikp - 1
519 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
520 indx = indx + 1
521 IF (use_real_wfn) THEN
522 ! FT of matrices KS and S, then transfer to FM type
523 CALL dbcsr_set(rmatrix, 0.0_dp)
524 CALL rskp_transform(rmatrix=rmatrix, rsmat=matrix_ks, ispin=ispin, &
525 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
526 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
527 CALL copy_dbcsr_to_fm(tmpmat, fmwork(1))
528 ! s matrix is not spin dependent
529 CALL dbcsr_set(rmatrix, 0.0_dp)
530 CALL rskp_transform(rmatrix=rmatrix, rsmat=matrix_s, ispin=1, &
531 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
532 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
533 CALL copy_dbcsr_to_fm(tmpmat, fmwork(3))
534 ELSE
535 ! FT of matrices KS and S, then transfer to FM type
536 CALL dbcsr_set(rmatrix, 0.0_dp)
537 CALL dbcsr_set(cmatrix, 0.0_dp)
538 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_ks, ispin=ispin, &
539 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
540 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
541 CALL copy_dbcsr_to_fm(tmpmat, fmwork(1))
542 CALL dbcsr_desymmetrize(cmatrix, tmpmat)
543 CALL copy_dbcsr_to_fm(tmpmat, fmwork(2))
544 ! s matrix is not spin dependent, double the work
545 CALL dbcsr_set(rmatrix, 0.0_dp)
546 CALL dbcsr_set(cmatrix, 0.0_dp)
547 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_s, ispin=1, &
548 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
549 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
550 CALL copy_dbcsr_to_fm(tmpmat, fmwork(3))
551 CALL dbcsr_desymmetrize(cmatrix, tmpmat)
552 CALL copy_dbcsr_to_fm(tmpmat, fmwork(4))
553 END IF
554 ! transfer to kpoint group
555 ! redistribution of matrices, new blacs environment
556 ! fmwork -> fmlocal -> rksmat/cksmat
557 ! fmwork -> fmlocal -> rsmat/csmat
558 IF (use_real_wfn) THEN
559 IF (my_kpgrp) THEN
560 CALL cp_fm_start_copy_general(fmwork(1), rksmat, para_env, info(indx, 1))
561 CALL cp_fm_start_copy_general(fmwork(3), rsmat, para_env, info(indx, 2))
562 ELSE
563 CALL cp_fm_start_copy_general(fmwork(1), fmdummy, para_env, info(indx, 1))
564 CALL cp_fm_start_copy_general(fmwork(3), fmdummy, para_env, info(indx, 2))
565 END IF
566 ELSE
567 IF (my_kpgrp) THEN
568 CALL cp_fm_start_copy_general(fmwork(1), fmlocal, para_env, info(indx, 1))
569 CALL cp_fm_start_copy_general(fmwork(2), fmlocal, para_env, info(indx, 2))
570 CALL cp_fm_start_copy_general(fmwork(3), fmlocal, para_env, info(indx, 3))
571 CALL cp_fm_start_copy_general(fmwork(4), fmlocal, para_env, info(indx, 4))
572 ELSE
573 CALL cp_fm_start_copy_general(fmwork(1), fmdummy, para_env, info(indx, 1))
574 CALL cp_fm_start_copy_general(fmwork(2), fmdummy, para_env, info(indx, 2))
575 CALL cp_fm_start_copy_general(fmwork(3), fmdummy, para_env, info(indx, 3))
576 CALL cp_fm_start_copy_general(fmwork(4), fmdummy, para_env, info(indx, 4))
577 END IF
578 END IF
579 END DO
580 END DO
581 END DO
582
583 ! Finish communication then diagonalise in each group
584 IF (do_diis) THEN
585 CALL get_qs_env(qs_env, para_env=para_env_global)
586 scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
587 CALL qs_diis_b_info_kp(kpoints%scf_diis_buffer, ib, nb)
588 indx = 0
589 DO ikp = 1, kplocal
590 DO ispin = 1, nspin
591 DO igroup = 1, nkp_groups
592 ! number of current kpoint
593 ik = kp_dist(1, igroup) + ikp - 1
594 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
595 indx = indx + 1
596 IF (my_kpgrp) THEN
597 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 1))
598 CALL cp_cfm_scale_and_add_fm(z_zero, cksmat, z_one, fmlocal)
599 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 2))
600 CALL cp_cfm_scale_and_add_fm(z_one, cksmat, gaussi, fmlocal)
601 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 3))
602 CALL cp_cfm_scale_and_add_fm(z_zero, csmat, z_one, fmlocal)
603 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 4))
604 CALL cp_cfm_scale_and_add_fm(z_one, csmat, gaussi, fmlocal)
605 END IF
606 END DO !igroup
607
608 kp => kpoints%kp_env(ikp)%kpoint_env
609 CALL qs_diis_b_calc_err_kp(kpoints%scf_diis_buffer, ib, kp%mos, cksmat, csmat, &
610 ispin, ikp, kplocal, scf_section)
611
612 END DO !ispin
613 END DO !ikp
614
615 ALLOCATE (coeffs(nb))
616 CALL qs_diis_b_step_kp(kpoints%scf_diis_buffer, coeffs, ib, nb, scf_env%iter_delta, diis_error, &
617 diis_step, scf_control%eps_diis, nspin, nkp, kplocal, scf_control%nmixing, &
618 scf_section, para_env_global)
619
620 !build the ks matrices and idagonalize
621 DO ikp = 1, kplocal
622 DO ispin = 1, nspin
623 kp => kpoints%kp_env(ikp)%kpoint_env
624 CALL cp_cfm_to_cfm(kpoints%scf_diis_buffer%smat(ikp), csmat)
625
626 CALL cp_cfm_set_all(cksmat, z_zero)
627 DO jb = 1, nb
628 CALL cp_cfm_scale_and_add(z_one, cksmat, coeffs(jb), kpoints%scf_diis_buffer%param(jb, ispin, ikp))
629 END DO
630
631 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
632 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
633 IF (scf_env%cholesky_method == cholesky_off) THEN
634 CALL cp_cfm_geeig_canon(cksmat, csmat, cmos, eigenvalues, cwork, &
635 scf_control%eps_eigval)
636 ELSE
637 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
638 END IF
639 ! copy eigenvalues to imag set (keep them in sync)
640 kp%mos(2, ispin)%eigenvalues = eigenvalues
641 ! split real and imaginary part of mos
642 CALL cp_cfm_to_fm(cmos, rmos, imos)
643 END DO
644 END DO
645
646 ELSE !no DIIS
647 diis_step = .false.
648 indx = 0
649 DO ikp = 1, kplocal
650 DO ispin = 1, nspin
651 DO igroup = 1, nkp_groups
652 ! number of current kpoint
653 ik = kp_dist(1, igroup) + ikp - 1
654 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
655 indx = indx + 1
656 IF (my_kpgrp) THEN
657 IF (use_real_wfn) THEN
658 CALL cp_fm_finish_copy_general(rksmat, info(indx, 1))
659 CALL cp_fm_finish_copy_general(rsmat, info(indx, 2))
660 ELSE
661 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 1))
662 CALL cp_cfm_scale_and_add_fm(z_zero, cksmat, z_one, fmlocal)
663 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 2))
664 CALL cp_cfm_scale_and_add_fm(z_one, cksmat, gaussi, fmlocal)
665 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 3))
666 CALL cp_cfm_scale_and_add_fm(z_zero, csmat, z_one, fmlocal)
667 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 4))
668 CALL cp_cfm_scale_and_add_fm(z_one, csmat, gaussi, fmlocal)
669 END IF
670 END IF
671 END DO
672
673 ! Each kpoint group has now information on a kpoint to be diagonalized
674 ! General eigensolver Hermite or Symmetric
675 kp => kpoints%kp_env(ikp)%kpoint_env
676 IF (use_real_wfn) THEN
677 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=mo_coeff, eigenvalues=eigenvalues)
678 IF (scf_env%cholesky_method == cholesky_off) THEN
679 CALL cp_fm_geeig_canon(rksmat, rsmat, mo_coeff, eigenvalues, fmlocal, &
680 scf_control%eps_eigval)
681 ELSE
682 CALL cp_fm_geeig(rksmat, rsmat, mo_coeff, eigenvalues, fmlocal)
683 END IF
684 ELSE
685 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
686 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
687 IF (scf_env%cholesky_method == cholesky_off) THEN
688 CALL cp_cfm_geeig_canon(cksmat, csmat, cmos, eigenvalues, cwork, &
689 scf_control%eps_eigval)
690 ELSE
691 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
692 END IF
693 ! copy eigenvalues to imag set (keep them in sync)
694 kp%mos(2, ispin)%eigenvalues = eigenvalues
695 ! split real and imaginary part of mos
696 CALL cp_cfm_to_fm(cmos, rmos, imos)
697 END IF
698 END DO
699 END DO
700 END IF
701
702 ! Clean up communication
703 indx = 0
704 DO ikp = 1, kplocal
705 DO ispin = 1, nspin
706 DO igroup = 1, nkp_groups
707 ! number of current kpoint
708 ik = kp_dist(1, igroup) + ikp - 1
709 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
710 indx = indx + 1
711 IF (use_real_wfn) THEN
712 CALL cp_fm_cleanup_copy_general(info(indx, 1))
713 CALL cp_fm_cleanup_copy_general(info(indx, 2))
714 ELSE
715 CALL cp_fm_cleanup_copy_general(info(indx, 1))
716 CALL cp_fm_cleanup_copy_general(info(indx, 2))
717 CALL cp_fm_cleanup_copy_general(info(indx, 3))
718 CALL cp_fm_cleanup_copy_general(info(indx, 4))
719 END IF
720 END DO
721 END DO
722 END DO
723
724 ! All done
725 DEALLOCATE (info)
726
727 IF (update_p) THEN
728 ! MO occupations
729 IF (PRESENT(probe) .EQV. .true.) THEN
730 scf_control%smear%do_smear = .false.
731 CALL kpoint_set_mo_occupation(kpoints, scf_control%smear, &
732 probe=probe)
733 ELSE
734 CALL kpoint_set_mo_occupation(kpoints, scf_control%smear)
735 END IF
736 ! density matrices
737 CALL kpoint_density_matrices(kpoints)
738 ! density matrices in real space
739 CALL kpoint_density_transform(kpoints, scf_env%p_mix_new, .false., &
740 matrix_s(1, 1)%matrix, sab_nl, fmwork)
741 END IF
742
743 CALL dbcsr_deallocate_matrix(rmatrix)
744 CALL dbcsr_deallocate_matrix(cmatrix)
745 CALL dbcsr_deallocate_matrix(tmpmat)
746
747 IF (use_real_wfn) THEN
748 CALL cp_fm_release(rksmat)
749 CALL cp_fm_release(rsmat)
750 ELSE
751 CALL cp_cfm_release(cksmat)
752 CALL cp_cfm_release(csmat)
753 CALL cp_cfm_release(cwork)
754 CALL cp_cfm_release(cmos)
755 END IF
756 CALL fm_pool_give_back_fm(ao_ao_fm_pools(1)%pool, fmlocal)
757
758 CALL timestop(handle)
759
760 END SUBROUTINE do_general_diag_kp
761
762! **************************************************************************************************
763!> \brief inner loop within MOS subspace, to refine occupation and density,
764!> before next diagonalization of the Hamiltonian
765!> \param qs_env ...
766!> \param scf_env ...
767!> \param subspace_env ...
768!> \param mos ...
769!> \param rho ...
770!> \param ks_env ...
771!> \param scf_section ...
772!> \param scf_control ...
773!> \par History
774!> 09.2009 created [MI]
775!> \note it is assumed that when diagonalization is used, also some mixing procedure is active
776! **************************************************************************************************
777 SUBROUTINE do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, &
778 ks_env, scf_section, scf_control)
779
780 TYPE(qs_environment_type), POINTER :: qs_env
781 TYPE(qs_scf_env_type), POINTER :: scf_env
782 TYPE(subspace_env_type), POINTER :: subspace_env
783 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
784 TYPE(qs_rho_type), POINTER :: rho
785 TYPE(qs_ks_env_type), POINTER :: ks_env
786 TYPE(section_vals_type), POINTER :: scf_section
787 TYPE(scf_control_type), POINTER :: scf_control
788
789 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_scf_diag_subspace'
790 REAL(kind=dp), PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
791
792 INTEGER :: handle, i, iloop, ispin, nao, nmo, &
793 nspin, output_unit
794 LOGICAL :: converged
795 REAL(dp) :: ene_diff, ene_old, iter_delta, max_val, &
796 sum_band, sum_val, t1, t2
797 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues, mo_occupations
798 TYPE(cp_1d_r_p_type), ALLOCATABLE, DIMENSION(:) :: eval_first, occ_first
799 TYPE(cp_fm_type) :: work
800 TYPE(cp_fm_type), POINTER :: c0, chc, evec, mo_coeff
801 TYPE(cp_logger_type), POINTER :: logger
802 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
803 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
804 TYPE(dft_control_type), POINTER :: dft_control
805 TYPE(mp_para_env_type), POINTER :: para_env
806 TYPE(qs_energy_type), POINTER :: energy
807 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
808
809 CALL timeset(routinen, handle)
810 NULLIFY (c0, chc, energy, evec, matrix_ks, mo_coeff, mo_eigenvalues, &
811 mo_occupations, dft_control, rho_ao, rho_ao_kp)
812
813 logger => cp_get_default_logger()
814 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DIAG_SUB_SCF", &
815 extension=".scfLog")
816
817 !Extra loop keeping mos unchanged and refining the subspace occupation
818 nspin = SIZE(mos)
819 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_ao_kp=rho_ao_kp)
820
821 ALLOCATE (eval_first(nspin))
822 ALLOCATE (occ_first(nspin))
823 DO ispin = 1, nspin
824 CALL get_mo_set(mo_set=mos(ispin), &
825 nmo=nmo, &
826 eigenvalues=mo_eigenvalues, &
827 occupation_numbers=mo_occupations)
828 ALLOCATE (eval_first(ispin)%array(nmo))
829 ALLOCATE (occ_first(ispin)%array(nmo))
830 eval_first(ispin)%array(1:nmo) = mo_eigenvalues(1:nmo)
831 occ_first(ispin)%array(1:nmo) = mo_occupations(1:nmo)
832 END DO
833
834 DO ispin = 1, nspin
835 ! does not yet handle k-points
836 CALL dbcsr_copy(subspace_env%p_matrix_store(ispin)%matrix, rho_ao(ispin)%matrix)
837 CALL dbcsr_copy(rho_ao(ispin)%matrix, scf_env%p_mix_new(ispin, 1)%matrix)
838 END DO
839
840 subspace_env%p_matrix_mix => scf_env%p_mix_new
841
842 NULLIFY (matrix_ks, energy, para_env, matrix_s)
843 CALL get_qs_env(qs_env, &
844 matrix_ks=matrix_ks, &
845 energy=energy, &
846 matrix_s=matrix_s, &
847 para_env=para_env, &
848 dft_control=dft_control)
849
850 ! mixing storage allocation
851 IF (subspace_env%mixing_method >= gspace_mixing_nr) THEN
852 CALL mixing_allocate(qs_env, subspace_env%mixing_method, scf_env%p_mix_new, &
853 scf_env%p_delta, nspin, subspace_env%mixing_store)
854 IF (dft_control%qs_control%gapw) THEN
855 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
856 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, &
857 para_env, rho_atom=rho_atom)
858 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
859 CALL charge_mixing_init(subspace_env%mixing_store)
860 ELSEIF (dft_control%qs_control%semi_empirical) THEN
861 cpabort('SE Code not possible')
862 ELSE
863 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, para_env)
864 END IF
865 END IF
866
867 ene_old = 0.0_dp
868 ene_diff = 0.0_dp
869 IF (output_unit > 0) THEN
870 WRITE (output_unit, "(/T19,A)") '<<<<<<<<< SUBSPACE ROTATION <<<<<<<<<<'
871 WRITE (output_unit, "(T4,A,T13,A,T21,A,T38,A,T51,A,T65,A/,T4,A)") &
872 "In-step", "Time", "Convergence", "Band ene.", "Total ene.", "Energy diff.", repeat("-", 74)
873 END IF
874
875 ! recalculate density matrix here
876
877 ! update of density
878 CALL qs_rho_update_rho(rho, qs_env=qs_env)
879
880 DO iloop = 1, subspace_env%max_iter
881 t1 = m_walltime()
882 converged = .false.
883 ene_old = energy%total
884
885 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
886 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., &
887 just_energy=.false., print_active=.false.)
888
889 max_val = 0.0_dp
890 sum_val = 0.0_dp
891 sum_band = 0.0_dp
892 DO ispin = 1, SIZE(matrix_ks)
893 CALL get_mo_set(mo_set=mos(ispin), &
894 nao=nao, &
895 nmo=nmo, &
896 eigenvalues=mo_eigenvalues, &
897 occupation_numbers=mo_occupations, &
898 mo_coeff=mo_coeff)
899
900 !compute C'HC
901 chc => subspace_env%chc_mat(ispin)
902 evec => subspace_env%c_vec(ispin)
903 c0 => subspace_env%c0(ispin)
904 CALL cp_fm_to_fm(mo_coeff, c0)
905 CALL cp_fm_create(work, c0%matrix_struct)
906 CALL cp_dbcsr_sm_fm_multiply(matrix_ks(ispin)%matrix, c0, work, nmo)
907 CALL parallel_gemm('T', 'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
908 CALL cp_fm_release(work)
909 !diagonalize C'HC
910 CALL choose_eigv_solver(chc, evec, mo_eigenvalues)
911
912 !rotate the mos by the eigenvectors of C'HC
913 CALL parallel_gemm('N', 'N', nao, nmo, nmo, rone, c0, evec, rzero, mo_coeff)
914
915 CALL set_mo_occupation(mo_set=mos(ispin), &
916 smear=scf_control%smear)
917
918 ! does not yet handle k-points
919 CALL calculate_density_matrix(mos(ispin), &
920 subspace_env%p_matrix_mix(ispin, 1)%matrix)
921
922 DO i = 1, nmo
923 sum_band = sum_band + mo_eigenvalues(i)*mo_occupations(i)
924 END DO
925
926 !check for self consistency
927 END DO
928
929 IF (subspace_env%mixing_method == direct_mixing_nr) THEN
930 CALL scf_env_density_mixing(subspace_env%p_matrix_mix, &
931 scf_env%mixing_store, rho_ao_kp, para_env, iter_delta, iloop)
932 ELSE
933 CALL self_consistency_check(rho_ao_kp, scf_env%p_delta, para_env, &
934 subspace_env%p_matrix_mix, delta=iter_delta)
935 END IF
936
937 DO ispin = 1, nspin
938 ! does not yet handle k-points
939 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_mix(ispin, 1)%matrix)
940 END DO
941 ! update of density
942 CALL qs_rho_update_rho(rho, qs_env=qs_env)
943 ! Mixing in reciprocal space
944 IF (subspace_env%mixing_method >= gspace_mixing_nr) THEN
945 CALL gspace_mixing(qs_env, scf_env%mixing_method, subspace_env%mixing_store, &
946 rho, para_env, scf_env%iter_count)
947 END IF
948
949 ene_diff = energy%total - ene_old
950 converged = (abs(ene_diff) < subspace_env%eps_ene .AND. &
951 iter_delta < subspace_env%eps_adapt*scf_env%iter_delta)
952 t2 = m_walltime()
953 IF (output_unit > 0) THEN
954 WRITE (output_unit, "(T4,I5,T11,F8.3,T18,E14.4,T34,F12.5,T46,F16.8,T62,E14.4)") &
955 iloop, t2 - t1, iter_delta, sum_band, energy%total, ene_diff
956 CALL m_flush(output_unit)
957 END IF
958 IF (converged) THEN
959 IF (output_unit > 0) WRITE (output_unit, "(T10,A,I6,A,/)") &
960 " Reached convergence in ", iloop, " iterations "
961 EXIT
962 END IF
963
964 END DO ! iloop
965
966 NULLIFY (subspace_env%p_matrix_mix)
967 DO ispin = 1, nspin
968 ! does not yet handle k-points
969 CALL dbcsr_copy(scf_env%p_mix_new(ispin, 1)%matrix, rho_ao(ispin)%matrix)
970 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_store(ispin)%matrix)
971
972 DEALLOCATE (eval_first(ispin)%array, occ_first(ispin)%array)
973 END DO
974 DEALLOCATE (eval_first, occ_first)
975
976 CALL timestop(handle)
977
978 END SUBROUTINE do_scf_diag_subspace
979
980! **************************************************************************************************
981!> \brief ...
982!> \param subspace_env ...
983!> \param qs_env ...
984!> \param mos ...
985! **************************************************************************************************
986 SUBROUTINE diag_subspace_allocate(subspace_env, qs_env, mos)
987
988 TYPE(subspace_env_type), POINTER :: subspace_env
989 TYPE(qs_environment_type), POINTER :: qs_env
990 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos
991
992 CHARACTER(LEN=*), PARAMETER :: routinen = 'diag_subspace_allocate'
993
994 INTEGER :: handle, i, ispin, nmo, nspin
995 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
996 TYPE(cp_fm_type), POINTER :: mo_coeff
997 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
998 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
999 POINTER :: sab_orb
1000
1001 CALL timeset(routinen, handle)
1002
1003 NULLIFY (sab_orb, matrix_s)
1004 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, &
1005 matrix_s=matrix_s)
1006
1007 nspin = SIZE(mos)
1008! *** allocate p_atrix_store ***
1009 IF (.NOT. ASSOCIATED(subspace_env%p_matrix_store)) THEN
1010 CALL dbcsr_allocate_matrix_set(subspace_env%p_matrix_store, nspin)
1011
1012 DO i = 1, nspin
1013 ALLOCATE (subspace_env%p_matrix_store(i)%matrix)
1014 CALL dbcsr_create(matrix=subspace_env%p_matrix_store(i)%matrix, template=matrix_s(1)%matrix, &
1015 name="DENSITY_STORE", matrix_type=dbcsr_type_symmetric)
1016 CALL cp_dbcsr_alloc_block_from_nbl(subspace_env%p_matrix_store(i)%matrix, &
1017 sab_orb)
1018 CALL dbcsr_set(subspace_env%p_matrix_store(i)%matrix, 0.0_dp)
1019 END DO
1020
1021 END IF
1022
1023 ALLOCATE (subspace_env%chc_mat(nspin))
1024 ALLOCATE (subspace_env%c_vec(nspin))
1025 ALLOCATE (subspace_env%c0(nspin))
1026
1027 DO ispin = 1, nspin
1028 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1029 CALL cp_fm_create(subspace_env%c0(ispin), mo_coeff%matrix_struct)
1030 NULLIFY (fm_struct_tmp)
1031 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nmo, ncol_global=nmo, &
1032 para_env=mo_coeff%matrix_struct%para_env, &
1033 context=mo_coeff%matrix_struct%context)
1034 CALL cp_fm_create(subspace_env%chc_mat(ispin), fm_struct_tmp, "chc")
1035 CALL cp_fm_create(subspace_env%c_vec(ispin), fm_struct_tmp, "vec")
1036 CALL cp_fm_struct_release(fm_struct_tmp)
1037 END DO
1038
1039 CALL timestop(handle)
1040
1041 END SUBROUTINE diag_subspace_allocate
1042
1043! **************************************************************************************************
1044!> \brief the inner loop of scf, specific to diagonalization without S matrix
1045!> basically, in goes the ks matrix out goes a new p matrix
1046!> \param scf_env ...
1047!> \param mos ...
1048!> \param matrix_ks ...
1049!> \param scf_control ...
1050!> \param scf_section ...
1051!> \param diis_step ...
1052!> \par History
1053!> 03.2006 created [Joost VandeVondele]
1054! **************************************************************************************************
1055 SUBROUTINE do_special_diag(scf_env, mos, matrix_ks, scf_control, &
1056 scf_section, diis_step)
1057
1058 TYPE(qs_scf_env_type), POINTER :: scf_env
1059 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
1060 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
1061 TYPE(scf_control_type), POINTER :: scf_control
1062 TYPE(section_vals_type), POINTER :: scf_section
1063 LOGICAL, INTENT(INOUT) :: diis_step
1064
1065 INTEGER :: ispin, nspin
1066 LOGICAL :: do_level_shift, use_jacobi
1067 REAL(kind=dp) :: diis_error
1068
1069 nspin = SIZE(matrix_ks)
1070
1071 DO ispin = 1, nspin
1072 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, scf_env%scf_work1(ispin))
1073 END DO
1074 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis) THEN
1075 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1076 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1077 scf_control%eps_diis, scf_control%nmixing, &
1078 scf_section=scf_section)
1079 ELSE
1080 diis_step = .false.
1081 END IF
1082
1083 IF ((scf_env%iter_count > 1) .AND. (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi)) THEN
1084 use_jacobi = .true.
1085 ELSE
1086 use_jacobi = .false.
1087 END IF
1088
1089 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
1090 ((scf_control%density_guess == core_guess) .OR. (scf_env%iter_count > 1)))
1091 IF (diis_step) THEN
1092 scf_env%iter_param = diis_error
1093 IF (use_jacobi) THEN
1094 scf_env%iter_method = "DIIS/Jacobi"
1095 ELSE
1096 scf_env%iter_method = "DIIS/Diag."
1097 END IF
1098 ELSE
1099 IF (scf_env%mixing_method == 1) THEN
1100 scf_env%iter_param = scf_env%p_mix_alpha
1101 IF (use_jacobi) THEN
1102 scf_env%iter_method = "P_Mix/Jacobi"
1103 ELSE
1104 scf_env%iter_method = "P_Mix/Diag."
1105 END IF
1106 ELSEIF (scf_env%mixing_method > 1) THEN
1107 scf_env%iter_param = scf_env%mixing_store%alpha
1108 IF (use_jacobi) THEN
1109 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Jacobi"
1110 ELSE
1111 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Diag."
1112 END IF
1113 END IF
1114 END IF
1115 scf_env%iter_delta = 0.0_dp
1116
1117 DO ispin = 1, nspin
1118 CALL eigensolver_simple(matrix_ks=scf_env%scf_work1(ispin), &
1119 mo_set=mos(ispin), &
1120 work=scf_env%scf_work2, &
1121 do_level_shift=do_level_shift, &
1122 level_shift=scf_control%level_shift, &
1123 use_jacobi=use_jacobi, &
1124 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
1125 END DO
1126
1127 CALL set_mo_occupation(mo_array=mos, &
1128 smear=scf_control%smear)
1129
1130 DO ispin = 1, nspin
1131 ! does not yet handle k-points
1132 CALL calculate_density_matrix(mos(ispin), &
1133 scf_env%p_mix_new(ispin, 1)%matrix)
1134 END DO
1135
1136 END SUBROUTINE do_special_diag
1137
1138! **************************************************************************************************
1139!> \brief the inner loop of scf, specific to iterative diagonalization using OT
1140!> with S matrix; basically, in goes the ks matrix out goes a new p matrix
1141!> \param scf_env ...
1142!> \param mos ...
1143!> \param matrix_ks ...
1144!> \param matrix_s ...
1145!> \param scf_control ...
1146!> \param scf_section ...
1147!> \param diis_step ...
1148!> \par History
1149!> 10.2008 created [JGH]
1150! **************************************************************************************************
1151 SUBROUTINE do_ot_diag(scf_env, mos, matrix_ks, matrix_s, &
1152 scf_control, scf_section, diis_step)
1153
1154 TYPE(qs_scf_env_type), POINTER :: scf_env
1155 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
1156 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
1157 TYPE(scf_control_type), POINTER :: scf_control
1158 TYPE(section_vals_type), POINTER :: scf_section
1159 LOGICAL, INTENT(INOUT) :: diis_step
1160
1161 INTEGER :: homo, ispin, nmo, nspin
1162 REAL(kind=dp) :: diis_error, eps_iter
1163 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
1164 TYPE(cp_fm_type), POINTER :: mo_coeff
1165
1166 NULLIFY (eigenvalues)
1167
1168 nspin = SIZE(matrix_ks)
1169
1170 DO ispin = 1, nspin
1171 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, &
1172 scf_env%scf_work1(ispin))
1173 END DO
1174
1175 IF ((scf_env%iter_count > 1) .AND. (.NOT. scf_env%skip_diis)) THEN
1176 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1177 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1178 scf_control%eps_diis, scf_control%nmixing, &
1179 s_matrix=matrix_s, &
1180 scf_section=scf_section)
1181 ELSE
1182 diis_step = .false.
1183 END IF
1184
1185 eps_iter = scf_control%diagonalization%eps_iter
1186 IF (diis_step) THEN
1187 scf_env%iter_param = diis_error
1188 scf_env%iter_method = "DIIS/OTdiag"
1189 DO ispin = 1, nspin
1190 CALL copy_fm_to_dbcsr(scf_env%scf_work1(ispin), &
1191 matrix_ks(ispin)%matrix, keep_sparsity=.true.)
1192 END DO
1193 eps_iter = max(eps_iter, scf_control%diagonalization%eps_adapt*diis_error)
1194 ELSE
1195 IF (scf_env%mixing_method == 1) THEN
1196 scf_env%iter_param = scf_env%p_mix_alpha
1197 scf_env%iter_method = "P_Mix/OTdiag."
1198 ELSEIF (scf_env%mixing_method > 1) THEN
1199 scf_env%iter_param = scf_env%mixing_store%alpha
1200 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/OTdiag."
1201 END IF
1202 END IF
1203
1204 scf_env%iter_delta = 0.0_dp
1205
1206 DO ispin = 1, nspin
1207 CALL get_mo_set(mos(ispin), &
1208 mo_coeff=mo_coeff, &
1209 eigenvalues=eigenvalues, &
1210 nmo=nmo, &
1211 homo=homo)
1212 CALL ot_eigensolver(matrix_h=matrix_ks(ispin)%matrix, &
1213 matrix_s=matrix_s(1)%matrix, &
1214 matrix_c_fm=mo_coeff, &
1215 preconditioner=scf_env%ot_preconditioner(1)%preconditioner, &
1216 eps_gradient=eps_iter, &
1217 iter_max=scf_control%diagonalization%max_iter, &
1218 silent=.true., &
1219 ot_settings=scf_control%diagonalization%ot_settings)
1220 CALL calculate_subspace_eigenvalues(mo_coeff, matrix_ks(ispin)%matrix, &
1221 evals_arg=eigenvalues, &
1222 do_rotation=.true.)
1223 CALL copy_fm_to_dbcsr(mos(ispin)%mo_coeff, &
1224 mos(ispin)%mo_coeff_b)
1225 !fm->dbcsr
1226 END DO
1227
1228 CALL set_mo_occupation(mo_array=mos, &
1229 smear=scf_control%smear)
1230
1231 DO ispin = 1, nspin
1232 ! does not yet handle k-points
1233 CALL calculate_density_matrix(mos(ispin), &
1234 scf_env%p_mix_new(ispin, 1)%matrix)
1235 END DO
1236
1237 END SUBROUTINE do_ot_diag
1238
1239! **************************************************************************************************
1240!> \brief Solve a set restricted open Kohn-Sham (ROKS) equations based on the
1241!> alpha and beta Kohn-Sham matrices from unrestricted Kohn-Sham.
1242!> \param scf_env ...
1243!> \param mos ...
1244!> \param matrix_ks ...
1245!> \param matrix_s ...
1246!> \param scf_control ...
1247!> \param scf_section ...
1248!> \param diis_step ...
1249!> \param orthogonal_basis ...
1250!> \par History
1251!> 04.2006 created [MK]
1252!> Revised (01.05.06,MK)
1253!> \note
1254!> this is only a high-spin ROKS.
1255! **************************************************************************************************
1256 SUBROUTINE do_roks_diag(scf_env, mos, matrix_ks, matrix_s, &
1257 scf_control, scf_section, diis_step, &
1258 orthogonal_basis)
1259
1260 ! Literature: - C. C. J. Roothaan, Rev. Mod. Phys. 32, 179 (1960)
1261 ! - M. F. Guest and V. R. Saunders, Mol. Phys. 28(3), 819 (1974)
1262 ! - M. Filatov and S. Shaik, Chem. Phys. Lett. 288, 689 (1998)
1263
1264 TYPE(qs_scf_env_type), POINTER :: scf_env
1265 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos
1266 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
1267 TYPE(scf_control_type), POINTER :: scf_control
1268 TYPE(section_vals_type), POINTER :: scf_section
1269 LOGICAL, INTENT(INOUT) :: diis_step
1270 LOGICAL, INTENT(IN) :: orthogonal_basis
1271
1272 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_roks_diag'
1273
1274 INTEGER :: handle, homoa, homob, imo, nalpha, nao, &
1275 nbeta, nmo
1276 REAL(kind=dp) :: diis_error, level_shift_loc
1277 REAL(kind=dp), DIMENSION(:), POINTER :: eiga, eigb, occa, occb
1278 TYPE(cp_fm_type), POINTER :: ksa, ksb, mo2ao, moa, mob, ortho, work
1279
1280! -------------------------------------------------------------------------
1281
1282 CALL timeset(routinen, handle)
1283
1284 IF (scf_env%cholesky_method == cholesky_inverse) THEN
1285 ortho => scf_env%ortho_m1
1286 ELSE
1287 ortho => scf_env%ortho
1288 END IF
1289 work => scf_env%scf_work2
1290
1291 ksa => scf_env%scf_work1(1)
1292 ksb => scf_env%scf_work1(2)
1293
1294 CALL copy_dbcsr_to_fm(matrix_ks(1)%matrix, ksa)
1295 CALL copy_dbcsr_to_fm(matrix_ks(2)%matrix, ksb)
1296
1297 ! Get MO information
1298
1299 CALL get_mo_set(mo_set=mos(1), &
1300 nao=nao, &
1301 nmo=nmo, &
1302 nelectron=nalpha, &
1303 homo=homoa, &
1304 eigenvalues=eiga, &
1305 occupation_numbers=occa, &
1306 mo_coeff=moa)
1307
1308 CALL get_mo_set(mo_set=mos(2), &
1309 nelectron=nbeta, &
1310 homo=homob, &
1311 eigenvalues=eigb, &
1312 occupation_numbers=occb, &
1313 mo_coeff=mob)
1314
1315 ! Define the amount of level-shifting
1316
1317 IF ((scf_control%level_shift /= 0.0_dp) .AND. &
1318 ((scf_control%density_guess == core_guess) .OR. &
1319 (scf_control%density_guess == restart_guess) .OR. &
1320 (scf_env%iter_count > 1))) THEN
1321 level_shift_loc = scf_control%level_shift
1322 ELSE
1323 level_shift_loc = 0.0_dp
1324 END IF
1325
1326 IF ((scf_env%iter_count > 1) .OR. &
1327 (scf_control%density_guess == core_guess) .OR. &
1328 (scf_control%density_guess == restart_guess)) THEN
1329
1330 ! Transform the spin unrestricted alpha and beta Kohn-Sham matrices
1331 ! from AO basis to MO basis: K(MO) = C(T)*K(AO)*C
1332
1333 CALL cp_fm_symm("L", "U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1334 CALL parallel_gemm("T", "N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1335
1336 CALL cp_fm_symm("L", "U", nao, nao, 1.0_dp, ksb, moa, 0.0_dp, work)
1337 CALL parallel_gemm("T", "N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksb)
1338
1339 ! Combine the spin unrestricted alpha and beta Kohn-Sham matrices
1340 ! in the MO basis
1341
1342 IF (scf_control%roks_scheme == general_roks) THEN
1343 CALL combine_ks_matrices(ksa, ksb, occa, occb, scf_control%roks_f, &
1344 nalpha, nbeta)
1345 ELSE IF (scf_control%roks_scheme == high_spin_roks) THEN
1346 CALL combine_ks_matrices(ksa, ksb, occa, occb, scf_control%roks_parameter)
1347 ELSE
1348 cpabort("Unknown ROKS scheme requested")
1349 END IF
1350
1351 ! Back-transform the restricted open Kohn-Sham matrix from MO basis
1352 ! to AO basis
1353
1354 IF (orthogonal_basis) THEN
1355 ! Q = C
1356 mo2ao => moa
1357 ELSE
1358 ! Q = S*C
1359 mo2ao => mob
1360!MK CALL copy_sm_to_fm(matrix_s(1)%matrix,work)
1361!MK CALL cp_fm_symm("L", "U",nao, nao, 1.0_dp, work, moa, 0.0_dp, mo2ao)
1362 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, moa, mo2ao, nao)
1363 END IF
1364
1365 ! K(AO) = Q*K(MO)*Q(T)
1366
1367 CALL parallel_gemm("N", "T", nao, nao, nao, 1.0_dp, ksa, mo2ao, 0.0_dp, work)
1368 CALL parallel_gemm("N", "N", nao, nao, nao, 1.0_dp, mo2ao, work, 0.0_dp, ksa)
1369
1370 ELSE
1371
1372 ! No transformation matrix available, yet. The closed shell part,
1373 ! i.e. the beta Kohn-Sham matrix in AO basis, is taken.
1374 ! There might be better choices, anyhow.
1375
1376 CALL cp_fm_to_fm(ksb, ksa)
1377
1378 END IF
1379
1380 ! Update DIIS buffer and possibly perform DIIS extrapolation step
1381
1382 IF (scf_env%iter_count > 1) THEN
1383 IF (orthogonal_basis) THEN
1384 CALL qs_diis_b_step(diis_buffer=scf_env%scf_diis_buffer, &
1385 mo_array=mos, &
1386 kc=scf_env%scf_work1, &
1387 sc=work, &
1388 delta=scf_env%iter_delta, &
1389 error_max=diis_error, &
1390 diis_step=diis_step, &
1391 eps_diis=scf_control%eps_diis, &
1392 scf_section=scf_section, &
1393 roks=.true.)
1394 cpassert(scf_env%iter_delta == scf_env%iter_delta)
1395 ELSE
1396 CALL qs_diis_b_step(diis_buffer=scf_env%scf_diis_buffer, &
1397 mo_array=mos, &
1398 kc=scf_env%scf_work1, &
1399 sc=work, &
1400 delta=scf_env%iter_delta, &
1401 error_max=diis_error, &
1402 diis_step=diis_step, &
1403 eps_diis=scf_control%eps_diis, &
1404 scf_section=scf_section, &
1405 s_matrix=matrix_s, &
1406 roks=.true.)
1407 END IF
1408 END IF
1409
1410 IF (diis_step) THEN
1411 scf_env%iter_param = diis_error
1412 scf_env%iter_method = "DIIS/Diag."
1413 ELSE
1414 IF (scf_env%mixing_method == 1) THEN
1415 scf_env%iter_param = scf_env%p_mix_alpha
1416 scf_env%iter_method = "P_Mix/Diag."
1417 ELSEIF (scf_env%mixing_method > 1) THEN
1418 scf_env%iter_param = scf_env%mixing_store%alpha
1419 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Diag."
1420 END IF
1421 END IF
1422
1423 scf_env%iter_delta = 0.0_dp
1424
1425 IF (level_shift_loc /= 0.0_dp) THEN
1426
1427 ! Transform the current Kohn-Sham matrix from AO to MO basis
1428 ! for level-shifting using the current MO set
1429
1430 CALL cp_fm_symm("L", "U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1431 CALL parallel_gemm("T", "N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1432
1433 ! Apply level-shifting using 50:50 split of the shift (could be relaxed)
1434
1435 DO imo = homob + 1, homoa
1436 CALL cp_fm_add_to_element(ksa, imo, imo, 0.5_dp*level_shift_loc)
1437 END DO
1438 DO imo = homoa + 1, nmo
1439 CALL cp_fm_add_to_element(ksa, imo, imo, level_shift_loc)
1440 END DO
1441
1442 ELSE IF (.NOT. orthogonal_basis) THEN
1443
1444 ! Transform the current Kohn-Sham matrix to an orthogonal basis
1445 SELECT CASE (scf_env%cholesky_method)
1446 CASE (cholesky_reduce)
1447 CALL cp_fm_cholesky_reduce(ksa, ortho)
1448 CASE (cholesky_restore)
1449 CALL cp_fm_uplo_to_full(ksa, work)
1450 CALL cp_fm_cholesky_restore(ksa, nao, ortho, work, &
1451 "SOLVE", pos="RIGHT")
1452 CALL cp_fm_cholesky_restore(work, nao, ortho, ksa, &
1453 "SOLVE", pos="LEFT", transa="T")
1454 CASE (cholesky_inverse)
1455 CALL cp_fm_uplo_to_full(ksa, work)
1456 CALL cp_fm_cholesky_restore(ksa, nao, ortho, work, &
1457 "MULTIPLY", pos="RIGHT")
1458 CALL cp_fm_cholesky_restore(work, nao, ortho, ksa, &
1459 "MULTIPLY", pos="LEFT", transa="T")
1460 CASE (cholesky_off)
1461 CALL cp_fm_symm("L", "U", nao, nao, 1.0_dp, ksa, ortho, 0.0_dp, work)
1462 CALL parallel_gemm("N", "N", nao, nao, nao, 1.0_dp, ortho, work, 0.0_dp, ksa)
1463 END SELECT
1464
1465 END IF
1466
1467 ! Diagonalization of the ROKS operator matrix
1468
1469 CALL choose_eigv_solver(ksa, work, eiga)
1470
1471 ! Back-transformation of the orthonormal eigenvectors if needed
1472
1473 IF (level_shift_loc /= 0.0_dp) THEN
1474 ! Use old MO set for back-transformation if level-shifting was applied
1475 CALL cp_fm_to_fm(moa, ortho)
1476 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1477 ELSE
1478 IF (orthogonal_basis) THEN
1479 CALL cp_fm_to_fm(work, moa)
1480 ELSE
1481 SELECT CASE (scf_env%cholesky_method)
1483 CALL cp_fm_cholesky_restore(work, nmo, ortho, moa, "SOLVE")
1484 CASE (cholesky_inverse)
1485 CALL cp_fm_cholesky_restore(work, nmo, ortho, moa, "MULTIPLY")
1486 CASE (cholesky_off)
1487 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1488 END SELECT
1489 END IF
1490 END IF
1491
1492 ! Correct MO eigenvalues, if level-shifting was applied
1493
1494 IF (level_shift_loc /= 0.0_dp) THEN
1495 DO imo = homob + 1, homoa
1496 eiga(imo) = eiga(imo) - 0.5_dp*level_shift_loc
1497 END DO
1498 DO imo = homoa + 1, nmo
1499 eiga(imo) = eiga(imo) - level_shift_loc
1500 END DO
1501 END IF
1502
1503 ! Update also the beta MO set
1504
1505 eigb(:) = eiga(:)
1506 CALL cp_fm_to_fm(moa, mob)
1507
1508 ! Calculate the new alpha and beta density matrix
1509
1510 ! does not yet handle k-points
1511 CALL calculate_density_matrix(mos(1), scf_env%p_mix_new(1, 1)%matrix)
1512 CALL calculate_density_matrix(mos(2), scf_env%p_mix_new(2, 1)%matrix)
1513
1514 CALL timestop(handle)
1515
1516 END SUBROUTINE do_roks_diag
1517
1518! **************************************************************************************************
1519!> \brief iterative diagonalization using the block Krylov-space approach
1520!> \param scf_env ...
1521!> \param mos ...
1522!> \param matrix_ks ...
1523!> \param scf_control ...
1524!> \param scf_section ...
1525!> \param check_moconv_only ...
1526!> \param
1527!> \par History
1528!> 05.2009 created [MI]
1529! **************************************************************************************************
1530
1531 SUBROUTINE do_block_krylov_diag(scf_env, mos, matrix_ks, &
1532 scf_control, scf_section, check_moconv_only)
1533
1534 TYPE(qs_scf_env_type), POINTER :: scf_env
1535 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
1536 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
1537 TYPE(scf_control_type), POINTER :: scf_control
1538 TYPE(section_vals_type), POINTER :: scf_section
1539 LOGICAL, INTENT(IN), OPTIONAL :: check_moconv_only
1540
1541 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_block_krylov_diag'
1542 REAL(kind=dp), PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
1543
1544 INTEGER :: handle, homo, ispin, iter, nao, nmo, &
1545 output_unit
1546 LOGICAL :: converged, my_check_moconv_only
1547 REAL(dp) :: eps_iter, t1, t2
1548 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
1549 TYPE(cp_fm_type), POINTER :: c0, c1, chc, evec, ks, mo_coeff, ortho, &
1550 work
1551 TYPE(cp_logger_type), POINTER :: logger
1552
1553 logger => cp_get_default_logger()
1554 CALL timeset(routinen, handle)
1555
1556 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%LANCZOS", &
1557 extension=".scfLog")
1558
1559 my_check_moconv_only = .false.
1560 IF (PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1561
1562 NULLIFY (mo_coeff, ortho, work, ks)
1563 NULLIFY (mo_eigenvalues)
1564 NULLIFY (c0, c1)
1565
1566 IF (scf_env%cholesky_method == cholesky_inverse) THEN
1567 ortho => scf_env%ortho_m1
1568 ELSE
1569 ortho => scf_env%ortho
1570 END IF
1571 work => scf_env%scf_work2
1572
1573 DO ispin = 1, SIZE(matrix_ks)
1574 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, &
1575 scf_env%scf_work1(ispin))
1576 END DO
1577
1578 IF (scf_env%mixing_method == 1) THEN
1579 scf_env%iter_param = scf_env%p_mix_alpha
1580 scf_env%iter_method = "P_Mix/Lanczos"
1581 ELSE
1582! scf_env%iter_param = scf_env%mixing_store%alpha
1583 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Lanc."
1584 END IF
1585
1586 DO ispin = 1, SIZE(matrix_ks)
1587
1588 ks => scf_env%scf_work1(ispin)
1589 CALL cp_fm_uplo_to_full(ks, work)
1590
1591 CALL get_mo_set(mo_set=mos(ispin), &
1592 nao=nao, &
1593 nmo=nmo, &
1594 homo=homo, &
1595 eigenvalues=mo_eigenvalues, &
1596 mo_coeff=mo_coeff)
1597
1598 NULLIFY (c0, c1)
1599 c0 => scf_env%krylov_space%mo_conv(ispin)
1600 c1 => scf_env%krylov_space%mo_refine(ispin)
1601 SELECT CASE (scf_env%cholesky_method)
1602 CASE (cholesky_reduce)
1603 CALL cp_fm_cholesky_reduce(ks, ortho)
1604 CALL cp_fm_uplo_to_full(ks, work)
1605 CALL cp_fm_cholesky_restore(mo_coeff, nmo, ortho, c0, "MULTIPLY")
1606 CASE (cholesky_restore)
1607 CALL cp_fm_cholesky_restore(ks, nao, ortho, work, &
1608 "SOLVE", pos="RIGHT")
1609 CALL cp_fm_cholesky_restore(work, nao, ortho, ks, &
1610 "SOLVE", pos="LEFT", transa="T")
1611 CALL cp_fm_cholesky_restore(mo_coeff, nmo, ortho, c0, "MULTIPLY")
1612 CASE (cholesky_inverse)
1613 CALL cp_fm_cholesky_restore(ks, nao, ortho, work, &
1614 "MULTIPLY", pos="RIGHT")
1615 CALL cp_fm_cholesky_restore(work, nao, ortho, ks, &
1616 "MULTIPLY", pos="LEFT", transa="T")
1617 CALL cp_fm_cholesky_restore(mo_coeff, nmo, ortho, c0, "SOLVE")
1618 END SELECT
1619
1620 scf_env%krylov_space%nmo_nc = nmo
1621 scf_env%krylov_space%nmo_conv = 0
1622
1623 t1 = m_walltime()
1624 IF (output_unit > 0) THEN
1625 WRITE (output_unit, "(/T15,A)") '<<<<<<<<< LANCZOS REFINEMENT <<<<<<<<<<'
1626 WRITE (output_unit, "(T8,A,T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
1627 " Spin ", " Cycle ", &
1628 " conv. MOS ", " B2MAX ", " B2MIN ", " Time", repeat("-", 60)
1629 END IF
1630 eps_iter = max(scf_env%krylov_space%eps_conv, scf_env%krylov_space%eps_adapt*scf_env%iter_delta)
1631 iter = 0
1632 converged = .false.
1633 !Check convergence of MOS
1634 IF (my_check_moconv_only) THEN
1635
1636 CALL lanczos_refinement(scf_env%krylov_space, ks, c0, c1, mo_eigenvalues, &
1637 nao, eps_iter, ispin, check_moconv_only=my_check_moconv_only)
1638 t2 = m_walltime()
1639 IF (output_unit > 0) &
1640 WRITE (output_unit, '(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1641 ispin, iter, scf_env%krylov_space%nmo_conv, &
1642 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1643
1644 cycle
1645 ELSE
1646 !Block Lanczos refinement
1647 DO iter = 1, scf_env%krylov_space%max_iter
1648 CALL lanczos_refinement_2v(scf_env%krylov_space, ks, c0, c1, mo_eigenvalues, &
1649 nao, eps_iter, ispin)
1650 t2 = m_walltime()
1651 IF (output_unit > 0) THEN
1652 WRITE (output_unit, '(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1653 ispin, iter, scf_env%krylov_space%nmo_conv, &
1654 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1655 END IF
1656 t1 = m_walltime()
1657 IF (scf_env%krylov_space%max_res_norm < eps_iter) THEN
1658 converged = .true.
1659 IF (output_unit > 0) WRITE (output_unit, *) &
1660 " Reached convergence in ", iter, " iterations "
1661 EXIT
1662 END IF
1663 END DO
1664
1665 IF (.NOT. converged .AND. output_unit > 0) THEN
1666 WRITE (output_unit, "(T4, A)") " WARNING Lanczos refinement could "// &
1667 "not converge all the mos:"
1668 WRITE (output_unit, "(T40,A,T70,I10)") " number of not converged mos ", &
1669 scf_env%krylov_space%nmo_nc
1670 WRITE (output_unit, "(T40,A,T70,E10.2)") " max norm of the residual ", &
1671 scf_env%krylov_space%max_res_norm
1672
1673 END IF
1674
1675 ! For the moment skip the re-orthogonalization
1676 IF (.false.) THEN
1677 !Re-orthogonalization
1678 NULLIFY (chc, evec)
1679 chc => scf_env%krylov_space%chc_mat(ispin)
1680 evec => scf_env%krylov_space%c_vec(ispin)
1681 CALL parallel_gemm('N', 'N', nao, nmo, nao, rone, ks, c0, rzero, work)
1682 CALL parallel_gemm('T', 'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
1683 !Diagonalize (C^t)HC
1684 CALL choose_eigv_solver(chc, evec, mo_eigenvalues)
1685 !Rotate the C vectors
1686 CALL parallel_gemm('N', 'N', nao, nmo, nmo, rone, c0, evec, rzero, c1)
1687 c0 => scf_env%krylov_space%mo_refine(ispin)
1688 END IF
1689
1690 IF (scf_env%cholesky_method == cholesky_inverse) THEN
1691 CALL cp_fm_cholesky_restore(c0, nmo, ortho, mo_coeff, "MULTIPLY")
1692 ELSE
1693 CALL cp_fm_cholesky_restore(c0, nmo, ortho, mo_coeff, "SOLVE")
1694 END IF
1695
1696 CALL set_mo_occupation(mo_set=mos(ispin), &
1697 smear=scf_control%smear)
1698
1699 ! does not yet handle k-points
1700 CALL calculate_density_matrix(mos(ispin), &
1701 scf_env%p_mix_new(ispin, 1)%matrix)
1702 END IF
1703 END DO ! ispin
1704
1705 IF (output_unit > 0) THEN
1706 WRITE (output_unit, "(T15,A/)") '<<<<<<<<< END LANCZOS REFINEMENT <<<<<<<<<<'
1707 END IF
1708
1709 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1710 "PRINT%LANCZOS")
1711
1712 CALL timestop(handle)
1713
1714 END SUBROUTINE do_block_krylov_diag
1715
1716! **************************************************************************************************
1717!> \brief iterative diagonalization using the block davidson space approach
1718!> \param qs_env ...
1719!> \param scf_env ...
1720!> \param mos ...
1721!> \param matrix_ks ...
1722!> \param matrix_s ...
1723!> \param scf_control ...
1724!> \param scf_section ...
1725!> \param check_moconv_only ...
1726!> \param
1727!> \par History
1728!> 05.2011 created [MI]
1729! **************************************************************************************************
1730
1731 SUBROUTINE do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, &
1732 scf_control, scf_section, check_moconv_only)
1733
1734 TYPE(qs_environment_type), POINTER :: qs_env
1735 TYPE(qs_scf_env_type), POINTER :: scf_env
1736 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
1737 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
1738 TYPE(scf_control_type), POINTER :: scf_control
1739 TYPE(section_vals_type), POINTER :: scf_section
1740 LOGICAL, INTENT(IN), OPTIONAL :: check_moconv_only
1741
1742 CHARACTER(LEN=*), PARAMETER :: routinen = 'do_block_davidson_diag'
1743
1744 INTEGER :: handle, ispin, nspins, output_unit
1745 LOGICAL :: do_prec, my_check_moconv_only
1746 TYPE(cp_logger_type), POINTER :: logger
1747
1748 logger => cp_get_default_logger()
1749 CALL timeset(routinen, handle)
1750
1751 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DAVIDSON", &
1752 extension=".scfLog")
1753
1754 IF (output_unit > 0) &
1755 WRITE (output_unit, "(/T15,A)") '<<<<<<<<< DAVIDSON ITERATIONS <<<<<<<<<<'
1756
1757 IF (scf_env%mixing_method == 1) THEN
1758 scf_env%iter_param = scf_env%p_mix_alpha
1759 scf_env%iter_method = "P_Mix/Dav."
1760 ELSE
1761 scf_env%iter_param = scf_env%mixing_store%alpha
1762 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Dav."
1763 END IF
1764
1765 my_check_moconv_only = .false.
1766 IF (PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1767 do_prec = .false.
1768 IF (scf_env%block_davidson_env(1)%prec_type /= 0 .AND. &
1769 scf_env%iter_count >= scf_env%block_davidson_env(1)%first_prec) THEN
1770 do_prec = .true.
1771 END IF
1772
1773 nspins = SIZE(matrix_ks)
1774
1775 IF (do_prec .AND. (scf_env%iter_count == scf_env%block_davidson_env(1)%first_prec .OR. &
1776 modulo(scf_env%iter_count, scf_env%block_davidson_env(1)%niter_new_prec) == 0)) THEN
1777 CALL restart_preconditioner(qs_env, scf_env%ot_preconditioner, &
1778 prec_type=scf_env%block_davidson_env(1)%prec_type, nspins=nspins)
1779 CALL prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, scf_env%ot_preconditioner, &
1780 scf_env%block_davidson_env(1)%prec_type, &
1781 scf_env%block_davidson_env(1)%solver_type, &
1782 scf_env%block_davidson_env(1)%energy_gap, nspins, &
1783 convert_to_dbcsr=scf_env%block_davidson_env(1)%use_sparse_mos, &
1784 full_mo_set=.true.)
1785 END IF
1786
1787 DO ispin = 1, nspins
1788 IF (scf_env%block_davidson_env(ispin)%use_sparse_mos) THEN
1789 IF (.NOT. do_prec) THEN
1790 CALL generate_extended_space_sparse(scf_env%block_davidson_env(ispin), mos(ispin), &
1791 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1792 ELSE
1793 CALL generate_extended_space_sparse(scf_env%block_davidson_env(ispin), mos(ispin), &
1794 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1795 scf_env%ot_preconditioner(ispin)%preconditioner)
1796 END IF
1797
1798 ELSE
1799 IF (.NOT. do_prec) THEN
1800 CALL generate_extended_space(scf_env%block_davidson_env(ispin), mos(ispin), &
1801 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1802 ELSE
1803 CALL generate_extended_space(scf_env%block_davidson_env(ispin), mos(ispin), &
1804 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1805 scf_env%ot_preconditioner(ispin)%preconditioner)
1806 END IF
1807 END IF
1808 END DO !ispin
1809
1810 CALL set_mo_occupation(mo_array=mos, &
1811 smear=scf_control%smear)
1812
1813 DO ispin = 1, nspins
1814 ! does not yet handle k-points
1815 CALL calculate_density_matrix(mos(ispin), &
1816 scf_env%p_mix_new(ispin, 1)%matrix)
1817 END DO
1818
1819 IF (output_unit > 0) THEN
1820 WRITE (output_unit, "(T15,A/)") '<<<<<<<<< END DAVIDSON ITERATION <<<<<<<<<<'
1821 END IF
1822
1823 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1824 "PRINT%DAVIDSON")
1825
1826 CALL timestop(handle)
1827
1828 END SUBROUTINE do_block_davidson_diag
1829
1830END MODULE qs_scf_diagonalization
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b).
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
used for collecting diagonalization schemes available for cp_cfm_type
Definition cp_cfm_diag.F:14
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public cp_cfm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical orthogonalization.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, set_zero)
Creates a new full matrix with the given structure.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full matrix
subroutine, public cp_fm_symm(side, uplo, m, n, alpha, matrix_a, matrix_b, beta, matrix_c)
computes matrix_c = beta * matrix_c + alpha * matrix_a * matrix_b computes matrix_c = beta * matrix_c...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
Definition cp_fm_diag.F:17
subroutine, public cp_fm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
Definition cp_fm_diag.F:234
subroutine, public cp_fm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical diagonalization : U*s**(-1/2)
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_add_to_element(matrix, irow_global, icol_global, alpha)
...
subroutine, public cp_fm_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public core_guess
integer, parameter, public cholesky_restore
integer, parameter, public cholesky_dbcsr
integer, parameter, public cholesky_off
integer, parameter, public cholesky_reduce
integer, parameter, public high_spin_roks
integer, parameter, public cholesky_inverse
integer, parameter, public general_roks
integer, parameter, public restart_guess
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
subroutine, public kpoint_set_mo_occupation(kpoint, smear, probe)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:136
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:153
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public restart_preconditioner(qs_env, preconditioner, prec_type, nspins)
Allows for a restart of the preconditioner depending on the method it purges all arrays or keeps them...
subroutine, public prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, ot_preconditioner, prec_type, solver_type, energy_gap, nspins, has_unit_metric, convert_to_dbcsr, chol_type, full_mo_set)
...
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public direct_mixing_nr
integer, parameter, public gspace_mixing_nr
Apply the direct inversion in the iterative subspace (DIIS) of Pulay in the framework of an SCF itera...
Definition qs_diis.F:21
subroutine, public qs_diis_b_info_kp(diis_buffer, ib, nb)
Update info about the current buffer step ib and the current number of buffers nb.
Definition qs_diis.F:989
subroutine, public qs_diis_b_calc_err_kp(diis_buffer, ib, mos, kc, sc, ispin, ikp, nkp_local, scf_section)
Calculate and store the error for a given k-point.
Definition qs_diis.F:1013
subroutine, public qs_diis_b_step_kp(diis_buffer, coeffs, ib, nb, delta, error_max, diis_step, eps_diis, nspin, nkp, nkp_local, nmixing, scf_section, para_env)
Update the SCF DIIS buffer, and if appropriate does a diis step, for k-points.
Definition qs_diis.F:1100
subroutine, public qs_diis_b_step(diis_buffer, mo_array, kc, sc, delta, error_max, diis_step, eps_diis, nmixing, s_matrix, scf_section, roks)
Update the SCF DIIS buffer, and if appropriate does a diis step.
Definition qs_diis.F:230
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
collects routines that perform operations directly related to MOs
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
module that contains the algorithms to perform an iterative diagonalization by the block-Davidson app...
subroutine, public generate_extended_space_sparse(bdav_env, mo_set, matrix_h, matrix_s, output_unit, preconditioner)
...
subroutine, public generate_extended_space(bdav_env, mo_set, matrix_h, matrix_s, output_unit, preconditioner)
...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public general_eigenproblem(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization with S matrix basically, in goes the ks matrix out...
subroutine, public diag_subspace_allocate(subspace_env, qs_env, mos)
...
subroutine, public do_ot_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to iterative diagonalization using OT with S matrix; basically,...
subroutine, public do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block davidson space approach
subroutine, public do_roks_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, orthogonal_basis)
Solve a set restricted open Kohn-Sham (ROKS) equations based on the alpha and beta Kohn-Sham matrices...
subroutine, public do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, ks_env, scf_section, scf_control)
inner loop within MOS subspace, to refine occupation and density, before next diagonalization of the ...
subroutine, public do_block_krylov_diag(scf_env, mos, matrix_ks, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block Krylov-space approach
subroutine, public do_special_diag(scf_env, mos, matrix_ks, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization without S matrix basically, in goes the ks matrix ...
subroutine, public do_general_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, probe)
...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env, probe)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
module that contains the algorithms to perform an iterative diagonalization by the block-Lanczos appr...
subroutine, public lanczos_refinement(krylov_space, ks, c0, c1, eval, nao, eps_iter, ispin, check_moconv_only)
lanczos refinement by blocks of non-converged MOs
subroutine, public lanczos_refinement_2v(krylov_space, ks, c0, c1, eval, nao, eps_iter, ispin, check_moconv_only)
...
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public eigensolver_simple(matrix_ks, mo_set, work, do_level_shift, level_shift, use_jacobi, jacobi_threshold)
...
subroutine, public eigensolver_dbcsr(matrix_ks, matrix_ks_fm, mo_set, ortho_dbcsr, ksbuf1, ksbuf2)
...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public eigensolver(matrix_ks_fm, mo_set, ortho, work, cholesky_method, do_level_shift, level_shift, matrix_u_fm, use_jacobi)
Diagonalise the Kohn-Sham matrix to get a new set of MO eigen- vectors and MO eigenvalues....
subroutine, public eigensolver_symm(matrix_ks_fm, mo_set, ortho, work, do_level_shift, level_shift, matrix_u_fm, use_jacobi, jacobi_threshold, ortho_red, work_red, matrix_ks_fm_red, matrix_u_fm_red)
...
module that contains the definitions of the scf types
parameters that control an scf iteration
represent a pointer to a 1d array
Represent a complex full matrix.
keeps the information about the structure of a full matrix
Stores the state of a copy between cp_fm_start_copy_general and cp_fm_finish_copy_general.
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
container for the pools of matrixes used by qs
keeps the density in various representations, keeping track of which ones are valid.