102#include "./base/base_uses.f90"
108 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'almo_scf'
112 LOGICAL,
PARAMETER :: debug_mode = .false.
113 LOGICAL,
PARAMETER :: safe_mode = .false.
127 LOGICAL,
INTENT(IN) :: calc_forces
129 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_entry_scf'
134 CALL timeset(routinen, handle)
139 CALL get_qs_env(qs_env, almo_scf_env=almo_scf_env)
142 CALL almo_scf_init(qs_env, almo_scf_env, calc_forces)
145 CALL almo_scf_initial_guess(qs_env, almo_scf_env)
148 CALL almo_scf_main(qs_env, almo_scf_env)
151 CALL almo_scf_delocalization(qs_env, almo_scf_env)
154 CALL construct_nlmos(qs_env, almo_scf_env)
160 CALL almo_scf_post(qs_env, almo_scf_env)
163 CALL almo_scf_clean_up(almo_scf_env)
165 CALL timestop(handle)
179 SUBROUTINE almo_scf_init(qs_env, almo_scf_env, calc_forces)
182 LOGICAL,
INTENT(IN) :: calc_forces
184 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_init'
186 INTEGER :: ao, handle, i, iao, idomain, ispin, &
187 multip, naos, natoms, ndomains, nelec, &
188 nelec_a, nelec_b, nmols, nspins, &
196 CALL timeset(routinen, handle)
200 IF (logger%para_env%is_source())
THEN
208 almo_scf_env%opt_block_diag_pcg%optimizer_type =
optimizer_pcg
218 nelectron_total=almo_scf_env%nelectrons_total, &
220 dft_control=dft_control, &
221 molecule_set=molecule_set, &
223 has_unit_metric=almo_scf_env%orthogonal_basis, &
224 para_env=almo_scf_env%para_env, &
225 blacs_env=almo_scf_env%blacs_env, &
226 nelectron_spin=almo_scf_env%nelectrons_spin)
227 CALL almo_scf_env%para_env%retain()
228 CALL almo_scf_env%blacs_env%retain()
231 almo_scf_env%nspins = dft_control%nspins
232 almo_scf_env%nmolecules =
SIZE(molecule_set)
234 nfullrows_total=naos, nblkrows_total=almo_scf_env%natoms)
235 almo_scf_env%naos = naos
237 almo_scf_env%smear = dft_control%smear
238 IF (almo_scf_env%smear)
THEN
240 IF ((almo_scf_env%almo_update_algorithm /=
almo_scf_diag) .OR. &
242 (almo_scf_env%xalmo_update_algorithm /=
almo_scf_diag)))
THEN
243 cpabort(
"ALMO smearing is currently implemented for DIAG algorithm only")
246 cpabort(
"Only Fermi-Dirac smearing is currently compatible with ALMO")
248 almo_scf_env%smear_e_temp = qs_env%scf_control%smear%electronic_temperature
251 cpabort(
"ALMO smearing was designed to work with molecular fragments only")
256 nmols = almo_scf_env%nmolecules
257 natoms = almo_scf_env%natoms
261 almo_scf_env%ndomains = almo_scf_env%nmolecules
263 almo_scf_env%ndomains = almo_scf_env%natoms
266 IF (
ALLOCATED(almo_scf_env%activate) .AND. almo_scf_env%activate(1) > 1)
THEN
267 DEALLOCATE (almo_scf_env%activate)
270 IF (.NOT.
ALLOCATED(almo_scf_env%activate))
THEN
271 ALLOCATE (almo_scf_env%activate(1))
272 almo_scf_env%activate = 0
275 IF (almo_scf_env%activate(1) == 1)
THEN
277 ndomains =
SIZE(almo_scf_env%multiplicity_of_domain)
278 nspins =
SIZE(almo_scf_env%multiplicity_of_domain)
280 nspins = almo_scf_env%nspins
281 ndomains = almo_scf_env%ndomains
284 IF (almo_scf_env%activate(1) == 0)
THEN
286 ALLOCATE (almo_scf_env%charge_of_domain(ndomains))
287 ALLOCATE (almo_scf_env%multiplicity_of_domain(ndomains))
292 ALLOCATE (almo_scf_env%domain_index_of_atom(natoms))
293 ALLOCATE (almo_scf_env%domain_index_of_ao(naos))
294 ALLOCATE (almo_scf_env%first_atom_of_domain(ndomains))
295 ALLOCATE (almo_scf_env%last_atom_of_domain(ndomains))
296 ALLOCATE (almo_scf_env%nbasis_of_domain(ndomains))
297 ALLOCATE (almo_scf_env%nocc_of_domain(ndomains, nspins))
298 ALLOCATE (almo_scf_env%real_ne_of_domain(ndomains, nspins))
299 ALLOCATE (almo_scf_env%nvirt_full_of_domain(ndomains, nspins))
300 ALLOCATE (almo_scf_env%nvirt_of_domain(ndomains, nspins))
301 ALLOCATE (almo_scf_env%nvirt_disc_of_domain(ndomains, nspins))
302 ALLOCATE (almo_scf_env%mu_of_domain(ndomains, nspins))
303 ALLOCATE (almo_scf_env%cpu_of_domain(ndomains))
308 IF (almo_scf_env%activate(1) == 1)
THEN
310 atom_to_mol=almo_scf_env%domain_index_of_atom, &
311 mol_to_first_atom=almo_scf_env%first_atom_of_domain, &
312 mol_to_last_atom=almo_scf_env%last_atom_of_domain, &
313 mol_to_nelectrons=almo_scf_env%nocc_of_domain(1:ndomains, 1), &
314 mol_to_nbasis=almo_scf_env%nbasis_of_domain)
318 atom_to_mol=almo_scf_env%domain_index_of_atom, &
319 mol_to_first_atom=almo_scf_env%first_atom_of_domain, &
320 mol_to_last_atom=almo_scf_env%last_atom_of_domain, &
321 mol_to_nelectrons=almo_scf_env%nocc_of_domain(1:ndomains, 1), &
322 mol_to_nbasis=almo_scf_env%nbasis_of_domain, &
323 mol_to_charge=almo_scf_env%charge_of_domain, &
324 mol_to_multiplicity=almo_scf_env%multiplicity_of_domain)
330 DO idomain = 1, ndomains
331 IF (almo_scf_env%activate(1) == 1)
THEN
332 nelec = almo_scf_env%nocc_of_domain(idomain, 1) - almo_scf_env%charge_of_domain(idomain)
334 nelec = almo_scf_env%nocc_of_domain(idomain, 1)
337 multip = almo_scf_env%multiplicity_of_domain(idomain)
338 nelec_a = (nelec + multip - 1)/2
341 IF (almo_scf_env%smear)
THEN
342 cpwarn_if(multip > 1,
"BEWARE: Non singlet state detected, treating it as closed-shell")
345 almo_scf_env%real_ne_of_domain(idomain, :) = real(nelec, kind=
dp)/2.0_dp
348 almo_scf_env%nocc_of_domain(idomain, :) = ceiling(almo_scf_env%real_ne_of_domain(idomain, :)) &
349 + (almo_scf_env%last_atom_of_domain(idomain) &
350 - almo_scf_env%first_atom_of_domain(idomain) + 1)
352 almo_scf_env%nocc_of_domain(idomain, 1) = nelec_a
353 nelec_b = nelec - nelec_a
354 IF (almo_scf_env%activate(1) == 1)
THEN
355 almo_scf_env%nocc_of_domain(idomain, 2) = nelec_b
358 IF (nelec_a /= nelec_b)
THEN
359 IF (nspins == 1)
THEN
361 cpabort(
"odd e- -- use unrestricted methods")
369 almo_scf_env%nvirt_full_of_domain(:, ispin) = &
370 almo_scf_env%nbasis_of_domain(:) - &
371 almo_scf_env%nocc_of_domain(:, ispin)
373 SELECT CASE (almo_scf_env%deloc_truncate_virt)
375 almo_scf_env%nvirt_of_domain(:, ispin) = &
376 almo_scf_env%nvirt_full_of_domain(:, ispin)
377 almo_scf_env%nvirt_disc_of_domain(:, ispin) = 0
379 DO idomain = 1, ndomains
380 almo_scf_env%nvirt_of_domain(idomain, ispin) = &
381 min(almo_scf_env%deloc_virt_per_domain, &
382 almo_scf_env%nvirt_full_of_domain(idomain, ispin))
383 almo_scf_env%nvirt_disc_of_domain(idomain, ispin) = &
384 almo_scf_env%nvirt_full_of_domain(idomain, ispin) - &
385 almo_scf_env%nvirt_of_domain(idomain, ispin)
388 DO idomain = 1, ndomains
389 almo_scf_env%nvirt_of_domain(idomain, ispin) = &
390 min(almo_scf_env%nocc_of_domain(idomain, ispin), &
391 almo_scf_env%nvirt_full_of_domain(idomain, ispin))
392 almo_scf_env%nvirt_disc_of_domain(idomain, ispin) = &
393 almo_scf_env%nvirt_full_of_domain(idomain, ispin) - &
394 almo_scf_env%nvirt_of_domain(idomain, ispin)
397 cpabort(
"illegal method for virtual space truncation")
402 almo_scf_env%domain_index_of_atom(1:natoms) = [(i, i=1, natoms)]
406 DO idomain = 1, ndomains
407 DO iao = 1, almo_scf_env%nbasis_of_domain(idomain)
408 almo_scf_env%domain_index_of_ao(ao) = idomain
413 almo_scf_env%mu_of_domain(:, :) = almo_scf_env%mu
418 ALLOCATE (almo_scf_env%domain_index_of_ao_block(natoms))
419 almo_scf_env%domain_index_of_ao_block(:) = &
420 almo_scf_env%domain_index_of_atom(:)
422 ALLOCATE (almo_scf_env%domain_index_of_ao_block(nmols))
424 almo_scf_env%domain_index_of_ao_block(:) = [(i, i=1, nmols)]
428 ALLOCATE (almo_scf_env%domain_index_of_mo_block(natoms))
429 almo_scf_env%domain_index_of_mo_block(:) = &
430 almo_scf_env%domain_index_of_atom(:)
432 ALLOCATE (almo_scf_env%domain_index_of_mo_block(nmols))
434 almo_scf_env%domain_index_of_mo_block(:) = [(i, i=1, nmols)]
440 almo_scf_env%need_previous_ks = .true.
446 almo_scf_env%need_virtuals = .true.
447 almo_scf_env%need_orbital_energies = .true.
450 almo_scf_env%calc_forces = calc_forces
451 IF (calc_forces)
THEN
456 cpabort(
"Forces for perturbative methods are NYI. Change DELOCALIZE_METHOD")
459 IF (almo_scf_env%almo_history%istore > (almo_scf_env%almo_history%nstore + 1))
THEN
460 IF (almo_scf_env%opt_block_diag_pcg%eps_error_early > 0.0_dp)
THEN
461 almo_scf_env%opt_block_diag_pcg%eps_error = almo_scf_env%opt_block_diag_pcg%eps_error_early
462 almo_scf_env%opt_block_diag_pcg%early_stopping_on = .true.
463 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"ALMO_OPTIMIZER_PCG: EPS_ERROR_EARLY is on"
465 IF (almo_scf_env%opt_block_diag_diis%eps_error_early > 0.0_dp)
THEN
466 almo_scf_env%opt_block_diag_diis%eps_error = almo_scf_env%opt_block_diag_diis%eps_error_early
467 almo_scf_env%opt_block_diag_diis%early_stopping_on = .true.
468 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"ALMO_OPTIMIZER_DIIS: EPS_ERROR_EARLY is on"
470 IF (almo_scf_env%opt_block_diag_pcg%max_iter_early > 0)
THEN
471 almo_scf_env%opt_block_diag_pcg%max_iter = almo_scf_env%opt_block_diag_pcg%max_iter_early
472 almo_scf_env%opt_block_diag_pcg%early_stopping_on = .true.
473 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"ALMO_OPTIMIZER_PCG: MAX_ITER_EARLY is on"
475 IF (almo_scf_env%opt_block_diag_diis%max_iter_early > 0)
THEN
476 almo_scf_env%opt_block_diag_diis%max_iter = almo_scf_env%opt_block_diag_diis%max_iter_early
477 almo_scf_env%opt_block_diag_diis%early_stopping_on = .true.
478 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"ALMO_OPTIMIZER_DIIS: MAX_ITER_EARLY is on"
481 almo_scf_env%opt_block_diag_diis%early_stopping_on = .false.
482 almo_scf_env%opt_block_diag_pcg%early_stopping_on = .false.
484 IF (almo_scf_env%xalmo_history%istore > (almo_scf_env%xalmo_history%nstore + 1))
THEN
485 IF (almo_scf_env%opt_xalmo_pcg%eps_error_early > 0.0_dp)
THEN
486 almo_scf_env%opt_xalmo_pcg%eps_error = almo_scf_env%opt_xalmo_pcg%eps_error_early
487 almo_scf_env%opt_xalmo_pcg%early_stopping_on = .true.
488 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"XALMO_OPTIMIZER_PCG: EPS_ERROR_EARLY is on"
490 IF (almo_scf_env%opt_xalmo_pcg%max_iter_early > 0.0_dp)
THEN
491 almo_scf_env%opt_xalmo_pcg%max_iter = almo_scf_env%opt_xalmo_pcg%max_iter_early
492 almo_scf_env%opt_xalmo_pcg%early_stopping_on = .true.
493 IF (unit_nr > 0)
WRITE (unit_nr,
"(/,T2,A)")
"XALMO_OPTIMIZER_PCG: MAX_ITER_EARLY is on"
496 almo_scf_env%opt_xalmo_pcg%early_stopping_on = .false.
501 CALL almo_scf_env_create_matrices(almo_scf_env, matrix_s(1)%matrix)
504 almo_scf_env%s_inv_done = .false.
505 almo_scf_env%s_sqrt_done = .false.
506 CALL almo_scf_init_ao_overlap(matrix_s(1)%matrix, almo_scf_env)
513 CALL almo_scf_print_job_info(almo_scf_env, unit_nr)
516 ALLOCATE (almo_scf_env%domain_preconditioner(ndomains, nspins))
520 ALLOCATE (almo_scf_env%domain_ks_xx(ndomains, nspins))
524 ALLOCATE (almo_scf_env%domain_s_inv(ndomains, nspins))
526 ALLOCATE (almo_scf_env%domain_s_sqrt_inv(ndomains, nspins))
528 ALLOCATE (almo_scf_env%domain_s_sqrt(ndomains, nspins))
530 ALLOCATE (almo_scf_env%domain_t(ndomains, nspins))
532 ALLOCATE (almo_scf_env%domain_err(ndomains, nspins))
534 ALLOCATE (almo_scf_env%domain_r_down_up(ndomains, nspins))
539 almo_scf_env%matrix_ks, &
540 almo_scf_env%mat_distr_aos, &
541 almo_scf_env%eps_filter)
544 CALL timestop(handle)
546 END SUBROUTINE almo_scf_init
557 SUBROUTINE almo_scf_initial_guess(qs_env, almo_scf_env)
561 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_initial_guess'
563 CHARACTER(LEN=default_path_length) :: file_name, project_name
564 INTEGER :: handle, iaspc, ispin, istore, naspc, &
566 INTEGER,
DIMENSION(2) :: nelectron_spin
567 LOGICAL :: aspc_guess, has_unit_metric
568 REAL(kind=
dp) :: alpha, cs_pos, energy, kts_sum
572 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
577 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
580 CALL timeset(routinen, handle)
582 NULLIFY (rho, rho_ao)
586 IF (logger%para_env%is_source())
THEN
594 dft_control=dft_control, &
596 atomic_kind_set=atomic_kind_set, &
597 qs_kind_set=qs_kind_set, &
598 particle_set=particle_set, &
599 has_unit_metric=has_unit_metric, &
601 nelectron_spin=nelectron_spin, &
602 mscfg_env=mscfg_env, &
606 cpassert(
ASSOCIATED(mscfg_env))
612 IF (almo_scf_env%almo_history%istore == 0)
THEN
618 nspins = almo_scf_env%nspins
621 IF (.NOT. aspc_guess)
THEN
623 SELECT CASE (almo_scf_env%almo_scf_guess)
632 almo_scf_env%matrix_t_blk(ispin), ispin)
634 almo_scf_env%eps_filter)
640 IF (dft_control%qs_control%dftb .OR. dft_control%qs_control%semi_empirical .OR. &
641 dft_control%qs_control%xtb)
THEN
643 matrix_s(1)%matrix, has_unit_metric, &
644 dft_control, particle_set, atomic_kind_set, qs_kind_set, &
645 nspins, nelectron_spin, &
649 nspins, nelectron_spin, unit_nr, para_env)
655 almo_scf_env%matrix_p_blk(ispin), almo_scf_env%mat_distr_aos)
657 almo_scf_env%eps_filter)
666 project_name = logger%iter_info%project_name
669 WRITE (file_name,
'(A,I0,A)') trim(project_name)//
"_ALMO_SPIN_", ispin,
"_RESTART.mo"
670 CALL dbcsr_get_info(almo_scf_env%matrix_t_blk(ispin), distribution=dist)
671 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=almo_scf_env%matrix_t_blk(ispin))
672 cs_pos =
dbcsr_checksum(almo_scf_env%matrix_t_blk(ispin), pos=.true.)
673 IF (unit_nr > 0)
THEN
674 WRITE (unit_nr,
'(T2,A,E20.8)')
"Read restart ALMO "//trim(file_name)//
" with checksum: ", cs_pos
684 naspc = min(almo_scf_env%almo_history%istore, almo_scf_env%almo_history%nstore)
685 IF (unit_nr > 0)
THEN
686 WRITE (unit_nr, fmt=
"(/,T2,A,/,/,T3,A,I0)") &
687 "Parameters for the always stable predictor-corrector (ASPC) method:", &
688 "ASPC order: ", naspc
695 istore = mod(almo_scf_env%almo_history%istore - iaspc, almo_scf_env%almo_history%nstore) + 1
696 alpha = (-1.0_dp)**(iaspc + 1)*real(iaspc, kind=
dp)* &
698 IF (unit_nr > 0)
THEN
699 WRITE (unit_nr, fmt=
"(T3,A2,I0,A4,F10.6)") &
700 "B(", iaspc,
") = ", alpha
703 CALL dbcsr_copy(almo_scf_env%matrix_t_blk(ispin), &
704 almo_scf_env%almo_history%matrix_t(ispin), &
705 keep_sparsity=.true.)
706 CALL dbcsr_scale(almo_scf_env%matrix_t_blk(ispin), alpha)
709 almo_scf_env%almo_history%matrix_p_up_down(ispin, istore), &
710 almo_scf_env%almo_history%matrix_t(ispin), &
711 1.0_dp, almo_scf_env%matrix_t_blk(ispin), &
712 retain_sparsity=.true.)
723 overlap=almo_scf_env%matrix_sigma_blk(ispin), &
724 metric=almo_scf_env%matrix_s_blk(1), &
725 retain_locality=.true., &
726 only_normalize=.false., &
727 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
728 eps_filter=almo_scf_env%eps_filter, &
729 order_lanczos=almo_scf_env%order_lanczos, &
730 eps_lanczos=almo_scf_env%eps_lanczos, &
731 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
734 IF (almo_scf_env%smear)
THEN
736 mo_energies=almo_scf_env%mo_energies(:, ispin), &
737 mu_of_domain=almo_scf_env%mu_of_domain(:, ispin), &
738 real_ne_of_domain=almo_scf_env%real_ne_of_domain(:, ispin), &
739 spin_kts=almo_scf_env%kTS(ispin), &
740 smear_e_temp=almo_scf_env%smear_e_temp, &
741 ndomains=almo_scf_env%ndomains, &
742 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin))
746 p=almo_scf_env%matrix_p(ispin), &
747 eps_filter=almo_scf_env%eps_filter, &
748 orthog_orbs=.false., &
749 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
750 s=almo_scf_env%matrix_s(1), &
751 sigma=almo_scf_env%matrix_sigma(ispin), &
752 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
754 smear=almo_scf_env%smear, &
755 algorithm=almo_scf_env%sigma_inv_algorithm, &
756 eps_lanczos=almo_scf_env%eps_lanczos, &
757 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
758 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
759 para_env=almo_scf_env%para_env, &
760 blacs_env=almo_scf_env%blacs_env)
765 IF (nspins == 1)
THEN
768 IF (almo_scf_env%smear)
THEN
769 almo_scf_env%kTS(1) = almo_scf_env%kTS(1)*2.0_dp
773 IF (almo_scf_env%smear)
THEN
774 kts_sum = sum(almo_scf_env%kTS)
780 almo_scf_env%matrix_p, &
781 almo_scf_env%matrix_ks, &
783 almo_scf_env%eps_filter, &
784 almo_scf_env%mat_distr_aos, &
785 smear=almo_scf_env%smear, &
788 IF (unit_nr > 0)
THEN
790 WRITE (unit_nr,
'(T2,A38,F40.10)')
"Single-molecule energy:", &
791 sum(mscfg_env%energy_of_frag)
793 WRITE (unit_nr,
'(T2,A38,F40.10)')
"Energy of the initial guess:", energy
794 WRITE (unit_nr,
'()')
797 CALL timestop(handle)
799 END SUBROUTINE almo_scf_initial_guess
808 SUBROUTINE almo_scf_store_extrapolation_data(almo_scf_env)
811 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_store_extrapolation_data'
813 INTEGER :: handle, ispin, istore, unit_nr
814 LOGICAL :: delocalization_uses_extrapolation
816 TYPE(
dbcsr_type) :: matrix_no_tmp1, matrix_no_tmp2, &
817 matrix_no_tmp3, matrix_no_tmp4
819 CALL timeset(routinen, handle)
823 IF (logger%para_env%is_source())
THEN
829 IF (almo_scf_env%almo_history%nstore > 0)
THEN
831 almo_scf_env%almo_history%istore = almo_scf_env%almo_history%istore + 1
833 DO ispin = 1,
SIZE(almo_scf_env%matrix_t_blk)
835 istore = mod(almo_scf_env%almo_history%istore - 1, almo_scf_env%almo_history%nstore) + 1
837 IF (almo_scf_env%almo_history%istore == 1)
THEN
838 CALL dbcsr_create(almo_scf_env%almo_history%matrix_t(ispin), &
839 template=almo_scf_env%matrix_t_blk(ispin), &
840 matrix_type=dbcsr_type_no_symmetry)
842 CALL dbcsr_copy(almo_scf_env%almo_history%matrix_t(ispin), &
843 almo_scf_env%matrix_t_blk(ispin))
845 IF (almo_scf_env%almo_history%istore <= almo_scf_env%almo_history%nstore)
THEN
846 CALL dbcsr_create(almo_scf_env%almo_history%matrix_p_up_down(ispin, istore), &
847 template=almo_scf_env%matrix_s(1), &
848 matrix_type=dbcsr_type_no_symmetry)
851 CALL dbcsr_create(matrix_no_tmp1, template=almo_scf_env%matrix_t_blk(ispin), &
852 matrix_type=dbcsr_type_no_symmetry)
853 CALL dbcsr_create(matrix_no_tmp2, template=almo_scf_env%matrix_t_blk(ispin), &
854 matrix_type=dbcsr_type_no_symmetry)
858 almo_scf_env%matrix_t_blk(ispin), &
859 0.0_dp, matrix_no_tmp1, &
860 filter_eps=almo_scf_env%eps_filter)
862 almo_scf_env%matrix_sigma_inv_0deloc(ispin), &
863 0.0_dp, matrix_no_tmp2, &
864 filter_eps=almo_scf_env%eps_filter)
866 almo_scf_env%matrix_t_blk(ispin), &
868 0.0_dp, almo_scf_env%almo_history%matrix_p_up_down(ispin, istore), &
869 filter_eps=almo_scf_env%eps_filter)
879 delocalization_uses_extrapolation = &
882 IF (almo_scf_env%xalmo_history%nstore > 0 .AND. &
883 delocalization_uses_extrapolation)
THEN
885 almo_scf_env%xalmo_history%istore = almo_scf_env%xalmo_history%istore + 1
887 DO ispin = 1,
SIZE(almo_scf_env%matrix_t)
889 istore = mod(almo_scf_env%xalmo_history%istore - 1, almo_scf_env%xalmo_history%nstore) + 1
891 IF (almo_scf_env%xalmo_history%istore == 1)
THEN
892 CALL dbcsr_create(almo_scf_env%xalmo_history%matrix_t(ispin), &
893 template=almo_scf_env%matrix_t(ispin), &
894 matrix_type=dbcsr_type_no_symmetry)
896 CALL dbcsr_copy(almo_scf_env%xalmo_history%matrix_t(ispin), &
897 almo_scf_env%matrix_t(ispin))
899 IF (almo_scf_env%xalmo_history%istore <= almo_scf_env%xalmo_history%nstore)
THEN
904 CALL dbcsr_create(almo_scf_env%xalmo_history%matrix_p_up_down(ispin, istore), &
905 template=almo_scf_env%matrix_s(1), &
906 matrix_type=dbcsr_type_no_symmetry)
909 CALL dbcsr_create(matrix_no_tmp3, template=almo_scf_env%matrix_t(ispin), &
910 matrix_type=dbcsr_type_no_symmetry)
911 CALL dbcsr_create(matrix_no_tmp4, template=almo_scf_env%matrix_t(ispin), &
912 matrix_type=dbcsr_type_no_symmetry)
916 almo_scf_env%matrix_t(ispin), &
917 0.0_dp, matrix_no_tmp3, &
918 filter_eps=almo_scf_env%eps_filter)
920 almo_scf_env%matrix_sigma_inv(ispin), &
921 0.0_dp, matrix_no_tmp4, &
922 filter_eps=almo_scf_env%eps_filter)
924 almo_scf_env%matrix_t(ispin), &
926 0.0_dp, almo_scf_env%xalmo_history%matrix_p_up_down(ispin, istore), &
927 filter_eps=almo_scf_env%eps_filter)
942 CALL timestop(handle)
944 END SUBROUTINE almo_scf_store_extrapolation_data
954 SUBROUTINE almo_scf_print_job_info(almo_scf_env, unit_nr)
957 INTEGER,
INTENT(IN) :: unit_nr
959 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_print_job_info'
961 CHARACTER(len=13) :: neig_string
962 CHARACTER(len=33) :: deloc_method_string
963 INTEGER :: handle, idomain, index1_prev, sum_temp
964 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nneighbors
966 CALL timeset(routinen, handle)
968 IF (unit_nr > 0)
THEN
969 WRITE (unit_nr,
'()')
970 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 32),
" ALMO SETTINGS ", repeat(
"-", 32)
972 WRITE (unit_nr,
'(T2,A,T48,E33.3)')
"eps_filter:", almo_scf_env%eps_filter
974 IF (almo_scf_env%almo_update_algorithm ==
almo_scf_skip)
THEN
975 WRITE (unit_nr,
'(T2,A)')
"skip optimization of block-diagonal ALMOs"
977 WRITE (unit_nr,
'(T2,A)')
"optimization of block-diagonal ALMOs:"
978 SELECT CASE (almo_scf_env%almo_update_algorithm)
991 SELECT CASE (almo_scf_env%deloc_method)
993 deloc_method_string =
"NONE"
995 deloc_method_string =
"FULL_X"
997 deloc_method_string =
"FULL_SCF"
999 deloc_method_string =
"FULL_X_THEN_SCF"
1001 deloc_method_string =
"XALMO_1DIAG"
1003 deloc_method_string =
"XALMO_X"
1005 deloc_method_string =
"XALMO_SCF"
1007 WRITE (unit_nr,
'(T2,A,T48,A33)')
"delocalization:", trim(deloc_method_string)
1011 SELECT CASE (almo_scf_env%deloc_method)
1013 WRITE (unit_nr,
'(T2,A,T48,A33)')
"delocalization cutoff radius:", &
1015 deloc_method_string =
"FULL_X_THEN_SCF"
1017 WRITE (unit_nr,
'(T2,A,T48,F33.5)')
"XALMO cutoff radius:", &
1018 almo_scf_env%quencher_r0_factor
1024 WRITE (unit_nr,
'(T2,A)')
"optimization of extended orbitals:"
1025 SELECT CASE (almo_scf_env%xalmo_update_algorithm)
1068 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1069 WRITE (unit_nr,
'(T2,A,T48,I33)')
"Total fragments:", &
1070 almo_scf_env%ndomains
1072 sum_temp = sum(almo_scf_env%nbasis_of_domain(:))
1073 WRITE (unit_nr,
'(T2,A,T53,I5,F9.2,I5,I9)') &
1074 "Basis set size per fragment (min, av, max, total):", &
1075 minval(almo_scf_env%nbasis_of_domain(:)), &
1076 (1.0_dp*sum_temp)/almo_scf_env%ndomains, &
1077 maxval(almo_scf_env%nbasis_of_domain(:)), &
1085 sum_temp = sum(almo_scf_env%nocc_of_domain(:, :))
1086 WRITE (unit_nr,
'(T2,A,T53,I5,F9.2,I5,I9)') &
1087 "Occupied MOs per fragment (min, av, max, total):", &
1088 minval(sum(almo_scf_env%nocc_of_domain, dim=2)), &
1089 (1.0_dp*sum_temp)/almo_scf_env%ndomains, &
1090 maxval(sum(almo_scf_env%nocc_of_domain, dim=2)), &
1098 sum_temp = sum(almo_scf_env%nvirt_of_domain(:, :))
1099 WRITE (unit_nr,
'(T2,A,T53,I5,F9.2,I5,I9)') &
1100 "Virtual MOs per fragment (min, av, max, total):", &
1101 minval(sum(almo_scf_env%nvirt_of_domain, dim=2)), &
1102 (1.0_dp*sum_temp)/almo_scf_env%ndomains, &
1103 maxval(sum(almo_scf_env%nvirt_of_domain, dim=2)), &
1111 sum_temp = sum(almo_scf_env%charge_of_domain(:))
1112 WRITE (unit_nr,
'(T2,A,T53,I5,F9.2,I5,I9)') &
1113 "Charges per fragment (min, av, max, total):", &
1114 minval(almo_scf_env%charge_of_domain(:)), &
1115 (1.0_dp*sum_temp)/almo_scf_env%ndomains, &
1116 maxval(almo_scf_env%charge_of_domain(:)), &
1125 ALLOCATE (nneighbors(almo_scf_env%ndomains))
1127 DO idomain = 1, almo_scf_env%ndomains
1129 IF (idomain == 1)
THEN
1132 index1_prev = almo_scf_env%domain_map(1)%index1(idomain - 1)
1135 SELECT CASE (almo_scf_env%deloc_method)
1137 nneighbors(idomain) = 0
1139 nneighbors(idomain) = almo_scf_env%ndomains - 1
1141 nneighbors(idomain) = almo_scf_env%domain_map(1)%index1(idomain) - index1_prev - 1
1143 nneighbors(idomain) = -1
1148 sum_temp = sum(nneighbors(:))
1149 WRITE (unit_nr,
'(T2,A,T53,I5,F9.2,I5,I9)') &
1150 "Deloc. neighbors of fragment (min, av, max, total):", &
1151 minval(nneighbors(:)), &
1152 (1.0_dp*sum_temp)/almo_scf_env%ndomains, &
1153 maxval(nneighbors(:)), &
1156 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1157 WRITE (unit_nr,
'()')
1159 IF (almo_scf_env%ndomains <= 64)
THEN
1162 WRITE (unit_nr,
'(T2,A10,A13,A13,A13,A13,A13)') &
1163 "Fragment",
"Basis Set",
"Occupied",
"Virtual",
"Charge",
"Deloc Neig"
1164 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1165 DO idomain = 1, almo_scf_env%ndomains
1167 SELECT CASE (almo_scf_env%deloc_method)
1169 neig_string =
"NONE"
1173 WRITE (neig_string,
'(I13)') nneighbors(idomain)
1178 WRITE (unit_nr,
'(T2,I10,I13,I13,I13,I13,A13)') &
1179 idomain, almo_scf_env%nbasis_of_domain(idomain), &
1180 sum(almo_scf_env%nocc_of_domain(idomain, :)), &
1181 sum(almo_scf_env%nvirt_of_domain(idomain, :)), &
1183 almo_scf_env%charge_of_domain(idomain), &
1184 adjustr(trim(neig_string))
1188 SELECT CASE (almo_scf_env%deloc_method)
1191 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1194 WRITE (unit_nr,
'(T2,A78)') &
1195 "Neighbor lists (including self)"
1196 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1197 DO idomain = 1, almo_scf_env%ndomains
1199 IF (idomain == 1)
THEN
1202 index1_prev = almo_scf_env%domain_map(1)%index1(idomain - 1)
1205 WRITE (unit_nr,
'(T2,I10,":")') idomain
1206 WRITE (unit_nr,
'(T12,11I6)') &
1207 almo_scf_env%domain_map(1)%pairs &
1208 (index1_prev:almo_scf_env%domain_map(1)%index1(idomain) - 1, 1)
1216 WRITE (unit_nr,
'(T2,A)')
"The system is too big to print details for each fragment."
1220 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
1222 WRITE (unit_nr,
'()')
1224 DEALLOCATE (nneighbors)
1228 CALL timestop(handle)
1230 END SUBROUTINE almo_scf_print_job_info
1241 SUBROUTINE almo_scf_init_ao_overlap(matrix_s, almo_scf_env)
1245 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_init_ao_overlap'
1247 INTEGER :: handle, unit_nr
1250 CALL timeset(routinen, handle)
1254 IF (logger%para_env%is_source())
THEN
1262 IF (almo_scf_env%orthogonal_basis)
THEN
1263 CALL dbcsr_set(almo_scf_env%matrix_s(1), 0.0_dp)
1265 CALL dbcsr_set(almo_scf_env%matrix_s_blk(1), 0.0_dp)
1268 CALL matrix_qs_to_almo(matrix_s, almo_scf_env%matrix_s(1), almo_scf_env%mat_distr_aos)
1269 CALL dbcsr_copy(almo_scf_env%matrix_s_blk(1), &
1270 almo_scf_env%matrix_s(1), keep_sparsity=.true.)
1273 CALL dbcsr_filter(almo_scf_env%matrix_s(1), almo_scf_env%eps_filter)
1274 CALL dbcsr_filter(almo_scf_env%matrix_s_blk(1), almo_scf_env%eps_filter)
1276 IF (almo_scf_env%almo_update_algorithm ==
almo_scf_diag)
THEN
1278 almo_scf_env%matrix_s_blk_sqrt_inv(1), &
1279 almo_scf_env%matrix_s_blk(1), &
1280 threshold=almo_scf_env%eps_filter, &
1281 order=almo_scf_env%order_lanczos, &
1283 eps_lanczos=almo_scf_env%eps_lanczos, &
1284 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
1287 almo_scf_env%matrix_s_blk(1), &
1288 threshold=almo_scf_env%eps_filter, &
1289 filter_eps=almo_scf_env%eps_filter)
1292 CALL timestop(handle)
1294 END SUBROUTINE almo_scf_init_ao_overlap
1305 SUBROUTINE almo_scf_main(qs_env, almo_scf_env)
1309 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_main'
1311 INTEGER :: handle, ispin, unit_nr
1314 CALL timeset(routinen, handle)
1318 IF (logger%para_env%is_source())
THEN
1324 SELECT CASE (almo_scf_env%almo_update_algorithm)
1327 SELECT CASE (almo_scf_env%almo_update_algorithm)
1332 almo_scf_env=almo_scf_env, &
1333 optimizer=almo_scf_env%opt_block_diag_pcg, &
1334 quench_t=almo_scf_env%quench_t_blk, &
1335 matrix_t_in=almo_scf_env%matrix_t_blk, &
1336 matrix_t_out=almo_scf_env%matrix_t_blk, &
1337 assume_t0_q0x=.false., &
1338 perturbation_only=.false., &
1344 almo_scf_env=almo_scf_env, &
1345 optimizer=almo_scf_env%opt_block_diag_trustr, &
1346 quench_t=almo_scf_env%quench_t_blk, &
1347 matrix_t_in=almo_scf_env%matrix_t_blk, &
1348 matrix_t_out=almo_scf_env%matrix_t_blk, &
1349 perturbation_only=.false., &
1354 DO ispin = 1, almo_scf_env%nspins
1356 overlap=almo_scf_env%matrix_sigma_blk(ispin), &
1357 metric=almo_scf_env%matrix_s_blk(1), &
1358 retain_locality=.true., &
1359 only_normalize=.false., &
1360 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
1361 eps_filter=almo_scf_env%eps_filter, &
1362 order_lanczos=almo_scf_env%order_lanczos, &
1363 eps_lanczos=almo_scf_env%eps_lanczos, &
1364 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
1371 almo_scf_env%opt_block_diag_diis)
1376 DO ispin = 1, almo_scf_env%nspins
1377 CALL dbcsr_copy(almo_scf_env%matrix_ks_0deloc(ispin), &
1378 almo_scf_env%matrix_ks(ispin))
1379 CALL dbcsr_copy(almo_scf_env%matrix_sigma_inv_0deloc(ispin), &
1380 almo_scf_env%matrix_sigma_inv(ispin))
1383 CALL timestop(handle)
1385 END SUBROUTINE almo_scf_main
1395 SUBROUTINE almo_scf_delocalization(qs_env, almo_scf_env)
1400 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_delocalization'
1402 INTEGER :: handle, ispin, unit_nr
1404 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: no_quench
1407 CALL timeset(routinen, handle)
1411 IF (logger%para_env%is_source())
THEN
1422 arbitrary_optimizer%max_iter = 3
1423 arbitrary_optimizer%eps_error = 1.0e-6_dp
1424 arbitrary_optimizer%ndiis = 2
1426 SELECT CASE (almo_scf_env%deloc_method)
1433 ALLOCATE (no_quench(almo_scf_env%nspins))
1435 template=almo_scf_env%matrix_t(1), &
1436 matrix_type=dbcsr_type_no_symmetry)
1439 IF (almo_scf_env%nspins > 1)
THEN
1440 DO ispin = 2, almo_scf_env%nspins
1442 template=almo_scf_env%matrix_t(1), &
1443 matrix_type=dbcsr_type_no_symmetry)
1444 CALL dbcsr_copy(no_quench(ispin), no_quench(1))
1450 SELECT CASE (almo_scf_env%deloc_method)
1453 DO ispin = 1, almo_scf_env%nspins
1454 CALL dbcsr_copy(almo_scf_env%matrix_t(ispin), &
1455 almo_scf_env%matrix_t_blk(ispin))
1464 IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_pcg)
THEN
1467 almo_scf_env=almo_scf_env, &
1468 optimizer=almo_scf_env%opt_xalmo_pcg, &
1469 quench_t=no_quench, &
1470 matrix_t_in=almo_scf_env%matrix_t_blk, &
1471 matrix_t_out=almo_scf_env%matrix_t, &
1473 perturbation_only=.true., &
1479 almo_scf_env=almo_scf_env, &
1480 optimizer=almo_scf_env%opt_xalmo_trustr, &
1481 quench_t=no_quench, &
1482 matrix_t_in=almo_scf_env%matrix_t_blk, &
1483 matrix_t_out=almo_scf_env%matrix_t, &
1484 perturbation_only=.true., &
1489 cpabort(
"Other algorithms do not exist")
1495 IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_diag)
THEN
1497 almo_scf_env%perturbative_delocalization = .true.
1498 DO ispin = 1, almo_scf_env%nspins
1499 CALL dbcsr_copy(almo_scf_env%matrix_t(ispin), &
1500 almo_scf_env%matrix_t_blk(ispin))
1503 arbitrary_optimizer)
1507 cpabort(
"Other algorithms do not exist")
1513 IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_pcg)
THEN
1516 almo_scf_env=almo_scf_env, &
1517 optimizer=almo_scf_env%opt_xalmo_pcg, &
1518 quench_t=almo_scf_env%quench_t, &
1519 matrix_t_in=almo_scf_env%matrix_t_blk, &
1520 matrix_t_out=almo_scf_env%matrix_t, &
1522 perturbation_only=.true., &
1528 almo_scf_env=almo_scf_env, &
1529 optimizer=almo_scf_env%opt_xalmo_trustr, &
1530 quench_t=almo_scf_env%quench_t, &
1531 matrix_t_in=almo_scf_env%matrix_t_blk, &
1532 matrix_t_out=almo_scf_env%matrix_t, &
1533 perturbation_only=.true., &
1538 cpabort(
"Other algorithms do not exist")
1544 IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_diag)
THEN
1546 cpabort(
"Should not be here: convergence will fail!")
1548 almo_scf_env%perturbative_delocalization = .false.
1549 DO ispin = 1, almo_scf_env%nspins
1550 CALL dbcsr_copy(almo_scf_env%matrix_t(ispin), &
1551 almo_scf_env%matrix_t_blk(ispin))
1554 arbitrary_optimizer)
1556 ELSE IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_pcg)
THEN
1559 almo_scf_env=almo_scf_env, &
1560 optimizer=almo_scf_env%opt_xalmo_pcg, &
1561 quench_t=almo_scf_env%quench_t, &
1562 matrix_t_in=almo_scf_env%matrix_t_blk, &
1563 matrix_t_out=almo_scf_env%matrix_t, &
1565 perturbation_only=.false., &
1571 almo_scf_env=almo_scf_env, &
1572 optimizer=almo_scf_env%opt_xalmo_trustr, &
1573 quench_t=almo_scf_env%quench_t, &
1574 matrix_t_in=almo_scf_env%matrix_t_blk, &
1575 matrix_t_out=almo_scf_env%matrix_t, &
1576 perturbation_only=.false., &
1581 cpabort(
"Other algorithms do not exist")
1587 cpabort(
"Illegal delocalization method")
1591 SELECT CASE (almo_scf_env%deloc_method)
1594 IF (almo_scf_env%deloc_truncate_virt /=
virt_full)
THEN
1595 cpabort(
"full scf is NYI for truncated virtual space")
1598 IF (almo_scf_env%xalmo_update_algorithm ==
almo_scf_pcg)
THEN
1601 almo_scf_env=almo_scf_env, &
1602 optimizer=almo_scf_env%opt_xalmo_pcg, &
1603 quench_t=no_quench, &
1604 matrix_t_in=almo_scf_env%matrix_t, &
1605 matrix_t_out=almo_scf_env%matrix_t, &
1606 assume_t0_q0x=.false., &
1607 perturbation_only=.false., &
1613 almo_scf_env=almo_scf_env, &
1614 optimizer=almo_scf_env%opt_xalmo_trustr, &
1615 quench_t=no_quench, &
1616 matrix_t_in=almo_scf_env%matrix_t, &
1617 matrix_t_out=almo_scf_env%matrix_t, &
1618 perturbation_only=.false., &
1623 cpabort(
"Other algorithms do not exist")
1630 SELECT CASE (almo_scf_env%deloc_method)
1632 DO ispin = 1, almo_scf_env%nspins
1635 DEALLOCATE (no_quench)
1638 CALL timestop(handle)
1640 END SUBROUTINE almo_scf_delocalization
1650 SUBROUTINE construct_nlmos(qs_env, almo_scf_env)
1657 IF (almo_scf_env%construct_nlmos)
THEN
1659 DO ispin = 1, almo_scf_env%nspins
1662 overlap=almo_scf_env%matrix_sigma(ispin), &
1663 metric=almo_scf_env%matrix_s(1), &
1664 retain_locality=.false., &
1665 only_normalize=.false., &
1666 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
1667 eps_filter=almo_scf_env%eps_filter, &
1668 order_lanczos=almo_scf_env%order_lanczos, &
1669 eps_lanczos=almo_scf_env%eps_lanczos, &
1670 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
1673 CALL construct_nlmos_wrapper(qs_env, almo_scf_env, virtuals=.false.)
1675 IF (almo_scf_env%opt_nlmo_pcg%opt_penalty%virtual_nlmos)
THEN
1676 CALL construct_virtuals(almo_scf_env)
1677 CALL construct_nlmos_wrapper(qs_env, almo_scf_env, virtuals=.true.)
1680 IF (almo_scf_env%opt_nlmo_pcg%opt_penalty%compactification_filter_start > 0.0_dp)
THEN
1681 CALL nlmo_compactification(qs_env, almo_scf_env, almo_scf_env%matrix_t)
1686 END SUBROUTINE construct_nlmos
1697 SUBROUTINE construct_nlmos_wrapper(qs_env, almo_scf_env, virtuals)
1701 LOGICAL,
INTENT(IN) :: virtuals
1703 REAL(kind=
dp) :: det_diff, prev_determinant
1705 almo_scf_env%overlap_determinant = 1.0
1707 almo_scf_env%opt_nlmo_pcg%opt_penalty%penalty_strength = &
1708 -1.0_dp*almo_scf_env%opt_nlmo_pcg%opt_penalty%penalty_strength
1711 prev_determinant = 10.0_dp
1712 DO WHILE (almo_scf_env%overlap_determinant > almo_scf_env%opt_nlmo_pcg%opt_penalty%final_determinant)
1714 IF (.NOT. virtuals)
THEN
1716 optimizer=almo_scf_env%opt_nlmo_pcg, &
1717 matrix_s=almo_scf_env%matrix_s(1), &
1718 matrix_mo_in=almo_scf_env%matrix_t, &
1719 matrix_mo_out=almo_scf_env%matrix_t, &
1720 template_matrix_sigma=almo_scf_env%matrix_sigma_inv, &
1721 overlap_determinant=almo_scf_env%overlap_determinant, &
1722 mat_distr_aos=almo_scf_env%mat_distr_aos, &
1723 virtuals=virtuals, &
1724 eps_filter=almo_scf_env%eps_filter)
1727 optimizer=almo_scf_env%opt_nlmo_pcg, &
1728 matrix_s=almo_scf_env%matrix_s(1), &
1729 matrix_mo_in=almo_scf_env%matrix_v, &
1730 matrix_mo_out=almo_scf_env%matrix_v, &
1731 template_matrix_sigma=almo_scf_env%matrix_sigma_vv, &
1732 overlap_determinant=almo_scf_env%overlap_determinant, &
1733 mat_distr_aos=almo_scf_env%mat_distr_aos, &
1734 virtuals=virtuals, &
1735 eps_filter=almo_scf_env%eps_filter)
1739 det_diff = prev_determinant - almo_scf_env%overlap_determinant
1740 almo_scf_env%opt_nlmo_pcg%opt_penalty%penalty_strength = &
1741 almo_scf_env%opt_nlmo_pcg%opt_penalty%penalty_strength/ &
1742 abs(almo_scf_env%opt_nlmo_pcg%opt_penalty%penalty_strength_dec_factor)
1744 IF (det_diff < almo_scf_env%opt_nlmo_pcg%opt_penalty%determinant_tolerance)
THEN
1747 prev_determinant = almo_scf_env%overlap_determinant
1751 END SUBROUTINE construct_nlmos_wrapper
1760 SUBROUTINE construct_virtuals(almo_scf_env)
1765 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1766 TYPE(
dbcsr_type) :: tempnv1, tempvocc1, tempvocc2, tempvv1, &
1769 DO ispin = 1, almo_scf_env%nspins
1772 template=almo_scf_env%matrix_v(ispin), &
1773 matrix_type=dbcsr_type_no_symmetry)
1775 template=almo_scf_env%matrix_vo(ispin), &
1776 matrix_type=dbcsr_type_no_symmetry)
1778 template=almo_scf_env%matrix_vo(ispin), &
1779 matrix_type=dbcsr_type_no_symmetry)
1781 template=almo_scf_env%matrix_sigma_vv(ispin), &
1782 matrix_type=dbcsr_type_no_symmetry)
1784 template=almo_scf_env%matrix_sigma_vv(ispin), &
1785 matrix_type=dbcsr_type_no_symmetry)
1789 keep_sparsity=.false.)
1793 almo_scf_env%matrix_s(1), &
1794 almo_scf_env%matrix_v(ispin), &
1796 filter_eps=almo_scf_env%eps_filter)
1800 almo_scf_env%matrix_t(ispin), &
1801 0.0_dp, tempvocc1, &
1802 filter_eps=almo_scf_env%eps_filter)
1806 almo_scf_env%matrix_sigma_inv(ispin), &
1807 0.0_dp, tempvocc2, &
1808 filter_eps=almo_scf_env%eps_filter)
1811 almo_scf_env%matrix_t(ispin), &
1814 filter_eps=almo_scf_env%eps_filter)
1816 CALL dbcsr_add(almo_scf_env%matrix_v(ispin), tempnv1, 1.0_dp, -1.0_dp)
1820 almo_scf_env%matrix_s(1), &
1821 almo_scf_env%matrix_v(ispin), &
1823 filter_eps=almo_scf_env%eps_filter)
1826 almo_scf_env%matrix_v(ispin), &
1829 filter_eps=almo_scf_env%eps_filter)
1833 metric=almo_scf_env%matrix_s(1), &
1834 retain_locality=.false., &
1835 only_normalize=.false., &
1836 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
1837 eps_filter=almo_scf_env%eps_filter, &
1838 order_lanczos=almo_scf_env%order_lanczos, &
1839 eps_lanczos=almo_scf_env%eps_lanczos, &
1840 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
1844 almo_scf_env%matrix_ks(ispin), &
1845 almo_scf_env%matrix_v(ispin), &
1847 filter_eps=almo_scf_env%eps_filter)
1850 almo_scf_env%matrix_v(ispin), &
1853 filter_eps=almo_scf_env%eps_filter)
1856 ALLOCATE (eigenvalues(n))
1859 para_env=almo_scf_env%para_env, &
1860 blacs_env=almo_scf_env%blacs_env)
1861 DEALLOCATE (eigenvalues)
1864 almo_scf_env%matrix_v(ispin), &
1867 filter_eps=almo_scf_env%eps_filter)
1869 CALL dbcsr_copy(almo_scf_env%matrix_v(ispin), tempnv1)
1879 END SUBROUTINE construct_virtuals
1890 SUBROUTINE nlmo_compactification(qs_env, almo_scf_env, matrix)
1894 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:), &
1895 INTENT(IN) :: matrix
1897 INTEGER :: iblock_col, iblock_col_size, iblock_row, &
1898 iblock_row_size, icol, irow, ispin, &
1899 ncols, nrows, nspins, unit_nr
1900 LOGICAL :: element_by_element
1901 REAL(kind=
dp) :: energy, eps_local, eps_start, &
1902 max_element, spin_factor
1903 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: occ, retained
1904 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_p
1907 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: matrix_p_tmp, matrix_t_tmp
1912 IF (logger%para_env%is_source())
THEN
1918 nspins =
SIZE(matrix)
1919 element_by_element = .false.
1921 IF (nspins == 1)
THEN
1922 spin_factor = 2.0_dp
1924 spin_factor = 1.0_dp
1927 ALLOCATE (matrix_t_tmp(nspins))
1928 ALLOCATE (matrix_p_tmp(nspins))
1929 ALLOCATE (retained(nspins))
1932 DO ispin = 1, nspins
1936 template=matrix(ispin), &
1937 matrix_type=dbcsr_type_no_symmetry)
1938 CALL dbcsr_copy(matrix_t_tmp(ispin), matrix(ispin))
1941 template=almo_scf_env%matrix_p(ispin), &
1942 matrix_type=dbcsr_type_no_symmetry)
1943 CALL dbcsr_copy(matrix_p_tmp(ispin), almo_scf_env%matrix_p(ispin))
1947 IF (unit_nr > 0)
THEN
1949 WRITE (unit_nr,
'(T2,A)') &
1950 "Energy dependence on the (block-by-block) filtering of the NLMO coefficients"
1951 IF (unit_nr > 0)
WRITE (unit_nr,
'(T2,A13,A20,A20,A25)') &
1952 "EPS filter",
"Occupation Alpha",
"Occupation Beta",
"Energy"
1955 eps_start = almo_scf_env%opt_nlmo_pcg%opt_penalty%compactification_filter_start
1956 eps_local = max(eps_start, 10e-14_dp)
1960 IF (eps_local > 0.11_dp)
EXIT
1962 DO ispin = 1, nspins
1969 row_size=iblock_row_size, col_size=iblock_col_size)
1970 DO icol = 1, iblock_col_size
1972 IF (element_by_element)
THEN
1974 DO irow = 1, iblock_row_size
1975 IF (abs(data_p(irow, icol)) < eps_local)
THEN
1976 data_p(irow, icol) = 0.0_dp
1978 retained(ispin) = retained(ispin) + 1
1984 max_element = 0.0_dp
1985 DO irow = 1, iblock_row_size
1986 IF (abs(data_p(irow, icol)) > max_element)
THEN
1987 max_element = abs(data_p(irow, icol))
1990 IF (max_element < eps_local)
THEN
1991 DO irow = 1, iblock_row_size
1992 data_p(irow, icol) = 0.0_dp
1995 retained(ispin) = retained(ispin) + iblock_row_size
2007 nfullrows_total=nrows, &
2008 nfullcols_total=ncols)
2009 CALL group%sum(retained(ispin))
2012 occ(ispin) = retained(ispin)/nrows/ncols
2016 t=matrix_t_tmp(ispin), &
2017 p=matrix_p_tmp(ispin), &
2018 eps_filter=almo_scf_env%eps_filter, &
2019 orthog_orbs=.false., &
2020 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
2021 s=almo_scf_env%matrix_s(1), &
2022 sigma=almo_scf_env%matrix_sigma(ispin), &
2023 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
2024 use_guess=.false., &
2025 algorithm=almo_scf_env%sigma_inv_algorithm, &
2026 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
2027 inverse_accelerator=almo_scf_env%order_lanczos, &
2028 eps_lanczos=almo_scf_env%eps_lanczos, &
2029 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
2030 para_env=almo_scf_env%para_env, &
2031 blacs_env=almo_scf_env%blacs_env)
2034 CALL dbcsr_scale(matrix_p_tmp(ispin), spin_factor)
2041 almo_scf_env%matrix_ks, &
2043 almo_scf_env%eps_filter, &
2044 almo_scf_env%mat_distr_aos)
2046 IF (nspins < 2) occ(2) = occ(1)
2047 IF (unit_nr > 0)
WRITE (unit_nr,
'(T2,E13.3,F20.10,F20.10,F25.15)') &
2048 eps_local, occ(1), occ(2), energy
2050 eps_local = 2.0_dp*eps_local
2054 DO ispin = 1, nspins
2061 DEALLOCATE (matrix_t_tmp)
2062 DEALLOCATE (matrix_p_tmp)
2064 DEALLOCATE (retained)
2066 END SUBROUTINE nlmo_compactification
2077 SUBROUTINE almo_scf_post(qs_env, almo_scf_env)
2081 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_post'
2083 INTEGER :: handle, ispin
2086 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: matrix_t_processed
2090 CALL timeset(routinen, handle)
2093 CALL almo_scf_store_extrapolation_data(almo_scf_env)
2096 ALLOCATE (matrix_t_processed(almo_scf_env%nspins))
2099 DO ispin = 1, almo_scf_env%nspins
2102 template=almo_scf_env%matrix_t(ispin), &
2103 matrix_type=dbcsr_type_no_symmetry)
2106 almo_scf_env%matrix_t(ispin))
2108 IF (almo_scf_env%return_orthogonalized_mos)
THEN
2111 overlap=almo_scf_env%matrix_sigma(ispin), &
2112 metric=almo_scf_env%matrix_s(1), &
2113 retain_locality=.false., &
2114 only_normalize=.false., &
2115 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
2116 eps_filter=almo_scf_env%eps_filter, &
2117 order_lanczos=almo_scf_env%order_lanczos, &
2118 eps_lanczos=almo_scf_env%eps_lanczos, &
2119 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
2120 smear=almo_scf_env%smear)
2136 NULLIFY (mos, mo_coeff, scf_env)
2138 CALL get_qs_env(qs_env, mos=mos, scf_env=scf_env)
2140 DO ispin = 1, almo_scf_env%nspins
2144 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
2148 DO ispin = 1, almo_scf_env%nspins
2151 DEALLOCATE (matrix_t_processed)
2155 CALL almo_post_scf_compute_properties(qs_env)
2158 IF (almo_scf_env%calc_forces)
THEN
2160 IF (
ASSOCIATED(matrix_w))
THEN
2163 cpabort(
"Matrix W is needed but not associated")
2167 CALL timestop(handle)
2169 END SUBROUTINE almo_scf_post
2179 SUBROUTINE almo_scf_env_create_matrices(almo_scf_env, matrix_s0)
2184 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_env_create_matrices'
2186 INTEGER :: handle, ispin, nspins
2188 CALL timeset(routinen, handle)
2190 nspins = almo_scf_env%nspins
2194 matrix_qs=matrix_s0, &
2195 almo_scf_env=almo_scf_env, &
2198 symmetry_new=dbcsr_type_symmetric, &
2200 init_domains=.false.)
2202 matrix_qs=matrix_s0, &
2203 almo_scf_env=almo_scf_env, &
2206 symmetry_new=dbcsr_type_symmetric, &
2208 init_domains=.true.)
2209 IF (almo_scf_env%almo_update_algorithm ==
almo_scf_diag)
THEN
2211 matrix_qs=matrix_s0, &
2212 almo_scf_env=almo_scf_env, &
2213 name_new=
"S_BLK_SQRT_INV", &
2215 symmetry_new=dbcsr_type_symmetric, &
2217 init_domains=.true.)
2219 matrix_qs=matrix_s0, &
2220 almo_scf_env=almo_scf_env, &
2221 name_new=
"S_BLK_SQRT", &
2223 symmetry_new=dbcsr_type_symmetric, &
2225 init_domains=.true.)
2228 matrix_qs=matrix_s0, &
2229 almo_scf_env=almo_scf_env, &
2230 name_new=
"S_BLK_INV", &
2232 symmetry_new=dbcsr_type_symmetric, &
2234 init_domains=.true.)
2238 ALLOCATE (almo_scf_env%matrix_t_blk(nspins))
2239 ALLOCATE (almo_scf_env%quench_t_blk(nspins))
2240 ALLOCATE (almo_scf_env%matrix_err_blk(nspins))
2241 ALLOCATE (almo_scf_env%matrix_err_xx(nspins))
2242 ALLOCATE (almo_scf_env%matrix_sigma(nspins))
2243 ALLOCATE (almo_scf_env%matrix_sigma_inv(nspins))
2244 ALLOCATE (almo_scf_env%matrix_sigma_sqrt(nspins))
2245 ALLOCATE (almo_scf_env%matrix_sigma_sqrt_inv(nspins))
2246 ALLOCATE (almo_scf_env%matrix_sigma_blk(nspins))
2247 ALLOCATE (almo_scf_env%matrix_sigma_inv_0deloc(nspins))
2248 ALLOCATE (almo_scf_env%matrix_t(nspins))
2249 ALLOCATE (almo_scf_env%matrix_t_tr(nspins))
2250 DO ispin = 1, nspins
2253 matrix_qs=matrix_s0, &
2254 almo_scf_env=almo_scf_env, &
2257 symmetry_new=dbcsr_type_no_symmetry, &
2259 init_domains=.true.)
2262 matrix_qs=matrix_s0, &
2263 almo_scf_env=almo_scf_env, &
2266 symmetry_new=dbcsr_type_no_symmetry, &
2268 init_domains=.true.)
2271 matrix_qs=matrix_s0, &
2272 almo_scf_env=almo_scf_env, &
2273 name_new=
"ERR_BLK", &
2275 symmetry_new=dbcsr_type_no_symmetry, &
2277 init_domains=.true.)
2280 matrix_qs=matrix_s0, &
2281 almo_scf_env=almo_scf_env, &
2282 name_new=
"ERR_XX", &
2284 symmetry_new=dbcsr_type_no_symmetry, &
2286 init_domains=.false.)
2290 matrix_qs=matrix_s0, &
2291 almo_scf_env=almo_scf_env, &
2294 symmetry_new=dbcsr_type_no_symmetry, &
2296 init_domains=.false.)
2299 matrix_qs=matrix_s0, &
2300 almo_scf_env=almo_scf_env, &
2303 symmetry_new=dbcsr_type_symmetric, &
2305 init_domains=.false.)
2308 matrix_qs=matrix_s0, &
2309 almo_scf_env=almo_scf_env, &
2310 name_new=
"SIG_BLK", &
2312 symmetry_new=dbcsr_type_symmetric, &
2314 init_domains=.true.)
2317 matrix_qs=matrix_s0, &
2318 almo_scf_env=almo_scf_env, &
2319 name_new=
"SIGINV_BLK", &
2321 symmetry_new=dbcsr_type_symmetric, &
2323 init_domains=.true.)
2326 matrix_new=almo_scf_env%matrix_sigma_inv(ispin), &
2327 matrix_qs=matrix_s0, &
2328 almo_scf_env=almo_scf_env, &
2329 name_new=
"SIGINV", &
2331 symmetry_new=dbcsr_type_symmetric, &
2333 init_domains=.false.)
2336 matrix_new=almo_scf_env%matrix_t(ispin), &
2337 matrix_qs=matrix_s0, &
2338 almo_scf_env=almo_scf_env, &
2341 symmetry_new=dbcsr_type_no_symmetry, &
2343 init_domains=.false.)
2344 CALL dbcsr_create(almo_scf_env%matrix_sigma_sqrt(ispin), &
2345 template=almo_scf_env%matrix_sigma(ispin), &
2346 matrix_type=dbcsr_type_no_symmetry)
2347 CALL dbcsr_create(almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
2348 template=almo_scf_env%matrix_sigma(ispin), &
2349 matrix_type=dbcsr_type_no_symmetry)
2353 IF (almo_scf_env%need_virtuals)
THEN
2354 ALLOCATE (almo_scf_env%matrix_v_blk(nspins))
2355 ALLOCATE (almo_scf_env%matrix_v_full_blk(nspins))
2356 ALLOCATE (almo_scf_env%matrix_v(nspins))
2357 ALLOCATE (almo_scf_env%matrix_vo(nspins))
2358 ALLOCATE (almo_scf_env%matrix_x(nspins))
2359 ALLOCATE (almo_scf_env%matrix_ov(nspins))
2360 ALLOCATE (almo_scf_env%matrix_ov_full(nspins))
2361 ALLOCATE (almo_scf_env%matrix_sigma_vv(nspins))
2362 ALLOCATE (almo_scf_env%matrix_sigma_vv_blk(nspins))
2363 ALLOCATE (almo_scf_env%matrix_sigma_vv_sqrt(nspins))
2364 ALLOCATE (almo_scf_env%matrix_sigma_vv_sqrt_inv(nspins))
2365 ALLOCATE (almo_scf_env%matrix_vv_full_blk(nspins))
2367 IF (almo_scf_env%deloc_truncate_virt /=
virt_full)
THEN
2368 ALLOCATE (almo_scf_env%matrix_k_blk(nspins))
2369 ALLOCATE (almo_scf_env%matrix_k_blk_ones(nspins))
2370 ALLOCATE (almo_scf_env%matrix_k_tr(nspins))
2371 ALLOCATE (almo_scf_env%matrix_v_disc(nspins))
2372 ALLOCATE (almo_scf_env%matrix_v_disc_blk(nspins))
2373 ALLOCATE (almo_scf_env%matrix_ov_disc(nspins))
2374 ALLOCATE (almo_scf_env%matrix_vv_disc_blk(nspins))
2375 ALLOCATE (almo_scf_env%matrix_vv_disc(nspins))
2376 ALLOCATE (almo_scf_env%opt_k_t_dd(nspins))
2377 ALLOCATE (almo_scf_env%opt_k_t_rr(nspins))
2378 ALLOCATE (almo_scf_env%opt_k_denom(nspins))
2381 DO ispin = 1, nspins
2383 matrix_qs=matrix_s0, &
2384 almo_scf_env=almo_scf_env, &
2385 name_new=
"V_FULL_BLK", &
2387 symmetry_new=dbcsr_type_no_symmetry, &
2389 init_domains=.false.)
2391 matrix_qs=matrix_s0, &
2392 almo_scf_env=almo_scf_env, &
2395 symmetry_new=dbcsr_type_no_symmetry, &
2397 init_domains=.false.)
2399 matrix_qs=matrix_s0, &
2400 almo_scf_env=almo_scf_env, &
2403 symmetry_new=dbcsr_type_no_symmetry, &
2405 init_domains=.false.)
2407 matrix_qs=matrix_s0, &
2408 almo_scf_env=almo_scf_env, &
2409 name_new=
"OV_FULL", &
2411 symmetry_new=dbcsr_type_no_symmetry, &
2413 init_domains=.false.)
2415 matrix_qs=matrix_s0, &
2416 almo_scf_env=almo_scf_env, &
2419 symmetry_new=dbcsr_type_no_symmetry, &
2421 init_domains=.false.)
2423 matrix_qs=matrix_s0, &
2424 almo_scf_env=almo_scf_env, &
2427 symmetry_new=dbcsr_type_no_symmetry, &
2429 init_domains=.false.)
2431 matrix_qs=matrix_s0, &
2432 almo_scf_env=almo_scf_env, &
2435 symmetry_new=dbcsr_type_no_symmetry, &
2437 init_domains=.false.)
2439 matrix_qs=matrix_s0, &
2440 almo_scf_env=almo_scf_env, &
2441 name_new=
"SIG_VV", &
2443 symmetry_new=dbcsr_type_symmetric, &
2445 init_domains=.false.)
2447 matrix_qs=matrix_s0, &
2448 almo_scf_env=almo_scf_env, &
2449 name_new=
"VV_FULL_BLK", &
2451 symmetry_new=dbcsr_type_no_symmetry, &
2453 init_domains=.true.)
2455 matrix_qs=matrix_s0, &
2456 almo_scf_env=almo_scf_env, &
2457 name_new=
"SIG_VV_BLK", &
2459 symmetry_new=dbcsr_type_symmetric, &
2461 init_domains=.true.)
2462 CALL dbcsr_create(almo_scf_env%matrix_sigma_vv_sqrt(ispin), &
2463 template=almo_scf_env%matrix_sigma_vv(ispin), &
2464 matrix_type=dbcsr_type_no_symmetry)
2465 CALL dbcsr_create(almo_scf_env%matrix_sigma_vv_sqrt_inv(ispin), &
2466 template=almo_scf_env%matrix_sigma_vv(ispin), &
2467 matrix_type=dbcsr_type_no_symmetry)
2469 IF (almo_scf_env%deloc_truncate_virt /=
virt_full)
THEN
2471 matrix_qs=matrix_s0, &
2472 almo_scf_env=almo_scf_env, &
2473 name_new=
"OPT_K_U_RR", &
2475 symmetry_new=dbcsr_type_no_symmetry, &
2477 init_domains=.false.)
2479 matrix_qs=matrix_s0, &
2480 almo_scf_env=almo_scf_env, &
2481 name_new=
"VV_DISC", &
2483 symmetry_new=dbcsr_type_symmetric, &
2485 init_domains=.false.)
2487 matrix_qs=matrix_s0, &
2488 almo_scf_env=almo_scf_env, &
2489 name_new=
"OPT_K_U_DD", &
2491 symmetry_new=dbcsr_type_no_symmetry, &
2493 init_domains=.false.)
2495 matrix_qs=matrix_s0, &
2496 almo_scf_env=almo_scf_env, &
2497 name_new=
"VV_DISC_BLK", &
2499 symmetry_new=dbcsr_type_symmetric, &
2501 init_domains=.true.)
2503 matrix_qs=matrix_s0, &
2504 almo_scf_env=almo_scf_env, &
2507 symmetry_new=dbcsr_type_no_symmetry, &
2509 init_domains=.true.)
2511 matrix_qs=matrix_s0, &
2512 almo_scf_env=almo_scf_env, &
2513 name_new=
"K_BLK_1", &
2515 symmetry_new=dbcsr_type_no_symmetry, &
2517 init_domains=.true.)
2519 matrix_qs=matrix_s0, &
2520 almo_scf_env=almo_scf_env, &
2521 name_new=
"OPT_K_DENOM", &
2523 symmetry_new=dbcsr_type_no_symmetry, &
2525 init_domains=.false.)
2527 matrix_qs=matrix_s0, &
2528 almo_scf_env=almo_scf_env, &
2531 symmetry_new=dbcsr_type_no_symmetry, &
2533 init_domains=.false.)
2535 matrix_qs=matrix_s0, &
2536 almo_scf_env=almo_scf_env, &
2537 name_new=
"V_DISC_BLK", &
2539 symmetry_new=dbcsr_type_no_symmetry, &
2541 init_domains=.false.)
2543 matrix_qs=matrix_s0, &
2544 almo_scf_env=almo_scf_env, &
2545 name_new=
"V_DISC", &
2547 symmetry_new=dbcsr_type_no_symmetry, &
2549 init_domains=.false.)
2551 matrix_qs=matrix_s0, &
2552 almo_scf_env=almo_scf_env, &
2553 name_new=
"OV_DISC", &
2555 symmetry_new=dbcsr_type_no_symmetry, &
2557 init_domains=.false.)
2565 IF (almo_scf_env%need_orbital_energies)
THEN
2566 ALLOCATE (almo_scf_env%matrix_eoo(nspins))
2567 ALLOCATE (almo_scf_env%matrix_evv_full(nspins))
2568 DO ispin = 1, nspins
2570 matrix_qs=matrix_s0, &
2571 almo_scf_env=almo_scf_env, &
2574 symmetry_new=dbcsr_type_no_symmetry, &
2576 init_domains=.false.)
2578 matrix_qs=matrix_s0, &
2579 almo_scf_env=almo_scf_env, &
2580 name_new=
"E_VIRT", &
2582 symmetry_new=dbcsr_type_no_symmetry, &
2584 init_domains=.false.)
2589 ALLOCATE (almo_scf_env%matrix_p(nspins))
2590 ALLOCATE (almo_scf_env%matrix_p_blk(nspins))
2591 ALLOCATE (almo_scf_env%matrix_ks(nspins))
2592 ALLOCATE (almo_scf_env%matrix_ks_blk(nspins))
2593 IF (almo_scf_env%need_previous_ks)
THEN
2594 ALLOCATE (almo_scf_env%matrix_ks_0deloc(nspins))
2596 DO ispin = 1, nspins
2599 template=almo_scf_env%matrix_s(1), &
2600 matrix_type=dbcsr_type_symmetric)
2602 template=almo_scf_env%matrix_s(1), &
2603 matrix_type=dbcsr_type_symmetric)
2604 IF (almo_scf_env%need_previous_ks)
THEN
2605 CALL dbcsr_create(almo_scf_env%matrix_ks_0deloc(ispin), &
2606 template=almo_scf_env%matrix_s(1), &
2607 matrix_type=dbcsr_type_symmetric)
2610 matrix_qs=matrix_s0, &
2611 almo_scf_env=almo_scf_env, &
2614 symmetry_new=dbcsr_type_symmetric, &
2616 init_domains=.true.)
2618 matrix_qs=matrix_s0, &
2619 almo_scf_env=almo_scf_env, &
2620 name_new=
"KS_BLK", &
2622 symmetry_new=dbcsr_type_symmetric, &
2624 init_domains=.true.)
2627 CALL timestop(handle)
2629 END SUBROUTINE almo_scf_env_create_matrices
2639 SUBROUTINE almo_scf_clean_up(almo_scf_env)
2643 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_clean_up'
2645 INTEGER :: handle, ispin, unit_nr
2648 CALL timeset(routinen, handle)
2652 IF (logger%para_env%is_source())
THEN
2661 IF (almo_scf_env%almo_update_algorithm ==
almo_scf_diag)
THEN
2667 DO ispin = 1, almo_scf_env%nspins
2676 CALL dbcsr_release(almo_scf_env%matrix_sigma_inv_0deloc(ispin))
2680 CALL dbcsr_release(almo_scf_env%matrix_sigma_sqrt_inv(ispin))
2685 IF (almo_scf_env%need_previous_ks)
THEN
2688 IF (almo_scf_env%need_virtuals)
THEN
2698 CALL dbcsr_release(almo_scf_env%matrix_sigma_vv_sqrt(ispin))
2699 CALL dbcsr_release(almo_scf_env%matrix_sigma_vv_sqrt_inv(ispin))
2701 IF (almo_scf_env%deloc_truncate_virt /=
virt_full)
THEN
2715 IF (almo_scf_env%need_orbital_energies)
THEN
2722 DEALLOCATE (almo_scf_env%matrix_p)
2723 DEALLOCATE (almo_scf_env%matrix_p_blk)
2724 DEALLOCATE (almo_scf_env%matrix_ks)
2725 DEALLOCATE (almo_scf_env%matrix_ks_blk)
2726 DEALLOCATE (almo_scf_env%matrix_t_blk)
2727 DEALLOCATE (almo_scf_env%matrix_err_blk)
2728 DEALLOCATE (almo_scf_env%matrix_err_xx)
2729 DEALLOCATE (almo_scf_env%matrix_t)
2730 DEALLOCATE (almo_scf_env%matrix_t_tr)
2731 DEALLOCATE (almo_scf_env%matrix_sigma)
2732 DEALLOCATE (almo_scf_env%matrix_sigma_blk)
2733 DEALLOCATE (almo_scf_env%matrix_sigma_inv_0deloc)
2734 DEALLOCATE (almo_scf_env%matrix_sigma_sqrt)
2735 DEALLOCATE (almo_scf_env%matrix_sigma_sqrt_inv)
2736 DEALLOCATE (almo_scf_env%matrix_sigma_inv)
2737 DEALLOCATE (almo_scf_env%quench_t)
2738 DEALLOCATE (almo_scf_env%quench_t_blk)
2739 IF (almo_scf_env%need_virtuals)
THEN
2740 DEALLOCATE (almo_scf_env%matrix_v_blk)
2741 DEALLOCATE (almo_scf_env%matrix_v_full_blk)
2742 DEALLOCATE (almo_scf_env%matrix_v)
2743 DEALLOCATE (almo_scf_env%matrix_vo)
2744 DEALLOCATE (almo_scf_env%matrix_x)
2745 DEALLOCATE (almo_scf_env%matrix_ov)
2746 DEALLOCATE (almo_scf_env%matrix_ov_full)
2747 DEALLOCATE (almo_scf_env%matrix_sigma_vv)
2748 DEALLOCATE (almo_scf_env%matrix_sigma_vv_blk)
2749 DEALLOCATE (almo_scf_env%matrix_sigma_vv_sqrt)
2750 DEALLOCATE (almo_scf_env%matrix_sigma_vv_sqrt_inv)
2751 DEALLOCATE (almo_scf_env%matrix_vv_full_blk)
2752 IF (almo_scf_env%deloc_truncate_virt /=
virt_full)
THEN
2753 DEALLOCATE (almo_scf_env%matrix_k_tr)
2754 DEALLOCATE (almo_scf_env%matrix_k_blk)
2755 DEALLOCATE (almo_scf_env%matrix_v_disc)
2756 DEALLOCATE (almo_scf_env%matrix_v_disc_blk)
2757 DEALLOCATE (almo_scf_env%matrix_ov_disc)
2758 DEALLOCATE (almo_scf_env%matrix_vv_disc_blk)
2759 DEALLOCATE (almo_scf_env%matrix_vv_disc)
2760 DEALLOCATE (almo_scf_env%matrix_k_blk_ones)
2761 DEALLOCATE (almo_scf_env%opt_k_t_dd)
2762 DEALLOCATE (almo_scf_env%opt_k_t_rr)
2763 DEALLOCATE (almo_scf_env%opt_k_denom)
2766 IF (almo_scf_env%need_previous_ks)
THEN
2767 DEALLOCATE (almo_scf_env%matrix_ks_0deloc)
2769 IF (almo_scf_env%need_orbital_energies)
THEN
2770 DEALLOCATE (almo_scf_env%matrix_eoo)
2771 DEALLOCATE (almo_scf_env%matrix_evv_full)
2775 DO ispin = 1, almo_scf_env%nspins
2777 almo_scf_env%domain_preconditioner(:, ispin))
2786 DEALLOCATE (almo_scf_env%domain_preconditioner)
2787 DEALLOCATE (almo_scf_env%domain_s_inv)
2788 DEALLOCATE (almo_scf_env%domain_s_sqrt_inv)
2789 DEALLOCATE (almo_scf_env%domain_s_sqrt)
2790 DEALLOCATE (almo_scf_env%domain_ks_xx)
2791 DEALLOCATE (almo_scf_env%domain_t)
2792 DEALLOCATE (almo_scf_env%domain_err)
2793 DEALLOCATE (almo_scf_env%domain_r_down_up)
2794 DO ispin = 1, almo_scf_env%nspins
2795 DEALLOCATE (almo_scf_env%domain_map(ispin)%pairs)
2796 DEALLOCATE (almo_scf_env%domain_map(ispin)%index1)
2798 DEALLOCATE (almo_scf_env%domain_map)
2799 DEALLOCATE (almo_scf_env%domain_index_of_ao)
2800 DEALLOCATE (almo_scf_env%domain_index_of_atom)
2801 DEALLOCATE (almo_scf_env%first_atom_of_domain)
2802 DEALLOCATE (almo_scf_env%last_atom_of_domain)
2803 DEALLOCATE (almo_scf_env%nbasis_of_domain)
2804 IF (
ALLOCATED(almo_scf_env%nocc_of_domain))
THEN
2805 DEALLOCATE (almo_scf_env%nocc_of_domain)
2807 DEALLOCATE (almo_scf_env%real_ne_of_domain)
2808 DEALLOCATE (almo_scf_env%nvirt_full_of_domain)
2809 DEALLOCATE (almo_scf_env%nvirt_of_domain)
2810 DEALLOCATE (almo_scf_env%nvirt_disc_of_domain)
2811 DEALLOCATE (almo_scf_env%mu_of_domain)
2812 DEALLOCATE (almo_scf_env%cpu_of_domain)
2813 DEALLOCATE (almo_scf_env%charge_of_domain)
2814 DEALLOCATE (almo_scf_env%multiplicity_of_domain)
2815 DEALLOCATE (almo_scf_env%activate)
2816 IF (almo_scf_env%smear)
THEN
2817 DEALLOCATE (almo_scf_env%mo_energies)
2818 DEALLOCATE (almo_scf_env%kTS)
2821 DEALLOCATE (almo_scf_env%domain_index_of_ao_block)
2822 DEALLOCATE (almo_scf_env%domain_index_of_mo_block)
2827 CALL timestop(handle)
2829 END SUBROUTINE almo_scf_clean_up
2840 SUBROUTINE almo_post_scf_compute_properties(qs_env)
2845 END SUBROUTINE almo_post_scf_compute_properties
Subroutines for ALMO SCF.
subroutine, public distribute_domains(almo_scf_env)
Load balancing of the submatrix computations.
subroutine, public almo_scf_p_blk_to_t_blk(almo_scf_env, ionic)
computes occupied ALMOs from the superimposed atomic density blocks
subroutine, public almo_scf_t_to_proj(t, p, eps_filter, orthog_orbs, nocc_of_domain, s, sigma, sigma_inv, use_guess, smear, algorithm, para_env, blacs_env, eps_lanczos, max_iter_lanczos, inverse_accelerator, inv_eps_factor)
computes the idempotent density matrix from MOs MOs can be either orthogonal or non-orthogonal
subroutine, public orthogonalize_mos(ket, overlap, metric, retain_locality, only_normalize, nocc_of_domain, eps_filter, order_lanczos, eps_lanczos, max_iter_lanczos, overlap_sqrti, smear)
orthogonalize MOs
subroutine, public almo_scf_t_rescaling(matrix_t, mo_energies, mu_of_domain, real_ne_of_domain, spin_kts, smear_e_temp, ndomains, nocc_of_domain)
Apply an occupation-rescaling trick to ALMOs for smearing. Partially occupied orbitals are considered...
Optimization routines for all ALMO-based SCF methods.
subroutine, public almo_scf_xalmo_trustr(qs_env, almo_scf_env, optimizer, quench_t, matrix_t_in, matrix_t_out, perturbation_only, special_case)
Optimization of ALMOs using trust region minimizers.
subroutine, public almo_scf_xalmo_pcg(qs_env, almo_scf_env, optimizer, quench_t, matrix_t_in, matrix_t_out, assume_t0_q0x, perturbation_only, special_case)
Optimization of ALMOs using PCG-like minimizers.
subroutine, public almo_scf_xalmo_eigensolver(qs_env, almo_scf_env, optimizer)
An eigensolver-based SCF to optimize extended ALMOs (i.e. ALMOs on overlapping domains)
subroutine, public almo_scf_construct_nlmos(qs_env, optimizer, matrix_s, matrix_mo_in, matrix_mo_out, template_matrix_sigma, overlap_determinant, mat_distr_aos, virtuals, eps_filter)
Optimization of NLMOs using PCG minimizers.
subroutine, public almo_scf_block_diagonal(qs_env, almo_scf_env, optimizer)
An SCF procedure that optimizes block-diagonal ALMOs using DIIS.
Interface between ALMO SCF and QS.
subroutine, public construct_qs_mos(qs_env, almo_scf_env)
Create MOs in the QS env to be able to return ALMOs to QS.
subroutine, public almo_dm_to_almo_ks(qs_env, matrix_p, matrix_ks, energy_total, eps_filter, mat_distr_aos, smear, kts_sum)
uses the ALMO density matrix to compute ALMO KS matrix and the new energy
subroutine, public calculate_w_matrix_almo(matrix_w, almo_scf_env)
Compute matrix W (energy-weighted density matrix) that is needed for the evaluation of forces.
subroutine, public matrix_almo_create(matrix_new, matrix_qs, almo_scf_env, name_new, size_keys, symmetry_new, spin_key, init_domains)
create the ALMO matrix templates
subroutine, public init_almo_ks_matrix_via_qs(qs_env, matrix_ks, mat_distr_aos, eps_filter)
Initialization of the QS and ALMO KS matrix.
subroutine, public matrix_qs_to_almo(matrix_qs, matrix_almo, mat_distr_aos)
convert between two types of matrices: QS style to ALMO style
subroutine, public almo_scf_construct_quencher(qs_env, almo_scf_env)
Creates the matrix that imposes absolute locality on MOs.
Types for all ALMO-based methods.
integer, parameter, public almo_mat_dim_occ
integer, parameter, public almo_mat_dim_virt_full
integer, parameter, public almo_mat_dim_aobasis
subroutine, public print_optimizer_options(optimizer, unit_nr)
Prints out the options of an optimizer.
integer, parameter, public almo_mat_dim_virt
integer, parameter, public almo_mat_dim_virt_disc
Routines for all ALMO-based SCF methods 'RZK-warning' marks unresolved issues.
subroutine, public almo_entry_scf(qs_env, calc_forces)
The entry point into ALMO SCF routines.
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public scheiber2018
integer, save, public kuhne2007
integer, save, public staub2019
integer, save, public khaliullin2013
integer, save, public rullan2026
integer, save, public kolafa2004
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_work_create(matrix, nblks_guess, sizedata_guess, n, work_mutable)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_binary_read(filepath, distribution, matrix_new)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
subroutine, public dbcsr_add_on_diag(matrix, alpha)
Adds the given scalar to the diagonal of the matrix. Reserves any missing diagonal blocks.
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
subroutine, public dbcsr_init_random(matrix, keep_sparsity)
Fills the given matrix with random numbers.
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_syevd(matrix, eigenvectors, eigenvalues, para_env, blacs_env)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
represent a full matrix distributed on many processors
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Subroutines to handle submatrices.
Routines useful for iterative matrix calculations.
subroutine, public invert_hotelling(matrix_inverse, matrix, threshold, use_inv_as_guess, norm_convergence, filter_eps, accelerator_order, max_iter_lanczos, eps_lanczos, silent)
invert a symmetric positive definite matrix by Hotelling's method explicit symmetrization makes this ...
subroutine, public matrix_sqrt_newton_schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, eps_lanczos, max_iter_lanczos, symmetrize, converged, iounit)
compute the sqrt of a matrix via the sign function and the corresponding Newton-Schulz iterations the...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Collection of simple mathematical functions and subroutines.
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Define the data structure for the molecule information.
subroutine, public get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity)
returns information about molecules in the set.
Types used to generate the molecular SCF guess.
subroutine, public get_matrix_from_submatrices(mscfg_env, matrix_out, iset)
Creates a distributed matrix from MOs on fragments.
Define the data structure for the particle information.
Routine to return block diagonal density matrix. Blocks correspond to the atomic densities.
subroutine, public calculate_atomic_block_dm(pmatrix, matrix_s, atomic_kind_set, qs_kind_set, nspin, nelectron_spin, ounit, para_env)
returns a block diagonal density matrix. Blocks correspond to the atomic densities.
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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.
Routines to somehow generate an initial guess.
subroutine, public calculate_mopac_dm(pmat, matrix_s, has_unit_metric, dft_control, particle_set, atomic_kind_set, qs_kind_set, nspin, nelectron_spin, para_env)
returns a block diagonal density matrix. Blocks correspond to the mopac initial guess.
Define the quickstep kind type and their sub types.
Definition and initialisation of the mo data type.
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.
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...
Utility routines for qs_scf.
subroutine, public qs_scf_compute_properties(qs_env, wf_type, do_mp2)
computes properties for a given hamilonian using the current wfn
module that contains the definitions of the scf types
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.