(git:e7e05ae)
metadynamics_types.F
Go to the documentation of this file.
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 ! **************************************************************************************************
14  USE input_section_types, ONLY: section_vals_type,&
16  USE kinds, ONLY: default_path_length,&
17  dp
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, &
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  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  meta_env%time, &
156  meta_env%hills_env)
157 
158  meta_env%use_plumed = .false.
159  meta_env%plumed_input_file = ""
160  meta_env%metadyn_section => metadyn_section
161  meta_env%restart = .true.
162  meta_env%n_colvar = n_colvar
163  meta_env%para_env => para_env
164  CALL para_env%retain()
165 
166  meta_env%ekin_s = 0.0_dp
167  meta_env%epot_s = 0.0_dp
168  meta_env%epot_walls = 0.0_dp
169  meta_env%n_steps = 0
170  meta_env%dt = dt
171  meta_env%tempcontrol = .false.
172 
173  ! Hills_env
174  ALLOCATE (meta_env%hills_env)
175  ALLOCATE (meta_env%hills_env%ss_history(n_colvar, 0))
176  ALLOCATE (meta_env%hills_env%delta_s_history(n_colvar, 0))
177  ALLOCATE (meta_env%hills_env%ww_history(0))
178  ALLOCATE (meta_env%hills_env%invdt_history(0))
179  meta_env%hills_env%n_hills = 0
180  meta_env%hills_env%energy = 0.0_dp
181  meta_env%hills_env%restart = .true.
182 
183  ! Colvar
184  ALLOCATE (meta_env%metavar(n_colvar))
185  DO i = 1, n_colvar
186  NULLIFY (meta_env%metavar(i)%walls)
187  meta_env%metavar(i)%mass = -huge(0.0_dp)
188  meta_env%metavar(i)%lambda = -huge(0.0_dp)
189  meta_env%metavar(i)%gamma = 0.0_dp
190  meta_env%metavar(i)%ss = 0.0_dp
191  meta_env%metavar(i)%ss0 = 0.0_dp
192  meta_env%metavar(i)%ff_s = 0.0_dp
193  meta_env%metavar(i)%vvp = 0.0_dp
194  meta_env%metavar(i)%epot_s = 0.0_dp
195  meta_env%metavar(i)%epot_walls = 0.0_dp
196  meta_env%metavar(i)%delta_s = 0.0_dp
197  meta_env%metavar(i)%ff_hills = 0.0_dp
198  meta_env%metavar(i)%ff_walls = 0.0_dp
199  meta_env%metavar(i)%do_wall = .false.
200  meta_env%metavar(i)%periodic = .false.
201  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  l_val=meta_env%do_multiple_walkers)
207  IF (meta_env%do_multiple_walkers) THEN
208  ALLOCATE (meta_env%multiple_walkers)
209 
210  ! Walkers status and Walkers file name
211  NULLIFY (meta_env%multiple_walkers%walkers_status, &
212  meta_env%multiple_walkers%walkers_file_name)
213  meta_env%multiple_walkers%n_hills_local = 0
214  END IF
215 
216  CALL section_vals_val_get(metadyn_section, "LANGEVIN", l_val=do_langevin)
217  IF (do_langevin) THEN
218  ALLOCATE (meta_env%rng(meta_env%n_colvar))
219  END IF
220  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  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  IF (ASSOCIATED(meta_env)) THEN
233  IF (PRESENT(time)) THEN
234  NULLIFY (meta_env%time)
235  meta_env%time => time
236  END IF
237  END IF
238  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  SUBROUTINE meta_env_release(meta_env)
246  TYPE(meta_env_type), INTENT(INOUT) :: meta_env
247 
248  INTEGER :: i
249 
250  CALL mp_para_env_release(meta_env%para_env)
251  IF (ASSOCIATED(meta_env%metavar)) THEN
252  DO i = 1, SIZE(meta_env%metavar)
253  IF (ASSOCIATED(meta_env%metavar(i)%walls)) THEN
254  DEALLOCATE (meta_env%metavar(i)%walls)
255  END IF
256  END DO
257  DEALLOCATE (meta_env%metavar)
258  END IF
259 
260  ! Hills env
261  CALL hills_env_release(meta_env%hills_env)
262  ! Walkers type
263  IF (ASSOCIATED(meta_env%multiple_walkers)) THEN
264  IF (ASSOCIATED(meta_env%multiple_walkers%walkers_status)) THEN
265  DEALLOCATE (meta_env%multiple_walkers%walkers_status)
266  END IF
267  IF (ASSOCIATED(meta_env%multiple_walkers%walkers_file_name)) THEN
268  DEALLOCATE (meta_env%multiple_walkers%walkers_file_name)
269  END IF
270  DEALLOCATE (meta_env%multiple_walkers)
271  END IF
272 
273  ! Langevin on COLVARS
274  IF (meta_env%langevin) &
275  DEALLOCATE (meta_env%rng)
276 
277  NULLIFY (meta_env%time)
278  NULLIFY (meta_env%metadyn_section)
279  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  SUBROUTINE hills_env_release(hills_env)
287  TYPE(hills_env_type), POINTER :: hills_env
288 
289  IF (ASSOCIATED(hills_env)) THEN
290  IF (ASSOCIATED(hills_env%ss_history)) THEN
291  DEALLOCATE (hills_env%ss_history)
292  END IF
293  IF (ASSOCIATED(hills_env%delta_s_history)) THEN
294  DEALLOCATE (hills_env%delta_s_history)
295  END IF
296  IF (ASSOCIATED(hills_env%ww_history)) THEN
297  DEALLOCATE (hills_env%ww_history)
298  END IF
299  IF (ASSOCIATED(hills_env%invdt_history)) THEN
300  DEALLOCATE (hills_env%invdt_history)
301  END IF
302  DEALLOCATE (hills_env)
303  END IF
304  END SUBROUTINE hills_env_release
305 
306 END MODULE metadynamics_types
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Definition: gamma.F:15
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
integer, parameter, public default_path_length
Definition: kinds.F:58
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
defines types for metadynamics calculation
subroutine, public set_meta_env(meta_env, time)
sets the meta_env
subroutine, public metadyn_create(meta_env, n_colvar, dt, para_env, metadyn_section)
allocates a metadynamic environment (performs only minimal initialization)
subroutine, public meta_env_release(meta_env)
releases the meta_env
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.