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 performs geometry optimization
10 : !> \par History
11 : !> none
12 : ! **************************************************************************************************
13 : MODULE geo_opt
14 :
15 : USE bfgs_optimizer, ONLY: geoopt_bfgs
16 : USE cg_optimizer, ONLY: geoopt_cg
17 : USE cp_lbfgs_geo, ONLY: geoopt_lbfgs
18 : USE cp_log_handling, ONLY: cp_get_default_logger,&
19 : cp_logger_type
20 : USE cp_output_handling, ONLY: cp_add_iter_level,&
21 : cp_iterate,&
22 : cp_rm_iter_level
23 : USE force_env_types, ONLY: force_env_type
24 : USE global_types, ONLY: global_environment_type
25 : USE gopt_f_methods, ONLY: gopt_f_create_x0
26 : USE gopt_f_types, ONLY: gopt_f_create,&
27 : gopt_f_release,&
28 : gopt_f_type
29 : USE gopt_param_types, ONLY: gopt_param_read,&
30 : gopt_param_type
31 : USE hfx_ace_methods, ONLY: hfx_ace_set_dynamic_mode
32 : USE input_constants, ONLY: default_bfgs_method_id,&
33 : default_cg_method_id,&
34 : default_lbfgs_method_id
35 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
36 : section_vals_type,&
37 : section_vals_val_get,&
38 : section_vals_val_set
39 : USE kinds, ONLY: dp
40 : #include "../base/base_uses.f90"
41 :
42 : IMPLICIT NONE
43 : PRIVATE
44 :
45 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'geo_opt'
46 :
47 : PUBLIC :: cp_geo_opt
48 :
49 : CONTAINS
50 :
51 : ! **************************************************************************************************
52 : !> \brief Main driver to perform geometry optimization
53 : !> \param force_env ...
54 : !> \param globenv ...
55 : !> \param eval_opt_geo ...
56 : !> \param rm_restart_info ...
57 : ! **************************************************************************************************
58 2667 : SUBROUTINE cp_geo_opt(force_env, globenv, eval_opt_geo, rm_restart_info)
59 :
60 : TYPE(force_env_type), POINTER :: force_env
61 : TYPE(global_environment_type), POINTER :: globenv
62 : LOGICAL, INTENT(IN), OPTIONAL :: eval_opt_geo, rm_restart_info
63 :
64 : CHARACTER(len=*), PARAMETER :: routineN = 'cp_geo_opt'
65 :
66 : INTEGER :: handle, step_start_val
67 : LOGICAL :: my_rm_restart_info
68 889 : REAL(KIND=dp), DIMENSION(:), POINTER :: x0
69 : TYPE(cp_logger_type), POINTER :: logger
70 : TYPE(gopt_f_type), POINTER :: gopt_env
71 : TYPE(gopt_param_type), POINTER :: gopt_param
72 : TYPE(section_vals_type), POINTER :: geo_section, root_section
73 :
74 889 : CALL timeset(routineN, handle)
75 889 : logger => cp_get_default_logger()
76 :
77 889 : CPASSERT(ASSOCIATED(force_env))
78 889 : CPASSERT(ASSOCIATED(globenv))
79 889 : NULLIFY (gopt_param, gopt_env, x0)
80 :
81 : ! Tell ACE that this is a dynamic run: full HFX is used for the
82 : ! entire first geometry step so that wavefunction extrapolation
83 : ! delivers a near-converged C_occ to step 1, making the ACE
84 : ! projector BUILD there accurate.
85 889 : CALL hfx_ace_set_dynamic_mode(.TRUE.)
86 :
87 889 : root_section => force_env%root_section
88 889 : geo_section => section_vals_get_subs_vals(root_section, "MOTION%GEO_OPT")
89 :
90 889 : ALLOCATE (gopt_param)
91 889 : CALL gopt_param_read(gopt_param, geo_section)
92 : CALL gopt_f_create(gopt_env, gopt_param, force_env=force_env, globenv=globenv, &
93 889 : geo_opt_section=geo_section, eval_opt_geo=eval_opt_geo)
94 889 : gopt_env%dimer_rotation_optimizer => cp_rot_opt
95 889 : CALL gopt_f_create_x0(gopt_env, x0)
96 :
97 889 : CALL section_vals_val_get(geo_section, "STEP_START_VAL", i_val=step_start_val)
98 889 : CALL cp_add_iter_level(logger%iter_info, "GEO_OPT")
99 889 : CALL cp_iterate(logger%iter_info, iter_nr=step_start_val)
100 : CALL cp_geo_opt_low(force_env, globenv, gopt_param, gopt_env, &
101 889 : geo_section, x0)
102 889 : CALL cp_rm_iter_level(logger%iter_info, "GEO_OPT")
103 :
104 : ! Reset counter for next iteration, unless rm_restart_info==.FALSE.
105 889 : my_rm_restart_info = .TRUE.
106 889 : IF (PRESENT(rm_restart_info)) my_rm_restart_info = rm_restart_info
107 13 : IF (my_rm_restart_info) THEN
108 876 : CALL section_vals_val_set(geo_section, "STEP_START_VAL", i_val=0)
109 : END IF
110 :
111 889 : DEALLOCATE (x0)
112 889 : CALL gopt_f_release(gopt_env)
113 889 : DEALLOCATE (gopt_param)
114 889 : CALL timestop(handle)
115 :
116 889 : END SUBROUTINE cp_geo_opt
117 :
118 : ! **************************************************************************************************
119 : !> \brief Main driver to perform rotation optimization for Dimer
120 : !> \param gopt_env ...
121 : !> \param x0 ...
122 : !> \param gopt_param ...
123 : !> \param geo_section ...
124 : ! **************************************************************************************************
125 256 : SUBROUTINE cp_rot_opt(gopt_env, x0, gopt_param, geo_section)
126 : TYPE(gopt_f_type), POINTER :: gopt_env
127 : REAL(KIND=dp), DIMENSION(:), POINTER :: x0
128 : TYPE(gopt_param_type), POINTER :: gopt_param
129 : TYPE(section_vals_type), POINTER :: geo_section
130 :
131 : CHARACTER(len=*), PARAMETER :: routineN = 'cp_rot_opt'
132 :
133 : INTEGER :: handle, step_start_val
134 : TYPE(cp_logger_type), POINTER :: logger
135 :
136 128 : CALL timeset(routineN, handle)
137 128 : logger => cp_get_default_logger()
138 128 : CPASSERT(ASSOCIATED(gopt_env))
139 128 : CPASSERT(ASSOCIATED(gopt_env%force_env))
140 128 : CPASSERT(ASSOCIATED(gopt_env%globenv))
141 :
142 128 : CALL section_vals_val_get(geo_section, "STEP_START_VAL", i_val=step_start_val)
143 128 : CALL cp_add_iter_level(logger%iter_info, "ROT_OPT")
144 128 : CALL cp_iterate(logger%iter_info, iter_nr=step_start_val)
145 : CALL cp_geo_opt_low(gopt_env%force_env, gopt_env%globenv, gopt_param, gopt_env, &
146 128 : geo_section, x0)
147 128 : CALL cp_rm_iter_level(logger%iter_info, "ROT_OPT")
148 :
149 : ! Reset counter for next iteration
150 128 : CALL section_vals_val_set(geo_section, "STEP_START_VAL", i_val=0)
151 128 : CALL timestop(handle)
152 :
153 128 : END SUBROUTINE cp_rot_opt
154 :
155 : ! **************************************************************************************************
156 : !> \brief call to low level geometry optimizers
157 : !> \param force_env ...
158 : !> \param globenv ...
159 : !> \param gopt_param ...
160 : !> \param gopt_env ...
161 : !> \param geo_section ...
162 : !> \param x0 ...
163 : ! **************************************************************************************************
164 1017 : SUBROUTINE cp_geo_opt_low(force_env, globenv, gopt_param, gopt_env, &
165 : geo_section, x0)
166 : TYPE(force_env_type), POINTER :: force_env
167 : TYPE(global_environment_type), POINTER :: globenv
168 : TYPE(gopt_param_type), POINTER :: gopt_param
169 : TYPE(gopt_f_type), POINTER :: gopt_env
170 : TYPE(section_vals_type), POINTER :: geo_section
171 : REAL(KIND=dp), DIMENSION(:), POINTER :: x0
172 :
173 1017 : CPASSERT(ASSOCIATED(force_env))
174 1017 : CPASSERT(ASSOCIATED(globenv))
175 1017 : CPASSERT(ASSOCIATED(gopt_param))
176 1017 : CPASSERT(ASSOCIATED(gopt_env))
177 1017 : CPASSERT(ASSOCIATED(x0))
178 1017 : CPASSERT(ASSOCIATED(geo_section))
179 :
180 1798 : SELECT CASE (gopt_param%method_id)
181 : CASE (default_bfgs_method_id)
182 : CALL geoopt_bfgs(force_env, gopt_param, globenv, &
183 781 : geo_section, gopt_env, x0)
184 : CASE (default_lbfgs_method_id)
185 : CALL geoopt_lbfgs(force_env, gopt_param, globenv, &
186 46 : geo_section, gopt_env, x0)
187 : CASE (default_cg_method_id)
188 : CALL geoopt_cg(force_env, gopt_param, globenv, &
189 190 : geo_section, gopt_env, x0)
190 : CASE DEFAULT
191 1017 : CPABORT("Invalid or not yet implemented method for optimization")
192 : END SELECT
193 :
194 1017 : END SUBROUTINE cp_geo_opt_low
195 :
196 : END MODULE geo_opt
|