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
|