CP2K 2.4 (Revision 12889)

gopt_param_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 ! *****************************************************************************
00012 MODULE gopt_param_types
00013   USE f77_blas
00014   USE input_constants,                 ONLY: default_bfgs_method_id,&
00015                                              default_cell_method_id,&
00016                                              default_cg_method_id,&
00017                                              default_lbfgs_method_id,&
00018                                              default_minimization_method_id,&
00019                                              default_ts_method_id,&
00020                                              none_ts_method_id
00021   USE input_section_types,             ONLY: section_vals_type,&
00022                                              section_vals_val_get
00023   USE kinds,                           ONLY: dp
00024 #include "cp_common_uses.h"
00025 
00026   IMPLICIT NONE
00027   PRIVATE
00028 
00029   LOGICAL, PRIVATE, PARAMETER :: debug_this_module=.TRUE.
00030   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'gopt_param_types'
00031   INTEGER, PRIVATE, SAVE :: last_gopt_param_id=0
00032 
00033   PUBLIC :: gopt_param_type, cg_ls_param_type
00034   PUBLIC :: gopt_param_create, gopt_param_read, gopt_param_retain, &
00035             gopt_param_release
00036 
00037 ! *****************************************************************************
00049   TYPE cg_ls_param_type
00050      INTEGER         :: brent_max_iter, type_id
00051      REAL(KIND = dp) :: brent_tol, brack_limit, initial_step, max_step
00052      LOGICAL         :: grad_only
00053   END TYPE cg_ls_param_type
00054 
00055 ! *****************************************************************************
00056   TYPE gopt_param_type
00057      LOGICAL                  :: Fletcher_Reeves
00058      INTEGER                  :: id_nr, ref_count
00059      INTEGER                  :: method_id, type_id
00060      INTEGER                  :: ts_method_id, cell_method_id, shellcore_method_id
00061      INTEGER                  :: max_f_per_iter, max_iter, max_h_rank
00062      INTEGER                  :: max_steep_steps
00063      REAL(KIND = dp)          :: restart_limit
00064      REAL(KIND = dp)          :: wanted_proj_gradient, wanted_rel_f_error
00065      REAL(KIND = dp)          :: max_dr, max_force, rms_dr, rms_force
00066      REAL(KIND = dp)          :: dimer_angle_tol
00067      TYPE(cg_ls_param_type)   :: cg_ls
00068   END TYPE gopt_param_type
00069 
00070 CONTAINS
00071 
00072 ! *****************************************************************************
00081   SUBROUTINE gopt_param_create(gopt_param,error)
00082     TYPE(gopt_param_type), POINTER           :: gopt_param
00083     TYPE(cp_error_type), INTENT(inout)       :: error
00084 
00085     CHARACTER(len=*), PARAMETER :: routineN = 'gopt_param_create', 
00086       routineP = moduleN//':'//routineN
00087 
00088     INTEGER                                  :: stat
00089     LOGICAL                                  :: failure
00090 
00091     failure=.FALSE.
00092 
00093     ALLOCATE(gopt_param, stat=stat)
00094     CPPostcondition(stat==0,cp_failure_level,routineP,error,failure)
00095 
00096     IF (.NOT. failure) THEN
00097        last_gopt_param_id=last_gopt_param_id+1
00098        gopt_param%id_nr=last_gopt_param_id
00099        gopt_param%ref_count=1
00100     END IF
00101   END SUBROUTINE gopt_param_create
00102 
00103 ! *****************************************************************************
00111   SUBROUTINE gopt_param_read(gopt_param, gopt_section, type_id, error)
00112     TYPE(gopt_param_type), POINTER           :: gopt_param
00113     TYPE(section_vals_type), POINTER         :: gopt_section
00114     INTEGER, INTENT(IN), OPTIONAL            :: type_id
00115     TYPE(cp_error_type), INTENT(inout)       :: error
00116 
00117     CHARACTER(len=*), PARAMETER :: routineN = 'gopt_param_read', 
00118       routineP = moduleN//':'//routineN
00119 
00120     LOGICAL                                  :: failure
00121 
00122     failure=.FALSE.
00123 
00124     CPPrecondition(.NOT.ASSOCIATED(gopt_param),cp_failure_level,routineP,error,failure)
00125     CPPrecondition(ASSOCIATED(gopt_section),cp_failure_level,routineP,error,failure)
00126     CALL gopt_param_create(gopt_param, error=error)
00127 
00128     failure=.FALSE.
00129     IF (.NOT.failure) THEN
00130        IF (PRESENT(type_id)) THEN
00131           gopt_param%type_id = type_id
00132        ELSE
00133           CALL section_vals_val_get(gopt_section,"TYPE",i_val=gopt_param%type_id,error=error)
00134        END IF
00135        CALL section_vals_val_get(gopt_section,"OPTIMIZER",i_val=gopt_param%method_id,error=error)
00136 
00137        CALL section_vals_val_get(gopt_section,"MAX_ITER",i_val=gopt_param%max_iter,error=error)
00138        CALL section_vals_val_get(gopt_section,"MAX_DR",r_val=gopt_param%max_dr,error=error)
00139        CALL section_vals_val_get(gopt_section,"MAX_FORCE",r_val=gopt_param%max_force,error=error)
00140        CALL section_vals_val_get(gopt_section,"RMS_DR",r_val=gopt_param%rms_dr,error=error)
00141        CALL section_vals_val_get(gopt_section,"RMS_FORCE",r_val=gopt_param%rms_force,error=error)
00142 
00143        SELECT CASE(gopt_param%method_id)
00144        CASE(default_lbfgs_method_id)
00145           CALL section_vals_val_get(gopt_section,"LBFGS%MAX_H_RANK",i_val=gopt_param%max_h_rank,error=error)
00146           CALL section_vals_val_get(gopt_section,"LBFGS%MAX_F_PER_ITER",i_val=gopt_param%max_f_per_iter,error=error)
00147           CALL section_vals_val_get(gopt_section,"LBFGS%WANTED_PROJ_GRADIENT",r_val=gopt_param%wanted_proj_gradient,error=error)
00148           CALL section_vals_val_get(gopt_section,"LBFGS%WANTED_REL_F_ERROR",r_val=gopt_param%wanted_rel_f_error,error=error)
00149        CASE(default_bfgs_method_id)
00150           ! Do nothing
00151        CASE(default_cg_method_id)
00152           CALL section_vals_val_get(gopt_section,"CG%FLETCHER_REEVES",l_val=gopt_param%Fletcher_Reeves,error=error)
00153           CALL section_vals_val_get(gopt_section,"CG%MAX_STEEP_STEPS",i_val=gopt_param%max_steep_steps,error=error)
00154           CALL section_vals_val_get(gopt_section,"CG%RESTART_LIMIT",r_val=gopt_param%restart_limit,error=error)
00155           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%TYPE",i_val=gopt_param%cg_ls%type_id,error=error)
00156           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%GOLD%INITIAL_STEP",&
00157                r_val=gopt_param%cg_ls%initial_step,error=error)
00158           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%GOLD%BRENT_TOL",&
00159                r_val=gopt_param%cg_ls%brent_tol,error=error)
00160           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%GOLD%BRENT_MAX_ITER",&
00161                i_val=gopt_param%cg_ls%brent_max_iter,error=error)
00162           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%GOLD%BRACK_LIMIT",&
00163                r_val=gopt_param%cg_ls%brack_limit,error=error)
00164           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%2PNT%MAX_ALLOWED_STEP",&
00165                r_val=gopt_param%cg_ls%max_step,error=error)
00166           CALL section_vals_val_get(gopt_section,"CG%LINE_SEARCH%2PNT%LINMIN_GRAD_ONLY",&
00167                l_val=gopt_param%cg_ls%grad_only,error=error)
00168        END SELECT
00169 
00170        SELECT CASE(gopt_param%type_id)
00171        CASE(default_minimization_method_id)
00172           ! Do Nothing
00173           gopt_param%ts_method_id=none_ts_method_id
00174        CASE(default_ts_method_id)
00175           CALL section_vals_val_get(gopt_section,"TRANSITION_STATE%METHOD",i_val=gopt_param%ts_method_id,error=error)
00176        CASE(default_cell_method_id)
00177           CALL section_vals_val_get(gopt_section,"TYPE",i_val=gopt_param%cell_method_id,error=error)
00178        END SELECT
00179     END IF
00180 
00181   END SUBROUTINE gopt_param_read
00182 
00183 ! *****************************************************************************
00190   SUBROUTINE gopt_param_retain(gopt_param, error)
00191     TYPE(gopt_param_type), POINTER           :: gopt_param
00192     TYPE(cp_error_type), INTENT(inout)       :: error
00193 
00194     CHARACTER(len=*), PARAMETER :: routineN = 'gopt_param_retain', 
00195       routineP = moduleN//':'//routineN
00196 
00197     LOGICAL                                  :: failure
00198 
00199     failure=.FALSE.
00200 
00201     CPPrecondition(ASSOCIATED(gopt_param),cp_failure_level,routineP,error,failure)
00202     IF (.NOT.failure) THEN
00203        CPPreconditionNoFail(gopt_param%ref_count>0,cp_failure_level,routineP,error)
00204        gopt_param%ref_count=gopt_param%ref_count+1
00205     END IF
00206   END SUBROUTINE gopt_param_retain
00207 
00208 ! *****************************************************************************
00215   SUBROUTINE gopt_param_release(gopt_param, error)
00216     TYPE(gopt_param_type), POINTER           :: gopt_param
00217     TYPE(cp_error_type), INTENT(inout)       :: error
00218 
00219     CHARACTER(len=*), PARAMETER :: routineN = 'gopt_param_release', 
00220       routineP = moduleN//':'//routineN
00221 
00222     INTEGER                                  :: stat
00223     LOGICAL                                  :: failure
00224 
00225     failure=.FALSE.
00226 
00227     IF (ASSOCIATED(gopt_param)) THEN
00228        CPPreconditionNoFail(gopt_param%ref_count>0,cp_failure_level,routineP,error)
00229        gopt_param%ref_count=gopt_param%ref_count-1
00230        IF (gopt_param%ref_count==0) THEN
00231           DEALLOCATE(gopt_param, stat=stat)
00232           CPPostcondition(stat==0,cp_warning_level,routineP,error,failure)
00233        END IF
00234     END IF
00235   END SUBROUTINE gopt_param_release
00236 
00237 END MODULE gopt_param_types