LCOV - code coverage report
Current view: top level - src/motion - md_environment_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 85.3 % 136 116
Test Date: 2026-11-04 00:58:17 Functions: 83.3 % 6 5

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

Generated by: LCOV version 2.0-1