|
CP2K 2.4 (Revision 12889)
|
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
1.7.3