(git:374b731)
Loading...
Searching...
No Matches
sockets_interface.F
Go to the documentation of this file.
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
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
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
115CONTAINS
116
117#ifndef __NO_SOCKETS
118! **************************************************************************************************
119!> \brief ...
120!> \param psockfd ...
121!> \param fdata ...
122! **************************************************************************************************
123 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 CALL timeset(routinen, handle)
133
134 cdata = fdata
135 CALL writebuffer_csocket(psockfd, c_loc(cdata), 8)
136
137 CALL timestop(handle)
138 END SUBROUTINE
139
140! **************************************************************************************************
141!> \brief ...
142!> \param psockfd ...
143!> \param fdata ...
144! **************************************************************************************************
145 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 CALL timeset(routinen, handle)
154
155 cdata = fdata
156 CALL writebuffer_csocket(psockfd, c_loc(cdata), 4)
157
158 CALL timestop(handle)
159 END SUBROUTINE
160
161! **************************************************************************************************
162!> \brief ...
163!> \param psockfd ...
164!> \param fstring ...
165!> \param plen ...
166! **************************************************************************************************
167 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 CHARACTER(LEN=1, KIND=C_CHAR), TARGET :: cstring(plen)
176
177 CALL timeset(routinen, handle)
178
179 DO i = 1, plen
180 cstring(i) = fstring(i:i)
181 END DO
182 CALL writebuffer_csocket(psockfd, c_loc(cstring(1)), plen)
183
184 CALL timestop(handle)
185
186 END SUBROUTINE
187
188! **************************************************************************************************
189!> \brief ...
190!> \param psockfd ...
191!> \param fdata ...
192!> \param plen ...
193! **************************************************************************************************
194 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 CALL timeset(routinen, handle)
203
204 CALL writebuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
205
206 CALL timestop(handle)
207 END SUBROUTINE
208
209! **************************************************************************************************
210!> \brief ...
211!> \param psockfd ...
212!> \param fdata ...
213! **************************************************************************************************
214 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 CALL timeset(routinen, handle)
224
225 CALL readbuffer_csocket(psockfd, c_loc(cdata), 8)
226 fdata = cdata
227
228 CALL timestop(handle)
229 END SUBROUTINE
230
231! **************************************************************************************************
232!> \brief ...
233!> \param psockfd ...
234!> \param fdata ...
235! **************************************************************************************************
236 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 CALL timeset(routinen, handle)
246
247 CALL readbuffer_csocket(psockfd, c_loc(cdata), 4)
248 fdata = cdata
249
250 CALL timestop(handle)
251 END SUBROUTINE
252
253! **************************************************************************************************
254!> \brief ...
255!> \param psockfd ...
256!> \param fstring ...
257!> \param plen ...
258! **************************************************************************************************
259 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 CHARACTER(LEN=1, KIND=C_CHAR), TARGET :: cstring(plen)
268
269 CALL timeset(routinen, handle)
270
271 CALL readbuffer_csocket(psockfd, c_loc(cstring(1)), plen)
272 fstring = ""
273 DO i = 1, plen
274 fstring(i:i) = cstring(i)
275 END DO
276
277 CALL timestop(handle)
278
279 END SUBROUTINE
280
281! **************************************************************************************************
282!> \brief ...
283!> \param psockfd ...
284!> \param fdata ...
285!> \param plen ...
286! **************************************************************************************************
287 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 CALL timeset(routinen, handle)
296
297 CALL readbuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
298
299 CALL timestop(handle)
300
301 END SUBROUTINE
302#endif
303
304END MODULE sockets_interface
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Implements UNIX and INET sockets.