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