1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief defines types for metadynamics calculation
8!> \par History
9!>      01.2005 created [fawzi and ale]
10! **************************************************************************************************
11MODULE metadynamics_types
12   USE cp_para_env,                     ONLY: cp_para_env_release,&
13                                              cp_para_env_retain
14   USE cp_para_types,                   ONLY: cp_para_env_type
15   USE input_section_types,             ONLY: section_vals_type,&
16                                              section_vals_val_get
17   USE kinds,                           ONLY: default_path_length,&
18                                              dp
19   USE parallel_rng_types,              ONLY: rng_stream_type
20#include "./base/base_uses.f90"
21
22   IMPLICIT NONE
23
24   PRIVATE
25
26   INTEGER, SAVE, PRIVATE               :: last_meta_env_id = 0
27   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'metadynamics_types'
28
29   PUBLIC :: metadyn_create, &
30             hills_env_type, &
31             meta_env_type, &
32             meta_env_retain, &
33             set_meta_env, &
34             meta_env_release, &
35             metavar_type, &
36             multiple_walkers_type
37
38! **************************************************************************************************
39!> \brief defines types for HILLS
40! **************************************************************************************************
41   TYPE hills_env_type
42      LOGICAL                                   :: restart, slow_growth, wtcontrol
43      !RG Adaptive hills
44      REAL(KIND=dp)                             :: ww, min_disp, energy
45      INTEGER                                   :: n_hills, nt_hills, min_nt_hills
46      INTEGER                                   :: old_hill_number, old_hill_step
47      !RG Adaptive hills
48      REAL(KIND=dp), DIMENSION(:, :), POINTER    :: ss_history
49      REAL(KIND=dp), DIMENSION(:, :), POINTER    :: delta_s_history
50      REAL(KIND=dp), DIMENSION(:), POINTER    :: ww_history
51      REAL(KIND=dp), DIMENSION(:), POINTER    :: invdt_history
52      !Hills tail damping
53      REAL(KIND=dp)                             :: tail_cutoff
54      INTEGER                                   :: p_exp, q_exp
55   END TYPE hills_env_type
56
57! **************************************************************************************************
58!> \brief defines types for WALLS
59! **************************************************************************************************
60   TYPE wall_type
61      INTEGER                                   :: id_type, id_direction
62      REAL(KIND=dp)                             :: pos, pos0
63      REAL(KIND=dp)                             :: k_quadratic, k_quartic, ww_gauss, sigma_gauss
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
71      LOGICAL                                   :: do_wall, periodic
72      REAL(KIND=dp)                             :: mass, lambda, vvp
73      REAL(KIND=dp)                             :: gamma
74      REAL(KIND=dp)                             :: epot_s, delta_s, epot_walls
75      REAL(KIND=dp)                             :: ss, ss0, ff_s, ff_hills, ff_walls
76      TYPE(wall_type), DIMENSION(:), POINTER    :: walls
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
84      INTEGER                                   :: walker_id
85      INTEGER                                   :: walkers_tot_nr
86      INTEGER                                   :: walkers_freq_comm
87      INTEGER, DIMENSION(:), POINTER            :: walkers_status
88      CHARACTER(LEN=default_path_length), &
89         DIMENSION(:), POINTER                :: walkers_file_name
90   END TYPE multiple_walkers_type
91
92! **************************************************************************************************
93!> \brief defines meta_env type
94! **************************************************************************************************
95   TYPE meta_env_type
96      INTEGER                                   :: ref_count, id_nr
97      LOGICAL                                   :: do_hills, do_multiple_walkers
98      LOGICAL                                   :: extended_lagrange
99      LOGICAL                                   :: well_tempered
100      LOGICAL                                   :: langevin
101      LOGICAL                                   :: use_plumed
102      CHARACTER(LEN=default_path_length)        :: plumed_input_file
103      INTEGER                                   :: n_colvar
104      REAL(KIND=dp)                             :: ekin_s, epot_s, dt, &
105                                                   avg_temp, epot_walls
106      LOGICAL                                   :: tempcontrol, restart
107      REAL(KIND=dp)                             :: temp_wanted, toll_temp
108      REAL(KIND=dp)                             :: delta_t, invdt, &
109                                                   wtgamma, wttemperature
110      INTEGER                                   :: n_steps
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
115      TYPE(hills_env_type), POINTER             :: hills_env
116      TYPE(metavar_type), POINTER, DIMENSION(:) :: metavar
117      TYPE(multiple_walkers_type), POINTER      :: multiple_walkers
118      TYPE(cp_para_env_type), POINTER           :: para_env
119      TYPE(section_vals_type), POINTER          :: metadyn_section
120      TYPE(rng_stream_type), DIMENSION(:), &
121         ALLOCATABLE :: rng
122      INTEGER                                   :: TAMCSteps
123      REAL(kind=dp)                             :: zdt
124   END TYPE meta_env_type
125
126CONTAINS
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   SUBROUTINE metadyn_create(meta_env, n_colvar, dt, para_env, metadyn_section)
146      TYPE(meta_env_type), POINTER                       :: meta_env
147      INTEGER, INTENT(in)                                :: n_colvar
148      REAL(dp), INTENT(in)                               :: dt
149      TYPE(cp_para_env_type), POINTER                    :: para_env
150      TYPE(section_vals_type), POINTER                   :: metadyn_section
151
152      CHARACTER(len=*), PARAMETER :: routineN = 'metadyn_create', routineP = moduleN//':'//routineN
153
154      INTEGER                                            :: i
155      LOGICAL                                            :: do_langevin
156
157      CPASSERT(.NOT. ASSOCIATED(meta_env))
158      ALLOCATE (meta_env)
159      NULLIFY (meta_env%multiple_walkers, &
160               meta_env%metadyn_section, &
161               meta_env%time, &
162               meta_env%hills_env)
163
164      meta_env%use_plumed = .FALSE.
165      meta_env%plumed_input_file = ""
166      meta_env%metadyn_section => metadyn_section
167      meta_env%ref_count = 1
168      meta_env%restart = .TRUE.
169      last_meta_env_id = last_meta_env_id + 1
170      meta_env%id_nr = last_meta_env_id
171      meta_env%n_colvar = n_colvar
172      meta_env%para_env => para_env
173      CALL cp_para_env_retain(para_env)
174
175      meta_env%ekin_s = 0.0_dp
176      meta_env%epot_s = 0.0_dp
177      meta_env%epot_walls = 0.0_dp
178      meta_env%n_steps = 0
179      meta_env%dt = dt
180      meta_env%tempcontrol = .FALSE.
181
182      ! Hills_env
183      ALLOCATE (meta_env%hills_env)
184      ALLOCATE (meta_env%hills_env%ss_history(n_colvar, 0))
185      ALLOCATE (meta_env%hills_env%delta_s_history(n_colvar, 0))
186      ALLOCATE (meta_env%hills_env%ww_history(0))
187      ALLOCATE (meta_env%hills_env%invdt_history(0))
188      meta_env%hills_env%n_hills = 0
189      meta_env%hills_env%energy = 0.0_dp
190      meta_env%hills_env%restart = .TRUE.
191
192      ! Colvar
193      ALLOCATE (meta_env%metavar(n_colvar))
194      DO i = 1, n_colvar
195         NULLIFY (meta_env%metavar(i)%walls)
196         meta_env%metavar(i)%mass = -HUGE(0.0_dp)
197         meta_env%metavar(i)%lambda = -HUGE(0.0_dp)
198         meta_env%metavar(i)%gamma = 0.0_dp
199         meta_env%metavar(i)%ss = 0.0_dp
200         meta_env%metavar(i)%ss0 = 0.0_dp
201         meta_env%metavar(i)%ff_s = 0.0_dp
202         meta_env%metavar(i)%vvp = 0.0_dp
203         meta_env%metavar(i)%epot_s = 0.0_dp
204         meta_env%metavar(i)%epot_walls = 0.0_dp
205         meta_env%metavar(i)%delta_s = 0.0_dp
206         meta_env%metavar(i)%ff_hills = 0.0_dp
207         meta_env%metavar(i)%ff_walls = 0.0_dp
208         meta_env%metavar(i)%do_wall = .FALSE.
209         meta_env%metavar(i)%periodic = .FALSE.
210         meta_env%metavar(i)%icolvar = 0
211      END DO
212
213      ! Multiple Walkers
214      CALL section_vals_val_get(metadyn_section, "MULTIPLE_WALKERS%_SECTION_PARAMETERS_", &
215                                l_val=meta_env%do_multiple_walkers)
216      IF (meta_env%do_multiple_walkers) THEN
217         ALLOCATE (meta_env%multiple_walkers)
218
219         ! Walkers status and Walkers file name
220         NULLIFY (meta_env%multiple_walkers%walkers_status, &
221                  meta_env%multiple_walkers%walkers_file_name)
222         meta_env%multiple_walkers%n_hills_local = 0
223      END IF
224
225      CALL section_vals_val_get(metadyn_section, "LANGEVIN", l_val=do_langevin)
226      IF (do_langevin) THEN
227         ALLOCATE (meta_env%rng(meta_env%n_colvar))
228      ENDIF
229   END SUBROUTINE metadyn_create
230
231! **************************************************************************************************
232!> \brief sets the meta_env
233!> \param meta_env ...
234!> \param time ...
235!> \author alessandro laio and fawzi mohamed
236! **************************************************************************************************
237   SUBROUTINE set_meta_env(meta_env, time)
238      TYPE(meta_env_type), POINTER                       :: meta_env
239      REAL(KIND=dp), OPTIONAL, POINTER                   :: time
240
241      CHARACTER(len=*), PARAMETER :: routineN = 'set_meta_env', routineP = moduleN//':'//routineN
242
243      IF (ASSOCIATED(meta_env)) THEN
244         IF (PRESENT(time)) THEN
245            NULLIFY (meta_env%time)
246            meta_env%time => time
247         END IF
248      END IF
249   END SUBROUTINE set_meta_env
250
251! **************************************************************************************************
252!> \brief retains the meta_env
253!> \param meta_env ...
254!> \author alessandro laio and fawzi mohamed
255! **************************************************************************************************
256   SUBROUTINE meta_env_retain(meta_env)
257      TYPE(meta_env_type), POINTER                       :: meta_env
258
259      CHARACTER(len=*), PARAMETER :: routineN = 'meta_env_retain', &
260         routineP = moduleN//':'//routineN
261
262      CPASSERT(ASSOCIATED(meta_env))
263      CPASSERT(meta_env%ref_count > 0)
264      meta_env%ref_count = meta_env%ref_count + 1
265   END SUBROUTINE meta_env_retain
266
267! **************************************************************************************************
268!> \brief releases the meta_env
269!> \param meta_env ...
270!> \author alessandro laio and fawzi mohamed
271! **************************************************************************************************
272   SUBROUTINE meta_env_release(meta_env)
273      TYPE(meta_env_type), POINTER                       :: meta_env
274
275      CHARACTER(len=*), PARAMETER :: routineN = 'meta_env_release', &
276         routineP = moduleN//':'//routineN
277
278      INTEGER                                            :: i
279
280      IF (ASSOCIATED(meta_env)) THEN
281         CPASSERT(meta_env%ref_count > 0)
282         meta_env%ref_count = meta_env%ref_count - 1
283         IF (meta_env%ref_count == 0) THEN
284            CALL cp_para_env_release(meta_env%para_env)
285            IF (ASSOCIATED(meta_env%metavar)) THEN
286               DO i = 1, SIZE(meta_env%metavar)
287                  IF (ASSOCIATED(meta_env%metavar(i)%walls)) THEN
288                     DEALLOCATE (meta_env%metavar(i)%walls)
289                  END IF
290               END DO
291               DEALLOCATE (meta_env%metavar)
292            END IF
293
294            ! Hills env
295            CALL hills_env_release(meta_env%hills_env)
296            ! Walkers type
297            IF (ASSOCIATED(meta_env%multiple_walkers)) THEN
298               IF (ASSOCIATED(meta_env%multiple_walkers%walkers_status)) THEN
299                  DEALLOCATE (meta_env%multiple_walkers%walkers_status)
300               END IF
301               IF (ASSOCIATED(meta_env%multiple_walkers%walkers_file_name)) THEN
302                  DEALLOCATE (meta_env%multiple_walkers%walkers_file_name)
303               END IF
304               DEALLOCATE (meta_env%multiple_walkers)
305            END IF
306
307            ! Langevin on COLVARS
308            IF (meta_env%langevin) &
309               DEALLOCATE (meta_env%rng)
310
311            NULLIFY (meta_env%time)
312            NULLIFY (meta_env%metadyn_section)
313            DEALLOCATE (meta_env)
314         END IF
315      END IF
316   END SUBROUTINE meta_env_release
317
318! **************************************************************************************************
319!> \brief releases the hills_env
320!> \param hills_env ...
321!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
322! **************************************************************************************************
323   SUBROUTINE hills_env_release(hills_env)
324      TYPE(hills_env_type), POINTER                      :: hills_env
325
326      CHARACTER(len=*), PARAMETER :: routineN = 'hills_env_release', &
327         routineP = moduleN//':'//routineN
328
329      IF (ASSOCIATED(hills_env)) THEN
330         IF (ASSOCIATED(hills_env%ss_history)) THEN
331            DEALLOCATE (hills_env%ss_history)
332         END IF
333         IF (ASSOCIATED(hills_env%delta_s_history)) THEN
334            DEALLOCATE (hills_env%delta_s_history)
335         END IF
336         IF (ASSOCIATED(hills_env%ww_history)) THEN
337            DEALLOCATE (hills_env%ww_history)
338         END IF
339         IF (ASSOCIATED(hills_env%invdt_history)) THEN
340            DEALLOCATE (hills_env%invdt_history)
341         END IF
342         DEALLOCATE (hills_env)
343      END IF
344   END SUBROUTINE hills_env_release
345
346END MODULE metadynamics_types
347