314 INTEGER,
OPTIONAL :: ortho_k
316 INTEGER :: i, k, m_diis, my_ortho_k, n, ncoef
322 NULLIFY (qs_ot_env%preconditioner)
323 NULLIFY (qs_ot_env%matrix_psc0)
324 NULLIFY (qs_ot_env%para_env)
325 NULLIFY (qs_ot_env%blacs_env)
328 para_env=para_env, context=context)
330 qs_ot_env%para_env => para_env
331 qs_ot_env%blacs_env => context
332 CALL para_env%retain()
333 CALL context%retain()
335 IF (
PRESENT(ortho_k))
THEN
341 m_diis = qs_ot_env%settings%diis_m
343 qs_ot_env%use_gx_old = .false.
344 qs_ot_env%use_dx = .false.
346 SELECT CASE (qs_ot_env%settings%ot_method)
350 qs_ot_env%use_gx_old = .true.
351 qs_ot_env%use_dx = .true.
352 CASE (
"DIIS",
"BROY")
353 IF (m_diis < 1) cpabort(
"m_diis less than one")
355 cpabort(
"Unknown option")
358 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
359 qs_ot_env%settings%ot_method ==
"BROY")
THEN
360 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
361 qs_ot_env%ls_diis = 0.0_dp
362 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
363 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
364 ALLOCATE (qs_ot_env%c_broy(m_diis))
365 ALLOCATE (qs_ot_env%energy_h(m_diis))
366 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
369 ALLOCATE (qs_ot_env%evals(k))
370 ALLOCATE (qs_ot_env%dum(k))
372 NULLIFY (qs_ot_env%matrix_os)
373 NULLIFY (qs_ot_env%matrix_buf1_ortho)
374 NULLIFY (qs_ot_env%matrix_buf2_ortho)
375 NULLIFY (qs_ot_env%matrix_p)
376 NULLIFY (qs_ot_env%matrix_r)
377 NULLIFY (qs_ot_env%matrix_sinp)
378 NULLIFY (qs_ot_env%matrix_cosp)
379 NULLIFY (qs_ot_env%matrix_sinp_b)
380 NULLIFY (qs_ot_env%matrix_cosp_b)
381 NULLIFY (qs_ot_env%matrix_buf1)
382 NULLIFY (qs_ot_env%matrix_buf2)
383 NULLIFY (qs_ot_env%matrix_buf3)
384 NULLIFY (qs_ot_env%matrix_buf4)
385 NULLIFY (qs_ot_env%matrix_c0)
386 NULLIFY (qs_ot_env%matrix_sc0)
387 NULLIFY (qs_ot_env%matrix_x)
388 NULLIFY (qs_ot_env%matrix_sx)
389 NULLIFY (qs_ot_env%matrix_gx)
390 NULLIFY (qs_ot_env%matrix_gx_old)
391 NULLIFY (qs_ot_env%matrix_dx)
392 NULLIFY (qs_ot_env%buf1_k_k_nosym)
393 NULLIFY (qs_ot_env%buf2_k_k_nosym)
394 NULLIFY (qs_ot_env%buf3_k_k_nosym)
395 NULLIFY (qs_ot_env%buf4_k_k_nosym)
396 NULLIFY (qs_ot_env%buf1_k_k_sym)
397 NULLIFY (qs_ot_env%buf2_k_k_sym)
398 NULLIFY (qs_ot_env%buf3_k_k_sym)
399 NULLIFY (qs_ot_env%buf4_k_k_sym)
400 NULLIFY (qs_ot_env%buf1_n_k)
401 NULLIFY (qs_ot_env%buf1_n_k_dp)
402 NULLIFY (qs_ot_env%p_k_k_sym)
407 sym=dbcsr_type_no_symmetry)
411 sym=dbcsr_type_no_symmetry)
415 sym=dbcsr_type_no_symmetry)
419 sym=dbcsr_type_no_symmetry)
423 sym=dbcsr_type_no_symmetry)
425 IF (qs_ot_env%use_dx)
THEN
428 sym=dbcsr_type_no_symmetry)
431 IF (qs_ot_env%use_gx_old)
THEN
434 sym=dbcsr_type_no_symmetry)
437 SELECT CASE (qs_ot_env%settings%ot_algorithm)
441 sym=dbcsr_type_no_symmetry)
445 sym=dbcsr_type_no_symmetry)
449 sym=dbcsr_type_no_symmetry)
453 sym=dbcsr_type_no_symmetry)
457 sym=dbcsr_type_no_symmetry)
461 sym=dbcsr_type_no_symmetry)
465 sym=dbcsr_type_no_symmetry)
469 sym=dbcsr_type_no_symmetry)
473 sym=dbcsr_type_no_symmetry)
477 sym=dbcsr_type_no_symmetry)
481 sym=dbcsr_type_no_symmetry)
485 sym=dbcsr_type_no_symmetry)
489 sym=dbcsr_type_no_symmetry)
494 sym=dbcsr_type_no_symmetry)
498 sym=dbcsr_type_no_symmetry)
502 sym=dbcsr_type_no_symmetry)
506 sym=dbcsr_type_no_symmetry)
511 sym=dbcsr_type_no_symmetry)
515 sym=dbcsr_type_no_symmetry)
519 sym=dbcsr_type_no_symmetry)
523 sym=dbcsr_type_no_symmetry)
527 sym=dbcsr_type_no_symmetry)
531 sym=dbcsr_type_no_symmetry)
535 sym=dbcsr_type_no_symmetry)
539 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
540 qs_ot_env%settings%ot_method ==
"BROY")
THEN
541 NULLIFY (qs_ot_env%matrix_h_e)
542 NULLIFY (qs_ot_env%matrix_h_x)
548 sym=dbcsr_type_no_symmetry)
552 sym=dbcsr_type_no_symmetry)
556 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, &
557 qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
558 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
559 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
561 IF (qs_ot_env%settings%do_rotation)
THEN
564 sym=dbcsr_type_no_symmetry)
568 sym=dbcsr_type_no_symmetry)
572 sym=dbcsr_type_no_symmetry)
576 sym=dbcsr_type_no_symmetry)
578 IF (qs_ot_env%settings%ot_method ==
"DIIS")
THEN
584 sym=dbcsr_type_no_symmetry)
588 sym=dbcsr_type_no_symmetry)
592 ALLOCATE (qs_ot_env%rot_mat_evals(k))
595 sym=dbcsr_type_no_symmetry)
598 sym=dbcsr_type_no_symmetry)
602 sym=dbcsr_type_no_symmetry)
604 IF (qs_ot_env%use_gx_old)
THEN
607 sym=dbcsr_type_no_symmetry)
610 IF (qs_ot_env%use_dx)
THEN
613 sym=dbcsr_type_no_symmetry)
618 IF (qs_ot_env%settings%do_ener)
THEN
620 ALLOCATE (qs_ot_env%ener_x(ncoef))
622 IF (qs_ot_env%settings%ot_method ==
"DIIS")
THEN
623 ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
624 ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
627 ALLOCATE (qs_ot_env%ener_gx(ncoef))
629 IF (qs_ot_env%use_gx_old)
THEN
630 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
633 IF (qs_ot_env%use_dx)
THEN
634 ALLOCATE (qs_ot_env%ener_dx(ncoef))
635 qs_ot_env%ener_dx = 0.0_dp
745 INTEGER,
INTENT(IN) :: output_unit
747 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
749 INTEGER :: handle, ls_method, ot_algorithm, &
750 ot_method, ot_ortho_irac
752 CALL timeset(routinen, handle)
756 SELECT CASE (ot_algorithm)
758 settings%ot_algorithm =
"TOD"
761 settings%ot_algorithm =
"REF"
763 cpabort(
"Value unknown")
768 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
769 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
772 IF (settings%max_irac < 1)
THEN
773 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
775 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
777 IF (settings%eps_irac < 0.0_dp)
THEN
778 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
780 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
781 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
782 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
786 IF (settings%eps_irac_switch < 0.0_dp)
THEN
787 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
791 SELECT CASE (ot_ortho_irac)
793 settings%ortho_irac =
"CHOL"
795 settings%ortho_irac =
"POLY"
797 settings%ortho_irac =
"LWDN"
799 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
806 IF (settings%ot_state == 1)
THEN
810 SELECT CASE (ot_method)
812 settings%ot_method =
"SD"
814 settings%ot_method =
"CG"
816 settings%ot_method =
"DIIS"
825 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
827 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
828 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
829 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
830 settings%ot_method =
"BROY"
832 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
836 SELECT CASE (ls_method)
838 settings%line_search_method =
"NONE"
840 settings%line_search_method =
"2PNT"
842 settings%line_search_method =
"3PNT"
844 settings%line_search_method =
"ADPT"
846 settings%line_search_method =
"GOLD"
849 cpabort(
"READ OTSCF LS: Value unknown")
853 SELECT CASE (settings%precond_solver_type)
855 settings%precond_solver_name =
"DEFAULT"
857 settings%precond_solver_name =
"INVERSE_CHOLESKY"
859 settings%precond_solver_name =
"DIRECT"
861 settings%precond_solver_name =
"INVERSE_UPDATE"
863 cpabort(
"READ OTSCF SOLVER: Value unknown")
873 SELECT CASE (settings%preconditioner_type)
875 settings%preconditioner_name =
"NONE"
876 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
877 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
879 settings%preconditioner_name =
"FULL_SINGLE"
880 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
881 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
883 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
884 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
885 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
887 settings%preconditioner_name =
"FULL_ALL"
888 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
889 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
891 settings%preconditioner_name =
"FULL_KINETIC"
892 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
893 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
895 settings%preconditioner_name =
"FULL_S_INVERSE"
896 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
897 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
899 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
907 l_val=settings%occupation_preconditioner)
910 r_val=settings%nondiag_energy_strength)
912 cpassert(.NOT. settings%do_ener)
916 IF (output_unit > 0)
THEN
917 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
918 IF (settings%do_rotation)
THEN
919 WRITE (output_unit,
'(A)')
" Allowing for rotations "
921 IF (settings%do_ener)
THEN
922 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
924 SELECT CASE (settings%OT_METHOD)
926 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
928 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
930 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
931 WRITE (output_unit,
'(A)')
" in the iterative subspace"
932 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
933 IF (settings%safer_diis)
THEN
934 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
936 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
939 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
940 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
941 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
942 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
943 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
944 settings%diis_m,
" BROYDEN vectors"
946 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
948 SELECT CASE (settings%preconditioner_name)
950 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
951 CASE (
"FULL_SINGLE_INVERSE")
952 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
953 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
955 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
956 CASE (
"FULL_KINETIC")
957 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
958 CASE (
"FULL_S_INVERSE")
959 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
961 WRITE (output_unit,
'(A)') &
962 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
963 CASE (
"SPARSE_KINETIC")
964 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
966 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
968 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
971 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
973 IF (settings%OT_METHOD ==
"SD" .OR. settings%OT_METHOD ==
"CG")
THEN
974 SELECT CASE (settings%line_search_method)
976 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
978 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
980 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
981 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
983 WRITE (output_unit,
'(A)')
" Line search : NONE"
985 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
988 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
989 " energy_gap :", settings%energy_gap
990 IF (settings%ot_algorithm ==
'TOD')
THEN
991 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
992 " max_taylor :", settings%max_taylor
994 IF (settings%ot_algorithm ==
'REF')
THEN
995 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
996 " irac_degree :", settings%irac_degree
997 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
998 " eps_irac :", settings%eps_irac
999 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
1000 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
1001 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
1003 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
1004 WRITE (unit=output_unit, &
1005 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
1006 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
1010 CALL timestop(handle)