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 defines types for metadynamics calculation
10 : !> \par History
11 : !> 01.2005 created [fawzi and ale]
12 : ! **************************************************************************************************
13 : MODULE metadynamics_types
14 : USE input_section_types, ONLY: section_vals_type,&
15 : section_vals_val_get
16 : USE kinds, ONLY: default_path_length,&
17 : dp
18 : USE message_passing, ONLY: mp_para_env_release,&
19 : mp_para_env_type
20 : USE parallel_rng_types, ONLY: rng_stream_type
21 : #include "./base/base_uses.f90"
22 :
23 : IMPLICIT NONE
24 :
25 : PRIVATE
26 :
27 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'metadynamics_types'
28 :
29 : PUBLIC :: metadyn_create, &
30 : hills_env_type, &
31 : meta_env_type, &
32 : set_meta_env, &
33 : meta_env_release, &
34 : metavar_type, &
35 : multiple_walkers_type
36 :
37 : ! **************************************************************************************************
38 : !> \brief defines types for HILLS
39 : ! **************************************************************************************************
40 : TYPE hills_env_type
41 : LOGICAL :: restart = .FALSE., slow_growth = .FALSE., wtcontrol = .FALSE.
42 : !RG Adaptive hills
43 : REAL(KIND=dp) :: ww = 0.0_dp, min_disp = 0.0_dp, energy = 0.0_dp
44 : INTEGER :: n_hills = -1, nt_hills = -1, min_nt_hills = -1
45 : INTEGER :: old_hill_number = -1, old_hill_step = -1
46 : !RG Adaptive hills
47 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: ss_history => NULL()
48 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: delta_s_history => NULL()
49 : REAL(KIND=dp), DIMENSION(:), POINTER :: ww_history => NULL()
50 : REAL(KIND=dp), DIMENSION(:), POINTER :: invdt_history => NULL()
51 : !Hills tail damping
52 : REAL(KIND=dp) :: tail_cutoff = 0.0_dp
53 : INTEGER :: p_exp = -1, q_exp = -1
54 : END TYPE hills_env_type
55 :
56 : ! **************************************************************************************************
57 : !> \brief defines types for WALLS
58 : ! **************************************************************************************************
59 : TYPE wall_type
60 : INTEGER :: id_type = -1, id_direction = -1
61 : REAL(KIND=dp) :: pos = 0.0_dp, pos0 = 0.0_dp
62 : REAL(KIND=dp) :: k_quadratic = 0.0_dp, k_quartic = 0.0_dp, &
63 : ww_gauss = 0.0_dp, sigma_gauss = 0.0_dp
64 : END TYPE wall_type
65 :
66 : ! **************************************************************************************************
67 : !> \brief defines types for COLVAR used in the metadynamics
68 : ! **************************************************************************************************
69 : TYPE metavar_type
70 : INTEGER :: icolvar = -1
71 : LOGICAL :: do_wall = .FALSE., periodic = .FALSE.
72 : REAL(KIND=dp) :: mass = 0.0_dp, lambda = 0.0_dp, vvp = 0.0_dp
73 : REAL(KIND=dp) :: gamma = 0.0_dp
74 : REAL(KIND=dp) :: epot_s = 0.0_dp, delta_s = 0.0_dp, epot_walls = 0.0_dp
75 : REAL(KIND=dp) :: ss = 0.0_dp, ss0 = 0.0_dp, ff_s = 0.0_dp, ff_hills = 0.0_dp, ff_walls = 0.0_dp
76 : TYPE(wall_type), DIMENSION(:), POINTER :: walls => NULL()
77 : END TYPE metavar_type
78 :
79 : ! **************************************************************************************************
80 : !> \brief defines types for multiple walkers run
81 : ! **************************************************************************************************
82 : TYPE multiple_walkers_type
83 : INTEGER :: n_hills_local = -1
84 : INTEGER :: walker_id = -1
85 : INTEGER :: walkers_tot_nr = -1
86 : INTEGER :: walkers_freq_comm = -1
87 : INTEGER, DIMENSION(:), POINTER :: walkers_status => NULL()
88 : CHARACTER(LEN=default_path_length), &
89 : DIMENSION(:), POINTER :: walkers_file_name => NULL()
90 : END TYPE multiple_walkers_type
91 :
92 : ! **************************************************************************************************
93 : !> \brief defines meta_env type
94 : ! **************************************************************************************************
95 : TYPE meta_env_type
96 : LOGICAL :: do_hills = .FALSE., do_multiple_walkers = .FALSE.
97 : LOGICAL :: extended_lagrange = .FALSE.
98 : LOGICAL :: well_tempered = .FALSE.
99 : LOGICAL :: langevin = .FALSE.
100 : LOGICAL :: use_plumed = .FALSE.
101 : REAL(KIND=dp) :: plumed_bias = 0.0_dp
102 : CHARACTER(LEN=default_path_length) :: plumed_input_file = ""
103 : INTEGER :: n_colvar = -1
104 : REAL(KIND=dp) :: ekin_s = 0.0_dp, epot_s = 0.0_dp, dt = 0.0_dp, &
105 : avg_temp = 0.0_dp, epot_walls = 0.0_dp
106 : LOGICAL :: tempcontrol = .FALSE., restart = .FALSE.
107 : REAL(KIND=dp) :: temp_wanted = 0.0_dp, toll_temp = 0.0_dp
108 : REAL(KIND=dp) :: delta_t = 0.0_dp, invdt = 0.0_dp, &
109 : wtgamma = 0.0_dp, wttemperature = 0.0_dp
110 : INTEGER :: n_steps = -1
111 : ! time pointer should never be allocated itself.. that's a quite bad
112 : ! choice derived from the md_env.. So whenever the meta_env type is
113 : ! used the pointer time should be pointer to the high level time counter
114 : REAL(KIND=dp), POINTER :: time => NULL()
115 : TYPE(hills_env_type), POINTER :: hills_env => NULL()
116 : TYPE(metavar_type), POINTER, DIMENSION(:) :: metavar => NULL()
117 : TYPE(multiple_walkers_type), POINTER :: multiple_walkers => NULL()
118 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
119 : TYPE(section_vals_type), POINTER :: metadyn_section => NULL()
120 : TYPE(rng_stream_type), DIMENSION(:), &
121 : ALLOCATABLE :: rng
122 : INTEGER :: TAMCSteps = -1
123 : REAL(kind=dp) :: zdt = 0.0_dp
124 : END TYPE meta_env_type
125 :
126 : CONTAINS
127 :
128 : ! **************************************************************************************************
129 : !> \brief allocates a metadynamic environment (performs only minimal
130 : !> initialization)
131 : !> \param meta_env the meta env_ that will be allocated
132 : !> \param n_colvar number of collectiva variables
133 : !> \param dt ...
134 : !> \param para_env ...
135 : !> \param metadyn_section ...
136 : !> \par History
137 : !> 04.2004 created
138 : !> 02.2006 Reorganized the structure of the restart for Metadynamics (teo)
139 : !> cleaned the metadynamic type
140 : !> \author - alessandro laio and fawzi mohamed
141 : !> - Teodoro Laino [tlaino] - University of Zurich. 11.2007
142 : !> - Teodoro Laino [tlaino] - University of Zurich. 10.2008
143 : !> Major rewriting and addition of multiple walkers
144 : ! **************************************************************************************************
145 158 : SUBROUTINE metadyn_create(meta_env, n_colvar, dt, para_env, metadyn_section)
146 : TYPE(meta_env_type), INTENT(OUT) :: meta_env
147 : INTEGER, INTENT(in) :: n_colvar
148 : REAL(dp), INTENT(in) :: dt
149 : TYPE(mp_para_env_type), POINTER :: para_env
150 : TYPE(section_vals_type), POINTER :: metadyn_section
151 :
152 : INTEGER :: i
153 : LOGICAL :: do_langevin
154 :
155 : NULLIFY (meta_env%multiple_walkers, &
156 : meta_env%metadyn_section, &
157 : meta_env%time, &
158 : meta_env%hills_env)
159 :
160 : meta_env%use_plumed = .FALSE.
161 158 : meta_env%plumed_input_file = ""
162 158 : meta_env%metadyn_section => metadyn_section
163 158 : meta_env%restart = .TRUE.
164 158 : meta_env%n_colvar = n_colvar
165 158 : meta_env%para_env => para_env
166 158 : CALL para_env%retain()
167 :
168 158 : meta_env%ekin_s = 0.0_dp
169 158 : meta_env%epot_s = 0.0_dp
170 158 : meta_env%epot_walls = 0.0_dp
171 158 : meta_env%n_steps = 0
172 158 : meta_env%dt = dt
173 158 : meta_env%tempcontrol = .FALSE.
174 :
175 : ! Hills_env
176 158 : ALLOCATE (meta_env%hills_env)
177 314 : ALLOCATE (meta_env%hills_env%ss_history(n_colvar, 0))
178 314 : ALLOCATE (meta_env%hills_env%delta_s_history(n_colvar, 0))
179 158 : ALLOCATE (meta_env%hills_env%ww_history(0))
180 158 : ALLOCATE (meta_env%hills_env%invdt_history(0))
181 158 : meta_env%hills_env%n_hills = 0
182 158 : meta_env%hills_env%energy = 0.0_dp
183 158 : meta_env%hills_env%restart = .TRUE.
184 :
185 : ! Colvar
186 672 : ALLOCATE (meta_env%metavar(n_colvar))
187 358 : DO i = 1, n_colvar
188 200 : NULLIFY (meta_env%metavar(i)%walls)
189 200 : meta_env%metavar(i)%mass = -HUGE(0.0_dp)
190 200 : meta_env%metavar(i)%lambda = -HUGE(0.0_dp)
191 200 : meta_env%metavar(i)%gamma = 0.0_dp
192 200 : meta_env%metavar(i)%ss = 0.0_dp
193 200 : meta_env%metavar(i)%ss0 = 0.0_dp
194 200 : meta_env%metavar(i)%ff_s = 0.0_dp
195 200 : meta_env%metavar(i)%vvp = 0.0_dp
196 200 : meta_env%metavar(i)%epot_s = 0.0_dp
197 200 : meta_env%metavar(i)%epot_walls = 0.0_dp
198 200 : meta_env%metavar(i)%delta_s = 0.0_dp
199 200 : meta_env%metavar(i)%ff_hills = 0.0_dp
200 200 : meta_env%metavar(i)%ff_walls = 0.0_dp
201 200 : meta_env%metavar(i)%do_wall = .FALSE.
202 200 : meta_env%metavar(i)%periodic = .FALSE.
203 358 : meta_env%metavar(i)%icolvar = 0
204 : END DO
205 :
206 : ! Multiple Walkers
207 : CALL section_vals_val_get(metadyn_section, "MULTIPLE_WALKERS%_SECTION_PARAMETERS_", &
208 158 : l_val=meta_env%do_multiple_walkers)
209 158 : IF (meta_env%do_multiple_walkers) THEN
210 8 : ALLOCATE (meta_env%multiple_walkers)
211 :
212 : ! Walkers status and Walkers file name
213 : NULLIFY (meta_env%multiple_walkers%walkers_status, &
214 8 : meta_env%multiple_walkers%walkers_file_name)
215 8 : meta_env%multiple_walkers%n_hills_local = 0
216 : END IF
217 :
218 158 : CALL section_vals_val_get(metadyn_section, "LANGEVIN", l_val=do_langevin)
219 158 : IF (do_langevin) THEN
220 184 : ALLOCATE (meta_env%rng(meta_env%n_colvar))
221 : END IF
222 158 : END SUBROUTINE metadyn_create
223 :
224 : ! **************************************************************************************************
225 : !> \brief sets the meta_env
226 : !> \param meta_env ...
227 : !> \param time ...
228 : !> \author alessandro laio and fawzi mohamed
229 : ! **************************************************************************************************
230 1763 : SUBROUTINE set_meta_env(meta_env, time)
231 : TYPE(meta_env_type), INTENT(IN), POINTER :: meta_env
232 : REAL(KIND=dp), OPTIONAL, POINTER :: time
233 :
234 1763 : IF (ASSOCIATED(meta_env)) THEN
235 158 : IF (PRESENT(time)) THEN
236 158 : NULLIFY (meta_env%time)
237 158 : meta_env%time => time
238 : END IF
239 : END IF
240 1763 : END SUBROUTINE set_meta_env
241 :
242 : ! **************************************************************************************************
243 : !> \brief releases the meta_env
244 : !> \param meta_env ...
245 : !> \author alessandro laio and fawzi mohamed
246 : ! **************************************************************************************************
247 158 : SUBROUTINE meta_env_release(meta_env)
248 : TYPE(meta_env_type), INTENT(INOUT) :: meta_env
249 :
250 : INTEGER :: i
251 :
252 158 : CALL mp_para_env_release(meta_env%para_env)
253 158 : IF (ASSOCIATED(meta_env%metavar)) THEN
254 358 : DO i = 1, SIZE(meta_env%metavar)
255 358 : IF (ASSOCIATED(meta_env%metavar(i)%walls)) THEN
256 40 : DEALLOCATE (meta_env%metavar(i)%walls)
257 : END IF
258 : END DO
259 158 : DEALLOCATE (meta_env%metavar)
260 : END IF
261 :
262 : ! Hills env
263 158 : CALL hills_env_release(meta_env%hills_env)
264 : ! Walkers type
265 158 : IF (ASSOCIATED(meta_env%multiple_walkers)) THEN
266 8 : IF (ASSOCIATED(meta_env%multiple_walkers%walkers_status)) THEN
267 8 : DEALLOCATE (meta_env%multiple_walkers%walkers_status)
268 : END IF
269 8 : IF (ASSOCIATED(meta_env%multiple_walkers%walkers_file_name)) THEN
270 8 : DEALLOCATE (meta_env%multiple_walkers%walkers_file_name)
271 : END IF
272 8 : DEALLOCATE (meta_env%multiple_walkers)
273 : END IF
274 :
275 : ! Langevin on COLVARS
276 158 : IF (meta_env%langevin) THEN
277 6 : DEALLOCATE (meta_env%rng)
278 : END IF
279 :
280 158 : NULLIFY (meta_env%time)
281 158 : NULLIFY (meta_env%metadyn_section)
282 158 : END SUBROUTINE meta_env_release
283 :
284 : ! **************************************************************************************************
285 : !> \brief releases the hills_env
286 : !> \param hills_env ...
287 : !> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
288 : ! **************************************************************************************************
289 158 : SUBROUTINE hills_env_release(hills_env)
290 : TYPE(hills_env_type), POINTER :: hills_env
291 :
292 158 : IF (ASSOCIATED(hills_env)) THEN
293 158 : IF (ASSOCIATED(hills_env%ss_history)) THEN
294 158 : DEALLOCATE (hills_env%ss_history)
295 : END IF
296 158 : IF (ASSOCIATED(hills_env%delta_s_history)) THEN
297 158 : DEALLOCATE (hills_env%delta_s_history)
298 : END IF
299 158 : IF (ASSOCIATED(hills_env%ww_history)) THEN
300 158 : DEALLOCATE (hills_env%ww_history)
301 : END IF
302 158 : IF (ASSOCIATED(hills_env%invdt_history)) THEN
303 158 : DEALLOCATE (hills_env%invdt_history)
304 : END IF
305 158 : DEALLOCATE (hills_env)
306 : END IF
307 158 : END SUBROUTINE hills_env_release
308 :
309 0 : END MODULE metadynamics_types
|