38 optimizer_options_type
61 USE dbcsr_api,
ONLY: &
62 dbcsr_add, dbcsr_add_on_diag, dbcsr_copy, dbcsr_create, dbcsr_desymmetrize, &
63 dbcsr_distribution_get, dbcsr_distribution_type, dbcsr_dot, dbcsr_filter, dbcsr_finalize, &
64 dbcsr_frobenius_norm, dbcsr_func_dtanh, dbcsr_func_inverse, dbcsr_func_tanh, &
65 dbcsr_function_of_elements, dbcsr_get_block_p, dbcsr_get_diag, dbcsr_get_info, &
66 dbcsr_hadamard_product, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
67 dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, &
68 dbcsr_nblkcols_total, dbcsr_nblkrows_total, dbcsr_norm, dbcsr_norm_maxabsnorm, &
69 dbcsr_p_type, dbcsr_print_block_sum, dbcsr_release, dbcsr_reserve_block2d, dbcsr_scale, &
70 dbcsr_set, dbcsr_set_diag, dbcsr_triu, dbcsr_type, dbcsr_type_no_symmetry, &
79 domain_submatrix_type,&
105 #include "./base/base_uses.f90"
111 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'almo_scf_optimizer'
119 LOGICAL,
PARAMETER :: debug_mode = .false.
120 LOGICAL,
PARAMETER :: safe_mode = .false.
121 LOGICAL,
PARAMETER :: almo_mathematica = .false.
122 INTEGER,
PARAMETER :: hessian_path_reuse = 1, &
123 hessian_path_assemble = 2
138 TYPE(qs_environment_type),
POINTER :: qs_env
139 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
140 TYPE(optimizer_options_type),
INTENT(IN) :: optimizer
142 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_block_diagonal'
144 INTEGER :: handle, iscf, ispin, nspin, unit_nr
145 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: local_nocc_of_domain
146 LOGICAL :: converged, prepare_to_exit, should_stop, &
147 use_diis, use_prev_as_guess
148 REAL(kind=
dp) :: density_rec, energy_diff, energy_new, energy_old, error_norm, &
149 error_norm_ispin, kts_sum, prev_error_norm, t1, t2, true_mixing_fraction
150 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: local_mu
151 TYPE(almo_scf_diis_type),
ALLOCATABLE, &
152 DIMENSION(:) :: almo_diis
153 TYPE(cp_logger_type),
POINTER :: logger
154 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: matrix_mixing_old_blk
155 TYPE(qs_energy_type),
POINTER ::
qs_energy
157 CALL timeset(routinen, handle)
161 IF (logger%para_env%is_source())
THEN
169 use_prev_as_guess = .false.
171 nspin = almo_scf_env%nspins
172 ALLOCATE (local_mu(almo_scf_env%ndomains))
173 ALLOCATE (local_nocc_of_domain(almo_scf_env%ndomains))
176 ALLOCATE (matrix_mixing_old_blk(nspin))
177 ALLOCATE (almo_diis(nspin))
179 CALL dbcsr_create(matrix_mixing_old_blk(ispin), &
180 template=almo_scf_env%matrix_ks_blk(ispin))
181 CALL almo_scf_diis_init(diis_env=almo_diis(ispin), &
182 sample_err=almo_scf_env%matrix_ks_blk(ispin), &
183 sample_var=almo_scf_env%matrix_s_blk(1), &
185 max_length=optimizer%ndiis)
192 prepare_to_exit = .false.
193 true_mixing_fraction = 0.0_dp
194 error_norm = 1.0e+10_dp
196 IF (unit_nr > 0)
THEN
197 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 20), &
198 " Optimization of block-diagonal ALMOs ", repeat(
"-", 21)
200 WRITE (unit_nr,
'(T2,A13,A6,A23,A14,A14,A9)')
"Method",
"Iter", &
201 "Total Energy",
"Change",
"Convergence",
"Time"
202 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
218 var=almo_scf_env%matrix_ks_blk(ispin), &
219 err=almo_scf_env%matrix_err_blk(ispin))
224 prev_error_norm = error_norm
227 CALL dbcsr_norm(almo_scf_env%matrix_err_blk(ispin), &
228 dbcsr_norm_maxabsnorm, &
229 norm_scalar=error_norm_ispin)
230 IF (ispin .EQ. 1) error_norm = error_norm_ispin
231 IF (ispin .GT. 1 .AND. error_norm_ispin .GT. error_norm) &
232 error_norm = error_norm_ispin
235 IF (error_norm .LT. almo_scf_env%eps_prev_guess)
THEN
236 use_prev_as_guess = .true.
238 use_prev_as_guess = .false.
243 IF (error_norm .GT. optimizer%eps_error) converged = .false.
247 start_time=qs_env%start_time, &
248 target_time=qs_env%target_time)
249 IF (should_stop .OR. iscf >= optimizer%max_iter .OR. converged)
THEN
250 prepare_to_exit = .true.
251 IF (iscf == 1) energy_new = energy_old
255 IF (optimizer%early_stopping_on .AND. iscf .EQ. 1) &
256 prepare_to_exit = .false.
258 IF (.NOT. prepare_to_exit)
THEN
261 IF (iscf .NE. 1)
THEN
265 extr_var=almo_scf_env%matrix_ks_blk(ispin))
268 true_mixing_fraction = almo_scf_env%mixing_fraction
270 CALL dbcsr_add(almo_scf_env%matrix_ks_blk(ispin), &
271 matrix_mixing_old_blk(ispin), &
272 true_mixing_fraction, &
273 1.0_dp - true_mixing_fraction)
279 CALL dbcsr_copy(matrix_mixing_old_blk(ispin), &
280 almo_scf_env%matrix_ks_blk(ispin))
284 SELECT CASE (almo_scf_env%almo_update_algorithm)
294 local_nocc_of_domain(:) = almo_scf_env%nocc_of_domain(:, ispin)
295 local_mu(:) = almo_scf_env%mu_of_domain(:, ispin)
299 cpabort(
"Density_matrix_sign has not been tested yet")
311 almo_scf_env%mu_of_domain(:, ispin) = local_mu(:)
318 DO ispin = 1, almo_scf_env%nspins
321 overlap=almo_scf_env%matrix_sigma_blk(ispin), &
322 metric=almo_scf_env%matrix_s_blk(1), &
323 retain_locality=.true., &
324 only_normalize=.false., &
325 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
326 eps_filter=almo_scf_env%eps_filter, &
327 order_lanczos=almo_scf_env%order_lanczos, &
328 eps_lanczos=almo_scf_env%eps_lanczos, &
329 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
336 DO ispin = 1, almo_scf_env%nspins
339 IF (almo_scf_env%smear)
THEN
341 mo_energies=almo_scf_env%mo_energies(:, ispin), &
342 mu_of_domain=almo_scf_env%mu_of_domain(:, ispin), &
343 real_ne_of_domain=almo_scf_env%real_ne_of_domain(:, ispin), &
344 spin_kts=almo_scf_env%kTS(ispin), &
345 smear_e_temp=almo_scf_env%smear_e_temp, &
346 ndomains=almo_scf_env%ndomains, &
347 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin))
351 p=almo_scf_env%matrix_p(ispin), &
352 eps_filter=almo_scf_env%eps_filter, &
353 orthog_orbs=.false., &
354 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
355 s=almo_scf_env%matrix_s(1), &
356 sigma=almo_scf_env%matrix_sigma(ispin), &
357 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
358 use_guess=use_prev_as_guess, &
359 smear=almo_scf_env%smear, &
360 algorithm=almo_scf_env%sigma_inv_algorithm, &
361 inverse_accelerator=almo_scf_env%order_lanczos, &
362 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
363 eps_lanczos=almo_scf_env%eps_lanczos, &
364 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
365 para_env=almo_scf_env%para_env, &
366 blacs_env=almo_scf_env%blacs_env)
370 IF (almo_scf_env%nspins == 1)
THEN
371 CALL dbcsr_scale(almo_scf_env%matrix_p(1), 2.0_dp)
373 IF (almo_scf_env%smear)
THEN
374 almo_scf_env%kTS(1) = almo_scf_env%kTS(1)*2.0_dp
378 IF (almo_scf_env%smear)
THEN
379 kts_sum = sum(almo_scf_env%kTS)
386 almo_scf_env%matrix_p, &
387 almo_scf_env%matrix_ks, &
389 almo_scf_env%eps_filter, &
390 almo_scf_env%mat_distr_aos, &
391 smear=almo_scf_env%smear, &
396 energy_diff = energy_new - energy_old
397 energy_old = energy_new
398 almo_scf_env%almo_scf_energy = energy_new
402 IF (unit_nr > 0)
THEN
403 WRITE (unit_nr,
'(T2,A13,I6,F23.10,E14.5,F14.9,F9.2)')
"ALMO SCF DIIS", &
405 energy_new, energy_diff, error_norm, t2 - t1
409 IF (prepare_to_exit)
EXIT
414 IF (almo_scf_env%smear)
THEN
416 CALL dbcsr_dot(almo_scf_env%matrix_p(ispin), almo_scf_env%matrix_s(1), density_rec)
417 IF (unit_nr > 0)
THEN
418 WRITE (unit_nr,
'(T2,A20,F23.10)')
"Electrons recovered:", density_rec
423 IF (.NOT. converged .AND. (.NOT. optimizer%early_stopping_on))
THEN
424 IF (unit_nr > 0)
THEN
425 cpabort(
"SCF for block-diagonal ALMOs not converged!")
430 CALL dbcsr_release(matrix_mixing_old_blk(ispin))
433 DEALLOCATE (almo_diis)
434 DEALLOCATE (matrix_mixing_old_blk)
435 DEALLOCATE (local_mu)
436 DEALLOCATE (local_nocc_of_domain)
438 CALL timestop(handle)
454 TYPE(qs_environment_type),
POINTER :: qs_env
455 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
456 TYPE(optimizer_options_type),
INTENT(IN) :: optimizer
458 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_xalmo_eigensolver'
460 INTEGER :: handle, iscf, ispin, nspin, unit_nr
461 LOGICAL :: converged, prepare_to_exit, should_stop
462 REAL(kind=
dp) :: denergy_tot, density_rec, energy_diff, energy_new, energy_old, error_norm, &
463 error_norm_0, kts_sum, spin_factor, t1, t2
464 REAL(kind=
dp),
DIMENSION(2) :: denergy_spin
465 TYPE(almo_scf_diis_type),
ALLOCATABLE, &
466 DIMENSION(:) :: almo_diis
467 TYPE(cp_logger_type),
POINTER :: logger
468 TYPE(dbcsr_type) :: matrix_p_almo_scf_converged
469 TYPE(domain_submatrix_type),
ALLOCATABLE, &
470 DIMENSION(:, :) :: submatrix_mixing_old_blk
472 CALL timeset(routinen, handle)
476 IF (logger%para_env%is_source())
THEN
482 nspin = almo_scf_env%nspins
493 matrix_s=almo_scf_env%matrix_s(1), &
494 subm_s_sqrt=almo_scf_env%domain_s_sqrt(:, ispin), &
495 subm_s_sqrt_inv=almo_scf_env%domain_s_sqrt_inv(:, ispin), &
496 dpattern=almo_scf_env%quench_t(ispin), &
497 map=almo_scf_env%domain_map(ispin), &
498 node_of_domain=almo_scf_env%cpu_of_domain)
513 matrix=almo_scf_env%quench_t(ispin), &
514 submatrix=almo_scf_env%domain_t(:, ispin), &
515 distr_pattern=almo_scf_env%quench_t(ispin), &
516 domain_map=almo_scf_env%domain_map(ispin), &
517 node_of_domain=almo_scf_env%cpu_of_domain, &
522 ALLOCATE (submatrix_mixing_old_blk(almo_scf_env%ndomains, nspin))
523 CALL init_submatrices(submatrix_mixing_old_blk)
524 ALLOCATE (almo_diis(nspin))
550 CALL almo_scf_diis_init(diis_env=almo_diis(ispin), &
551 sample_err=almo_scf_env%domain_s_sqrt(:, ispin), &
553 max_length=optimizer%ndiis)
559 prepare_to_exit = .false.
573 d_var=almo_scf_env%domain_ks_xx(:, ispin), &
574 d_err=almo_scf_env%domain_err(:, ispin))
581 CALL dbcsr_norm(almo_scf_env%matrix_err_xx(ispin), &
582 dbcsr_norm_maxabsnorm, &
583 norm_scalar=error_norm)
586 IF (error_norm .GT. optimizer%eps_error)
THEN
593 start_time=qs_env%start_time, &
594 target_time=qs_env%target_time)
595 IF (should_stop .OR. iscf >= optimizer%max_iter .OR. converged)
THEN
596 prepare_to_exit = .true.
600 IF (optimizer%early_stopping_on .AND. iscf .EQ. 1) &
601 prepare_to_exit = .false.
603 IF (.NOT. prepare_to_exit)
THEN
606 IF (iscf .NE. 1)
THEN
609 CALL add_submatrices( &
610 almo_scf_env%mixing_fraction, &
611 almo_scf_env%domain_ks_xx(:, ispin), &
612 1.0_dp - almo_scf_env%mixing_fraction, &
613 submatrix_mixing_old_blk(:, ispin), &
619 d_extr_var=almo_scf_env%domain_ks_xx(:, ispin))
625 CALL copy_submatrices( &
626 almo_scf_env%domain_ks_xx(:, ispin), &
627 submatrix_mixing_old_blk(:, ispin), &
638 IF (iscf .EQ. 1)
THEN
639 CALL dbcsr_create(matrix_p_almo_scf_converged, &
640 template=almo_scf_env%matrix_p(ispin))
641 CALL dbcsr_copy(matrix_p_almo_scf_converged, &
642 almo_scf_env%matrix_p(ispin))
646 IF (almo_scf_env%smear)
THEN
648 mo_energies=almo_scf_env%mo_energies(:, ispin), &
649 mu_of_domain=almo_scf_env%mu_of_domain(:, ispin), &
650 real_ne_of_domain=almo_scf_env%real_ne_of_domain(:, ispin), &
651 spin_kts=almo_scf_env%kTS(ispin), &
652 smear_e_temp=almo_scf_env%smear_e_temp, &
653 ndomains=almo_scf_env%ndomains, &
654 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin))
659 t=almo_scf_env%matrix_t(ispin), &
660 p=almo_scf_env%matrix_p(ispin), &
661 eps_filter=almo_scf_env%eps_filter, &
662 orthog_orbs=.false., &
663 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
664 s=almo_scf_env%matrix_s(1), &
665 sigma=almo_scf_env%matrix_sigma(ispin), &
666 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
668 smear=almo_scf_env%smear, &
669 algorithm=almo_scf_env%sigma_inv_algorithm, &
670 inverse_accelerator=almo_scf_env%order_lanczos, &
671 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
672 eps_lanczos=almo_scf_env%eps_lanczos, &
673 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
674 para_env=almo_scf_env%para_env, &
675 blacs_env=almo_scf_env%blacs_env)
676 CALL dbcsr_scale(almo_scf_env%matrix_p(ispin), spin_factor)
678 IF (almo_scf_env%smear)
THEN
679 almo_scf_env%kTS(ispin) = almo_scf_env%kTS(ispin)*spin_factor
684 IF (iscf .EQ. 1)
THEN
686 CALL dbcsr_add(matrix_p_almo_scf_converged, &
687 almo_scf_env%matrix_p(ispin), -1.0_dp, 1.0_dp)
688 CALL dbcsr_dot(almo_scf_env%matrix_ks_0deloc(ispin), &
689 matrix_p_almo_scf_converged, &
692 CALL dbcsr_release(matrix_p_almo_scf_converged)
696 denergy_tot = denergy_tot + denergy_spin(ispin)
761 IF (iscf .EQ. 1)
THEN
762 CALL energy_lowering_report( &
764 ref_energy=almo_scf_env%almo_scf_energy, &
765 energy_lowering=denergy_tot)
767 energy=almo_scf_env%almo_scf_energy, &
768 energy_singles_corr=denergy_tot)
772 IF (.NOT. almo_scf_env%perturbative_delocalization)
THEN
774 IF (almo_scf_env%smear)
THEN
775 kts_sum = sum(almo_scf_env%kTS)
781 almo_scf_env%matrix_p, &
782 almo_scf_env%matrix_ks, &
784 almo_scf_env%eps_filter, &
785 almo_scf_env%mat_distr_aos, &
786 smear=almo_scf_env%smear, &
792 IF (almo_scf_env%perturbative_delocalization)
THEN
795 CALL almo_dm_to_qs_env(qs_env, almo_scf_env%matrix_p, almo_scf_env%mat_distr_aos)
797 prepare_to_exit = .true.
801 energy_diff = energy_new - energy_old
802 energy_old = energy_new
803 almo_scf_env%almo_scf_energy = energy_new
807 IF (unit_nr > 0)
THEN
808 WRITE (unit_nr,
'(T2,A,I6,F20.9,E11.3,E11.3,E11.3,F8.2)')
"ALMO SCF", &
810 energy_new, energy_diff, error_norm, error_norm_0, t2 - t1
816 IF (prepare_to_exit)
EXIT
821 IF (almo_scf_env%smear)
THEN
823 CALL dbcsr_dot(almo_scf_env%matrix_p(ispin), almo_scf_env%matrix_s(1), density_rec)
824 IF (unit_nr > 0)
THEN
825 WRITE (unit_nr,
'(T2,A20,F23.10)')
"Electrons recovered:", density_rec
830 IF (.NOT. converged .AND. .NOT. optimizer%early_stopping_on)
THEN
831 cpabort(
"SCF for ALMOs on overlapping domains not converged! ")
835 CALL release_submatrices(submatrix_mixing_old_blk(:, ispin))
838 DEALLOCATE (almo_diis)
839 DEALLOCATE (submatrix_mixing_old_blk)
841 CALL timestop(handle)
867 matrix_t_in, matrix_t_out, assume_t0_q0x, perturbation_only, &
870 TYPE(qs_environment_type),
POINTER :: qs_env
871 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
872 TYPE(optimizer_options_type),
INTENT(IN) :: optimizer
873 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:), &
874 INTENT(INOUT) :: quench_t, matrix_t_in, matrix_t_out
875 LOGICAL,
INTENT(IN) :: assume_t0_q0x, perturbation_only
876 INTEGER,
INTENT(IN),
OPTIONAL :: special_case
878 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_xalmo_pcg'
880 CHARACTER(LEN=20) :: iter_type
881 INTEGER :: cg_iteration, dim_op, fixed_line_search_niter, handle, idim0, ielem, ispin, &
882 iteration, line_search_iteration, max_iter, my_special_case, ndomains, nmo, nspins, &
883 outer_iteration, outer_max_iter, para_group_handle, prec_type, reim, unit_nr
884 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nocc
885 LOGICAL :: blissful_neglect, converged, just_started, line_search, normalize_orbitals, &
886 optimize_theta, outer_prepare_to_exit, penalty_occ_local, penalty_occ_vol, &
887 prepare_to_exit, reset_conjugator, skip_grad, use_guess
888 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: reim_diag, weights, z2
889 REAL(kind=
dp) :: appr_sec_der, beta, denom, denom2, e0, e1, energy_coeff, energy_diff, &
890 energy_new, energy_old, eps_skip_gradients, fval, g0, g1, grad_norm, grad_norm_frob, &
891 line_search_error, localiz_coeff, localization_obj_function, next_step_size_guess, &
892 penalty_amplitude, penalty_func_new, spin_factor, step_size, t1, t2, tempreal
893 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: grad_norm_spin, &
894 penalty_occ_vol_g_prefactor, &
895 penalty_occ_vol_h_prefactor
896 TYPE(cell_type),
POINTER :: cell
897 TYPE(cp_logger_type),
POINTER :: logger
898 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: qs_matrix_s
899 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: op_sm_set_almo, op_sm_set_qs
900 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: ftsiginv, grad, m_sig_sqrti_ii, m_t_in_local, &
901 m_theta, prec_vv, prev_grad, prev_minus_prec_grad, prev_step, siginvtftsiginv, st, step, &
902 stsiginv_0, tempnocc, tempnocc_1, tempoccocc
903 TYPE(domain_submatrix_type),
ALLOCATABLE, &
904 DIMENSION(:, :) :: bad_modes_projector_down, domain_r_down
905 TYPE(mp_comm_type) :: para_group
907 CALL timeset(routinen, handle)
910 IF (
PRESENT(special_case)) my_special_case = special_case
914 IF (logger%para_env%is_source())
THEN
920 nspins = almo_scf_env%nspins
924 blissful_neglect = .false.
926 blissful_neglect = .true.
929 IF (unit_nr > 0)
THEN
931 SELECT CASE (my_special_case)
933 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 20), &
934 " Optimization of block-diagonal ALMOs ", repeat(
"-", 21)
936 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 20), &
937 " Optimization of fully delocalized MOs ", repeat(
"-", 20)
939 IF (blissful_neglect)
THEN
940 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 25), &
941 " LCP optimization of XALMOs ", repeat(
"-", 26)
943 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 27), &
944 " Optimization of XALMOs ", repeat(
"-", 28)
948 WRITE (unit_nr,
'(T2,A13,A6,A23,A14,A14,A9)')
"Method",
"Iter", &
949 "Objective Function",
"Change",
"Convergence",
"Time"
950 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
955 optimize_theta = almo_scf_env%logical05
956 eps_skip_gradients = almo_scf_env%real01
959 energy_coeff = 1.0_dp
960 localiz_coeff = 0.0_dp
961 penalty_amplitude = 0.0_dp
962 penalty_occ_vol = .false.
964 penalty_occ_local = .false.
966 normalize_orbitals = penalty_occ_vol .OR. penalty_occ_local
967 ALLOCATE (penalty_occ_vol_g_prefactor(nspins))
968 ALLOCATE (penalty_occ_vol_h_prefactor(nspins))
969 penalty_occ_vol_g_prefactor(:) = 0.0_dp
970 penalty_occ_vol_h_prefactor(:) = 0.0_dp
971 penalty_func_new = 0.0_dp
974 prec_type = optimizer%preconditioner
977 fixed_line_search_niter = 0
979 IF (nspins == 1)
THEN
985 ALLOCATE (grad_norm_spin(nspins))
986 ALLOCATE (nocc(nspins))
992 ALLOCATE (m_t_in_local(nspins))
994 CALL dbcsr_create(m_t_in_local(ispin), &
995 template=matrix_t_in(ispin), &
996 matrix_type=dbcsr_type_no_symmetry)
997 CALL dbcsr_copy(m_t_in_local(ispin), matrix_t_in(ispin))
1002 ALLOCATE (m_theta(nspins))
1003 DO ispin = 1, nspins
1004 CALL dbcsr_create(m_theta(ispin), &
1005 template=matrix_t_out(ispin), &
1006 matrix_type=dbcsr_type_no_symmetry)
1010 IF (penalty_occ_local)
THEN
1013 matrix_s=qs_matrix_s, &
1016 IF (cell%orthorhombic)
THEN
1021 ALLOCATE (weights(6))
1026 ALLOCATE (op_sm_set_qs(2, dim_op))
1027 ALLOCATE (op_sm_set_almo(2, dim_op))
1029 DO idim0 = 1, dim_op
1030 DO reim = 1,
SIZE(op_sm_set_qs, 1)
1031 NULLIFY (op_sm_set_qs(reim, idim0)%matrix)
1032 ALLOCATE (op_sm_set_qs(reim, idim0)%matrix)
1033 CALL dbcsr_copy(op_sm_set_qs(reim, idim0)%matrix, qs_matrix_s(1)%matrix, &
1034 name=
"almo_scf_env%op_sm_"//trim(adjustl(cp_to_string(reim)))//
"-"//trim(adjustl(cp_to_string(idim0))))
1035 CALL dbcsr_set(op_sm_set_qs(reim, idim0)%matrix, 0.0_dp)
1036 NULLIFY (op_sm_set_almo(reim, idim0)%matrix)
1037 ALLOCATE (op_sm_set_almo(reim, idim0)%matrix)
1038 CALL dbcsr_copy(op_sm_set_almo(reim, idim0)%matrix, almo_scf_env%matrix_s(1), &
1039 name=
"almo_scf_env%op_sm_"//trim(adjustl(cp_to_string(reim)))//
"-"//trim(adjustl(cp_to_string(idim0))))
1040 CALL dbcsr_set(op_sm_set_almo(reim, idim0)%matrix, 0.0_dp)
1053 m_t_in=m_t_in_local, &
1054 m_t0=almo_scf_env%matrix_t_blk, &
1055 m_quench_t=quench_t, &
1056 m_overlap=almo_scf_env%matrix_s(1), &
1057 m_sigma_tmpl=almo_scf_env%matrix_sigma_inv, &
1059 xalmo_history=almo_scf_env%xalmo_history, &
1060 assume_t0_q0x=assume_t0_q0x, &
1061 optimize_theta=optimize_theta, &
1062 envelope_amplitude=almo_scf_env%envelope_amplitude, &
1063 eps_filter=almo_scf_env%eps_filter, &
1064 order_lanczos=almo_scf_env%order_lanczos, &
1065 eps_lanczos=almo_scf_env%eps_lanczos, &
1066 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
1067 nocc_of_domain=almo_scf_env%nocc_of_domain)
1069 ndomains = almo_scf_env%ndomains
1070 ALLOCATE (domain_r_down(ndomains, nspins))
1071 CALL init_submatrices(domain_r_down)
1072 ALLOCATE (bad_modes_projector_down(ndomains, nspins))
1073 CALL init_submatrices(bad_modes_projector_down)
1075 ALLOCATE (prec_vv(nspins))
1076 ALLOCATE (siginvtftsiginv(nspins))
1077 ALLOCATE (stsiginv_0(nspins))
1078 ALLOCATE (ftsiginv(nspins))
1079 ALLOCATE (st(nspins))
1080 ALLOCATE (prev_grad(nspins))
1081 ALLOCATE (grad(nspins))
1082 ALLOCATE (prev_step(nspins))
1083 ALLOCATE (step(nspins))
1084 ALLOCATE (prev_minus_prec_grad(nspins))
1085 ALLOCATE (m_sig_sqrti_ii(nspins))
1086 ALLOCATE (tempnocc(nspins))
1087 ALLOCATE (tempnocc_1(nspins))
1088 ALLOCATE (tempoccocc(nspins))
1089 DO ispin = 1, nspins
1092 CALL dbcsr_create(prec_vv(ispin), &
1093 template=almo_scf_env%matrix_ks(ispin), &
1094 matrix_type=dbcsr_type_no_symmetry)
1095 CALL dbcsr_create(siginvtftsiginv(ispin), &
1096 template=almo_scf_env%matrix_sigma(ispin), &
1097 matrix_type=dbcsr_type_no_symmetry)
1098 CALL dbcsr_create(stsiginv_0(ispin), &
1099 template=matrix_t_out(ispin), &
1100 matrix_type=dbcsr_type_no_symmetry)
1101 CALL dbcsr_create(ftsiginv(ispin), &
1102 template=matrix_t_out(ispin), &
1103 matrix_type=dbcsr_type_no_symmetry)
1104 CALL dbcsr_create(st(ispin), &
1105 template=matrix_t_out(ispin), &
1106 matrix_type=dbcsr_type_no_symmetry)
1107 CALL dbcsr_create(prev_grad(ispin), &
1108 template=matrix_t_out(ispin), &
1109 matrix_type=dbcsr_type_no_symmetry)
1110 CALL dbcsr_create(grad(ispin), &
1111 template=matrix_t_out(ispin), &
1112 matrix_type=dbcsr_type_no_symmetry)
1113 CALL dbcsr_create(prev_step(ispin), &
1114 template=matrix_t_out(ispin), &
1115 matrix_type=dbcsr_type_no_symmetry)
1116 CALL dbcsr_create(step(ispin), &
1117 template=matrix_t_out(ispin), &
1118 matrix_type=dbcsr_type_no_symmetry)
1119 CALL dbcsr_create(prev_minus_prec_grad(ispin), &
1120 template=matrix_t_out(ispin), &
1121 matrix_type=dbcsr_type_no_symmetry)
1122 CALL dbcsr_create(m_sig_sqrti_ii(ispin), &
1123 template=almo_scf_env%matrix_sigma_inv(ispin), &
1124 matrix_type=dbcsr_type_no_symmetry)
1125 CALL dbcsr_create(tempnocc(ispin), &
1126 template=matrix_t_out(ispin), &
1127 matrix_type=dbcsr_type_no_symmetry)
1128 CALL dbcsr_create(tempnocc_1(ispin), &
1129 template=matrix_t_out(ispin), &
1130 matrix_type=dbcsr_type_no_symmetry)
1131 CALL dbcsr_create(tempoccocc(ispin), &
1132 template=almo_scf_env%matrix_sigma_inv(ispin), &
1133 matrix_type=dbcsr_type_no_symmetry)
1135 CALL dbcsr_set(step(ispin), 0.0_dp)
1136 CALL dbcsr_set(prev_step(ispin), 0.0_dp)
1138 CALL dbcsr_get_info(almo_scf_env%matrix_sigma_inv(ispin), &
1139 nfullrows_total=nocc(ispin))
1146 matrix_s=almo_scf_env%matrix_s(1), &
1147 subm_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
1148 dpattern=quench_t(ispin), &
1149 map=almo_scf_env%domain_map(ispin), &
1150 node_of_domain=almo_scf_env%cpu_of_domain)
1153 matrix_s=almo_scf_env%matrix_s(1), &
1154 subm_s_sqrt=almo_scf_env%domain_s_sqrt(:, ispin), &
1155 subm_s_sqrt_inv=almo_scf_env%domain_s_sqrt_inv(:, ispin), &
1156 dpattern=almo_scf_env%quench_t(ispin), &
1157 map=almo_scf_env%domain_map(ispin), &
1158 node_of_domain=almo_scf_env%cpu_of_domain)
1162 IF (assume_t0_q0x)
THEN
1166 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1167 almo_scf_env%matrix_s(1), &
1168 almo_scf_env%matrix_t_blk(ispin), &
1169 0.0_dp, st(ispin), &
1170 filter_eps=almo_scf_env%eps_filter)
1171 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1173 almo_scf_env%matrix_sigma_inv_0deloc(ispin), &
1174 0.0_dp, stsiginv_0(ispin), &
1175 filter_eps=almo_scf_env%eps_filter)
1181 matrix_t=almo_scf_env%matrix_t_blk(ispin), &
1182 matrix_sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
1183 matrix_s=almo_scf_env%matrix_s(1), &
1184 subm_r_down=domain_r_down(:, ispin), &
1185 dpattern=quench_t(ispin), &
1186 map=almo_scf_env%domain_map(ispin), &
1187 node_of_domain=almo_scf_env%cpu_of_domain, &
1188 filter_eps=almo_scf_env%eps_filter)
1194 IF (penalty_occ_local)
THEN
1197 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1198 almo_scf_env%matrix_s(1), &
1199 matrix_t_in(ispin), &
1200 0.0_dp, tempnocc(ispin), &
1201 filter_eps=almo_scf_env%eps_filter)
1202 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1204 almo_scf_env%matrix_sigma_inv(ispin), &
1205 0.0_dp, tempnocc_1(ispin), &
1206 filter_eps=almo_scf_env%eps_filter)
1208 DO idim0 = 1,
SIZE(op_sm_set_qs, 2)
1209 DO reim = 1,
SIZE(op_sm_set_qs, 1)
1211 CALL matrix_qs_to_almo(op_sm_set_qs(reim, idim0)%matrix, op_sm_set_almo(reim, idim0)%matrix, &
1212 almo_scf_env%mat_distr_aos, .false.)
1214 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1215 op_sm_set_almo(reim, idim0)%matrix, &
1216 matrix_t_in(ispin), &
1217 0.0_dp, tempnocc(ispin), &
1218 filter_eps=almo_scf_env%eps_filter)
1220 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
1221 matrix_t_in(ispin), &
1223 0.0_dp, tempoccocc(ispin), &
1224 filter_eps=almo_scf_env%eps_filter)
1226 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1227 tempnocc_1(ispin), &
1228 tempoccocc(ispin), &
1229 0.0_dp, tempnocc(ispin), &
1230 filter_eps=almo_scf_env%eps_filter)
1232 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
1234 tempnocc_1(ispin), &
1235 0.0_dp, op_sm_set_almo(reim, idim0)%matrix, &
1236 filter_eps=almo_scf_env%eps_filter)
1246 outer_max_iter = optimizer%max_iter_outer_loop
1247 outer_prepare_to_exit = .false.
1250 grad_norm_frob = 0.0_dp
1256 max_iter = optimizer%max_iter
1257 prepare_to_exit = .false.
1258 line_search = .false.
1262 line_search_iteration = 0
1265 energy_diff = 0.0_dp
1266 localization_obj_function = 0.0_dp
1267 line_search_error = 0.0_dp
1273 just_started = (iteration .EQ. 0) .AND. (outer_iteration .EQ. 0)
1275 CALL main_var_to_xalmos_and_loss_func( &
1276 almo_scf_env=almo_scf_env, &
1278 m_main_var_in=m_theta, &
1279 m_t_out=matrix_t_out, &
1280 m_sig_sqrti_ii_out=m_sig_sqrti_ii, &
1281 energy_out=energy_new, &
1282 penalty_out=penalty_func_new, &
1283 m_ftsiginv_out=ftsiginv, &
1284 m_siginvtftsiginv_out=siginvtftsiginv, &
1286 m_stsiginv0_in=stsiginv_0, &
1287 m_quench_t_in=quench_t, &
1288 domain_r_down_in=domain_r_down, &
1289 assume_t0_q0x=assume_t0_q0x, &
1290 just_started=just_started, &
1291 optimize_theta=optimize_theta, &
1292 normalize_orbitals=normalize_orbitals, &
1293 perturbation_only=perturbation_only, &
1294 do_penalty=penalty_occ_vol, &
1295 special_case=my_special_case)
1296 IF (penalty_occ_vol)
THEN
1298 energy_new = energy_new + penalty_func_new
1300 DO ispin = 1, nspins
1301 IF (penalty_occ_vol)
THEN
1302 penalty_occ_vol_g_prefactor(ispin) = &
1303 -2.0_dp*penalty_amplitude*spin_factor*nocc(ispin)
1304 penalty_occ_vol_h_prefactor(ispin) = 0.0_dp
1308 localization_obj_function = 0.0_dp
1310 IF (penalty_occ_local)
THEN
1311 DO ispin = 1, nspins
1314 localization_obj_function = 0.0_dp
1315 CALL dbcsr_get_info(almo_scf_env%matrix_sigma_inv(ispin), nfullrows_total=nmo)
1317 ALLOCATE (reim_diag(nmo))
1319 CALL dbcsr_get_info(tempoccocc(ispin), group=para_group_handle)
1320 CALL para_group%set_handle(para_group_handle)
1322 DO idim0 = 1,
SIZE(op_sm_set_qs, 2)
1326 DO reim = 1,
SIZE(op_sm_set_qs, 1)
1330 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
1331 op_sm_set_almo(reim, idim0)%matrix, &
1332 matrix_t_out(ispin), &
1333 0.0_dp, tempnocc(ispin), &
1334 filter_eps=almo_scf_env%eps_filter)
1336 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
1337 matrix_t_out(ispin), &
1339 0.0_dp, tempoccocc(ispin), &
1340 filter_eps=almo_scf_env%eps_filter)
1343 CALL dbcsr_get_diag(tempoccocc(ispin), reim_diag)
1344 CALL para_group%sum(reim_diag)
1345 z2(:) = z2(:) + reim_diag(:)*reim_diag(:)
1352 fval = -weights(idim0)*log(abs(z2(ielem)))
1354 fval = weights(idim0) - weights(idim0)*abs(z2(ielem))
1356 fval = weights(idim0) - weights(idim0)*sqrt(abs(z2(ielem)))
1358 localization_obj_function = localization_obj_function + fval
1364 DEALLOCATE (reim_diag)
1366 energy_new = energy_new + localiz_coeff*localization_obj_function
1371 DO ispin = 1, nspins
1373 IF (just_started .AND. almo_mathematica)
THEN
1374 IF (ispin .GT. 1) cpwarn(
"Mathematica files will be overwritten")
1375 CALL print_mathematica_matrix(almo_scf_env%matrix_s(1),
"matrixS.dat")
1376 CALL print_mathematica_matrix(almo_scf_env%matrix_ks(ispin),
"matrixF.dat")
1377 CALL print_mathematica_matrix(matrix_t_out(ispin),
"matrixT.dat")
1378 CALL print_mathematica_matrix(quench_t(ispin),
"matrixQ.dat")
1384 IF (line_search_iteration .EQ. 0 .AND. iteration .NE. 0) &
1385 CALL dbcsr_copy(prev_grad(ispin), grad(ispin))
1390 skip_grad = (iteration .GT. 0 .AND. &
1391 fixed_line_search_niter .NE. 0 .AND. &
1392 line_search_iteration .NE. fixed_line_search_niter)
1394 IF (.NOT. skip_grad)
THEN
1396 DO ispin = 1, nspins
1398 CALL compute_gradient( &
1399 m_grad_out=grad(ispin), &
1400 m_ks=almo_scf_env%matrix_ks(ispin), &
1401 m_s=almo_scf_env%matrix_s(1), &
1402 m_t=matrix_t_out(ispin), &
1403 m_t0=almo_scf_env%matrix_t_blk(ispin), &
1404 m_siginv=almo_scf_env%matrix_sigma_inv(ispin), &
1405 m_quench_t=quench_t(ispin), &
1406 m_ftsiginv=ftsiginv(ispin), &
1407 m_siginvtftsiginv=siginvtftsiginv(ispin), &
1409 m_stsiginv0=stsiginv_0(ispin), &
1410 m_theta=m_theta(ispin), &
1411 m_sig_sqrti_ii=m_sig_sqrti_ii(ispin), &
1412 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
1413 domain_r_down=domain_r_down(:, ispin), &
1414 cpu_of_domain=almo_scf_env%cpu_of_domain, &
1415 domain_map=almo_scf_env%domain_map(ispin), &
1416 assume_t0_q0x=assume_t0_q0x, &
1417 optimize_theta=optimize_theta, &
1418 normalize_orbitals=normalize_orbitals, &
1419 penalty_occ_vol=penalty_occ_vol, &
1420 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(ispin), &
1421 envelope_amplitude=almo_scf_env%envelope_amplitude, &
1422 eps_filter=almo_scf_env%eps_filter, &
1423 spin_factor=spin_factor, &
1424 special_case=my_special_case, &
1425 penalty_occ_local=penalty_occ_local, &
1426 op_sm_set=op_sm_set_almo, &
1428 energy_coeff=energy_coeff, &
1429 localiz_coeff=localiz_coeff)
1438 IF (blissful_neglect)
THEN
1439 DO ispin = 1, nspins
1442 IF (iteration .EQ. 0)
THEN
1443 CALL compute_preconditioner( &
1444 domain_prec_out=almo_scf_env%domain_preconditioner(:, ispin), &
1445 bad_modes_projector_down_out=bad_modes_projector_down(:, ispin), &
1446 m_prec_out=prec_vv(ispin), &
1447 m_ks=almo_scf_env%matrix_ks(ispin), &
1448 m_s=almo_scf_env%matrix_s(1), &
1449 m_siginv=almo_scf_env%matrix_sigma_inv(ispin), &
1450 m_quench_t=quench_t(ispin), &
1451 m_ftsiginv=ftsiginv(ispin), &
1452 m_siginvtftsiginv=siginvtftsiginv(ispin), &
1454 para_env=almo_scf_env%para_env, &
1455 blacs_env=almo_scf_env%blacs_env, &
1456 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
1457 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
1458 domain_s_inv_half=almo_scf_env%domain_s_sqrt_inv(:, ispin), &
1459 domain_s_half=almo_scf_env%domain_s_sqrt(:, ispin), &
1460 domain_r_down=domain_r_down(:, ispin), &
1461 cpu_of_domain=almo_scf_env%cpu_of_domain, &
1462 domain_map=almo_scf_env%domain_map(ispin), &
1463 assume_t0_q0x=assume_t0_q0x, &
1464 penalty_occ_vol=penalty_occ_vol, &
1465 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(ispin), &
1466 eps_filter=almo_scf_env%eps_filter, &
1467 neg_thr=optimizer%neglect_threshold, &
1468 spin_factor=spin_factor, &
1469 skip_inversion=.false., &
1470 special_case=my_special_case)
1474 matrix_in=grad(ispin), &
1475 matrix_out=grad(ispin), &
1476 operator1=almo_scf_env%domain_s_inv(:, ispin), &
1477 operator2=bad_modes_projector_down(:, ispin), &
1478 dpattern=quench_t(ispin), &
1479 map=almo_scf_env%domain_map(ispin), &
1480 node_of_domain=almo_scf_env%cpu_of_domain, &
1482 filter_eps=almo_scf_env%eps_filter)
1489 DO ispin = 1, nspins
1490 CALL dbcsr_norm(grad(ispin), dbcsr_norm_maxabsnorm, &
1491 norm_scalar=grad_norm_spin(ispin))
1493 grad_norm = maxval(grad_norm_spin)
1495 converged = (grad_norm .LE. optimizer%eps_error)
1496 IF (converged .OR. (iteration .GE. max_iter))
THEN
1497 prepare_to_exit = .true.
1500 IF (optimizer%early_stopping_on .AND. just_started) &
1501 prepare_to_exit = .false.
1503 IF (grad_norm .LT. almo_scf_env%eps_prev_guess) &
1507 IF (.NOT. prepare_to_exit)
THEN
1512 IF (iteration .NE. 0)
THEN
1514 IF (fixed_line_search_niter .EQ. 0)
THEN
1518 IF (.NOT. line_search)
THEN
1520 line_search = .true.
1521 line_search_iteration = line_search_iteration + 1
1527 line_search_error = 0.0_dp
1531 DO ispin = 1, nspins
1533 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
1534 line_search_error = line_search_error + tempreal
1535 CALL dbcsr_dot(grad(ispin), grad(ispin), tempreal)
1536 denom = denom + tempreal
1537 CALL dbcsr_dot(step(ispin), step(ispin), tempreal)
1538 denom2 = denom2 + tempreal
1544 line_search_error = line_search_error/sqrt(denom)/sqrt(denom2)
1546 IF (abs(line_search_error) .GT. optimizer%lin_search_eps_error)
THEN
1547 line_search = .true.
1548 line_search_iteration = line_search_iteration + 1
1550 line_search = .false.
1551 line_search_iteration = 0
1552 IF (grad_norm .LT. eps_skip_gradients)
THEN
1553 fixed_line_search_niter = abs(almo_scf_env%integer04)
1561 IF (.NOT. line_search)
THEN
1562 line_search = .true.
1563 line_search_iteration = line_search_iteration + 1
1565 IF (line_search_iteration .EQ. fixed_line_search_niter)
THEN
1566 line_search = .false.
1567 line_search_iteration = 0
1568 line_search_iteration = line_search_iteration + 1
1576 IF (line_search)
THEN
1577 energy_diff = 0.0_dp
1579 energy_diff = energy_new - energy_old
1580 energy_old = energy_new
1584 IF (.NOT. line_search)
THEN
1590 cg_iteration = cg_iteration + 1
1593 DO ispin = 1, nspins
1594 CALL dbcsr_copy(prev_step(ispin), step(ispin))
1598 SELECT CASE (prec_type)
1602 CALL newton_grad_to_step( &
1603 optimizer=almo_scf_env%opt_xalmo_newton_pcg_solver, &
1606 m_s=almo_scf_env%matrix_s(:), &
1607 m_ks=almo_scf_env%matrix_ks(:), &
1608 m_siginv=almo_scf_env%matrix_sigma_inv(:), &
1609 m_quench_t=quench_t(:), &
1610 m_ftsiginv=ftsiginv(:), &
1611 m_siginvtftsiginv=siginvtftsiginv(:), &
1613 m_t=matrix_t_out(:), &
1614 m_sig_sqrti_ii=m_sig_sqrti_ii(:), &
1615 domain_s_inv=almo_scf_env%domain_s_inv(:, :), &
1616 domain_r_down=domain_r_down(:, :), &
1617 domain_map=almo_scf_env%domain_map(:), &
1618 cpu_of_domain=almo_scf_env%cpu_of_domain, &
1619 nocc_of_domain=almo_scf_env%nocc_of_domain(:, :), &
1620 para_env=almo_scf_env%para_env, &
1621 blacs_env=almo_scf_env%blacs_env, &
1622 eps_filter=almo_scf_env%eps_filter, &
1623 optimize_theta=optimize_theta, &
1624 penalty_occ_vol=penalty_occ_vol, &
1625 normalize_orbitals=normalize_orbitals, &
1626 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(:), &
1627 penalty_occ_vol_pf2=penalty_occ_vol_h_prefactor(:), &
1628 special_case=my_special_case &
1634 IF (.NOT. blissful_neglect .AND. &
1635 ((just_started .AND. perturbation_only) .OR. &
1636 (iteration .EQ. 0 .AND. (.NOT. perturbation_only))) &
1640 DO ispin = 1, nspins
1641 CALL compute_preconditioner( &
1642 domain_prec_out=almo_scf_env%domain_preconditioner(:, ispin), &
1643 m_prec_out=prec_vv(ispin), &
1644 m_ks=almo_scf_env%matrix_ks(ispin), &
1645 m_s=almo_scf_env%matrix_s(1), &
1646 m_siginv=almo_scf_env%matrix_sigma_inv(ispin), &
1647 m_quench_t=quench_t(ispin), &
1648 m_ftsiginv=ftsiginv(ispin), &
1649 m_siginvtftsiginv=siginvtftsiginv(ispin), &
1651 para_env=almo_scf_env%para_env, &
1652 blacs_env=almo_scf_env%blacs_env, &
1653 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
1654 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
1655 domain_r_down=domain_r_down(:, ispin), &
1656 cpu_of_domain=almo_scf_env%cpu_of_domain, &
1657 domain_map=almo_scf_env%domain_map(ispin), &
1658 assume_t0_q0x=assume_t0_q0x, &
1659 penalty_occ_vol=penalty_occ_vol, &
1660 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(ispin), &
1661 eps_filter=almo_scf_env%eps_filter, &
1663 spin_factor=spin_factor, &
1664 skip_inversion=.false., &
1665 special_case=my_special_case)
1676 DO ispin = 1, nspins
1678 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
1681 0.0_dp, step(ispin), &
1682 filter_eps=almo_scf_env%eps_filter)
1689 IF (optimize_theta)
THEN
1690 cpabort(
"theta is NYI")
1693 DO ispin = 1, nspins
1696 matrix_in=grad(ispin), &
1697 matrix_out=step(ispin), &
1698 operator1=almo_scf_env%domain_preconditioner(:, ispin), &
1699 dpattern=quench_t(ispin), &
1700 map=almo_scf_env%domain_map(ispin), &
1701 node_of_domain=almo_scf_env%cpu_of_domain, &
1703 filter_eps=almo_scf_env%eps_filter)
1704 CALL dbcsr_scale(step(ispin), -1.0_dp)
1726 DO ispin = 1, nspins
1728 CALL dbcsr_copy(step(ispin), grad(ispin))
1729 CALL dbcsr_scale(step(ispin), -1.0_dp)
1736 IF (iteration .EQ. 0)
THEN
1737 reset_conjugator = .true.
1741 IF (.NOT. reset_conjugator)
THEN
1743 CALL compute_cg_beta( &
1745 reset_conjugator=reset_conjugator, &
1746 conjugator=optimizer%conjugator, &
1748 prev_grad=prev_grad(:), &
1750 prev_step=prev_step(:), &
1751 prev_minus_prec_grad=prev_minus_prec_grad(:) &
1756 IF (reset_conjugator)
THEN
1759 IF (unit_nr > 0 .AND. (.NOT. just_started))
THEN
1760 WRITE (unit_nr,
'(T2,A35)')
"Re-setting conjugator to zero"
1762 reset_conjugator = .false.
1767 DO ispin = 1, nspins
1769 CALL dbcsr_copy(prev_minus_prec_grad(ispin), step(ispin))
1776 CALL dbcsr_add(step(ispin), prev_step(ispin), 1.0_dp, beta)
1783 IF (.NOT. line_search)
THEN
1789 DO ispin = 1, nspins
1790 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
1793 IF (iteration .EQ. 0)
THEN
1794 step_size = optimizer%lin_search_step_size_guess
1796 IF (next_step_size_guess .LE. 0.0_dp)
THEN
1797 step_size = optimizer%lin_search_step_size_guess
1800 step_size = next_step_size_guess*1.05_dp
1807 next_step_size_guess = step_size
1809 IF (fixed_line_search_niter .EQ. 0)
THEN
1812 DO ispin = 1, nspins
1813 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
1818 appr_sec_der = (g1 - g0)/step_size
1823 step_size = -g1/appr_sec_der
1831 appr_sec_der = 2.0*((e1 - e0)/step_size - g0)/step_size
1832 g1 = appr_sec_der*step_size + g0
1838 step_size = -g1/appr_sec_der
1842 next_step_size_guess = next_step_size_guess + step_size
1846 DO ispin = 1, nspins
1847 CALL dbcsr_add(m_theta(ispin), step(ispin), 1.0_dp, step_size)
1852 IF (line_search)
THEN
1859 IF (unit_nr > 0)
THEN
1860 iter_type = trim(
"ALMO SCF "//iter_type)
1861 WRITE (unit_nr,
'(T2,A13,I6,F23.10,E14.5,F14.9,F9.2)') &
1862 iter_type, iteration, &
1863 energy_new, energy_diff, grad_norm, &
1865 IF (penalty_occ_local .OR. penalty_occ_vol)
THEN
1866 WRITE (unit_nr,
'(T2,A25,F23.10)') &
1867 "Energy component:", (energy_new - penalty_func_new - localization_obj_function)
1869 IF (penalty_occ_local)
THEN
1870 WRITE (unit_nr,
'(T2,A25,F23.10)') &
1871 "Localization component:", localization_obj_function
1873 IF (penalty_occ_vol)
THEN
1874 WRITE (unit_nr,
'(T2,A25,F23.10)') &
1875 "Penalty component:", penalty_func_new
1880 IF (penalty_occ_vol)
THEN
1881 almo_scf_env%almo_scf_energy = energy_new - penalty_func_new - localization_obj_function
1883 almo_scf_env%almo_scf_energy = energy_new - localization_obj_function
1889 iteration = iteration + 1
1890 IF (prepare_to_exit)
EXIT
1894 IF (converged .OR. (outer_iteration .GE. outer_max_iter))
THEN
1895 outer_prepare_to_exit = .true.
1898 outer_iteration = outer_iteration + 1
1899 IF (outer_prepare_to_exit)
EXIT
1903 DO ispin = 1, nspins
1904 IF (converged .AND. almo_mathematica)
THEN
1905 IF (ispin .GT. 1) cpwarn(
"Mathematica files will be overwritten")
1906 CALL print_mathematica_matrix(matrix_t_out(ispin),
"matrixTf.dat")
1913 CALL wrap_up_xalmo_scf( &
1915 almo_scf_env=almo_scf_env, &
1916 perturbation_in=perturbation_only, &
1917 m_xalmo_in=matrix_t_out, &
1918 m_quench_in=quench_t, &
1919 energy_inout=energy_new)
1923 DO ispin = 1, nspins
1924 CALL dbcsr_release(prec_vv(ispin))
1925 CALL dbcsr_release(stsiginv_0(ispin))
1926 CALL dbcsr_release(st(ispin))
1927 CALL dbcsr_release(ftsiginv(ispin))
1928 CALL dbcsr_release(siginvtftsiginv(ispin))
1929 CALL dbcsr_release(prev_grad(ispin))
1930 CALL dbcsr_release(prev_step(ispin))
1931 CALL dbcsr_release(grad(ispin))
1932 CALL dbcsr_release(step(ispin))
1933 CALL dbcsr_release(prev_minus_prec_grad(ispin))
1934 CALL dbcsr_release(m_theta(ispin))
1935 CALL dbcsr_release(m_t_in_local(ispin))
1936 CALL dbcsr_release(m_sig_sqrti_ii(ispin))
1937 CALL release_submatrices(domain_r_down(:, ispin))
1938 CALL release_submatrices(bad_modes_projector_down(:, ispin))
1939 CALL dbcsr_release(tempnocc(ispin))
1940 CALL dbcsr_release(tempnocc_1(ispin))
1941 CALL dbcsr_release(tempoccocc(ispin))
1944 DEALLOCATE (tempnocc)
1945 DEALLOCATE (tempnocc_1)
1946 DEALLOCATE (tempoccocc)
1947 DEALLOCATE (prec_vv)
1948 DEALLOCATE (siginvtftsiginv)
1949 DEALLOCATE (stsiginv_0)
1950 DEALLOCATE (ftsiginv)
1952 DEALLOCATE (prev_grad)
1954 DEALLOCATE (prev_step)
1956 DEALLOCATE (prev_minus_prec_grad)
1957 DEALLOCATE (m_sig_sqrti_ii)
1959 DEALLOCATE (domain_r_down)
1960 DEALLOCATE (bad_modes_projector_down)
1962 DEALLOCATE (penalty_occ_vol_g_prefactor)
1963 DEALLOCATE (penalty_occ_vol_h_prefactor)
1964 DEALLOCATE (grad_norm_spin)
1967 DEALLOCATE (m_theta, m_t_in_local)
1968 IF (penalty_occ_local)
THEN
1969 DO idim0 = 1, dim_op
1970 DO reim = 1,
SIZE(op_sm_set_qs, 1)
1971 DEALLOCATE (op_sm_set_qs(reim, idim0)%matrix)
1972 DEALLOCATE (op_sm_set_almo(reim, idim0)%matrix)
1975 DEALLOCATE (op_sm_set_qs)
1976 DEALLOCATE (op_sm_set_almo)
1977 DEALLOCATE (weights)
1980 IF (.NOT. converged .AND. .NOT. optimizer%early_stopping_on)
THEN
1981 cpabort(
"Optimization not converged! ")
1984 CALL timestop(handle)
2005 matrix_s, matrix_mo_in, matrix_mo_out, &
2006 template_matrix_sigma, overlap_determinant, &
2007 mat_distr_aos, virtuals, eps_filter)
2008 TYPE(qs_environment_type),
POINTER :: qs_env
2009 TYPE(optimizer_options_type),
INTENT(INOUT) :: optimizer
2010 TYPE(dbcsr_type),
INTENT(IN) :: matrix_s
2011 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:), &
2012 INTENT(INOUT) :: matrix_mo_in, matrix_mo_out
2013 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:), &
2014 INTENT(IN) :: template_matrix_sigma
2015 REAL(kind=
dp),
INTENT(INOUT) :: overlap_determinant
2016 INTEGER,
INTENT(IN) :: mat_distr_aos
2017 LOGICAL,
INTENT(IN) :: virtuals
2018 REAL(kind=
dp),
INTENT(IN) :: eps_filter
2020 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_construct_nlmos'
2022 CHARACTER(LEN=30) :: iter_type, print_string
2023 INTEGER :: cg_iteration, dim_op, handle, iatom, idim0, isgf, ispin, iteration, &
2024 line_search_iteration, linear_search_type, max_iter, natom, ncol, nspins, &
2025 outer_iteration, outer_max_iter, para_group_handle, prec_type, reim, unit_nr
2026 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: first_sgf, last_sgf, nocc, nsgf
2027 LOGICAL :: converged, d_bfgs, just_started, l_bfgs, &
2028 line_search, outer_prepare_to_exit, &
2029 prepare_to_exit, reset_conjugator
2030 REAL(kind=
dp) :: appr_sec_der, beta, bfgs_rho, bfgs_sum, denom, denom2, e0, e1, g0, g0sign, &
2031 g1, g1sign, grad_norm, line_search_error, localization_obj_function, &
2032 localization_obj_function_ispin, next_step_size_guess, obj_function_ispin, objf_diff, &
2033 objf_new, objf_old, penalty_amplitude, penalty_func_ispin, penalty_func_new, spin_factor, &
2034 step_size, t1, t2, tempreal
2035 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: diagonal, grad_norm_spin, &
2036 penalty_vol_prefactor, &
2037 suggested_vol_penalty, weights
2038 TYPE(cell_type),
POINTER :: cell
2039 TYPE(cp_logger_type),
POINTER :: logger
2040 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: qs_matrix_s
2041 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: op_sm_set_almo, op_sm_set_qs
2042 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: approx_inv_hessian, bfgs_s, bfgs_y, grad, &
2043 m_s0, m_sig_sqrti_ii, m_siginv, m_sigma, m_t_mo_local, m_theta, m_theta_normalized, &
2044 prev_grad, prev_m_theta, prev_minus_prec_grad, prev_step, step, tempnocc1, tempoccocc1, &
2045 tempoccocc2, tempoccocc3
2046 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_b0
2047 TYPE(lbfgs_history_type) :: nlmo_lbfgs_history
2048 TYPE(mp_comm_type) :: para_group
2049 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
2050 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2052 CALL timeset(routinen, handle)
2056 IF (logger%para_env%is_source())
THEN
2062 nspins =
SIZE(matrix_mo_in)
2064 IF (unit_nr > 0)
THEN
2066 IF (.NOT. virtuals)
THEN
2067 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 24), &
2068 " Optimization of occupied NLMOs ", repeat(
"-", 23)
2070 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 24), &
2071 " Optimization of virtual NLMOs ", repeat(
"-", 24)
2074 WRITE (unit_nr,
'(T2,A13,A6,A23,A14,A14,A9)')
"Method",
"Iter", &
2075 "Objective Function",
"Change",
"Convergence",
"Time"
2076 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
2079 NULLIFY (particle_set)
2082 matrix_s=qs_matrix_s, &
2084 particle_set=particle_set, &
2085 qs_kind_set=qs_kind_set)
2087 natom =
SIZE(particle_set, 1)
2088 ALLOCATE (first_sgf(natom))
2089 ALLOCATE (last_sgf(natom))
2090 ALLOCATE (nsgf(natom))
2093 first_sgf=first_sgf, last_sgf=last_sgf, nsgf=nsgf)
2097 ALLOCATE (m_theta(nspins))
2098 DO ispin = 1, nspins
2099 CALL dbcsr_create(m_theta(ispin), &
2100 template=template_matrix_sigma(ispin), &
2101 matrix_type=dbcsr_type_no_symmetry)
2103 CALL dbcsr_set(m_theta(ispin), 0.0_dp)
2104 CALL dbcsr_add_on_diag(m_theta(ispin), 1.0_dp)
2107 SELECT CASE (optimizer%opt_penalty%operator_type)
2110 IF (cell%orthorhombic)
THEN
2115 ALLOCATE (weights(6))
2118 ALLOCATE (op_sm_set_qs(2, dim_op))
2119 ALLOCATE (op_sm_set_almo(2, dim_op))
2121 ALLOCATE (m_b0(2, dim_op, nspins))
2122 DO idim0 = 1, dim_op
2123 DO reim = 1,
SIZE(op_sm_set_qs, 1)
2124 NULLIFY (op_sm_set_qs(reim, idim0)%matrix, op_sm_set_almo(reim, idim0)%matrix)
2125 ALLOCATE (op_sm_set_qs(reim, idim0)%matrix)
2126 ALLOCATE (op_sm_set_almo(reim, idim0)%matrix)
2127 CALL dbcsr_copy(op_sm_set_qs(reim, idim0)%matrix, qs_matrix_s(1)%matrix, &
2128 name=
"almo_scf_env%op_sm_"//trim(adjustl(cp_to_string(reim)))//
"-"//trim(adjustl(cp_to_string(idim0))))
2129 CALL dbcsr_set(op_sm_set_qs(reim, idim0)%matrix, 0.0_dp)
2130 CALL dbcsr_copy(op_sm_set_almo(reim, idim0)%matrix, matrix_s, &
2131 name=
"almo_scf_env%op_sm_"//trim(adjustl(cp_to_string(reim)))//
"-"//trim(adjustl(cp_to_string(idim0))))
2132 CALL dbcsr_set(op_sm_set_almo(reim, idim0)%matrix, 0.0_dp)
2133 DO ispin = 1, nspins
2134 CALL dbcsr_create(m_b0(reim, idim0, ispin), &
2135 template=m_theta(ispin), &
2136 matrix_type=dbcsr_type_no_symmetry)
2137 CALL dbcsr_set(m_b0(reim, idim0, ispin), 0.0_dp)
2147 ALLOCATE (weights(dim_op))
2150 ALLOCATE (m_b0(1, dim_op, nspins))
2152 DO idim0 = 1, dim_op
2154 DO ispin = 1, nspins
2155 CALL dbcsr_create(m_b0(reim, idim0, ispin), &
2156 template=m_theta(ispin), &
2157 matrix_type=dbcsr_type_no_symmetry)
2158 CALL dbcsr_set(m_b0(reim, idim0, ispin), 0.0_dp)
2166 penalty_amplitude = optimizer%opt_penalty%penalty_strength
2171 prec_type = optimizer%preconditioner
2177 IF (l_bfgs .AND. (optimizer%conjugator .NE.
cg_zero))
THEN
2178 cpabort(
"Cannot use conjugators with BFGS")
2181 CALL lbfgs_create(nlmo_lbfgs_history, nspins, nstore=10)
2184 IF (nspins == 1)
THEN
2185 spin_factor = 2.0_dp
2187 spin_factor = 1.0_dp
2190 ALLOCATE (grad_norm_spin(nspins))
2191 ALLOCATE (nocc(nspins))
2192 ALLOCATE (penalty_vol_prefactor(nspins))
2193 ALLOCATE (suggested_vol_penalty(nspins))
2199 ALLOCATE (m_t_mo_local(nspins))
2200 DO ispin = 1, nspins
2201 CALL dbcsr_create(m_t_mo_local(ispin), &
2202 template=matrix_mo_in(ispin), &
2203 matrix_type=dbcsr_type_no_symmetry)
2204 CALL dbcsr_copy(m_t_mo_local(ispin), matrix_mo_in(ispin))
2207 ALLOCATE (approx_inv_hessian(nspins))
2208 ALLOCATE (m_theta_normalized(nspins))
2209 ALLOCATE (prev_m_theta(nspins))
2210 ALLOCATE (m_s0(nspins))
2211 ALLOCATE (prev_grad(nspins))
2212 ALLOCATE (grad(nspins))
2213 ALLOCATE (prev_step(nspins))
2214 ALLOCATE (step(nspins))
2215 ALLOCATE (prev_minus_prec_grad(nspins))
2216 ALLOCATE (m_sig_sqrti_ii(nspins))
2217 ALLOCATE (m_sigma(nspins))
2218 ALLOCATE (m_siginv(nspins))
2219 ALLOCATE (tempnocc1(nspins))
2220 ALLOCATE (tempoccocc1(nspins))
2221 ALLOCATE (tempoccocc2(nspins))
2222 ALLOCATE (tempoccocc3(nspins))
2223 ALLOCATE (bfgs_y(nspins))
2224 ALLOCATE (bfgs_s(nspins))
2226 DO ispin = 1, nspins
2229 CALL dbcsr_create(tempnocc1(ispin), &
2230 template=matrix_mo_out(ispin), &
2231 matrix_type=dbcsr_type_no_symmetry)
2232 CALL dbcsr_create(approx_inv_hessian(ispin), &
2233 template=m_theta(ispin), &
2234 matrix_type=dbcsr_type_no_symmetry)
2235 CALL dbcsr_create(m_theta_normalized(ispin), &
2236 template=m_theta(ispin), &
2237 matrix_type=dbcsr_type_no_symmetry)
2238 CALL dbcsr_create(prev_m_theta(ispin), &
2239 template=m_theta(ispin), &
2240 matrix_type=dbcsr_type_no_symmetry)
2241 CALL dbcsr_create(m_s0(ispin), &
2242 template=m_theta(ispin), &
2243 matrix_type=dbcsr_type_no_symmetry)
2244 CALL dbcsr_create(prev_grad(ispin), &
2245 template=m_theta(ispin), &
2246 matrix_type=dbcsr_type_no_symmetry)
2247 CALL dbcsr_create(grad(ispin), &
2248 template=m_theta(ispin), &
2249 matrix_type=dbcsr_type_no_symmetry)
2250 CALL dbcsr_create(prev_step(ispin), &
2251 template=m_theta(ispin), &
2252 matrix_type=dbcsr_type_no_symmetry)
2253 CALL dbcsr_create(step(ispin), &
2254 template=m_theta(ispin), &
2255 matrix_type=dbcsr_type_no_symmetry)
2256 CALL dbcsr_create(prev_minus_prec_grad(ispin), &
2257 template=m_theta(ispin), &
2258 matrix_type=dbcsr_type_no_symmetry)
2259 CALL dbcsr_create(m_sig_sqrti_ii(ispin), &
2260 template=m_theta(ispin), &
2261 matrix_type=dbcsr_type_no_symmetry)
2262 CALL dbcsr_create(m_sigma(ispin), &
2263 template=m_theta(ispin), &
2264 matrix_type=dbcsr_type_no_symmetry)
2265 CALL dbcsr_create(m_siginv(ispin), &
2266 template=m_theta(ispin), &
2267 matrix_type=dbcsr_type_no_symmetry)
2268 CALL dbcsr_create(tempoccocc1(ispin), &
2269 template=m_theta(ispin), &
2270 matrix_type=dbcsr_type_no_symmetry)
2271 CALL dbcsr_create(tempoccocc2(ispin), &
2272 template=m_theta(ispin), &
2273 matrix_type=dbcsr_type_no_symmetry)
2274 CALL dbcsr_create(tempoccocc3(ispin), &
2275 template=m_theta(ispin), &
2276 matrix_type=dbcsr_type_no_symmetry)
2277 CALL dbcsr_create(bfgs_s(ispin), &
2278 template=m_theta(ispin), &
2279 matrix_type=dbcsr_type_no_symmetry)
2280 CALL dbcsr_create(bfgs_y(ispin), &
2281 template=m_theta(ispin), &
2282 matrix_type=dbcsr_type_no_symmetry)
2284 CALL dbcsr_set(step(ispin), 0.0_dp)
2285 CALL dbcsr_set(prev_step(ispin), 0.0_dp)
2287 CALL dbcsr_get_info(template_matrix_sigma(ispin), &
2288 nfullrows_total=nocc(ispin))
2290 penalty_vol_prefactor(ispin) = -penalty_amplitude
2293 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2295 m_t_mo_local(ispin), &
2296 0.0_dp, tempnocc1(ispin), &
2297 filter_eps=eps_filter)
2298 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
2299 m_t_mo_local(ispin), &
2301 0.0_dp, m_s0(ispin), &
2302 filter_eps=eps_filter)
2304 SELECT CASE (optimizer%opt_penalty%operator_type)
2309 DO idim0 = 1,
SIZE(op_sm_set_qs, 2)
2311 DO reim = 1,
SIZE(op_sm_set_qs, 1)
2313 CALL matrix_qs_to_almo(op_sm_set_qs(reim, idim0)%matrix, op_sm_set_almo(reim, idim0)%matrix, &
2314 mat_distr_aos, .false.)
2316 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2317 op_sm_set_almo(reim, idim0)%matrix, &
2318 m_t_mo_local(ispin), &
2319 0.0_dp, tempnocc1(ispin), &
2320 filter_eps=eps_filter)
2322 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
2323 m_t_mo_local(ispin), &
2325 0.0_dp, m_b0(reim, idim0, ispin), &
2326 filter_eps=eps_filter)
2328 DEALLOCATE (op_sm_set_qs(reim, idim0)%matrix)
2329 DEALLOCATE (op_sm_set_almo(reim, idim0)%matrix)
2340 isgf = first_sgf(iatom)
2343 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2345 m_t_mo_local(ispin), &
2346 0.0_dp, tempnocc1(ispin), &
2347 filter_eps=eps_filter)
2349 CALL dbcsr_multiply(
"T",
"N", 0.5_dp, &
2350 m_t_mo_local(ispin), &
2352 0.0_dp, m_b0(1, iatom, ispin), &
2353 first_k=isgf, last_k=isgf + ncol - 1, &
2354 filter_eps=eps_filter)
2356 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2358 m_t_mo_local(ispin), &
2359 0.0_dp, tempnocc1(ispin), &
2360 first_k=isgf, last_k=isgf + ncol - 1, &
2361 filter_eps=eps_filter)
2363 CALL dbcsr_multiply(
"T",
"N", 0.5_dp, &
2364 m_t_mo_local(ispin), &
2366 1.0_dp, m_b0(1, iatom, ispin), &
2367 filter_eps=eps_filter)
2375 IF (optimizer%opt_penalty%operator_type .EQ.
op_loc_berry)
THEN
2376 DO idim0 = 1,
SIZE(op_sm_set_qs, 2)
2377 DO reim = 1,
SIZE(op_sm_set_qs, 1)
2378 DEALLOCATE (op_sm_set_qs(reim, idim0)%matrix)
2379 DEALLOCATE (op_sm_set_almo(reim, idim0)%matrix)
2382 DEALLOCATE (op_sm_set_qs, op_sm_set_almo)
2386 outer_max_iter = optimizer%max_iter_outer_loop
2387 outer_prepare_to_exit = .false.
2390 penalty_func_new = 0.0_dp
2391 linear_search_type = 1
2392 localization_obj_function = 0.0_dp
2393 penalty_func_new = 0.0_dp
2398 max_iter = optimizer%max_iter
2399 prepare_to_exit = .false.
2400 line_search = .false.
2404 line_search_iteration = 0
2405 obj_function_ispin = 0.0_dp
2409 line_search_error = 0.0_dp
2411 next_step_size_guess = 0.0_dp
2415 just_started = (iteration .EQ. 0) .AND. (outer_iteration .EQ. 0)
2417 DO ispin = 1, nspins
2419 CALL dbcsr_get_info(m_sig_sqrti_ii(ispin), group=para_group_handle)
2420 CALL para_group%set_handle(para_group_handle)
2423 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2424 m_s0(ispin), m_theta(ispin), 0.0_dp, &
2425 tempoccocc1(ispin), &
2426 filter_eps=eps_filter)
2427 CALL dbcsr_set(m_sig_sqrti_ii(ispin), 0.0_dp)
2428 CALL dbcsr_add_on_diag(m_sig_sqrti_ii(ispin), 1.0_dp)
2429 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
2430 m_theta(ispin), tempoccocc1(ispin), 0.0_dp, &
2431 m_sig_sqrti_ii(ispin), &
2432 retain_sparsity=.true.)
2433 ALLOCATE (diagonal(nocc(ispin)))
2434 CALL dbcsr_get_diag(m_sig_sqrti_ii(ispin), diagonal)
2435 CALL para_group%sum(diagonal)
2437 diagonal(:) = 1.0_dp/sqrt(diagonal(:))
2438 CALL dbcsr_set(m_sig_sqrti_ii(ispin), 0.0_dp)
2439 CALL dbcsr_set_diag(m_sig_sqrti_ii(ispin), diagonal)
2440 DEALLOCATE (diagonal)
2442 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2444 m_sig_sqrti_ii(ispin), &
2445 0.0_dp, m_theta_normalized(ispin), &
2446 filter_eps=eps_filter)
2449 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
2450 m_t_mo_local(ispin), &
2451 m_theta_normalized(ispin), &
2452 0.0_dp, matrix_mo_out(ispin), &
2453 filter_eps=eps_filter)
2458 localization_obj_function = 0.0_dp
2459 penalty_func_new = 0.0_dp
2460 DO ispin = 1, nspins
2462 CALL compute_obj_nlmos( &
2464 localization_obj_function_ispin=localization_obj_function_ispin, &
2465 penalty_func_ispin=penalty_func_ispin, &
2466 overlap_determinant=overlap_determinant, &
2467 m_sigma=m_sigma(ispin), &
2469 m_b0=m_b0(:, :, ispin), &
2470 m_theta_normalized=m_theta_normalized(ispin), &
2471 template_matrix_mo=matrix_mo_out(ispin), &
2474 just_started=just_started, &
2475 penalty_vol_prefactor=penalty_vol_prefactor(ispin), &
2476 penalty_amplitude=penalty_amplitude, &
2477 eps_filter=eps_filter)
2479 localization_obj_function = localization_obj_function + localization_obj_function_ispin
2480 penalty_func_new = penalty_func_new + penalty_func_ispin
2483 objf_new = penalty_func_new + localization_obj_function
2485 DO ispin = 1, nspins
2489 IF (line_search_iteration .EQ. 0 .AND. iteration .NE. 0)
THEN
2490 CALL dbcsr_copy(prev_grad(ispin), grad(ispin))
2496 DO ispin = 1, nspins
2499 matrix_inverse=m_siginv(ispin), &
2500 matrix=m_sigma(ispin), &
2501 threshold=eps_filter*10.0_dp, &
2502 filter_eps=eps_filter, &
2505 CALL compute_gradient_nlmos( &
2506 m_grad_out=grad(ispin), &
2507 m_b0=m_b0(:, :, ispin), &
2510 m_theta_normalized=m_theta_normalized(ispin), &
2511 m_siginv=m_siginv(ispin), &
2512 m_sig_sqrti_ii=m_sig_sqrti_ii(ispin), &
2513 penalty_vol_prefactor=penalty_vol_prefactor(ispin), &
2514 eps_filter=eps_filter, &
2515 suggested_vol_penalty=suggested_vol_penalty(ispin))
2520 DO ispin = 1, nspins
2521 CALL dbcsr_norm(grad(ispin), dbcsr_norm_maxabsnorm, &
2522 norm_scalar=grad_norm_spin(ispin))
2524 grad_norm = maxval(grad_norm_spin)
2526 converged = (grad_norm .LE. optimizer%eps_error)
2527 IF (converged .OR. (iteration .GE. max_iter))
THEN
2528 prepare_to_exit = .true.
2532 IF (.NOT. prepare_to_exit)
THEN
2537 IF (iteration .NE. 0)
THEN
2541 IF (.NOT. line_search)
THEN
2543 line_search = .true.
2544 line_search_iteration = line_search_iteration + 1
2550 line_search_error = 0.0_dp
2554 DO ispin = 1, nspins
2556 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
2557 line_search_error = line_search_error + tempreal
2558 CALL dbcsr_dot(grad(ispin), grad(ispin), tempreal)
2559 denom = denom + tempreal
2560 CALL dbcsr_dot(step(ispin), step(ispin), tempreal)
2561 denom2 = denom2 + tempreal
2567 line_search_error = line_search_error/sqrt(denom)/sqrt(denom2)
2569 IF (abs(line_search_error) .GT. optimizer%lin_search_eps_error)
THEN
2570 line_search = .true.
2571 line_search_iteration = line_search_iteration + 1
2573 line_search = .false.
2574 line_search_iteration = 0
2581 IF (line_search)
THEN
2584 objf_diff = objf_new - objf_old
2589 IF (.NOT. line_search)
THEN
2591 cg_iteration = cg_iteration + 1
2594 DO ispin = 1, nspins
2595 CALL dbcsr_copy(prev_step(ispin), step(ispin))
2603 DO ispin = 1, nspins
2605 CALL dbcsr_copy(step(ispin), grad(ispin))
2606 CALL dbcsr_scale(step(ispin), -1.0_dp)
2613 IF (iteration .EQ. 0)
THEN
2619 IF (nspins .GT. 1)
THEN
2620 DO ispin = 2, nspins
2621 CALL dbcsr_copy(approx_inv_hessian(ispin), approx_inv_hessian(1))
2625 ELSE IF (l_bfgs)
THEN
2627 CALL lbfgs_seed(nlmo_lbfgs_history, m_theta, grad)
2628 DO ispin = 1, nspins
2629 CALL dbcsr_copy(step(ispin), grad(ispin))
2630 CALL dbcsr_scale(step(ispin), -1.0_dp)
2636 DO ispin = 1, nspins
2674 DO ispin = 1, nspins
2677 CALL dbcsr_copy(bfgs_y(ispin), grad(ispin))
2678 CALL dbcsr_add(bfgs_y(ispin), prev_grad(ispin), 1.0_dp, -1.0_dp)
2679 CALL dbcsr_copy(bfgs_s(ispin), m_theta(ispin))
2680 CALL dbcsr_add(bfgs_s(ispin), prev_m_theta(ispin), 1.0_dp, -1.0_dp)
2683 CALL dbcsr_dot(grad(ispin), step(ispin), bfgs_rho)
2684 bfgs_rho = 1.0_dp/bfgs_rho
2687 CALL dbcsr_dot(bfgs_y(ispin), bfgs_y(ispin), bfgs_sum)
2690 CALL dbcsr_copy(tempoccocc2(ispin), approx_inv_hessian(ispin))
2693 CALL dbcsr_hadamard_product(bfgs_s(ispin), bfgs_s(ispin), tempoccocc1(ispin))
2694 CALL dbcsr_add(tempoccocc2(ispin), tempoccocc1(ispin), 1.0_dp, bfgs_rho)
2697 CALL dbcsr_hadamard_product(tempoccocc1(ispin), &
2698 approx_inv_hessian(ispin), tempoccocc3(ispin))
2699 CALL dbcsr_add(tempoccocc2(ispin), tempoccocc3(ispin), &
2700 1.0_dp, bfgs_rho*bfgs_rho*bfgs_sum)
2703 CALL dbcsr_hadamard_product(bfgs_y(ispin), &
2704 approx_inv_hessian(ispin), tempoccocc1(ispin))
2705 CALL dbcsr_hadamard_product(bfgs_s(ispin), tempoccocc1(ispin), tempoccocc3(ispin))
2706 CALL dbcsr_add(tempoccocc2(ispin), tempoccocc3(ispin), &
2707 1.0_dp, -2.0_dp*bfgs_rho)
2709 CALL dbcsr_copy(approx_inv_hessian(ispin), tempoccocc2(ispin))
2713 ELSE IF (l_bfgs)
THEN
2721 IF (.NOT. l_bfgs)
THEN
2723 DO ispin = 1, nspins
2725 CALL dbcsr_hadamard_product(approx_inv_hessian(ispin), &
2726 grad(ispin), step(ispin))
2727 CALL dbcsr_scale(step(ispin), -1.0_dp)
2736 IF (iteration .EQ. 0)
THEN
2737 reset_conjugator = .true.
2741 IF (.NOT. reset_conjugator)
THEN
2742 CALL compute_cg_beta( &
2744 reset_conjugator=reset_conjugator, &
2745 conjugator=optimizer%conjugator, &
2747 prev_grad=prev_grad(:), &
2749 prev_step=prev_step(:), &
2750 prev_minus_prec_grad=prev_minus_prec_grad(:) &
2755 IF (reset_conjugator)
THEN
2758 IF (unit_nr > 0 .AND. (.NOT. just_started))
THEN
2759 WRITE (unit_nr,
'(T2,A35)')
"Re-setting conjugator to zero"
2761 reset_conjugator = .false.
2766 DO ispin = 1, nspins
2768 CALL dbcsr_copy(prev_minus_prec_grad(ispin), step(ispin))
2771 CALL dbcsr_add(step(ispin), prev_step(ispin), 1.0_dp, beta)
2778 IF (.NOT. line_search)
THEN
2784 DO ispin = 1, nspins
2785 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
2788 g0sign = sign(1.0_dp, g0)
2789 IF (linear_search_type .EQ. 1)
THEN
2790 IF (iteration .EQ. 0)
THEN
2791 step_size = optimizer%lin_search_step_size_guess
2793 IF (next_step_size_guess .LE. 0.0_dp)
THEN
2794 step_size = optimizer%lin_search_step_size_guess
2797 step_size = optimizer%lin_search_step_size_guess
2801 ELSE IF (linear_search_type .EQ. 2)
THEN
2804 step_size = optimizer%lin_search_step_size_guess
2806 IF (unit_nr > 0)
THEN
2807 WRITE (unit_nr,
'(T21,3A19)')
"Line position",
"Line grad",
"Next line step"
2808 WRITE (unit_nr,
'(T2,A19,3F19.5)')
"Line search", 0.0_dp, g0, step_size
2810 next_step_size_guess = step_size
2814 DO ispin = 1, nspins
2815 CALL dbcsr_dot(grad(ispin), step(ispin), tempreal)
2818 g1sign = sign(1.0_dp, g1)
2819 IF (linear_search_type .EQ. 1)
THEN
2822 appr_sec_der = (g1 - g0)/step_size
2827 step_size = -g1/appr_sec_der
2828 ELSE IF (linear_search_type .EQ. 2)
THEN
2831 IF (g1sign .NE. g0sign)
THEN
2832 step_size = -step_size/2.0;
2834 step_size = step_size*1.5;
2838 IF (unit_nr > 0)
THEN
2839 WRITE (unit_nr,
'(T21,3A19)')
"Line position",
"Line grad",
"Next line step"
2840 WRITE (unit_nr,
'(T2,A19,3F19.5)')
"Line search", next_step_size_guess, g1, step_size
2845 next_step_size_guess = next_step_size_guess + step_size
2849 DO ispin = 1, nspins
2850 IF (.NOT. line_search)
THEN
2852 CALL dbcsr_copy(prev_m_theta(ispin), m_theta(ispin))
2854 CALL dbcsr_add(m_theta(ispin), step(ispin), 1.0_dp, step_size)
2859 IF (line_search)
THEN
2866 IF (unit_nr > 0)
THEN
2867 iter_type = trim(
"NLMO OPT "//iter_type)
2868 WRITE (unit_nr,
'(T2,A13,I6,F23.10,E14.5,F14.9,F9.2)') &
2869 iter_type, iteration, &
2870 objf_new, objf_diff, grad_norm, &
2872 WRITE (unit_nr,
'(T2,A19,F23.10)') &
2873 "Localization:", localization_obj_function
2874 WRITE (unit_nr,
'(T2,A19,F23.10)') &
2875 "Orthogonalization:", penalty_func_new
2879 iteration = iteration + 1
2880 IF (prepare_to_exit)
EXIT
2884 IF (converged .OR. (outer_iteration .GE. outer_max_iter))
THEN
2885 outer_prepare_to_exit = .true.
2888 outer_iteration = outer_iteration + 1
2889 IF (outer_prepare_to_exit)
EXIT
2894 optimizer%opt_penalty%penalty_strength = 0.0_dp
2895 DO ispin = 1, nspins
2896 optimizer%opt_penalty%penalty_strength = optimizer%opt_penalty%penalty_strength + &
2897 (-1.0_dp)*penalty_vol_prefactor(ispin)
2899 optimizer%opt_penalty%penalty_strength = optimizer%opt_penalty%penalty_strength/nspins
2904 iter_type =
"Unconverged"
2907 IF (unit_nr > 0)
THEN
2908 WRITE (unit_nr,
'()')
2909 print_string = trim(iter_type)//
" localization:"
2910 WRITE (unit_nr,
'(T2,A29,F30.10)') &
2911 print_string, localization_obj_function
2912 print_string = trim(iter_type)//
" determinant:"
2913 WRITE (unit_nr,
'(T2,A29,F30.10)') &
2914 print_string, overlap_determinant
2915 print_string = trim(iter_type)//
" penalty strength:"
2916 WRITE (unit_nr,
'(T2,A29,F30.10)') &
2917 print_string, optimizer%opt_penalty%penalty_strength
2924 DO ispin = 1, nspins
2925 DO idim0 = 1,
SIZE(m_b0, 2)
2926 DO reim = 1,
SIZE(m_b0, 1)
2927 CALL dbcsr_release(m_b0(reim, idim0, ispin))
2930 CALL dbcsr_release(m_theta(ispin))
2931 CALL dbcsr_release(m_t_mo_local(ispin))
2932 CALL dbcsr_release(tempnocc1(ispin))
2933 CALL dbcsr_release(approx_inv_hessian(ispin))
2934 CALL dbcsr_release(prev_m_theta(ispin))
2935 CALL dbcsr_release(m_theta_normalized(ispin))
2936 CALL dbcsr_release(m_s0(ispin))
2937 CALL dbcsr_release(prev_grad(ispin))
2938 CALL dbcsr_release(grad(ispin))
2939 CALL dbcsr_release(prev_step(ispin))
2940 CALL dbcsr_release(step(ispin))
2941 CALL dbcsr_release(prev_minus_prec_grad(ispin))
2942 CALL dbcsr_release(m_sig_sqrti_ii(ispin))
2943 CALL dbcsr_release(m_sigma(ispin))
2944 CALL dbcsr_release(m_siginv(ispin))
2945 CALL dbcsr_release(tempoccocc1(ispin))
2946 CALL dbcsr_release(tempoccocc2(ispin))
2947 CALL dbcsr_release(tempoccocc3(ispin))
2948 CALL dbcsr_release(bfgs_y(ispin))
2949 CALL dbcsr_release(bfgs_s(ispin))
2952 DEALLOCATE (grad_norm_spin)
2954 DEALLOCATE (penalty_vol_prefactor)
2955 DEALLOCATE (suggested_vol_penalty)
2957 DEALLOCATE (approx_inv_hessian)
2958 DEALLOCATE (prev_m_theta)
2959 DEALLOCATE (m_theta_normalized)
2961 DEALLOCATE (prev_grad)
2963 DEALLOCATE (prev_step)
2965 DEALLOCATE (prev_minus_prec_grad)
2966 DEALLOCATE (m_sig_sqrti_ii)
2967 DEALLOCATE (m_sigma)
2968 DEALLOCATE (m_siginv)
2969 DEALLOCATE (tempnocc1)
2970 DEALLOCATE (tempoccocc1)
2971 DEALLOCATE (tempoccocc2)
2972 DEALLOCATE (tempoccocc3)
2976 DEALLOCATE (m_theta, m_t_mo_local)
2978 DEALLOCATE (weights)
2979 DEALLOCATE (first_sgf, last_sgf, nsgf)
2981 IF (.NOT. converged)
THEN
2982 cpabort(
"Optimization not converged! ")
2985 CALL timestop(handle)
3007 SUBROUTINE xalmo_analysis(detailed_analysis, eps_filter, m_T_in, m_T0_in, &
3008 m_siginv_in, m_siginv0_in, m_S_in, m_KS0_in, m_quench_t_in, energy_out, &
3009 m_eda_out, m_cta_out)
3011 LOGICAL,
INTENT(IN) :: detailed_analysis
3012 REAL(kind=
dp),
INTENT(IN) :: eps_filter
3013 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_t_in, m_t0_in, m_siginv_in, &
3014 m_siginv0_in, m_s_in, m_ks0_in, &
3016 REAL(kind=
dp),
INTENT(INOUT) :: energy_out
3017 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_eda_out, m_cta_out
3019 CHARACTER(len=*),
PARAMETER :: routinen =
'xalmo_analysis'
3021 INTEGER :: handle, ispin, nspins
3022 REAL(kind=
dp) :: energy_ispin, spin_factor
3023 TYPE(dbcsr_type) :: ftsiginv0, fvo0, m_x, siginvtftsiginv0, &
3026 CALL timeset(routinen, handle)
3028 nspins =
SIZE(m_t_in)
3030 IF (nspins == 1)
THEN
3031 spin_factor = 2.0_dp
3033 spin_factor = 1.0_dp
3037 DO ispin = 1, nspins
3040 CALL dbcsr_create(fvo0, &
3041 template=m_t_in(ispin), &
3042 matrix_type=dbcsr_type_no_symmetry)
3043 CALL dbcsr_create(ftsiginv0, &
3044 template=m_t_in(ispin), &
3045 matrix_type=dbcsr_type_no_symmetry)
3046 CALL dbcsr_create(st0, &
3047 template=m_t_in(ispin), &
3048 matrix_type=dbcsr_type_no_symmetry)
3049 CALL dbcsr_create(m_x, &
3050 template=m_t_in(ispin), &
3051 matrix_type=dbcsr_type_no_symmetry)
3052 CALL dbcsr_create(siginvtftsiginv0, &
3053 template=m_siginv0_in(ispin), &
3054 matrix_type=dbcsr_type_no_symmetry)
3057 CALL compute_frequently_used_matrices( &
3058 filter_eps=eps_filter, &
3059 m_t_in=m_t0_in(ispin), &
3060 m_siginv_in=m_siginv0_in(ispin), &
3062 m_f_in=m_ks0_in(ispin), &
3063 m_ftsiginv_out=ftsiginv0, &
3064 m_siginvtftsiginv_out=siginvtftsiginv0, &
3066 CALL dbcsr_copy(fvo0, m_quench_t_in(ispin))
3067 CALL dbcsr_copy(fvo0, ftsiginv0, keep_sparsity=.true.)
3068 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
3072 retain_sparsity=.true.)
3075 CALL dbcsr_copy(m_x, m_t0_in(ispin))
3076 CALL dbcsr_add(m_x, m_t_in(ispin), -1.0_dp, 1.0_dp)
3078 CALL dbcsr_dot(m_x, fvo0, energy_ispin)
3079 energy_out = energy_out + energy_ispin*spin_factor
3081 IF (detailed_analysis)
THEN
3083 CALL dbcsr_hadamard_product(m_x, fvo0, m_eda_out(ispin))
3084 CALL dbcsr_scale(m_eda_out(ispin), spin_factor)
3085 CALL dbcsr_filter(m_eda_out(ispin), eps_filter)
3089 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3091 m_siginv0_in(ispin), &
3092 0.0_dp, ftsiginv0, &
3093 filter_eps=eps_filter)
3095 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3099 filter_eps=eps_filter)
3101 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
3104 0.0_dp, siginvtftsiginv0, &
3105 filter_eps=eps_filter)
3108 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
3112 filter_eps=eps_filter)
3114 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3116 m_siginv_in(ispin), &
3117 0.0_dp, ftsiginv0, &
3118 filter_eps=eps_filter)
3120 CALL dbcsr_hadamard_product(m_x, &
3121 ftsiginv0, m_cta_out(ispin))
3122 CALL dbcsr_scale(m_cta_out(ispin), spin_factor)
3123 CALL dbcsr_filter(m_cta_out(ispin), eps_filter)
3127 CALL dbcsr_release(fvo0)
3128 CALL dbcsr_release(ftsiginv0)
3129 CALL dbcsr_release(st0)
3130 CALL dbcsr_release(m_x)
3131 CALL dbcsr_release(siginvtftsiginv0)
3135 CALL timestop(handle)
3137 END SUBROUTINE xalmo_analysis
3154 SUBROUTINE compute_frequently_used_matrices(filter_eps, &
3155 m_T_in, m_siginv_in, m_S_in, m_F_in, m_FTsiginv_out, &
3156 m_siginvTFTsiginv_out, m_ST_out)
3158 REAL(kind=
dp),
INTENT(IN) :: filter_eps
3159 TYPE(dbcsr_type),
INTENT(IN) :: m_t_in, m_siginv_in, m_s_in, m_f_in
3160 TYPE(dbcsr_type),
INTENT(INOUT) :: m_ftsiginv_out, m_siginvtftsiginv_out, &
3163 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_frequently_used_matrices'
3166 TYPE(dbcsr_type) :: m_tmp_no_1, m_tmp_oo_1
3168 CALL timeset(routinen, handle)
3170 CALL dbcsr_create(m_tmp_no_1, &
3172 matrix_type=dbcsr_type_no_symmetry)
3173 CALL dbcsr_create(m_tmp_oo_1, &
3174 template=m_siginv_in, &
3175 matrix_type=dbcsr_type_no_symmetry)
3177 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3180 0.0_dp, m_tmp_no_1, &
3181 filter_eps=filter_eps)
3183 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3186 0.0_dp, m_ftsiginv_out, &
3187 filter_eps=filter_eps)
3189 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
3192 0.0_dp, m_tmp_oo_1, &
3193 filter_eps=filter_eps)
3195 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3198 0.0_dp, m_siginvtftsiginv_out, &
3199 filter_eps=filter_eps)
3201 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3205 filter_eps=filter_eps)
3207 CALL dbcsr_release(m_tmp_no_1)
3208 CALL dbcsr_release(m_tmp_oo_1)
3210 CALL timestop(handle)
3212 END SUBROUTINE compute_frequently_used_matrices
3222 SUBROUTINE split_v_blk(almo_scf_env)
3224 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
3226 CHARACTER(len=*),
PARAMETER :: routinen =
'split_v_blk'
3228 INTEGER :: discarded_v, handle, iblock_col, &
3229 iblock_col_size, iblock_row, &
3230 iblock_row_size, ispin, retained_v
3231 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_p, p_new_block
3232 TYPE(dbcsr_iterator_type) :: iter
3234 CALL timeset(routinen, handle)
3236 DO ispin = 1, almo_scf_env%nspins
3238 CALL dbcsr_work_create(almo_scf_env%matrix_v_blk(ispin), &
3239 work_mutable=.true.)
3240 CALL dbcsr_work_create(almo_scf_env%matrix_v_disc_blk(ispin), &
3241 work_mutable=.true.)
3243 CALL dbcsr_iterator_start(iter, almo_scf_env%matrix_v_full_blk(ispin))
3245 DO WHILE (dbcsr_iterator_blocks_left(iter))
3247 CALL dbcsr_iterator_next_block(iter, iblock_row, iblock_col, data_p, &
3248 row_size=iblock_row_size, col_size=iblock_col_size)
3250 IF (iblock_row .NE. iblock_col)
THEN
3251 cpabort(
"off-diagonal block found")
3254 retained_v = almo_scf_env%nvirt_of_domain(iblock_col, ispin)
3255 discarded_v = almo_scf_env%nvirt_disc_of_domain(iblock_col, ispin)
3256 cpassert(retained_v .GT. 0)
3257 cpassert(discarded_v .GT. 0)
3259 NULLIFY (p_new_block)
3260 CALL dbcsr_reserve_block2d(almo_scf_env%matrix_v_disc_blk(ispin), &
3261 iblock_row, iblock_col, p_new_block)
3262 cpassert(
ASSOCIATED(p_new_block))
3263 cpassert(retained_v + discarded_v .EQ. iblock_col_size)
3264 p_new_block(:, :) = data_p(:, (retained_v + 1):iblock_col_size)
3266 NULLIFY (p_new_block)
3267 CALL dbcsr_reserve_block2d(almo_scf_env%matrix_v_blk(ispin), &
3268 iblock_row, iblock_col, p_new_block)
3269 cpassert(
ASSOCIATED(p_new_block))
3270 p_new_block(:, :) = data_p(:, 1:retained_v)
3273 CALL dbcsr_iterator_stop(iter)
3275 CALL dbcsr_finalize(almo_scf_env%matrix_v_blk(ispin))
3276 CALL dbcsr_finalize(almo_scf_env%matrix_v_disc_blk(ispin))
3280 CALL timestop(handle)
3282 END SUBROUTINE split_v_blk
3291 SUBROUTINE harris_foulkes_correction(almo_scf_env)
3293 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
3295 CHARACTER(len=*),
PARAMETER :: routinen =
'harris_foulkes_correction'
3296 INTEGER,
PARAMETER :: cayley_transform = 1, dm_ls_step = 2
3298 INTEGER :: algorithm_id, handle, handle1, handle2, handle3, handle4, handle5, handle6, &
3299 handle7, handle8, ispin, iteration, n, nmins, nspin, opt_k_max_iter, &
3300 outer_opt_k_iteration, outer_opt_k_max_iter, unit_nr
3301 INTEGER,
DIMENSION(1) :: fake, nelectron_spin_real
3302 LOGICAL :: converged, line_search, md_in_k_space, outer_opt_k_prepare_to_exit, &
3303 prepare_to_exit, reset_conjugator, reset_step_size, use_cubic_approximation, &
3304 use_quadratic_approximation
3305 REAL(kind=
dp) :: aa, bb, beta, conjugacy_error, conjugacy_error_threshold, &
3306 delta_obj_function, denom, energy_correction_final, frob_matrix, frob_matrix_base, fun0, &
3307 fun1, gfun0, gfun1, grad_norm, grad_norm_frob, kappa, kin_energy, line_search_error, &
3308 line_search_error_threshold, num_threshold, numer, obj_function, quadratic_approx_error, &
3309 quadratic_approx_error_threshold, safety_multiplier, spin_factor, step_size, &
3310 step_size_quadratic_approx, step_size_quadratic_approx2, t1, t1a, t1cholesky, t2, t2a, &
3311 t2cholesky, tau, time_step, x_opt_eps_adaptive, x_opt_eps_adaptive_factor
3312 REAL(kind=
dp),
DIMENSION(1) :: local_mu
3313 REAL(kind=
dp),
DIMENSION(2) :: energy_correction
3314 REAL(kind=
dp),
DIMENSION(3) :: minima
3315 TYPE(cp_logger_type),
POINTER :: logger
3316 TYPE(ct_step_env_type) :: ct_step_env
3317 TYPE(dbcsr_type) :: grad, k_vd_index_down, k_vr_index_down, matrix_k_central, matrix_tmp1, &
3318 matrix_tmp2, prec, prev_grad, prev_minus_prec_grad, prev_step, sigma_oo_curr, &
3319 sigma_oo_curr_inv, sigma_vv_sqrt, sigma_vv_sqrt_guess, sigma_vv_sqrt_inv, &
3320 sigma_vv_sqrt_inv_guess, step, t_curr, tmp1_n_vr, tmp2_n_o, tmp3_vd_vr, tmp4_o_vr, &
3321 tmp_k_blk, vd_fixed, vd_index_sqrt, vd_index_sqrt_inv, velocity, vr_fixed, vr_index_sqrt, &
3323 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: matrix_p_almo_scf_converged
3325 CALL timeset(routinen, handle)
3329 IF (logger%para_env%is_source())
THEN
3335 nspin = almo_scf_env%nspins
3336 energy_correction_final = 0.0_dp
3337 IF (nspin .EQ. 1)
THEN
3338 spin_factor = 2.0_dp
3340 spin_factor = 1.0_dp
3343 IF (almo_scf_env%deloc_use_occ_orbs)
THEN
3344 algorithm_id = cayley_transform
3346 algorithm_id = dm_ls_step
3351 SELECT CASE (algorithm_id)
3352 CASE (cayley_transform)
3356 IF (almo_scf_env%nspins == 1)
THEN
3357 CALL dbcsr_scale(almo_scf_env%matrix_p(1), 1.0_dp/spin_factor)
3363 CALL dbcsr_copy(almo_scf_env%matrix_t(ispin), &
3364 almo_scf_env%matrix_t_blk(ispin))
3371 IF (unit_nr > 0)
THEN
3372 WRITE (unit_nr, *)
"sqrt and inv(sqrt) of MO overlap matrix"
3374 CALL dbcsr_create(almo_scf_env%matrix_sigma_sqrt(ispin), &
3375 template=almo_scf_env%matrix_sigma(ispin), &
3376 matrix_type=dbcsr_type_no_symmetry)
3377 CALL dbcsr_create(almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
3378 template=almo_scf_env%matrix_sigma(ispin), &
3379 matrix_type=dbcsr_type_no_symmetry)
3382 almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
3383 almo_scf_env%matrix_sigma(ispin), &
3384 threshold=almo_scf_env%eps_filter, &
3385 order=almo_scf_env%order_lanczos, &
3386 eps_lanczos=almo_scf_env%eps_lanczos, &
3387 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
3390 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_sigma(ispin), &
3391 matrix_type=dbcsr_type_no_symmetry)
3392 CALL dbcsr_create(matrix_tmp2, template=almo_scf_env%matrix_sigma(ispin), &
3393 matrix_type=dbcsr_type_no_symmetry)
3395 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
3396 almo_scf_env%matrix_sigma(ispin), &
3397 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
3398 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp1, &
3399 almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
3400 0.0_dp, matrix_tmp2, filter_eps=almo_scf_env%eps_filter)
3402 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp2)
3403 CALL dbcsr_add_on_diag(matrix_tmp2, -1.0_dp)
3404 frob_matrix = dbcsr_frobenius_norm(matrix_tmp2)
3405 IF (unit_nr > 0)
THEN
3406 WRITE (unit_nr, *)
"Error for (inv(sqrt(SIG))*SIG*inv(sqrt(SIG))-I)", frob_matrix/frob_matrix_base
3409 CALL dbcsr_release(matrix_tmp1)
3410 CALL dbcsr_release(matrix_tmp2)
3414 IF (almo_scf_env%almo_update_algorithm .EQ.
almo_scf_diag)
THEN
3420 line_search_error_threshold = almo_scf_env%real01
3421 conjugacy_error_threshold = almo_scf_env%real02
3422 quadratic_approx_error_threshold = almo_scf_env%real03
3423 x_opt_eps_adaptive_factor = almo_scf_env%real04
3426 outer_opt_k_max_iter = almo_scf_env%opt_k_outer_max_iter
3427 outer_opt_k_prepare_to_exit = .false.
3428 outer_opt_k_iteration = 0
3430 grad_norm_frob = 0.0_dp
3431 CALL dbcsr_set(almo_scf_env%matrix_x(ispin), 0.0_dp)
3432 IF (almo_scf_env%deloc_truncate_virt .EQ.
virt_full) outer_opt_k_max_iter = 0
3438 psi_out=almo_scf_env%matrix_v(ispin), &
3439 psi_projector=almo_scf_env%matrix_t_blk(ispin), &
3440 metric=almo_scf_env%matrix_s(1), &
3441 project_out=.true., &
3442 psi_projector_orthogonal=.false., &
3443 proj_in_template=almo_scf_env%matrix_ov(ispin), &
3444 eps_filter=almo_scf_env%eps_filter, &
3445 sig_inv_projector=almo_scf_env%matrix_sigma_inv(ispin))
3449 CALL dbcsr_create(vr_fixed, &
3450 template=almo_scf_env%matrix_v(ispin))
3451 CALL dbcsr_copy(vr_fixed, almo_scf_env%matrix_v(ispin))
3454 CALL dbcsr_create(sigma_vv_sqrt, &
3455 template=almo_scf_env%matrix_sigma_vv(ispin), &
3456 matrix_type=dbcsr_type_no_symmetry)
3457 CALL dbcsr_create(sigma_vv_sqrt_inv, &
3458 template=almo_scf_env%matrix_sigma_vv(ispin), &
3459 matrix_type=dbcsr_type_no_symmetry)
3460 CALL dbcsr_create(sigma_vv_sqrt_inv_guess, &
3461 template=almo_scf_env%matrix_sigma_vv(ispin), &
3462 matrix_type=dbcsr_type_no_symmetry)
3463 CALL dbcsr_create(sigma_vv_sqrt_guess, &
3464 template=almo_scf_env%matrix_sigma_vv(ispin), &
3465 matrix_type=dbcsr_type_no_symmetry)
3466 CALL dbcsr_set(sigma_vv_sqrt_guess, 0.0_dp)
3467 CALL dbcsr_add_on_diag(sigma_vv_sqrt_guess, 1.0_dp)
3468 CALL dbcsr_filter(sigma_vv_sqrt_guess, almo_scf_env%eps_filter)
3469 CALL dbcsr_set(sigma_vv_sqrt_inv_guess, 0.0_dp)
3470 CALL dbcsr_add_on_diag(sigma_vv_sqrt_inv_guess, 1.0_dp)
3471 CALL dbcsr_filter(sigma_vv_sqrt_inv_guess, almo_scf_env%eps_filter)
3474 IF (almo_scf_env%deloc_truncate_virt .NE.
virt_full)
THEN
3493 psi_out=almo_scf_env%matrix_v_disc(ispin), &
3494 psi_projector=almo_scf_env%matrix_t_blk(ispin), &
3495 metric=almo_scf_env%matrix_s(1), &
3496 project_out=.true., &
3497 psi_projector_orthogonal=.false., &
3498 proj_in_template=almo_scf_env%matrix_ov_disc(ispin), &
3499 eps_filter=almo_scf_env%eps_filter, &
3500 sig_inv_projector=almo_scf_env%matrix_sigma_inv(ispin))
3504 CALL dbcsr_create(vd_fixed, &
3505 template=almo_scf_env%matrix_v_disc(ispin))
3506 CALL dbcsr_copy(vd_fixed, almo_scf_env%matrix_v_disc(ispin))
3509 CALL dbcsr_create(k_vr_index_down, &
3510 template=almo_scf_env%matrix_sigma_vv_blk(ispin), &
3511 matrix_type=dbcsr_type_no_symmetry)
3523 CALL dbcsr_create(k_vd_index_down, &
3524 template=almo_scf_env%matrix_vv_disc_blk(ispin), &
3525 matrix_type=dbcsr_type_no_symmetry)
3567 CALL dbcsr_create(grad, &
3568 template=almo_scf_env%matrix_k_blk(ispin))
3569 CALL dbcsr_copy(grad, almo_scf_env%matrix_k_blk(ispin))
3572 md_in_k_space = almo_scf_env%logical01
3573 IF (md_in_k_space)
THEN
3574 CALL dbcsr_create(velocity, &
3575 template=almo_scf_env%matrix_k_blk(ispin))
3576 CALL dbcsr_copy(velocity, almo_scf_env%matrix_k_blk(ispin))
3577 CALL dbcsr_set(velocity, 0.0_dp)
3578 time_step = almo_scf_env%opt_k_trial_step_size
3581 CALL dbcsr_create(prev_step, &
3582 template=almo_scf_env%matrix_k_blk(ispin))
3584 CALL dbcsr_create(prev_minus_prec_grad, &
3585 template=almo_scf_env%matrix_k_blk(ispin))
3588 CALL dbcsr_create(prec, &
3589 template=almo_scf_env%matrix_k_blk(ispin))
3590 CALL dbcsr_copy(prec, almo_scf_env%matrix_k_blk(ispin))
3591 CALL dbcsr_set(prec, 1.0_dp)
3594 CALL dbcsr_set(almo_scf_env%matrix_k_blk(ispin), 0.0_dp)
3597 CALL dbcsr_create(matrix_k_central, &
3598 template=almo_scf_env%matrix_k_blk(ispin))
3599 CALL dbcsr_copy(matrix_k_central, &
3600 almo_scf_env%matrix_k_blk(ispin))
3601 CALL dbcsr_create(tmp_k_blk, &
3602 template=almo_scf_env%matrix_k_blk(ispin))
3603 CALL dbcsr_create(step, &
3604 template=almo_scf_env%matrix_k_blk(ispin))
3605 CALL dbcsr_set(step, 0.0_dp)
3606 CALL dbcsr_create(t_curr, &
3607 template=almo_scf_env%matrix_t(ispin))
3608 CALL dbcsr_create(sigma_oo_curr, &
3609 template=almo_scf_env%matrix_sigma(ispin), &
3610 matrix_type=dbcsr_type_no_symmetry)
3611 CALL dbcsr_create(sigma_oo_curr_inv, &
3612 template=almo_scf_env%matrix_sigma(ispin), &
3613 matrix_type=dbcsr_type_no_symmetry)
3614 CALL dbcsr_create(tmp1_n_vr, &
3615 template=almo_scf_env%matrix_v(ispin))
3616 CALL dbcsr_create(tmp3_vd_vr, &
3617 template=almo_scf_env%matrix_k_blk(ispin))
3618 CALL dbcsr_create(tmp2_n_o, &
3619 template=almo_scf_env%matrix_t(ispin))
3620 CALL dbcsr_create(tmp4_o_vr, &
3621 template=almo_scf_env%matrix_ov(ispin))
3622 CALL dbcsr_create(prev_grad, &
3623 template=almo_scf_env%matrix_k_blk(ispin))
3624 CALL dbcsr_set(prev_grad, 0.0_dp)
3638 opt_k_max_iter = almo_scf_env%opt_k_max_iter
3641 prepare_to_exit = .false.
3643 line_search = .false.
3644 obj_function = 0.0_dp
3645 conjugacy_error = 0.0_dp
3646 line_search_error = 0.0_dp
3651 step_size_quadratic_approx = 0.0_dp
3652 reset_step_size = .true.
3653 IF (almo_scf_env%deloc_truncate_virt .EQ.
virt_full) opt_k_max_iter = 0
3658 CALL timeset(
'k_opt_vr', handle1)
3660 IF (almo_scf_env%deloc_truncate_virt .NE.
virt_full)
THEN
3663 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vd_fixed, &
3664 almo_scf_env%matrix_k_blk(ispin), &
3665 0.0_dp, almo_scf_env%matrix_v(ispin), &
3666 filter_eps=almo_scf_env%eps_filter)
3667 CALL dbcsr_add(almo_scf_env%matrix_v(ispin), vr_fixed, &
3675 CALL get_overlap(bra=almo_scf_env%matrix_v(ispin), &
3676 ket=almo_scf_env%matrix_v(ispin), &
3677 overlap=almo_scf_env%matrix_sigma_vv(ispin), &
3678 metric=almo_scf_env%matrix_s(1), &
3679 retain_overlap_sparsity=.false., &
3680 eps_filter=almo_scf_env%eps_filter)
3683 IF (almo_scf_env%deloc_truncate_virt .EQ.
virt_full)
THEN
3684 CALL timeset(
'cholesky', handle2)
3689 CALL dbcsr_create(sigma_vv_sqrt, &
3690 template=almo_scf_env%matrix_sigma_vv(ispin), &
3691 matrix_type=dbcsr_type_no_symmetry)
3692 CALL dbcsr_desymmetrize(almo_scf_env%matrix_sigma_vv(ispin), &
3695 para_env=almo_scf_env%para_env, &
3696 blacs_env=almo_scf_env%blacs_env)
3697 CALL dbcsr_triu(sigma_vv_sqrt)
3698 CALL dbcsr_filter(sigma_vv_sqrt, almo_scf_env%eps_filter)
3700 CALL dbcsr_get_info(sigma_vv_sqrt, nfullrows_total=n)
3701 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_sigma_vv(ispin), &
3702 matrix_type=dbcsr_type_no_symmetry)
3703 CALL dbcsr_set(matrix_tmp1, 0.0_dp)
3704 CALL dbcsr_add_on_diag(matrix_tmp1, 1.0_dp)
3706 sigma_vv_sqrt_inv, op=
"SOLVE", pos=
"RIGHT", &
3707 para_env=almo_scf_env%para_env, &
3708 blacs_env=almo_scf_env%blacs_env)
3709 CALL dbcsr_filter(sigma_vv_sqrt_inv, almo_scf_env%eps_filter)
3710 CALL dbcsr_release(matrix_tmp1)
3712 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_sigma_vv(ispin), &
3713 matrix_type=dbcsr_type_no_symmetry)
3714 CALL dbcsr_desymmetrize(almo_scf_env%matrix_sigma_vv(ispin), &
3716 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, sigma_vv_sqrt, &
3718 -1.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
3719 frob_matrix = dbcsr_frobenius_norm(matrix_tmp1)
3720 CALL dbcsr_add_on_diag(matrix_tmp1, 1.0_dp)
3721 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp1)
3722 IF (unit_nr > 0)
THEN
3723 WRITE (unit_nr, *)
"Error for ( U^T * U - Sig )", &
3724 frob_matrix/frob_matrix_base
3726 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, sigma_vv_sqrt_inv, &
3728 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
3729 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp1)
3730 CALL dbcsr_add_on_diag(matrix_tmp1, -1.0_dp)
3731 frob_matrix = dbcsr_frobenius_norm(matrix_tmp1)
3732 IF (unit_nr > 0)
THEN
3733 WRITE (unit_nr, *)
"Error for ( inv(U) * U - I )", &
3734 frob_matrix/frob_matrix_base
3736 CALL dbcsr_release(matrix_tmp1)
3739 IF (unit_nr > 0)
THEN
3740 WRITE (unit_nr, *)
"Cholesky+inverse wall-time: ", t2cholesky - t1cholesky
3742 CALL timestop(handle2)
3745 sigma_vv_sqrt_inv, &
3746 almo_scf_env%matrix_sigma_vv(ispin), &
3749 threshold=almo_scf_env%eps_filter, &
3750 order=almo_scf_env%order_lanczos, &
3751 eps_lanczos=almo_scf_env%eps_lanczos, &
3752 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
3753 CALL dbcsr_copy(sigma_vv_sqrt_inv_guess, sigma_vv_sqrt_inv)
3754 CALL dbcsr_copy(sigma_vv_sqrt_guess, sigma_vv_sqrt)
3756 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_sigma_vv(ispin), &
3757 matrix_type=dbcsr_type_no_symmetry)
3758 CALL dbcsr_create(matrix_tmp2, template=almo_scf_env%matrix_sigma_vv(ispin), &
3759 matrix_type=dbcsr_type_no_symmetry)
3761 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, sigma_vv_sqrt_inv, &
3762 almo_scf_env%matrix_sigma_vv(ispin), &
3763 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
3764 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp1, &
3765 sigma_vv_sqrt_inv, &
3766 0.0_dp, matrix_tmp2, filter_eps=almo_scf_env%eps_filter)
3768 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp2)
3769 CALL dbcsr_add_on_diag(matrix_tmp2, -1.0_dp)
3770 frob_matrix = dbcsr_frobenius_norm(matrix_tmp2)
3771 IF (unit_nr > 0)
THEN
3772 WRITE (unit_nr, *)
"Error for (inv(sqrt(SIGVV))*SIGVV*inv(sqrt(SIGVV))-I)", &
3773 frob_matrix/frob_matrix_base
3776 CALL dbcsr_release(matrix_tmp1)
3777 CALL dbcsr_release(matrix_tmp2)
3780 CALL timestop(handle1)
3784 IF ((iteration .EQ. 0) .AND. (.NOT. line_search) .AND. &
3785 (outer_opt_k_iteration .EQ. 0))
THEN
3786 x_opt_eps_adaptive = &
3787 almo_scf_env%deloc_cayley_eps_convergence
3789 x_opt_eps_adaptive = &
3790 max(abs(almo_scf_env%deloc_cayley_eps_convergence), &
3791 abs(x_opt_eps_adaptive_factor*grad_norm))
3795 para_env=almo_scf_env%para_env, &
3796 blacs_env=almo_scf_env%blacs_env, &
3797 use_occ_orbs=.true., &
3798 use_virt_orbs=.true., &
3799 occ_orbs_orthogonal=.false., &
3800 virt_orbs_orthogonal=.false., &
3801 pp_preconditioner_full=almo_scf_env%deloc_cayley_occ_precond, &
3802 qq_preconditioner_full=almo_scf_env%deloc_cayley_vir_precond, &
3803 tensor_type=almo_scf_env%deloc_cayley_tensor_type, &
3804 neglect_quadratic_term=almo_scf_env%deloc_cayley_linear, &
3805 conjugator=almo_scf_env%deloc_cayley_conjugator, &
3806 max_iter=almo_scf_env%deloc_cayley_max_iter, &
3807 calculate_energy_corr=.true., &
3810 eps_convergence=x_opt_eps_adaptive, &
3811 eps_filter=almo_scf_env%eps_filter, &
3813 q_index_up=sigma_vv_sqrt_inv, &
3814 q_index_down=sigma_vv_sqrt, &
3815 p_index_up=almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
3816 p_index_down=almo_scf_env%matrix_sigma_sqrt(ispin), &
3817 matrix_ks=almo_scf_env%matrix_ks_0deloc(ispin), &
3818 matrix_t=almo_scf_env%matrix_t(ispin), &
3819 matrix_qp_template=almo_scf_env%matrix_vo(ispin), &
3820 matrix_pq_template=almo_scf_env%matrix_ov(ispin), &
3821 matrix_v=almo_scf_env%matrix_v(ispin), &
3822 matrix_x_guess=almo_scf_env%matrix_x(ispin))
3827 energy_correction=energy_correction(ispin), &
3828 copy_matrix_x=almo_scf_env%matrix_x(ispin))
3832 energy_correction(1) = energy_correction(1)*spin_factor
3834 IF (opt_k_max_iter .NE. 0)
THEN
3836 CALL timeset(
'k_opt_t_curr', handle3)
3839 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3840 almo_scf_env%matrix_v(ispin), &
3841 almo_scf_env%matrix_x(ispin), &
3843 filter_eps=almo_scf_env%eps_filter)
3844 CALL dbcsr_add(t_curr, almo_scf_env%matrix_t_blk(ispin), &
3853 overlap=sigma_oo_curr, &
3854 metric=almo_scf_env%matrix_s(1), &
3855 retain_overlap_sparsity=.false., &
3856 eps_filter=almo_scf_env%eps_filter)
3857 IF (iteration .EQ. 0)
THEN
3860 threshold=almo_scf_env%eps_filter, &
3861 use_inv_as_guess=.false.)
3865 threshold=almo_scf_env%eps_filter, &
3866 use_inv_as_guess=.true.)
3870 CALL dbcsr_create(matrix_tmp1, template=sigma_oo_curr, &
3871 matrix_type=dbcsr_type_no_symmetry)
3872 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, sigma_oo_curr, &
3873 sigma_oo_curr_inv, &
3874 0.0_dp, matrix_tmp1, &
3875 filter_eps=almo_scf_env%eps_filter)
3876 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp1)
3877 CALL dbcsr_add_on_diag(matrix_tmp1, -1.0_dp)
3878 frob_matrix = dbcsr_frobenius_norm(matrix_tmp1)
3881 IF (unit_nr > 0)
THEN
3882 WRITE (unit_nr, *)
"Error for (SIG*inv(SIG)-I)", &
3883 frob_matrix/frob_matrix_base, frob_matrix_base
3885 CALL dbcsr_release(matrix_tmp1)
3888 CALL dbcsr_create(matrix_tmp1, template=sigma_oo_curr, &
3889 matrix_type=dbcsr_type_no_symmetry)
3890 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, sigma_oo_curr_inv, &
3892 0.0_dp, matrix_tmp1, &
3893 filter_eps=almo_scf_env%eps_filter)
3894 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp1)
3895 CALL dbcsr_add_on_diag(matrix_tmp1, -1.0_dp)
3896 frob_matrix = dbcsr_frobenius_norm(matrix_tmp1)
3899 IF (unit_nr > 0)
THEN
3900 WRITE (unit_nr, *)
"Error for (inv(SIG)*SIG-I)", &
3901 frob_matrix/frob_matrix_base, frob_matrix_base
3903 CALL dbcsr_release(matrix_tmp1)
3906 CALL timestop(handle3)
3907 CALL timeset(
'k_opt_vd', handle4)
3914 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
3915 sigma_vv_sqrt_inv, &
3916 sigma_vv_sqrt_inv, &
3917 0.0_dp, sigma_vv_sqrt, &
3918 filter_eps=almo_scf_env%eps_filter)
3920 psi_out=almo_scf_env%matrix_v_disc(ispin), &
3921 psi_projector=almo_scf_env%matrix_v(ispin), &
3922 metric=almo_scf_env%matrix_s(1), &
3923 project_out=.false., &
3924 psi_projector_orthogonal=.false., &
3925 proj_in_template=almo_scf_env%matrix_k_tr(ispin), &
3926 eps_filter=almo_scf_env%eps_filter, &
3927 sig_inv_projector=sigma_vv_sqrt)
3929 CALL dbcsr_add(almo_scf_env%matrix_v_disc(ispin), &
3930 vd_fixed, -1.0_dp, +1.0_dp)
3932 CALL timestop(handle4)
3933 CALL timeset(
'k_opt_grad', handle5)
3938 IF (line_search)
THEN
3939 CALL dbcsr_copy(prev_grad, grad)
3941 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3942 almo_scf_env%matrix_ks_0deloc(ispin), &
3945 filter_eps=almo_scf_env%eps_filter)
3946 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
3947 sigma_oo_curr_inv, &
3948 almo_scf_env%matrix_x(ispin), &
3949 0.0_dp, tmp4_o_vr, &
3950 filter_eps=almo_scf_env%eps_filter)
3951 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
3954 0.0_dp, tmp1_n_vr, &
3955 filter_eps=almo_scf_env%eps_filter)
3956 CALL dbcsr_multiply(
"T",
"N", 2.0_dp*spin_factor, &
3957 almo_scf_env%matrix_v_disc(ispin), &
3960 retain_sparsity=.true.)
3966 grad_norm_frob = dbcsr_frobenius_norm(grad)
3967 CALL dbcsr_norm(grad, dbcsr_norm_maxabsnorm, norm_scalar=grad_norm)
3968 converged = (grad_norm .LT. almo_scf_env%opt_k_eps_convergence)
3969 IF (converged .OR. (iteration .GE. opt_k_max_iter))
THEN
3970 prepare_to_exit = .true.
3972 CALL timestop(handle5)
3974 IF (.NOT. prepare_to_exit)
THEN
3976 CALL timeset(
'k_opt_energy', handle6)
3979 CALL dbcsr_multiply(
"T",
"N", spin_factor, &
3982 0.0_dp, sigma_oo_curr, &
3983 filter_eps=almo_scf_env%eps_filter)
3984 delta_obj_function = fun0
3985 CALL dbcsr_dot(sigma_oo_curr_inv, sigma_oo_curr, obj_function)
3986 delta_obj_function = obj_function - delta_obj_function
3987 IF (line_search)
THEN
3993 CALL timestop(handle6)
3996 IF (.NOT. line_search)
THEN
3998 CALL timeset(
'k_opt_step', handle7)
4000 IF ((.NOT. md_in_k_space) .AND. &
4001 (iteration .GE. max(0, almo_scf_env%opt_k_prec_iter_start) .AND. &
4002 mod(iteration - almo_scf_env%opt_k_prec_iter_start, &
4003 almo_scf_env%opt_k_prec_iter_freq) .EQ. 0))
THEN
4008 IF (unit_nr > 0)
THEN
4009 WRITE (unit_nr, *)
"Computing preconditioner"
4026 CALL opt_k_create_preconditioner_blk(almo_scf_env, &
4027 almo_scf_env%matrix_v_disc(ispin), &
4036 CALL dbcsr_copy(prev_step, step)
4039 CALL opt_k_apply_preconditioner_blk(almo_scf_env, &
4042 CALL dbcsr_scale(step, -1.0_dp)
4045 reset_conjugator = .false.
4047 IF (iteration .LT. max(almo_scf_env%opt_k_conj_iter_start, 1) .OR. &
4048 mod(iteration - almo_scf_env%opt_k_conj_iter_start, &
4049 almo_scf_env%opt_k_conj_iter_freq) .EQ. 0)
THEN
4051 reset_conjugator = .true.
4059 CALL dbcsr_dot(grad, prev_minus_prec_grad, numer)
4060 CALL dbcsr_dot(prev_grad, prev_minus_prec_grad, denom)
4061 conjugacy_error = numer/denom
4063 IF (conjugacy_error .GT. min(0.5_dp, conjugacy_error_threshold))
THEN
4064 reset_conjugator = .true.
4065 IF (unit_nr > 0)
THEN
4066 WRITE (unit_nr, *)
"Lack of progress, conjugacy error is ", conjugacy_error
4071 IF ((iteration .NE. 0) .AND. (.NOT. reset_conjugator))
THEN
4072 CALL dbcsr_dot(grad, prev_step, numer)
4073 CALL dbcsr_dot(prev_grad, prev_step, denom)
4074 line_search_error = numer/denom
4075 IF (line_search_error .GT. line_search_error_threshold)
THEN
4076 reset_conjugator = .true.
4077 IF (unit_nr > 0)
THEN
4078 WRITE (unit_nr, *)
"Bad line search, line search error is ", line_search_error
4086 IF (.NOT. reset_conjugator)
THEN
4088 SELECT CASE (almo_scf_env%opt_k_conjugator)
4090 CALL dbcsr_copy(tmp_k_blk, grad)
4091 CALL dbcsr_add(tmp_k_blk, prev_grad, 1.0_dp, -1.0_dp)
4092 CALL dbcsr_dot(tmp_k_blk, step, numer)
4093 CALL dbcsr_dot(tmp_k_blk, prev_step, denom)
4094 beta = -1.0_dp*numer/denom
4101 CALL dbcsr_dot(grad, step, numer)
4102 CALL dbcsr_dot(prev_grad, prev_minus_prec_grad, denom)
4110 CALL dbcsr_dot(prev_grad, prev_minus_prec_grad, denom)
4111 CALL dbcsr_copy(tmp_k_blk, grad)
4112 CALL dbcsr_add(tmp_k_blk, prev_grad, 1.0_dp, -1.0_dp)
4113 CALL dbcsr_dot(tmp_k_blk, step, numer)
4120 CALL dbcsr_dot(grad, step, numer)
4121 CALL dbcsr_dot(prev_grad, prev_step, denom)
4124 CALL dbcsr_dot(prev_grad, prev_step, denom)
4128 CALL dbcsr_copy(tmp_k_blk, grad)
4129 CALL dbcsr_add(tmp_k_blk, prev_grad, 1.0_dp, -1.0_dp)
4130 CALL dbcsr_dot(tmp_k_blk, step, numer)
4138 CALL dbcsr_dot(grad, step, numer)
4139 CALL dbcsr_copy(tmp_k_blk, grad)
4140 CALL dbcsr_add(tmp_k_blk, prev_grad, 1.0_dp, -1.0_dp)
4141 CALL dbcsr_dot(tmp_k_blk, prev_step, denom)
4142 beta = -1.0_dp*numer/denom
4153 CALL dbcsr_copy(tmp_k_blk, grad)
4154 CALL dbcsr_add(tmp_k_blk, prev_grad, 1.0_dp, -1.0_dp)
4155 CALL dbcsr_dot(tmp_k_blk, prev_step, denom)
4156 CALL dbcsr_dot(tmp_k_blk, prev_minus_prec_grad, numer)
4157 kappa = -2.0_dp*numer/denom
4158 CALL dbcsr_dot(tmp_k_blk, step, numer)
4159 tau = -1.0_dp*numer/denom
4160 CALL dbcsr_dot(prev_step, grad, numer)
4161 beta = tau - kappa*numer/denom
4165 cpabort(
"illegal conjugator")
4168 IF (beta .LT. 0.0_dp)
THEN
4169 IF (unit_nr > 0)
THEN
4170 WRITE (unit_nr, *)
"Beta is negative, ", beta
4172 reset_conjugator = .true.
4177 IF (md_in_k_space)
THEN
4178 reset_conjugator = .true.
4181 IF (reset_conjugator)
THEN
4186 IF (unit_nr > 0)
THEN
4187 WRITE (unit_nr, *)
"(Re)-setting conjugator to zero"
4193 CALL dbcsr_copy(prev_minus_prec_grad, step)
4196 CALL dbcsr_add(step, prev_step, 1.0_dp, beta)
4198 CALL timestop(handle7)
4202 conjugacy_error = 0.0_dp
4206 IF (line_search)
THEN
4207 CALL dbcsr_dot(grad, step, gfun1)
4208 line_search_error = gfun1/gfun0
4210 CALL dbcsr_dot(grad, step, gfun0)
4214 IF (line_search)
THEN
4217 safety_multiplier = 1.0e+1_dp
4218 num_threshold = max(epsilon(1.0_dp), &
4219 safety_multiplier*(almo_scf_env%eps_filter**2)*almo_scf_env%ndomains)
4220 IF (abs(fun1 - fun0 - gfun0*step_size) .LT. num_threshold)
THEN
4221 IF (unit_nr > 0)
THEN
4222 WRITE (unit_nr,
'(T3,A,1X,E17.7)') &
4223 "Numerical accuracy is too low to observe non-linear behavior", &
4224 abs(fun1 - fun0 - gfun0*step_size)
4225 WRITE (unit_nr,
'(T3,A,1X,E17.7,A,1X,E12.3)')
"Error computing ", &
4227 " is smaller than the threshold", num_threshold
4231 IF (abs(gfun0) .LT. num_threshold)
THEN
4232 IF (unit_nr > 0)
THEN
4233 WRITE (unit_nr,
'(T3,A,1X,E17.7,A,1X,E12.3)')
"Linear gradient", &
4235 " is smaller than the threshold", num_threshold
4240 use_quadratic_approximation = .true.
4241 use_cubic_approximation = .false.
4245 step_size_quadratic_approx = -(gfun0*step_size*step_size)/(2.0_dp*(fun1 - fun0 - gfun0*step_size))
4247 step_size_quadratic_approx2 = -(fun1 - fun0 - step_size*gfun1/2.0_dp)/(gfun1 - (fun1 - fun0)/step_size)
4249 IF ((step_size_quadratic_approx .LT. 0.0_dp) .AND. &
4250 (step_size_quadratic_approx2 .LT. 0.0_dp))
THEN
4251 IF (unit_nr > 0)
THEN
4252 WRITE (unit_nr,
'(T3,A,1X,E17.7,1X,E17.7,1X,A)') &
4253 "Quadratic approximation gives negative steps", &
4254 step_size_quadratic_approx, step_size_quadratic_approx2, &
4257 use_cubic_approximation = .true.
4258 use_quadratic_approximation = .false.
4260 IF (step_size_quadratic_approx .LT. 0.0_dp)
THEN
4261 step_size_quadratic_approx = step_size_quadratic_approx2
4263 IF (step_size_quadratic_approx2 .LT. 0.0_dp)
THEN
4264 step_size_quadratic_approx2 = step_size_quadratic_approx
4269 IF (use_quadratic_approximation)
THEN
4270 quadratic_approx_error = abs(step_size_quadratic_approx - &
4271 step_size_quadratic_approx2)/step_size_quadratic_approx
4272 IF (quadratic_approx_error .GT. quadratic_approx_error_threshold)
THEN
4273 IF (unit_nr > 0)
THEN
4274 WRITE (unit_nr,
'(T3,A,1X,E17.7,1X,E17.7,1X,A)')
"Quadratic approximation is poor", &
4275 step_size_quadratic_approx, step_size_quadratic_approx2, &
4276 "Try cubic approximation"
4278 use_cubic_approximation = .true.
4279 use_quadratic_approximation = .false.
4284 IF (use_cubic_approximation)
THEN
4289 bb = (-step_size*gfun1 + 3.0_dp*(fun1 - fun0) - 2.0_dp*step_size*gfun0)/(step_size*step_size)
4290 aa = (gfun1 - 2.0_dp*step_size*bb - gfun0)/(3.0_dp*step_size*step_size)
4292 IF (abs(gfun1 - 2.0_dp*step_size*bb - gfun0) .LT. num_threshold)
THEN
4293 IF (unit_nr > 0)
THEN
4294 WRITE (unit_nr,
'(T3,A,1X,E17.7)') &
4295 "Numerical accuracy is too low to observe cubic behavior", &
4296 abs(gfun1 - 2.0_dp*step_size*bb - gfun0)
4298 use_cubic_approximation = .false.
4299 use_quadratic_approximation = .true.
4301 IF (abs(gfun1) .LT. num_threshold)
THEN
4302 IF (unit_nr > 0)
THEN
4303 WRITE (unit_nr,
'(T3,A,1X,E17.7,A,1X,E12.3)')
"Linear gradient", &
4305 " is smaller than the threshold", num_threshold
4307 use_cubic_approximation = .false.
4308 use_quadratic_approximation = .true.
4313 IF (use_cubic_approximation)
THEN
4317 IF (nmins .LT. 1)
THEN
4318 IF (unit_nr > 0)
THEN
4319 WRITE (unit_nr,
'(T3,A)') &
4320 "Cubic approximation gives zero soultions! Use quadratic approximation"
4322 use_quadratic_approximation = .true.
4323 use_cubic_approximation = .true.
4325 step_size = minima(1)
4326 IF (nmins .GT. 1)
THEN
4327 IF (unit_nr > 0)
THEN
4328 WRITE (unit_nr,
'(T3,A)') &
4329 "More than one solution found! Use quadratic approximation"
4331 use_quadratic_approximation = .true.
4332 use_cubic_approximation = .true.
4337 IF (use_quadratic_approximation)
THEN
4338 IF (unit_nr > 0)
THEN
4339 WRITE (unit_nr,
'(T3,A)')
"Use quadratic approximation"
4341 step_size = (step_size_quadratic_approx + step_size_quadratic_approx2)*0.5_dp
4345 IF (step_size .LT. 0.0_dp)
THEN
4346 cpabort(
"Negative step proposed")
4349 CALL dbcsr_copy(almo_scf_env%matrix_k_blk(ispin), &
4351 CALL dbcsr_add(almo_scf_env%matrix_k_blk(ispin), &
4352 step, 1.0_dp, step_size)
4353 CALL dbcsr_copy(matrix_k_central, &
4354 almo_scf_env%matrix_k_blk(ispin))
4355 line_search = .false.
4359 IF (md_in_k_space)
THEN
4362 IF (iteration .NE. 0)
THEN
4363 CALL dbcsr_add(velocity, &
4364 step, 1.0_dp, 0.5_dp*time_step)
4365 CALL dbcsr_add(velocity, &
4366 prev_step, 1.0_dp, 0.5_dp*time_step)
4368 kin_energy = dbcsr_frobenius_norm(velocity)
4369 kin_energy = 0.5_dp*kin_energy*kin_energy
4372 CALL dbcsr_add(almo_scf_env%matrix_k_blk(ispin), &
4373 velocity, 1.0_dp, time_step)
4374 CALL dbcsr_add(almo_scf_env%matrix_k_blk(ispin), &
4375 step, 1.0_dp, 0.5_dp*time_step*time_step)
4379 IF (reset_step_size)
THEN
4380 step_size = almo_scf_env%opt_k_trial_step_size
4381 reset_step_size = .false.
4383 step_size = step_size*almo_scf_env%opt_k_trial_step_size_multiplier
4385 CALL dbcsr_copy(almo_scf_env%matrix_k_blk(ispin), &
4387 CALL dbcsr_add(almo_scf_env%matrix_k_blk(ispin), &
4388 step, 1.0_dp, step_size)
4389 line_search = .true.
4398 IF (unit_nr > 0)
THEN
4399 IF (md_in_k_space)
THEN
4400 WRITE (unit_nr,
'(T6,A,1X,I5,1X,E12.3,E16.7,F15.9,F15.9,F15.9,E12.3,F15.9,F15.9,F8.3)') &
4401 "K iter CG", iteration, time_step, time_step*iteration, &
4402 energy_correction(ispin), obj_function, delta_obj_function, grad_norm, &
4403 kin_energy, kin_energy + obj_function, beta
4405 IF (line_search .OR. prepare_to_exit)
THEN
4406 WRITE (unit_nr,
'(T6,A,1X,I3,1X,E12.3,F16.10,F16.10,E12.3,E12.3,E12.3,F8.3,F8.3,F10.3)') &
4407 "K iter CG", iteration, step_size, &
4408 energy_correction(ispin), delta_obj_function, grad_norm, &
4409 gfun0, line_search_error, beta, conjugacy_error, t2a - t1a
4412 WRITE (unit_nr,
'(T6,A,1X,I3,1X,E12.3,F16.10,F16.10,E12.3,E12.3,E12.3,F8.3,F8.3,F10.3)') &
4413 "K iter LS", iteration, step_size, &
4414 energy_correction(ispin), delta_obj_function, grad_norm, &
4415 gfun1, line_search_error, beta, conjugacy_error, t2a - t1a
4424 prepare_to_exit = .true.
4427 IF (.NOT. line_search) iteration = iteration + 1
4429 IF (prepare_to_exit)
EXIT
4433 IF (converged .OR. (outer_opt_k_iteration .GE. outer_opt_k_max_iter))
THEN
4434 outer_opt_k_prepare_to_exit = .true.
4437 IF (almo_scf_env%deloc_truncate_virt .NE.
virt_full)
THEN
4439 IF (unit_nr > 0)
THEN
4440 WRITE (unit_nr, *)
"Updating ALMO virtuals"
4443 CALL timeset(
'k_opt_v0_update', handle8)
4446 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
4447 almo_scf_env%matrix_v_disc_blk(ispin), &
4448 almo_scf_env%matrix_k_blk(ispin), &
4450 filter_eps=almo_scf_env%eps_filter)
4451 CALL dbcsr_add(vr_fixed, almo_scf_env%matrix_v_blk(ispin), &
4455 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
4456 almo_scf_env%matrix_v_blk(ispin), &
4457 almo_scf_env%matrix_k_blk(ispin), &
4459 filter_eps=almo_scf_env%eps_filter)
4460 CALL dbcsr_add(vd_fixed, almo_scf_env%matrix_v_disc_blk(ispin), &
4466 overlap=k_vr_index_down, &
4467 metric=almo_scf_env%matrix_s_blk(1), &
4468 retain_overlap_sparsity=.false., &
4469 eps_filter=almo_scf_env%eps_filter)
4470 CALL dbcsr_create(vr_index_sqrt_inv, template=k_vr_index_down, &
4471 matrix_type=dbcsr_type_no_symmetry)
4472 CALL dbcsr_create(vr_index_sqrt, template=k_vr_index_down, &
4473 matrix_type=dbcsr_type_no_symmetry)
4475 vr_index_sqrt_inv, &
4477 threshold=almo_scf_env%eps_filter, &
4478 order=almo_scf_env%order_lanczos, &
4479 eps_lanczos=almo_scf_env%eps_lanczos, &
4480 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
4482 CALL dbcsr_create(matrix_tmp1, template=k_vr_index_down, &
4483 matrix_type=dbcsr_type_no_symmetry)
4484 CALL dbcsr_create(matrix_tmp2, template=k_vr_index_down, &
4485 matrix_type=dbcsr_type_no_symmetry)
4487 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vr_index_sqrt_inv, &
4489 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
4490 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp1, &
4491 vr_index_sqrt_inv, &
4492 0.0_dp, matrix_tmp2, filter_eps=almo_scf_env%eps_filter)
4494 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp2)
4495 CALL dbcsr_add_on_diag(matrix_tmp2, -1.0_dp)
4496 frob_matrix = dbcsr_frobenius_norm(matrix_tmp2)
4497 IF (unit_nr > 0)
THEN
4498 WRITE (unit_nr, *)
"Error for (inv(sqrt(SIGVV))*SIGVV*inv(sqrt(SIGVV))-I)", &
4499 frob_matrix/frob_matrix_base
4502 CALL dbcsr_release(matrix_tmp1)
4503 CALL dbcsr_release(matrix_tmp2)
4505 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
4507 vr_index_sqrt_inv, &
4508 0.0_dp, almo_scf_env%matrix_v_blk(ispin), &
4509 filter_eps=almo_scf_env%eps_filter)
4513 overlap=k_vd_index_down, &
4514 metric=almo_scf_env%matrix_s_blk(1), &
4515 retain_overlap_sparsity=.false., &
4516 eps_filter=almo_scf_env%eps_filter)
4517 CALL dbcsr_create(vd_index_sqrt_inv, template=k_vd_index_down, &
4518 matrix_type=dbcsr_type_no_symmetry)
4519 CALL dbcsr_create(vd_index_sqrt, template=k_vd_index_down, &
4520 matrix_type=dbcsr_type_no_symmetry)
4522 vd_index_sqrt_inv, &
4524 threshold=almo_scf_env%eps_filter, &
4525 order=almo_scf_env%order_lanczos, &
4526 eps_lanczos=almo_scf_env%eps_lanczos, &
4527 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
4529 CALL dbcsr_create(matrix_tmp1, template=k_vd_index_down, &
4530 matrix_type=dbcsr_type_no_symmetry)
4531 CALL dbcsr_create(matrix_tmp2, template=k_vd_index_down, &
4532 matrix_type=dbcsr_type_no_symmetry)
4534 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vd_index_sqrt_inv, &
4536 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
4537 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp1, &
4538 vd_index_sqrt_inv, &
4539 0.0_dp, matrix_tmp2, filter_eps=almo_scf_env%eps_filter)
4541 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp2)
4542 CALL dbcsr_add_on_diag(matrix_tmp2, -1.0_dp)
4543 frob_matrix = dbcsr_frobenius_norm(matrix_tmp2)
4544 IF (unit_nr > 0)
THEN
4545 WRITE (unit_nr, *)
"Error for (inv(sqrt(SIGVV))*SIGVV*inv(sqrt(SIGVV))-I)", &
4546 frob_matrix/frob_matrix_base
4549 CALL dbcsr_release(matrix_tmp1)
4550 CALL dbcsr_release(matrix_tmp2)
4552 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
4554 vd_index_sqrt_inv, &
4555 0.0_dp, almo_scf_env%matrix_v_disc_blk(ispin), &
4556 filter_eps=almo_scf_env%eps_filter)
4558 CALL dbcsr_release(vr_index_sqrt_inv)
4559 CALL dbcsr_release(vr_index_sqrt)
4560 CALL dbcsr_release(vd_index_sqrt_inv)
4561 CALL dbcsr_release(vd_index_sqrt)
4563 CALL timestop(handle8)
4568 CALL dbcsr_release(sigma_vv_sqrt)
4569 CALL dbcsr_release(sigma_vv_sqrt_inv)
4570 IF (almo_scf_env%deloc_truncate_virt .NE.
virt_full)
THEN
4571 CALL dbcsr_release(k_vr_index_down)
4572 CALL dbcsr_release(k_vd_index_down)
4574 CALL dbcsr_release(matrix_k_central)
4575 CALL dbcsr_release(vr_fixed)
4576 CALL dbcsr_release(vd_fixed)
4577 CALL dbcsr_release(grad)
4578 CALL dbcsr_release(prec)
4579 CALL dbcsr_release(prev_grad)
4580 CALL dbcsr_release(tmp3_vd_vr)
4581 CALL dbcsr_release(tmp1_n_vr)
4582 CALL dbcsr_release(tmp_k_blk)
4583 CALL dbcsr_release(t_curr)
4584 CALL dbcsr_release(sigma_oo_curr)
4585 CALL dbcsr_release(sigma_oo_curr_inv)
4586 CALL dbcsr_release(step)
4587 CALL dbcsr_release(tmp2_n_o)
4588 CALL dbcsr_release(tmp4_o_vr)
4589 CALL dbcsr_release(prev_step)
4590 CALL dbcsr_release(prev_minus_prec_grad)
4591 IF (md_in_k_space)
THEN
4592 CALL dbcsr_release(velocity)
4597 outer_opt_k_iteration = outer_opt_k_iteration + 1
4598 IF (outer_opt_k_prepare_to_exit)
EXIT
4612 IF (.NOT. almo_scf_env%s_sqrt_done)
THEN
4614 IF (unit_nr > 0)
THEN
4615 WRITE (unit_nr, *)
"sqrt and inv(sqrt) of AO overlap matrix"
4617 CALL dbcsr_create(almo_scf_env%matrix_s_sqrt(1), &
4618 template=almo_scf_env%matrix_s(1), &
4619 matrix_type=dbcsr_type_no_symmetry)
4620 CALL dbcsr_create(almo_scf_env%matrix_s_sqrt_inv(1), &
4621 template=almo_scf_env%matrix_s(1), &
4622 matrix_type=dbcsr_type_no_symmetry)
4625 almo_scf_env%matrix_s_sqrt_inv(1), &
4626 almo_scf_env%matrix_s(1), &
4627 threshold=almo_scf_env%eps_filter, &
4628 order=almo_scf_env%order_lanczos, &
4629 eps_lanczos=almo_scf_env%eps_lanczos, &
4630 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
4633 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_s(1), &
4634 matrix_type=dbcsr_type_no_symmetry)
4635 CALL dbcsr_create(matrix_tmp2, template=almo_scf_env%matrix_s(1), &
4636 matrix_type=dbcsr_type_no_symmetry)
4638 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_s_sqrt_inv(1), &
4639 almo_scf_env%matrix_s(1), &
4640 0.0_dp, matrix_tmp1, filter_eps=almo_scf_env%eps_filter)
4641 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp1, almo_scf_env%matrix_s_sqrt_inv(1), &
4642 0.0_dp, matrix_tmp2, filter_eps=almo_scf_env%eps_filter)
4644 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp2)
4645 CALL dbcsr_add_on_diag(matrix_tmp2, -1.0_dp)
4646 frob_matrix = dbcsr_frobenius_norm(matrix_tmp2)
4647 IF (unit_nr > 0)
THEN
4648 WRITE (unit_nr, *)
"Error for (inv(sqrt(S))*S*inv(sqrt(S))-I)", frob_matrix/frob_matrix_base
4651 CALL dbcsr_release(matrix_tmp1)
4652 CALL dbcsr_release(matrix_tmp2)
4655 almo_scf_env%s_sqrt_done = .true.
4663 para_env=almo_scf_env%para_env, &
4664 blacs_env=almo_scf_env%blacs_env, &
4665 use_occ_orbs=.true., &
4666 use_virt_orbs=almo_scf_env%deloc_cayley_use_virt_orbs, &
4667 occ_orbs_orthogonal=.false., &
4668 virt_orbs_orthogonal=almo_scf_env%orthogonal_basis, &
4669 tensor_type=almo_scf_env%deloc_cayley_tensor_type, &
4670 neglect_quadratic_term=almo_scf_env%deloc_cayley_linear, &
4671 calculate_energy_corr=.true., &
4674 pp_preconditioner_full=almo_scf_env%deloc_cayley_occ_precond, &
4675 qq_preconditioner_full=almo_scf_env%deloc_cayley_vir_precond, &
4676 eps_convergence=almo_scf_env%deloc_cayley_eps_convergence, &
4677 eps_filter=almo_scf_env%eps_filter, &
4679 q_index_up=almo_scf_env%matrix_s_sqrt_inv(1), &
4680 q_index_down=almo_scf_env%matrix_s_sqrt(1), &
4681 p_index_up=almo_scf_env%matrix_sigma_sqrt_inv(ispin), &
4682 p_index_down=almo_scf_env%matrix_sigma_sqrt(ispin), &
4683 matrix_ks=almo_scf_env%matrix_ks_0deloc(ispin), &
4684 matrix_p=almo_scf_env%matrix_p(ispin), &
4685 matrix_qp_template=almo_scf_env%matrix_t(ispin), &
4686 matrix_pq_template=almo_scf_env%matrix_t_tr(ispin), &
4687 matrix_t=almo_scf_env%matrix_t(ispin), &
4688 conjugator=almo_scf_env%deloc_cayley_conjugator, &
4689 max_iter=almo_scf_env%deloc_cayley_max_iter)
4697 energy_correction=energy_correction(ispin))
4705 energy_correction(1) = energy_correction(1)*spin_factor
4712 IF (unit_nr > 0)
THEN
4714 WRITE (unit_nr,
'(T2,A,I6,F20.9)')
"ECORR", ispin, &
4715 energy_correction(ispin)
4718 energy_correction_final = energy_correction_final + energy_correction(ispin)
4735 p=almo_scf_env%matrix_p(ispin), &
4736 eps_filter=almo_scf_env%eps_filter, &
4737 orthog_orbs=.false., &
4738 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
4739 s=almo_scf_env%matrix_s(1), &
4740 sigma=almo_scf_env%matrix_sigma(ispin), &
4741 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
4743 algorithm=almo_scf_env%sigma_inv_algorithm, &
4744 inverse_accelerator=almo_scf_env%order_lanczos, &
4745 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
4746 eps_lanczos=almo_scf_env%eps_lanczos, &
4747 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
4748 para_env=almo_scf_env%para_env, &
4749 blacs_env=almo_scf_env%blacs_env)
4751 IF (almo_scf_env%nspins == 1) &
4752 CALL dbcsr_scale(almo_scf_env%matrix_p(ispin), &
4760 IF (.NOT. almo_scf_env%s_inv_done)
THEN
4761 IF (unit_nr > 0)
THEN
4762 WRITE (unit_nr, *)
"Inverting AO overlap matrix"
4764 CALL dbcsr_create(almo_scf_env%matrix_s_inv(1), &
4765 template=almo_scf_env%matrix_s(1), &
4766 matrix_type=dbcsr_type_no_symmetry)
4767 IF (.NOT. almo_scf_env%s_sqrt_done)
THEN
4769 almo_scf_env%matrix_s(1), &
4770 threshold=almo_scf_env%eps_filter)
4772 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_s_sqrt_inv(1), &
4773 almo_scf_env%matrix_s_sqrt_inv(1), &
4774 0.0_dp, almo_scf_env%matrix_s_inv(1), &
4775 filter_eps=almo_scf_env%eps_filter)
4779 CALL dbcsr_create(matrix_tmp1, template=almo_scf_env%matrix_s(1), &
4780 matrix_type=dbcsr_type_no_symmetry)
4781 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_s_inv(1), &
4782 almo_scf_env%matrix_s(1), &
4783 0.0_dp, matrix_tmp1, &
4784 filter_eps=almo_scf_env%eps_filter)
4785 frob_matrix_base = dbcsr_frobenius_norm(matrix_tmp1)
4786 CALL dbcsr_add_on_diag(matrix_tmp1, -1.0_dp)
4787 frob_matrix = dbcsr_frobenius_norm(matrix_tmp1)
4788 IF (unit_nr > 0)
THEN
4789 WRITE (unit_nr, *)
"Error for (inv(S)*S-I)", &
4790 frob_matrix/frob_matrix_base
4792 CALL dbcsr_release(matrix_tmp1)
4795 almo_scf_env%s_inv_done = .true.
4810 ALLOCATE (matrix_p_almo_scf_converged(nspin))
4812 CALL dbcsr_create(matrix_p_almo_scf_converged(ispin), &
4813 template=almo_scf_env%matrix_p(ispin))
4814 CALL dbcsr_copy(matrix_p_almo_scf_converged(ispin), &
4815 almo_scf_env%matrix_p(ispin))
4821 nelectron_spin_real(1) = almo_scf_env%nelectrons_spin(ispin)
4822 IF (almo_scf_env%nspins == 1) &
4823 nelectron_spin_real(1) = nelectron_spin_real(1)/2
4825 local_mu(1) = sum(almo_scf_env%mu_of_domain(:, ispin))/almo_scf_env%ndomains
4831 cpabort(
"CVS only: density_matrix_sign has not been updated in SVN")
4842 almo_scf_env%mu = local_mu(1)
4853 IF (almo_scf_env%nspins == 1) &
4854 CALL dbcsr_scale(almo_scf_env%matrix_p(ispin), &
4866 CALL dbcsr_add(matrix_p_almo_scf_converged(ispin), &
4867 almo_scf_env%matrix_p(ispin), -1.0_dp, 1.0_dp)
4868 CALL dbcsr_dot(almo_scf_env%matrix_ks_0deloc(ispin), &
4869 matrix_p_almo_scf_converged(ispin), &
4870 energy_correction(ispin))
4872 energy_correction_final = energy_correction_final + energy_correction(ispin)
4874 IF (unit_nr > 0)
THEN
4876 WRITE (unit_nr,
'(T2,A,I6,F20.9)')
"ECORR", ispin, &
4877 energy_correction(ispin)
4884 CALL dbcsr_release(matrix_p_almo_scf_converged(ispin))
4886 DEALLOCATE (matrix_p_almo_scf_converged)
4892 IF (unit_nr > 0)
THEN
4894 WRITE (unit_nr,
'(T2,A,F18.9,F18.9,F18.9,F12.6)')
"ETOT", &
4895 almo_scf_env%almo_scf_energy, &
4896 energy_correction_final, &
4897 almo_scf_env%almo_scf_energy + energy_correction_final, &
4902 CALL timestop(handle)
4904 END SUBROUTINE harris_foulkes_correction
4926 SUBROUTINE opt_k_create_preconditioner(prec, vd_prop, f, x, oo_inv_x_tr, s, grad, &
4927 vd_blk, t, template_vd_vd_blk, template_vr_vr_blk, template_n_vr, &
4928 spin_factor, eps_filter)
4930 TYPE(dbcsr_type),
INTENT(INOUT) :: prec
4931 TYPE(dbcsr_type),
INTENT(IN) :: vd_prop, f, x, oo_inv_x_tr, s, grad, &
4932 vd_blk, t, template_vd_vd_blk, &
4933 template_vr_vr_blk, template_n_vr
4934 REAL(kind=
dp),
INTENT(IN) :: spin_factor, eps_filter
4936 CHARACTER(len=*),
PARAMETER :: routinen =
'opt_k_create_preconditioner'
4938 INTEGER :: handle, p_nrows, q_nrows
4939 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: p_diagonal, q_diagonal
4940 TYPE(dbcsr_type) :: pp_diag, qq_diag, t1, t2, tmp, &
4941 tmp1_n_vr, tmp2_n_vr, tmp_n_vd, &
4942 tmp_vd_vd_blk, tmp_vr_vr_blk
4951 CALL timeset(routinen, handle)
4954 CALL dbcsr_create(tmp, template=prec)
4956 CALL dbcsr_copy(tmp, prec)
4957 CALL dbcsr_set(tmp, 1.0_dp)
4960 CALL dbcsr_create(tmp_n_vd, template=vd_prop)
4961 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, f, vd_prop, &
4962 0.0_dp, tmp_n_vd, filter_eps=eps_filter)
4963 CALL dbcsr_create(tmp_vd_vd_blk, &
4964 template=template_vd_vd_blk)
4965 CALL dbcsr_copy(tmp_vd_vd_blk, template_vd_vd_blk)
4966 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, vd_prop, tmp_n_vd, &
4967 0.0_dp, tmp_vd_vd_blk, &
4968 retain_sparsity=.true., &
4969 filter_eps=eps_filter)
4971 CALL dbcsr_get_info(tmp_vd_vd_blk, nfullrows_total=q_nrows)
4972 ALLOCATE (q_diagonal(q_nrows))
4973 CALL dbcsr_get_diag(tmp_vd_vd_blk, q_diagonal)
4974 CALL dbcsr_create(qq_diag, &
4975 template=template_vd_vd_blk)
4976 CALL dbcsr_add_on_diag(qq_diag, 1.0_dp)
4977 CALL dbcsr_set_diag(qq_diag, q_diagonal)
4978 CALL dbcsr_create(t1, template=prec)
4979 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qq_diag, tmp, &
4980 0.0_dp, t1, filter_eps=eps_filter)
4983 CALL dbcsr_create(tmp_vr_vr_blk, template=template_vr_vr_blk)
4984 CALL dbcsr_copy(tmp_vr_vr_blk, template_vr_vr_blk)
4985 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, x, oo_inv_x_tr, &
4986 0.0_dp, tmp_vr_vr_blk, &
4987 retain_sparsity=.true., &
4988 filter_eps=eps_filter)
4990 CALL dbcsr_get_info(tmp_vr_vr_blk, nfullrows_total=p_nrows)
4991 ALLOCATE (p_diagonal(p_nrows))
4992 CALL dbcsr_get_diag(tmp_vr_vr_blk, p_diagonal)
4993 CALL dbcsr_create(pp_diag, template=template_vr_vr_blk)
4994 CALL dbcsr_add_on_diag(pp_diag, 1.0_dp)
4995 CALL dbcsr_set_diag(pp_diag, p_diagonal)
4996 CALL dbcsr_set(tmp, 1.0_dp)
4997 CALL dbcsr_create(t2, template=prec)
4998 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp, pp_diag, &
4999 0.0_dp, t2, filter_eps=eps_filter)
5001 CALL dbcsr_hadamard_product(t1, t2, prec)
5004 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, s, vd_prop, &
5005 0.0_dp, tmp_n_vd, filter_eps=eps_filter)
5006 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, vd_prop, tmp_n_vd, &
5007 0.0_dp, tmp_vd_vd_blk, &
5008 retain_sparsity=.true., &
5009 filter_eps=eps_filter)
5011 CALL dbcsr_get_diag(tmp_vd_vd_blk, q_diagonal)
5012 CALL dbcsr_add_on_diag(qq_diag, 1.0_dp)
5013 CALL dbcsr_set_diag(qq_diag, q_diagonal)
5014 CALL dbcsr_set(tmp, 1.0_dp)
5015 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qq_diag, tmp, &
5016 0.0_dp, t1, filter_eps=eps_filter)
5019 CALL dbcsr_create(tmp1_n_vr, template=template_n_vr)
5020 CALL dbcsr_create(tmp2_n_vr, template=template_n_vr)
5021 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, t, oo_inv_x_tr, &
5022 0.0_dp, tmp1_n_vr, filter_eps=eps_filter)
5023 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, f, tmp1_n_vr, &
5024 0.0_dp, tmp2_n_vr, filter_eps=eps_filter)
5025 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, tmp1_n_vr, tmp2_n_vr, &
5026 0.0_dp, tmp_vr_vr_blk, &
5027 retain_sparsity=.true., &
5028 filter_eps=eps_filter)
5030 CALL dbcsr_get_diag(tmp_vr_vr_blk, p_diagonal)
5031 CALL dbcsr_add_on_diag(pp_diag, 1.0_dp)
5032 CALL dbcsr_set_diag(pp_diag, p_diagonal)
5033 CALL dbcsr_set(tmp, 1.0_dp)
5034 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp, pp_diag, &
5035 0.0_dp, t2, filter_eps=eps_filter)
5037 CALL dbcsr_hadamard_product(t1, t2, tmp)
5038 CALL dbcsr_add(prec, tmp, 1.0_dp, -1.0_dp)
5039 CALL dbcsr_scale(prec, 2.0_dp*spin_factor)
5042 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, s, vd_blk, &
5043 0.0_dp, tmp_n_vd, filter_eps=eps_filter)
5044 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, tmp_n_vd, tmp1_n_vr, &
5045 0.0_dp, tmp, retain_sparsity=.true., &
5046 filter_eps=eps_filter)
5047 CALL dbcsr_hadamard_product(grad, tmp, t1)
5049 CALL dbcsr_scale(t1, -2.0_dp)
5051 CALL dbcsr_add(prec, t1, 1.0_dp, 1.0_dp)
5053 CALL dbcsr_function_of_elements(prec, dbcsr_func_inverse)
5054 CALL dbcsr_filter(prec, eps_filter)
5056 DEALLOCATE (q_diagonal)
5057 DEALLOCATE (p_diagonal)
5058 CALL dbcsr_release(tmp)
5059 CALL dbcsr_release(qq_diag)
5060 CALL dbcsr_release(t1)
5061 CALL dbcsr_release(pp_diag)
5062 CALL dbcsr_release(t2)
5063 CALL dbcsr_release(tmp_n_vd)
5064 CALL dbcsr_release(tmp_vd_vd_blk)
5065 CALL dbcsr_release(tmp_vr_vr_blk)
5066 CALL dbcsr_release(tmp1_n_vr)
5067 CALL dbcsr_release(tmp2_n_vr)
5069 CALL timestop(handle)
5071 END SUBROUTINE opt_k_create_preconditioner
5086 SUBROUTINE opt_k_create_preconditioner_blk(almo_scf_env, vd_prop, oo_inv_x_tr, &
5087 t_curr, ispin, spin_factor)
5089 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
5090 TYPE(dbcsr_type),
INTENT(IN) :: vd_prop, oo_inv_x_tr, t_curr
5091 INTEGER,
INTENT(IN) :: ispin
5092 REAL(kind=
dp),
INTENT(IN) :: spin_factor
5094 CHARACTER(len=*),
PARAMETER :: routinen =
'opt_k_create_preconditioner_blk'
5097 REAL(kind=
dp) :: eps_filter
5098 TYPE(dbcsr_type) :: opt_k_e_dd, opt_k_e_rr, s_dd_sqrt, &
5099 s_rr_sqrt, t1, tmp, tmp1_n_vr, &
5100 tmp2_n_vr, tmp_n_vd, tmp_vd_vd_blk, &
5105 CALL timeset(routinen, handle)
5107 eps_filter = almo_scf_env%eps_filter
5110 CALL dbcsr_create(tmp_n_vd, template=almo_scf_env%matrix_v_disc(ispin))
5111 CALL dbcsr_create(tmp_vd_vd_blk, &
5112 template=almo_scf_env%matrix_vv_disc_blk(ispin), &
5113 matrix_type=dbcsr_type_no_symmetry)
5114 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5115 almo_scf_env%matrix_s(1), &
5117 0.0_dp, tmp_n_vd, filter_eps=eps_filter)
5118 CALL dbcsr_copy(tmp_vd_vd_blk, &
5119 almo_scf_env%matrix_vv_disc_blk(ispin))
5120 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, vd_prop, tmp_n_vd, &
5121 0.0_dp, tmp_vd_vd_blk, &
5122 retain_sparsity=.true.)
5124 CALL dbcsr_create(s_dd_sqrt, &
5125 template=almo_scf_env%matrix_vv_disc_blk(ispin), &
5126 matrix_type=dbcsr_type_no_symmetry)
5128 almo_scf_env%opt_k_t_dd(ispin), &
5130 threshold=eps_filter, &
5131 order=almo_scf_env%order_lanczos, &
5132 eps_lanczos=almo_scf_env%eps_lanczos, &
5133 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
5136 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5137 almo_scf_env%matrix_ks_0deloc(ispin), &
5139 0.0_dp, tmp_n_vd, filter_eps=eps_filter)
5140 CALL dbcsr_copy(tmp_vd_vd_blk, &
5141 almo_scf_env%matrix_vv_disc_blk(ispin))
5142 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, vd_prop, tmp_n_vd, &
5143 0.0_dp, tmp_vd_vd_blk, &
5144 retain_sparsity=.true.)
5145 CALL dbcsr_release(tmp_n_vd)
5148 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5150 almo_scf_env%opt_k_t_dd(ispin), &
5151 0.0_dp, s_dd_sqrt, filter_eps=eps_filter)
5152 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5153 almo_scf_env%opt_k_t_dd(ispin), &
5155 0.0_dp, tmp_vd_vd_blk, filter_eps=eps_filter)
5158 CALL dbcsr_create(opt_k_e_dd, &
5159 template=almo_scf_env%matrix_vv_disc_blk(ispin))
5160 CALL dbcsr_release(s_dd_sqrt)
5161 CALL dbcsr_create(s_dd_sqrt, &
5162 template=almo_scf_env%matrix_vv_disc_blk(ispin), &
5163 matrix_type=dbcsr_type_no_symmetry)
5170 CALL dbcsr_copy(tmp_vd_vd_blk, &
5171 almo_scf_env%opt_k_t_dd(ispin))
5172 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5175 0.0_dp, almo_scf_env%opt_k_t_dd(ispin), &
5176 filter_eps=eps_filter)
5177 CALL dbcsr_release(s_dd_sqrt)
5178 CALL dbcsr_release(tmp_vd_vd_blk)
5181 CALL dbcsr_create(tmp, &
5182 template=almo_scf_env%matrix_k_blk_ones(ispin))
5183 CALL dbcsr_copy(tmp, &
5184 almo_scf_env%matrix_k_blk_ones(ispin))
5185 CALL dbcsr_create(t1, &
5186 template=almo_scf_env%matrix_k_blk_ones(ispin))
5187 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5189 0.0_dp, t1, filter_eps=eps_filter)
5190 CALL dbcsr_release(opt_k_e_dd)
5193 CALL dbcsr_create(tmp_vr_vr_blk, &
5194 template=almo_scf_env%matrix_sigma_vv_blk(ispin), &
5195 matrix_type=dbcsr_type_no_symmetry)
5196 CALL dbcsr_copy(tmp_vr_vr_blk, &
5197 almo_scf_env%matrix_sigma_vv_blk(ispin))
5198 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5199 almo_scf_env%matrix_x(ispin), &
5201 0.0_dp, tmp_vr_vr_blk, &
5202 retain_sparsity=.true.)
5205 CALL dbcsr_create(s_rr_sqrt, &
5206 template=almo_scf_env%matrix_sigma_vv_blk(ispin), &
5207 matrix_type=dbcsr_type_no_symmetry)
5209 almo_scf_env%opt_k_t_rr(ispin), &
5211 threshold=eps_filter, &
5212 order=almo_scf_env%order_lanczos, &
5213 eps_lanczos=almo_scf_env%eps_lanczos, &
5214 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
5217 CALL dbcsr_create(tmp1_n_vr, &
5218 template=almo_scf_env%matrix_v(ispin))
5219 CALL dbcsr_create(tmp2_n_vr, &
5220 template=almo_scf_env%matrix_v(ispin))
5221 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, t_curr, oo_inv_x_tr, &
5222 0.0_dp, tmp1_n_vr, filter_eps=eps_filter)
5223 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5224 almo_scf_env%matrix_ks_0deloc(ispin), &
5226 0.0_dp, tmp2_n_vr, filter_eps=eps_filter)
5227 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, tmp1_n_vr, tmp2_n_vr, &
5228 0.0_dp, tmp_vr_vr_blk, &
5229 retain_sparsity=.true.)
5230 CALL dbcsr_release(tmp1_n_vr)
5231 CALL dbcsr_release(tmp2_n_vr)
5234 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5236 almo_scf_env%opt_k_t_rr(ispin), &
5237 0.0_dp, s_rr_sqrt, filter_eps=eps_filter)
5238 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5239 almo_scf_env%opt_k_t_rr(ispin), &
5241 0.0_dp, tmp_vr_vr_blk, filter_eps=eps_filter)
5244 CALL dbcsr_create(opt_k_e_rr, &
5245 template=almo_scf_env%matrix_sigma_vv_blk(ispin))
5246 CALL dbcsr_release(s_rr_sqrt)
5247 CALL dbcsr_create(s_rr_sqrt, &
5248 template=almo_scf_env%matrix_sigma_vv_blk(ispin), &
5249 matrix_type=dbcsr_type_no_symmetry)
5256 CALL dbcsr_copy(tmp_vr_vr_blk, &
5257 almo_scf_env%opt_k_t_rr(ispin))
5258 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5261 0.0_dp, almo_scf_env%opt_k_t_rr(ispin), &
5262 filter_eps=eps_filter)
5263 CALL dbcsr_release(s_rr_sqrt)
5264 CALL dbcsr_release(tmp_vr_vr_blk)
5267 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5269 0.0_dp, almo_scf_env%opt_k_denom(ispin), &
5270 filter_eps=eps_filter)
5271 CALL dbcsr_release(opt_k_e_rr)
5272 CALL dbcsr_release(tmp)
5275 CALL dbcsr_add(almo_scf_env%opt_k_denom(ispin), t1, &
5277 CALL dbcsr_release(t1)
5278 CALL dbcsr_scale(almo_scf_env%opt_k_denom(ispin), &
5281 CALL dbcsr_function_of_elements(almo_scf_env%opt_k_denom(ispin), &
5283 CALL dbcsr_filter(almo_scf_env%opt_k_denom(ispin), &
5286 CALL timestop(handle)
5288 END SUBROUTINE opt_k_create_preconditioner_blk
5302 SUBROUTINE opt_k_apply_preconditioner_blk(almo_scf_env, step, grad, ispin)
5304 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
5305 TYPE(dbcsr_type),
INTENT(OUT) :: step
5306 TYPE(dbcsr_type),
INTENT(IN) :: grad
5307 INTEGER,
INTENT(IN) :: ispin
5309 CHARACTER(len=*),
PARAMETER :: routinen =
'opt_k_apply_preconditioner_blk'
5312 REAL(kind=
dp) :: eps_filter
5313 TYPE(dbcsr_type) :: tmp_k
5315 CALL timeset(routinen, handle)
5317 eps_filter = almo_scf_env%eps_filter
5319 CALL dbcsr_create(tmp_k, template=almo_scf_env%matrix_k_blk(ispin))
5322 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5323 grad, almo_scf_env%opt_k_t_rr(ispin), &
5324 0.0_dp, tmp_k, filter_eps=eps_filter)
5325 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
5326 almo_scf_env%opt_k_t_dd(ispin), tmp_k, &
5327 0.0_dp, step, filter_eps=eps_filter)
5330 CALL dbcsr_hadamard_product(step, &
5331 almo_scf_env%opt_k_denom(ispin), tmp_k)
5334 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
5335 almo_scf_env%opt_k_t_dd(ispin), tmp_k, &
5336 0.0_dp, step, filter_eps=eps_filter)
5337 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
5338 step, almo_scf_env%opt_k_t_rr(ispin), &
5339 0.0_dp, tmp_k, filter_eps=eps_filter)
5341 CALL dbcsr_copy(step, tmp_k)
5343 CALL dbcsr_release(tmp_k)
5345 CALL timestop(handle)
5347 END SUBROUTINE opt_k_apply_preconditioner_blk
5950 SUBROUTINE compute_gradient(m_grad_out, m_ks, m_s, m_t, m_t0, &
5951 m_siginv, m_quench_t, m_FTsiginv, m_siginvTFTsiginv, m_ST, m_STsiginv0, &
5952 m_theta, domain_s_inv, domain_r_down, &
5953 cpu_of_domain, domain_map, assume_t0_q0x, optimize_theta, &
5954 normalize_orbitals, penalty_occ_vol, penalty_occ_local, &
5955 penalty_occ_vol_prefactor, envelope_amplitude, eps_filter, spin_factor, &
5956 special_case, m_sig_sqrti_ii, op_sm_set, weights, energy_coeff, &
5959 TYPE(dbcsr_type),
INTENT(INOUT) :: m_grad_out
5960 TYPE(dbcsr_type),
INTENT(IN) :: m_ks, m_s, m_t, m_t0, m_siginv, &
5961 m_quench_t, m_ftsiginv, &
5962 m_siginvtftsiginv, m_st, m_stsiginv0, &
5964 TYPE(domain_submatrix_type),
DIMENSION(:), &
5965 INTENT(IN) :: domain_s_inv, domain_r_down
5966 INTEGER,
DIMENSION(:),
INTENT(IN) :: cpu_of_domain
5967 TYPE(domain_map_type),
INTENT(IN) :: domain_map
5968 LOGICAL,
INTENT(IN) :: assume_t0_q0x, optimize_theta, &
5969 normalize_orbitals, penalty_occ_vol
5970 LOGICAL,
INTENT(IN),
OPTIONAL :: penalty_occ_local
5971 REAL(kind=
dp),
INTENT(IN) :: penalty_occ_vol_prefactor, &
5972 envelope_amplitude, eps_filter, &
5974 INTEGER,
INTENT(IN) :: special_case
5975 TYPE(dbcsr_type),
INTENT(IN),
OPTIONAL :: m_sig_sqrti_ii
5976 TYPE(dbcsr_p_type),
DIMENSION(:, :),
OPTIONAL, &
5977 POINTER :: op_sm_set
5978 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN),
OPTIONAL :: weights
5979 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: energy_coeff, localiz_coeff
5981 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_gradient'
5983 INTEGER :: dim0, handle, idim0, nao, reim
5984 LOGICAL :: my_penalty_local
5985 REAL(kind=
dp) :: coeff, energy_g_norm, my_energy_coeff, &
5987 penalty_occ_vol_g_norm
5988 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: tg_diagonal
5989 TYPE(dbcsr_type) :: m_tmp_no_1, m_tmp_no_2, m_tmp_no_3, &
5990 m_tmp_oo_1, m_tmp_oo_2, temp1, temp2, &
5991 tempnocc1, tempoccocc1
5993 CALL timeset(routinen, handle)
5995 IF (normalize_orbitals .AND. (.NOT.
PRESENT(m_sig_sqrti_ii)))
THEN
5996 cpabort(
"Normalization matrix is required")
5999 my_penalty_local = .false.
6000 my_localiz_coeff = 1.0_dp
6001 my_energy_coeff = 0.0_dp
6002 IF (
PRESENT(localiz_coeff))
THEN
6003 my_localiz_coeff = localiz_coeff
6005 IF (
PRESENT(energy_coeff))
THEN
6006 my_energy_coeff = energy_coeff
6008 IF (
PRESENT(penalty_occ_local))
THEN
6009 my_penalty_local = penalty_occ_local
6013 CALL dbcsr_get_info(matrix=m_ks, nfullrows_total=nao)
6014 CALL dbcsr_get_info(matrix=m_s, nfullrows_total=nao)
6015 CALL dbcsr_get_info(matrix=m_t, nfullrows_total=nao)
6017 CALL dbcsr_create(m_tmp_no_1, &
6018 template=m_quench_t, &
6019 matrix_type=dbcsr_type_no_symmetry)
6020 CALL dbcsr_create(m_tmp_no_2, &
6021 template=m_quench_t, &
6022 matrix_type=dbcsr_type_no_symmetry)
6023 CALL dbcsr_create(m_tmp_no_3, &
6024 template=m_quench_t, &
6025 matrix_type=dbcsr_type_no_symmetry)
6026 CALL dbcsr_create(m_tmp_oo_1, &
6027 template=m_siginv, &
6028 matrix_type=dbcsr_type_no_symmetry)
6029 CALL dbcsr_create(m_tmp_oo_2, &
6030 template=m_siginv, &
6031 matrix_type=dbcsr_type_no_symmetry)
6032 CALL dbcsr_create(tempnocc1, &
6034 matrix_type=dbcsr_type_no_symmetry)
6035 CALL dbcsr_create(tempoccocc1, &
6036 template=m_siginv, &
6037 matrix_type=dbcsr_type_no_symmetry)
6038 CALL dbcsr_create(temp1, &
6040 matrix_type=dbcsr_type_no_symmetry)
6041 CALL dbcsr_create(temp2, &
6043 matrix_type=dbcsr_type_no_symmetry)
6059 CALL dbcsr_copy(m_tmp_no_2, m_quench_t)
6060 CALL dbcsr_copy(m_tmp_no_2, m_ftsiginv, keep_sparsity=.true.)
6083 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
6085 m_siginvtftsiginv, &
6086 1.0_dp, m_tmp_no_2, &
6087 retain_sparsity=.true.)
6088 CALL dbcsr_scale(m_tmp_no_2, 2.0_dp*spin_factor)
6091 IF (my_penalty_local)
THEN
6093 CALL dbcsr_set(temp2, 0.0_dp)
6095 DO idim0 = 1,
SIZE(op_sm_set, 2)
6097 DO reim = 1,
SIZE(op_sm_set, 1)
6099 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6100 op_sm_set(reim, idim0)%matrix, &
6102 0.0_dp, tempnocc1, &
6103 filter_eps=eps_filter)
6106 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6109 0.0_dp, tempoccocc1, &
6110 filter_eps=eps_filter)
6112 CALL dbcsr_get_info(tempoccocc1, nfullrows_total=dim0)
6113 ALLOCATE (tg_diagonal(dim0))
6114 CALL dbcsr_get_diag(tempoccocc1, tg_diagonal)
6115 CALL dbcsr_set(tempoccocc1, 0.0_dp)
6116 CALL dbcsr_set_diag(tempoccocc1, tg_diagonal)
6117 DEALLOCATE (tg_diagonal)
6119 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6123 filter_eps=eps_filter)
6129 cpabort(
"Localization function is not implemented")
6132 coeff = -weights(idim0)
6134 cpabort(
"Localization function is not implemented")
6137 CALL dbcsr_add(temp2, temp1, 1.0_dp, coeff)
6141 CALL dbcsr_add(m_tmp_no_2, temp2, my_energy_coeff, my_localiz_coeff*4.0_dp)
6145 IF (penalty_occ_vol)
THEN
6153 CALL dbcsr_copy(m_tmp_no_1, m_quench_t)
6154 CALL dbcsr_multiply(
"N",
"N", &
6155 penalty_occ_vol_prefactor, &
6158 0.0_dp, m_tmp_no_1, &
6159 retain_sparsity=.true.)
6161 CALL dbcsr_norm(m_tmp_no_1, dbcsr_norm_maxabsnorm, &
6162 norm_scalar=penalty_occ_vol_g_norm)
6163 CALL dbcsr_norm(m_tmp_no_2, dbcsr_norm_maxabsnorm, &
6164 norm_scalar=energy_g_norm)
6166 CALL dbcsr_add(m_tmp_no_2, m_tmp_no_1, 1.0_dp, 1.0_dp)
6170 IF (normalize_orbitals)
THEN
6191 CALL dbcsr_copy(m_tmp_no_1, m_quench_t)
6192 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6195 0.0_dp, m_tmp_no_1, &
6196 retain_sparsity=.true.)
6199 CALL dbcsr_copy(m_tmp_oo_1, m_sig_sqrti_ii)
6200 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6203 0.0_dp, m_tmp_oo_1, &
6204 retain_sparsity=.true.)
6206 CALL dbcsr_get_info(m_sig_sqrti_ii, nfullrows_total=dim0)
6207 ALLOCATE (tg_diagonal(dim0))
6208 CALL dbcsr_get_diag(m_tmp_oo_1, tg_diagonal)
6209 CALL dbcsr_set(m_tmp_oo_1, 0.0_dp)
6210 CALL dbcsr_set_diag(m_tmp_oo_1, tg_diagonal)
6211 DEALLOCATE (tg_diagonal)
6213 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6216 0.0_dp, m_tmp_oo_2, &
6217 filter_eps=eps_filter)
6218 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
6221 1.0_dp, m_tmp_no_1, &
6222 retain_sparsity=.true.)
6226 CALL dbcsr_copy(m_tmp_no_1, m_tmp_no_2)
6231 IF (assume_t0_q0x)
THEN
6233 CALL dbcsr_copy(m_grad_out, m_tmp_no_1)
6234 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6237 0.0_dp, m_tmp_oo_1, &
6238 filter_eps=eps_filter)
6239 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
6242 1.0_dp, m_grad_out, &
6243 filter_eps=eps_filter)
6245 cpabort(
"Cannot project the zero-order space from itself")
6249 matrix_in=m_tmp_no_1, &
6250 matrix_out=m_grad_out, &
6251 operator2=domain_r_down(:), &
6252 operator1=domain_s_inv(:), &
6253 dpattern=m_quench_t, &
6255 node_of_domain=cpu_of_domain, &
6257 filter_eps=eps_filter, &
6259 use_trimmer=.false.)
6261 CALL dbcsr_copy(m_tmp_no_1, m_grad_out)
6296 IF (optimize_theta)
THEN
6297 CALL dbcsr_copy(m_tmp_no_2, m_theta)
6298 CALL dbcsr_function_of_elements(m_tmp_no_2, &
6300 func=dbcsr_func_dtanh, &
6302 a1=1.0_dp/envelope_amplitude)
6303 CALL dbcsr_scale(m_tmp_no_2, &
6305 CALL dbcsr_set(m_tmp_no_3, 0.0_dp)
6306 CALL dbcsr_filter(m_tmp_no_3, eps_filter)
6307 CALL dbcsr_hadamard_product(m_tmp_no_1, &
6310 b_assume_value=1.0_dp)
6311 CALL dbcsr_hadamard_product(m_tmp_no_3, &
6315 CALL dbcsr_hadamard_product(m_tmp_no_1, &
6319 CALL dbcsr_filter(m_grad_out, eps_filter)
6321 CALL dbcsr_release(m_tmp_no_1)
6322 CALL dbcsr_release(m_tmp_no_2)
6323 CALL dbcsr_release(m_tmp_no_3)
6324 CALL dbcsr_release(m_tmp_oo_1)
6325 CALL dbcsr_release(m_tmp_oo_2)
6326 CALL dbcsr_release(tempnocc1)
6327 CALL dbcsr_release(tempoccocc1)
6328 CALL dbcsr_release(temp1)
6329 CALL dbcsr_release(temp2)
6331 CALL timestop(handle)
6333 END SUBROUTINE compute_gradient
6343 SUBROUTINE print_mathematica_matrix(matrix, filename)
6345 TYPE(dbcsr_type),
INTENT(IN) :: matrix
6346 CHARACTER(len=*),
INTENT(IN) :: filename
6348 CHARACTER(len=*),
PARAMETER :: routinen =
'print_mathematica_matrix'
6350 CHARACTER(LEN=20) :: formatstr, scols
6351 INTEGER :: col, fiunit, handle, hori_offset, jj, &
6352 nblkcols_tot, nblkrows_tot, ncols, &
6353 ncores, nrows, row, unit_nr, &
6355 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ao_block_sizes, mo_block_sizes
6356 INTEGER,
DIMENSION(:),
POINTER :: ao_blk_sizes, mo_blk_sizes
6358 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: h
6359 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block_p
6360 TYPE(cp_logger_type),
POINTER :: logger
6361 TYPE(dbcsr_distribution_type) :: dist
6362 TYPE(dbcsr_type) :: matrix_asym
6364 CALL timeset(routinen, handle)
6368 IF (logger%para_env%is_source())
THEN
6375 CALL dbcsr_get_info(matrix, distribution=dist)
6376 CALL dbcsr_distribution_get(dist, numnodes=ncores)
6377 IF (ncores .GT. 1)
THEN
6378 cpabort(
"mathematica files: serial code only")
6381 nblkrows_tot = dbcsr_nblkrows_total(matrix)
6382 nblkcols_tot = dbcsr_nblkcols_total(matrix)
6383 cpassert(nblkrows_tot == nblkcols_tot)
6384 CALL dbcsr_get_info(matrix, row_blk_size=ao_blk_sizes)
6385 CALL dbcsr_get_info(matrix, col_blk_size=mo_blk_sizes)
6386 ALLOCATE (mo_block_sizes(nblkcols_tot), ao_block_sizes(nblkcols_tot))
6387 mo_block_sizes(:) = mo_blk_sizes(:)
6388 ao_block_sizes(:) = ao_blk_sizes(:)
6390 CALL dbcsr_create(matrix_asym, &
6392 matrix_type=dbcsr_type_no_symmetry)
6393 CALL dbcsr_desymmetrize(matrix, matrix_asym)
6395 ncols = sum(mo_block_sizes)
6396 nrows = sum(ao_block_sizes)
6397 ALLOCATE (h(nrows, ncols))
6401 DO col = 1, nblkcols_tot
6404 DO row = 1, nblkrows_tot
6406 CALL dbcsr_get_block_p(matrix_asym, row, col, block_p, found)
6409 h(vert_offset + 1:vert_offset + ao_block_sizes(row), &
6410 hori_offset + 1:hori_offset + mo_block_sizes(col)) &
6415 vert_offset = vert_offset + ao_block_sizes(row)
6419 hori_offset = hori_offset + mo_block_sizes(col)
6423 CALL dbcsr_release(matrix_asym)
6425 IF (unit_nr > 0)
THEN
6426 CALL open_file(filename, unit_number=fiunit, file_status=
'REPLACE')
6427 WRITE (scols,
"(I10)") ncols
6428 formatstr =
"("//trim(scols)//
"E27.17)"
6430 WRITE (fiunit, formatstr) h(jj, :)
6435 DEALLOCATE (mo_block_sizes)
6436 DEALLOCATE (ao_block_sizes)
6439 CALL timestop(handle)
6441 END SUBROUTINE print_mathematica_matrix
6463 SUBROUTINE compute_obj_nlmos(localization_obj_function_ispin, penalty_func_ispin, &
6464 penalty_vol_prefactor, overlap_determinant, m_sigma, nocc, m_B0, &
6465 m_theta_normalized, template_matrix_mo, weights, m_S0, just_started, &
6466 penalty_amplitude, eps_filter)
6468 REAL(kind=
dp),
INTENT(INOUT) :: localization_obj_function_ispin, penalty_func_ispin, &
6469 penalty_vol_prefactor, overlap_determinant
6470 TYPE(dbcsr_type),
INTENT(INOUT) :: m_sigma
6471 INTEGER,
INTENT(IN) :: nocc
6472 TYPE(dbcsr_type),
DIMENSION(:, :),
INTENT(IN) :: m_b0
6473 TYPE(dbcsr_type),
INTENT(IN) :: m_theta_normalized, template_matrix_mo
6474 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: weights
6475 TYPE(dbcsr_type),
INTENT(IN) :: m_s0
6476 LOGICAL,
INTENT(IN) :: just_started
6477 REAL(kind=
dp),
INTENT(IN) :: penalty_amplitude, eps_filter
6479 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_obj_nlmos'
6481 INTEGER :: handle, idim0, ielem, para_group_handle, &
6483 REAL(kind=
dp) :: det1, fval
6484 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: reim_diag, z2
6485 TYPE(dbcsr_type) :: tempnocc1, tempoccocc1, tempoccocc2
6486 TYPE(mp_comm_type) :: para_group
6488 CALL timeset(routinen, handle)
6490 CALL dbcsr_create(tempnocc1, &
6491 template=template_matrix_mo, &
6492 matrix_type=dbcsr_type_no_symmetry)
6493 CALL dbcsr_create(tempoccocc1, &
6494 template=m_theta_normalized, &
6495 matrix_type=dbcsr_type_no_symmetry)
6496 CALL dbcsr_create(tempoccocc2, &
6497 template=m_theta_normalized, &
6498 matrix_type=dbcsr_type_no_symmetry)
6500 localization_obj_function_ispin = 0.0_dp
6501 penalty_func_ispin = 0.0_dp
6503 ALLOCATE (reim_diag(nocc))
6505 CALL dbcsr_get_info(tempoccocc2, group=para_group_handle)
6506 CALL para_group%set_handle(para_group_handle)
6508 DO idim0 = 1,
SIZE(m_b0, 2)
6512 DO reim = 1,
SIZE(m_b0, 1)
6514 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6515 m_b0(reim, idim0), &
6516 m_theta_normalized, &
6517 0.0_dp, tempoccocc1, &
6518 filter_eps=eps_filter)
6519 CALL dbcsr_set(tempoccocc2, 0.0_dp)
6520 CALL dbcsr_add_on_diag(tempoccocc2, 1.0_dp)
6521 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6522 m_theta_normalized, &
6524 0.0_dp, tempoccocc2, &
6525 retain_sparsity=.true.)
6528 CALL dbcsr_get_diag(tempoccocc2, reim_diag)
6529 CALL para_group%sum(reim_diag)
6530 z2(:) = z2(:) + reim_diag(:)*reim_diag(:)
6537 fval = -weights(idim0)*log(abs(z2(ielem)))
6539 fval = weights(idim0) - weights(idim0)*abs(z2(ielem))
6541 fval = weights(idim0) - weights(idim0)*sqrt(abs(z2(ielem)))
6543 localization_obj_function_ispin = localization_obj_function_ispin + fval
6549 DEALLOCATE (reim_diag)
6551 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6553 m_theta_normalized, &
6554 0.0_dp, tempoccocc1, &
6555 filter_eps=eps_filter)
6557 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6558 m_theta_normalized, &
6561 filter_eps=eps_filter)
6566 overlap_determinant = det1
6568 IF (just_started .AND. penalty_amplitude .LT. 0.0_dp)
THEN
6569 penalty_vol_prefactor = -(-penalty_amplitude)*localization_obj_function_ispin
6571 penalty_func_ispin = penalty_func_ispin + penalty_vol_prefactor*log(det1)
6573 CALL dbcsr_release(tempnocc1)
6574 CALL dbcsr_release(tempoccocc1)
6575 CALL dbcsr_release(tempoccocc2)
6577 CALL timestop(handle)
6579 END SUBROUTINE compute_obj_nlmos
6597 SUBROUTINE compute_gradient_nlmos(m_grad_out, m_B0, weights, &
6598 m_S0, m_theta_normalized, m_siginv, m_sig_sqrti_ii, &
6599 penalty_vol_prefactor, eps_filter, suggested_vol_penalty)
6601 TYPE(dbcsr_type),
INTENT(INOUT) :: m_grad_out
6602 TYPE(dbcsr_type),
DIMENSION(:, :),
INTENT(IN) :: m_b0
6603 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: weights
6604 TYPE(dbcsr_type),
INTENT(IN) :: m_s0, m_theta_normalized, m_siginv, &
6606 REAL(kind=
dp),
INTENT(IN) :: penalty_vol_prefactor, eps_filter
6607 REAL(kind=
dp),
INTENT(INOUT) :: suggested_vol_penalty
6609 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_gradient_nlmos'
6611 INTEGER :: dim0, handle, idim0, reim
6612 REAL(kind=
dp) :: norm_loc, norm_vol
6613 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: tg_diagonal, z2
6614 TYPE(dbcsr_type) :: m_temp_oo_1, m_temp_oo_2, m_temp_oo_3, &
6617 CALL timeset(routinen, handle)
6619 CALL dbcsr_create(m_temp_oo_1, &
6620 template=m_theta_normalized, &
6621 matrix_type=dbcsr_type_no_symmetry)
6622 CALL dbcsr_create(m_temp_oo_2, &
6623 template=m_theta_normalized, &
6624 matrix_type=dbcsr_type_no_symmetry)
6625 CALL dbcsr_create(m_temp_oo_3, &
6626 template=m_theta_normalized, &
6627 matrix_type=dbcsr_type_no_symmetry)
6628 CALL dbcsr_create(m_temp_oo_4, &
6629 template=m_theta_normalized, &
6630 matrix_type=dbcsr_type_no_symmetry)
6632 CALL dbcsr_get_info(m_siginv, nfullrows_total=dim0)
6633 ALLOCATE (tg_diagonal(dim0))
6635 CALL dbcsr_set(m_temp_oo_1, 0.0_dp)
6638 DO idim0 = 1,
SIZE(m_b0, 2)
6641 CALL dbcsr_set(m_temp_oo_2, 0.0_dp)
6642 DO reim = 1,
SIZE(m_b0, 1)
6644 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6645 m_b0(reim, idim0), &
6646 m_theta_normalized, &
6647 0.0_dp, m_temp_oo_3, &
6648 filter_eps=eps_filter)
6652 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6653 m_theta_normalized, &
6655 0.0_dp, m_temp_oo_4, &
6656 filter_eps=eps_filter)
6658 tg_diagonal(:) = 0.0_dp
6659 CALL dbcsr_get_diag(m_temp_oo_4, tg_diagonal)
6660 CALL dbcsr_set(m_temp_oo_4, 0.0_dp)
6661 CALL dbcsr_set_diag(m_temp_oo_4, tg_diagonal)
6663 z2(:) = z2(:) + tg_diagonal(:)*tg_diagonal(:)
6665 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6668 1.0_dp, m_temp_oo_2, &
6669 filter_eps=eps_filter)
6677 z2(:) = -weights(idim0)/z2(:)
6679 z2(:) = -weights(idim0)
6681 z2(:) = -weights(idim0)/(2*sqrt(z2(:)))
6683 CALL dbcsr_set(m_temp_oo_3, 0.0_dp)
6684 CALL dbcsr_set_diag(m_temp_oo_3, z2)
6688 CALL dbcsr_multiply(
"N",
"N", 4.0_dp, &
6691 1.0_dp, m_temp_oo_1, &
6692 filter_eps=eps_filter)
6698 CALL dbcsr_multiply(
"N",
"N", &
6701 m_theta_normalized, &
6702 0.0_dp, m_temp_oo_2, &
6703 filter_eps=eps_filter)
6707 CALL dbcsr_multiply(
"N",
"N", &
6711 0.0_dp, m_temp_oo_3, &
6712 filter_eps=eps_filter)
6713 CALL dbcsr_norm(m_temp_oo_3, &
6714 dbcsr_norm_maxabsnorm, norm_scalar=norm_vol)
6715 CALL dbcsr_norm(m_temp_oo_1, &
6716 dbcsr_norm_maxabsnorm, norm_scalar=norm_loc)
6717 suggested_vol_penalty = norm_loc/norm_vol
6718 CALL dbcsr_add(m_temp_oo_1, m_temp_oo_3, &
6719 1.0_dp, 2.0_dp*penalty_vol_prefactor)
6724 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6727 0.0_dp, m_grad_out, &
6728 filter_eps=eps_filter)
6732 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6733 m_theta_normalized, &
6735 0.0_dp, m_temp_oo_3, &
6736 filter_eps=eps_filter)
6737 CALL dbcsr_get_diag(m_temp_oo_3, tg_diagonal)
6738 CALL dbcsr_set(m_temp_oo_3, 0.0_dp)
6739 CALL dbcsr_set_diag(m_temp_oo_3, tg_diagonal)
6743 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
6746 0.0_dp, m_temp_oo_1, &
6747 filter_eps=eps_filter)
6749 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
6752 1.0_dp, m_grad_out, &
6753 filter_eps=eps_filter)
6755 DEALLOCATE (tg_diagonal)
6756 CALL dbcsr_release(m_temp_oo_1)
6757 CALL dbcsr_release(m_temp_oo_2)
6758 CALL dbcsr_release(m_temp_oo_3)
6759 CALL dbcsr_release(m_temp_oo_4)
6761 CALL timestop(handle)
6763 END SUBROUTINE compute_gradient_nlmos
6794 SUBROUTINE compute_xalmos_from_main_var(m_var_in, m_t_out, m_quench_t, &
6795 m_t0, m_oo_template, m_STsiginv0, m_s, m_sig_sqrti_ii_out, domain_r_down, &
6796 domain_s_inv, domain_map, cpu_of_domain, assume_t0_q0x, just_started, &
6797 optimize_theta, normalize_orbitals, envelope_amplitude, eps_filter, &
6798 special_case, nocc_of_domain, order_lanczos, eps_lanczos, max_iter_lanczos)
6800 TYPE(dbcsr_type),
INTENT(IN) :: m_var_in
6801 TYPE(dbcsr_type),
INTENT(INOUT) :: m_t_out
6802 TYPE(dbcsr_type),
INTENT(IN) :: m_quench_t, m_t0, m_oo_template, &
6804 TYPE(dbcsr_type),
INTENT(INOUT) :: m_sig_sqrti_ii_out
6805 TYPE(domain_submatrix_type),
DIMENSION(:), &
6806 INTENT(IN) :: domain_r_down, domain_s_inv
6807 TYPE(domain_map_type),
INTENT(IN) :: domain_map
6808 INTEGER,
DIMENSION(:),
INTENT(IN) :: cpu_of_domain
6809 LOGICAL,
INTENT(IN) :: assume_t0_q0x, just_started, &
6810 optimize_theta, normalize_orbitals
6811 REAL(kind=
dp),
INTENT(IN) :: envelope_amplitude, eps_filter
6812 INTEGER,
INTENT(IN) :: special_case
6813 INTEGER,
DIMENSION(:),
INTENT(IN) :: nocc_of_domain
6814 INTEGER,
INTENT(IN) :: order_lanczos
6815 REAL(kind=
dp),
INTENT(IN) :: eps_lanczos
6816 INTEGER,
INTENT(IN) :: max_iter_lanczos
6818 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_xalmos_from_main_var'
6820 INTEGER :: handle, unit_nr
6821 REAL(kind=
dp) :: t_norm
6822 TYPE(cp_logger_type),
POINTER :: logger
6823 TYPE(dbcsr_type) :: m_tmp_no_1, m_tmp_oo_1
6825 CALL timeset(routinen, handle)
6829 IF (logger%para_env%is_source())
THEN
6835 CALL dbcsr_create(m_tmp_no_1, &
6836 template=m_quench_t, &
6837 matrix_type=dbcsr_type_no_symmetry)
6838 CALL dbcsr_create(m_tmp_oo_1, &
6839 template=m_oo_template, &
6840 matrix_type=dbcsr_type_no_symmetry)
6842 CALL dbcsr_copy(m_tmp_no_1, m_var_in)
6843 IF (optimize_theta)
THEN
6846 CALL dbcsr_norm(m_tmp_no_1, &
6847 dbcsr_norm_maxabsnorm, norm_scalar=t_norm)
6848 IF (unit_nr > 0)
THEN
6849 WRITE (unit_nr, *)
"Maximum norm of the initial guess: ", t_norm
6850 WRITE (unit_nr, *)
"Maximum allowed amplitude: ", &
6853 IF (t_norm .GT. envelope_amplitude .AND. just_started)
THEN
6854 cpabort(
"Max norm of the initial guess is too large")
6857 CALL dbcsr_function_of_elements(m_tmp_no_1, &
6858 func=dbcsr_func_tanh, &
6860 a1=1.0_dp/envelope_amplitude)
6861 CALL dbcsr_scale(m_tmp_no_1, &
6864 CALL dbcsr_hadamard_product(m_tmp_no_1, m_quench_t, &
6868 IF (assume_t0_q0x)
THEN
6870 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
6873 0.0_dp, m_tmp_oo_1, &
6874 filter_eps=eps_filter)
6875 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
6879 filter_eps=eps_filter)
6881 cpabort(
"cannot use projector with block-daigonal ALMOs")
6885 matrix_in=m_t_out, &
6886 matrix_out=m_tmp_no_1, &
6887 operator1=domain_r_down, &
6888 operator2=domain_s_inv, &
6889 dpattern=m_quench_t, &
6891 node_of_domain=cpu_of_domain, &
6893 filter_eps=eps_filter, &
6894 use_trimmer=.false.)
6895 CALL dbcsr_copy(m_t_out, &
6898 CALL dbcsr_add(m_t_out, &
6899 m_t0, 1.0_dp, 1.0_dp)
6902 IF (normalize_orbitals)
THEN
6905 overlap=m_tmp_oo_1, &
6907 retain_locality=.true., &
6908 only_normalize=.true., &
6909 nocc_of_domain=nocc_of_domain(:), &
6910 eps_filter=eps_filter, &
6911 order_lanczos=order_lanczos, &
6912 eps_lanczos=eps_lanczos, &
6913 max_iter_lanczos=max_iter_lanczos, &
6914 overlap_sqrti=m_sig_sqrti_ii_out)
6917 CALL dbcsr_filter(m_t_out, eps_filter)
6919 CALL dbcsr_release(m_tmp_no_1)
6920 CALL dbcsr_release(m_tmp_oo_1)
6922 CALL timestop(handle)
6924 END SUBROUTINE compute_xalmos_from_main_var
6962 SUBROUTINE compute_preconditioner(domain_prec_out, m_prec_out, m_ks, m_s, &
6963 m_siginv, m_quench_t, m_FTsiginv, m_siginvTFTsiginv, m_ST, &
6964 m_STsiginv_out, m_s_vv_out, m_f_vv_out, para_env, &
6965 blacs_env, nocc_of_domain, domain_s_inv, domain_s_inv_half, domain_s_half, &
6966 domain_r_down, cpu_of_domain, &
6967 domain_map, assume_t0_q0x, penalty_occ_vol, penalty_occ_vol_prefactor, &
6968 eps_filter, neg_thr, spin_factor, special_case, bad_modes_projector_down_out, &
6971 TYPE(domain_submatrix_type),
DIMENSION(:), &
6972 INTENT(INOUT) :: domain_prec_out
6973 TYPE(dbcsr_type),
INTENT(INOUT) :: m_prec_out, m_ks, m_s
6974 TYPE(dbcsr_type),
INTENT(IN) :: m_siginv, m_quench_t, m_ftsiginv, &
6975 m_siginvtftsiginv, m_st
6976 TYPE(dbcsr_type),
INTENT(INOUT),
OPTIONAL :: m_stsiginv_out, m_s_vv_out, m_f_vv_out
6977 TYPE(mp_para_env_type),
POINTER :: para_env
6978 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
6979 INTEGER,
DIMENSION(:),
INTENT(IN) :: nocc_of_domain
6980 TYPE(domain_submatrix_type),
DIMENSION(:), &
6981 INTENT(IN) :: domain_s_inv
6982 TYPE(domain_submatrix_type),
DIMENSION(:), &
6983 INTENT(IN),
OPTIONAL :: domain_s_inv_half, domain_s_half
6984 TYPE(domain_submatrix_type),
DIMENSION(:), &
6985 INTENT(IN) :: domain_r_down
6986 INTEGER,
DIMENSION(:),
INTENT(IN) :: cpu_of_domain
6987 TYPE(domain_map_type),
INTENT(IN) :: domain_map
6988 LOGICAL,
INTENT(IN) :: assume_t0_q0x, penalty_occ_vol
6989 REAL(kind=
dp),
INTENT(IN) :: penalty_occ_vol_prefactor, eps_filter, &
6990 neg_thr, spin_factor
6991 INTEGER,
INTENT(IN) :: special_case
6992 TYPE(domain_submatrix_type),
DIMENSION(:), &
6993 INTENT(INOUT),
OPTIONAL :: bad_modes_projector_down_out
6994 LOGICAL,
INTENT(IN) :: skip_inversion
6996 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_preconditioner'
6998 INTEGER :: handle, ndim, precond_domain_projector
6999 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: nn_diagonal
7000 TYPE(dbcsr_type) :: m_tmp_nn_1, m_tmp_no_3
7002 CALL timeset(routinen, handle)
7004 CALL dbcsr_create(m_tmp_nn_1, &
7006 matrix_type=dbcsr_type_no_symmetry)
7007 CALL dbcsr_create(m_tmp_no_3, &
7008 template=m_quench_t, &
7009 matrix_type=dbcsr_type_no_symmetry)
7018 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7021 0.0_dp, m_tmp_no_3, &
7022 filter_eps=eps_filter)
7023 CALL dbcsr_desymmetrize(m_s, m_tmp_nn_1)
7025 IF (
PRESENT(m_stsiginv_out))
THEN
7026 CALL dbcsr_copy(m_stsiginv_out, m_tmp_no_3)
7031 CALL dbcsr_multiply(
"N",
"T", -1.0_dp, &
7034 1.0_dp, m_tmp_nn_1, &
7035 filter_eps=eps_filter)
7038 IF (
PRESENT(m_s_vv_out))
THEN
7039 CALL dbcsr_copy(m_s_vv_out, m_tmp_nn_1)
7045 CALL dbcsr_desymmetrize(m_ks, m_prec_out)
7046 CALL dbcsr_multiply(
"N",
"T", -1.0_dp, &
7049 1.0_dp, m_prec_out, &
7050 filter_eps=eps_filter)
7051 CALL dbcsr_multiply(
"N",
"T", -1.0_dp, &
7054 1.0_dp, m_prec_out, &
7055 filter_eps=eps_filter)
7056 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7058 m_siginvtftsiginv, &
7059 0.0_dp, m_tmp_no_3, &
7060 filter_eps=eps_filter)
7061 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
7064 1.0_dp, m_prec_out, &
7065 filter_eps=eps_filter)
7067 IF (
PRESENT(m_f_vv_out))
THEN
7068 CALL dbcsr_copy(m_f_vv_out, m_prec_out)
7073 WRITE (unit_nr, *)
"prefactor0:", penalty_occ_vol_prefactor
7075 CALL dbcsr_desymmetrize(m_s, &
7081 CALL dbcsr_add(m_prec_out, m_tmp_nn_1, &
7084 CALL dbcsr_scale(m_prec_out, 2.0_dp*spin_factor)
7087 IF (penalty_occ_vol)
THEN
7088 CALL dbcsr_add(m_prec_out, m_tmp_nn_1, &
7089 1.0_dp, penalty_occ_vol_prefactor)
7093 CALL dbcsr_copy(m_tmp_nn_1, m_prec_out)
7098 IF (skip_inversion)
THEN
7101 CALL dbcsr_get_info(m_s, nfullrows_total=ndim)
7102 ALLOCATE (nn_diagonal(ndim))
7103 CALL dbcsr_get_diag(m_s, nn_diagonal)
7104 CALL dbcsr_set(m_prec_out, 0.0_dp)
7105 CALL dbcsr_set_diag(m_prec_out, nn_diagonal)
7106 CALL dbcsr_filter(m_prec_out, eps_filter)
7107 DEALLOCATE (nn_diagonal)
7109 CALL dbcsr_copy(m_prec_out, m_tmp_nn_1, keep_sparsity=.true.)
7114 matrix_in=m_tmp_nn_1, &
7115 matrix_out=m_prec_out, &
7116 nocc=nocc_of_domain(:) &
7123 IF (skip_inversion)
THEN
7124 CALL dbcsr_copy(m_prec_out, m_tmp_nn_1)
7129 para_env=para_env, &
7130 blacs_env=blacs_env)
7132 para_env=para_env, &
7133 blacs_env=blacs_env, &
7134 upper_to_full=.true.)
7137 CALL dbcsr_filter(m_prec_out, eps_filter)
7142 IF (assume_t0_q0x)
THEN
7143 precond_domain_projector = -1
7145 precond_domain_projector = 0
7150 IF (
PRESENT(bad_modes_projector_down_out))
THEN
7152 matrix_main=m_tmp_nn_1, &
7153 subm_s_inv=domain_s_inv(:), &
7154 subm_s_inv_half=domain_s_inv_half(:), &
7155 subm_s_half=domain_s_half(:), &
7156 subm_r_down=domain_r_down(:), &
7157 matrix_trimmer=m_quench_t, &
7158 dpattern=m_quench_t, &
7160 node_of_domain=cpu_of_domain, &
7162 use_trimmer=.false., &
7163 bad_modes_projector_down=bad_modes_projector_down_out(:), &
7164 eps_zero_eigenvalues=neg_thr, &
7165 my_action=precond_domain_projector, &
7166 skip_inversion=skip_inversion &
7170 matrix_main=m_tmp_nn_1, &
7171 subm_s_inv=domain_s_inv(:), &
7172 subm_r_down=domain_r_down(:), &
7173 matrix_trimmer=m_quench_t, &
7174 dpattern=m_quench_t, &
7176 node_of_domain=cpu_of_domain, &
7178 use_trimmer=.false., &
7180 my_action=precond_domain_projector, &
7181 skip_inversion=skip_inversion &
7248 CALL dbcsr_release(m_tmp_nn_1)
7249 CALL dbcsr_release(m_tmp_no_3)
7251 CALL timestop(handle)
7253 END SUBROUTINE compute_preconditioner
7271 SUBROUTINE compute_cg_beta(beta, numer, denom, reset_conjugator, conjugator, &
7272 grad, prev_grad, step, prev_step, prev_minus_prec_grad)
7274 REAL(kind=
dp),
INTENT(INOUT) :: beta
7275 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: numer, denom
7276 LOGICAL,
INTENT(INOUT) :: reset_conjugator
7277 INTEGER,
INTENT(IN) :: conjugator
7278 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: grad, prev_grad, step, prev_step
7279 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT), &
7280 OPTIONAL :: prev_minus_prec_grad
7282 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_cg_beta'
7284 INTEGER :: handle, i, nsize, unit_nr
7285 REAL(kind=
dp) :: den, kappa, my_denom, my_numer, &
7286 my_numer2, my_numer3, num, num2, num3, &
7288 TYPE(cp_logger_type),
POINTER :: logger
7289 TYPE(dbcsr_type) :: m_tmp_no_1
7291 CALL timeset(routinen, handle)
7295 IF (logger%para_env%is_source())
THEN
7301 IF (.NOT.
PRESENT(prev_minus_prec_grad))
THEN
7305 cpabort(
"conjugator needs more input")
7310 IF (
PRESENT(numer) .OR.
PRESENT(denom))
THEN
7314 cpabort(
"cannot return numer/denom")
7327 CALL dbcsr_create(m_tmp_no_1, &
7329 matrix_type=dbcsr_type_no_symmetry)
7331 SELECT CASE (conjugator)
7333 CALL dbcsr_copy(m_tmp_no_1, grad(i))
7334 CALL dbcsr_add(m_tmp_no_1, prev_grad(i), &
7336 CALL dbcsr_dot(m_tmp_no_1, step(i), num)
7337 CALL dbcsr_dot(m_tmp_no_1, prev_step(i), den)
7339 CALL dbcsr_dot(grad(i), step(i), num)
7340 CALL dbcsr_dot(prev_grad(i), prev_minus_prec_grad(i), den)
7342 CALL dbcsr_dot(prev_grad(i), prev_minus_prec_grad(i), den)
7343 CALL dbcsr_copy(m_tmp_no_1, grad(i))
7344 CALL dbcsr_add(m_tmp_no_1, prev_grad(i), 1.0_dp, -1.0_dp)
7345 CALL dbcsr_dot(m_tmp_no_1, step(i), num)
7347 CALL dbcsr_dot(grad(i), step(i), num)
7348 CALL dbcsr_dot(prev_grad(i), prev_step(i), den)
7350 CALL dbcsr_dot(prev_grad(i), prev_step(i), den)
7351 CALL dbcsr_copy(m_tmp_no_1, grad(i))
7352 CALL dbcsr_add(m_tmp_no_1, prev_grad(i), 1.0_dp, -1.0_dp)
7353 CALL dbcsr_dot(m_tmp_no_1, step(i), num)
7355 CALL dbcsr_dot(grad(i), step(i), num)
7356 CALL dbcsr_copy(m_tmp_no_1, grad(i))
7357 CALL dbcsr_add(m_tmp_no_1, prev_grad(i), 1.0_dp, -1.0_dp)
7358 CALL dbcsr_dot(m_tmp_no_1, prev_step(i), den)
7360 CALL dbcsr_copy(m_tmp_no_1, grad(i))
7361 CALL dbcsr_add(m_tmp_no_1, prev_grad(i), 1.0_dp, -1.0_dp)
7362 CALL dbcsr_dot(m_tmp_no_1, prev_step(i), den)
7363 CALL dbcsr_dot(m_tmp_no_1, prev_minus_prec_grad(i), num)
7364 CALL dbcsr_dot(m_tmp_no_1, step(i), num2)
7365 CALL dbcsr_dot(prev_step(i), grad(i), num3)
7366 my_numer2 = my_numer2 + num2
7367 my_numer3 = my_numer3 + num3
7372 cpabort(
"illegal conjugator")
7374 my_numer = my_numer + num
7375 my_denom = my_denom + den
7377 CALL dbcsr_release(m_tmp_no_1)
7383 SELECT CASE (conjugator)
7385 beta = -1.0_dp*my_numer/my_denom
7387 beta = my_numer/my_denom
7389 kappa = -2.0_dp*my_numer/my_denom
7390 tau = -1.0_dp*my_numer2/my_denom
7391 beta = tau - kappa*my_numer3/my_denom
7395 cpabort(
"illegal conjugator")
7400 IF (beta .LT. 0.0_dp)
THEN
7401 IF (unit_nr > 0)
THEN
7402 WRITE (unit_nr, *)
" Resetting conjugator because beta is negative: ", beta
7404 reset_conjugator = .true.
7407 IF (
PRESENT(numer))
THEN
7410 IF (
PRESENT(denom))
THEN
7414 CALL timestop(handle)
7416 END SUBROUTINE compute_cg_beta
7451 SUBROUTINE newton_grad_to_step(optimizer, m_grad, m_delta, m_s, m_ks, &
7452 m_siginv, m_quench_t, m_FTsiginv, m_siginvTFTsiginv, m_ST, m_t, &
7453 m_sig_sqrti_ii, domain_s_inv, domain_r_down, domain_map, cpu_of_domain, &
7454 nocc_of_domain, para_env, blacs_env, eps_filter, optimize_theta, &
7455 penalty_occ_vol, normalize_orbitals, penalty_occ_vol_prefactor, &
7456 penalty_occ_vol_pf2, special_case)
7458 TYPE(optimizer_options_type),
INTENT(IN) :: optimizer
7459 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_grad
7460 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_delta, m_s, m_ks, m_siginv, m_quench_t
7461 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_ftsiginv, m_siginvtftsiginv, m_st, &
7463 TYPE(domain_submatrix_type),
DIMENSION(:, :), &
7464 INTENT(IN) :: domain_s_inv, domain_r_down
7465 TYPE(domain_map_type),
DIMENSION(:),
INTENT(IN) :: domain_map
7466 INTEGER,
DIMENSION(:),
INTENT(IN) :: cpu_of_domain
7467 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: nocc_of_domain
7468 TYPE(mp_para_env_type),
POINTER :: para_env
7469 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
7470 REAL(kind=
dp),
INTENT(IN) :: eps_filter
7471 LOGICAL,
INTENT(IN) :: optimize_theta, penalty_occ_vol, &
7473 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: penalty_occ_vol_prefactor, &
7475 INTEGER,
INTENT(IN) :: special_case
7477 CHARACTER(len=*),
PARAMETER :: routinen =
'newton_grad_to_step'
7479 CHARACTER(LEN=20) :: iter_type
7480 INTEGER :: handle, ispin, iteration, max_iter, &
7481 ndomains, nspins, outer_iteration, &
7482 outer_max_iter, unit_nr
7483 LOGICAL :: converged, do_exact_inversion, outer_prepare_to_exit, prepare_to_exit, &
7484 reset_conjugator, use_preconditioner
7485 REAL(kind=
dp) :: alpha, beta, denom, denom_ispin, &
7486 eps_error_target, numer, numer_ispin, &
7487 residue_norm, spin_factor, t1, t2
7488 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: residue_max_norm
7489 TYPE(cp_logger_type),
POINTER :: logger
7490 TYPE(dbcsr_type) :: m_tmp_oo_1, m_tmp_oo_2
7491 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: m_f_vo, m_f_vv, m_hstep, m_prec, &
7492 m_residue, m_residue_prev, m_s_vv, &
7493 m_step, m_stsiginv, m_zet, m_zet_prev
7494 TYPE(domain_submatrix_type),
ALLOCATABLE, &
7495 DIMENSION(:, :) :: domain_prec
7497 CALL timeset(routinen, handle)
7501 IF (logger%para_env%is_source())
THEN
7508 IF (optimize_theta)
THEN
7509 cpabort(
"theta is NYI")
7514 outer_max_iter = optimizer%max_iter_outer_loop
7515 max_iter = optimizer%max_iter
7516 eps_error_target = optimizer%eps_error
7520 ndomains =
SIZE(domain_s_inv, 1)
7522 IF (nspins == 1)
THEN
7523 spin_factor = 2.0_dp
7525 spin_factor = 1.0_dp
7528 ALLOCATE (domain_prec(ndomains, nspins))
7529 CALL init_submatrices(domain_prec)
7532 ALLOCATE (m_residue(nspins))
7533 ALLOCATE (m_residue_prev(nspins))
7534 ALLOCATE (m_step(nspins))
7535 ALLOCATE (m_zet(nspins))
7536 ALLOCATE (m_zet_prev(nspins))
7537 ALLOCATE (m_hstep(nspins))
7538 ALLOCATE (m_prec(nspins))
7539 ALLOCATE (m_s_vv(nspins))
7540 ALLOCATE (m_f_vv(nspins))
7541 ALLOCATE (m_f_vo(nspins))
7542 ALLOCATE (m_stsiginv(nspins))
7544 ALLOCATE (residue_max_norm(nspins))
7547 DO ispin = 1, nspins
7550 CALL dbcsr_create(m_residue(ispin), &
7551 template=m_quench_t(ispin), &
7552 matrix_type=dbcsr_type_no_symmetry)
7553 CALL dbcsr_create(m_residue_prev(ispin), &
7554 template=m_quench_t(ispin), &
7555 matrix_type=dbcsr_type_no_symmetry)
7556 CALL dbcsr_create(m_step(ispin), &
7557 template=m_quench_t(ispin), &
7558 matrix_type=dbcsr_type_no_symmetry)
7559 CALL dbcsr_create(m_zet_prev(ispin), &
7560 template=m_quench_t(ispin), &
7561 matrix_type=dbcsr_type_no_symmetry)
7562 CALL dbcsr_create(m_zet(ispin), &
7563 template=m_quench_t(ispin), &
7564 matrix_type=dbcsr_type_no_symmetry)
7565 CALL dbcsr_create(m_hstep(ispin), &
7566 template=m_quench_t(ispin), &
7567 matrix_type=dbcsr_type_no_symmetry)
7568 CALL dbcsr_create(m_f_vo(ispin), &
7569 template=m_quench_t(ispin), &
7570 matrix_type=dbcsr_type_no_symmetry)
7571 CALL dbcsr_create(m_stsiginv(ispin), &
7572 template=m_quench_t(ispin), &
7573 matrix_type=dbcsr_type_no_symmetry)
7574 CALL dbcsr_create(m_f_vv(ispin), &
7575 template=m_ks(ispin), &
7576 matrix_type=dbcsr_type_no_symmetry)
7577 CALL dbcsr_create(m_s_vv(ispin), &
7579 matrix_type=dbcsr_type_no_symmetry)
7580 CALL dbcsr_create(m_prec(ispin), &
7581 template=m_ks(ispin), &
7582 matrix_type=dbcsr_type_no_symmetry)
7586 CALL dbcsr_copy(m_f_vo(ispin), m_ftsiginv(ispin))
7587 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
7589 m_siginvtftsiginv(ispin), &
7590 1.0_dp, m_f_vo(ispin), &
7591 filter_eps=eps_filter)
7600 CALL compute_preconditioner( &
7601 domain_prec_out=domain_prec(:, ispin), &
7602 m_prec_out=m_prec(ispin), &
7605 m_siginv=m_siginv(ispin), &
7606 m_quench_t=m_quench_t(ispin), &
7607 m_ftsiginv=m_ftsiginv(ispin), &
7608 m_siginvtftsiginv=m_siginvtftsiginv(ispin), &
7610 m_stsiginv_out=m_stsiginv(ispin), &
7611 m_s_vv_out=m_s_vv(ispin), &
7612 m_f_vv_out=m_f_vv(ispin), &
7613 para_env=para_env, &
7614 blacs_env=blacs_env, &
7615 nocc_of_domain=nocc_of_domain(:, ispin), &
7616 domain_s_inv=domain_s_inv(:, ispin), &
7617 domain_r_down=domain_r_down(:, ispin), &
7618 cpu_of_domain=cpu_of_domain(:), &
7619 domain_map=domain_map(ispin), &
7620 assume_t0_q0x=.false., &
7621 penalty_occ_vol=penalty_occ_vol, &
7622 penalty_occ_vol_prefactor=penalty_occ_vol_prefactor(ispin), &
7623 eps_filter=eps_filter, &
7625 spin_factor=spin_factor, &
7626 special_case=special_case, &
7627 skip_inversion=.false. &
7633 CALL dbcsr_copy(m_delta(ispin), m_quench_t(ispin))
7635 CALL dbcsr_set(m_delta(ispin), 0.0_dp)
7636 CALL dbcsr_copy(m_residue(ispin), m_grad(ispin))
7637 CALL dbcsr_scale(m_residue(ispin), -1.0_dp)
7639 do_exact_inversion = .false.
7640 IF (do_exact_inversion)
THEN
7644 CALL dbcsr_copy(m_step(ispin), m_grad(ispin))
7648 CALL hessian_diag_apply( &
7649 matrix_grad=m_step(ispin), &
7650 matrix_step=m_zet(ispin), &
7651 matrix_s_ao=m_s_vv(ispin), &
7652 matrix_f_ao=m_f_vv(ispin), &
7655 matrix_s_mo=m_siginv(ispin), &
7656 matrix_f_mo=m_siginvtftsiginv(ispin), &
7657 matrix_s_vo=m_stsiginv(ispin), &
7658 matrix_f_vo=m_f_vo(ispin), &
7659 quench_t=m_quench_t(ispin), &
7660 spin_factor=spin_factor, &
7661 eps_zero=eps_filter*10.0_dp, &
7662 penalty_occ_vol=penalty_occ_vol, &
7663 penalty_occ_vol_prefactor=penalty_occ_vol_prefactor(ispin), &
7664 penalty_occ_vol_pf2=penalty_occ_vol_pf2(ispin), &
7666 para_env=para_env, &
7667 blacs_env=blacs_env &
7674 IF (use_preconditioner)
THEN
7679 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7682 0.0_dp, m_zet(ispin), &
7683 filter_eps=eps_filter)
7688 matrix_in=m_residue(ispin), &
7689 matrix_out=m_zet(ispin), &
7690 operator1=domain_prec(:, ispin), &
7691 dpattern=m_quench_t(ispin), &
7692 map=domain_map(ispin), &
7693 node_of_domain=cpu_of_domain(:), &
7695 filter_eps=eps_filter &
7704 CALL dbcsr_copy(m_zet(ispin), m_residue(ispin))
7710 CALL dbcsr_copy(m_step(ispin), m_zet(ispin))
7715 outer_prepare_to_exit = .false.
7717 residue_norm = 0.0_dp
7722 prepare_to_exit = .false.
7730 CALL apply_hessian( &
7735 m_siginv=m_siginv, &
7736 m_quench_t=m_quench_t, &
7737 m_ftsiginv=m_ftsiginv, &
7738 m_siginvtftsiginv=m_siginvtftsiginv, &
7740 m_stsiginv=m_stsiginv, &
7747 m_sig_sqrti_ii=m_sig_sqrti_ii, &
7748 penalty_occ_vol=penalty_occ_vol, &
7749 normalize_orbitals=normalize_orbitals, &
7750 penalty_occ_vol_prefactor=penalty_occ_vol_prefactor, &
7751 eps_filter=eps_filter, &
7752 path_num=hessian_path_reuse &
7758 DO ispin = 1, nspins
7760 CALL dbcsr_dot(m_residue(ispin), m_zet(ispin), numer_ispin)
7761 CALL dbcsr_dot(m_step(ispin), m_hstep(ispin), denom_ispin)
7763 numer = numer + numer_ispin
7764 denom = denom + denom_ispin
7770 DO ispin = 1, nspins
7773 CALL dbcsr_add(m_delta(ispin), m_step(ispin), 1.0_dp, alpha)
7774 CALL dbcsr_copy(m_residue_prev(ispin), m_residue(ispin))
7775 CALL dbcsr_add(m_residue(ispin), m_hstep(ispin), &
7776 1.0_dp, -1.0_dp*alpha)
7777 CALL dbcsr_norm(m_residue(ispin), dbcsr_norm_maxabsnorm, &
7778 norm_scalar=residue_max_norm(ispin))
7783 residue_norm = maxval(residue_max_norm)
7784 converged = (residue_norm .LT. eps_error_target)
7785 IF (converged .OR. (iteration .GE. max_iter))
THEN
7786 prepare_to_exit = .true.
7789 IF (.NOT. prepare_to_exit)
THEN
7791 DO ispin = 1, nspins
7794 CALL dbcsr_copy(m_zet_prev(ispin), m_zet(ispin))
7797 IF (use_preconditioner)
THEN
7806 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7809 0.0_dp, m_zet(ispin), &
7810 filter_eps=eps_filter)
7815 matrix_in=m_residue(ispin), &
7816 matrix_out=m_zet(ispin), &
7817 operator1=domain_prec(:, ispin), &
7818 dpattern=m_quench_t(ispin), &
7819 map=domain_map(ispin), &
7820 node_of_domain=cpu_of_domain(:), &
7822 filter_eps=eps_filter &
7831 CALL dbcsr_copy(m_zet(ispin), m_residue(ispin))
7838 CALL compute_cg_beta( &
7840 reset_conjugator=reset_conjugator, &
7843 prev_grad=m_residue_prev, &
7845 prev_step=m_zet_prev)
7847 DO ispin = 1, nspins
7850 CALL dbcsr_add(m_step(ispin), m_zet(ispin), beta, 1.0_dp)
7857 IF (unit_nr > 0)
THEN
7859 iter_type = trim(
"NR STEP")
7860 WRITE (unit_nr,
'(T6,A9,I6,F14.5,F14.5,F15.10,F9.2)') &
7861 iter_type, iteration, &
7862 alpha, beta, residue_norm, &
7867 iteration = iteration + 1
7868 IF (prepare_to_exit)
EXIT
7872 IF (converged .OR. (outer_iteration .GE. outer_max_iter))
THEN
7873 outer_prepare_to_exit = .true.
7876 outer_iteration = outer_iteration + 1
7877 IF (outer_prepare_to_exit)
EXIT
7884 IF (penalty_occ_vol)
THEN
7886 DO ispin = 1, nspins
7888 CALL dbcsr_copy(m_zet(ispin), m_grad(ispin))
7889 CALL dbcsr_dot(m_delta(ispin), m_zet(ispin), alpha)
7890 WRITE (unit_nr, *)
"trace(grad.delta): ", alpha
7891 alpha = -1.0_dp/(penalty_occ_vol_pf2(ispin)*alpha - 1.0_dp)
7892 WRITE (unit_nr, *)
"correction alpha: ", alpha
7893 CALL dbcsr_scale(m_delta(ispin), alpha)
7901 DO ispin = 1, nspins
7904 CALL dbcsr_create(m_tmp_oo_1, &
7905 template=m_siginv(ispin), &
7906 matrix_type=dbcsr_type_no_symmetry)
7907 CALL dbcsr_create(m_tmp_oo_2, &
7908 template=m_siginv(ispin), &
7909 matrix_type=dbcsr_type_no_symmetry)
7910 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
7913 0.0_dp, m_tmp_oo_1, &
7914 filter_eps=eps_filter)
7915 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7918 0.0_dp, m_tmp_oo_2, &
7919 filter_eps=eps_filter)
7920 CALL dbcsr_copy(m_zet(ispin), m_quench_t(ispin))
7921 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
7924 0.0_dp, m_zet(ispin), &
7925 retain_sparsity=.true.)
7926 CALL dbcsr_norm(m_zet(ispin), dbcsr_norm_maxabsnorm, &
7928 WRITE (unit_nr,
"(A50,2F20.10)")
"Occupied-space projection of the step", alpha
7929 CALL dbcsr_add(m_zet(ispin), m_delta(ispin), -1.0_dp, 1.0_dp)
7930 CALL dbcsr_norm(m_zet(ispin), dbcsr_norm_maxabsnorm, &
7932 WRITE (unit_nr,
"(A50,2F20.10)")
"Virtual-space projection of the step", alpha
7933 CALL dbcsr_norm(m_delta(ispin), dbcsr_norm_maxabsnorm, &
7935 WRITE (unit_nr,
"(A50,2F20.10)")
"Full step", alpha
7936 CALL dbcsr_release(m_tmp_oo_1)
7937 CALL dbcsr_release(m_tmp_oo_2)
7942 DO ispin = 1, nspins
7943 CALL release_submatrices(domain_prec(:, ispin))
7944 CALL dbcsr_release(m_residue(ispin))
7945 CALL dbcsr_release(m_residue_prev(ispin))
7946 CALL dbcsr_release(m_step(ispin))
7947 CALL dbcsr_release(m_zet(ispin))
7948 CALL dbcsr_release(m_zet_prev(ispin))
7949 CALL dbcsr_release(m_hstep(ispin))
7950 CALL dbcsr_release(m_f_vo(ispin))
7951 CALL dbcsr_release(m_f_vv(ispin))
7952 CALL dbcsr_release(m_s_vv(ispin))
7953 CALL dbcsr_release(m_prec(ispin))
7954 CALL dbcsr_release(m_stsiginv(ispin))
7956 DEALLOCATE (domain_prec)
7957 DEALLOCATE (m_residue)
7958 DEALLOCATE (m_residue_prev)
7961 DEALLOCATE (m_zet_prev)
7963 DEALLOCATE (m_hstep)
7967 DEALLOCATE (m_stsiginv)
7968 DEALLOCATE (residue_max_norm)
7970 IF (.NOT. converged)
THEN
7971 cpabort(
"Optimization not converged!")
7976 CALL timestop(handle)
7978 END SUBROUTINE newton_grad_to_step
8006 SUBROUTINE apply_hessian(m_x_in, m_x_out, m_ks, m_s, m_siginv, &
8007 m_quench_t, m_FTsiginv, m_siginvTFTsiginv, m_ST, m_STsiginv, m_s_vv, &
8008 m_ks_vv, m_g_full, m_t, m_sig_sqrti_ii, penalty_occ_vol, &
8009 normalize_orbitals, penalty_occ_vol_prefactor, eps_filter, path_num)
8011 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_x_in, m_x_out, m_ks, m_s
8012 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_siginv, m_quench_t, m_ftsiginv, &
8013 m_siginvtftsiginv, m_st, m_stsiginv
8014 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_s_vv, m_ks_vv, m_g_full
8015 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_t, m_sig_sqrti_ii
8016 LOGICAL,
INTENT(IN) :: penalty_occ_vol, normalize_orbitals
8017 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: penalty_occ_vol_prefactor
8018 REAL(kind=
dp),
INTENT(IN) :: eps_filter
8019 INTEGER,
INTENT(IN) :: path_num
8021 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_hessian'
8023 INTEGER :: dim0, handle, ispin, nspins
8024 REAL(kind=
dp) :: penalty_prefactor_local, spin_factor
8025 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: tg_diagonal
8026 TYPE(dbcsr_type) :: m_tmp_no_1, m_tmp_no_2, m_tmp_oo_1, &
8029 CALL timeset(routinen, handle)
8032 IF (penalty_occ_vol) penalty_prefactor_local = 1._dp
8033 cpassert(
SIZE(m_stsiginv) >= 0)
8034 cpassert(
SIZE(m_siginvtftsiginv) >= 0)
8035 cpassert(
SIZE(m_s) >= 0)
8036 cpassert(
SIZE(m_g_full) >= 0)
8037 cpassert(
SIZE(m_ftsiginv) >= 0)
8038 mark_used(m_siginvtftsiginv)
8039 mark_used(m_stsiginv)
8040 mark_used(m_ftsiginv)
8046 IF (nspins .EQ. 1)
THEN
8047 spin_factor = 2.0_dp
8049 spin_factor = 1.0_dp
8052 DO ispin = 1, nspins
8054 penalty_prefactor_local = penalty_occ_vol_prefactor(ispin)/(2.0_dp*spin_factor)
8056 CALL dbcsr_create(m_tmp_oo_1, &
8057 template=m_siginv(ispin), &
8058 matrix_type=dbcsr_type_no_symmetry)
8059 CALL dbcsr_create(m_tmp_no_1, &
8060 template=m_quench_t(ispin), &
8061 matrix_type=dbcsr_type_no_symmetry)
8062 CALL dbcsr_create(m_tmp_no_2, &
8063 template=m_quench_t(ispin), &
8064 matrix_type=dbcsr_type_no_symmetry)
8065 CALL dbcsr_create(m_tmp_x_in, &
8066 template=m_quench_t(ispin), &
8067 matrix_type=dbcsr_type_no_symmetry)
8070 IF (normalize_orbitals)
THEN
8075 CALL dbcsr_copy(m_tmp_oo_1, m_sig_sqrti_ii(ispin))
8076 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
8079 0.0_dp, m_tmp_oo_1, &
8080 retain_sparsity=.true.)
8081 CALL dbcsr_get_info(m_sig_sqrti_ii(ispin), nfullrows_total=dim0)
8082 ALLOCATE (tg_diagonal(dim0))
8083 CALL dbcsr_get_diag(m_tmp_oo_1, tg_diagonal)
8084 CALL dbcsr_set(m_tmp_oo_1, 0.0_dp)
8085 CALL dbcsr_set_diag(m_tmp_oo_1, tg_diagonal)
8086 DEALLOCATE (tg_diagonal)
8088 CALL dbcsr_copy(m_tmp_no_1, m_x_in(ispin))
8089 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
8092 1.0_dp, m_tmp_no_1, &
8093 filter_eps=eps_filter)
8094 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8096 m_sig_sqrti_ii(ispin), &
8097 0.0_dp, m_tmp_x_in, &
8098 filter_eps=eps_filter)
8102 CALL dbcsr_copy(m_tmp_x_in, m_x_in(ispin))
8106 IF (path_num .EQ. hessian_path_reuse)
THEN
8127 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8130 0.0_dp, m_tmp_no_1, &
8131 filter_eps=eps_filter)
8132 CALL dbcsr_copy(m_x_out(ispin), m_quench_t(ispin))
8133 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8136 0.0_dp, m_x_out(ispin), &
8137 retain_sparsity=.true.)
8149 CALL dbcsr_copy(m_x_out(ispin), m_quench_t(ispin))
8150 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8153 0.0_dp, m_x_out(ispin), &
8154 retain_sparsity=.true.)
8156 CALL dbcsr_copy(m_tmp_no_2, m_quench_t(ispin))
8157 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8160 0.0_dp, m_tmp_no_2, &
8161 retain_sparsity=.true.)
8162 CALL dbcsr_add(m_x_out(ispin), m_tmp_no_2, &
8163 1.0_dp, -4.0_dp*penalty_prefactor_local + 1.0_dp)
8234 ELSE IF (path_num .EQ. hessian_path_assemble)
THEN
8239 cpabort(
"path is NYI")
8242 cpabort(
"illegal path")
8246 IF (normalize_orbitals)
THEN
8251 CALL dbcsr_copy(m_tmp_oo_1, m_sig_sqrti_ii(ispin))
8252 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
8255 0.0_dp, m_tmp_oo_1, &
8256 retain_sparsity=.true.)
8257 CALL dbcsr_get_info(m_sig_sqrti_ii(ispin), nfullrows_total=dim0)
8258 ALLOCATE (tg_diagonal(dim0))
8259 CALL dbcsr_get_diag(m_tmp_oo_1, tg_diagonal)
8260 CALL dbcsr_set(m_tmp_oo_1, 0.0_dp)
8261 CALL dbcsr_set_diag(m_tmp_oo_1, tg_diagonal)
8262 DEALLOCATE (tg_diagonal)
8264 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, &
8267 1.0_dp, m_x_out(ispin), &
8268 retain_sparsity=.true.)
8269 CALL dbcsr_copy(m_tmp_no_1, m_x_out(ispin))
8270 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
8272 m_sig_sqrti_ii(ispin), &
8273 0.0_dp, m_x_out(ispin), &
8274 retain_sparsity=.true.)
8278 CALL dbcsr_scale(m_x_out(ispin), &
8281 CALL dbcsr_release(m_tmp_oo_1)
8282 CALL dbcsr_release(m_tmp_no_1)
8283 CALL dbcsr_release(m_tmp_no_2)
8284 CALL dbcsr_release(m_tmp_x_in)
8292 CALL timestop(handle)
8294 END SUBROUTINE apply_hessian
8319 SUBROUTINE hessian_diag_apply(matrix_grad, matrix_step, matrix_S_ao, &
8320 matrix_F_ao, matrix_S_mo, matrix_F_mo, matrix_S_vo, matrix_F_vo, quench_t, &
8321 penalty_occ_vol, penalty_occ_vol_prefactor, penalty_occ_vol_pf2, &
8322 spin_factor, eps_zero, m_s, para_env, blacs_env)
8324 TYPE(dbcsr_type),
INTENT(INOUT) :: matrix_grad, matrix_step, matrix_s_ao, &
8325 matrix_f_ao, matrix_s_mo
8326 TYPE(dbcsr_type),
INTENT(IN) :: matrix_f_mo
8327 TYPE(dbcsr_type),
INTENT(INOUT) :: matrix_s_vo, matrix_f_vo, quench_t
8328 LOGICAL,
INTENT(IN) :: penalty_occ_vol
8329 REAL(kind=
dp),
INTENT(IN) :: penalty_occ_vol_prefactor, &
8330 penalty_occ_vol_pf2, spin_factor, &
8332 TYPE(dbcsr_type),
INTENT(IN) :: m_s
8333 TYPE(mp_para_env_type),
POINTER :: para_env
8334 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
8336 CHARACTER(len=*),
PARAMETER :: routinen =
'hessian_diag_apply'
8338 INTEGER :: ao_hori_offset, ao_vert_offset, block_col, block_row, col, h_size, handle, ii, &
8339 info, jj, lev1_hori_offset, lev1_vert_offset, lev2_hori_offset, lev2_vert_offset, lwork, &
8340 nblkcols_tot, nblkrows_tot, ncores, orb_i, orb_j, row, unit_nr, zero_neg_eiv
8341 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ao_block_sizes, ao_domain_sizes, &
8343 INTEGER,
DIMENSION(:),
POINTER :: ao_blk_sizes, mo_blk_sizes
8344 LOGICAL :: found, found_col, found_row
8345 REAL(kind=
dp) :: penalty_prefactor_local, test_error
8346 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues, grad_vec, step_vec, tmp, &
8348 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: f_ao_block, f_mo_block, h, hinv, &
8349 s_ao_block, s_mo_block, test, test2
8350 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block_p, p_new_block
8351 TYPE(cp_logger_type),
POINTER :: logger
8352 TYPE(dbcsr_distribution_type) :: main_dist
8353 TYPE(dbcsr_type) :: matrix_f_ao_sym, matrix_f_mo_sym, &
8354 matrix_s_ao_sym, matrix_s_mo_sym
8356 CALL timeset(routinen, handle)
8360 IF (logger%para_env%is_source())
THEN
8367 cpassert(
ASSOCIATED(blacs_env))
8368 cpassert(
ASSOCIATED(para_env))
8369 mark_used(blacs_env)
8372 CALL dbcsr_get_info(m_s, row_blk_size=ao_blk_sizes)
8373 CALL dbcsr_get_info(matrix_s_vo, row_blk_size=ao_blk_sizes)
8374 CALL dbcsr_get_info(matrix_f_vo, row_blk_size=ao_blk_sizes)
8377 CALL dbcsr_get_info(matrix=matrix_s_ao, distribution=main_dist)
8378 CALL dbcsr_distribution_get(main_dist, numnodes=ncores)
8379 IF (ncores .GT. 1)
THEN
8380 cpabort(
"serial code only")
8383 nblkrows_tot = dbcsr_nblkrows_total(quench_t)
8384 nblkcols_tot = dbcsr_nblkcols_total(quench_t)
8385 cpassert(nblkrows_tot == nblkcols_tot)
8386 CALL dbcsr_get_info(quench_t, row_blk_size=ao_blk_sizes)
8387 CALL dbcsr_get_info(quench_t, col_blk_size=mo_blk_sizes)
8388 ALLOCATE (mo_block_sizes(nblkcols_tot), ao_block_sizes(nblkcols_tot))
8389 ALLOCATE (ao_domain_sizes(nblkcols_tot))
8390 mo_block_sizes(:) = mo_blk_sizes(:)
8391 ao_block_sizes(:) = ao_blk_sizes(:)
8392 ao_domain_sizes(:) = 0
8394 CALL dbcsr_create(matrix_s_ao_sym, &
8395 template=matrix_s_ao, &
8396 matrix_type=dbcsr_type_no_symmetry)
8397 CALL dbcsr_desymmetrize(matrix_s_ao, matrix_s_ao_sym)
8398 CALL dbcsr_scale(matrix_s_ao_sym, 2.0_dp*spin_factor)
8400 CALL dbcsr_create(matrix_f_ao_sym, &
8401 template=matrix_f_ao, &
8402 matrix_type=dbcsr_type_no_symmetry)
8403 CALL dbcsr_desymmetrize(matrix_f_ao, matrix_f_ao_sym)
8404 CALL dbcsr_scale(matrix_f_ao_sym, 2.0_dp*spin_factor)
8406 CALL dbcsr_create(matrix_s_mo_sym, &
8407 template=matrix_s_mo, &
8408 matrix_type=dbcsr_type_no_symmetry)
8409 CALL dbcsr_desymmetrize(matrix_s_mo, matrix_s_mo_sym)
8411 CALL dbcsr_create(matrix_f_mo_sym, &
8412 template=matrix_f_mo, &
8413 matrix_type=dbcsr_type_no_symmetry)
8414 CALL dbcsr_desymmetrize(matrix_f_mo, matrix_f_mo_sym)
8416 IF (penalty_occ_vol)
THEN
8417 penalty_prefactor_local = penalty_occ_vol_prefactor/(2.0_dp*spin_factor)
8419 penalty_prefactor_local = 0.0_dp
8422 WRITE (unit_nr, *)
"penalty_prefactor_local: ", penalty_prefactor_local
8423 WRITE (unit_nr, *)
"penalty_prefactor_2: ", penalty_occ_vol_pf2
8433 DO col = 1, nblkcols_tot
8436 DO row = 1, nblkrows_tot
8438 CALL dbcsr_get_block_p(quench_t, &
8439 row, col, block_p, found)
8441 ao_domain_sizes(col) = ao_domain_sizes(col) + ao_blk_sizes(row)
8446 h_size = h_size + ao_domain_sizes(col)*mo_block_sizes(col)
8450 ALLOCATE (h(h_size, h_size))
8454 lev1_vert_offset = 0
8456 DO row = 1, nblkcols_tot
8458 lev1_hori_offset = 0
8459 DO col = 1, nblkcols_tot
8462 ALLOCATE (f_ao_block(ao_domain_sizes(row), ao_domain_sizes(col)))
8463 ALLOCATE (s_ao_block(ao_domain_sizes(row), ao_domain_sizes(col)))
8464 ALLOCATE (f_mo_block(mo_block_sizes(row), mo_block_sizes(col)))
8465 ALLOCATE (s_mo_block(mo_block_sizes(row), mo_block_sizes(col)))
8467 f_ao_block(:, :) = 0.0_dp
8468 s_ao_block(:, :) = 0.0_dp
8469 f_mo_block(:, :) = 0.0_dp
8470 s_mo_block(:, :) = 0.0_dp
8475 DO block_row = 1, nblkcols_tot
8477 CALL dbcsr_get_block_p(quench_t, &
8478 block_row, row, block_p, found_row)
8482 DO block_col = 1, nblkcols_tot
8484 CALL dbcsr_get_block_p(quench_t, &
8485 block_col, col, block_p, found_col)
8488 CALL dbcsr_get_block_p(matrix_f_ao_sym, &
8489 block_row, block_col, block_p, found)
8492 f_ao_block(ao_vert_offset + 1:ao_vert_offset + ao_block_sizes(block_row), &
8493 ao_hori_offset + 1:ao_hori_offset + ao_block_sizes(block_col)) &
8497 CALL dbcsr_get_block_p(matrix_s_ao_sym, &
8498 block_row, block_col, block_p, found)
8501 s_ao_block(ao_vert_offset + 1:ao_vert_offset + ao_block_sizes(block_row), &
8502 ao_hori_offset + 1:ao_hori_offset + ao_block_sizes(block_col)) &
8506 ao_hori_offset = ao_hori_offset + ao_block_sizes(block_col)
8512 ao_vert_offset = ao_vert_offset + ao_block_sizes(block_row)
8519 CALL dbcsr_get_block_p(matrix_f_mo_sym, row, col, block_p, found)
8522 f_mo_block(1:mo_block_sizes(row), 1:mo_block_sizes(col)) = block_p(:, :)
8524 CALL dbcsr_get_block_p(matrix_s_mo_sym, row, col, block_p, found)
8527 s_mo_block(1:mo_block_sizes(row), 1:mo_block_sizes(col)) = block_p(:, :)
8548 lev2_vert_offset = 0
8549 DO orb_j = 1, mo_block_sizes(row)
8551 lev2_hori_offset = 0
8552 DO orb_i = 1, mo_block_sizes(col)
8553 IF (orb_i .EQ. orb_j .AND. row .EQ. col)
THEN
8554 h(lev1_vert_offset + lev2_vert_offset + 1:lev1_vert_offset + lev2_vert_offset + ao_domain_sizes(row), &
8555 lev1_hori_offset + lev2_hori_offset + 1:lev1_hori_offset + lev2_hori_offset + ao_domain_sizes(col)) &
8557 = f_ao_block(:, :) + s_ao_block(:, :)
8567 lev2_hori_offset = lev2_hori_offset + ao_domain_sizes(col)
8571 lev2_vert_offset = lev2_vert_offset + ao_domain_sizes(row)
8575 lev1_hori_offset = lev1_hori_offset + ao_domain_sizes(col)*mo_block_sizes(col)
8577 DEALLOCATE (f_ao_block)
8578 DEALLOCATE (s_ao_block)
8579 DEALLOCATE (f_mo_block)
8580 DEALLOCATE (s_mo_block)
8584 lev1_vert_offset = lev1_vert_offset + ao_domain_sizes(row)*mo_block_sizes(row)
8588 CALL dbcsr_release(matrix_s_ao_sym)
8589 CALL dbcsr_release(matrix_f_ao_sym)
8590 CALL dbcsr_release(matrix_s_mo_sym)
8591 CALL dbcsr_release(matrix_f_mo_sym)
8768 ALLOCATE (grad_vec(h_size))
8769 grad_vec(:) = 0.0_dp
8770 lev1_vert_offset = 0
8772 DO col = 1, nblkcols_tot
8775 lev2_vert_offset = 0
8776 DO row = 1, nblkrows_tot
8778 CALL dbcsr_get_block_p(quench_t, &
8779 row, col, block_p, found_row)
8782 CALL dbcsr_get_block_p(matrix_grad, &
8783 row, col, block_p, found)
8786 DO orb_i = 1, mo_block_sizes(col)
8787 grad_vec(lev1_vert_offset + ao_domain_sizes(col)*(orb_i - 1) + lev2_vert_offset + 1: &
8788 lev1_vert_offset + ao_domain_sizes(col)*(orb_i - 1) + lev2_vert_offset + ao_block_sizes(row)) &
8806 lev2_vert_offset = lev2_vert_offset + ao_block_sizes(row)
8812 lev1_vert_offset = lev1_vert_offset + ao_domain_sizes(col)*mo_block_sizes(col)
8824 ALLOCATE (hinv(h_size, h_size))
8825 hinv(:, :) = h(:, :)
8828 ALLOCATE (eigenvalues(h_size))
8831 ALLOCATE (work(max(1, lwork)))
8832 CALL dsyev(
'V',
'L', h_size, hinv, h_size, eigenvalues, work, lwork, info)
8833 lwork = int(work(1))
8836 ALLOCATE (work(max(1, lwork)))
8837 CALL dsyev(
'V',
'L', h_size, hinv, h_size, eigenvalues, work, lwork, info)
8838 IF (info .NE. 0)
THEN
8839 WRITE (unit_nr, *)
'DSYEV ERROR MESSAGE: ', info
8840 cpabort(
"DSYEV failed")
8845 ALLOCATE (step_vec(h_size))
8847 step_vec(:) = matmul(transpose(hinv), grad_vec)
8866 ALLOCATE (test(h_size, h_size))
8869 WRITE (unit_nr,
"(I10,F20.10,F20.10)") jj, eigenvalues(jj), step_vec(jj)
8870 IF (eigenvalues(jj) .GT. eps_zero)
THEN
8871 test(jj, :) = hinv(:, jj)/eigenvalues(jj)
8873 test(jj, :) = hinv(:, jj)*0.0_dp
8874 zero_neg_eiv = zero_neg_eiv + 1
8877 WRITE (unit_nr, *)
'ZERO OR NEGATIVE EIGENVALUES: ', zero_neg_eiv
8878 DEALLOCATE (step_vec)
8880 ALLOCATE (test2(h_size, h_size))
8881 test2(:, :) = matmul(hinv, test)
8882 hinv(:, :) = test2(:, :)
8883 DEALLOCATE (test, test2)
8904 DEALLOCATE (eigenvalues)
8926 ALLOCATE (test(h_size, h_size))
8927 test(:, :) = matmul(hinv, h)
8929 test(ii, ii) = test(ii, ii) - 1.0_dp
8934 test_error = test_error + test(jj, ii)*test(jj, ii)
8937 WRITE (unit_nr, *)
"Hessian inversion error: ", sqrt(test_error)
8941 ALLOCATE (step_vec(h_size))
8942 ALLOCATE (tmp(h_size))
8943 tmp(:) = matmul(hinv, grad_vec)
8945 step_vec(:) = -1.0_dp*tmp(:)
8947 ALLOCATE (tmpr(h_size))
8948 tmpr(:) = matmul(h, step_vec)
8949 tmp(:) = tmpr(:) + grad_vec(:)
8951 WRITE (unit_nr, *)
"NEWTOV step error: ", maxval(abs(tmp))
8957 DEALLOCATE (grad_vec)
8964 CALL dbcsr_create(matrix_step, &
8965 template=matrix_grad, &
8966 matrix_type=dbcsr_type_no_symmetry)
8967 CALL dbcsr_work_create(matrix_step, work_mutable=.true.)
8969 lev1_vert_offset = 0
8971 DO col = 1, nblkcols_tot
8974 lev2_vert_offset = 0
8975 DO row = 1, nblkrows_tot
8977 CALL dbcsr_get_block_p(quench_t, &
8978 row, col, block_p, found_row)
8981 NULLIFY (p_new_block)
8982 CALL dbcsr_reserve_block2d(matrix_step, row, col, p_new_block)
8983 cpassert(
ASSOCIATED(p_new_block))
8985 DO orb_i = 1, mo_block_sizes(col)
8986 p_new_block(:, orb_i) = &
8987 step_vec(lev1_vert_offset + ao_domain_sizes(col)*(orb_i - 1) + lev2_vert_offset + 1: &
8988 lev1_vert_offset + ao_domain_sizes(col)*(orb_i - 1) + lev2_vert_offset + ao_block_sizes(row))
8991 lev2_vert_offset = lev2_vert_offset + ao_block_sizes(row)
8997 lev1_vert_offset = lev1_vert_offset + ao_domain_sizes(col)*mo_block_sizes(col)
9001 DEALLOCATE (step_vec)
9003 CALL dbcsr_finalize(matrix_step)
9018 DEALLOCATE (mo_block_sizes, ao_block_sizes)
9019 DEALLOCATE (ao_domain_sizes)
9021 CALL dbcsr_create(matrix_s_ao_sym, &
9022 template=quench_t, &
9023 matrix_type=dbcsr_type_no_symmetry)
9024 CALL dbcsr_copy(matrix_s_ao_sym, quench_t)
9025 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
9028 0.0_dp, matrix_s_ao_sym, &
9029 retain_sparsity=.true.)
9030 CALL dbcsr_create(matrix_f_ao_sym, &
9031 template=quench_t, &
9032 matrix_type=dbcsr_type_no_symmetry)
9033 CALL dbcsr_copy(matrix_f_ao_sym, quench_t)
9034 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
9037 0.0_dp, matrix_f_ao_sym, &
9038 retain_sparsity=.true.)
9039 CALL dbcsr_add(matrix_s_ao_sym, matrix_f_ao_sym, &
9041 CALL dbcsr_scale(matrix_s_ao_sym, 2.0_dp*spin_factor)
9042 CALL dbcsr_add(matrix_s_ao_sym, matrix_grad, &
9044 CALL dbcsr_norm(matrix_s_ao_sym, dbcsr_norm_maxabsnorm, &
9045 norm_scalar=test_error)
9046 WRITE (unit_nr, *)
"NEWTOL step error: ", test_error
9047 CALL dbcsr_release(matrix_s_ao_sym)
9048 CALL dbcsr_release(matrix_f_ao_sym)
9050 CALL timestop(handle)
9052 END SUBROUTINE hessian_diag_apply
9072 matrix_t_in, matrix_t_out, perturbation_only, &
9075 TYPE(qs_environment_type),
POINTER :: qs_env
9076 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
9077 TYPE(optimizer_options_type),
INTENT(IN) :: optimizer
9078 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: quench_t, matrix_t_in, matrix_t_out
9079 LOGICAL,
INTENT(IN) :: perturbation_only
9080 INTEGER,
INTENT(IN),
OPTIONAL :: special_case
9082 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_xalmo_trustr'
9084 INTEGER :: handle, ispin, iteration, iteration_type_to_report, my_special_case, ndomains, &
9085 nspins, outer_iteration, prec_type, unit_nr
9086 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nocc
9087 LOGICAL :: assume_t0_q0x, border_reached, inner_loop_success, normalize_orbitals, &
9088 optimize_theta, penalty_occ_vol, reset_conjugator, same_position, scf_converged
9089 REAL(kind=
dp) :: beta, energy_start, energy_trial, eta, expected_reduction, &
9090 fake_step_size_to_report, grad_norm_ratio, grad_norm_ref, loss_change_to_report, &
9091 loss_start, loss_trial, model_grad_norm, penalty_amplitude, penalty_start, penalty_trial, &
9092 radius_current, radius_max, real_temp, rho, spin_factor, step_norm, step_size, t1, &
9093 t1outer, t2, t2outer, y_scalar
9094 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: grad_norm_spin, &
9095 penalty_occ_vol_g_prefactor, &
9096 penalty_occ_vol_h_prefactor
9097 TYPE(cp_logger_type),
POINTER :: logger
9098 TYPE(dbcsr_type) :: m_s_inv
9099 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: ftsiginv, grad, m_model_bd, m_model_d, &
9100 m_model_hessian, m_model_hessian_inv, m_model_r, m_model_r_prev, m_model_rt, &
9101 m_model_rt_prev, m_sig_sqrti_ii, m_theta, m_theta_trial, prev_step, siginvtftsiginv, st, &
9103 TYPE(domain_submatrix_type),
ALLOCATABLE, &
9104 DIMENSION(:, :) :: domain_model_hessian_inv, domain_r_down
9107 CALL timeset(routinen, handle)
9112 IF (
PRESENT(special_case)) my_special_case = special_case
9116 IF (logger%para_env%is_source())
THEN
9123 assume_t0_q0x = .false.
9125 optimize_theta = .false.
9127 nspins = almo_scf_env%nspins
9128 IF (nspins == 1)
THEN
9129 spin_factor = 2.0_dp
9131 spin_factor = 1.0_dp
9134 IF (unit_nr > 0)
THEN
9136 SELECT CASE (my_special_case)
9138 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 20), &
9139 " Optimization of block-diagonal ALMOs ", repeat(
"-", 21)
9141 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 20), &
9142 " Optimization of fully delocalized MOs ", repeat(
"-", 20)
9144 WRITE (unit_nr,
'(T2,A,A,A)') repeat(
"-", 27), &
9145 " Optimization of XALMOs ", repeat(
"-", 28)
9148 CALL trust_r_report(unit_nr, &
9153 delta_loss=0.0_dp, &
9155 predicted_reduction=0.0_dp, &
9159 WRITE (unit_nr,
'(T2,A)') repeat(
"-", 79)
9163 penalty_occ_vol = .false.
9166 normalize_orbitals = penalty_occ_vol
9167 penalty_amplitude = 0.0_dp
9168 ALLOCATE (penalty_occ_vol_g_prefactor(nspins))
9169 ALLOCATE (penalty_occ_vol_h_prefactor(nspins))
9170 penalty_occ_vol_g_prefactor(:) = 0.0_dp
9171 penalty_occ_vol_h_prefactor(:) = 0.0_dp
9174 prec_type = optimizer%preconditioner
9176 ALLOCATE (grad_norm_spin(nspins))
9177 ALLOCATE (nocc(nspins))
9181 ALLOCATE (m_theta(nspins))
9182 DO ispin = 1, nspins
9183 CALL dbcsr_create(m_theta(ispin), &
9184 template=matrix_t_out(ispin), &
9185 matrix_type=dbcsr_type_no_symmetry)
9190 m_t_in=matrix_t_in, &
9191 m_t0=almo_scf_env%matrix_t_blk, &
9192 m_quench_t=quench_t, &
9193 m_overlap=almo_scf_env%matrix_s(1), &
9194 m_sigma_tmpl=almo_scf_env%matrix_sigma_inv, &
9196 xalmo_history=almo_scf_env%xalmo_history, &
9197 assume_t0_q0x=assume_t0_q0x, &
9198 optimize_theta=optimize_theta, &
9199 envelope_amplitude=almo_scf_env%envelope_amplitude, &
9200 eps_filter=almo_scf_env%eps_filter, &
9201 order_lanczos=almo_scf_env%order_lanczos, &
9202 eps_lanczos=almo_scf_env%eps_lanczos, &
9203 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
9204 nocc_of_domain=almo_scf_env%nocc_of_domain)
9206 ndomains = almo_scf_env%ndomains
9207 ALLOCATE (domain_r_down(ndomains, nspins))
9208 CALL init_submatrices(domain_r_down)
9209 ALLOCATE (domain_model_hessian_inv(ndomains, nspins))
9210 CALL init_submatrices(domain_model_hessian_inv)
9212 ALLOCATE (m_model_hessian(nspins))
9213 ALLOCATE (m_model_hessian_inv(nspins))
9214 ALLOCATE (siginvtftsiginv(nspins))
9215 ALLOCATE (stsiginv_0(nspins))
9216 ALLOCATE (ftsiginv(nspins))
9217 ALLOCATE (st(nspins))
9218 ALLOCATE (grad(nspins))
9219 ALLOCATE (prev_step(nspins))
9220 ALLOCATE (step(nspins))
9221 ALLOCATE (m_sig_sqrti_ii(nspins))
9222 ALLOCATE (m_model_r(nspins))
9223 ALLOCATE (m_model_rt(nspins))
9224 ALLOCATE (m_model_d(nspins))
9225 ALLOCATE (m_model_bd(nspins))
9226 ALLOCATE (m_model_r_prev(nspins))
9227 ALLOCATE (m_model_rt_prev(nspins))
9228 ALLOCATE (m_theta_trial(nspins))
9230 DO ispin = 1, nspins
9233 CALL dbcsr_create(m_model_hessian_inv(ispin), &
9234 template=almo_scf_env%matrix_ks(ispin), &
9235 matrix_type=dbcsr_type_no_symmetry)
9236 CALL dbcsr_create(m_model_hessian(ispin), &
9237 template=almo_scf_env%matrix_ks(ispin), &
9238 matrix_type=dbcsr_type_no_symmetry)
9239 CALL dbcsr_create(siginvtftsiginv(ispin), &
9240 template=almo_scf_env%matrix_sigma(ispin), &
9241 matrix_type=dbcsr_type_no_symmetry)
9242 CALL dbcsr_create(stsiginv_0(ispin), &
9243 template=matrix_t_out(ispin), &
9244 matrix_type=dbcsr_type_no_symmetry)
9245 CALL dbcsr_create(ftsiginv(ispin), &
9246 template=matrix_t_out(ispin), &
9247 matrix_type=dbcsr_type_no_symmetry)
9248 CALL dbcsr_create(st(ispin), &
9249 template=matrix_t_out(ispin), &
9250 matrix_type=dbcsr_type_no_symmetry)
9251 CALL dbcsr_create(grad(ispin), &
9252 template=matrix_t_out(ispin), &
9253 matrix_type=dbcsr_type_no_symmetry)
9254 CALL dbcsr_create(prev_step(ispin), &
9255 template=matrix_t_out(ispin), &
9256 matrix_type=dbcsr_type_no_symmetry)
9257 CALL dbcsr_create(step(ispin), &
9258 template=matrix_t_out(ispin), &
9259 matrix_type=dbcsr_type_no_symmetry)
9260 CALL dbcsr_create(m_sig_sqrti_ii(ispin), &
9261 template=almo_scf_env%matrix_sigma_inv(ispin), &
9262 matrix_type=dbcsr_type_no_symmetry)
9263 CALL dbcsr_create(m_model_r(ispin), &
9264 template=matrix_t_out(ispin), &
9265 matrix_type=dbcsr_type_no_symmetry)
9266 CALL dbcsr_create(m_model_rt(ispin), &
9267 template=matrix_t_out(ispin), &
9268 matrix_type=dbcsr_type_no_symmetry)
9269 CALL dbcsr_create(m_model_d(ispin), &
9270 template=matrix_t_out(ispin), &
9271 matrix_type=dbcsr_type_no_symmetry)
9272 CALL dbcsr_create(m_model_bd(ispin), &
9273 template=matrix_t_out(ispin), &
9274 matrix_type=dbcsr_type_no_symmetry)
9275 CALL dbcsr_create(m_model_r_prev(ispin), &
9276 template=matrix_t_out(ispin), &
9277 matrix_type=dbcsr_type_no_symmetry)
9278 CALL dbcsr_create(m_model_rt_prev(ispin), &
9279 template=matrix_t_out(ispin), &
9280 matrix_type=dbcsr_type_no_symmetry)
9281 CALL dbcsr_create(m_theta_trial(ispin), &
9282 template=matrix_t_out(ispin), &
9283 matrix_type=dbcsr_type_no_symmetry)
9285 CALL dbcsr_set(step(ispin), 0.0_dp)
9286 CALL dbcsr_set(prev_step(ispin), 0.0_dp)
9288 CALL dbcsr_get_info(almo_scf_env%matrix_sigma_inv(ispin), &
9289 nfullrows_total=nocc(ispin))
9297 matrix_s=almo_scf_env%matrix_s(1), &
9298 subm_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
9299 dpattern=quench_t(ispin), &
9300 map=almo_scf_env%domain_map(ispin), &
9301 node_of_domain=almo_scf_env%cpu_of_domain)
9310 CALL dbcsr_create(m_s_inv, &
9311 template=almo_scf_env%matrix_s(1), &
9312 matrix_type=dbcsr_type_no_symmetry)
9314 almo_scf_env%matrix_s_blk(1), &
9315 threshold=almo_scf_env%eps_filter, &
9316 filter_eps=almo_scf_env%eps_filter)
9321 CALL dbcsr_create(m_s_inv, &
9322 template=almo_scf_env%matrix_s(1), &
9323 matrix_type=dbcsr_type_no_symmetry)
9324 CALL dbcsr_desymmetrize(almo_scf_env%matrix_s(1), m_s_inv)
9326 para_env=almo_scf_env%para_env, &
9327 blacs_env=almo_scf_env%blacs_env)
9329 para_env=almo_scf_env%para_env, &
9330 blacs_env=almo_scf_env%blacs_env, &
9331 upper_to_full=.true.)
9332 CALL dbcsr_filter(m_s_inv, almo_scf_env%eps_filter)
9336 radius_max = optimizer%max_trust_radius
9337 radius_current = min(optimizer%initial_trust_radius, radius_max)
9339 eta = min(max(optimizer%rho_do_not_update, 0.0_dp), 0.25_dp)
9340 energy_start = 0.0_dp
9341 energy_trial = 0.0_dp
9342 penalty_start = 0.0_dp
9343 penalty_trial = 0.0_dp
9347 same_position = .false.
9350 CALL main_var_to_xalmos_and_loss_func( &
9351 almo_scf_env=almo_scf_env, &
9353 m_main_var_in=m_theta, &
9354 m_t_out=matrix_t_out, &
9355 m_sig_sqrti_ii_out=m_sig_sqrti_ii, &
9356 energy_out=energy_start, &
9357 penalty_out=penalty_start, &
9358 m_ftsiginv_out=ftsiginv, &
9359 m_siginvtftsiginv_out=siginvtftsiginv, &
9361 m_stsiginv0_in=stsiginv_0, &
9362 m_quench_t_in=quench_t, &
9363 domain_r_down_in=domain_r_down, &
9364 assume_t0_q0x=assume_t0_q0x, &
9365 just_started=.true., &
9366 optimize_theta=optimize_theta, &
9367 normalize_orbitals=normalize_orbitals, &
9368 perturbation_only=perturbation_only, &
9369 do_penalty=penalty_occ_vol, &
9370 special_case=my_special_case)
9371 loss_start = energy_start + penalty_start
9373 almo_scf_env%almo_scf_energy = energy_start
9375 DO ispin = 1, nspins
9376 IF (penalty_occ_vol)
THEN
9377 penalty_occ_vol_g_prefactor(ispin) = &
9378 -2.0_dp*penalty_amplitude*spin_factor*nocc(ispin)
9379 penalty_occ_vol_h_prefactor(ispin) = 0.0_dp
9384 scf_converged = .false.
9385 adjust_r_loop:
DO outer_iteration = 1, optimizer%max_iter_outer_loop
9388 border_reached = .false.
9390 DO ispin = 1, nspins
9391 CALL dbcsr_set(step(ispin), 0.0_dp)
9392 CALL dbcsr_filter(step(ispin), almo_scf_env%eps_filter)
9395 IF (.NOT. same_position)
THEN
9397 DO ispin = 1, nspins
9399 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Compute model gradient"
9400 CALL compute_gradient( &
9401 m_grad_out=grad(ispin), &
9402 m_ks=almo_scf_env%matrix_ks(ispin), &
9403 m_s=almo_scf_env%matrix_s(1), &
9404 m_t=matrix_t_out(ispin), &
9405 m_t0=almo_scf_env%matrix_t_blk(ispin), &
9406 m_siginv=almo_scf_env%matrix_sigma_inv(ispin), &
9407 m_quench_t=quench_t(ispin), &
9408 m_ftsiginv=ftsiginv(ispin), &
9409 m_siginvtftsiginv=siginvtftsiginv(ispin), &
9411 m_stsiginv0=stsiginv_0(ispin), &
9412 m_theta=m_theta(ispin), &
9413 m_sig_sqrti_ii=m_sig_sqrti_ii(ispin), &
9414 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
9415 domain_r_down=domain_r_down(:, ispin), &
9416 cpu_of_domain=almo_scf_env%cpu_of_domain, &
9417 domain_map=almo_scf_env%domain_map(ispin), &
9418 assume_t0_q0x=assume_t0_q0x, &
9419 optimize_theta=optimize_theta, &
9420 normalize_orbitals=normalize_orbitals, &
9421 penalty_occ_vol=penalty_occ_vol, &
9422 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(ispin), &
9423 envelope_amplitude=almo_scf_env%envelope_amplitude, &
9424 eps_filter=almo_scf_env%eps_filter, &
9425 spin_factor=spin_factor, &
9426 special_case=my_special_case)
9433 DO ispin = 1, nspins
9434 CALL dbcsr_norm(grad(ispin), dbcsr_norm_maxabsnorm, &
9435 norm_scalar=grad_norm_spin(ispin))
9439 grad_norm_ref = maxval(grad_norm_spin)
9442 CALL trust_r_report(unit_nr, &
9444 iteration=outer_iteration, &
9446 delta_loss=0.0_dp, &
9447 grad_norm=grad_norm_ref, &
9448 predicted_reduction=0.0_dp, &
9450 radius=radius_current, &
9451 new=.NOT. same_position, &
9452 time=t2outer - t1outer)
9455 IF (grad_norm_ref .LE. optimizer%eps_error)
THEN
9456 scf_converged = .true.
9457 border_reached = .false.
9458 expected_reduction = 0.0_dp
9459 IF (.NOT. (optimizer%early_stopping_on .AND. outer_iteration .EQ. 1)) &
9462 scf_converged = .false.
9465 DO ispin = 1, nspins
9467 CALL dbcsr_copy(m_model_r(ispin), grad(ispin))
9468 CALL dbcsr_scale(m_model_r(ispin), -1.0_dp)
9473 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Multiply Sinv.r"
9474 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
9477 0.0_dp, m_model_rt(ispin), &
9478 filter_eps=almo_scf_env%eps_filter)
9482 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Multiply Sinv_xx.r"
9484 matrix_in=m_model_r(ispin), &
9485 matrix_out=m_model_rt(ispin), &
9486 operator1=almo_scf_env%domain_s_inv(:, ispin), &
9487 dpattern=quench_t(ispin), &
9488 map=almo_scf_env%domain_map(ispin), &
9489 node_of_domain=almo_scf_env%cpu_of_domain, &
9491 filter_eps=almo_scf_env%eps_filter)
9494 cpabort(
"Unknown XALMO special case")
9497 CALL dbcsr_copy(m_model_d(ispin), m_model_rt(ispin))
9502 IF (.NOT. same_position)
THEN
9504 SELECT CASE (prec_type)
9507 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Compute model Hessian"
9508 DO ispin = 1, nspins
9509 CALL compute_preconditioner( &
9510 domain_prec_out=almo_scf_env%domain_preconditioner(:, ispin), &
9511 m_prec_out=m_model_hessian(ispin), &
9512 m_ks=almo_scf_env%matrix_ks(ispin), &
9513 m_s=almo_scf_env%matrix_s(1), &
9514 m_siginv=almo_scf_env%matrix_sigma_inv(ispin), &
9515 m_quench_t=quench_t(ispin), &
9516 m_ftsiginv=ftsiginv(ispin), &
9517 m_siginvtftsiginv=siginvtftsiginv(ispin), &
9519 para_env=almo_scf_env%para_env, &
9520 blacs_env=almo_scf_env%blacs_env, &
9521 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
9522 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
9523 domain_r_down=domain_r_down(:, ispin), &
9524 cpu_of_domain=almo_scf_env%cpu_of_domain, &
9525 domain_map=almo_scf_env%domain_map(ispin), &
9526 assume_t0_q0x=.false., &
9527 penalty_occ_vol=penalty_occ_vol, &
9528 penalty_occ_vol_prefactor=penalty_occ_vol_g_prefactor(ispin), &
9529 eps_filter=almo_scf_env%eps_filter, &
9531 spin_factor=spin_factor, &
9532 skip_inversion=.true., &
9533 special_case=my_special_case)
9538 cpabort(
"Unknown preconditioner")
9545 CALL fixed_r_report(unit_nr, &
9549 border_reached=.false., &
9551 grad_norm_ratio=0.0_dp, &
9554 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Start inner loop"
9557 inner_loop_success = .false.
9559 fixed_r_loop:
DO iteration = 1, optimizer%max_iter
9563 DO ispin = 1, nspins
9569 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
9570 m_model_hessian(ispin), &
9572 0.0_dp, m_model_bd(ispin), &
9573 filter_eps=almo_scf_env%eps_filter)
9578 matrix_in=m_model_d(ispin), &
9579 matrix_out=m_model_bd(ispin), &
9580 operator1=almo_scf_env%domain_preconditioner(:, ispin), &
9581 dpattern=quench_t(ispin), &
9582 map=almo_scf_env%domain_map(ispin), &
9583 node_of_domain=almo_scf_env%cpu_of_domain, &
9585 filter_eps=almo_scf_env%eps_filter)
9590 CALL dbcsr_dot(m_model_d(ispin), m_model_bd(ispin), real_temp)
9591 y_scalar = y_scalar + real_temp
9594 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Curvature: ", y_scalar
9597 IF (y_scalar .LT. 0.0_dp)
THEN
9599 CALL step_size_to_border( &
9600 step_size_out=step_size, &
9601 metric_in=almo_scf_env%matrix_s, &
9603 direction_in=m_model_d, &
9604 trust_radius_in=radius_current, &
9605 quench_t_in=quench_t, &
9606 eps_filter_in=almo_scf_env%eps_filter &
9609 DO ispin = 1, nspins
9610 CALL dbcsr_add(step(ispin), m_model_d(ispin), 1.0_dp, step_size)
9613 border_reached = .true.
9614 inner_loop_success = .true.
9616 CALL predicted_reduction( &
9617 reduction_out=expected_reduction, &
9620 hess_in=m_model_hessian, &
9621 hess_submatrix_in=almo_scf_env%domain_preconditioner, &
9622 quench_t_in=quench_t, &
9623 special_case=my_special_case, &
9624 eps_filter=almo_scf_env%eps_filter, &
9625 domain_map=almo_scf_env%domain_map, &
9626 cpu_of_domain=almo_scf_env%cpu_of_domain &
9630 CALL fixed_r_report(unit_nr, &
9632 iteration=iteration, &
9633 step_size=step_size, &
9634 border_reached=border_reached, &
9635 curvature=y_scalar, &
9636 grad_norm_ratio=expected_reduction, &
9645 DO ispin = 1, nspins
9646 CALL dbcsr_dot(m_model_r(ispin), m_model_rt(ispin), real_temp)
9647 step_size = step_size + real_temp
9649 step_size = step_size/y_scalar
9650 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Proposed step size: ", step_size
9653 DO ispin = 1, nspins
9654 CALL dbcsr_copy(prev_step(ispin), step(ispin))
9655 CALL dbcsr_add(step(ispin), m_model_d(ispin), 1.0_dp, step_size)
9659 CALL contravariant_matrix_norm( &
9660 norm_out=step_norm, &
9662 metric_in=almo_scf_env%matrix_s, &
9663 quench_t_in=quench_t, &
9664 eps_filter_in=almo_scf_env%eps_filter &
9666 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Step norm: ", step_norm
9669 IF (step_norm .GT. radius_current)
THEN
9671 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Norm is too large"
9672 CALL step_size_to_border( &
9673 step_size_out=step_size, &
9674 metric_in=almo_scf_env%matrix_s, &
9675 position_in=prev_step, &
9676 direction_in=m_model_d, &
9677 trust_radius_in=radius_current, &
9678 quench_t_in=quench_t, &
9679 eps_filter_in=almo_scf_env%eps_filter &
9681 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Step size to border: ", step_size
9683 DO ispin = 1, nspins
9684 CALL dbcsr_copy(step(ispin), prev_step(ispin))
9685 CALL dbcsr_add(step(ispin), m_model_d(ispin), 1.0_dp, step_size)
9688 IF (debug_mode)
THEN
9690 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Extra norm evaluation"
9691 CALL contravariant_matrix_norm( &
9692 norm_out=step_norm, &
9694 metric_in=almo_scf_env%matrix_s, &
9695 quench_t_in=quench_t, &
9696 eps_filter_in=almo_scf_env%eps_filter &
9698 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Step norm: ", step_norm
9699 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Current radius: ", radius_current
9702 border_reached = .true.
9703 inner_loop_success = .true.
9705 CALL predicted_reduction( &
9706 reduction_out=expected_reduction, &
9709 hess_in=m_model_hessian, &
9710 hess_submatrix_in=almo_scf_env%domain_preconditioner, &
9711 quench_t_in=quench_t, &
9712 special_case=my_special_case, &
9713 eps_filter=almo_scf_env%eps_filter, &
9714 domain_map=almo_scf_env%domain_map, &
9715 cpu_of_domain=almo_scf_env%cpu_of_domain &
9719 CALL fixed_r_report(unit_nr, &
9721 iteration=iteration, &
9722 step_size=step_size, &
9723 border_reached=border_reached, &
9724 curvature=y_scalar, &
9725 grad_norm_ratio=expected_reduction, &
9735 border_reached = .false.
9736 inner_loop_success = .true.
9738 CALL predicted_reduction( &
9739 reduction_out=expected_reduction, &
9742 hess_in=m_model_hessian, &
9743 hess_submatrix_in=almo_scf_env%domain_preconditioner, &
9744 quench_t_in=quench_t, &
9745 special_case=my_special_case, &
9746 eps_filter=almo_scf_env%eps_filter, &
9747 domain_map=almo_scf_env%domain_map, &
9748 cpu_of_domain=almo_scf_env%cpu_of_domain &
9752 CALL fixed_r_report(unit_nr, &
9754 iteration=iteration, &
9755 step_size=step_size, &
9756 border_reached=border_reached, &
9757 curvature=y_scalar, &
9758 grad_norm_ratio=expected_reduction, &
9763 ELSE IF (optimizer%trustr_algorithm .EQ.
trustr_dogleg)
THEN
9766 SELECT CASE (prec_type)
9769 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Pseudo-invert model Hessian"
9772 DO ispin = 1, nspins
9774 matrix_in=m_model_hessian(ispin), &
9775 matrix_out=m_model_hessian_inv(ispin), &
9776 nocc=almo_scf_env%nocc_of_domain(:, ispin) &
9783 DO ispin = 1, nspins
9784 CALL dbcsr_copy(m_model_hessian_inv(ispin), &
9785 m_model_hessian(ispin))
9787 para_env=almo_scf_env%para_env, &
9788 blacs_env=almo_scf_env%blacs_env)
9790 para_env=almo_scf_env%para_env, &
9791 blacs_env=almo_scf_env%blacs_env, &
9792 upper_to_full=.true.)
9793 CALL dbcsr_filter(m_model_hessian_inv(ispin), &
9794 almo_scf_env%eps_filter)
9799 DO ispin = 1, nspins
9801 matrix_main=m_model_hessian(ispin), &
9802 subm_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
9803 subm_r_down=domain_r_down(:, ispin), &
9804 matrix_trimmer=quench_t(ispin), &
9805 dpattern=quench_t(ispin), &
9806 map=almo_scf_env%domain_map(ispin), &
9807 node_of_domain=almo_scf_env%cpu_of_domain, &
9809 use_trimmer=.false., &
9811 skip_inversion=.false. &
9848 cpabort(
"Unknown preconditioner")
9853 DO ispin = 1, nspins
9859 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
9860 m_model_hessian_inv(ispin), &
9862 0.0_dp, m_model_bd(ispin), &
9863 filter_eps=almo_scf_env%eps_filter)
9868 matrix_in=m_model_r(ispin), &
9869 matrix_out=m_model_bd(ispin), &
9870 operator1=domain_model_hessian_inv(:, ispin), &
9871 dpattern=quench_t(ispin), &
9872 map=almo_scf_env%domain_map(ispin), &
9873 node_of_domain=almo_scf_env%cpu_of_domain, &
9875 filter_eps=almo_scf_env%eps_filter)
9882 CALL contravariant_matrix_norm( &
9883 norm_out=step_norm, &
9884 matrix_in=m_model_bd, &
9885 metric_in=almo_scf_env%matrix_s, &
9886 quench_t_in=quench_t, &
9887 eps_filter_in=almo_scf_env%eps_filter &
9889 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...pB norm: ", step_norm
9892 IF (step_norm .LE. radius_current)
THEN
9894 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Full dogleg"
9896 border_reached = .false.
9898 DO ispin = 1, nspins
9899 CALL dbcsr_copy(step(ispin), m_model_bd(ispin))
9902 fake_step_size_to_report = 2.0_dp
9903 iteration_type_to_report = 6
9907 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...pB norm is too large"
9909 border_reached = .true.
9913 DO ispin = 1, nspins
9914 CALL dbcsr_add(m_model_bd(ispin), step(ispin), 1.0_dp, -1.0_dp)
9917 CALL step_size_to_border( &
9918 step_size_out=step_size, &
9919 metric_in=almo_scf_env%matrix_s, &
9921 direction_in=m_model_bd, &
9922 trust_radius_in=radius_current, &
9923 quench_t_in=quench_t, &
9924 eps_filter_in=almo_scf_env%eps_filter &
9926 IF (unit_nr > 0 .AND. debug_mode)
WRITE (unit_nr, *)
"...Step size to border: ", step_size
9927 IF (step_size .GT. 1.0_dp .OR. step_size .LT. 0.0_dp)
THEN
9929 WRITE (unit_nr, *)
"Step size (", step_size,
") must lie inside (0,1)"
9930 cpabort(
"Wrong dog leg step. We should never end up here.")
9933 DO ispin = 1, nspins
9934 CALL dbcsr_add(step(ispin), m_model_bd(ispin), 1.0_dp, step_size)
9937 fake_step_size_to_report = 1.0_dp + step_size
9938 iteration_type_to_report = 7
9942 IF (debug_mode)
THEN
9944 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Extra norm evaluation"
9945 CALL contravariant_matrix_norm( &
9946 norm_out=step_norm, &
9948 metric_in=almo_scf_env%matrix_s, &
9949 quench_t_in=quench_t, &
9950 eps_filter_in=almo_scf_env%eps_filter &
9952 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Step norm: ", step_norm
9953 IF (unit_nr > 0)
WRITE (unit_nr, *)
"...Current radius: ", radius_current
9956 CALL predicted_reduction( &
9957 reduction_out=expected_reduction, &
9960 hess_in=m_model_hessian, &
9961 hess_submatrix_in=almo_scf_env%domain_preconditioner, &
9962 quench_t_in=quench_t, &
9963 special_case=my_special_case, &
9964 eps_filter=almo_scf_env%eps_filter, &
9965 domain_map=almo_scf_env%domain_map, &
9966 cpu_of_domain=almo_scf_env%cpu_of_domain &
9969 inner_loop_success = .true.
9972 CALL fixed_r_report(unit_nr, &
9973 iter_type=iteration_type_to_report, &
9974 iteration=iteration, &
9975 step_size=fake_step_size_to_report, &
9976 border_reached=border_reached, &
9977 curvature=y_scalar, &
9978 grad_norm_ratio=expected_reduction, &
9986 DO ispin = 1, nspins
9988 CALL dbcsr_copy(m_model_r_prev(ispin), m_model_r(ispin))
9989 CALL dbcsr_add(m_model_r(ispin), m_model_bd(ispin), &
9994 DO ispin = 1, nspins
9995 CALL dbcsr_norm(m_model_r(ispin), dbcsr_norm_maxabsnorm, &
9996 norm_scalar=grad_norm_spin(ispin))
10000 model_grad_norm = maxval(grad_norm_spin)
10003 grad_norm_ratio = model_grad_norm/grad_norm_ref
10004 IF (grad_norm_ratio .LT. optimizer%model_grad_norm_ratio)
THEN
10006 border_reached = .false.
10007 inner_loop_success = .true.
10009 CALL predicted_reduction( &
10010 reduction_out=expected_reduction, &
10013 hess_in=m_model_hessian, &
10014 hess_submatrix_in=almo_scf_env%domain_preconditioner, &
10015 quench_t_in=quench_t, &
10016 special_case=my_special_case, &
10017 eps_filter=almo_scf_env%eps_filter, &
10018 domain_map=almo_scf_env%domain_map, &
10019 cpu_of_domain=almo_scf_env%cpu_of_domain &
10023 CALL fixed_r_report(unit_nr, &
10025 iteration=iteration, &
10026 step_size=step_size, &
10027 border_reached=border_reached, &
10028 curvature=y_scalar, &
10029 grad_norm_ratio=expected_reduction, &
10037 DO ispin = 1, nspins
10039 CALL dbcsr_copy(m_model_rt_prev(ispin), m_model_rt(ispin))
10042 DO ispin = 1, nspins
10047 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
10049 m_model_r(ispin), &
10050 0.0_dp, m_model_rt(ispin), &
10051 filter_eps=almo_scf_env%eps_filter)
10056 matrix_in=m_model_r(ispin), &
10057 matrix_out=m_model_rt(ispin), &
10058 operator1=almo_scf_env%domain_s_inv(:, ispin), &
10059 dpattern=quench_t(ispin), &
10060 map=almo_scf_env%domain_map(ispin), &
10061 node_of_domain=almo_scf_env%cpu_of_domain, &
10063 filter_eps=almo_scf_env%eps_filter)
10069 CALL compute_cg_beta( &
10071 reset_conjugator=reset_conjugator, &
10072 conjugator=optimizer%conjugator, &
10073 grad=m_model_r(:), &
10074 prev_grad=m_model_r_prev(:), &
10075 step=m_model_rt(:), &
10076 prev_step=m_model_rt_prev(:) &
10079 DO ispin = 1, nspins
10081 CALL dbcsr_add(m_model_d(ispin), m_model_rt(ispin), beta, 1.0_dp)
10085 CALL fixed_r_report(unit_nr, &
10087 iteration=iteration, &
10088 step_size=step_size, &
10089 border_reached=border_reached, &
10090 curvature=y_scalar, &
10091 grad_norm_ratio=grad_norm_ratio, &
10095 END DO fixed_r_loop
10100 IF (.NOT. inner_loop_success)
THEN
10101 cpabort(
"Inner loop did not produce solution")
10104 DO ispin = 1, nspins
10106 CALL dbcsr_copy(m_theta_trial(ispin), m_theta(ispin))
10107 CALL dbcsr_add(m_theta_trial(ispin), step(ispin), 1.0_dp, 1.0_dp)
10113 CALL main_var_to_xalmos_and_loss_func( &
10114 almo_scf_env=almo_scf_env, &
10116 m_main_var_in=m_theta_trial, &
10117 m_t_out=matrix_t_out, &
10118 m_sig_sqrti_ii_out=m_sig_sqrti_ii, &
10119 energy_out=energy_trial, &
10120 penalty_out=penalty_trial, &
10121 m_ftsiginv_out=ftsiginv, &
10122 m_siginvtftsiginv_out=siginvtftsiginv, &
10124 m_stsiginv0_in=stsiginv_0, &
10125 m_quench_t_in=quench_t, &
10126 domain_r_down_in=domain_r_down, &
10127 assume_t0_q0x=assume_t0_q0x, &
10128 just_started=.false., &
10129 optimize_theta=optimize_theta, &
10130 normalize_orbitals=normalize_orbitals, &
10131 perturbation_only=perturbation_only, &
10132 do_penalty=penalty_occ_vol, &
10133 special_case=my_special_case)
10134 loss_trial = energy_trial + penalty_trial
10137 rho = (loss_trial - loss_start)/expected_reduction
10138 loss_change_to_report = loss_trial - loss_start
10140 IF (rho < 0.25_dp)
THEN
10141 radius_current = 0.25_dp*radius_current
10143 IF (rho > 0.75_dp .AND. border_reached)
THEN
10144 radius_current = min(2.0_dp*radius_current, radius_max)
10148 IF (rho > eta)
THEN
10149 DO ispin = 1, nspins
10150 CALL dbcsr_copy(m_theta(ispin), m_theta_trial(ispin))
10152 loss_start = loss_trial
10153 energy_start = energy_trial
10154 penalty_start = penalty_trial
10155 same_position = .false.
10157 almo_scf_env%almo_scf_energy = energy_trial
10160 same_position = .true.
10162 almo_scf_env%almo_scf_energy = energy_start
10167 CALL trust_r_report(unit_nr, &
10169 iteration=outer_iteration, &
10171 delta_loss=loss_change_to_report, &
10172 grad_norm=0.0_dp, &
10173 predicted_reduction=expected_reduction, &
10175 radius=radius_current, &
10176 new=.NOT. same_position, &
10177 time=t2outer - t1outer)
10180 END DO adjust_r_loop
10183 IF (scf_converged)
THEN
10185 CALL wrap_up_xalmo_scf( &
10187 almo_scf_env=almo_scf_env, &
10188 perturbation_in=perturbation_only, &
10189 m_xalmo_in=matrix_t_out, &
10190 m_quench_in=quench_t, &
10191 energy_inout=energy_start)
10195 DO ispin = 1, nspins
10196 CALL dbcsr_release(m_model_hessian_inv(ispin))
10197 CALL dbcsr_release(m_model_hessian(ispin))
10198 CALL dbcsr_release(stsiginv_0(ispin))
10199 CALL dbcsr_release(st(ispin))
10200 CALL dbcsr_release(ftsiginv(ispin))
10201 CALL dbcsr_release(siginvtftsiginv(ispin))
10202 CALL dbcsr_release(prev_step(ispin))
10203 CALL dbcsr_release(grad(ispin))
10204 CALL dbcsr_release(step(ispin))
10205 CALL dbcsr_release(m_theta(ispin))
10206 CALL dbcsr_release(m_sig_sqrti_ii(ispin))
10207 CALL dbcsr_release(m_model_r(ispin))
10208 CALL dbcsr_release(m_model_rt(ispin))
10209 CALL dbcsr_release(m_model_d(ispin))
10210 CALL dbcsr_release(m_model_bd(ispin))
10211 CALL dbcsr_release(m_model_r_prev(ispin))
10212 CALL dbcsr_release(m_model_rt_prev(ispin))
10213 CALL dbcsr_release(m_theta_trial(ispin))
10214 CALL release_submatrices(domain_r_down(:, ispin))
10215 CALL release_submatrices(domain_model_hessian_inv(:, ispin))
10220 CALL dbcsr_release(m_s_inv)
10223 DEALLOCATE (m_model_hessian)
10224 DEALLOCATE (m_model_hessian_inv)
10225 DEALLOCATE (siginvtftsiginv)
10226 DEALLOCATE (stsiginv_0)
10227 DEALLOCATE (ftsiginv)
10230 DEALLOCATE (prev_step)
10232 DEALLOCATE (m_sig_sqrti_ii)
10233 DEALLOCATE (m_model_r)
10234 DEALLOCATE (m_model_rt)
10235 DEALLOCATE (m_model_d)
10236 DEALLOCATE (m_model_bd)
10237 DEALLOCATE (m_model_r_prev)
10238 DEALLOCATE (m_model_rt_prev)
10239 DEALLOCATE (m_theta_trial)
10241 DEALLOCATE (domain_r_down)
10242 DEALLOCATE (domain_model_hessian_inv)
10244 DEALLOCATE (penalty_occ_vol_g_prefactor)
10245 DEALLOCATE (penalty_occ_vol_h_prefactor)
10246 DEALLOCATE (grad_norm_spin)
10249 DEALLOCATE (m_theta)
10251 IF (.NOT. scf_converged .AND. .NOT. optimizer%early_stopping_on)
THEN
10252 cpabort(
"Optimization not converged! ")
10255 CALL timestop(handle)
10288 SUBROUTINE main_var_to_xalmos_and_loss_func(almo_scf_env, qs_env, m_main_var_in, &
10289 m_t_out, energy_out, penalty_out, m_sig_sqrti_ii_out, m_FTsiginv_out, &
10290 m_siginvTFTsiginv_out, m_ST_out, m_STsiginv0_in, m_quench_t_in, domain_r_down_in, &
10291 assume_t0_q0x, just_started, optimize_theta, normalize_orbitals, perturbation_only, &
10292 do_penalty, special_case)
10294 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
10295 TYPE(qs_environment_type),
POINTER :: qs_env
10296 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_main_var_in
10297 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_t_out
10298 REAL(kind=
dp),
INTENT(OUT) :: energy_out, penalty_out
10299 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: m_sig_sqrti_ii_out, m_ftsiginv_out, &
10300 m_siginvtftsiginv_out, m_st_out
10301 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_stsiginv0_in, m_quench_t_in
10302 TYPE(domain_submatrix_type),
DIMENSION(:, :), &
10303 INTENT(IN) :: domain_r_down_in
10304 LOGICAL,
INTENT(IN) :: assume_t0_q0x, just_started, &
10305 optimize_theta, normalize_orbitals, &
10306 perturbation_only, do_penalty
10307 INTEGER,
INTENT(IN) :: special_case
10309 CHARACTER(len=*),
PARAMETER :: routinen =
'main_var_to_xalmos_and_loss_func'
10311 INTEGER :: handle, ispin, nspins
10312 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nocc
10313 REAL(kind=
dp) :: det1, energy_ispin, penalty_amplitude, &
10316 CALL timeset(routinen, handle)
10318 energy_out = 0.0_dp
10319 penalty_out = 0.0_dp
10321 nspins =
SIZE(m_main_var_in)
10322 IF (nspins == 1)
THEN
10323 spin_factor = 2.0_dp
10325 spin_factor = 1.0_dp
10328 penalty_amplitude = 0.0_dp
10330 ALLOCATE (nocc(nspins))
10331 DO ispin = 1, nspins
10332 CALL dbcsr_get_info(almo_scf_env%matrix_sigma_inv(ispin), &
10333 nfullrows_total=nocc(ispin))
10336 DO ispin = 1, nspins
10339 CALL compute_xalmos_from_main_var( &
10340 m_var_in=m_main_var_in(ispin), &
10341 m_t_out=m_t_out(ispin), &
10342 m_quench_t=m_quench_t_in(ispin), &
10343 m_t0=almo_scf_env%matrix_t_blk(ispin), &
10344 m_oo_template=almo_scf_env%matrix_sigma_inv(ispin), &
10345 m_stsiginv0=m_stsiginv0_in(ispin), &
10346 m_s=almo_scf_env%matrix_s(1), &
10347 m_sig_sqrti_ii_out=m_sig_sqrti_ii_out(ispin), &
10348 domain_r_down=domain_r_down_in(:, ispin), &
10349 domain_s_inv=almo_scf_env%domain_s_inv(:, ispin), &
10350 domain_map=almo_scf_env%domain_map(ispin), &
10351 cpu_of_domain=almo_scf_env%cpu_of_domain, &
10352 assume_t0_q0x=assume_t0_q0x, &
10353 just_started=just_started, &
10354 optimize_theta=optimize_theta, &
10355 normalize_orbitals=normalize_orbitals, &
10356 envelope_amplitude=almo_scf_env%envelope_amplitude, &
10357 eps_filter=almo_scf_env%eps_filter, &
10358 special_case=special_case, &
10359 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
10360 order_lanczos=almo_scf_env%order_lanczos, &
10361 eps_lanczos=almo_scf_env%eps_lanczos, &
10362 max_iter_lanczos=almo_scf_env%max_iter_lanczos)
10366 t=m_t_out(ispin), &
10367 p=almo_scf_env%matrix_p(ispin), &
10368 eps_filter=almo_scf_env%eps_filter, &
10369 orthog_orbs=.false., &
10370 nocc_of_domain=almo_scf_env%nocc_of_domain(:, ispin), &
10371 s=almo_scf_env%matrix_s(1), &
10372 sigma=almo_scf_env%matrix_sigma(ispin), &
10373 sigma_inv=almo_scf_env%matrix_sigma_inv(ispin), &
10374 use_guess=.false., &
10375 algorithm=almo_scf_env%sigma_inv_algorithm, &
10376 inv_eps_factor=almo_scf_env%matrix_iter_eps_error_factor, &
10377 inverse_accelerator=almo_scf_env%order_lanczos, &
10378 eps_lanczos=almo_scf_env%eps_lanczos, &
10379 max_iter_lanczos=almo_scf_env%max_iter_lanczos, &
10380 para_env=almo_scf_env%para_env, &
10381 blacs_env=almo_scf_env%blacs_env)
10384 CALL dbcsr_scale(almo_scf_env%matrix_p(ispin), &
10390 IF (perturbation_only)
THEN
10392 IF (just_started)
THEN
10393 DO ispin = 1, nspins
10394 CALL dbcsr_copy(almo_scf_env%matrix_ks(ispin), &
10395 almo_scf_env%matrix_ks_0deloc(ispin))
10401 almo_scf_env%matrix_p, &
10402 almo_scf_env%matrix_ks, &
10404 almo_scf_env%eps_filter, &
10405 almo_scf_env%mat_distr_aos)
10408 penalty_out = 0.0_dp
10409 DO ispin = 1, nspins
10411 CALL compute_frequently_used_matrices( &
10412 filter_eps=almo_scf_env%eps_filter, &
10413 m_t_in=m_t_out(ispin), &
10414 m_siginv_in=almo_scf_env%matrix_sigma_inv(ispin), &
10415 m_s_in=almo_scf_env%matrix_s(1), &
10416 m_f_in=almo_scf_env%matrix_ks(ispin), &
10417 m_ftsiginv_out=m_ftsiginv_out(ispin), &
10418 m_siginvtftsiginv_out=m_siginvtftsiginv_out(ispin), &
10419 m_st_out=m_st_out(ispin))
10421 IF (perturbation_only)
THEN
10423 IF (ispin .EQ. 1) energy_out = 0.0_dp
10424 CALL dbcsr_dot(m_t_out(ispin), m_ftsiginv_out(ispin), energy_ispin)
10425 energy_out = energy_out + energy_ispin*spin_factor
10428 IF (do_penalty)
THEN
10430 CALL determinant(almo_scf_env%matrix_sigma(ispin), det1, &
10431 almo_scf_env%eps_filter)
10432 penalty_out = penalty_out - &
10433 penalty_amplitude*spin_factor*nocc(ispin)*log(det1)
10441 CALL timestop(handle)
10443 END SUBROUTINE main_var_to_xalmos_and_loss_func
10460 SUBROUTINE step_size_to_border(step_size_out, metric_in, position_in, &
10461 direction_in, trust_radius_in, quench_t_in, eps_filter_in)
10463 REAL(kind=
dp),
INTENT(INOUT) :: step_size_out
10464 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: metric_in, position_in, direction_in
10465 REAL(kind=
dp),
INTENT(IN) :: trust_radius_in
10466 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: quench_t_in
10467 REAL(kind=
dp),
INTENT(IN) :: eps_filter_in
10469 INTEGER :: isol, ispin, nsolutions, &
10470 nsolutions_found, nspins
10471 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nocc
10472 REAL(kind=
dp) :: discrim_sign, discriminant, solution, &
10473 spin_factor, temp_real
10474 REAL(kind=
dp),
DIMENSION(3) :: coef
10475 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: m_temp_no
10477 step_size_out = 0.0_dp
10479 nspins =
SIZE(position_in)
10480 IF (nspins == 1)
THEN
10481 spin_factor = 2.0_dp
10483 spin_factor = 1.0_dp
10486 ALLOCATE (nocc(nspins))
10487 ALLOCATE (m_temp_no(nspins))
10490 DO ispin = 1, nspins
10492 CALL dbcsr_create(m_temp_no(ispin), &
10493 template=direction_in(ispin))
10495 CALL dbcsr_get_info(direction_in(ispin), &
10496 nfullcols_total=nocc(ispin))
10498 CALL dbcsr_copy(m_temp_no(ispin), quench_t_in(ispin))
10499 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
10501 position_in(ispin), &
10502 0.0_dp, m_temp_no(ispin), &
10503 retain_sparsity=.true.)
10504 CALL dbcsr_filter(m_temp_no(ispin), eps_filter_in)
10505 CALL dbcsr_dot(position_in(ispin), m_temp_no(ispin), temp_real)
10506 coef(3) = coef(3) + temp_real/nocc(ispin)
10507 CALL dbcsr_dot(direction_in(ispin), m_temp_no(ispin), temp_real)
10508 coef(2) = coef(2) + 2.0_dp*temp_real/nocc(ispin)
10509 CALL dbcsr_copy(m_temp_no(ispin), quench_t_in(ispin))
10510 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
10512 direction_in(ispin), &
10513 0.0_dp, m_temp_no(ispin), &
10514 retain_sparsity=.true.)
10515 CALL dbcsr_filter(m_temp_no(ispin), eps_filter_in)
10516 CALL dbcsr_dot(direction_in(ispin), m_temp_no(ispin), temp_real)
10517 coef(1) = coef(1) + temp_real/nocc(ispin)
10519 CALL dbcsr_release(m_temp_no(ispin))
10524 DEALLOCATE (m_temp_no)
10526 coef(:) = coef(:)*spin_factor
10527 coef(3) = coef(3) - trust_radius_in*trust_radius_in
10530 discriminant = coef(2)*coef(2) - 4.0_dp*coef(1)*coef(3)
10531 IF (discriminant .GT. tiny(discriminant))
THEN
10533 ELSE IF (discriminant .LT. 0.0_dp)
THEN
10535 cpabort(
"Step to border: no solutions")
10540 discrim_sign = 1.0_dp
10541 nsolutions_found = 0
10542 DO isol = 1, nsolutions
10543 solution = (-coef(2) + discrim_sign*sqrt(discriminant))/(2.0_dp*coef(1))
10544 IF (solution .GT. 0.0_dp)
THEN
10545 nsolutions_found = nsolutions_found + 1
10546 step_size_out = solution
10548 discrim_sign = -discrim_sign
10551 IF (nsolutions_found == 0)
THEN
10552 cpabort(
"Step to border: no positive solutions")
10553 ELSE IF (nsolutions_found == 2)
THEN
10554 cpabort(
"Two positive border steps possible!")
10557 END SUBROUTINE step_size_to_border
10570 SUBROUTINE contravariant_matrix_norm(norm_out, matrix_in, metric_in, &
10571 quench_t_in, eps_filter_in)
10573 REAL(kind=
dp),
INTENT(OUT) :: norm_out
10574 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: matrix_in, metric_in, quench_t_in
10575 REAL(kind=
dp),
INTENT(IN) :: eps_filter_in
10577 INTEGER :: ispin, nspins
10578 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nocc
10579 REAL(kind=
dp) :: my_norm, spin_factor, temp_real
10580 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: m_temp_no
10585 nspins =
SIZE(matrix_in)
10586 IF (nspins == 1)
THEN
10587 spin_factor = 2.0_dp
10589 spin_factor = 1.0_dp
10592 ALLOCATE (nocc(nspins))
10593 ALLOCATE (m_temp_no(nspins))
10596 DO ispin = 1, nspins
10598 CALL dbcsr_create(m_temp_no(ispin), template=matrix_in(ispin))
10600 CALL dbcsr_get_info(matrix_in(ispin), &
10601 nfullcols_total=nocc(ispin))
10603 CALL dbcsr_copy(m_temp_no(ispin), quench_t_in(ispin))
10604 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
10606 matrix_in(ispin), &
10607 0.0_dp, m_temp_no(ispin), &
10608 retain_sparsity=.true.)
10609 CALL dbcsr_filter(m_temp_no(ispin), eps_filter_in)
10610 CALL dbcsr_dot(matrix_in(ispin), m_temp_no(ispin), temp_real)
10612 my_norm = my_norm + temp_real/nocc(ispin)
10614 CALL dbcsr_release(m_temp_no(ispin))
10619 DEALLOCATE (m_temp_no)
10621 my_norm = my_norm*spin_factor
10622 norm_out = sqrt(my_norm)
10624 END SUBROUTINE contravariant_matrix_norm
10643 SUBROUTINE predicted_reduction(reduction_out, grad_in, step_in, hess_in, &
10644 hess_submatrix_in, quench_t_in, special_case, eps_filter, domain_map, &
10648 REAL(kind=
dp),
INTENT(INOUT) :: reduction_out
10649 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: grad_in, step_in, hess_in
10650 TYPE(domain_submatrix_type),
DIMENSION(:, :), &
10651 INTENT(IN) :: hess_submatrix_in
10652 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: quench_t_in
10653 INTEGER,
INTENT(IN) :: special_case
10654 REAL(kind=
dp),
INTENT(IN) :: eps_filter
10655 TYPE(domain_map_type),
DIMENSION(:),
INTENT(IN) :: domain_map
10656 INTEGER,
DIMENSION(:),
INTENT(IN) :: cpu_of_domain
10658 INTEGER :: ispin, nspins
10659 REAL(kind=
dp) :: my_reduction, spin_factor, temp_real
10660 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: m_temp_no
10662 reduction_out = 0.0_dp
10664 nspins =
SIZE(grad_in)
10665 IF (nspins == 1)
THEN
10666 spin_factor = 2.0_dp
10668 spin_factor = 1.0_dp
10671 ALLOCATE (m_temp_no(nspins))
10673 my_reduction = 0.0_dp
10674 DO ispin = 1, nspins
10676 CALL dbcsr_create(m_temp_no(ispin), template=grad_in(ispin))
10678 CALL dbcsr_dot(step_in(ispin), grad_in(ispin), temp_real)
10679 my_reduction = my_reduction + temp_real
10685 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
10688 0.0_dp, m_temp_no(ispin), &
10689 filter_eps=eps_filter)
10694 matrix_in=step_in(ispin), &
10695 matrix_out=m_temp_no(ispin), &
10696 operator1=hess_submatrix_in(:, ispin), &
10697 dpattern=quench_t_in(ispin), &
10698 map=domain_map(ispin), &
10699 node_of_domain=cpu_of_domain, &
10701 filter_eps=eps_filter)
10706 CALL dbcsr_dot(step_in(ispin), m_temp_no(ispin), temp_real)
10707 my_reduction = my_reduction + 0.5_dp*temp_real
10709 CALL dbcsr_release(m_temp_no(ispin))
10714 my_reduction = spin_factor*my_reduction
10716 reduction_out = my_reduction
10718 DEALLOCATE (m_temp_no)
10720 END SUBROUTINE predicted_reduction
10737 SUBROUTINE fixed_r_report(unit_nr, iter_type, iteration, step_size, &
10738 border_reached, curvature, grad_norm_ratio, predicted_reduction, time)
10740 INTEGER,
INTENT(IN) :: unit_nr, iter_type, iteration
10741 REAL(kind=
dp),
INTENT(IN) :: step_size
10742 LOGICAL,
INTENT(IN) :: border_reached
10743 REAL(kind=
dp),
INTENT(IN) :: curvature
10744 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: grad_norm_ratio, predicted_reduction
10745 REAL(kind=
dp),
INTENT(IN) :: time
10747 CHARACTER(LEN=20) :: iter_type_str
10748 REAL(kind=
dp) :: loss_or_grad_change
10750 loss_or_grad_change = 0.0_dp
10751 IF (
PRESENT(grad_norm_ratio))
THEN
10752 loss_or_grad_change = grad_norm_ratio
10753 ELSE IF (
PRESENT(predicted_reduction))
THEN
10754 loss_or_grad_change = predicted_reduction
10756 cpabort(
"one argument is missing")
10759 SELECT CASE (iter_type)
10761 iter_type_str = trim(
"Ignored")
10763 iter_type_str = trim(
"PCG")
10765 iter_type_str = trim(
"Neg. curvatr.")
10767 iter_type_str = trim(
"Step too long")
10769 iter_type_str = trim(
"Grad. reduced")
10771 iter_type_str = trim(
"Cauchy point")
10773 iter_type_str = trim(
"Full dogleg")
10775 iter_type_str = trim(
"Part. dogleg")
10777 cpabort(
"unknown report type")
10780 IF (unit_nr > 0)
THEN
10782 SELECT CASE (iter_type)
10786 WRITE (unit_nr,
'(T4,A15,A6,A10,A10,A7,A20,A8)') &
10792 "Grad/o.f. reduc", &
10797 WRITE (unit_nr,
'(T4,A15,I6,F10.5,F10.5,L7,F20.10,F8.2)') &
10800 curvature, step_size, border_reached, &
10801 loss_or_grad_change, &
10807 SELECT CASE (iter_type)
10808 CASE (2, 3, 4, 5, 6, 7)
10816 END SUBROUTINE fixed_r_report
10835 SUBROUTINE trust_r_report(unit_nr, iter_type, iteration, radius, &
10836 loss, delta_loss, grad_norm, predicted_reduction, rho, new, time)
10838 INTEGER,
INTENT(IN) :: unit_nr, iter_type, iteration
10839 REAL(kind=
dp),
INTENT(IN) :: radius, loss, delta_loss, grad_norm, &
10840 predicted_reduction, rho
10841 LOGICAL,
INTENT(IN) :: new
10842 REAL(kind=
dp),
INTENT(IN) :: time
10844 CHARACTER(LEN=20) :: iter_status, iter_type_str
10846 SELECT CASE (iter_type)
10848 iter_type_str = trim(
"Iter")
10849 iter_status = trim(
"Stat")
10851 iter_type_str = trim(
"TR INI")
10853 iter_status =
" New"
10855 iter_status =
" Redo"
10858 iter_type_str = trim(
"TR FIN")
10860 iter_status =
" Acc"
10862 iter_status =
" Rej"
10865 cpabort(
"unknown report type")
10868 IF (unit_nr > 0)
THEN
10870 SELECT CASE (iter_type)
10873 WRITE (unit_nr,
'(T2,A6,A5,A6,A22,A10,T67,A7,A6)') &
10877 "Objective Function", &
10881 WRITE (unit_nr,
'(T41,A10,A10,A6)') &
10885 "Change",
"Expct.",
"Rho"
10891 WRITE (unit_nr,
'(T2,A6,A5,I6,F22.10,ES10.2,T67,ES7.0,F6.1)') &
10902 WRITE (unit_nr,
'(T2,A6,A5,I6,F22.10,ES10.2,ES10.2,F6.1,ES7.0,F6.1)') &
10907 delta_loss, predicted_reduction, rho, &
10914 END SUBROUTINE trust_r_report
10922 SUBROUTINE energy_lowering_report(unit_nr, ref_energy, energy_lowering)
10924 INTEGER,
INTENT(IN) :: unit_nr
10925 REAL(kind=
dp),
INTENT(IN) :: ref_energy, energy_lowering
10928 IF (unit_nr > 0)
THEN
10930 WRITE (unit_nr,
'(T2,A35,F25.10)')
"ENERGY OF BLOCK-DIAGONAL ALMOs:", &
10932 WRITE (unit_nr,
'(T2,A35,F25.10)')
"ENERGY LOWERING:", &
10934 WRITE (unit_nr,
'(T2,A35,F25.10)')
"CORRECTED ENERGY:", &
10935 ref_energy + energy_lowering
10939 END SUBROUTINE energy_lowering_report
10951 SUBROUTINE wrap_up_xalmo_scf(qs_env, almo_scf_env, perturbation_in, &
10952 m_xalmo_in, m_quench_in, energy_inout)
10954 TYPE(qs_environment_type),
POINTER :: qs_env
10955 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
10956 LOGICAL,
INTENT(IN) :: perturbation_in
10957 TYPE(dbcsr_type),
DIMENSION(:),
INTENT(IN) :: m_xalmo_in, m_quench_in
10958 REAL(kind=
dp),
INTENT(INOUT) :: energy_inout
10960 CHARACTER(len=*),
PARAMETER :: routinen =
'wrap_up_xalmo_scf'
10962 INTEGER :: eda_unit, handle, ispin, nspins, unit_nr
10963 TYPE(cp_logger_type),
POINTER :: logger
10964 TYPE(dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: m_temp_no1, m_temp_no2
10965 TYPE(section_vals_type),
POINTER :: almo_print_section, input
10967 CALL timeset(routinen, handle)
10971 IF (logger%para_env%is_source())
THEN
10977 nspins = almo_scf_env%nspins
10981 IF (perturbation_in)
THEN
10983 ALLOCATE (m_temp_no1(nspins))
10984 ALLOCATE (m_temp_no2(nspins))
10986 DO ispin = 1, nspins
10987 CALL dbcsr_create(m_temp_no1(ispin), template=m_xalmo_in(ispin))
10988 CALL dbcsr_create(m_temp_no2(ispin), template=m_xalmo_in(ispin))
10993 almo_scf_env%mat_distr_aos)
10998 CALL xalmo_analysis( &
10999 detailed_analysis=almo_scf_env%almo_analysis%do_analysis, &
11000 eps_filter=almo_scf_env%eps_filter, &
11001 m_t_in=m_xalmo_in, &
11002 m_t0_in=almo_scf_env%matrix_t_blk, &
11003 m_siginv_in=almo_scf_env%matrix_sigma_inv, &
11004 m_siginv0_in=almo_scf_env%matrix_sigma_inv_0deloc, &
11005 m_s_in=almo_scf_env%matrix_s, &
11006 m_ks0_in=almo_scf_env%matrix_ks_0deloc, &
11007 m_quench_t_in=m_quench_in, &
11008 energy_out=energy_inout, &
11009 m_eda_out=m_temp_no1, &
11010 m_cta_out=m_temp_no2 &
11013 IF (almo_scf_env%almo_analysis%do_analysis)
THEN
11015 DO ispin = 1, nspins
11018 IF (unit_nr > 0)
THEN
11019 WRITE (unit_nr,
'(T2,A)')
"DECOMPOSITION OF THE DELOCALIZATION ENERGY"
11026 "ALMO_EDA_CT", extension=
".dat", local=.true.)
11027 CALL dbcsr_print_block_sum(m_temp_no1(ispin), eda_unit)
11029 "ALMO_EDA_CT", local=.true.)
11032 IF (unit_nr > 0)
THEN
11033 WRITE (unit_nr,
'(T2,A)')
"DECOMPOSITION OF CHARGE TRANSFER TERMS"
11037 "ALMO_CTA", extension=
".dat", local=.true.)
11038 CALL dbcsr_print_block_sum(m_temp_no2(ispin), eda_unit)
11040 "ALMO_CTA", local=.true.)
11046 CALL energy_lowering_report( &
11048 ref_energy=almo_scf_env%almo_scf_energy, &
11049 energy_lowering=energy_inout)
11051 energy=almo_scf_env%almo_scf_energy, &
11052 energy_singles_corr=energy_inout)
11054 DO ispin = 1, nspins
11055 CALL dbcsr_release(m_temp_no1(ispin))
11056 CALL dbcsr_release(m_temp_no2(ispin))
11059 DEALLOCATE (m_temp_no1)
11060 DEALLOCATE (m_temp_no2)
11065 energy=energy_inout)
11069 CALL timestop(handle)
11071 END SUBROUTINE wrap_up_xalmo_scf
A DIIS implementation for the ALMO-based SCF methods.
subroutine, public almo_scf_diis_release(diis_env)
destroys the diis structure
subroutine, public almo_scf_diis_extrapolate(diis_env, extr_var, d_extr_var)
extrapolates the variable using the saved history
subroutine, public almo_scf_diis_push(diis_env, var, err, d_var, d_err)
adds a variable-error pair to the diis structure
subroutine, public lbfgs_create(history, nspins, nstore)
create history storage for limited memory bfgs
subroutine, public lbfgs_seed(history, variable, gradient)
interface subroutine to store the first variable/gradient pair
subroutine, public lbfgs_release(history)
release the bfgs history
subroutine, public lbfgs_get_direction(history, variable, gradient, direction)
interface subroutine to store a variable/gradient pair and predict direction
Subroutines for ALMO SCF.
subroutine, public construct_domain_preconditioner(matrix_main, subm_s_inv, subm_s_inv_half, subm_s_half, subm_r_down, matrix_trimmer, dpattern, map, node_of_domain, preconditioner, bad_modes_projector_down, use_trimmer, eps_zero_eigenvalues, my_action, skip_inversion)
Constructs preconditioners for each domain -1. projected preconditioner 0. simple preconditioner.
subroutine, public almo_scf_ks_xx_to_tv_xx(almo_scf_env)
ALMOs by diagonalizing the KS domain submatrices computes both the occupied and virtual orbitals.
subroutine, public xalmo_initial_guess(m_guess, m_t_in, m_t0, m_quench_t, m_overlap, m_sigma_tmpl, nspins, xalmo_history, assume_t0_q0x, optimize_theta, envelope_amplitude, eps_filter, order_lanczos, eps_lanczos, max_iter_lanczos, nocc_of_domain)
create the initial guess for XALMOs
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_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...
subroutine, public pseudo_invert_diagonal_blk(matrix_in, matrix_out, nocc)
inverts block-diagonal blocks of a dbcsr_matrix
subroutine, public almo_scf_ks_blk_to_tv_blk(almo_scf_env)
computes ALMOs by diagonalizing the projected blocked KS matrix uses the diagonalization code for blo...
subroutine, public apply_domain_operators(matrix_in, matrix_out, operator1, operator2, dpattern, map, node_of_domain, my_action, filter_eps, matrix_trimmer, use_trimmer)
Parallel code for domain specific operations (my_action) 0. out = op1 * in.
subroutine, public construct_domain_r_down(matrix_t, matrix_sigma_inv, matrix_s, subm_r_down, dpattern, map, node_of_domain, filter_eps)
Constructs subblocks of the covariant-covariant projectors (i.e. DM without spin factor)
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 construct_domain_s_inv(matrix_s, subm_s_inv, dpattern, map, node_of_domain)
Constructs S_inv block for each domain.
subroutine, public almo_scf_ks_to_ks_blk(almo_scf_env)
computes the projected KS from the total KS matrix also computes the DIIS error vector as a by-produc...
subroutine, public get_overlap(bra, ket, overlap, metric, retain_overlap_sparsity, eps_filter, smear)
Computes the overlap matrix of MO orbitals.
subroutine, public fill_matrix_with_ones(matrix)
Fill all matrix blocks with 1.0_dp.
subroutine, public apply_projector(psi_in, psi_out, psi_projector, metric, project_out, psi_projector_orthogonal, proj_in_template, eps_filter, sig_inv_projector, sig_inv_template)
applies projector to the orbitals |psi_out> = P |psi_in> OR |psi_out> = (1-P) |psi_in>,...
subroutine, public construct_domain_s_sqrt(matrix_s, subm_s_sqrt, subm_s_sqrt_inv, dpattern, map, node_of_domain)
Constructs S^(+1/2) and S^(-1/2) submatrices for each domain.
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_ks_to_ks_xx(almo_scf_env)
builds projected KS matrices for the overlapping domains also computes the DIIS error vector as a by-...
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 almo_scf_update_ks_energy(qs_env, energy, energy_singles_corr)
update qs_env total energy
subroutine, public matrix_qs_to_almo(matrix_qs, matrix_almo, mat_distr_aos, keep_sparsity)
convert between two types of matrices: QS style to ALMO style
subroutine, public almo_dm_to_qs_env(qs_env, matrix_p, mat_distr_aos)
return density matrix to the qs_env
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
Types for all ALMO-based methods.
Handles all functions related to the CELL.
methods related to the blacs parallel environment
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa, para_env, blacs_env)
...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, upper_to_full)
used to replace the cholesky decomposition by the inverse
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
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
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,...
Cayley transformation methods.
subroutine, public analytic_line_search(a, b, c, d, minima, nmins)
Finds real roots of a cubic equation a*x**3 + b*x**2 + c*x + d = 0 and returns only those roots for w...
subroutine, public diagonalize_diagonal_blocks(matrix, c, e)
Diagonalizes diagonal blocks of a symmetric dbcsr matrix and returs its eigenvectors.
subroutine, public ct_step_execute(cts_env)
Performs Cayley transformation.
Types for all cayley transformation methods.
subroutine, public ct_step_env_clean(env)
...
subroutine, public ct_step_env_set(env, para_env, blacs_env, use_occ_orbs, use_virt_orbs, tensor_type, occ_orbs_orthogonal, virt_orbs_orthogonal, neglect_quadratic_term, update_p, update_q, eps_convergence, eps_filter, max_iter, p_index_up, p_index_down, q_index_up, q_index_down, matrix_ks, matrix_p, matrix_qp_template, matrix_pq_template, matrix_t, matrix_v, matrix_x_guess, calculate_energy_corr, conjugator, qq_preconditioner_full, pp_preconditioner_full)
...
subroutine, public ct_step_env_init(env)
...
subroutine, public ct_step_env_get(env, use_occ_orbs, use_virt_orbs, tensor_type, occ_orbs_orthogonal, virt_orbs_orthogonal, neglect_quadratic_term, update_p, update_q, eps_convergence, eps_filter, max_iter, p_index_up, p_index_down, q_index_up, q_index_down, matrix_ks, matrix_p, matrix_qp_template, matrix_pq_template, matrix_t, matrix_v, copy_matrix_x, energy_correction, calculate_energy_corr, converged, qq_preconditioner_full, pp_preconditioner_full)
...
Subroutines to handle submatrices.
subroutine, public maxnorm_submatrices(submatrices, norm)
Computes the max norm of the collection of submatrices.
subroutine, public construct_submatrices(matrix, submatrix, distr_pattern, domain_map, node_of_domain, job_type)
Constructs submatrices for each ALMO domain by collecting distributed DBCSR blocks to local arrays.
Types to handle submatrices.
integer, parameter, public select_row
Routines useful for iterative matrix calculations.
recursive subroutine, public determinant(matrix, det, threshold)
Computes the determinant of a symmetric positive definite matrix using the trace of the matrix logari...
subroutine, public matrix_sqrt_newton_schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, eps_lanczos, max_iter_lanczos, symmetrize, converged)
compute the sqrt of a matrix via the sign function and the corresponding Newton-Schulz iterations the...
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 ...
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Interface to the message passing library MPI.
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
computes preconditioners, and implements methods to apply them currently used in qs_ot
Perform a QUICKSTEP wavefunction optimization (single point)
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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Some utilities for the construction of the localization environment.
subroutine, public compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
Computes the Berry operator for periodic systems used to define the spread of the MOS Here the matrix...
Localization methods such as 2x2 Jacobi rotations Steepest Decents Conjugate Gradient.
subroutine, public initialize_weights(cell, weights)
...