SURFEX v8.1
General documentation of Surfex
sharedmem_mod.F90
Go to the documentation of this file.
2 
3 ! Routines to allow use of shared memery segments in Fortran
4 
5 
6 ! Willem Deconinck and Mats Hamrud *ECMWF*
7 ! Original : July 2015
8 
9 
10 use, INTRINSIC :: iso_c_binding, only: c_ptr, c_int, c_null_ptr,c_size_t
11 USE parkind1 ,ONLY : jpim, jprb ,jprd
12 
13 
14 IMPLICIT NONE
15 
16 PRIVATE
17 
18 PUBLIC :: sharedmem
19 PUBLIC :: sharedmem_allocate
20 PUBLIC :: sharedmem_malloc_bytes
21 PUBLIC :: sharedmem_create
22 PUBLIC :: sharedmem_associate
23 PUBLIC :: sharedmem_advance
24 PUBLIC :: sharedmem_delete
25 
26 TYPE, bind(c) :: sharedmem
27 ! Memory buffer
28  TYPE(c_ptr), PRIVATE :: begin=c_null_ptr
29  INTEGER(C_SIZE_T), PRIVATE :: size=0 ! IN BYTES
30  TYPE(c_ptr), PRIVATE :: cptr=c_null_ptr
31  INTEGER(C_SIZE_T), PRIVATE :: offset=0 ! IN BYTES
32 END TYPE sharedmem
33 
34 
36 ! Associate fortran scalars/arrays with memory segment
37  MODULE PROCEDURE sharedmem_associate0_int32
38  MODULE PROCEDURE sharedmem_associate0_real32
39  MODULE PROCEDURE sharedmem_associate0_real64
40  MODULE PROCEDURE sharedmem_associate1_int32
41  MODULE PROCEDURE sharedmem_associate1_real32
42  MODULE PROCEDURE sharedmem_associate1_real64
43  MODULE PROCEDURE sharedmem_associate2_int32
44  MODULE PROCEDURE sharedmem_associate2_real32
45  MODULE PROCEDURE sharedmem_associate2_real64
46 END INTERFACE
47 
48 
49 INTERFACE
50 
51 ! EXTERNAL C FUNCTIONS USED IN THIS MODULE
52 ! ----------------------------------------
53 
54  SUBROUTINE sharedmem_advance_bytes(CPTR,BYTES) bind(C)
55  use, INTRINSIC :: iso_c_binding, only: c_ptr, c_size_t
56  TYPE(c_ptr) :: CPTR
57  INTEGER(C_SIZE_T), VALUE :: BYTES
58  END SUBROUTINE sharedmem_advance_bytes
59 
60  SUBROUTINE sharedmem_malloc_bytes(PTR,BYTES) bind(C)
61  use, INTRINSIC :: iso_c_binding, only: c_ptr, c_size_t
62  TYPE(c_ptr) :: PTR
63  INTEGER(C_SIZE_T), VALUE :: BYTES
64  END SUBROUTINE sharedmem_malloc_bytes
65 
66  SUBROUTINE sharedmem_free(PTR) bind(C)
67  use, INTRINSIC :: iso_c_binding, only: c_ptr
68  TYPE(c_ptr), INTENT(IN) :: PTR
69  END SUBROUTINE sharedmem_free
70 
71 END INTERFACE
72 
73 CONTAINS
74 !=========================================================================
75 SUBROUTINE sharedmem_create(HANDLE,CPTR,BYTES)
76 ! Create memory buffer object from c pointer
77 use, INTRINSIC :: iso_c_binding, only: c_ptr, c_size_t, c_f_pointer
78 TYPE(sharedmem), INTENT(OUT) :: HANDLE
79 TYPE(c_ptr) , INTENT(IN) :: CPTR
80 INTEGER(C_SIZE_T), INTENT(IN) :: BYTES
81 !------------------------------------------------------------------------
82 handle%BEGIN = cptr
83 handle%SIZE = bytes
84 handle%CPTR = handle%BEGIN
85 handle%OFFSET = 0
86 END SUBROUTINE sharedmem_create
87 !=========================================================================
88 SUBROUTINE sharedmem_allocate(HANDLE,BYTES)
89 ! Create memory buffer object from Fortran
90 use, INTRINSIC :: iso_c_binding, only: c_size_t
91 TYPE(sharedmem), INTENT(OUT) :: HANDLE
92 INTEGER(C_SIZE_T), INTENT(IN) :: BYTES
93 INTEGER(C_SIZE_T) :: SIZE
94 !------------------------------------------------------------------------
95 SIZE = bytes
96 CALL sharedmem_malloc_bytes(handle%BEGIN,size)
97 handle%SIZE = bytes
98 handle%CPTR = handle%BEGIN
99 handle%OFFSET = 0
100 END SUBROUTINE sharedmem_allocate
101 !=========================================================================
102 SUBROUTINE sharedmem_delete(HANDLE)
103 ! Free memory buffer
104 TYPE(sharedmem), INTENT(OUT) :: HANDLE
105 CALL sharedmem_free(handle%BEGIN)
106 END SUBROUTINE sharedmem_delete
107 !=========================================================================
108 
109 ! PRIVATE SUBROUTINES
110 ! -------------------
111 
112 SUBROUTINE sharedmem_associate0_int32(HANDLE,VALUE,ADVANCE)
113  use, INTRINSIC :: iso_c_binding
114  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
115  INTEGER(C_INT), INTENT(OUT) :: VALUE
116  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
117  INTEGER(C_INT), POINTER :: FPTR(:)
118  INTEGER(C_INT) :: K
119 
120  CALL c_f_pointer ( handle%CPTR , fptr , (/1/) )
121  VALUE = fptr(1)
122 
123  IF( PRESENT(advance) ) THEN
124  IF( advance ) THEN
125  CALL sharedmem_advance_bytes(handle%CPTR,c_sizeof(k))
126  handle%OFFSET = handle%OFFSET+c_sizeof(k)
127  ENDIF
128  ENDIF
129 
130 END SUBROUTINE sharedmem_associate0_int32
131 
132 SUBROUTINE sharedmem_associate0_real32(HANDLE,VALUE,ADVANCE)
133  use, INTRINSIC :: iso_c_binding
134  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
135  REAL(C_FLOAT), INTENT(OUT) :: VALUE
136  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
137  REAL(C_FLOAT), POINTER :: FPTR(:)
138  REAL(C_FLOAT) :: R
139 
140  CALL c_f_pointer ( handle%CPTR , fptr , (/1/) )
141  VALUE = fptr(1)
142 
143  IF( PRESENT(advance) ) THEN
144  IF( advance ) THEN
145  CALL sharedmem_advance_bytes(handle%CPTR,c_sizeof(r))
146  handle%OFFSET = handle%OFFSET+c_sizeof(r)
147 
148  ENDIF
149  ENDIF
150 
151 END SUBROUTINE sharedmem_associate0_real32
152 
153 SUBROUTINE sharedmem_associate0_real64(HANDLE,VALUE,ADVANCE)
154  use, INTRINSIC :: iso_c_binding
155  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
156  REAL(C_DOUBLE), INTENT(OUT) :: VALUE
157  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
158  REAL(C_DOUBLE), POINTER :: FPTR(:)
159  REAL(C_DOUBLE) :: R
160 
161  CALL c_f_pointer ( handle%CPTR , fptr , (/1/) )
162  VALUE = fptr(1)
163 
164  IF( PRESENT(advance) ) THEN
165  IF( advance ) THEN
166  CALL sharedmem_advance_bytes(handle%CPTR,c_sizeof(r))
167  handle%OFFSET = handle%OFFSET+c_sizeof(r)
168 
169  ENDIF
170  ENDIF
171 
172 END SUBROUTINE sharedmem_associate0_real64
173 
174 SUBROUTINE sharedmem_associate1_int32(HANDLE,SIZE,FPTR,ADVANCE)
175  use, INTRINSIC :: iso_c_binding
176  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
177  INTEGER(C_INT), INTENT(IN) :: SIZE
178  INTEGER(KIND=JPIM), POINTER, INTENT(OUT) :: FPTR(:)
179  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
180  INTEGER(C_INT) :: K
181 
182  CALL c_f_pointer ( handle%CPTR , fptr , (/size/) )
183 
184  IF( PRESENT(advance) ) THEN
185  IF( advance ) THEN
186  CALL sharedmem_advance_bytes(handle%CPTR,size*c_sizeof(k))
187  handle%OFFSET = handle%OFFSET+size*c_sizeof(k)
188  ENDIF
189  ENDIF
190 
191 END SUBROUTINE sharedmem_associate1_int32
192 
193 
194 SUBROUTINE sharedmem_associate1_real32(HANDLE,SIZE,FPTR,ADVANCE)
195  use, INTRINSIC :: iso_c_binding
196  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
197  INTEGER(C_INT), INTENT(IN) :: SIZE
198  REAL(C_FLOAT), POINTER, INTENT(OUT) :: FPTR(:)
199  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
200  REAL(C_FLOAT) :: R
201 
202  CALL c_f_pointer ( handle%CPTR , fptr , (/size/) )
203 
204  IF( PRESENT(advance) ) THEN
205  IF( advance ) THEN
206  CALL sharedmem_advance_bytes(handle%CPTR,size*c_sizeof(r))
207  handle%OFFSET = handle%OFFSET+size*c_sizeof(r)
208  ENDIF
209  ENDIF
210 
211 END SUBROUTINE sharedmem_associate1_real32
212 
213 
214 SUBROUTINE sharedmem_associate1_real64(HANDLE,SIZE,FPTR,ADVANCE)
215  use, INTRINSIC :: iso_c_binding
216  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
217  INTEGER(C_INT), INTENT(IN) :: SIZE
218  REAL(C_DOUBLE), POINTER, INTENT(OUT) :: FPTR(:)
219  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
220  REAL(C_DOUBLE) :: R
221 
222  CALL c_f_pointer ( handle%CPTR , fptr , (/size/) )
223 
224  IF( PRESENT(advance) ) THEN
225  IF( advance ) THEN
226  CALL sharedmem_advance_bytes(handle%CPTR,size*c_sizeof(r))
227  handle%OFFSET = handle%OFFSET+size*c_sizeof(r)
228  ENDIF
229  ENDIF
230 
231 END SUBROUTINE sharedmem_associate1_real64
232 
233 SUBROUTINE sharedmem_associate2_int32(HANDLE,DIM1,DIM2,FPTR,ADVANCE)
234  use, INTRINSIC :: iso_c_binding
235  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
236  INTEGER(C_INT), INTENT(IN) :: DIM1,DIM2
237  INTEGER(C_INT), POINTER, INTENT(OUT) :: FPTR(:,:)
238  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
239  INTEGER(C_INT) :: K
240 
241  CALL c_f_pointer ( handle%CPTR , fptr , (/dim1,dim2/) )
242 
243  IF( PRESENT(advance) ) THEN
244  IF( advance ) THEN
245  CALL sharedmem_advance_bytes(handle%CPTR,dim1*dim2*c_sizeof(k))
246  handle%OFFSET = handle%OFFSET+dim1*dim2*c_sizeof(k)
247  ENDIF
248  ENDIF
249 
250 END SUBROUTINE sharedmem_associate2_int32
251 
252 
253 SUBROUTINE sharedmem_associate2_real32(HANDLE,DIM1,DIM2,FPTR,ADVANCE)
254  use, INTRINSIC :: iso_c_binding
255  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
256  INTEGER(C_INT), INTENT(IN) :: DIM1,DIM2
257  REAL(C_FLOAT), POINTER, INTENT(OUT) :: FPTR(:,:)
258  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
259  REAL(C_FLOAT) :: R
260 
261  CALL c_f_pointer ( handle%CPTR , fptr , (/dim1,dim2/) )
262 
263  IF( PRESENT(advance) ) THEN
264  IF( advance ) THEN
265  CALL sharedmem_advance_bytes(handle%CPTR,dim1*dim2*c_sizeof(r))
266  handle%OFFSET = handle%OFFSET+dim1*dim2*c_sizeof(r)
267  ENDIF
268  ENDIF
269 
270 END SUBROUTINE sharedmem_associate2_real32
271 
272 
273 SUBROUTINE sharedmem_associate2_real64(HANDLE,DIM1,DIM2,FPTR,ADVANCE)
274  use, INTRINSIC :: iso_c_binding
275  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
276  INTEGER(C_INT), INTENT(IN) :: DIM1,DIM2
277  REAL(C_DOUBLE), POINTER, INTENT(OUT) :: FPTR(:,:)
278  LOGICAL, OPTIONAL, INTENT(IN) :: ADVANCE
279  REAL(C_DOUBLE) :: R
280 
281  CALL c_f_pointer ( handle%CPTR , fptr , (/dim1,dim2/) )
282 
283  IF( PRESENT(advance) ) THEN
284  IF( advance ) THEN
285  CALL sharedmem_advance_bytes(handle%CPTR,dim1*dim2*c_sizeof(r))
286  handle%OFFSET = handle%OFFSET+dim1*dim2*c_sizeof(r)
287  ENDIF
288  ENDIF
289 
290 END SUBROUTINE sharedmem_associate2_real64
291 
292 SUBROUTINE sharedmem_advance(HANDLE,BYTES)
293  use, INTRINSIC :: iso_c_binding
294  TYPE(sharedmem), INTENT(INOUT) :: HANDLE
295  INTEGER(C_INT), INTENT(IN) :: BYTES
296  INTEGER(C_SIZE_T) :: SIZE
297  SIZE = bytes
298  CALL sharedmem_advance_bytes(handle%CPTR,size)
299  handle%OFFSET = handle%OFFSET+bytes
300 END SUBROUTINE sharedmem_advance
301 
302 !============================================================================
303 END MODULE sharedmem_mod
static long size
Definition: bytes_io.c:262
subroutine, public sharedmem_delete(HANDLE)
subroutine, public sharedmem_allocate(HANDLE, BYTES)
integer, parameter jpim
Definition: parkind1.F90:13
integer, parameter jprd
Definition: parkind1.F90:39
subroutine sharedmem_associate1_int32(HANDLE, SIZE, FPTR, ADVANCE)
subroutine, public sharedmem_advance(HANDLE, BYTES)
subroutine sharedmem_associate1_real32(HANDLE, SIZE, FPTR, ADVANCE)
subroutine sharedmem_associate0_int32(HANDLE, VALUE, ADVANCE)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine sharedmem_associate0_real64(HANDLE, VALUE, ADVANCE)
subroutine sharedmem_associate2_int32(HANDLE, DIM1, DIM2, FPTR, ADVANCE)
subroutine sharedmem_associate2_real64(HANDLE, DIM1, DIM2, FPTR, ADVANCE)
void sharedmem_malloc_bytes(void **ptr, size_t bytes)
Definition: sharedmem.c:4
void sharedmem_free(void **ptr)
Definition: sharedmem.c:9
subroutine, public sharedmem_create(HANDLE, CPTR, BYTES)
subroutine sharedmem_associate0_real32(HANDLE, VALUE, ADVANCE)
subroutine sharedmem_associate1_real64(HANDLE, SIZE, FPTR, ADVANCE)
void sharedmem_advance_bytes(void **ptr, size_t bytes)
Definition: sharedmem.c:14
subroutine sharedmem_associate2_real32(HANDLE, DIM1, DIM2, FPTR, ADVANCE)