Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief contains typo and related routines to handle parameters controlling the
10 : !> GEO_OPT module
11 : !> \par History
12 : !> none
13 : ! **************************************************************************************************
14 : MODULE gopt_param_types
15 :
16 : USE input_constants, ONLY: default_bfgs_method_id,&
17 : default_cell_method_id,&
18 : default_cg_method_id,&
19 : default_lbfgs_method_id,&
20 : default_ts_method_id,&
21 : none_ts_method_id
22 : USE input_section_types, ONLY: section_vals_type,&
23 : section_vals_val_get
24 : USE kinds, ONLY: dp
25 : #include "../base/base_uses.f90"
26 :
27 : IMPLICIT NONE
28 : PRIVATE
29 :
30 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
31 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'gopt_param_types'
32 :
33 : PUBLIC :: gopt_param_type
34 : PUBLIC :: gopt_param_read
35 :
36 : ! **************************************************************************************************
37 : !> \brief stores the parameters nedeed for a geometry optimization
38 : !> \param method_id the optimization method
39 : !> \param wanted_proj_gradient the wanted accuracy on the projected gradient
40 : !> \param wanted_rel_f_error ...
41 : !> \param max_h_rank maximum rank of the hessian approximation
42 : !> \param max_f_per_iter maximum number of function evaluations per iteration
43 : !> \param max_iter maximum number of iterations
44 : !> \par History
45 : !> 08.2003 created [fawzi]
46 : !> \author Fawzi Mohamed
47 : ! **************************************************************************************************
48 : TYPE cg_ls_param_type
49 : INTEGER :: brent_max_iter = 0, type_id = default_cell_method_id
50 : REAL(KIND=dp) :: brent_tol = 0.0_dp, brack_limit = 0.0_dp, initial_step = 0.0_dp, max_step = 0.0_dp
51 : LOGICAL :: grad_only = .FALSE.
52 : END TYPE cg_ls_param_type
53 :
54 : ! **************************************************************************************************
55 : TYPE gopt_param_type
56 : LOGICAL :: Fletcher_Reeves = .FALSE.
57 : INTEGER :: method_id = default_cell_method_id, type_id = default_cell_method_id
58 : INTEGER :: ts_method_id = 0, shellcore_method_id = 0
59 : INTEGER :: max_f_per_iter = 0, max_iter = 0, max_h_rank = 0
60 : INTEGER :: max_steep_steps = 0, print_control = 0
61 : REAL(KIND=dp) :: restart_limit = 0.0_dp
62 : REAL(KIND=dp) :: trust_radius = -1.0_dp, wanted_proj_gradient = 0.0_dp, wanted_rel_f_error = 0.0_dp
63 : REAL(KIND=dp) :: max_dr = 0.0_dp, max_force = 0.0_dp, rms_dr = 0.0_dp, rms_force = 0.0_dp
64 : REAL(KIND=dp) :: dimer_angle_tol = 0.0_dp
65 : TYPE(cg_ls_param_type) :: cg_ls = cg_ls_param_type()
66 : END TYPE gopt_param_type
67 :
68 : CONTAINS
69 :
70 : ! **************************************************************************************************
71 : !> \brief reads the parameters of the geopmetry optimizer
72 : !> \param gopt_param ...
73 : !> \param gopt_section ...
74 : !> \param type_id ...
75 : !> \par History
76 : !> 08.2003 created [fawzi]
77 : !> \author Fawzi Mohamed
78 : ! **************************************************************************************************
79 1121 : SUBROUTINE gopt_param_read(gopt_param, gopt_section, type_id)
80 : TYPE(gopt_param_type), INTENT(OUT) :: gopt_param
81 : TYPE(section_vals_type), POINTER :: gopt_section
82 : INTEGER, INTENT(IN), OPTIONAL :: type_id
83 :
84 : LOGICAL :: explicit
85 :
86 1121 : CPASSERT(ASSOCIATED(gopt_section))
87 :
88 1121 : IF (PRESENT(type_id)) THEN
89 248 : gopt_param%type_id = type_id
90 : ELSE
91 873 : CALL section_vals_val_get(gopt_section, "TYPE", i_val=gopt_param%type_id)
92 : END IF
93 1121 : CALL section_vals_val_get(gopt_section, "OPTIMIZER", i_val=gopt_param%method_id)
94 :
95 1121 : CALL section_vals_val_get(gopt_section, "MAX_ITER", i_val=gopt_param%max_iter)
96 1121 : CALL section_vals_val_get(gopt_section, "MAX_DR", r_val=gopt_param%max_dr)
97 1121 : CALL section_vals_val_get(gopt_section, "MAX_FORCE", r_val=gopt_param%max_force)
98 1121 : CALL section_vals_val_get(gopt_section, "RMS_DR", r_val=gopt_param%rms_dr)
99 1121 : CALL section_vals_val_get(gopt_section, "RMS_FORCE", r_val=gopt_param%rms_force)
100 :
101 1211 : SELECT CASE (gopt_param%method_id)
102 : CASE (default_lbfgs_method_id)
103 90 : CALL section_vals_val_get(gopt_section, "LBFGS%MAX_H_RANK", i_val=gopt_param%max_h_rank)
104 90 : CALL section_vals_val_get(gopt_section, "LBFGS%MAX_F_PER_ITER", i_val=gopt_param%max_f_per_iter)
105 90 : CALL section_vals_val_get(gopt_section, "LBFGS%TRUST_RADIUS", r_val=gopt_param%trust_radius)
106 90 : CALL section_vals_val_get(gopt_section, "LBFGS%WANTED_PROJ_GRADIENT", r_val=gopt_param%wanted_proj_gradient)
107 90 : CALL section_vals_val_get(gopt_section, "LBFGS%WANTED_REL_F_ERROR", r_val=gopt_param%wanted_rel_f_error)
108 90 : CALL section_vals_val_get(gopt_section, "LBFGS%__CONTROL_VAL", explicit=explicit)
109 90 : IF (explicit) THEN
110 0 : CALL section_vals_val_get(gopt_section, "LBFGS%__CONTROL_VAL", i_val=gopt_param%print_control)
111 : ELSE
112 90 : CALL section_vals_val_get(gopt_section, "LBFGS%PRINT_LEVEL", i_val=gopt_param%print_control)
113 : END IF
114 : CASE (default_bfgs_method_id)
115 : ! Do nothing
116 : CASE (default_cg_method_id)
117 158 : CALL section_vals_val_get(gopt_section, "CG%FLETCHER_REEVES", l_val=gopt_param%Fletcher_Reeves)
118 158 : CALL section_vals_val_get(gopt_section, "CG%MAX_STEEP_STEPS", i_val=gopt_param%max_steep_steps)
119 158 : CALL section_vals_val_get(gopt_section, "CG%RESTART_LIMIT", r_val=gopt_param%restart_limit)
120 158 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%TYPE", i_val=gopt_param%cg_ls%type_id)
121 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%GOLD%INITIAL_STEP", &
122 158 : r_val=gopt_param%cg_ls%initial_step)
123 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%GOLD%BRENT_TOL", &
124 158 : r_val=gopt_param%cg_ls%brent_tol)
125 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%GOLD%BRENT_MAX_ITER", &
126 158 : i_val=gopt_param%cg_ls%brent_max_iter)
127 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%GOLD%BRACK_LIMIT", &
128 158 : r_val=gopt_param%cg_ls%brack_limit)
129 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%2PNT%MAX_ALLOWED_STEP", &
130 158 : r_val=gopt_param%cg_ls%max_step)
131 : CALL section_vals_val_get(gopt_section, "CG%LINE_SEARCH%2PNT%LINMIN_GRAD_ONLY", &
132 1369 : l_val=gopt_param%cg_ls%grad_only)
133 : END SELECT
134 :
135 1121 : IF (gopt_param%type_id == default_ts_method_id) THEN
136 24 : CALL section_vals_val_get(gopt_section, "TRANSITION_STATE%METHOD", i_val=gopt_param%ts_method_id)
137 : ELSE
138 1097 : gopt_param%ts_method_id = none_ts_method_id
139 : END IF
140 :
141 1121 : END SUBROUTINE gopt_param_read
142 :
143 0 : END MODULE gopt_param_types
|