308 INTEGER,
OPTIONAL :: ortho_k
310 INTEGER :: i, k, m_diis, my_ortho_k, n, ncoef
316 NULLIFY (qs_ot_env%preconditioner)
317 NULLIFY (qs_ot_env%matrix_psc0)
318 NULLIFY (qs_ot_env%para_env)
319 NULLIFY (qs_ot_env%blacs_env)
322 para_env=para_env, context=context)
324 qs_ot_env%para_env => para_env
325 qs_ot_env%blacs_env => context
326 CALL para_env%retain()
327 CALL context%retain()
329 IF (
PRESENT(ortho_k))
THEN
335 m_diis = qs_ot_env%settings%diis_m
337 qs_ot_env%use_gx_old = .false.
338 qs_ot_env%use_dx = .false.
340 SELECT CASE (qs_ot_env%settings%ot_method)
344 qs_ot_env%use_gx_old = .true.
345 qs_ot_env%use_dx = .true.
346 CASE (
"DIIS",
"BROY")
347 IF (m_diis .LT. 1) cpabort(
"m_diis less than one")
349 cpabort(
"Unknown option")
352 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
353 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
354 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
355 qs_ot_env%ls_diis = 0.0_dp
356 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
357 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
358 ALLOCATE (qs_ot_env%c_broy(m_diis))
359 ALLOCATE (qs_ot_env%energy_h(m_diis))
360 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
363 ALLOCATE (qs_ot_env%evals(k))
364 ALLOCATE (qs_ot_env%dum(k))
366 NULLIFY (qs_ot_env%matrix_os)
367 NULLIFY (qs_ot_env%matrix_buf1_ortho)
368 NULLIFY (qs_ot_env%matrix_buf2_ortho)
369 NULLIFY (qs_ot_env%matrix_p)
370 NULLIFY (qs_ot_env%matrix_r)
371 NULLIFY (qs_ot_env%matrix_sinp)
372 NULLIFY (qs_ot_env%matrix_cosp)
373 NULLIFY (qs_ot_env%matrix_sinp_b)
374 NULLIFY (qs_ot_env%matrix_cosp_b)
375 NULLIFY (qs_ot_env%matrix_buf1)
376 NULLIFY (qs_ot_env%matrix_buf2)
377 NULLIFY (qs_ot_env%matrix_buf3)
378 NULLIFY (qs_ot_env%matrix_buf4)
379 NULLIFY (qs_ot_env%matrix_c0)
380 NULLIFY (qs_ot_env%matrix_sc0)
381 NULLIFY (qs_ot_env%matrix_x)
382 NULLIFY (qs_ot_env%matrix_sx)
383 NULLIFY (qs_ot_env%matrix_gx)
384 NULLIFY (qs_ot_env%matrix_gx_old)
385 NULLIFY (qs_ot_env%matrix_dx)
386 NULLIFY (qs_ot_env%buf1_k_k_nosym)
387 NULLIFY (qs_ot_env%buf2_k_k_nosym)
388 NULLIFY (qs_ot_env%buf3_k_k_nosym)
389 NULLIFY (qs_ot_env%buf4_k_k_nosym)
390 NULLIFY (qs_ot_env%buf1_k_k_sym)
391 NULLIFY (qs_ot_env%buf2_k_k_sym)
392 NULLIFY (qs_ot_env%buf3_k_k_sym)
393 NULLIFY (qs_ot_env%buf4_k_k_sym)
394 NULLIFY (qs_ot_env%buf1_n_k)
395 NULLIFY (qs_ot_env%buf1_n_k_dp)
396 NULLIFY (qs_ot_env%p_k_k_sym)
401 sym=dbcsr_type_no_symmetry)
405 sym=dbcsr_type_no_symmetry)
409 sym=dbcsr_type_no_symmetry)
413 sym=dbcsr_type_no_symmetry)
417 sym=dbcsr_type_no_symmetry)
419 IF (qs_ot_env%use_dx)
THEN
422 sym=dbcsr_type_no_symmetry)
425 IF (qs_ot_env%use_gx_old)
THEN
428 sym=dbcsr_type_no_symmetry)
431 SELECT CASE (qs_ot_env%settings%ot_algorithm)
435 sym=dbcsr_type_no_symmetry)
439 sym=dbcsr_type_no_symmetry)
443 sym=dbcsr_type_no_symmetry)
447 sym=dbcsr_type_no_symmetry)
451 sym=dbcsr_type_no_symmetry)
455 sym=dbcsr_type_no_symmetry)
459 sym=dbcsr_type_no_symmetry)
463 sym=dbcsr_type_no_symmetry)
467 sym=dbcsr_type_no_symmetry)
471 sym=dbcsr_type_no_symmetry)
475 sym=dbcsr_type_no_symmetry)
479 sym=dbcsr_type_no_symmetry)
483 sym=dbcsr_type_no_symmetry)
488 sym=dbcsr_type_no_symmetry)
492 sym=dbcsr_type_no_symmetry)
496 sym=dbcsr_type_no_symmetry)
500 sym=dbcsr_type_no_symmetry)
505 sym=dbcsr_type_no_symmetry)
509 sym=dbcsr_type_no_symmetry)
513 sym=dbcsr_type_no_symmetry)
517 sym=dbcsr_type_no_symmetry)
521 sym=dbcsr_type_no_symmetry)
525 sym=dbcsr_type_no_symmetry)
529 sym=dbcsr_type_no_symmetry)
533 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
534 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
535 NULLIFY (qs_ot_env%matrix_h_e)
536 NULLIFY (qs_ot_env%matrix_h_x)
542 sym=dbcsr_type_no_symmetry)
546 sym=dbcsr_type_no_symmetry)
550 NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
551 qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
552 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
553 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
555 IF (qs_ot_env%settings%do_rotation)
THEN
558 sym=dbcsr_type_no_symmetry)
562 sym=dbcsr_type_no_symmetry)
566 sym=dbcsr_type_no_symmetry)
570 sym=dbcsr_type_no_symmetry)
572 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
578 sym=dbcsr_type_no_symmetry)
582 sym=dbcsr_type_no_symmetry)
586 ALLOCATE (qs_ot_env%rot_mat_evals(k))
589 sym=dbcsr_type_no_symmetry)
592 sym=dbcsr_type_no_symmetry)
596 sym=dbcsr_type_no_symmetry)
598 IF (qs_ot_env%use_gx_old)
THEN
601 sym=dbcsr_type_no_symmetry)
604 IF (qs_ot_env%use_dx)
THEN
607 sym=dbcsr_type_no_symmetry)
612 IF (qs_ot_env%settings%do_ener)
THEN
614 ALLOCATE (qs_ot_env%ener_x(ncoef))
616 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
617 ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
618 ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
621 ALLOCATE (qs_ot_env%ener_gx(ncoef))
623 IF (qs_ot_env%use_gx_old)
THEN
624 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
627 IF (qs_ot_env%use_dx)
THEN
628 ALLOCATE (qs_ot_env%ener_dx(ncoef))
629 qs_ot_env%ener_dx = 0.0_dp
739 INTEGER,
INTENT(IN) :: output_unit
741 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
743 INTEGER :: handle, ls_method, ot_algorithm, &
744 ot_method, ot_ortho_irac
746 CALL timeset(routinen, handle)
750 SELECT CASE (ot_algorithm)
752 settings%ot_algorithm =
"TOD"
755 settings%ot_algorithm =
"REF"
757 cpabort(
"Value unknown")
762 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
763 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
766 IF (settings%max_irac < 1)
THEN
767 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
769 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
771 IF (settings%eps_irac < 0.0_dp)
THEN
772 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
774 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
775 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
776 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
780 IF (settings%eps_irac_switch < 0.0_dp)
THEN
781 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
785 SELECT CASE (ot_ortho_irac)
787 settings%ortho_irac =
"CHOL"
789 settings%ortho_irac =
"POLY"
791 settings%ortho_irac =
"LWDN"
793 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
800 IF (settings%ot_state == 1)
THEN
804 SELECT CASE (ot_method)
806 settings%ot_method =
"SD"
808 settings%ot_method =
"CG"
810 settings%ot_method =
"DIIS"
819 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
821 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
822 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
823 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
824 settings%ot_method =
"BROY"
826 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
830 SELECT CASE (ls_method)
832 settings%line_search_method =
"NONE"
834 settings%line_search_method =
"2PNT"
836 settings%line_search_method =
"3PNT"
838 settings%line_search_method =
"ADPT"
840 settings%line_search_method =
"GOLD"
843 cpabort(
"READ OTSCF LS: Value unknown")
847 SELECT CASE (settings%precond_solver_type)
849 settings%precond_solver_name =
"DEFAULT"
851 settings%precond_solver_name =
"INVERSE_CHOLESKY"
853 settings%precond_solver_name =
"DIRECT"
855 settings%precond_solver_name =
"INVERSE_UPDATE"
857 cpabort(
"READ OTSCF SOLVER: Value unknown")
867 SELECT CASE (settings%preconditioner_type)
869 settings%preconditioner_name =
"NONE"
870 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
871 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
873 settings%preconditioner_name =
"FULL_SINGLE"
874 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
875 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
877 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
878 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
879 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
881 settings%preconditioner_name =
"FULL_ALL"
882 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
883 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
885 settings%preconditioner_name =
"FULL_KINETIC"
886 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
887 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
889 settings%preconditioner_name =
"FULL_S_INVERSE"
890 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
891 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
893 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
901 l_val=settings%occupation_preconditioner)
904 r_val=settings%nondiag_energy_strength)
906 cpassert(.NOT. settings%do_ener)
910 IF (output_unit > 0)
THEN
911 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
912 IF (settings%do_rotation)
THEN
913 WRITE (output_unit,
'(A)')
" Allowing for rotations "
915 IF (settings%do_ener)
THEN
916 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
918 SELECT CASE (settings%OT_METHOD)
920 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
922 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
924 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
925 WRITE (output_unit,
'(A)')
" in the iterative subspace"
926 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
927 IF (settings%safer_diis)
THEN
928 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
930 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
933 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
934 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
935 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
936 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
937 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
938 settings%diis_m,
" BROYDEN vectors"
940 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
942 SELECT CASE (settings%preconditioner_name)
944 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
945 CASE (
"FULL_SINGLE_INVERSE")
946 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
947 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
949 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
950 CASE (
"FULL_KINETIC")
951 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
952 CASE (
"FULL_S_INVERSE")
953 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
955 WRITE (output_unit,
'(A)') &
956 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
957 CASE (
"SPARSE_KINETIC")
958 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
960 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
962 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
965 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
967 IF (settings%OT_METHOD .EQ.
"SD" .OR. settings%OT_METHOD .EQ.
"CG")
THEN
968 SELECT CASE (settings%line_search_method)
970 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
972 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
974 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
975 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
977 WRITE (output_unit,
'(A)')
" Line search : NONE"
979 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
982 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
983 " energy_gap :", settings%energy_gap
984 IF (settings%ot_algorithm .EQ.
'TOD')
THEN
985 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
986 " max_taylor :", settings%max_taylor
988 IF (settings%ot_algorithm .EQ.
'REF')
THEN
989 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
990 " irac_degree :", settings%irac_degree
991 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
992 " eps_irac :", settings%eps_irac
993 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
994 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
995 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
997 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
998 WRITE (unit=output_unit, &
999 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
1000 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
1004 CALL timestop(handle)