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