LCOV - code coverage report
Current view: top level - src - sockets_interface.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 0 51 0.0 %
Date: 2024-11-21 06:45:46 Functions: 0 8 0.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 Implements UNIX and INET sockets
      10             : !> \par History
      11             : !>      08.2023 moved here and expanded for AS module by S. Battaglia
      12             : !>      03.2012 created by MC in ipi_driver.F
      13             : !> \author M. Ceriotti
      14             : ! **************************************************************************************************
      15             : 
      16             : MODULE sockets_interface
      17             : 
      18             :    USE ISO_C_BINDING,                   ONLY: C_CHAR,&
      19             :                                               C_DOUBLE,&
      20             :                                               C_INT,&
      21             :                                               C_LOC,&
      22             :                                               C_PTR
      23             :    USE kinds,                           ONLY: dp
      24             : #include "./base/base_uses.f90"
      25             : 
      26             :    IMPLICIT NONE
      27             :    PRIVATE
      28             : 
      29             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'sockets_interface'
      30             : 
      31             : #ifndef __NO_SOCKETS
      32             :    PUBLIC :: writebuffer, readbuffer, open_connect_socket, &
      33             :              uwait, open_bind_socket, listen_socket, &
      34             :              accept_socket, close_socket, remove_socket_file
      35             : 
      36             :    INTERFACE writebuffer
      37             :       MODULE PROCEDURE writebuffer_s, &
      38             :          writebuffer_d, writebuffer_dv, &
      39             :          writebuffer_i
      40             : 
      41             :    END INTERFACE
      42             : 
      43             :    INTERFACE readbuffer
      44             :       MODULE PROCEDURE readbuffer_s, &
      45             :          readbuffer_dv, readbuffer_d, &
      46             :          readbuffer_i
      47             : 
      48             :    END INTERFACE
      49             : 
      50             :    INTERFACE
      51             :       SUBROUTINE uwait(sec) BIND(C, NAME="uwait")
      52             :          USE ISO_C_BINDING, ONLY: C_DOUBLE
      53             :       REAL(C_DOUBLE)                                     :: sec
      54             : 
      55             :       END SUBROUTINE
      56             :    END INTERFACE
      57             : 
      58             :    INTERFACE
      59             :       SUBROUTINE open_connect_socket(psockfd, inet, port, host) BIND(C)
      60             :          IMPORT
      61             :          INTEGER(KIND=C_INT)                      :: psockfd, inet, port
      62             :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      63             : 
      64             :       END SUBROUTINE open_connect_socket
      65             : 
      66             :       SUBROUTINE open_bind_socket(psockfd, inet, port, host) BIND(C)
      67             :          IMPORT
      68             :          INTEGER(KIND=C_INT)                      :: psockfd, inet, port
      69             :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      70             : 
      71             :       END SUBROUTINE open_bind_socket
      72             : 
      73             :       SUBROUTINE listen_socket(psockfd, backlog) BIND(C)
      74             :          IMPORT
      75             :          INTEGER(KIND=C_INT)                      :: psockfd, backlog
      76             : 
      77             :       END SUBROUTINE listen_socket
      78             : 
      79             :       SUBROUTINE accept_socket(psockfd, pclientfd) BIND(C)
      80             :          IMPORT
      81             :          INTEGER(KIND=C_INT)                      :: psockfd, pclientfd
      82             : 
      83             :       END SUBROUTINE accept_socket
      84             : 
      85             :       SUBROUTINE close_socket(psockfd) BIND(C)
      86             :          IMPORT
      87             :          INTEGER(KIND=C_INT)                      :: psockfd
      88             : 
      89             :       END SUBROUTINE close_socket
      90             : 
      91             :       SUBROUTINE remove_socket_file(host) BIND(C)
      92             :          IMPORT
      93             :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      94             : 
      95             :       END SUBROUTINE remove_socket_file
      96             : 
      97             :       SUBROUTINE writebuffer_csocket(psockfd, pdata, plen) BIND(C, name="writebuffer")
      98             :          IMPORT
      99             :          INTEGER(KIND=C_INT)                      :: psockfd
     100             :          TYPE(C_PTR), VALUE                       :: pdata
     101             :          INTEGER(KIND=C_INT)                      :: plen
     102             : 
     103             :       END SUBROUTINE writebuffer_csocket
     104             : 
     105             :       SUBROUTINE readbuffer_csocket(psockfd, pdata, plen) BIND(C, name="readbuffer")
     106             :          IMPORT
     107             :          INTEGER(KIND=C_INT)                      :: psockfd
     108             :          TYPE(C_PTR), VALUE                       :: pdata
     109             :          INTEGER(KIND=C_INT)                      :: plen
     110             : 
     111             :       END SUBROUTINE readbuffer_csocket
     112             :    END INTERFACE
     113             : #endif
     114             : 
     115             : CONTAINS
     116             : 
     117             : #ifndef __NO_SOCKETS
     118             : ! **************************************************************************************************
     119             : !> \brief ...
     120             : !> \param psockfd ...
     121             : !> \param fdata ...
     122             : ! **************************************************************************************************
     123           0 :    SUBROUTINE writebuffer_d(psockfd, fdata)
     124             :       INTEGER, INTENT(IN)                                :: psockfd
     125             :       REAL(KIND=dp), INTENT(IN)                          :: fdata
     126             : 
     127             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_d'
     128             : 
     129             :       INTEGER                                            :: handle
     130             :       REAL(KIND=C_DOUBLE), TARGET                        :: cdata
     131             : 
     132           0 :       CALL timeset(routineN, handle)
     133             : 
     134           0 :       cdata = fdata
     135           0 :       CALL writebuffer_csocket(psockfd, c_loc(cdata), 8)
     136             : 
     137           0 :       CALL timestop(handle)
     138           0 :    END SUBROUTINE
     139             : 
     140             : ! **************************************************************************************************
     141             : !> \brief ...
     142             : !> \param psockfd ...
     143             : !> \param fdata ...
     144             : ! **************************************************************************************************
     145           0 :    SUBROUTINE writebuffer_i(psockfd, fdata)
     146             :       INTEGER, INTENT(IN)                                :: psockfd, fdata
     147             : 
     148             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_i'
     149             : 
     150             :       INTEGER                                            :: handle
     151             :       INTEGER(KIND=C_INT), TARGET                        :: cdata
     152             : 
     153           0 :       CALL timeset(routineN, handle)
     154             : 
     155           0 :       cdata = fdata
     156           0 :       CALL writebuffer_csocket(psockfd, c_loc(cdata), 4)
     157             : 
     158           0 :       CALL timestop(handle)
     159           0 :    END SUBROUTINE
     160             : 
     161             : ! **************************************************************************************************
     162             : !> \brief ...
     163             : !> \param psockfd ...
     164             : !> \param fstring ...
     165             : !> \param plen ...
     166             : ! **************************************************************************************************
     167           0 :    SUBROUTINE writebuffer_s(psockfd, fstring, plen)
     168             :       INTEGER, INTENT(IN)                                :: psockfd
     169             :       CHARACTER(LEN=*), INTENT(IN)                       :: fstring
     170             :       INTEGER, INTENT(IN)                                :: plen
     171             : 
     172             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_s'
     173             : 
     174             :       INTEGER                                            :: handle, i
     175           0 :       CHARACTER(LEN=1, KIND=C_CHAR), TARGET              :: cstring(plen)
     176             : 
     177           0 :       CALL timeset(routineN, handle)
     178             : 
     179           0 :       DO i = 1, plen
     180           0 :          cstring(i) = fstring(i:i)
     181             :       END DO
     182           0 :       CALL writebuffer_csocket(psockfd, c_loc(cstring(1)), plen)
     183             : 
     184           0 :       CALL timestop(handle)
     185             : 
     186           0 :    END SUBROUTINE
     187             : 
     188             : ! **************************************************************************************************
     189             : !> \brief ...
     190             : !> \param psockfd ...
     191             : !> \param fdata ...
     192             : !> \param plen ...
     193             : ! **************************************************************************************************
     194           0 :    SUBROUTINE writebuffer_dv(psockfd, fdata, plen)
     195             :       INTEGER, INTENT(IN)                                :: psockfd, plen
     196             :       REAL(KIND=dp), INTENT(IN), TARGET                  :: fdata(plen)
     197             : 
     198             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_dv'
     199             : 
     200             :       INTEGER                                            :: handle
     201             : 
     202           0 :       CALL timeset(routineN, handle)
     203             : 
     204           0 :       CALL writebuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
     205             : 
     206           0 :       CALL timestop(handle)
     207           0 :    END SUBROUTINE
     208             : 
     209             : ! **************************************************************************************************
     210             : !> \brief ...
     211             : !> \param psockfd ...
     212             : !> \param fdata ...
     213             : ! **************************************************************************************************
     214           0 :    SUBROUTINE readbuffer_d(psockfd, fdata)
     215             :       INTEGER, INTENT(IN)                                :: psockfd
     216             :       REAL(KIND=dp), INTENT(OUT)                         :: fdata
     217             : 
     218             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_d'
     219             : 
     220             :       INTEGER                                            :: handle
     221             :       REAL(KIND=C_DOUBLE), TARGET                        :: cdata
     222             : 
     223           0 :       CALL timeset(routineN, handle)
     224             : 
     225           0 :       CALL readbuffer_csocket(psockfd, c_loc(cdata), 8)
     226           0 :       fdata = cdata
     227             : 
     228           0 :       CALL timestop(handle)
     229           0 :    END SUBROUTINE
     230             : 
     231             : ! **************************************************************************************************
     232             : !> \brief ...
     233             : !> \param psockfd ...
     234             : !> \param fdata ...
     235             : ! **************************************************************************************************
     236           0 :    SUBROUTINE readbuffer_i(psockfd, fdata)
     237             :       INTEGER, INTENT(IN)                                :: psockfd
     238             :       INTEGER, INTENT(OUT)                               :: fdata
     239             : 
     240             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_i'
     241             : 
     242             :       INTEGER                                            :: handle
     243             :       INTEGER(KIND=C_INT), TARGET                        :: cdata
     244             : 
     245           0 :       CALL timeset(routineN, handle)
     246             : 
     247           0 :       CALL readbuffer_csocket(psockfd, c_loc(cdata), 4)
     248           0 :       fdata = cdata
     249             : 
     250           0 :       CALL timestop(handle)
     251           0 :    END SUBROUTINE
     252             : 
     253             : ! **************************************************************************************************
     254             : !> \brief ...
     255             : !> \param psockfd ...
     256             : !> \param fstring ...
     257             : !> \param plen ...
     258             : ! **************************************************************************************************
     259           0 :    SUBROUTINE readbuffer_s(psockfd, fstring, plen)
     260             :       INTEGER, INTENT(IN)                                :: psockfd
     261             :       CHARACTER(LEN=*), INTENT(OUT)                      :: fstring
     262             :       INTEGER, INTENT(IN)                                :: plen
     263             : 
     264             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_s'
     265             : 
     266             :       INTEGER                                            :: handle, i
     267           0 :       CHARACTER(LEN=1, KIND=C_CHAR), TARGET              :: cstring(plen)
     268             : 
     269           0 :       CALL timeset(routineN, handle)
     270             : 
     271           0 :       CALL readbuffer_csocket(psockfd, c_loc(cstring(1)), plen)
     272           0 :       fstring = ""
     273           0 :       DO i = 1, plen
     274           0 :          fstring(i:i) = cstring(i)
     275             :       END DO
     276             : 
     277           0 :       CALL timestop(handle)
     278             : 
     279           0 :    END SUBROUTINE
     280             : 
     281             : ! **************************************************************************************************
     282             : !> \brief ...
     283             : !> \param psockfd ...
     284             : !> \param fdata ...
     285             : !> \param plen ...
     286             : ! **************************************************************************************************
     287           0 :    SUBROUTINE readbuffer_dv(psockfd, fdata, plen)
     288             :       INTEGER, INTENT(IN)                                :: psockfd, plen
     289             :       REAL(KIND=dp), INTENT(OUT), TARGET                 :: fdata(plen)
     290             : 
     291             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_dv'
     292             : 
     293             :       INTEGER                                            :: handle
     294             : 
     295           0 :       CALL timeset(routineN, handle)
     296             : 
     297           0 :       CALL readbuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
     298             : 
     299           0 :       CALL timestop(handle)
     300             : 
     301           0 :    END SUBROUTINE
     302             : #endif
     303             : 
     304             : END MODULE sockets_interface

Generated by: LCOV version 1.15