LCOV - code coverage report
Current view: top level - src - metadynamics_utils.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:58e3e09) Lines: 433 464 93.3 %
Date: 2024-03-29 07:50:05 Functions: 8 8 100.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 Performs the metadynamics calculation
      10             : !> \par History
      11             : !>      01.2005 created [fawzi and ale]
      12             : !>      11.2007 Teodoro Laino [tlaino] - University of Zurich
      13             : ! **************************************************************************************************
      14             : MODULE metadynamics_utils
      15             :    USE cp_files,                        ONLY: close_file,&
      16             :                                               open_file
      17             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      18             :                                               cp_logger_type,&
      19             :                                               cp_to_string
      20             :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      21             :                                               cp_print_key_unit_nr
      22             :    USE cp_subsys_types,                 ONLY: cp_subsys_type
      23             :    USE force_env_types,                 ONLY: force_env_get,&
      24             :                                               force_env_type
      25             :    USE input_constants,                 ONLY: do_fe_meta,&
      26             :                                               do_wall_gaussian,&
      27             :                                               do_wall_m,&
      28             :                                               do_wall_none,&
      29             :                                               do_wall_p,&
      30             :                                               do_wall_quadratic,&
      31             :                                               do_wall_quartic,&
      32             :                                               do_wall_reflective
      33             :    USE input_cp2k_free_energy,          ONLY: create_metavar_section
      34             :    USE input_enumeration_types,         ONLY: enum_i2c,&
      35             :                                               enumeration_type
      36             :    USE input_keyword_types,             ONLY: keyword_get,&
      37             :                                               keyword_type
      38             :    USE input_section_types,             ONLY: section_get_keyword,&
      39             :                                               section_get_subsection,&
      40             :                                               section_release,&
      41             :                                               section_type,&
      42             :                                               section_vals_get,&
      43             :                                               section_vals_get_subs_vals,&
      44             :                                               section_vals_type,&
      45             :                                               section_vals_val_get
      46             :    USE kinds,                           ONLY: default_path_length,&
      47             :                                               dp
      48             :    USE machine,                         ONLY: m_mov
      49             :    USE message_passing,                 ONLY: mp_para_env_type
      50             :    USE metadynamics_types,              ONLY: hills_env_type,&
      51             :                                               meta_env_type,&
      52             :                                               metadyn_create,&
      53             :                                               metavar_type,&
      54             :                                               multiple_walkers_type
      55             :    USE physcon,                         ONLY: kelvin
      56             : #include "./base/base_uses.f90"
      57             : 
      58             :    IMPLICIT NONE
      59             :    PRIVATE
      60             : 
      61             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'metadynamics_utils'
      62             : 
      63             :    PUBLIC :: metadyn_read, &
      64             :              synchronize_multiple_walkers, &
      65             :              add_hill_single, &
      66             :              restart_hills, &
      67             :              get_meta_iter_level, &
      68             :              meta_walls
      69             : 
      70             : CONTAINS
      71             : 
      72             : ! **************************************************************************************************
      73             : !> \brief reads metadynamics section
      74             : !> \param meta_env ...
      75             : !> \param force_env ...
      76             : !> \param root_section ...
      77             : !> \param para_env ...
      78             : !> \param fe_section ...
      79             : !> \par History
      80             : !>      04.2004 created
      81             : !> \author Teodoro Laino [tlaino] - University of Zurich. 11.2007
      82             : ! **************************************************************************************************
      83       16938 :    SUBROUTINE metadyn_read(meta_env, force_env, root_section, para_env, fe_section)
      84             :       TYPE(meta_env_type), POINTER                       :: meta_env
      85             :       TYPE(force_env_type), POINTER                      :: force_env
      86             :       TYPE(section_vals_type), POINTER                   :: root_section
      87             :       TYPE(mp_para_env_type), POINTER                    :: para_env
      88             :       TYPE(section_vals_type), OPTIONAL, POINTER         :: fe_section
      89             : 
      90             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'metadyn_read'
      91             : 
      92             :       CHARACTER(LEN=default_path_length)                 :: walkers_file_name
      93             :       INTEGER                                            :: handle, i, id_method, n_colvar, n_rep, &
      94             :                                                             number_allocated_colvars
      95        8469 :       INTEGER, DIMENSION(:), POINTER                     :: walkers_status
      96             :       LOGICAL                                            :: check, explicit
      97             :       REAL(kind=dp)                                      :: dt
      98             :       TYPE(cp_subsys_type), POINTER                      :: subsys
      99             :       TYPE(section_vals_type), POINTER                   :: md_section, metadyn_section, &
     100             :                                                             metavar_section, walkers_section
     101             : 
     102        8469 :       NULLIFY (subsys)
     103        8469 :       CALL timeset(routineN, handle)
     104             : 
     105        8469 :       CALL section_vals_get(fe_section, explicit=explicit)
     106        8469 :       IF (explicit) THEN
     107         164 :          number_allocated_colvars = 0
     108         164 :          CALL force_env_get(force_env, subsys=subsys)
     109         164 :          IF (ASSOCIATED(subsys%colvar_p)) THEN
     110         164 :             number_allocated_colvars = SIZE(subsys%colvar_p)
     111             :          END IF
     112         164 :          CALL section_vals_val_get(fe_section, "METHOD", i_val=id_method)
     113         164 :          IF (id_method /= do_fe_meta) THEN
     114          14 :             CALL timestop(handle)
     115          16 :             RETURN
     116             :          END IF
     117         150 :          metadyn_section => section_vals_get_subs_vals(fe_section, "METADYN")
     118         150 :          CPASSERT(.NOT. ASSOCIATED(meta_env))
     119             : 
     120         150 :          md_section => section_vals_get_subs_vals(root_section, "MOTION%MD")
     121         150 :          CALL section_vals_val_get(md_section, "TIMESTEP", r_val=dt)
     122             : 
     123         150 :          metavar_section => section_vals_get_subs_vals(metadyn_section, "METAVAR")
     124         150 :          CALL section_vals_get(metavar_section, n_repetition=n_colvar)
     125         150 :          ALLOCATE (meta_env)
     126             :          CALL metadyn_create(meta_env, n_colvar=n_colvar, &
     127         150 :                              dt=dt, para_env=para_env, metadyn_section=metadyn_section)
     128             : 
     129             :          !Check if using plumed. If so, only get the file name and read nothing else
     130         150 :          CALL section_vals_val_get(metadyn_section, "USE_PLUMED", l_val=meta_env%use_plumed)
     131         150 :          IF (meta_env%use_plumed .EQV. .TRUE.) THEN
     132           2 :             CALL section_vals_val_get(metadyn_section, "PLUMED_INPUT_FILE", c_val=meta_env%plumed_input_file)
     133           2 :             meta_env%plumed_input_file = TRIM(meta_env%plumed_input_file)//CHAR(0)
     134           2 :             meta_env%langevin = .FALSE.
     135           2 :             CALL timestop(handle)
     136           2 :             RETURN
     137             :          END IF
     138             : 
     139         148 :          CALL section_vals_val_get(metadyn_section, "DO_HILLS", l_val=meta_env%do_hills)
     140         148 :          CALL section_vals_val_get(metadyn_section, "LAGRANGE", l_val=meta_env%extended_lagrange)
     141         148 :          CALL section_vals_val_get(metadyn_section, "TAMCSteps", i_val=meta_env%TAMCSteps)
     142         148 :          IF (meta_env%TAMCSteps < 0) THEN
     143           0 :             CPABORT("TAMCSteps must be positive!")
     144             :          END IF
     145         148 :          CALL section_vals_val_get(metadyn_section, "Timestep", r_val=meta_env%zdt)
     146         148 :          IF (meta_env%zdt <= 0.0_dp) THEN
     147           0 :             CPABORT("Timestep must be positive!")
     148             :          END IF
     149         148 :          CALL section_vals_val_get(metadyn_section, "WW", r_val=meta_env%hills_env%ww)
     150         148 :          CALL section_vals_val_get(metadyn_section, "NT_HILLS", i_val=meta_env%hills_env%nt_hills)
     151         148 :          CALL section_vals_val_get(metadyn_section, "MIN_NT_HILLS", i_val=meta_env%hills_env%min_nt_hills)
     152         148 :          IF (meta_env%hills_env%nt_hills <= 0) THEN
     153           4 :             meta_env%hills_env%min_nt_hills = meta_env%hills_env%nt_hills
     154             :             CALL cp_warn(__LOCATION__, &
     155             :                          "NT_HILLS has a value <= 0; "// &
     156             :                          "Setting MIN_NT_HILLS to the same value! "// &
     157           4 :                          "Overriding input specification!")
     158             :          END IF
     159         148 :          check = meta_env%hills_env%nt_hills >= meta_env%hills_env%min_nt_hills
     160         148 :          IF (.NOT. check) &
     161             :             CALL cp_abort(__LOCATION__, "MIN_NT_HILLS must have a value smaller or equal to NT_HILLS! "// &
     162           0 :                           "Cross check with the input reference!")
     163             :          !RG Adaptive hills
     164         148 :          CALL section_vals_val_get(metadyn_section, "MIN_DISP", r_val=meta_env%hills_env%min_disp)
     165         148 :          CALL section_vals_val_get(metadyn_section, "OLD_HILL_NUMBER", i_val=meta_env%hills_env%old_hill_number)
     166         148 :          CALL section_vals_val_get(metadyn_section, "OLD_HILL_STEP", i_val=meta_env%hills_env%old_hill_step)
     167             : 
     168             :          !Hills tail damping
     169         148 :          CALL section_vals_val_get(metadyn_section, "HILL_TAIL_CUTOFF", r_val=meta_env%hills_env%tail_cutoff)
     170         148 :          CALL section_vals_val_get(metadyn_section, "P_EXPONENT", i_val=meta_env%hills_env%p_exp)
     171         148 :          CALL section_vals_val_get(metadyn_section, "Q_EXPONENT", i_val=meta_env%hills_env%q_exp)
     172             : 
     173         148 :          CALL section_vals_val_get(metadyn_section, "SLOW_GROWTH", l_val=meta_env%hills_env%slow_growth)
     174             : 
     175             :          !RG Adaptive hills
     176         148 :          CALL section_vals_val_get(metadyn_section, "STEP_START_VAL", i_val=meta_env%n_steps)
     177         148 :          CPASSERT(meta_env%n_steps >= 0)
     178             :          CALL section_vals_val_get(metadyn_section, "NHILLS_START_VAL", &
     179         148 :                                    i_val=meta_env%hills_env%n_hills)
     180         148 :          CALL section_vals_val_get(metadyn_section, "TEMPERATURE", r_val=meta_env%temp_wanted)
     181         148 :          CALL section_vals_val_get(metadyn_section, "LANGEVIN", l_val=meta_env%langevin)
     182             :          CALL section_vals_val_get(metadyn_section, "TEMP_TOL", explicit=meta_env%tempcontrol, &
     183         148 :                                    r_val=meta_env%toll_temp)
     184         148 :          CALL section_vals_val_get(metadyn_section, "WELL_TEMPERED", l_val=meta_env%well_tempered)
     185             :          CALL section_vals_val_get(metadyn_section, "DELTA_T", explicit=meta_env%hills_env%wtcontrol, &
     186         148 :                                    r_val=meta_env%delta_t)
     187             :          CALL section_vals_val_get(metadyn_section, "WTGAMMA", explicit=check, &
     188         148 :                                    r_val=meta_env%wtgamma)
     189         148 :          IF (meta_env%well_tempered) THEN
     190           2 :             meta_env%hills_env%wtcontrol = meta_env%hills_env%wtcontrol .OR. check
     191           2 :             check = meta_env%hills_env%wtcontrol
     192           2 :             IF (.NOT. check) &
     193             :                CALL cp_abort(__LOCATION__, "When using Well-Tempered metadynamics, "// &
     194           0 :                              "DELTA_T (or WTGAMMA) should be explicitly specified.")
     195           2 :             IF (meta_env%extended_lagrange) &
     196             :                CALL cp_abort(__LOCATION__, &
     197           0 :                              "Well-Tempered metadynamics not possible with extended-lagrangian formulation.")
     198           2 :             IF (meta_env%hills_env%min_disp > 0.0_dp) &
     199             :                CALL cp_abort(__LOCATION__, &
     200           0 :                              "Well-Tempered metadynamics not possible with Adaptive hills.")
     201             :          END IF
     202             : 
     203             :          CALL section_vals_val_get(metadyn_section, "COLVAR_AVG_TEMPERATURE_RESTART", &
     204         148 :                                    r_val=meta_env%avg_temp)
     205             :          ! Parsing Metavar Section
     206         338 :          DO i = 1, n_colvar
     207             :             CALL metavar_read(meta_env%metavar(i), meta_env%extended_lagrange, &
     208         190 :                               meta_env%langevin, i, metavar_section)
     209         190 :             check = (meta_env%metavar(i)%icolvar <= number_allocated_colvars)
     210         190 :             IF (.NOT. check) &
     211             :                CALL cp_abort(__LOCATION__, &
     212             :                              "An error occurred in the specification of COLVAR for METAVAR. "// &
     213             :                              "Specified COLVAR #("//TRIM(ADJUSTL(cp_to_string(meta_env%metavar(i)%icolvar)))//") "// &
     214             :                              "is larger than the maximum number of COLVARS defined in the SUBSYS ("// &
     215         148 :                              TRIM(ADJUSTL(cp_to_string(number_allocated_colvars)))//") !")
     216             :          END DO
     217             : 
     218             :          ! Parsing the Multiple Walkers Info
     219         148 :          IF (meta_env%do_multiple_walkers) THEN
     220           8 :             NULLIFY (walkers_status)
     221           8 :             walkers_section => section_vals_get_subs_vals(metadyn_section, "MULTIPLE_WALKERS")
     222             : 
     223             :             ! General setup for walkers
     224             :             CALL section_vals_val_get(walkers_section, "WALKER_ID", &
     225           8 :                                       i_val=meta_env%multiple_walkers%walker_id)
     226             :             CALL section_vals_val_get(walkers_section, "NUMBER_OF_WALKERS", &
     227           8 :                                       i_val=meta_env%multiple_walkers%walkers_tot_nr)
     228             :             CALL section_vals_val_get(walkers_section, "WALKER_COMM_FREQUENCY", &
     229           8 :                                       i_val=meta_env%multiple_walkers%walkers_freq_comm)
     230             : 
     231             :             ! Handle status and file names
     232          24 :             ALLOCATE (meta_env%multiple_walkers%walkers_status(meta_env%multiple_walkers%walkers_tot_nr))
     233          24 :             ALLOCATE (meta_env%multiple_walkers%walkers_file_name(meta_env%multiple_walkers%walkers_tot_nr))
     234           8 :             CALL section_vals_val_get(walkers_section, "WALKERS_STATUS", explicit=explicit)
     235           8 :             IF (explicit) THEN
     236           4 :                CALL section_vals_val_get(walkers_section, "WALKERS_STATUS", i_vals=walkers_status)
     237           4 :                check = (SIZE(walkers_status) == meta_env%multiple_walkers%walkers_tot_nr)
     238           4 :                IF (.NOT. check) &
     239             :                   CALL cp_abort(__LOCATION__, &
     240             :                                 "Number of Walkers specified in the input does not match with the "// &
     241             :                                 "size of the WALKERS_STATUS. Please check your input and in case "// &
     242             :                                 "this is a restart run consider the possibility to switch off the "// &
     243           0 :                                 "RESTART_WALKERS in the EXT_RESTART section! ")
     244          20 :                meta_env%multiple_walkers%walkers_status = walkers_status
     245             :             ELSE
     246          12 :                meta_env%multiple_walkers%walkers_status = 0
     247             :             END IF
     248             :             meta_env%multiple_walkers%n_hills_local = &
     249           8 :                meta_env%multiple_walkers%walkers_status(meta_env%multiple_walkers%walker_id)
     250             : 
     251             :             CALL section_vals_val_get(walkers_section, "WALKERS_FILE_NAME%_DEFAULT_KEYWORD_", &
     252           8 :                                       n_rep_val=n_rep)
     253           8 :             check = (n_rep == meta_env%multiple_walkers%walkers_tot_nr)
     254           8 :             IF (.NOT. check) &
     255             :                CALL cp_abort(__LOCATION__, &
     256             :                              "Number of Walkers specified in the input does not match with the "// &
     257             :                              "number of Walkers File names provided. Please check your input and in case "// &
     258             :                              "this is a restart run consider the possibility to switch off the "// &
     259           0 :                              "RESTART_WALKERS in the EXT_RESTART section! ")
     260          40 :             DO i = 1, n_rep
     261             :                CALL section_vals_val_get(walkers_section, "WALKERS_FILE_NAME%_DEFAULT_KEYWORD_", &
     262          16 :                                          i_rep_val=i, c_val=walkers_file_name)
     263          24 :                meta_env%multiple_walkers%walkers_file_name(i) = walkers_file_name
     264             :             END DO
     265             :          END IF
     266             : 
     267             :          ! Print Metadynamics Info
     268         148 :          CALL print_metadyn_info(meta_env, n_colvar, metadyn_section)
     269             :       END IF
     270             : 
     271        8453 :       CALL timestop(handle)
     272             : 
     273        8469 :    END SUBROUTINE metadyn_read
     274             : 
     275             : ! **************************************************************************************************
     276             : !> \brief prints information on the metadynamics run
     277             : !> \param meta_env ...
     278             : !> \param n_colvar ...
     279             : !> \param metadyn_section ...
     280             : !> \author Teodoro Laino [tlaino] - University of Zurich. 10.2008
     281             : ! **************************************************************************************************
     282         148 :    SUBROUTINE print_metadyn_info(meta_env, n_colvar, metadyn_section)
     283             :       TYPE(meta_env_type), POINTER                       :: meta_env
     284             :       INTEGER, INTENT(IN)                                :: n_colvar
     285             :       TYPE(section_vals_type), POINTER                   :: metadyn_section
     286             : 
     287             :       CHARACTER(len=*), PARAMETER :: routineN = 'print_metadyn_info'
     288             : 
     289             :       CHARACTER(LEN=10)                                  :: my_id, my_tag
     290             :       INTEGER                                            :: handle, i, iw, j
     291             :       TYPE(cp_logger_type), POINTER                      :: logger
     292             :       TYPE(enumeration_type), POINTER                    :: enum
     293             :       TYPE(keyword_type), POINTER                        :: keyword
     294             :       TYPE(section_type), POINTER                        :: section, wall_section, work_section
     295             : 
     296         148 :       CALL timeset(routineN, handle)
     297             : 
     298         148 :       logger => cp_get_default_logger()
     299             :       iw = cp_print_key_unit_nr(logger, metadyn_section, &
     300         148 :                                 "PRINT%PROGRAM_RUN_INFO", extension=".metadynLog")
     301         148 :       NULLIFY (section, enum, keyword)
     302         148 :       CALL create_metavar_section(section)
     303         148 :       wall_section => section_get_subsection(section, "WALL")
     304         148 :       IF (iw > 0) THEN
     305          74 :          WRITE (iw, '( /A )') ' METADYN| Meta Dynamics Protocol '
     306          74 :          WRITE (iw, '( A,T71,I10)') ' METADYN| Number of interval time steps to spawn hills', &
     307         148 :             meta_env%hills_env%nt_hills
     308          74 :          WRITE (iw, '( A,T71,I10)') ' METADYN| Number of previously spawned hills', &
     309         148 :             meta_env%hills_env%n_hills
     310          74 :          IF (meta_env%extended_lagrange) THEN
     311          28 :             WRITE (iw, '( A )') ' METADYN| Extended Lagrangian Scheme '
     312          28 :             IF (meta_env%tempcontrol) WRITE (iw, '( A,T71,F10.2)') &
     313          10 :                ' METADYN| Collective Variables Temperature control', meta_env%toll_temp
     314          28 :             IF (meta_env%langevin) THEN
     315           3 :                WRITE (iw, '(A,T71)') ' METADYN| Langevin Thermostat in use for COLVAR '
     316           3 :                WRITE (iw, '(A,T71,F10.4)') ' METADYN| Langevin Thermostat. Target Temperature = ', &
     317           6 :                   meta_env%temp_wanted*kelvin
     318             :             END IF
     319          28 :             WRITE (iw, '(A,T71,F10.4)') ' METADYN| COLVARS restarted average temperature ', &
     320          56 :                meta_env%avg_temp
     321             :          END IF
     322          74 :          IF (meta_env%do_hills) THEN
     323          59 :             WRITE (iw, '( A )') ' METADYN| Spawning the Hills '
     324          59 :             WRITE (iw, '( A,T71,F10.3)') ' METADYN| Height of the Spawned Gaussian', meta_env%hills_env%ww
     325             :             !RG Adaptive hills
     326          59 :             IF (meta_env%hills_env%min_disp .GT. 0.0_dp) THEN
     327           2 :                WRITE (iw, '(A)') ' METADYN| Adapative meta time step is activated'
     328           2 :                WRITE (iw, '(A,T71,F10.4)') ' METADYN| Minimum displacement for next hill', &
     329           4 :                   meta_env%hills_env%min_disp
     330             :             END IF
     331             :             !RG Adaptive hills
     332             :          END IF
     333             : 
     334          74 :          IF (meta_env%well_tempered) THEN
     335           1 :             WRITE (iw, '( A )') ' METADYN| Well-Tempered metadynamics '
     336           1 :             IF (meta_env%delta_t > EPSILON(1._dp)) THEN
     337           1 :                WRITE (iw, '( A,T71,F10.3)') ' METADYN| Temperature parameter (Delta T) [K]', meta_env%delta_t*kelvin
     338             :             ELSE
     339           0 :                WRITE (iw, '( A,T71,F10.3)') ' METADYN| Temperature parameter (gamma)', meta_env%wtgamma
     340             :             END IF
     341             :          END IF
     342             : 
     343          74 :          IF (meta_env%do_multiple_walkers) THEN
     344           4 :             WRITE (iw, '( A,T71,A10)') ' METADYN| Multiple Walkers', '   ENABLED'
     345           4 :             WRITE (iw, '( A,T71,I10)') ' METADYN| Number of Multiple Walkers', &
     346           8 :                meta_env%multiple_walkers%walkers_tot_nr
     347           4 :             WRITE (iw, '( A,T71,I10)') ' METADYN| Local Walker ID', &
     348           8 :                meta_env%multiple_walkers%walker_id
     349           4 :             WRITE (iw, '( A,T71,I10)') ' METADYN| Walker Communication Frequency', &
     350           8 :                meta_env%multiple_walkers%walkers_freq_comm
     351          12 :             DO i = 1, meta_env%multiple_walkers%walkers_tot_nr
     352           8 :                my_tag = ""
     353           8 :                IF (i == meta_env%multiple_walkers%walker_id) my_tag = " ( Local )"
     354           8 :                my_id = '( '//TRIM(ADJUSTL(cp_to_string(i)))//' )'
     355           8 :                WRITE (iw, '(/,A,T71,A10)') ' WALKERS| Walker ID'//TRIM(my_tag), ADJUSTR(my_id)
     356           8 :                WRITE (iw, '(  A,T71,I10)') ' WALKERS| Number of Hills communicated', &
     357          16 :                   meta_env%multiple_walkers%walkers_status(i)
     358           8 :                WRITE (iw, '(  A,T24,A57)') ' WALKERS| Base Filename', &
     359          20 :                   ADJUSTR(meta_env%multiple_walkers%walkers_file_name(i) (1:57))
     360             :             END DO
     361           4 :             WRITE (iw, '(/)')
     362             :          END IF
     363             : 
     364          74 :          WRITE (iw, '( A,T71,I10)') ' METADYN| Number of collective variables', meta_env%n_colvar
     365         169 :          DO i = 1, n_colvar
     366          95 :             WRITE (iw, '( A )') '          '//'----------------------------------------------------------------------'
     367          95 :             WRITE (iw, '( A,T71,I10)') ' METAVARS| Collective Variable Number', meta_env%metavar(i)%icolvar
     368          95 :             IF (meta_env%extended_lagrange) THEN
     369          39 :                WRITE (iw, '( A,T71,F10.6)') ' METAVARS| Lambda Parameter', meta_env%metavar(i)%lambda
     370          39 :                WRITE (iw, '( A,T66,F15.6)') ' METAVARS| Collective Variable Mass', meta_env%metavar(i)%mass
     371             :             END IF
     372          95 :             WRITE (iw, '( A,T71,F10.6)') ' METAVARS| Scaling factor', meta_env%metavar(i)%delta_s
     373         100 :             IF (meta_env%langevin) WRITE (iw, '( A,T71,F10.6)') ' METAVARS| Friction for Langevin Thermostat', &
     374          10 :                meta_env%metavar(i)%gamma
     375          95 :             IF (meta_env%metavar(i)%do_wall) THEN
     376          18 :                WRITE (iw, '( A,T71,I10)') ' METAVARS| Number of Walls present', SIZE(meta_env%metavar(i)%walls)
     377          41 :                DO j = 1, SIZE(meta_env%metavar(i)%walls)
     378          23 :                   keyword => section_get_keyword(wall_section, "TYPE")
     379          23 :                   CALL keyword_get(keyword, enum=enum)
     380          23 :                   WRITE (iw, '(/,A,5X,I10,T50,A,T70,A11)') ' METAVARS| Wall Number:', j, 'Type of Wall:', &
     381          46 :                      ADJUSTR(TRIM(enum_i2c(enum, meta_env%metavar(i)%walls(j)%id_type)))
     382             :                   ! Type of wall IO
     383          23 :                   SELECT CASE (meta_env%metavar(i)%walls(j)%id_type)
     384             :                   CASE (do_wall_none)
     385             :                      ! Do Nothing
     386           4 :                      CYCLE
     387             :                   CASE (do_wall_reflective)
     388           4 :                      work_section => section_get_subsection(wall_section, "REFLECTIVE")
     389           4 :                      keyword => section_get_keyword(work_section, "DIRECTION")
     390           4 :                      CALL keyword_get(keyword, enum=enum)
     391           4 :                      WRITE (iw, '(A,T70,A11)') ' METAVARS| Wall direction', &
     392           8 :                         ADJUSTR(TRIM(enum_i2c(enum, meta_env%metavar(i)%walls(j)%id_direction)))
     393             :                   CASE (do_wall_quadratic)
     394          12 :                      work_section => section_get_subsection(wall_section, "QUADRATIC")
     395          12 :                      keyword => section_get_keyword(work_section, "DIRECTION")
     396          12 :                      CALL keyword_get(keyword, enum=enum)
     397          12 :                      WRITE (iw, '(A,T70,A11)') ' METAVARS| Wall direction', &
     398          24 :                         ADJUSTR(TRIM(enum_i2c(enum, meta_env%metavar(i)%walls(j)%id_direction)))
     399          12 :                      WRITE (iw, '(A,T70,F11.6)') ' METAVARS| Constant K of the quadratic potential', &
     400          24 :                         meta_env%metavar(i)%walls(j)%k_quadratic
     401             :                   CASE (do_wall_gaussian)
     402           3 :                      WRITE (iw, '(A,T70,F11.6)') ' METAVARS| Height of the Wall Gaussian', &
     403           6 :                         meta_env%metavar(i)%walls(j)%ww_gauss
     404           3 :                      WRITE (iw, '(A,T70,F11.6)') ' METAVARS| Scale of the Wall Gaussian', &
     405          29 :                         meta_env%metavar(i)%walls(j)%sigma_gauss
     406             :                   END SELECT
     407          21 :                   WRITE (iw, '(A,T70,F11.6)') ' METAVARS| Wall location', &
     408          60 :                      meta_env%metavar(i)%walls(j)%pos
     409             :                END DO
     410             :             END IF
     411         169 :             WRITE (iw, '( A )') '          '//'----------------------------------------------------------------------'
     412             :          END DO
     413             :       END IF
     414         148 :       CALL section_release(section)
     415         148 :       CALL cp_print_key_finished_output(iw, logger, metadyn_section, "PRINT%PROGRAM_RUN_INFO")
     416             : 
     417         148 :       CALL timestop(handle)
     418             : 
     419         148 :    END SUBROUTINE print_metadyn_info
     420             : 
     421             : ! **************************************************************************************************
     422             : !> \brief reads metavar section
     423             : !> \param metavar ...
     424             : !> \param extended_lagrange ...
     425             : !> \param langevin ...
     426             : !> \param icol ...
     427             : !> \param metavar_section ...
     428             : !> \par History
     429             : !>      04.2004 created
     430             : !> \author alessandro laio and fawzi mohamed
     431             : !>      Teodoro Laino [tlaino] - University of Zurich. 11.2007
     432             : ! **************************************************************************************************
     433         380 :    SUBROUTINE metavar_read(metavar, extended_lagrange, langevin, icol, metavar_section)
     434             :       TYPE(metavar_type), INTENT(INOUT)                  :: metavar
     435             :       LOGICAL, INTENT(IN)                                :: extended_lagrange, langevin
     436             :       INTEGER, INTENT(IN)                                :: icol
     437             :       TYPE(section_vals_type), OPTIONAL, POINTER         :: metavar_section
     438             : 
     439             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'metavar_read'
     440             : 
     441             :       INTEGER                                            :: handle, i, n_walls
     442             :       TYPE(section_vals_type), POINTER                   :: wall_section, work_section
     443             : 
     444         190 :       CALL timeset(routineN, handle)
     445             : 
     446         190 :       CALL section_vals_val_get(metavar_section, "COLVAR", i_rep_section=icol, i_val=metavar%icolvar)
     447         190 :       CALL section_vals_val_get(metavar_section, "SCALE", i_rep_section=icol, r_val=metavar%delta_s)
     448             :       ! Walls
     449         190 :       wall_section => section_vals_get_subs_vals(metavar_section, "WALL", i_rep_section=icol)
     450         190 :       CALL section_vals_get(wall_section, n_repetition=n_walls)
     451         190 :       IF (n_walls /= 0) THEN
     452          36 :          metavar%do_wall = .TRUE.
     453         108 :          ALLOCATE (metavar%walls(n_walls))
     454          82 :          DO i = 1, n_walls
     455          46 :             CALL section_vals_val_get(wall_section, "TYPE", i_rep_section=i, i_val=metavar%walls(i)%id_type)
     456          46 :             CALL section_vals_val_get(wall_section, "POSITION", i_rep_section=i, r_val=metavar%walls(i)%pos)
     457          36 :             SELECT CASE (metavar%walls(i)%id_type)
     458             :             CASE (do_wall_none)
     459             :                ! Just cycle..
     460           8 :                CYCLE
     461             :             CASE (do_wall_reflective)
     462           8 :                work_section => section_vals_get_subs_vals(wall_section, "REFLECTIVE", i_rep_section=i)
     463           8 :                CALL section_vals_val_get(work_section, "DIRECTION", i_val=metavar%walls(i)%id_direction)
     464             :             CASE (do_wall_quadratic)
     465          24 :                work_section => section_vals_get_subs_vals(wall_section, "QUADRATIC", i_rep_section=i)
     466          24 :                CALL section_vals_val_get(work_section, "DIRECTION", i_val=metavar%walls(i)%id_direction)
     467          24 :                CALL section_vals_val_get(work_section, "K", r_val=metavar%walls(i)%k_quadratic)
     468             :             CASE (do_wall_quartic)
     469           4 :                work_section => section_vals_get_subs_vals(wall_section, "QUARTIC", i_rep_section=i)
     470           4 :                CALL section_vals_val_get(work_section, "DIRECTION", i_val=metavar%walls(i)%id_direction)
     471           4 :                CALL section_vals_val_get(work_section, "K", r_val=metavar%walls(i)%k_quartic)
     472           4 :                SELECT CASE (metavar%walls(i)%id_direction)
     473             :                CASE (do_wall_m)
     474           2 :                   metavar%walls(i)%pos0 = metavar%walls(i)%pos + (0.05_dp/metavar%walls(i)%k_quartic**(0.25_dp))
     475             :                CASE (do_wall_p)
     476           2 :                   metavar%walls(i)%pos0 = metavar%walls(i)%pos - (0.05_dp/metavar%walls(i)%k_quartic**(0.25_dp))
     477             :                END SELECT
     478             :             CASE (do_wall_gaussian)
     479           6 :                work_section => section_vals_get_subs_vals(wall_section, "GAUSSIAN", i_rep_section=i)
     480           6 :                CALL section_vals_val_get(work_section, "WW", r_val=metavar%walls(i)%ww_gauss)
     481          52 :                CALL section_vals_val_get(work_section, "SIGMA", r_val=metavar%walls(i)%sigma_gauss)
     482             :             END SELECT
     483             :          END DO
     484             :       END IF
     485             :       ! Setup few more parameters for extended lagrangian
     486         190 :       IF (extended_lagrange) THEN
     487          78 :          CALL section_vals_val_get(metavar_section, "MASS", i_rep_section=icol, r_val=metavar%mass)
     488          78 :          CALL section_vals_val_get(metavar_section, "LAMBDA", i_rep_section=icol, r_val=metavar%lambda)
     489          78 :          IF (langevin) THEN
     490          10 :             CALL section_vals_val_get(metavar_section, "GAMMA", i_rep_section=icol, r_val=metavar%gamma)
     491             :          END IF
     492             :       END IF
     493             : 
     494         190 :       CALL timestop(handle)
     495             : 
     496         190 :    END SUBROUTINE metavar_read
     497             : 
     498             : ! **************************************************************************************************
     499             : !> \brief  Synchronize with the rest of the walkers
     500             : !> \param multiple_walkers ...
     501             : !> \param hills_env ...
     502             : !> \param colvars ...
     503             : !> \param n_colvar ...
     504             : !> \param metadyn_section ...
     505             : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
     506             : ! **************************************************************************************************
     507         132 :    SUBROUTINE synchronize_multiple_walkers(multiple_walkers, hills_env, colvars, &
     508             :                                            n_colvar, metadyn_section)
     509             :       TYPE(multiple_walkers_type), POINTER               :: multiple_walkers
     510             :       TYPE(hills_env_type), POINTER                      :: hills_env
     511             :       TYPE(metavar_type), DIMENSION(:), POINTER          :: colvars
     512             :       INTEGER, INTENT(IN)                                :: n_colvar
     513             :       TYPE(section_vals_type), POINTER                   :: metadyn_section
     514             : 
     515             :       CHARACTER(len=*), PARAMETER :: routineN = 'synchronize_multiple_walkers'
     516             : 
     517             :       CHARACTER(LEN=default_path_length)                 :: filename, tmpname
     518             :       INTEGER                                            :: delta_hills, handle, i, i_hills, ih, iw, &
     519             :                                                             unit_nr
     520             :       LOGICAL                                            :: exist
     521             :       REAL(KIND=dp)                                      :: invdt, ww
     522         132 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: delta_s_save, ss0_save
     523         132 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: delta_s_ss0_buf
     524             :       TYPE(cp_logger_type), POINTER                      :: logger
     525             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     526             : 
     527         132 :       CALL timeset(routineN, handle)
     528             : 
     529         132 :       logger => cp_get_default_logger()
     530         132 :       para_env => logger%para_env
     531             : 
     532             :       ! Locally dump information on file..
     533         132 :       IF (para_env%is_source()) THEN
     534             :          ! Generate file name for the specific Hill
     535          66 :          i = multiple_walkers%walker_id
     536             :          filename = TRIM(multiple_walkers%walkers_file_name(i))//"_"// &
     537          66 :                     TRIM(ADJUSTL(cp_to_string(multiple_walkers%n_hills_local)))
     538          66 :          tmpname = TRIM(filename)//".tmp"
     539             :          CALL open_file(file_name=tmpname, file_status="UNKNOWN", &
     540             :                         file_form="FORMATTED", file_action="WRITE", &
     541          66 :                         file_position="APPEND", unit_number=unit_nr)
     542          66 :          WRITE (unit_nr, *) hills_env%ww_history(hills_env%n_hills)
     543         132 :          DO ih = 1, n_colvar
     544          66 :             WRITE (unit_nr, *) hills_env%ss_history(ih, hills_env%n_hills)
     545         132 :             WRITE (unit_nr, *) hills_env%delta_s_history(ih, hills_env%n_hills)
     546             :          END DO
     547          66 :          IF (hills_env%wtcontrol) WRITE (unit_nr, *) hills_env%invdt_history(hills_env%n_hills)
     548          66 :          CALL close_file(unit_nr)
     549          66 :          CALL m_mov(tmpname, filename)
     550             :       END IF
     551             : 
     552         132 :       IF (MODULO(multiple_walkers%n_hills_local, multiple_walkers%walkers_freq_comm) == 0) THEN
     553             :          ! Store colvars information
     554         396 :          ALLOCATE (ss0_save(n_colvar))
     555         396 :          ALLOCATE (delta_s_save(n_colvar))
     556         396 :          ALLOCATE (delta_s_ss0_buf(2, 0:n_colvar))
     557         924 :          delta_s_ss0_buf = 0
     558         264 :          DO i = 1, n_colvar
     559         132 :             ss0_save(i) = colvars(i)%ss0
     560         264 :             delta_s_save(i) = colvars(i)%delta_s
     561             :          END DO
     562             : 
     563             :          ! Watch for other walkers's file and update
     564         396 :          DO i = 1, multiple_walkers%walkers_tot_nr
     565         264 :             IF (i == multiple_walkers%walker_id) THEN
     566             :                ! Update local counter
     567         132 :                multiple_walkers%walkers_status(i) = multiple_walkers%n_hills_local
     568         132 :                CYCLE
     569             :             END IF
     570             : 
     571         132 :             i_hills = multiple_walkers%walkers_status(i) + 1
     572             :             filename = TRIM(multiple_walkers%walkers_file_name(i))//"_"// &
     573         132 :                        TRIM(ADJUSTL(cp_to_string(i_hills)))
     574             : 
     575         132 :             IF (para_env%is_source()) THEN
     576          66 :                INQUIRE (FILE=TRIM(filename), EXIST=exist)
     577             :             END IF
     578         132 :             CALL para_env%bcast(exist)
     579         230 :             DO WHILE (exist)
     580             :                ! Read information from the walker's file
     581             :                ! We shouldn't care too much about the concurrency of these I/O instructions..
     582             :                ! In case, they can be fixed in the future..
     583          98 :                IF (para_env%is_source()) THEN
     584             :                   CALL open_file(file_name=filename, file_status="OLD", &
     585             :                                  file_form="FORMATTED", file_action="READ", &
     586          49 :                                  file_position="REWIND", unit_number=unit_nr)
     587          49 :                   READ (unit_nr, *) delta_s_ss0_buf(1, 0)
     588          98 :                   DO ih = 1, n_colvar
     589          49 :                      READ (unit_nr, *) delta_s_ss0_buf(1, ih)
     590          98 :                      READ (unit_nr, *) delta_s_ss0_buf(2, ih)
     591             :                   END DO
     592          49 :                   IF (hills_env%wtcontrol) READ (unit_nr, *) delta_s_ss0_buf(2, 0)
     593          49 :                   CALL close_file(unit_nr)
     594             :                END IF
     595          98 :                CALL para_env%bcast(delta_s_ss0_buf)
     596          98 :                ww = delta_s_ss0_buf(1, 0)
     597          98 :                IF (hills_env%wtcontrol) invdt = delta_s_ss0_buf(2, 0)
     598         196 :                DO ih = 1, n_colvar
     599          98 :                   colvars(ih)%ss0 = delta_s_ss0_buf(1, ih)
     600         196 :                   colvars(ih)%delta_s = delta_s_ss0_buf(2, ih)
     601             :                END DO
     602             : 
     603             :                ! Add this hill to the history dependent terms
     604          98 :                IF (hills_env%wtcontrol) THEN
     605           0 :                   CALL add_hill_single(hills_env, colvars, ww, hills_env%n_hills, n_colvar, invdt=invdt)
     606             :                ELSE
     607          98 :                   CALL add_hill_single(hills_env, colvars, ww, hills_env%n_hills, n_colvar)
     608             :                END IF
     609             : 
     610          98 :                i_hills = i_hills + 1
     611             :                filename = TRIM(multiple_walkers%walkers_file_name(i))//"_"// &
     612          98 :                           TRIM(ADJUSTL(cp_to_string(i_hills)))
     613          98 :                IF (para_env%is_source()) THEN
     614          49 :                   INQUIRE (FILE=TRIM(filename), EXIST=exist)
     615             :                END IF
     616         230 :                CALL para_env%bcast(exist)
     617             :             END DO
     618             : 
     619         132 :             delta_hills = i_hills - 1 - multiple_walkers%walkers_status(i)
     620         132 :             multiple_walkers%walkers_status(i) = i_hills - 1
     621             :             iw = cp_print_key_unit_nr(logger, metadyn_section, "PRINT%PROGRAM_RUN_INFO", &
     622         132 :                                       extension=".metadynLog")
     623         132 :             IF (iw > 0) THEN
     624          66 :                WRITE (iw, '(T2,A,I0,A,I0,A,I0,A)') 'WALKERS| Walker #', i, '. Reading [', delta_hills, &
     625         132 :                   '] Hills. Total number of Hills acquired [', multiple_walkers%walkers_status(i), ']'
     626             :             END IF
     627             :             CALL cp_print_key_finished_output(iw, logger, metadyn_section, &
     628         264 :                                               "PRINT%PROGRAM_RUN_INFO")
     629             :          END DO
     630             : 
     631             :          ! Restore colvars information
     632         264 :          DO i = 1, n_colvar
     633         132 :             colvars(i)%ss0 = ss0_save(i)
     634         264 :             colvars(i)%delta_s = delta_s_save(i)
     635             :          END DO
     636         132 :          DEALLOCATE (ss0_save)
     637         132 :          DEALLOCATE (delta_s_save)
     638             :       END IF
     639             : 
     640         132 :       CALL timestop(handle)
     641             : 
     642         132 :    END SUBROUTINE synchronize_multiple_walkers
     643             : 
     644             : ! **************************************************************************************************
     645             : !> \brief Add a single Hill
     646             : !> \param hills_env ...
     647             : !> \param colvars ...
     648             : !> \param ww ...
     649             : !> \param n_hills ...
     650             : !> \param n_colvar ...
     651             : !> \param invdt ...
     652             : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
     653             : ! **************************************************************************************************
     654        1214 :    SUBROUTINE add_hill_single(hills_env, colvars, ww, n_hills, n_colvar, invdt)
     655             :       TYPE(hills_env_type), POINTER                      :: hills_env
     656             :       TYPE(metavar_type), DIMENSION(:), POINTER          :: colvars
     657             :       REAL(KIND=dp), INTENT(IN)                          :: ww
     658             :       INTEGER, INTENT(INOUT)                             :: n_hills
     659             :       INTEGER, INTENT(IN)                                :: n_colvar
     660             :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: invdt
     661             : 
     662             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'add_hill_single'
     663             : 
     664             :       INTEGER                                            :: handle, i
     665             :       LOGICAL                                            :: wtcontrol
     666        1214 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tnp
     667        1214 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: tmp
     668             : 
     669        1214 :       CALL timeset(routineN, handle)
     670             : 
     671        1214 :       wtcontrol = PRESENT(invdt)
     672        1214 :       NULLIFY (tmp, tnp)
     673        1214 :       IF (SIZE(hills_env%ss_history, 2) < n_hills + 1) THEN
     674         456 :          ALLOCATE (tmp(n_colvar, n_hills + 100))
     675         836 :          tmp(:, :n_hills) = hills_env%ss_history
     676       26514 :          tmp(:, n_hills + 1:) = 0.0_dp
     677         114 :          DEALLOCATE (hills_env%ss_history)
     678         114 :          hills_env%ss_history => tmp
     679         114 :          NULLIFY (tmp)
     680             :       END IF
     681        1214 :       IF (SIZE(hills_env%delta_s_history, 2) < n_hills + 1) THEN
     682         456 :          ALLOCATE (tmp(n_colvar, n_hills + 100))
     683         836 :          tmp(:, :n_hills) = hills_env%delta_s_history
     684       26514 :          tmp(:, n_hills + 1:) = 0.0_dp
     685         114 :          DEALLOCATE (hills_env%delta_s_history)
     686         114 :          hills_env%delta_s_history => tmp
     687         114 :          NULLIFY (tmp)
     688             :       END IF
     689        1214 :       IF (SIZE(hills_env%ww_history) < n_hills + 1) THEN
     690         342 :          ALLOCATE (tnp(n_hills + 100))
     691         500 :          tnp(1:n_hills) = hills_env%ww_history
     692       11514 :          tnp(n_hills + 1:) = 0.0_dp
     693         114 :          DEALLOCATE (hills_env%ww_history)
     694         114 :          hills_env%ww_history => tnp
     695         114 :          NULLIFY (tnp)
     696             :       END IF
     697        1214 :       IF (wtcontrol) THEN
     698           4 :          IF (SIZE(hills_env%invdt_history) < n_hills + 1) THEN
     699           6 :             ALLOCATE (tnp(n_hills + 100))
     700           4 :             tnp(1:n_hills) = hills_env%invdt_history
     701         202 :             tnp(n_hills + 1:) = 0.0_dp
     702           2 :             DEALLOCATE (hills_env%invdt_history)
     703           2 :             hills_env%invdt_history => tnp
     704           2 :             NULLIFY (tnp)
     705             :          END IF
     706             :       END IF
     707        1214 :       n_hills = n_hills + 1
     708             :       ! Now add the hill
     709        2708 :       DO i = 1, n_colvar
     710        1494 :          hills_env%ss_history(i, n_hills) = colvars(i)%ss0
     711        2708 :          hills_env%delta_s_history(i, n_hills) = colvars(i)%delta_s
     712             :       END DO
     713        1214 :       hills_env%ww_history(n_hills) = ww
     714        1214 :       IF (wtcontrol) hills_env%invdt_history(n_hills) = invdt
     715             : 
     716        1214 :       CALL timestop(handle)
     717             : 
     718        1214 :    END SUBROUTINE add_hill_single
     719             : 
     720             : ! **************************************************************************************************
     721             : !> \brief Restart Hills Information
     722             : !> \param ss_history ...
     723             : !> \param delta_s_history ...
     724             : !> \param ww_history ...
     725             : !> \param ww ...
     726             : !> \param n_hills ...
     727             : !> \param n_colvar ...
     728             : !> \param colvars ...
     729             : !> \param metadyn_section ...
     730             : !> \param invdt_history ...
     731             : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
     732             : ! **************************************************************************************************
     733         236 :    SUBROUTINE restart_hills(ss_history, delta_s_history, ww_history, ww, &
     734             :                             n_hills, n_colvar, colvars, metadyn_section, invdt_history)
     735             :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: ss_history, delta_s_history
     736             :       REAL(KIND=dp), DIMENSION(:), POINTER               :: ww_history
     737             :       REAL(KIND=dp)                                      :: ww
     738             :       INTEGER, INTENT(IN)                                :: n_hills, n_colvar
     739             :       TYPE(metavar_type), DIMENSION(:), POINTER          :: colvars
     740             :       TYPE(section_vals_type), POINTER                   :: metadyn_section
     741             :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: invdt_history
     742             : 
     743             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'restart_hills'
     744             : 
     745             :       INTEGER                                            :: handle, i, j, ndum
     746             :       LOGICAL                                            :: explicit, wtcontrol
     747             :       REAL(KIND=dp)                                      :: rval
     748         118 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: rvals
     749             :       TYPE(section_vals_type), POINTER                   :: hills_history
     750             : 
     751         118 :       CALL timeset(routineN, handle)
     752             : 
     753         118 :       wtcontrol = PRESENT(invdt_history)
     754         118 :       NULLIFY (rvals)
     755         118 :       hills_history => section_vals_get_subs_vals(metadyn_section, "SPAWNED_HILLS_POS")
     756         118 :       CALL section_vals_get(hills_history, explicit=explicit)
     757         118 :       IF (explicit) THEN
     758          18 :          CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", n_rep_val=ndum)
     759             :          ! ss_history, delta_s_history, ww_history, invdt_history : deallocate and reallocate with the proper size
     760          18 :          DEALLOCATE (ss_history)
     761          18 :          DEALLOCATE (delta_s_history)
     762          18 :          DEALLOCATE (ww_history)
     763          18 :          IF (wtcontrol) THEN
     764           0 :             DEALLOCATE (invdt_history)
     765             :          END IF
     766             :          !
     767          18 :          CPASSERT(n_hills == ndum)
     768          72 :          ALLOCATE (ss_history(n_colvar, n_hills))
     769          72 :          ALLOCATE (delta_s_history(n_colvar, n_hills))
     770          54 :          ALLOCATE (ww_history(n_hills))
     771          18 :          IF (wtcontrol) THEN
     772           0 :             ALLOCATE (invdt_history(n_hills))
     773             :          END IF
     774             :          !
     775         162 :          DO i = 1, n_hills
     776             :             CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     777         144 :                                       i_rep_val=i, r_vals=rvals)
     778         144 :             CPASSERT(SIZE(rvals) == n_colvar)
     779         658 :             ss_history(1:n_colvar, i) = rvals
     780             :          END DO
     781             :          !
     782          18 :          hills_history => section_vals_get_subs_vals(metadyn_section, "SPAWNED_HILLS_SCALE")
     783          18 :          CALL section_vals_get(hills_history, explicit=explicit)
     784          18 :          IF (explicit) THEN
     785             :             ! delta_s_history
     786          18 :             CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", n_rep_val=ndum)
     787          18 :             CPASSERT(n_hills == ndum)
     788         162 :             DO i = 1, n_hills
     789             :                CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     790         144 :                                          i_rep_val=i, r_vals=rvals)
     791         144 :                CPASSERT(SIZE(rvals) == n_colvar)
     792         658 :                delta_s_history(1:n_colvar, i) = rvals
     793             :             END DO
     794             :          ELSE
     795             :             CALL cp_warn(__LOCATION__, &
     796             :                          "Section SPAWNED_HILLS_SCALE is not present! Setting the scales of the "// &
     797           0 :                          "restarted hills according the parameters specified in the input file.")
     798           0 :             DO i = 1, n_hills
     799           0 :                DO j = 1, n_colvar
     800           0 :                   delta_s_history(j, i) = colvars(i)%delta_s
     801             :                END DO
     802             :             END DO
     803             :          END IF
     804             :          !
     805          18 :          hills_history => section_vals_get_subs_vals(metadyn_section, "SPAWNED_HILLS_HEIGHT")
     806          18 :          CALL section_vals_get(hills_history, explicit=explicit)
     807          18 :          IF (explicit) THEN
     808             :             ! ww_history
     809             :             CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     810          18 :                                       n_rep_val=ndum)
     811          18 :             CPASSERT(n_hills == ndum)
     812         162 :             DO i = 1, n_hills
     813             :                CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     814         144 :                                          i_rep_val=i, r_val=rval)
     815         144 :                CPASSERT(SIZE(rvals) == n_colvar)
     816         306 :                ww_history(i) = rval
     817             :             END DO
     818             :          ELSE
     819             :             CALL cp_warn(__LOCATION__, &
     820             :                          "Section SPAWNED_HILLS_HEIGHT is not present! Setting the height of the"// &
     821           0 :                          " restarted hills according the parameters specified in the input file. ")
     822           0 :             ww_history = ww
     823             :          END IF
     824             :          !
     825          18 :          hills_history => section_vals_get_subs_vals(metadyn_section, "SPAWNED_HILLS_INVDT")
     826          18 :          CALL section_vals_get(hills_history, explicit=explicit)
     827          72 :          IF (wtcontrol) THEN
     828           0 :             IF (explicit) THEN
     829             :                ! invdt_history
     830             :                CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     831           0 :                                          n_rep_val=ndum)
     832           0 :                CPASSERT(n_hills == ndum)
     833           0 :                DO i = 1, n_hills
     834             :                   CALL section_vals_val_get(hills_history, "_DEFAULT_KEYWORD_", &
     835           0 :                                             i_rep_val=i, r_val=rval)
     836           0 :                   CPASSERT(SIZE(rvals) == n_colvar)
     837           0 :                   invdt_history(i) = rval
     838             :                END DO
     839             :             ELSE
     840             :                CALL cp_warn(__LOCATION__, &
     841             :                             "Section SPAWNED_HILLS_INVDT is not present! Restarting from standard"// &
     842           0 :                             " metadynamics run i.e. setting 1/(Delta T) equal to zero. ")
     843           0 :                invdt_history = 0._dp
     844             :             END IF
     845             :          ELSE
     846          18 :             IF (explicit) THEN
     847             :                CALL cp_abort(__LOCATION__, &
     848             :                              "Found section SPAWNED_HILLS_INVDT while restarting a standard metadynamics run..."// &
     849           0 :                              " Cannot restart metadynamics from well-tempered MetaD runs. ")
     850             :             END IF
     851             :          END IF
     852             :       END IF
     853             : 
     854         118 :       CALL timestop(handle)
     855             : 
     856         118 :    END SUBROUTINE restart_hills
     857             : 
     858             : ! **************************************************************************************************
     859             : !> \brief Retrieves the iteration level for the metadynamics loop
     860             : !> \param meta_env ...
     861             : !> \param iter_nr ...
     862             : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
     863             : ! **************************************************************************************************
     864       12394 :    SUBROUTINE get_meta_iter_level(meta_env, iter_nr)
     865             :       TYPE(meta_env_type), POINTER                       :: meta_env
     866             :       INTEGER, INTENT(OUT)                               :: iter_nr
     867             : 
     868       12394 :       IF (meta_env%do_multiple_walkers) THEN
     869         540 :          iter_nr = meta_env%multiple_walkers%n_hills_local
     870             :       ELSE
     871       11854 :          iter_nr = meta_env%hills_env%n_hills
     872             :       END IF
     873             : 
     874       12394 :    END SUBROUTINE get_meta_iter_level
     875             : 
     876             : ! **************************************************************************************************
     877             : !> \brief ...
     878             : !> \param meta_env ...
     879             : !> \par History
     880             : !>      11.2007 [created] [tlaino]
     881             : !> \author Teodoro Laino - University of Zurich - 11.2007
     882             : ! **************************************************************************************************
     883       13826 :    SUBROUTINE meta_walls(meta_env)
     884             :       TYPE(meta_env_type), POINTER                       :: meta_env
     885             : 
     886             :       INTEGER                                            :: ih, iwall
     887             :       REAL(dp)                                           :: ddp, delta_s, dfunc, diff_ss, dp2, &
     888             :                                                             efunc, ww
     889       13826 :       TYPE(metavar_type), DIMENSION(:), POINTER          :: colvars
     890             : 
     891       13826 :       colvars => meta_env%metavar
     892             :       ! Forces from the Walls
     893       28396 :       DO ih = 1, SIZE(colvars)
     894       28396 :          IF (colvars(ih)%do_wall) THEN
     895       11276 :             colvars(ih)%epot_walls = 0.0_dp
     896       11276 :             colvars(ih)%ff_walls = 0.0_dp
     897       23162 :             DO iwall = 1, SIZE(colvars(ih)%walls)
     898       11276 :                SELECT CASE (colvars(ih)%walls(iwall)%id_type)
     899             :                CASE (do_wall_reflective, do_wall_none)
     900             :                   ! Do Nothing.. treated in the main metadyn function
     901       10564 :                   CYCLE
     902             :                CASE (do_wall_quadratic)
     903       10564 :                   diff_ss = colvars(ih)%ss0 - colvars(ih)%walls(iwall)%pos
     904       10564 :                   IF (colvars(ih)%periodic) THEN
     905             :                      ! The difference of a periodic COLVAR is always within [-pi,pi]
     906           0 :                      diff_ss = SIGN(1.0_dp, ASIN(SIN(diff_ss)))*ACOS(COS(diff_ss))
     907             :                   END IF
     908       10564 :                   efunc = colvars(ih)%walls(iwall)%k_quadratic*diff_ss**2
     909       10564 :                   dfunc = 2.0_dp*colvars(ih)%walls(iwall)%k_quadratic*diff_ss
     910       10564 :                   SELECT CASE (colvars(ih)%walls(iwall)%id_direction)
     911             :                   CASE (do_wall_p)
     912       10316 :                      IF (diff_ss > 0.0_dp) THEN
     913         170 :                         colvars(ih)%ff_walls = colvars(ih)%ff_walls - dfunc
     914         170 :                         colvars(ih)%epot_walls = colvars(ih)%epot_walls + efunc
     915             :                      END IF
     916             :                   CASE (do_wall_m)
     917         248 :                      IF (diff_ss < 0.0_dp) THEN
     918          30 :                         colvars(ih)%ff_walls = colvars(ih)%ff_walls - dfunc
     919          30 :                         colvars(ih)%epot_walls = colvars(ih)%epot_walls + efunc
     920             :                      END IF
     921             :                   END SELECT
     922             :                CASE (do_wall_quartic)
     923         204 :                   diff_ss = colvars(ih)%ss0 - colvars(ih)%walls(iwall)%pos0
     924         204 :                   IF (colvars(ih)%periodic) THEN
     925             :                      ! The difference of a periodic COLVAR is always within [-pi,pi]
     926           0 :                      diff_ss = SIGN(1.0_dp, ASIN(SIN(diff_ss)))*ACOS(COS(diff_ss))
     927             :                   END IF
     928         204 :                   efunc = colvars(ih)%walls(iwall)%k_quartic*diff_ss*diff_ss**4
     929         204 :                   dfunc = 4.0_dp*colvars(ih)%walls(iwall)%k_quartic*diff_ss**3
     930         204 :                   SELECT CASE (colvars(ih)%walls(iwall)%id_direction)
     931             :                   CASE (do_wall_p)
     932         102 :                      IF (diff_ss > 0.0_dp) THEN
     933          46 :                         colvars(ih)%ff_walls = colvars(ih)%ff_walls - dfunc
     934          46 :                         colvars(ih)%epot_walls = colvars(ih)%epot_walls + efunc
     935             :                      END IF
     936             :                   CASE (do_wall_m)
     937         102 :                      IF (diff_ss < 0.0_dp) THEN
     938          54 :                         colvars(ih)%ff_walls = colvars(ih)%ff_walls - dfunc
     939          54 :                         colvars(ih)%epot_walls = colvars(ih)%epot_walls + efunc
     940             :                      END IF
     941             :                   END SELECT
     942             :                CASE (do_wall_gaussian)
     943         506 :                   diff_ss = colvars(ih)%ss0 - colvars(ih)%walls(iwall)%pos
     944         506 :                   IF (colvars(ih)%periodic) THEN
     945             :                      ! The difference of a periodic COLVAR is always within [-pi,pi]
     946           0 :                      diff_ss = SIGN(1.0_dp, ASIN(SIN(diff_ss)))*ACOS(COS(diff_ss))
     947             :                   END IF
     948         506 :                   ww = colvars(ih)%walls(iwall)%ww_gauss
     949         506 :                   delta_s = colvars(ih)%walls(iwall)%sigma_gauss
     950         506 :                   ddp = (diff_ss)/delta_s
     951         506 :                   dp2 = ddp**2
     952         506 :                   efunc = ww*EXP(-0.5_dp*dp2)
     953         506 :                   dfunc = -efunc*ddp/delta_s
     954         506 :                   colvars(ih)%ff_walls = colvars(ih)%ff_walls - dfunc
     955       12392 :                   colvars(ih)%epot_walls = colvars(ih)%epot_walls + efunc
     956             :                END SELECT
     957             :             END DO
     958             :          END IF
     959             :       END DO
     960       13826 :    END SUBROUTINE meta_walls
     961             : 
     962             : END MODULE metadynamics_utils

Generated by: LCOV version 1.15