CP2K 2.4 (Revision 12889)

scf_control_types.f90

Go to the documentation of this file.
00001 !-----------------------------------------------------------------------------!
00002 !   CP2K: A general program to perform molecular dynamics simulations         !
00003 !   Copyright (C) 2000 - 2013  CP2K developers group                          !
00004 !-----------------------------------------------------------------------------!
00005 
00006 ! *****************************************************************************
00015 MODULE scf_control_types
00016 
00017   USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
00018                                              cp_print_key_unit_nr
00019   USE cp_units,                        ONLY: cp_unit_from_cp2k
00020   USE f77_blas
00021   USE input_constants,                 ONLY: &
00022        atomic_guess, core_guess, diag_ot, direct_p_mix, general_roks, &
00023        high_spin_roks, ot_algo_taylor_or_diag, outer_scf_becke_constraint, &
00024        outer_scf_ddapc_constraint, outer_scf_none, &
00025        outer_scf_optimizer_bisect, outer_scf_optimizer_diis, &
00026        outer_scf_optimizer_none, outer_scf_optimizer_sd, &
00027        outer_scf_s2_constraint, outer_scf_scp, smear_energy_window, &
00028        smear_fermi_dirac, smear_list
00029   USE input_cp2k_dft,                  ONLY: create_scf_section
00030   USE input_enumeration_types,         ONLY: enum_i2c,&
00031                                              enumeration_type
00032   USE input_keyword_types,             ONLY: keyword_get,&
00033                                              keyword_type
00034   USE input_section_types,             ONLY: section_get_keyword,&
00035                                              section_release,&
00036                                              section_type,&
00037                                              section_vals_get,&
00038                                              section_vals_get_subs_vals,&
00039                                              section_vals_type,&
00040                                              section_vals_val_get
00041   USE kinds,                           ONLY: dp
00042   USE qs_ot_types,                     ONLY: ot_readwrite_input,&
00043                                              qs_ot_settings_init,&
00044                                              qs_ot_settings_type
00045   USE termination,                     ONLY: stop_program
00046   USE timings,                         ONLY: timeset,&
00047                                              timestop
00048 #include "cp_common_uses.h"
00049 
00050   IMPLICIT NONE
00051 
00052   PRIVATE
00053 
00054   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'scf_control_types'
00055   LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
00056 
00057   INTEGER, SAVE :: last_scf_c_id_nr = 0
00058 
00059   ! Public data types
00060 
00061   PUBLIC :: outer_scf_control_type,&
00062             scf_control_type,&
00063             smear_type,&
00064             diagonalization_type
00065 
00066   ! Public subroutines
00067 
00068   PUBLIC :: scf_c_create,&
00069             scf_c_read_parameters,&
00070             scf_c_release,&
00071             scf_c_retain,&
00072             scf_c_write_parameters,&
00073             init_smear, read_smear_section
00074 
00075 ! *****************************************************************************
00096 
00097   TYPE outer_scf_control_type
00098     LOGICAL       :: have_scf
00099     INTEGER       :: max_scf
00100     REAL(KIND=dp) :: eps_scf,step_size
00101     INTEGER       :: TYPE
00102     INTEGER       :: optimizer
00103     INTEGER       :: diis_buffer_length
00104     INTEGER       :: extrapolation_order
00105     INTEGER       :: bisect_trust_count
00106   END TYPE outer_scf_control_type
00107 
00108   TYPE smear_type
00109     LOGICAL       :: do_smear
00110     LOGICAL       :: common_mu
00111     INTEGER       :: method
00112     REAL(KIND=dp) :: electronic_temperature,
00113                      fixed_mag_mom,
00114                      eps_fermi_dirac,
00115                      window_size
00116     REAL(KIND=dp), DIMENSION(:), POINTER :: list
00117   END TYPE smear_type
00118 
00119   TYPE diagonalization_type
00120     INTEGER       :: method
00121     REAL(KIND=dp) :: eps_jacobi
00122     REAL(KIND=dp) :: jacobi_threshold
00123     INTEGER       :: max_iter, nkrylov, nblock_krylov
00124     REAL(KIND=dp) :: eps_iter
00125     REAL(KIND=dp) :: eps_adapt
00126     TYPE(qs_ot_settings_type) :: ot_settings
00127   END TYPE diagonalization_type
00128 
00129   TYPE scf_control_type
00130     TYPE(outer_scf_control_type)          :: outer_scf
00131     TYPE(smear_type), POINTER             :: smear
00132     TYPE(diagonalization_type)            :: diagonalization
00133     INTEGER                               :: density_guess, mixing_method
00134     REAL(KIND=dp)                         :: eps_eigval,eps_scf,eps_scf_hist,
00135                                              level_shift,
00136                                              eps_lumos,eps_diis
00137     INTEGER                               :: max_iter_lumos, max_diis, nmixing
00138     INTEGER                               :: max_scf,nrow_block,max_scf_hist,
00139                                              ncol_block,maxl,nkind
00140     LOGICAL                               :: do_diag_sub,gradient_functional,gth_potential_present,
00141                                              use_cholesky,use_ot,use_diag,do_outer_scf_reortho
00142     INTEGER                               :: ref_count,id_nr
00143     INTEGER, DIMENSION(2)                 :: added_mos
00144     INTEGER                               :: roks_scheme
00145     REAL(KIND=dp)                         :: roks_f
00146     REAL(KIND=dp), DIMENSION(0:2,0:2,1:2) :: roks_parameter
00147   END TYPE scf_control_type
00148 
00149 CONTAINS
00150 
00151 ! *****************************************************************************
00161   SUBROUTINE scf_c_create(scf_control,error)
00162 
00163     TYPE(scf_control_type), POINTER          :: scf_control
00164     TYPE(cp_error_type), INTENT(inout)       :: error
00165 
00166     CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_create', 
00167       routineP = moduleN//':'//routineN
00168 
00169     INTEGER                                  :: handle, stat
00170     LOGICAL                                  :: failure
00171 
00172     CALL timeset(routineN,handle)
00173 
00174     failure = .FALSE.
00175 
00176     ALLOCATE (scf_control,STAT=stat)
00177     CPPostcondition((stat == 0),cp_failure_level,routineP,error,failure)
00178 
00179     IF (.NOT.failure) THEN
00180 
00181       ! Load the default values
00182 
00183       scf_control%density_guess = atomic_guess
00184       scf_control%eps_eigval = 1.0E-5_dp
00185       scf_control%eps_scf = 1.0E-5_dp
00186       scf_control%eps_scf_hist = 0.0_dp
00187       scf_control%eps_lumos = 1.0E-5_dp
00188       scf_control%max_iter_lumos = 2999
00189       scf_control%eps_diis = 0.1_dp
00190       scf_control%level_shift = 0.0_dp
00191       scf_control%max_diis = 4
00192       scf_control%max_scf = 50
00193       scf_control%nrow_block = 32
00194       scf_control%ncol_block = 32
00195       scf_control%nmixing = 2
00196       scf_control%use_cholesky = .TRUE.
00197       scf_control%use_diag = .TRUE.
00198       scf_control%do_diag_sub = .FALSE.
00199       scf_control%use_ot = .FALSE.
00200       scf_control%do_outer_scf_reortho = .TRUE.
00201       scf_control%max_diis = 4
00202       scf_control%eps_diis = 0.1_dp
00203       scf_control%ref_count=1
00204       scf_control%id_nr=last_scf_c_id_nr
00205       scf_control%added_mos(:) = 0
00206       scf_control%max_scf_hist = 0
00207 
00208       !Mixing
00209       scf_control%mixing_method = direct_p_mix
00210 
00211       ! Diagonalization
00212       scf_control%diagonalization%method = 0
00213       scf_control%diagonalization%eps_jacobi = 0.0_dp
00214       scf_control%diagonalization%jacobi_threshold = 1.0E-7_dp
00215       scf_control%diagonalization%max_iter = 0
00216       scf_control%diagonalization%eps_iter = 0.0_dp
00217       scf_control%diagonalization%eps_adapt = 0.0_dp
00218       scf_control%diagonalization%nkrylov = 0
00219       scf_control%diagonalization%nblock_krylov = 0
00220       CALL qs_ot_settings_init(scf_control%diagonalization%ot_settings)
00221 
00222       ! ROKS
00223 
00224       scf_control%roks_scheme = high_spin_roks
00225       scf_control%roks_f = 0.5_dp
00226 
00227       ! Initialize the diagonal blocks with the default ROKS parameters
00228       ! 0 = v)irtual, 1 = o)pen shell, 2 = c)losed shell
00229 
00230       scf_control%roks_parameter(0,0,1) =  1.5_dp ! avv
00231       scf_control%roks_parameter(0,0,2) = -0.5_dp ! bvv
00232       scf_control%roks_parameter(1,1,1) =  0.5_dp ! aoo
00233       scf_control%roks_parameter(1,1,2) =  0.5_dp ! boo
00234       scf_control%roks_parameter(2,2,1) = -0.5_dp ! acc
00235       scf_control%roks_parameter(2,2,2) =  1.5_dp ! bcc
00236 
00237       ! Initialize off-diagonal blocks (fixed)
00238 
00239       scf_control%roks_parameter(0,1,1) =  1.0_dp ! avo
00240       scf_control%roks_parameter(0,1,2) =  0.0_dp ! bvo
00241       scf_control%roks_parameter(0,2,1) =  0.5_dp ! avc
00242       scf_control%roks_parameter(0,2,2) =  0.5_dp ! bvc
00243       scf_control%roks_parameter(1,2,1) =  0.0_dp ! aoc
00244       scf_control%roks_parameter(1,2,2) =  1.0_dp ! boc
00245 
00246       ! Symmetry enforces
00247 
00248       scf_control%roks_parameter(1,0,1) = scf_control%roks_parameter(0,1,1) ! aov
00249       scf_control%roks_parameter(1,0,2) = scf_control%roks_parameter(0,1,2) ! bov
00250       scf_control%roks_parameter(2,0,1) = scf_control%roks_parameter(0,2,1) ! acv
00251       scf_control%roks_parameter(2,0,2) = scf_control%roks_parameter(0,2,2) ! bcv
00252       scf_control%roks_parameter(2,1,1) = scf_control%roks_parameter(1,2,1) ! aco
00253       scf_control%roks_parameter(2,1,2) = scf_control%roks_parameter(1,2,2) ! bco
00254 
00255       ! Outer SCF default settings
00256 
00257       scf_control%outer_scf%have_scf = .FALSE.
00258       scf_control%outer_scf%max_scf = 0
00259       scf_control%outer_scf%eps_scf = 0.0_dp
00260       scf_control%outer_scf%step_size = 0.0_dp
00261       scf_control%outer_scf%type = -1
00262       scf_control%outer_scf%optimizer = -1
00263       scf_control%outer_scf%diis_buffer_length = -1
00264 
00265       ! Smearing of the MO occupations
00266 
00267       NULLIFY(scf_control%smear)
00268 
00269       last_scf_c_id_nr = last_scf_c_id_nr + 1
00270 
00271     END IF
00272 
00273     CALL timestop(handle)
00274 
00275   END SUBROUTINE scf_c_create
00276 
00277 ! *****************************************************************************
00286   SUBROUTINE scf_c_retain(scf_control,error)
00287 
00288     TYPE(scf_control_type), POINTER          :: scf_control
00289     TYPE(cp_error_type), INTENT(inout)       :: error
00290 
00291     CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_retain', 
00292       routineP = moduleN//':'//routineN
00293 
00294     LOGICAL                                  :: failure
00295 
00296     failure = .FALSE.
00297 
00298     CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure)
00299 
00300     IF (.NOT.failure) THEN
00301       CPPrecondition(scf_control%ref_count > 0,cp_failure_level,routineP,error,failure)
00302       scf_control%ref_count = scf_control%ref_count + 1
00303     END IF
00304 
00305   END SUBROUTINE scf_c_retain
00306 
00307 ! *****************************************************************************
00318   SUBROUTINE scf_c_release(scf_control,error)
00319 
00320     TYPE(scf_control_type), POINTER          :: scf_control
00321     TYPE(cp_error_type), INTENT(inout)       :: error
00322 
00323     CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_release', 
00324       routineP = moduleN//':'//routineN
00325 
00326     INTEGER                                  :: stat
00327     LOGICAL                                  :: failure
00328 
00329     failure = .FALSE.
00330 
00331     IF (ASSOCIATED(scf_control)) THEN
00332       CPPrecondition(scf_control%ref_count>0,cp_failure_level,routineP,error,failure)
00333       scf_control%ref_count = scf_control%ref_count - 1
00334       IF (scf_control%ref_count < 1) THEN
00335         IF (ASSOCIATED(scf_control%smear%list)) THEN
00336            DEALLOCATE(scf_control%smear%list,stat=stat)
00337            CPPostcondition(stat==0,cp_warning_level,routineP,error,failure)
00338         ENDIF
00339         DEALLOCATE(scf_control%smear,stat=stat)
00340         CPPostcondition(stat==0,cp_warning_level,routineP,error,failure)
00341         DEALLOCATE(scf_control,stat=stat)
00342         CPPostcondition(stat==0,cp_warning_level,routineP,error,failure)
00343       END IF
00344     END IF
00345 
00346     NULLIFY (scf_control)
00347 
00348   END SUBROUTINE scf_c_release
00349 
00350 ! *****************************************************************************
00359   SUBROUTINE scf_c_read_parameters(scf_control,dft_section,error)
00360 
00361     TYPE(scf_control_type), POINTER          :: scf_control
00362     TYPE(section_vals_type), POINTER         :: dft_section
00363     TYPE(cp_error_type), INTENT(inout)       :: error
00364 
00365     CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_read_parameters', 
00366       routineP = moduleN//':'//routineN
00367 
00368     INTEGER                                  :: cholesky_flag, handle, ialgo
00369     INTEGER, DIMENSION(:), POINTER           :: added_mos
00370     LOGICAL                                  :: do_mixing, failure
00371     REAL(KIND=dp), DIMENSION(:), POINTER     :: roks_parameter
00372     TYPE(section_vals_type), POINTER         :: mixing_section, 
00373                                                 outer_scf_section, 
00374                                                 scf_section, smear_section
00375 
00376     CALL timeset(routineN,handle)
00377 
00378     failure = .FALSE.
00379     CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure)
00380     CPPrecondition((scf_control%ref_count > 0),cp_failure_level,routineP,error,failure)
00381     IF (.NOT.failure) THEN
00382        scf_section => section_vals_get_subs_vals(dft_section,"SCF",error=error)
00383        CALL section_vals_val_get(scf_section,"nrow_block",i_val=scf_control%nrow_block,error=error)
00384        CALL section_vals_val_get(scf_section,"ncol_block",i_val=scf_control%ncol_block,error=error)
00385        CALL section_vals_val_get(scf_section,"DIAGONALIZATION%_SECTION_PARAMETERS_",&
00386             l_val=scf_control%use_diag,error=error)
00387        IF(scf_control%use_diag) THEN
00388          CALL section_vals_val_get(scf_section,"DIAGONALIZATION%DIAG_SUB_SCF%_SECTION_PARAMETERS_",&
00389             l_val=scf_control%do_diag_sub,error=error)
00390        END IF
00391        CALL section_vals_val_get(scf_section,"OT%_SECTION_PARAMETERS_",l_val=scf_control%use_ot,error=error)
00392        IF ( scf_control%use_diag .AND. scf_control%use_ot ) THEN
00393           ! don't allow both options to be true
00394           CALL cp_assert(.FALSE.,cp_failure_level,cp_assertion_failed,&
00395                routineP,"Don't activate OT and Diagonaliztion together",error,failure)
00396        ELSEIF ( .NOT. (scf_control%use_diag .OR. scf_control%use_ot) ) THEN
00397           ! set default to diagonalization
00398           scf_control%use_diag = .TRUE.
00399        END IF
00400        CALL section_vals_val_get(scf_section,"OT%ALGORITHM",i_val=ialgo,error=error)
00401        scf_control%do_outer_scf_reortho = ialgo.EQ.ot_algo_taylor_or_diag
00402        CALL section_vals_val_get(scf_section,"SCF_GUESS",i_val=scf_control%density_guess,error=error)
00403        CALL section_vals_val_get(scf_section,"EPS_DIIS",r_val=scf_control%eps_diis,error=error)
00404        CALL section_vals_val_get(scf_section,"eps_eigval",r_val=scf_control%eps_eigval,error=error)
00405        CALL section_vals_val_get(scf_section,"cholesky",i_val=cholesky_flag,error=error)
00406        IF(cholesky_flag>0) THEN
00407          scf_control%use_cholesky = .TRUE.
00408        END IF
00409        CALL section_vals_val_get(scf_section,"eps_scf",r_val=scf_control%eps_scf,error=error)
00410        CALL section_vals_val_get(scf_section,"level_shift",r_val=scf_control%level_shift,error=error)
00411        CALL section_vals_val_get(scf_section,"max_diis",i_val=scf_control%max_diis,error=error)
00412        CALL section_vals_val_get(scf_section,"max_scf",i_val=scf_control%max_scf,error=error)
00413 
00414        ! Diagonaliztion section
00415        IF ( scf_control%use_diag ) THEN
00416           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%ALGORITHM",&
00417                i_val=scf_control%diagonalization%method,error=error)
00418           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_JACOBI",&
00419                r_val=scf_control%diagonalization%eps_jacobi,error=error)
00420           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%JACOBI_THRESHOLD",&
00421                r_val=scf_control%diagonalization%jacobi_threshold,error=error)
00422           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%MAX_ITER",&
00423                i_val=scf_control%diagonalization%max_iter,error=error)
00424           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_ITER",&
00425                r_val=scf_control%diagonalization%eps_iter,error=error)
00426           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_ADAPT",&
00427                r_val=scf_control%diagonalization%eps_adapt,error=error)
00428           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%KRYLOV%NKRYLOV",&
00429                i_val=scf_control%diagonalization%nkrylov,error=error)
00430           CALL section_vals_val_get(scf_section,"DIAGONALIZATION%KRYLOV%NBLOCK",&
00431                i_val=scf_control%diagonalization%nblock_krylov,error=error)
00432           IF ( scf_control%diagonalization%method == diag_ot ) THEN
00433             ! read OT section
00434             CALL ot_diag_read_input(scf_control%diagonalization%ot_settings,scf_section,error)
00435           END IF
00436        END IF
00437 
00438        ! Read ROKS parameters
00439        CALL section_vals_val_get(scf_section,"ROKS_SCHEME",i_val=scf_control%roks_scheme,error=error)
00440 
00441        SELECT CASE (scf_control%roks_scheme)
00442        CASE (general_roks)
00443          ! Read parameters for the general ROKS scheme
00444           CALL section_vals_val_get(scf_section,"ROKS_F",r_val=scf_control%roks_f,error=error)
00445        CASE (high_spin_roks)
00446          ! Read high-spin ROKS parameters for the diagonal block
00447          ! 0 = v)irtual, 1 = o)pen shell, 2 = c)losed shell
00448          NULLIFY (roks_parameter)
00449          CALL section_vals_val_get(scf_section,"ROKS_PARAMETERS",r_vals=roks_parameter,error=error)
00450          IF (ASSOCIATED(roks_parameter)) THEN
00451             scf_control%roks_parameter(2,2,1) = roks_parameter(1) ! acc
00452             scf_control%roks_parameter(2,2,2) = roks_parameter(2) ! bcc
00453             scf_control%roks_parameter(1,1,1) = roks_parameter(3) ! aoo
00454             scf_control%roks_parameter(1,1,2) = roks_parameter(4) ! boo
00455             scf_control%roks_parameter(0,0,1) = roks_parameter(5) ! avv
00456             scf_control%roks_parameter(0,0,2) = roks_parameter(6) ! bvv
00457          END IF
00458        END SELECT
00459 
00460        ! should be moved to printkey
00461        CALL section_vals_val_get(scf_section,"eps_lumo",r_val=scf_control%eps_lumos,error=error)
00462        CALL section_vals_val_get(scf_section,"max_iter_lumo",i_val=scf_control%max_iter_lumos,error=error)
00463 
00464        ! Extra MOs, e.g. for smearing
00465        CALL section_vals_val_get(scf_section,"added_mos",i_vals=added_mos,error=error)
00466        CPPrecondition(ASSOCIATED(added_mos),cp_failure_level,routineP,error,failure)
00467        IF (SIZE(added_mos) > 0) THEN
00468           scf_control%added_mos(1) = added_mos(1)
00469           IF (SIZE(added_mos) > 1) THEN
00470              scf_control%added_mos(2) = added_mos(2)
00471           END IF
00472        END IF
00473 
00474        CALL section_vals_val_get(scf_section,"max_scf_history",i_val=scf_control%max_scf_hist,error=error)
00475        CALL section_vals_val_get(scf_section,"eps_scf_history",r_val=scf_control%eps_scf_hist,error=error)
00476 
00477        IF (scf_control%level_shift /= 0.0_dp) scf_control%use_cholesky = .FALSE.
00478        IF (scf_control%use_ot.AND.(scf_control%density_guess == core_guess)) THEN
00479           CALL stop_program(routineN,moduleN,__LINE__,"Use GUESS {ATOMIC,RESTART,RANDOM} with OT")
00480        END IF
00481 
00482        outer_scf_section => section_vals_get_subs_vals(scf_section,"OUTER_SCF",error=error)
00483        CALL section_vals_val_get(outer_scf_section,"_SECTION_PARAMETERS_",&
00484             l_val=scf_control%outer_scf%have_scf,error=error)
00485        IF (scf_control%outer_scf%have_scf) THEN
00486           CALL section_vals_val_get(outer_scf_section,"EPS_SCF",&
00487                                     r_val=scf_control%outer_scf%eps_scf,&
00488                                     error=error)
00489           CALL section_vals_val_get(outer_scf_section,"STEP_SIZE",&
00490                                     r_val=scf_control%outer_scf%step_size,&
00491                                     error=error)
00492           CALL section_vals_val_get(outer_scf_section,"DIIS_BUFFER_LENGTH",&
00493                                     i_val=scf_control%outer_scf%diis_buffer_length,&
00494                                     error=error)
00495           CALL section_vals_val_get(outer_scf_section,"BISECT_TRUST_COUNT",&
00496                                     i_val=scf_control%outer_scf%bisect_trust_count,&
00497                                     error=error)
00498           CALL section_vals_val_get(outer_scf_section,"TYPE",&
00499                                     i_val=scf_control%outer_scf%type,&
00500                                     error=error)
00501           CALL section_vals_val_get(outer_scf_section,"OPTIMIZER",&
00502                                     i_val=scf_control%outer_scf%optimizer,&
00503                                     error=error)
00504           CALL section_vals_val_get(outer_scf_section,"MAX_SCF",&
00505                                     i_val=scf_control%outer_scf%max_scf,&
00506                                     error=error)
00507           CALL section_vals_val_get(outer_scf_section,"EXTRAPOLATION_ORDER",&
00508                                     i_val=scf_control%outer_scf%extrapolation_order,&
00509                                     error=error)
00510        END IF
00511 
00512        smear_section => section_vals_get_subs_vals(scf_section,"SMEAR",error=error)
00513        CALL init_smear(scf_control%smear,error)
00514        CALL read_smear_section(scf_control%smear, smear_section, error)
00515 
00516        do_mixing = .FALSE.
00517        mixing_section => section_vals_get_subs_vals(scf_section,"MIXING",error=error)
00518        CALL section_vals_val_get(mixing_section,"_SECTION_PARAMETERS_",&
00519                                  l_val=do_mixing,&
00520                                  error=error)
00521        IF (do_mixing) THEN
00522           CALL section_vals_val_get(mixing_section,"METHOD",&
00523                                     i_val=scf_control%mixing_method,&
00524                                     error=error)
00525           CALL section_vals_val_get(mixing_section,"NMIXING",i_val=scf_control%nmixing,&
00526                                     error=error)
00527        END IF ! do mixing
00528     END IF ! failure
00529 
00530     CALL timestop(handle)
00531 
00532   END SUBROUTINE scf_c_read_parameters
00533 
00534   SUBROUTINE init_smear(smear,error)
00535     TYPE(smear_type), POINTER                :: smear
00536     TYPE(cp_error_type), INTENT(inout)       :: error
00537 
00538     CHARACTER(len=*), PARAMETER :: routineN = 'init_smear', 
00539       routineP = moduleN//':'//routineN
00540 
00541     INTEGER                                  :: stat
00542     LOGICAL                                  :: failure
00543 
00544     failure=.FALSE.
00545     CPPrecondition(.NOT.ASSOCIATED(smear),cp_failure_level,routineP,error,failure)
00546     IF(.NOT. failure) THEN
00547       ALLOCATE(smear,stat=stat)
00548       CPPostcondition((stat == 0),cp_failure_level,routineP,error,failure)
00549       smear%do_smear = .FALSE.
00550       smear%method = smear_energy_window
00551       smear%electronic_temperature = 0.0_dp
00552       smear%eps_fermi_dirac = 1.0E-5_dp
00553       smear%fixed_mag_mom=-100.0_dp
00554       smear%window_size = 0.0_dp
00555       NULLIFY(smear%list)
00556     END IF
00557   END SUBROUTINE init_smear
00558 
00559   SUBROUTINE read_smear_section(smear,smear_section,error)
00560     TYPE(smear_type), POINTER                :: smear
00561     TYPE(section_vals_type), POINTER         :: smear_section
00562     TYPE(cp_error_type), INTENT(inout)       :: error
00563 
00564     CHARACTER(len=*), PARAMETER :: routineN = 'read_smear_section', 
00565       routineP = moduleN//':'//routineN
00566 
00567     INTEGER                                  :: stat
00568     LOGICAL                                  :: failure
00569     REAL(KIND=dp), DIMENSION(:), POINTER     :: r_vals
00570 
00571     failure=.FALSE.
00572     NULLIFY(r_vals)
00573 
00574     IF (.NOT.failure) THEN
00575       CALL section_vals_val_get(smear_section,"_SECTION_PARAMETERS_",&
00576                                 l_val=smear%do_smear,&
00577                                 error=error)
00578       IF (smear%do_smear) THEN
00579          CALL section_vals_val_get(smear_section,"METHOD",&
00580                                    i_val=smear%method,&
00581                                    error=error)
00582          CALL section_vals_val_get(smear_section,"ELECTRONIC_TEMPERATURE",&
00583                                    r_val=smear%electronic_temperature,&
00584                                    error=error)
00585          CALL section_vals_val_get(smear_section,"EPS_FERMI_DIRAC",&
00586                                    r_val=smear%eps_fermi_dirac,&
00587                                    error=error)
00588          CALL section_vals_val_get(smear_section,"WINDOW_SIZE",&
00589                                    r_val=smear%window_size,&
00590                                    error=error)
00591          IF (smear%method==smear_list) THEN
00592             CALL section_vals_val_get(smear_section,"LIST",&
00593                                       r_vals=r_vals,&
00594                                       error=error)
00595             CPPrecondition(ASSOCIATED(r_vals),cp_failure_level,routineP,error,failure)
00596             ALLOCATE(smear%list(SIZE(r_vals)),stat=stat)
00597             CPPostcondition(stat==0,cp_warning_level,routineP,error,failure)
00598             smear%list=r_vals
00599          END IF
00600          CALL section_vals_val_get(smear_section,"FIXED_MAGNETIC_MOMENT",&
00601                                    r_val=smear%fixed_mag_mom,&
00602                                    error=error)
00603       END IF ! do smear
00604     END IF
00605   END SUBROUTINE read_smear_section
00606 
00607 ! *****************************************************************************
00616   SUBROUTINE scf_c_write_parameters(scf_control,dft_section,error)
00617 
00618     TYPE(scf_control_type), POINTER          :: scf_control
00619     TYPE(section_vals_type), POINTER         :: dft_section
00620     TYPE(cp_error_type), INTENT(inout)       :: error
00621 
00622     CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_write_parameters', 
00623       routineP = moduleN//':'//routineN
00624 
00625     INTEGER                                  :: handle, output_unit, 
00626                                                 roks_scheme
00627     LOGICAL                                  :: failure, roks
00628     REAL(KIND=dp)                            :: elec_temp
00629     TYPE(cp_logger_type), POINTER            :: logger
00630     TYPE(enumeration_type), POINTER          :: enum
00631     TYPE(keyword_type), POINTER              :: keyword
00632     TYPE(section_type), POINTER              :: section
00633     TYPE(section_vals_type), POINTER         :: scf_section
00634 
00635     CALL timeset(routineN,handle)
00636 
00637     failure = .FALSE.
00638 
00639     NULLIFY (logger)
00640     logger => cp_error_get_logger(error)
00641 
00642     NULLIFY (scf_section)
00643     NULLIFY (section)
00644 
00645     CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure)
00646     CPPrecondition(scf_control%ref_count>0,cp_failure_level,routineP,error,failure)
00647 
00648     IF (.NOT.failure) THEN
00649 
00650        scf_section => section_vals_get_subs_vals(dft_section,"SCF",error=error)
00651        output_unit = cp_print_key_unit_nr(logger,scf_section,"PRINT%PROGRAM_RUN_INFO",&
00652             extension=".scfLog",error=error)
00653 
00654        IF (output_unit > 0) THEN
00655 
00656           IF (scf_control%max_scf > 0) THEN
00657 
00658              CALL create_scf_section(section,error=error)
00659 
00660              keyword => section_get_keyword(section,"SCF_GUESS",error=error)
00661              CALL keyword_get(keyword,enum=enum,error=error)
00662 
00663              WRITE (UNIT=output_unit,&
00664                   FMT="(/,/,T2,A,T25,A,T51,A30,/,T25,56('-'),3(/,T25,A,T76,I5),/,"//&
00665                   "T25,56('-'),4(/,T25,A,T72,ES9.2),/,T25,56('-'),"//&
00666                   "1(/,T25,A,T76,F5.2))")&
00667                   "SCF PARAMETERS",&
00668                   "Density guess:     ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%density_guess,error=error))),&
00669                   "max_scf:           ",scf_control%max_scf,&
00670                   "max_scf_history:   ",scf_control%max_scf_hist,&
00671                   "max_diis:          ",scf_control%max_diis,&
00672                   "eps_scf:           ",scf_control%eps_scf,&
00673                   "eps_scf_history:   ",scf_control%eps_scf_hist,&
00674                   "eps_diis:          ",scf_control%eps_diis,&
00675                   "eps_eigval:        ",scf_control%eps_eigval,&
00676                   "level_shift [a.u.]:",scf_control%level_shift
00677              IF ( SUM(scf_control%added_mos) > 0 ) THEN
00678                WRITE (UNIT=output_unit,FMT="(T25,A,T71,2I5)")&
00679                   "added MOs          ",scf_control%added_mos
00680              END IF
00681 
00682              IF (scf_control%mixing_method>0 .AND. .NOT. scf_control%use_ot) THEN
00683                 keyword => section_get_keyword(section,"MIXING%METHOD",error=error)
00684                 CALL keyword_get(keyword,enum=enum,error=error)
00685                 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")&
00686                      REPEAT("-",56),&
00687                      "Mixing method:      ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%mixing_method,error=error)))
00688                 IF(scf_control%mixing_method>1) THEN
00689                 WRITE (UNIT=output_unit,FMT="(T47,A34)") "charge density mixing in g-space"
00690                 END IF
00691              END IF
00692              IF (scf_control%smear%do_smear) THEN
00693                 keyword => section_get_keyword(section,"SMEAR%METHOD",error=error)
00694                 CALL keyword_get(keyword,enum=enum,error=error)
00695                 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")&
00696                      REPEAT("-",56),&
00697                      "Smear method:      ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%smear%method,error=error)))
00698                 SELECT CASE (scf_control%smear%method)
00699                 CASE (smear_fermi_dirac)
00700                    elec_temp = cp_unit_from_cp2k(scf_control%smear%electronic_temperature,&
00701                         "K",error=error)
00702                    WRITE (UNIT=output_unit,FMT="(T25,A,T61,F20.1)")&
00703                         "Electronic temperature [K]:",elec_temp
00704                    WRITE (UNIT=output_unit,FMT="(T25,A,T71,ES10.2)")&
00705                         "Electronic temperature [a.u.]:",scf_control%smear%electronic_temperature,&
00706                         "Accuracy threshold:",scf_control%smear%eps_fermi_dirac
00707                    IF(scf_control%smear%fixed_mag_mom>0.0_dp) WRITE (UNIT=output_unit,FMT="(T25,A,F10.5)")&
00708                           "Spin channel alpha and spin channel beta are smeared independently, keeping "//&
00709                           " fixed difference in number of electrons equal to ",scf_control%smear%fixed_mag_mom
00710                 CASE (smear_energy_window)
00711                    WRITE (UNIT=output_unit,FMT="(T25,A,T71,F10.6)")&
00712                         "Smear window [a.u.]:       ",scf_control%smear%window_size
00713                 END SELECT
00714              END IF
00715 
00716              CALL section_vals_val_get(dft_section,"ROKS",l_val=roks,error=error)
00717              IF (roks.AND.(.NOT.scf_control%use_ot)) THEN
00718                 CALL section_vals_val_get(scf_section,"ROKS_SCHEME",&
00719                      i_val=roks_scheme,error=error)
00720                 keyword => section_get_keyword(section,"ROKS_SCHEME",error=error)
00721                 CALL keyword_get(keyword,enum=enum,error=error)
00722                 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")&
00723                      REPEAT("-",56),&
00724                      "ROKS scheme:",ADJUSTR(TRIM(enum_i2c(enum,roks_scheme,error=error)))
00725                 SELECT CASE (roks_scheme)
00726                 CASE (general_roks)
00727                    WRITE (UNIT=output_unit,FMT="(T25,A,T71,F10.6)")&
00728                         "ROKS parameter f:",scf_control%roks_f
00729                 CASE (high_spin_roks)
00730                    WRITE (UNIT=output_unit,&
00731                         FMT="(T25,A,6(/,T25,A,T71,F10.6))")&
00732                         "ROKS parameters: a)lpha, b)eta; c)losed, o)pen, v)irtual",&
00733                         "acc",scf_control%roks_parameter(2,2,1),&
00734                         "bcc",scf_control%roks_parameter(2,2,2),&
00735                         "aoo",scf_control%roks_parameter(1,1,1),&
00736                         "boo",scf_control%roks_parameter(1,1,2),&
00737                         "avv",scf_control%roks_parameter(0,0,1),&
00738                         "bvv",scf_control%roks_parameter(0,0,2)
00739                 END SELECT
00740              END IF
00741              CALL section_release(section,error=error)
00742 
00743              IF (scf_control%outer_scf%have_scf) THEN
00744                 WRITE (output_unit,"(T25,56('-'),/,T25,A)") "Outer loop SCF in use "
00745                 SELECT CASE(scf_control%outer_scf%type)
00746                 CASE (outer_scf_none)
00747                    WRITE (output_unit,'(T25,A)') "No variables optimised in outer loop"
00748                 CASE (outer_scf_ddapc_constraint)
00749                    WRITE (output_unit,'(T25,A)') "DDAPC constraint enforced"
00750                 CASE (outer_scf_s2_constraint)
00751                    WRITE (output_unit,'(T25,A)') "S2 constraint enforced"
00752                 CASE (outer_scf_becke_constraint)
00753                    WRITE (output_unit,'(T25,A)') "Becke weight population constraint enforced"
00754                 CASE (outer_scf_scp)
00755                    WRITE (output_unit,'(T25,A)') "SCP optimization with outer loop enforced"
00756                 CASE DEFAULT
00757                    CPPrecondition(.FALSE.,cp_failure_level,routineP,error,failure)
00758                 END SELECT
00759                 WRITE (output_unit,'(T25,A,T72,ES9.2)') "eps_scf",scf_control%outer_scf%eps_scf
00760                 WRITE (output_unit,'(T25,A,T72,I9)') "max_scf",scf_control%outer_scf%max_scf
00761                 SELECT CASE(scf_control%outer_scf%optimizer)
00762                 CASE (outer_scf_optimizer_none)
00763                    WRITE (output_unit,'(T25,A)') "No outer loop optimization"
00764                 CASE (outer_scf_optimizer_sd)
00765                    WRITE (output_unit,'(T25,A)') "Steepest descent optimization"
00766                 CASE (outer_scf_optimizer_bisect)
00767                    WRITE (output_unit,'(T25,A)') "Gradient bisection"
00768                    WRITE (output_unit,'(T25,A,T72,I9)') "bisect_trust_count",scf_control%outer_scf%bisect_trust_count
00769                 CASE (outer_scf_optimizer_diis)
00770                    WRITE (output_unit,'(T25,A)') "DIIS optimization"
00771                    WRITE (output_unit,'(T25,A,T72,I9)') "DIIS buffer length", &
00772                         scf_control%outer_scf%diis_buffer_length
00773                 CASE DEFAULT
00774                    CPPrecondition(.FALSE.,cp_failure_level,routineP,error,failure)
00775                 END SELECT
00776                 WRITE (output_unit,'(T25,A,T72,ES9.2)') "step_size",scf_control%outer_scf%step_size
00777              ELSE
00778                 WRITE (output_unit,"(T25,56('-'),/,T25,A)") "No outer SCF"
00779              END IF
00780 
00781           END IF ! max_scf > 0
00782 
00783        END IF ! output_unit > 0
00784 
00785        CALL cp_print_key_finished_output(output_unit,logger,scf_section,&
00786             "PRINT%PROGRAM_RUN_INFO",error=error)
00787 
00788     END IF ! not failure
00789 
00790     CALL timestop(handle)
00791 
00792   END SUBROUTINE scf_c_write_parameters
00793 
00794 ! *****************************************************************************
00795 
00796   SUBROUTINE ot_diag_read_input(settings,scf_section,error)
00797     TYPE(qs_ot_settings_type)                :: settings
00798     TYPE(section_vals_type), POINTER         :: scf_section
00799     TYPE(cp_error_type), INTENT(inout)       :: error
00800 
00801     CHARACTER(len=*), PARAMETER :: routineN = 'ot_diag_read_input', 
00802       routineP = moduleN//':'//routineN
00803 
00804     INTEGER                                  :: handle, output_unit
00805     LOGICAL                                  :: explicit, failure
00806     TYPE(cp_logger_type), POINTER            :: logger
00807     TYPE(section_vals_type), POINTER         :: ot_section
00808 
00809     failure=.FALSE.
00810 
00811     CALL timeset(routineN,handle)
00812 
00813     logger => cp_error_get_logger(error)
00814     output_unit=cp_print_key_unit_nr(logger,scf_section,"PRINT%PROGRAM_RUN_INFO",&
00815          extension=".log",error=error)
00816 
00817     ! decide default settings
00818     CALL qs_ot_settings_init(settings)
00819 
00820     ! use ot input new style
00821     ot_section=>section_vals_get_subs_vals(scf_section,"DIAGONALIZATION%OT",error=error)
00822     CALL section_vals_get(ot_section,explicit=explicit,error=error)
00823 
00824     CALL ot_readwrite_input(settings,ot_section,output_unit,error)
00825 
00826     CALL cp_print_key_finished_output(output_unit,logger,scf_section,&
00827          "PRINT%PROGRAM_RUN_INFO", error=error)
00828 
00829     CALL timestop(handle)
00830 
00831   END SUBROUTINE ot_diag_read_input
00832 
00833 ! *****************************************************************************
00834 
00835 END MODULE scf_control_types