LCOV - code coverage report
Current view: top level - src - ipi_environment_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 0.0 % 77 0
Test Date: 2025-07-25 12:55:17 Functions: 0.0 % 6 0

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief The environment for the empirical interatomic potential methods.
      10              : !> \par History
      11              : !>      03.2024 initial create
      12              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
      13              : ! **************************************************************************************************
      14              : MODULE ipi_environment_types
      15              :    USE atomic_kind_list_types,          ONLY: atomic_kind_list_create,&
      16              :                                               atomic_kind_list_release,&
      17              :                                               atomic_kind_list_type
      18              :    USE atomic_kind_types,               ONLY: atomic_kind_type
      19              :    USE cell_types,                      ONLY: cell_release,&
      20              :                                               cell_retain,&
      21              :                                               cell_type
      22              :    USE cp_subsys_types,                 ONLY: cp_subsys_get,&
      23              :                                               cp_subsys_release,&
      24              :                                               cp_subsys_set,&
      25              :                                               cp_subsys_type
      26              :    USE distribution_1d_types,           ONLY: distribution_1d_type
      27              :    USE input_section_types,             ONLY: section_vals_release,&
      28              :                                               section_vals_retain,&
      29              :                                               section_vals_type
      30              :    USE kinds,                           ONLY: dp
      31              :    USE molecule_kind_list_types,        ONLY: molecule_kind_list_create,&
      32              :                                               molecule_kind_list_release,&
      33              :                                               molecule_kind_list_type
      34              :    USE molecule_kind_types,             ONLY: molecule_kind_type
      35              :    USE molecule_list_types,             ONLY: molecule_list_create,&
      36              :                                               molecule_list_release,&
      37              :                                               molecule_list_type
      38              :    USE molecule_types,                  ONLY: molecule_type
      39              :    USE particle_list_types,             ONLY: particle_list_create,&
      40              :                                               particle_list_release,&
      41              :                                               particle_list_type
      42              :    USE particle_types,                  ONLY: particle_type
      43              :    USE virial_types,                    ONLY: virial_type
      44              : #include "./base/base_uses.f90"
      45              : 
      46              :    IMPLICIT NONE
      47              :    PRIVATE
      48              : 
      49              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ipi_environment_types'
      50              : 
      51              :    ! *** Public data types ***
      52              :    PUBLIC :: ipi_environment_type
      53              : 
      54              :    ! *** Public subroutines ***
      55              :    PUBLIC :: ipi_env_release, &
      56              :              ipi_env_set, &
      57              :              ipi_env_get, &
      58              :              ipi_env_create
      59              : 
      60              : ! **************************************************************************************************
      61              : !> \brief The i–PI environment
      62              : !> \param ipi_energy The total ipi energy
      63              : !> \param ipi_forces The final ipi forces [eV/A]
      64              : !> \param subsystem The particles, molecules,... of this environment
      65              : !> \param force_env_input Pointer to the force_env input section
      66              : !> \param cell_ref The reference simulation cell
      67              : !> \par History
      68              : !>      03.2024 initial create
      69              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
      70              : ! **************************************************************************************************
      71              :    TYPE ipi_environment_type
      72              :       REAL(KIND=dp)                                    :: ipi_energy = 0.0_dp
      73              :       REAL(KIND=dp), DIMENSION(:, :), POINTER          :: ipi_forces => Null()
      74              :       TYPE(cp_subsys_type), POINTER                    :: subsys => Null()
      75              :       TYPE(section_vals_type), POINTER                 :: force_env_input => Null()
      76              :       TYPE(cell_type), POINTER                         :: cell_ref => Null()
      77              :       INTEGER                                          :: sockfd = -1
      78              :    END TYPE ipi_environment_type
      79              : 
      80              : CONTAINS
      81              : 
      82              : ! **************************************************************************************************
      83              : !> \brief Releases the given ipi environment (see doc/ReferenceCounting.html)
      84              : !> \param ipi_env The ipi environment to release
      85              : !> \par History
      86              : !>      03.2024 initial create
      87              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
      88              : ! **************************************************************************************************
      89            0 :    SUBROUTINE ipi_env_release(ipi_env)
      90              :       TYPE(ipi_environment_type), INTENT(INOUT)          :: ipi_env
      91              : 
      92            0 :       IF (ASSOCIATED(ipi_env%ipi_forces)) THEN
      93            0 :          DEALLOCATE (ipi_env%ipi_forces)
      94              :       END IF
      95            0 :       IF (ASSOCIATED(ipi_env%subsys)) THEN
      96            0 :          CALL cp_subsys_release(ipi_env%subsys)
      97              :       END IF
      98            0 :       IF (ASSOCIATED(ipi_env%force_env_input)) THEN
      99            0 :          CALL section_vals_release(ipi_env%force_env_input)
     100              :       END IF
     101            0 :       IF (ASSOCIATED(ipi_env%cell_ref)) THEN
     102            0 :          CALL cell_release(ipi_env%cell_ref)
     103              :       END IF
     104            0 :    END SUBROUTINE ipi_env_release
     105              : 
     106              : ! **************************************************************************************************
     107              : !> \brief Returns various attributes of the ipi environment
     108              : !> \param ipi_env The enquired ipi environment
     109              : !> \param ipi_energy The total ipi energy
     110              : !> \param ipi_forces The final ipi forces [eV/A]
     111              : !> \param subsys the particles, molecules,... of this environment
     112              : !> \param atomic_kind_set The set of all atomic kinds involved
     113              : !> \param particle_set The set of all particles
     114              : !> \param local_particles All particles on this particular node
     115              : !> \param molecule_kind_set The set of all different molecule kinds involved
     116              : !> \param molecule_set The set of all molecules
     117              : !> \param local_molecules All molecules on this particular node
     118              : !> \param force_env_input Pointer to the force_env input section
     119              : !> \param cell The simulation cell
     120              : !> \param cell_ref The reference simulation cell
     121              : !> \param virial Dummy virial pointer
     122              : !> \param sockfd File descriptor of the communications socket
     123              : !> \par History
     124              : !>      03.2024 initial create
     125              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
     126              : ! **************************************************************************************************
     127            0 :    SUBROUTINE ipi_env_get(ipi_env, ipi_energy, ipi_forces, subsys, &
     128              :                           atomic_kind_set, particle_set, local_particles, &
     129              :                           molecule_kind_set, molecule_set, local_molecules, &
     130              :                           force_env_input, cell, cell_ref, virial, sockfd)
     131              : 
     132              :       TYPE(ipi_environment_type), INTENT(IN)             :: ipi_env
     133              :       REAL(kind=dp), OPTIONAL                            :: ipi_energy
     134              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: ipi_forces
     135              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: subsys
     136              :       TYPE(atomic_kind_type), DIMENSION(:), OPTIONAL, &
     137              :          POINTER                                         :: atomic_kind_set
     138              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     139              :          POINTER                                         :: particle_set
     140              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_particles
     141              :       TYPE(molecule_kind_type), DIMENSION(:), OPTIONAL, &
     142              :          POINTER                                         :: molecule_kind_set
     143              :       TYPE(molecule_type), DIMENSION(:), OPTIONAL, &
     144              :          POINTER                                         :: molecule_set
     145              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     146              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: force_env_input
     147              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell, cell_ref
     148              :       TYPE(virial_type), OPTIONAL, POINTER               :: virial
     149              :       INTEGER, OPTIONAL                                  :: sockfd
     150              : 
     151              :       TYPE(atomic_kind_list_type), POINTER               :: atomic_kinds
     152              :       TYPE(molecule_kind_list_type), POINTER             :: molecule_kinds
     153              :       TYPE(molecule_list_type), POINTER                  :: molecules
     154              :       TYPE(particle_list_type), POINTER                  :: particles
     155              : 
     156            0 :       NULLIFY (atomic_kinds, particles, molecules, molecule_kinds)
     157              : 
     158            0 :       IF (PRESENT(ipi_energy)) ipi_energy = ipi_env%ipi_energy
     159            0 :       IF (PRESENT(ipi_forces)) ipi_forces = ipi_env%ipi_forces
     160            0 :       IF (PRESENT(subsys)) subsys => ipi_env%subsys
     161              :       CALL cp_subsys_get(ipi_env%subsys, &
     162              :                          atomic_kinds=atomic_kinds, &
     163              :                          particles=particles, &
     164              :                          molecule_kinds=molecule_kinds, &
     165              :                          molecules=molecules, &
     166              :                          local_molecules=local_molecules, &
     167              :                          local_particles=local_particles, &
     168              :                          virial=virial, &
     169            0 :                          cell=cell)
     170            0 :       IF (PRESENT(atomic_kind_set)) atomic_kind_set => atomic_kinds%els
     171            0 :       IF (PRESENT(particle_set)) particle_set => particles%els
     172            0 :       IF (PRESENT(molecule_kind_set)) molecule_kind_set => molecule_kinds%els
     173            0 :       IF (PRESENT(molecule_set)) molecule_set => molecules%els
     174              : 
     175            0 :       IF (PRESENT(force_env_input)) force_env_input => ipi_env%force_env_input
     176            0 :       IF (PRESENT(cell_ref)) cell_ref => ipi_env%cell_ref
     177            0 :       IF (PRESENT(sockfd)) sockfd = ipi_env%sockfd
     178              : 
     179            0 :    END SUBROUTINE ipi_env_get
     180              : 
     181              : ! **************************************************************************************************
     182              : !> \brief Sets various attributes of the ipi environment
     183              : !> \param ipi_env The enquired ipi environment
     184              : !> \param ipi_energy The total ipi energy
     185              : !> \param ipi_forces The final ipi forces [eV/A]
     186              : !> \param subsys the particles, molecules,... of this environment
     187              : !> \param atomic_kind_set The set of all atomic kinds involved
     188              : !> \param particle_set The set of all particles
     189              : !> \param local_particles All particles on this particular node
     190              : !> \param molecule_kind_set The set of all different molecule kinds involved
     191              : !> \param molecule_set The set of all molecules
     192              : !> \param local_molecules All molecules on this particular node
     193              : !> \param force_env_input Pointer to the force_env input section
     194              : !> \param cell_ref The reference simulation cell
     195              : !> \param sockfd File descriptor of the communications socket
     196              : !> \par History
     197              : !>      03.2024 initial create
     198              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
     199              : ! **************************************************************************************************
     200            0 :    SUBROUTINE ipi_env_set(ipi_env, ipi_energy, ipi_forces, subsys, &
     201              :                           atomic_kind_set, particle_set, local_particles, &
     202              :                           molecule_kind_set, molecule_set, local_molecules, &
     203              :                           force_env_input, cell_ref, sockfd)
     204              : 
     205              :       TYPE(ipi_environment_type), INTENT(INOUT)          :: ipi_env
     206              :       REAL(KIND=dp), OPTIONAL                            :: ipi_energy
     207              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: ipi_forces
     208              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: subsys
     209              :       TYPE(atomic_kind_type), DIMENSION(:), OPTIONAL, &
     210              :          POINTER                                         :: atomic_kind_set
     211              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     212              :          POINTER                                         :: particle_set
     213              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_particles
     214              :       TYPE(molecule_kind_type), DIMENSION(:), OPTIONAL, &
     215              :          POINTER                                         :: molecule_kind_set
     216              :       TYPE(molecule_type), DIMENSION(:), OPTIONAL, &
     217              :          POINTER                                         :: molecule_set
     218              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     219              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: force_env_input
     220              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell_ref
     221              :       INTEGER, OPTIONAL                                  :: sockfd
     222              : 
     223              :       TYPE(atomic_kind_list_type), POINTER               :: atomic_kinds
     224              :       TYPE(molecule_kind_list_type), POINTER             :: molecule_kinds
     225              :       TYPE(molecule_list_type), POINTER                  :: molecules
     226              :       TYPE(particle_list_type), POINTER                  :: particles
     227              : 
     228            0 :       IF (PRESENT(ipi_energy)) ipi_env%ipi_energy = ipi_energy
     229            0 :       IF (PRESENT(ipi_forces)) ipi_env%ipi_forces = ipi_forces
     230            0 :       IF (PRESENT(subsys)) THEN
     231            0 :          IF (ASSOCIATED(ipi_env%subsys)) THEN
     232            0 :             IF (.NOT. ASSOCIATED(ipi_env%subsys, subsys)) THEN
     233            0 :                CALL cp_subsys_release(ipi_env%subsys)
     234              :             END IF
     235              :          END IF
     236            0 :          ipi_env%subsys => subsys
     237              :       END IF
     238            0 :       IF (PRESENT(atomic_kind_set)) THEN
     239            0 :          CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
     240            0 :          CALL cp_subsys_set(ipi_env%subsys, atomic_kinds=atomic_kinds)
     241            0 :          CALL atomic_kind_list_release(atomic_kinds)
     242              :       END IF
     243            0 :       IF (PRESENT(particle_set)) THEN
     244            0 :          CALL particle_list_create(particles, els_ptr=particle_set)
     245            0 :          CALL cp_subsys_set(ipi_env%subsys, particles=particles)
     246            0 :          CALL particle_list_release(particles)
     247              :       END IF
     248            0 :       IF (PRESENT(molecule_kind_set)) THEN
     249            0 :          CALL molecule_kind_list_create(molecule_kinds, els_ptr=molecule_kind_set)
     250            0 :          CALL cp_subsys_set(ipi_env%subsys, molecule_kinds=molecule_kinds)
     251            0 :          CALL molecule_kind_list_release(molecule_kinds)
     252              :       END IF
     253            0 :       IF (PRESENT(molecule_set)) THEN
     254            0 :          CALL molecule_list_create(molecules, els_ptr=molecule_set)
     255            0 :          CALL cp_subsys_set(ipi_env%subsys, molecules=molecules)
     256            0 :          CALL molecule_list_release(molecules)
     257              :       END IF
     258            0 :       IF (PRESENT(local_particles)) THEN
     259            0 :          CALL cp_subsys_set(ipi_env%subsys, local_particles=local_particles)
     260              :       END IF
     261            0 :       IF (PRESENT(local_molecules)) THEN
     262            0 :          CALL cp_subsys_set(ipi_env%subsys, local_molecules=local_molecules)
     263              :       END IF
     264              : 
     265            0 :       IF (PRESENT(force_env_input)) THEN
     266            0 :          CALL section_vals_retain(force_env_input)
     267            0 :          CALL section_vals_release(ipi_env%force_env_input)
     268            0 :          ipi_env%force_env_input => force_env_input
     269              :       END IF
     270            0 :       IF (PRESENT(cell_ref)) THEN
     271            0 :          CALL cell_retain(cell_ref)
     272            0 :          CALL cell_release(ipi_env%cell_ref)
     273            0 :          ipi_env%cell_ref => cell_ref
     274              :       END IF
     275            0 :       IF (PRESENT(sockfd)) ipi_env%sockfd = sockfd
     276            0 :    END SUBROUTINE ipi_env_set
     277              : 
     278              : ! **************************************************************************************************
     279              : !> \brief Reinitializes the ipi environment
     280              : !> \param ipi_env The ipi environment to be reinitialized
     281              : !> \par History
     282              : !>      03.2024 initial create
     283              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
     284              : ! **************************************************************************************************
     285            0 :    SUBROUTINE ipi_env_clear(ipi_env)
     286              : 
     287              :       TYPE(ipi_environment_type), INTENT(INOUT)          :: ipi_env
     288              : 
     289            0 :       IF (ASSOCIATED(ipi_env%ipi_forces)) THEN
     290            0 :          ipi_env%ipi_forces(:, :) = 0.0_dp
     291              :       END IF
     292            0 :       IF (ASSOCIATED(ipi_env%subsys)) THEN
     293            0 :          CALL cp_subsys_release(ipi_env%subsys)
     294              :       END IF
     295            0 :       IF (ASSOCIATED(ipi_env%force_env_input)) THEN
     296            0 :          CALL section_vals_release(ipi_env%force_env_input)
     297              :       END IF
     298            0 :       IF (ASSOCIATED(ipi_env%cell_ref)) THEN
     299            0 :          CALL cell_release(ipi_env%cell_ref)
     300              :       END IF
     301            0 :    END SUBROUTINE ipi_env_clear
     302              : 
     303              : ! **************************************************************************************************
     304              : !> \brief Creates the ipi environment
     305              : !> \param ipi_env The ipi environment to be created
     306              : !> \par History
     307              : !>      03.2024 initial create
     308              : !> \author Sebastian Seidenath (sebastian.seidenath@uni-jena.de)
     309              : ! **************************************************************************************************
     310            0 :    SUBROUTINE ipi_env_create(ipi_env)
     311              : 
     312              :       TYPE(ipi_environment_type), INTENT(OUT)            :: ipi_env
     313              : 
     314              :       NULLIFY (ipi_env%ipi_forces)
     315              :       NULLIFY (ipi_env%subsys)
     316              :       NULLIFY (ipi_env%force_env_input)
     317              :       NULLIFY (ipi_env%cell_ref)
     318              : 
     319              :       ipi_env%ipi_energy = 0_dp
     320            0 :       ipi_env%sockfd = 0 ! stdinp
     321            0 :       CALL ipi_env_clear(ipi_env)
     322            0 :    END SUBROUTINE ipi_env_create
     323              : 
     324            0 : END MODULE ipi_environment_types
        

Generated by: LCOV version 2.0-1