303 INTEGER,
OPTIONAL :: ortho_k
305 INTEGER :: i, k, m_diis, my_ortho_k, n, ncoef
311 NULLIFY (qs_ot_env%preconditioner)
312 NULLIFY (qs_ot_env%matrix_psc0)
313 NULLIFY (qs_ot_env%para_env)
314 NULLIFY (qs_ot_env%blacs_env)
317 para_env=para_env, context=context)
319 qs_ot_env%para_env => para_env
320 qs_ot_env%blacs_env => context
321 CALL para_env%retain()
322 CALL context%retain()
324 IF (
PRESENT(ortho_k))
THEN
330 m_diis = qs_ot_env%settings%diis_m
332 qs_ot_env%use_gx_old = .false.
333 qs_ot_env%use_dx = .false.
335 SELECT CASE (qs_ot_env%settings%ot_method)
339 qs_ot_env%use_gx_old = .true.
340 qs_ot_env%use_dx = .true.
341 CASE (
"DIIS",
"BROY")
342 IF (m_diis .LT. 1) cpabort(
"m_diis less than one")
344 cpabort(
"Unknown option")
347 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
348 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
349 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
350 qs_ot_env%ls_diis = 0.0_dp
351 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
352 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
353 ALLOCATE (qs_ot_env%c_broy(m_diis))
354 ALLOCATE (qs_ot_env%energy_h(m_diis))
355 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
358 ALLOCATE (qs_ot_env%evals(k))
359 ALLOCATE (qs_ot_env%dum(k))
361 NULLIFY (qs_ot_env%matrix_os)
362 NULLIFY (qs_ot_env%matrix_buf1_ortho)
363 NULLIFY (qs_ot_env%matrix_buf2_ortho)
364 NULLIFY (qs_ot_env%matrix_p)
365 NULLIFY (qs_ot_env%matrix_r)
366 NULLIFY (qs_ot_env%matrix_sinp)
367 NULLIFY (qs_ot_env%matrix_cosp)
368 NULLIFY (qs_ot_env%matrix_sinp_b)
369 NULLIFY (qs_ot_env%matrix_cosp_b)
370 NULLIFY (qs_ot_env%matrix_buf1)
371 NULLIFY (qs_ot_env%matrix_buf2)
372 NULLIFY (qs_ot_env%matrix_buf3)
373 NULLIFY (qs_ot_env%matrix_buf4)
374 NULLIFY (qs_ot_env%matrix_c0)
375 NULLIFY (qs_ot_env%matrix_sc0)
376 NULLIFY (qs_ot_env%matrix_x)
377 NULLIFY (qs_ot_env%matrix_sx)
378 NULLIFY (qs_ot_env%matrix_gx)
379 NULLIFY (qs_ot_env%matrix_gx_old)
380 NULLIFY (qs_ot_env%matrix_dx)
381 NULLIFY (qs_ot_env%buf1_k_k_nosym)
382 NULLIFY (qs_ot_env%buf2_k_k_nosym)
383 NULLIFY (qs_ot_env%buf3_k_k_nosym)
384 NULLIFY (qs_ot_env%buf4_k_k_nosym)
385 NULLIFY (qs_ot_env%buf1_k_k_sym)
386 NULLIFY (qs_ot_env%buf2_k_k_sym)
387 NULLIFY (qs_ot_env%buf3_k_k_sym)
388 NULLIFY (qs_ot_env%buf4_k_k_sym)
389 NULLIFY (qs_ot_env%buf1_n_k)
390 NULLIFY (qs_ot_env%buf1_n_k_dp)
391 NULLIFY (qs_ot_env%p_k_k_sym)
396 sym=dbcsr_type_no_symmetry)
400 sym=dbcsr_type_no_symmetry)
404 sym=dbcsr_type_no_symmetry)
408 sym=dbcsr_type_no_symmetry)
412 sym=dbcsr_type_no_symmetry)
414 IF (qs_ot_env%use_dx)
THEN
417 sym=dbcsr_type_no_symmetry)
420 IF (qs_ot_env%use_gx_old)
THEN
423 sym=dbcsr_type_no_symmetry)
426 SELECT CASE (qs_ot_env%settings%ot_algorithm)
430 sym=dbcsr_type_no_symmetry)
434 sym=dbcsr_type_no_symmetry)
438 sym=dbcsr_type_no_symmetry)
442 sym=dbcsr_type_no_symmetry)
446 sym=dbcsr_type_no_symmetry)
450 sym=dbcsr_type_no_symmetry)
454 sym=dbcsr_type_no_symmetry)
458 sym=dbcsr_type_no_symmetry)
462 sym=dbcsr_type_no_symmetry)
466 sym=dbcsr_type_no_symmetry)
470 sym=dbcsr_type_no_symmetry)
474 sym=dbcsr_type_no_symmetry)
478 sym=dbcsr_type_no_symmetry)
483 sym=dbcsr_type_no_symmetry)
487 sym=dbcsr_type_no_symmetry)
491 sym=dbcsr_type_no_symmetry)
495 sym=dbcsr_type_no_symmetry)
500 sym=dbcsr_type_no_symmetry)
504 sym=dbcsr_type_no_symmetry)
508 sym=dbcsr_type_no_symmetry)
512 sym=dbcsr_type_no_symmetry)
516 sym=dbcsr_type_no_symmetry)
520 sym=dbcsr_type_no_symmetry)
524 sym=dbcsr_type_no_symmetry)
528 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
529 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
530 NULLIFY (qs_ot_env%matrix_h_e)
531 NULLIFY (qs_ot_env%matrix_h_x)
537 sym=dbcsr_type_no_symmetry)
541 sym=dbcsr_type_no_symmetry)
545 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, &
546 qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
547 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
548 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
550 IF (qs_ot_env%settings%do_rotation)
THEN
553 sym=dbcsr_type_no_symmetry)
557 sym=dbcsr_type_no_symmetry)
561 sym=dbcsr_type_no_symmetry)
565 sym=dbcsr_type_no_symmetry)
567 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
573 sym=dbcsr_type_no_symmetry)
577 sym=dbcsr_type_no_symmetry)
581 ALLOCATE (qs_ot_env%rot_mat_evals(k))
584 sym=dbcsr_type_no_symmetry)
587 sym=dbcsr_type_no_symmetry)
591 sym=dbcsr_type_no_symmetry)
593 IF (qs_ot_env%use_gx_old)
THEN
596 sym=dbcsr_type_no_symmetry)
599 IF (qs_ot_env%use_dx)
THEN
602 sym=dbcsr_type_no_symmetry)
607 IF (qs_ot_env%settings%do_ener)
THEN
609 ALLOCATE (qs_ot_env%ener_x(ncoef))
611 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
612 ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
613 ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
616 ALLOCATE (qs_ot_env%ener_gx(ncoef))
618 IF (qs_ot_env%use_gx_old)
THEN
619 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
622 IF (qs_ot_env%use_dx)
THEN
623 ALLOCATE (qs_ot_env%ener_dx(ncoef))
624 qs_ot_env%ener_dx = 0.0_dp
734 INTEGER,
INTENT(IN) :: output_unit
736 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
738 INTEGER :: handle, ls_method, ot_algorithm, &
739 ot_method, ot_ortho_irac
741 CALL timeset(routinen, handle)
745 SELECT CASE (ot_algorithm)
747 settings%ot_algorithm =
"TOD"
750 settings%ot_algorithm =
"REF"
752 cpabort(
"Value unknown")
757 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
758 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
761 IF (settings%max_irac < 1)
THEN
762 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
764 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
766 IF (settings%eps_irac < 0.0_dp)
THEN
767 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
769 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
770 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
771 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
775 IF (settings%eps_irac_switch < 0.0_dp)
THEN
776 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
780 SELECT CASE (ot_ortho_irac)
782 settings%ortho_irac =
"CHOL"
784 settings%ortho_irac =
"POLY"
786 settings%ortho_irac =
"LWDN"
788 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
795 SELECT CASE (ot_method)
797 settings%ot_method =
"SD"
799 settings%ot_method =
"CG"
801 settings%ot_method =
"DIIS"
810 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
812 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
813 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
814 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
815 settings%ot_method =
"BROY"
817 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
821 SELECT CASE (ls_method)
823 settings%line_search_method =
"NONE"
825 settings%line_search_method =
"2PNT"
827 settings%line_search_method =
"3PNT"
829 settings%line_search_method =
"GOLD"
832 cpabort(
"READ OTSCF LS: Value unknown")
836 SELECT CASE (settings%precond_solver_type)
838 settings%precond_solver_name =
"DEFAULT"
840 settings%precond_solver_name =
"INVERSE_CHOLESKY"
842 settings%precond_solver_name =
"DIRECT"
844 settings%precond_solver_name =
"INVERSE_UPDATE"
846 cpabort(
"READ OTSCF SOLVER: Value unknown")
854 SELECT CASE (settings%preconditioner_type)
856 settings%preconditioner_name =
"NONE"
857 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
858 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
860 settings%preconditioner_name =
"FULL_SINGLE"
861 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
862 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
864 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
865 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
866 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
868 settings%preconditioner_name =
"FULL_ALL"
869 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
870 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
872 settings%preconditioner_name =
"FULL_KINETIC"
873 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
874 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
876 settings%preconditioner_name =
"FULL_S_INVERSE"
877 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
878 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
880 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
888 l_val=settings%occupation_preconditioner)
891 r_val=settings%nondiag_energy_strength)
893 cpassert(.NOT. settings%do_ener)
897 IF (output_unit > 0)
THEN
898 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
899 IF (settings%do_rotation)
THEN
900 WRITE (output_unit,
'(A)')
" Allowing for rotations "
902 IF (settings%do_ener)
THEN
903 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
905 SELECT CASE (settings%OT_METHOD)
907 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
909 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
911 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
912 WRITE (output_unit,
'(A)')
" in the iterative subspace"
913 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
914 IF (settings%safer_diis)
THEN
915 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
917 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
920 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
921 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
922 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
923 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
924 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
925 settings%diis_m,
" BROYDEN vectors"
927 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
929 SELECT CASE (settings%preconditioner_name)
931 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
932 CASE (
"FULL_SINGLE_INVERSE")
933 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
934 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
936 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
937 CASE (
"FULL_KINETIC")
938 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
939 CASE (
"FULL_S_INVERSE")
940 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
942 WRITE (output_unit,
'(A)') &
943 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
944 CASE (
"SPARSE_KINETIC")
945 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
947 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
949 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
952 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
954 IF (settings%OT_METHOD .EQ.
"SD" .OR. settings%OT_METHOD .EQ.
"CG")
THEN
955 SELECT CASE (settings%line_search_method)
957 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
959 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
961 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
962 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
964 WRITE (output_unit,
'(A)')
" Line search : NONE"
966 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
969 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
970 " energy_gap :", settings%energy_gap
971 IF (settings%ot_algorithm .EQ.
'TOD')
THEN
972 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
973 " max_taylor :", settings%max_taylor
975 IF (settings%ot_algorithm .EQ.
'REF')
THEN
976 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
977 " irac_degree :", settings%irac_degree
978 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
979 " eps_irac :", settings%eps_irac
980 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
981 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
982 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
984 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
985 WRITE (unit=output_unit, &
986 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
987 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
991 CALL timestop(handle)