LCOV - code coverage report
Current view: top level - src - metadynamics_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 98.8 % 84 83
Test Date: 2025-12-04 06:27:48 Functions: 40.0 % 10 4

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

Generated by: LCOV version 2.0-1