LCOV - code coverage report
Current view: top level - src - metadynamics_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:0de0cc2) Lines: 88 89 98.9 %
Date: 2024-03-28 07:31:50 Functions: 4 10 40.0 %

          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

Generated by: LCOV version 1.15