LCOV - code coverage report
Current view: top level - src/motion - md_environment_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:37c9bd6) Lines: 119 137 86.9 %
Date: 2023-03-30 11:55:16 Functions: 5 6 83.3 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2023 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \par History
      10             : !>      give the md_env its own para_env Joost VandeVondele 07.2003
      11             : !>      Teodoro Laino - 09.2007 - University of Zurich - generalizing thermostats
      12             : !>                                and barostats
      13             : !> \author CJM SEPT-12-02
      14             : ! **************************************************************************************************
      15             : MODULE md_environment_types
      16             :    USE averages_types,                  ONLY: average_quantities_type,&
      17             :                                               create_averages,&
      18             :                                               release_averages,&
      19             :                                               retain_averages
      20             :    USE barostat_types,                  ONLY: barostat_type,&
      21             :                                               release_barostat_type
      22             :    USE cell_types,                      ONLY: cell_type
      23             :    USE extended_system_types,           ONLY: npt_info_type
      24             :    USE force_env_types,                 ONLY: force_env_release,&
      25             :                                               force_env_retain,&
      26             :                                               force_env_type
      27             :    USE free_energy_types,               ONLY: fe_env_release,&
      28             :                                               free_energy_type
      29             :    USE input_constants,                 ONLY: do_thermo_al,&
      30             :                                               langevin_ensemble
      31             :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      32             :                                               section_vals_type
      33             :    USE kinds,                           ONLY: dp
      34             :    USE md_ener_types,                   ONLY: md_ener_type,&
      35             :                                               release_md_ener
      36             :    USE message_passing,                 ONLY: mp_para_env_release,&
      37             :                                               mp_para_env_type
      38             :    USE reftraj_types,                   ONLY: reftraj_type,&
      39             :                                               release_reftraj
      40             :    USE simpar_types,                    ONLY: simpar_type
      41             :    USE thermal_region_types,            ONLY: release_thermal_regions,&
      42             :                                               thermal_regions_type
      43             :    USE thermostat_types,                ONLY: release_thermostats,&
      44             :                                               thermostat_type,&
      45             :                                               thermostats_type
      46             : #include "../base/base_uses.f90"
      47             : 
      48             :    IMPLICIT NONE
      49             : 
      50             :    PRIVATE
      51             : 
      52             : ! **************************************************************************************************
      53             :    TYPE md_environment_type
      54             :       ! para_env is the parallel environment of the MD,  i.e. the systems
      55             :       ! that are dealt with by the integrator e.g in the PIMD this could
      56             :       ! be parent of every bead.
      57             :       PRIVATE
      58             :       LOGICAL                                    :: init, first_time, ehrenfest_md
      59             :       INTEGER, POINTER                           :: itimes => NULL()
      60             :       REAL(KIND=dp), POINTER                     :: used_time => NULL(), t => NULL()
      61             :       REAL(KIND=dp), POINTER                     :: constant => NULL()
      62             :       TYPE(mp_para_env_type), POINTER            :: para_env => NULL()
      63             :       TYPE(cell_type), POINTER                   :: cell => NULL()
      64             :       TYPE(force_env_type), POINTER              :: force_env => NULL()
      65             :       TYPE(md_ener_type), POINTER                :: md_ener => NULL()
      66             :       TYPE(thermostats_type), POINTER            :: thermostats => NULL()
      67             :       TYPE(barostat_type), POINTER               :: barostat => NULL()
      68             :       TYPE(reftraj_type), POINTER                :: reftraj => NULL()
      69             :       TYPE(free_energy_type), POINTER           :: fe_env => NULL()
      70             :       TYPE(simpar_type), POINTER                 :: simpar => NULL()
      71             :       TYPE(average_quantities_type), POINTER     :: averages => NULL()
      72             :       TYPE(thermal_regions_type), POINTER        :: thermal_regions => NULL()
      73             :    END TYPE md_environment_type
      74             : 
      75             :    ! *** Public subroutines and data types ***
      76             :    PUBLIC :: md_environment_type, set_md_env, get_md_env, md_env_create, &
      77             :              md_env_release, need_per_atom_wiener_process
      78             : 
      79             :    ! *** Global parameters ***
      80             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'md_environment_types'
      81             : 
      82             : CONTAINS
      83             : 
      84             : ! **************************************************************************************************
      85             : !> \brief Creates MD environment
      86             : !>      Purpose: Initialise the integrator environment.
      87             : !>      retain the para_env for this environment (should be used for parallel
      88             : !>      communications)
      89             : !> \param md_env the force environment to retain
      90             : !> \param md_section ...
      91             : !> \param para_env ...
      92             : !> \param force_env ...
      93             : ! **************************************************************************************************
      94        1729 :    SUBROUTINE md_env_create(md_env, md_section, para_env, force_env)
      95             :       TYPE(md_environment_type), INTENT(OUT)             :: md_env
      96             :       TYPE(section_vals_type), POINTER                   :: md_section
      97             :       TYPE(mp_para_env_type), POINTER                    :: para_env
      98             :       TYPE(force_env_type), POINTER                      :: force_env
      99             : 
     100             :       TYPE(section_vals_type), POINTER                   :: averages_section
     101             : 
     102             :       NULLIFY (md_env%itimes)
     103             :       NULLIFY (md_env%constant)
     104             :       NULLIFY (md_env%t)
     105             :       NULLIFY (md_env%cell)
     106             :       NULLIFY (md_env%simpar)
     107             :       NULLIFY (md_env%thermostats)
     108             :       NULLIFY (md_env%barostat)
     109             :       NULLIFY (md_env%force_env)
     110             :       NULLIFY (md_env%fe_env)
     111             :       NULLIFY (md_env%md_ener)
     112             :       NULLIFY (md_env%reftraj)
     113             :       NULLIFY (md_env%averages)
     114             :       NULLIFY (md_env%thermal_regions)
     115        1729 :       md_env%para_env => para_env
     116        1729 :       CALL md_env%para_env%retain()
     117        1729 :       ALLOCATE (md_env%itimes)
     118        1729 :       ALLOCATE (md_env%constant)
     119        1729 :       ALLOCATE (md_env%used_time)
     120        1729 :       ALLOCATE (md_env%t)
     121        1729 :       md_env%itimes = -1
     122        1729 :       md_env%constant = 0.0_dp
     123        1729 :       md_env%used_time = 0.0_dp
     124        1729 :       md_env%t = 0.0_dp
     125        1729 :       md_env%init = .TRUE.
     126        1729 :       md_env%first_time = .TRUE.
     127        1729 :       md_env%ehrenfest_md = .FALSE.
     128        1729 :       averages_section => section_vals_get_subs_vals(md_section, "AVERAGES")
     129        1729 :       CALL create_averages(md_env%averages, averages_section, force_env=force_env)
     130             : 
     131        1729 :    END SUBROUTINE md_env_create
     132             : 
     133             : ! **************************************************************************************************
     134             : !> \brief releases the given md env
     135             : !> \param md_env the md environment to release
     136             : !> \par History
     137             : !>      04.2003 created [fawzi]
     138             : !> \author fawzi
     139             : ! **************************************************************************************************
     140        1729 :    SUBROUTINE md_env_release(md_env)
     141             :       TYPE(md_environment_type), INTENT(INOUT)           :: md_env
     142             : 
     143        1729 :       CALL fe_env_release(md_env%fe_env)
     144        1729 :       CALL mp_para_env_release(md_env%para_env)
     145        1729 :       DEALLOCATE (md_env%itimes)
     146        1729 :       DEALLOCATE (md_env%constant)
     147        1729 :       DEALLOCATE (md_env%used_time)
     148        1729 :       DEALLOCATE (md_env%t)
     149             : 
     150        1729 :       NULLIFY (md_env%cell)
     151        1729 :       NULLIFY (md_env%simpar)
     152        1729 :       CALL release_barostat_type(md_env%barostat)
     153        1729 :       IF (ASSOCIATED(md_env%thermostats)) THEN
     154         522 :          CALL release_thermostats(md_env%thermostats)
     155         522 :          DEALLOCATE (md_env%thermostats)
     156             :       END IF
     157        1729 :       IF (ASSOCIATED(md_env%reftraj)) THEN
     158          32 :          CALL release_reftraj(md_env%reftraj)
     159          32 :          DEALLOCATE (md_env%reftraj)
     160             :       END IF
     161        1729 :       IF (ASSOCIATED(md_env%md_ener)) THEN
     162        1729 :          CALL release_md_ener(md_env%md_ener)
     163        1729 :          DEALLOCATE (md_env%md_ener)
     164             :       END IF
     165        1729 :       CALL force_env_release(md_env%force_env)
     166        1729 :       CALL release_averages(md_env%averages)
     167        1729 :       IF (ASSOCIATED(md_env%thermal_regions)) THEN
     168          14 :          CALL release_thermal_regions(md_env%thermal_regions)
     169          14 :          DEALLOCATE (md_env%thermal_regions)
     170             :       END IF
     171             : 
     172        1729 :    END SUBROUTINE md_env_release
     173             : 
     174             : ! **************************************************************************************************
     175             : !> \brief get components of MD environment type
     176             : !> \param md_env the force environment to retain
     177             : !> \param itimes ...
     178             : !> \param constant ...
     179             : !> \param used_time ...
     180             : !> \param cell ...
     181             : !> \param simpar ...
     182             : !> \param npt ...
     183             : !> \param force_env ...
     184             : !> \param para_env ...
     185             : !> \param reftraj ...
     186             : !> \param t ...
     187             : !> \param init ...
     188             : !> \param first_time ...
     189             : !> \param fe_env ...
     190             : !> \param thermostats ...
     191             : !> \param barostat ...
     192             : !> \param thermostat_coeff ...
     193             : !> \param thermostat_part ...
     194             : !> \param thermostat_shell ...
     195             : !> \param thermostat_baro ...
     196             : !> \param thermostat_fast ...
     197             : !> \param thermostat_slow ...
     198             : !> \param md_ener ...
     199             : !> \param averages ...
     200             : !> \param thermal_regions ...
     201             : !> \param ehrenfest_md ...
     202             : ! **************************************************************************************************
     203      509882 :    SUBROUTINE get_md_env(md_env, itimes, constant, used_time, cell, simpar, npt, &
     204             :                          force_env, para_env, reftraj, t, init, first_time, fe_env, thermostats, barostat, &
     205             :                          thermostat_coeff, thermostat_part, thermostat_shell, thermostat_baro, &
     206             :                          thermostat_fast, thermostat_slow, md_ener, averages, &
     207             :                          thermal_regions, ehrenfest_md)
     208             : 
     209             :       TYPE(md_environment_type), INTENT(IN)              :: md_env
     210             :       INTEGER, OPTIONAL, POINTER                         :: itimes
     211             :       REAL(KIND=dp), OPTIONAL, POINTER                   :: constant, used_time
     212             :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     213             :       TYPE(simpar_type), OPTIONAL, POINTER               :: simpar
     214             :       TYPE(npt_info_type), OPTIONAL, POINTER             :: npt(:, :)
     215             :       TYPE(force_env_type), OPTIONAL, POINTER            :: force_env
     216             :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     217             :       TYPE(reftraj_type), OPTIONAL, POINTER              :: reftraj
     218             :       REAL(KIND=dp), OPTIONAL, POINTER                   :: t
     219             :       LOGICAL, OPTIONAL                                  :: init, first_time
     220             :       TYPE(free_energy_type), OPTIONAL, POINTER          :: fe_env
     221             :       TYPE(thermostats_type), OPTIONAL, POINTER          :: thermostats
     222             :       TYPE(barostat_type), OPTIONAL, POINTER             :: barostat
     223             :       TYPE(thermostat_type), OPTIONAL, POINTER           :: thermostat_coeff, thermostat_part, &
     224             :                                                             thermostat_shell, thermostat_baro, &
     225             :                                                             thermostat_fast, thermostat_slow
     226             :       TYPE(md_ener_type), OPTIONAL, POINTER              :: md_ener
     227             :       TYPE(average_quantities_type), OPTIONAL, POINTER   :: averages
     228             :       TYPE(thermal_regions_type), OPTIONAL, POINTER      :: thermal_regions
     229             :       LOGICAL, OPTIONAL                                  :: ehrenfest_md
     230             : 
     231      509882 :       IF (PRESENT(itimes)) itimes => md_env%itimes
     232      509882 :       IF (PRESENT(fe_env)) fe_env => md_env%fe_env
     233      509882 :       IF (PRESENT(constant)) constant => md_env%constant
     234      509882 :       IF (PRESENT(used_time)) used_time => md_env%used_time
     235      509882 :       IF (PRESENT(t)) t => md_env%t
     236      509882 :       IF (PRESENT(cell)) cell => md_env%cell
     237      509882 :       IF (PRESENT(simpar)) simpar => md_env%simpar
     238      509882 :       IF (PRESENT(thermostats)) thermostats => md_env%thermostats
     239      509882 :       IF (PRESENT(barostat)) barostat => md_env%barostat
     240             :       IF (PRESENT(thermostat_part) .OR. PRESENT(thermostat_coeff) .OR. &
     241             :           PRESENT(thermostat_baro) .OR. PRESENT(thermostat_shell) .OR. &
     242      509882 :           PRESENT(thermostat_fast) .OR. PRESENT(thermostat_slow)) THEN
     243       85592 :          IF (ASSOCIATED(md_env%thermostats)) THEN
     244       20652 :             IF (PRESENT(thermostat_part)) THEN
     245       20236 :                thermostat_part => md_env%thermostats%thermostat_part
     246             :             END IF
     247       20652 :             IF (PRESENT(thermostat_coeff)) THEN
     248       15226 :                thermostat_coeff => md_env%thermostats%thermostat_coef
     249             :             END IF
     250       20652 :             IF (PRESENT(thermostat_shell)) THEN
     251       20652 :                thermostat_shell => md_env%thermostats%thermostat_shell
     252             :             END IF
     253       20652 :             IF (PRESENT(thermostat_fast)) THEN
     254           0 :                thermostat_fast => md_env%thermostats%thermostat_fast
     255             :             END IF
     256       20652 :             IF (PRESENT(thermostat_slow)) THEN
     257           0 :                thermostat_slow => md_env%thermostats%thermostat_slow
     258             :             END IF
     259       20652 :             IF (PRESENT(thermostat_baro)) THEN
     260        5250 :                thermostat_baro => md_env%thermostats%thermostat_baro
     261             :             END IF
     262             :          END IF
     263             :       END IF
     264      509882 :       IF (PRESENT(npt)) THEN
     265        9870 :          IF (ASSOCIATED(md_env%barostat)) THEN
     266        4768 :             npt => md_env%barostat%npt
     267             :          END IF
     268             :       END IF
     269      509882 :       IF (PRESENT(averages)) averages => md_env%averages
     270      509882 :       IF (PRESENT(force_env)) force_env => md_env%force_env
     271      509882 :       IF (PRESENT(para_env)) para_env => md_env%para_env
     272      509882 :       IF (PRESENT(reftraj)) reftraj => md_env%reftraj
     273      509882 :       IF (PRESENT(md_ener)) md_ener => md_env%md_ener
     274      509882 :       IF (PRESENT(init)) init = md_env%init
     275      509882 :       IF (PRESENT(first_time)) first_time = md_env%first_time
     276      509882 :       IF (PRESENT(ehrenfest_md)) ehrenfest_md = md_env%ehrenfest_md
     277      509882 :       IF (PRESENT(thermal_regions)) thermal_regions => md_env%thermal_regions
     278             : 
     279      509882 :    END SUBROUTINE get_md_env
     280             : 
     281             : ! **************************************************************************************************
     282             : !> \brief Set the integrator environment to the correct program.
     283             : !> \param md_env the force environment to retain
     284             : !> \param itimes ...
     285             : !> \param constant ...
     286             : !> \param cell ...
     287             : !> \param simpar ...
     288             : !> \param fe_env ...
     289             : !> \param force_env ...
     290             : !> \param para_env ...
     291             : !> \param init ...
     292             : !> \param first_time ...
     293             : !> \param thermostats ...
     294             : !> \param barostat ...
     295             : !> \param reftraj ...
     296             : !> \param md_ener ...
     297             : !> \param averages ...
     298             : !> \param thermal_regions ...
     299             : !> \param ehrenfest_md ...
     300             : ! **************************************************************************************************
     301       50053 :    SUBROUTINE set_md_env(md_env, itimes, constant, cell, simpar, fe_env, force_env, &
     302             :                          para_env, init, first_time, thermostats, barostat, reftraj, md_ener, averages, &
     303             :                          thermal_regions, ehrenfest_md)
     304             : 
     305             :       TYPE(md_environment_type), INTENT(INOUT)           :: md_env
     306             :       INTEGER, OPTIONAL, POINTER                         :: itimes
     307             :       REAL(KIND=dp), OPTIONAL, POINTER                   :: constant
     308             :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     309             :       TYPE(simpar_type), OPTIONAL, POINTER               :: simpar
     310             :       TYPE(free_energy_type), OPTIONAL, POINTER          :: fe_env
     311             :       TYPE(force_env_type), OPTIONAL, POINTER            :: force_env
     312             :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     313             :       LOGICAL, OPTIONAL                                  :: init, first_time
     314             :       TYPE(thermostats_type), OPTIONAL, POINTER          :: thermostats
     315             :       TYPE(barostat_type), OPTIONAL, POINTER             :: barostat
     316             :       TYPE(reftraj_type), OPTIONAL, POINTER              :: reftraj
     317             :       TYPE(md_ener_type), OPTIONAL, POINTER              :: md_ener
     318             :       TYPE(average_quantities_type), OPTIONAL, POINTER   :: averages
     319             :       TYPE(thermal_regions_type), OPTIONAL, POINTER      :: thermal_regions
     320             :       LOGICAL, OPTIONAL                                  :: ehrenfest_md
     321             : 
     322       50053 :       IF (PRESENT(init)) md_env%init = init
     323       50053 :       IF (PRESENT(first_time)) md_env%first_time = first_time
     324       50053 :       IF (PRESENT(ehrenfest_md)) md_env%ehrenfest_md = ehrenfest_md
     325       50053 :       IF (PRESENT(cell)) md_env%cell => cell
     326       50053 :       IF (PRESENT(barostat)) THEN
     327        1729 :          IF (ASSOCIATED(md_env%barostat)) THEN
     328           0 :          IF (.NOT. ASSOCIATED(md_env%barostat, barostat)) THEN
     329           0 :             CALL release_barostat_type(md_env%barostat)
     330             :          END IF
     331             :          END IF
     332        1729 :          md_env%barostat => barostat
     333             :       END IF
     334       50053 :       IF (PRESENT(thermostats)) THEN
     335        1729 :          IF (ASSOCIATED(md_env%thermostats)) THEN
     336           0 :          IF (.NOT. ASSOCIATED(md_env%thermostats, thermostats)) THEN
     337           0 :             CALL release_thermostats(md_env%thermostats)
     338           0 :             DEALLOCATE (md_env%thermostats)
     339             :          END IF
     340             :          END IF
     341        1729 :          md_env%thermostats => thermostats
     342             :       END IF
     343       50053 :       IF (PRESENT(simpar)) md_env%simpar => simpar
     344       50053 :       IF (PRESENT(itimes)) md_env%itimes => itimes
     345       50053 :       IF (PRESENT(fe_env)) md_env%fe_env => fe_env
     346       50053 :       IF (PRESENT(constant)) md_env%constant => constant
     347       50053 :       IF (PRESENT(para_env)) md_env%para_env => para_env
     348       50053 :       IF (PRESENT(force_env)) THEN
     349        1729 :          IF (ASSOCIATED(force_env)) THEN
     350        1729 :             CALL force_env_retain(force_env)
     351             :          END IF
     352        1729 :          IF (ASSOCIATED(md_env%force_env)) THEN
     353           0 :             CALL force_env_release(md_env%force_env)
     354             :          END IF
     355        1729 :          md_env%force_env => force_env
     356             :       END IF
     357       50053 :       IF (PRESENT(reftraj)) THEN
     358          32 :          IF (ASSOCIATED(md_env%reftraj)) THEN
     359           0 :          IF (.NOT. ASSOCIATED(md_env%reftraj, reftraj)) THEN
     360           0 :             CALL release_reftraj(md_env%reftraj)
     361           0 :             DEALLOCATE (md_env%reftraj)
     362             :          END IF
     363             :          END IF
     364          32 :          md_env%reftraj => reftraj
     365             :       END IF
     366       50053 :       IF (PRESENT(md_ener)) THEN
     367        1729 :          IF (ASSOCIATED(md_env%md_ener)) THEN
     368           0 :             IF (.NOT. ASSOCIATED(md_env%md_ener, md_ener)) THEN
     369           0 :                CALL release_md_ener(md_env%md_ener)
     370           0 :                DEALLOCATE (md_env%md_ener)
     371             :             END IF
     372             :          END IF
     373        1729 :          md_env%md_ener => md_ener
     374             :       END IF
     375       50053 :       IF (PRESENT(averages)) THEN
     376          20 :          CALL release_averages(md_env%averages)
     377          20 :          CALL retain_averages(averages)
     378          20 :          md_env%averages => averages
     379             :       END IF
     380       50053 :       IF (PRESENT(thermal_regions)) THEN
     381        1729 :          IF (ASSOCIATED(md_env%thermal_regions)) THEN
     382           0 :             IF (.NOT. ASSOCIATED(md_env%thermal_regions, thermal_regions)) THEN
     383           0 :                CALL release_thermal_regions(md_env%thermal_regions)
     384           0 :                DEALLOCATE (md_env%thermal_regions)
     385             :             END IF
     386             :          END IF
     387        1729 :          md_env%thermal_regions => thermal_regions
     388             :       END IF
     389             : 
     390       50053 :    END SUBROUTINE set_md_env
     391             : 
     392             : ! **************************************************************************************************
     393             : !> \brief ...
     394             : !> \param md_env ...
     395             : !> \return ...
     396             : !> \par History
     397             : !>      02.2012 created [noamb]
     398             : !> \author Noam Bernstein
     399             : ! **************************************************************************************************
     400        1773 :    PURE FUNCTION need_per_atom_wiener_process(md_env)
     401             :       TYPE(md_environment_type), INTENT(IN)              :: md_env
     402             :       LOGICAL                                            :: need_per_atom_wiener_process
     403             : 
     404             : ! return value
     405             : ! check for Langevin ensemble
     406             : 
     407        1773 :       need_per_atom_wiener_process = (md_env%simpar%ensemble == langevin_ensemble)
     408        1773 :       IF (need_per_atom_wiener_process) RETURN
     409             : 
     410             :       ! check for adaptive-Langevin thermostat
     411        1689 :       IF (.NOT. ASSOCIATED(md_env%thermostats)) RETURN
     412         526 :       IF (.NOT. ASSOCIATED(md_env%thermostats%thermostat_part)) RETURN
     413         510 :       need_per_atom_wiener_process = (md_env%thermostats%thermostat_part%type_of_thermostat == do_thermo_al)
     414             : 
     415         510 :    END FUNCTION need_per_atom_wiener_process
     416             : 
     417           0 : END MODULE md_environment_types

Generated by: LCOV version 1.15