Yet Another eXchange Tool  DO_NOT_EDIT_HERE
xt_redist_f.f90
Go to the documentation of this file.
1 
13 
14 !
15 ! Keywords:
16 ! Maintainer: Jörg Behrens <behrens@dkrz.de>
17 ! Moritz Hanke <hanke@dkrz.de>
18 ! Thomas Jahns <jahns@dkrz.de>
19 ! URL: https://doc.redmine.dkrz.de/yaxt/html/
20 !
21 ! Redistribution and use in source and binary forms, with or without
22 ! modification, are permitted provided that the following conditions are
23 ! met:
24 !
25 ! Redistributions of source code must retain the above copyright notice,
26 ! this list of conditions and the following disclaimer.
27 !
28 ! Redistributions in binary form must reproduce the above copyright
29 ! notice, this list of conditions and the following disclaimer in the
30 ! documentation and/or other materials provided with the distribution.
31 !
32 ! Neither the name of the DKRZ GmbH nor the names of its contributors
33 ! may be used to endorse or promote products derived from this software
34 ! without specific prior written permission.
35 !
36 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
37 ! IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
38 ! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
39 ! PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
40 ! OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
41 ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
42 ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
43 ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
44 ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45 ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46 ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 !
48 
54 
56  USE xt_core, ONLY: xt_abort, xt_mpi_fint_kind, i2, i4, i8
57  USE xt_xmap_abstract, ONLY: xt_xmap
58  USE iso_c_binding, ONLY: c_int, c_null_ptr, c_ptr, c_associated
59  USE xt_mpi, ONLY: mpi_address_kind
60  IMPLICIT NONE
61  PRIVATE
62  ! note: this type must not be extended to contain any other
63  ! components, its memory pattern has to match void * exactly, which
64  ! it does because of C constraints
65  TYPE, bind(c), PUBLIC :: xt_redist
66 #ifndef __G95__
67  PRIVATE
68 #endif
69  TYPE(c_ptr) :: cptr = c_null_ptr
70  END TYPE xt_redist
71 
72  TYPE, bind(c), PUBLIC :: xt_offset_ext
73  INTEGER(c_int) :: start, size, stride
74  END TYPE xt_offset_ext
75 
76  INTERFACE
77  ! this function must not be implemented in Fortran because
78  ! PGI 11.x chokes on that
79  FUNCTION xt_redist_f2c(redist) bind(c, name='xt_redist_f2c') RESULT(p)
80  IMPORT :: c_ptr, xt_redist
81  IMPLICIT NONE
82  TYPE(xt_redist), INTENT(in) :: redist
83  TYPE(c_ptr) :: p
84  END FUNCTION xt_redist_f2c
85  END INTERFACE
86 
87  INTERFACE xt_redist_delete
88  MODULE PROCEDURE xt_redist_delete_1
89  MODULE PROCEDURE xt_redist_delete_a1d
90  END INTERFACE xt_redist_delete
91 
92  INTERFACE
93  SUBROUTINE xt_redist_delete_c(redist) &
94  bind(c, name='xt_redist_delete')
95  IMPORT :: c_ptr
96  IMPLICIT NONE
97  TYPE(c_ptr), VALUE, INTENT(in) :: redist
98  END SUBROUTINE xt_redist_delete_c
99  END INTERFACE
100 
101  INTERFACE xt_is_null
102  MODULE PROCEDURE xt_redist_is_null
103  END INTERFACE xt_is_null
104 
105  INTERFACE xt_redist_s_exchange
106  MODULE PROCEDURE xt_redist_s_exchange1
107  MODULE PROCEDURE xt_redist_s_exchange_a1d
108  MODULE PROCEDURE xt_redist_s_exchange_i2_a1d
109  MODULE PROCEDURE xt_redist_s_exchange_i4_a1d
110  MODULE PROCEDURE xt_redist_s_exchange_i8_a1d
111  END INTERFACE xt_redist_s_exchange
112 
113  INTERFACE
114  SUBROUTINE xt_redist_s_exchange_c(redist, num_ptr, src_data_cptr, &
115  dst_data_cptr) bind(C, name='xt_redist_s_exchange')
116  import:: c_ptr, c_int
117  TYPE(c_ptr), VALUE, INTENT(in) :: redist
118  INTEGER(c_int), VALUE, INTENT(in) :: num_ptr
119  TYPE(c_ptr) :: src_data_cptr(num_ptr), dst_data_cptr(num_ptr)
120  END SUBROUTINE xt_redist_s_exchange_c
121 
122  FUNCTION xt_redist_get_mpi_comm(redist) &
123  bind(c, name='xt_redist_get_mpi_comm_c2f') result(comm)
124  IMPORT :: xt_redist, xt_mpi_fint_kind
125  TYPE(xt_redist), INTENT(in) :: redist
126  INTEGER(xt_mpi_fint_kind) :: comm
127  END FUNCTION xt_redist_get_mpi_comm
128 
129  FUNCTION xt_redist_collection_static_new_f(redists_f, num_redists, &
130  src_displacements, dst_displacements, comm_f) &
131  bind(c, name='xt_redist_collection_static_new_f') result(res)
132  IMPORT :: xt_redist, mpi_address_kind, c_ptr, xt_mpi_fint_kind
133  IMPLICIT NONE
134  TYPE(xt_redist), INTENT(in) :: redists_f(*)
135  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: num_redists
136  INTEGER(mpi_address_kind), INTENT(in) :: src_displacements(*), &
137  dst_displacements(*)
138  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: comm_f
139  TYPE(c_ptr) :: res
141 
142  FUNCTION xt_redist_collection_new_f(redists_f, num_redists, cache_size, &
143  comm_f) bind(C, name='xt_redist_collection_new_f') RESULT(res)
144  IMPORT :: xt_redist, mpi_address_kind, c_ptr, xt_mpi_fint_kind
145  IMPLICIT NONE
146  TYPE(xt_redist), INTENT(in) :: redists_f(*)
147  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: &
148  num_redists, cache_size, comm_f
149  TYPE(c_ptr) :: res
150  END FUNCTION xt_redist_collection_new_f
151 
152  FUNCTION xt_redist_p2p_ext_new_c2f(xmap, num_src_ext, src_extents, &
153  num_dst_ext, dst_extents, datatype) &
154  bind(c, name='xt_redist_p2p_ext_new_c2f') result(redist)
155  IMPORT :: c_int, c_ptr, xt_offset_ext, xt_mpi_fint_kind, xt_xmap
156  TYPE(xt_xmap), INTENT(in) :: xmap
157  INTEGER(c_int), VALUE, INTENT(in) :: num_src_ext, num_dst_ext
158  TYPE(xt_offset_ext), INTENT(in) :: src_extents(num_src_ext), &
159  dst_extents(num_dst_ext)
160  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: datatype
161  TYPE(c_ptr) :: redist
162  END FUNCTION xt_redist_p2p_ext_new_c2f
163 
164  FUNCTION xt_redist_repeat_new_c(redist_f, src_extent, dst_extent, &
165  num_repetitions, displacements) &
166  bind(c, name='xt_redist_repeat_new') result(res)
167  IMPORT :: xt_redist, mpi_address_kind, c_ptr, xt_mpi_fint_kind, c_int
168  IMPLICIT NONE
169  TYPE(c_ptr), VALUE, INTENT(in) :: redist_f
170  INTEGER(mpi_address_kind), VALUE, INTENT(in) :: src_extent, dst_extent
171  INTEGER(c_int), VALUE, INTENT(in) :: num_repetitions
172  INTEGER(c_int), INTENT(in) :: displacements(*)
173  TYPE(c_ptr) :: res
174  END FUNCTION xt_redist_repeat_new_c
175 
176  FUNCTION xt_redist_repeat_asym_new_c(redist_f, src_extent, dst_extent, &
177  num_repetitions, src_displacements, dst_displacements) &
178  bind(c, name='xt_redist_repeat_asym_new') result(res)
179  IMPORT :: xt_redist, mpi_address_kind, c_ptr, xt_mpi_fint_kind, c_int
180  IMPLICIT NONE
181  TYPE(c_ptr), VALUE, INTENT(in) :: redist_f
182  INTEGER(mpi_address_kind), VALUE, INTENT(in) :: src_extent, dst_extent
183  INTEGER(c_int), VALUE, INTENT(in) :: num_repetitions
184  INTEGER(c_int), INTENT(in) :: src_displacements(*), dst_displacements(*)
185  TYPE(c_ptr) :: res
186  END FUNCTION xt_redist_repeat_asym_new_c
187 
188  END INTERFACE
189 
191  MODULE PROCEDURE xt_redist_collection_static_new_a_i_2ak_i
192  MODULE PROCEDURE xt_redist_collection_static_new_a_2ak_i
193  END INTERFACE xt_redist_collection_static_new
194 
195  INTERFACE xt_redist_collection_new
196  MODULE PROCEDURE xt_redist_collection_new_a_3i
197  MODULE PROCEDURE xt_redist_collection_new_a_2i
198  MODULE PROCEDURE xt_redist_collection_new_a_i
199  END INTERFACE xt_redist_collection_new
200 
201  INTERFACE xt_redist_p2p_ext_new
202  MODULE PROCEDURE xt_redist_p2p_ext_new_i2_a1d_i2_a1d
203  MODULE PROCEDURE xt_redist_p2p_ext_new_i4_a1d_i4_a1d
204  MODULE PROCEDURE xt_redist_p2p_ext_new_i8_a1d_i8_a1d
205  MODULE PROCEDURE xt_redist_p2p_ext_new_a1d_a1d
206  END INTERFACE xt_redist_p2p_ext_new
207 
208  INTERFACE xt_redist_repeat_new
209  MODULE PROCEDURE xt_redist_repeat_new_i4_a1d
210  MODULE PROCEDURE xt_redist_repeat_new_a1d
211  MODULE PROCEDURE xt_redist_repeat_asym_new_i4_a1d
212  MODULE PROCEDURE xt_redist_repeat_asym_new_a1d
213  END INTERFACE xt_redist_repeat_new
214 
215  PUBLIC :: xt_redist_c2f, xt_redist_f2c, xt_is_null, xt_redist_copy, &
220  xt_redist_repeat_new, xt_redist_get_mpi_comm, xt_redist_p2p_ext_new
221 CONTAINS
222 
223  FUNCTION xt_redist_is_null(redist) RESULT(p)
224  TYPE(xt_redist), INTENT(in) :: redist
225  LOGICAL :: p
226  p = .NOT. c_associated(redist%cptr)
227  END FUNCTION xt_redist_is_null
228 
229  FUNCTION xt_redist_c2f(redist) RESULT(p)
230  TYPE(c_ptr), INTENT(in) :: redist
231  TYPE(xt_redist) :: p
232  p%cptr = redist
233  END FUNCTION xt_redist_c2f
234 
235  FUNCTION xt_redist_copy(redist) RESULT(redist_copy)
236  TYPE(xt_redist), INTENT(in) :: redist
237  TYPE(xt_redist) :: redist_copy
238  INTERFACE
239  FUNCTION xt_redist_copy_c(redist) bind(C, name='xt_redist_copy')
240  import:: c_ptr
241  TYPE(c_ptr), VALUE, INTENT(in) :: redist
242  TYPE(c_ptr) :: xt_redist_copy_c
243  END FUNCTION xt_redist_copy_c
244  END INTERFACE
245  redist_copy%cptr = xt_redist_copy_c(redist%cptr)
246  END FUNCTION xt_redist_copy
247 
248  SUBROUTINE xt_redist_delete_1(redist)
249  TYPE(xt_redist), INTENT(inout) :: redist
250  CALL xt_redist_delete_c(redist%cptr)
251  redist%cptr = c_null_ptr
252  END SUBROUTINE xt_redist_delete_1
253 
254  SUBROUTINE xt_redist_delete_a1d(redists)
255  TYPE(xt_redist), INTENT(inout) :: redists(:)
256  INTEGER :: i, n
257  n = SIZE(redists)
258  DO i = 1, n
259  CALL xt_redist_delete_c(redists(i)%cptr)
260  redists(i)%cptr = c_null_ptr
261  END DO
262  END SUBROUTINE xt_redist_delete_a1d
263 
264  SUBROUTINE xt_redist_s_exchange1(redist, src_data_cptr, dst_data_cptr)
265  TYPE(xt_redist), INTENT(in) :: redist
266  TYPE(c_ptr), INTENT(in) :: src_data_cptr, dst_data_cptr
267  INTERFACE
268  SUBROUTINE xt_redist_s_exchange1_c(redist, src_data_cptr, dst_data_cptr) &
269  bind(c, name='xt_redist_s_exchange1')
270  import:: c_ptr
271  TYPE(c_ptr), VALUE, INTENT(in) :: redist
272  TYPE(c_ptr), VALUE :: src_data_cptr, dst_data_cptr
273  END SUBROUTINE xt_redist_s_exchange1_c
274  END INTERFACE
275  CALL xt_redist_s_exchange1_c(xt_redist_f2c(redist), src_data_cptr, &
276  dst_data_cptr)
277  END SUBROUTINE xt_redist_s_exchange1
278 
279  SUBROUTINE xt_redist_s_exchange_a1d(redist, src_data_cptr, dst_data_cptr)
280  TYPE(xt_redist), INTENT(in) :: redist
281  TYPE(c_ptr), INTENT(in) :: src_data_cptr(:), dst_data_cptr(:)
282  INTEGER :: n
283  INTEGER(c_int) :: num_ptr_c
284  n = SIZE(src_data_cptr)
285  IF (n /= SIZE(dst_data_cptr) .OR. n > huge(1_c_int)) &
286  CALL xt_abort("invalid number of pointers", &
287  __file__, &
288  __line__)
289  num_ptr_c = int(n, c_int)
290  CALL xt_redist_s_exchange_c(xt_redist_f2c(redist), num_ptr_c, &
291  src_data_cptr, dst_data_cptr)
292  END SUBROUTINE xt_redist_s_exchange_a1d
293 
294  SUBROUTINE xt_redist_s_exchange_i2_a1d(redist, num_ptr, &
295  src_data_cptr, dst_data_cptr)
296  TYPE(xt_redist), INTENT(in) :: redist
297  INTEGER(i2), INTENT(in) :: num_ptr
298  TYPE(c_ptr), INTENT(in) :: src_data_cptr(num_ptr), dst_data_cptr(num_ptr)
299  INTEGER(c_int) :: num_ptr_c
300  IF (num_ptr < 0_i2) &
301  CALL xt_abort("invalid number of pointers", &
302  __file__, &
303  __line__)
304  num_ptr_c = int(num_ptr, c_int)
305  CALL xt_redist_s_exchange_c(xt_redist_f2c(redist), num_ptr_c, &
306  src_data_cptr, dst_data_cptr)
307  END SUBROUTINE xt_redist_s_exchange_i2_a1d
308 
309  SUBROUTINE xt_redist_s_exchange_i4_a1d(redist, num_ptr, &
310  src_data_cptr, dst_data_cptr)
311  TYPE(xt_redist), INTENT(in) :: redist
312  INTEGER(i4), INTENT(in) :: num_ptr
313  TYPE(c_ptr), INTENT(in) :: src_data_cptr(num_ptr), dst_data_cptr(num_ptr)
314  INTEGER(c_int) :: num_ptr_c
315  IF (num_ptr < 0_i4 .OR. num_ptr > huge(1_c_int)) &
316  CALL xt_abort("invalid number of pointers", &
317  __file__, &
318  __line__)
319  num_ptr_c = int(num_ptr, c_int)
320  CALL xt_redist_s_exchange_c(xt_redist_f2c(redist), num_ptr_c, &
321  src_data_cptr, dst_data_cptr)
322  END SUBROUTINE xt_redist_s_exchange_i4_a1d
323 
324  SUBROUTINE xt_redist_s_exchange_i8_a1d(redist, num_ptr, &
325  src_data_cptr, dst_data_cptr)
326  TYPE(xt_redist), INTENT(in) :: redist
327  INTEGER(i8), INTENT(in) :: num_ptr
328  TYPE(c_ptr), INTENT(in) :: src_data_cptr(num_ptr), dst_data_cptr(num_ptr)
329  INTEGER(c_int) :: num_ptr_c
330  IF (num_ptr < 0_i8 .OR. num_ptr > huge(1_c_int)) &
331  CALL xt_abort("invalid number of pointers", &
332  __file__, &
333  __line__)
334  num_ptr_c = int(num_ptr, c_int)
335  CALL xt_redist_s_exchange_c(xt_redist_f2c(redist), num_ptr_c, &
336  src_data_cptr, dst_data_cptr)
337  END SUBROUTINE xt_redist_s_exchange_i8_a1d
338 
339  FUNCTION xt_redist_p2p_new(xmap, datatype) RESULT(res)
340  IMPLICIT NONE
341  TYPE(xt_xmap), INTENT(in) :: xmap
342  INTEGER, VALUE, INTENT(in) :: datatype
343  TYPE(xt_redist) :: res
344 
345  INTERFACE
346  FUNCTION xt_redist_p2p_new_f(xmap, datatype) &
347  bind(c, name='xt_redist_p2p_new_f') result(res_ptr)
348  import:: xt_xmap, xt_redist, c_int, c_ptr, xt_mpi_fint_kind
349  IMPLICIT NONE
350  TYPE(xt_xmap), INTENT(in) :: xmap
351  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: datatype
352  TYPE(c_ptr) :: res_ptr
353  END FUNCTION xt_redist_p2p_new_f
354  END INTERFACE
355 
356  res = xt_redist_c2f(xt_redist_p2p_new_f(xmap, datatype))
357 
358  END FUNCTION xt_redist_p2p_new
359 
360  FUNCTION xt_redist_p2p_off_new(xmap, src_offsets, dst_offsets, datatype) &
361  result(res)
362  IMPLICIT NONE
363  TYPE(xt_xmap), INTENT(in) :: xmap
364  INTEGER, INTENT(in) :: src_offsets(*)
365  INTEGER, INTENT(in) :: dst_offsets(*)
366  INTEGER, VALUE, INTENT(in) :: datatype
367  TYPE(xt_redist) :: res
368 
369  INTERFACE
370  FUNCTION xt_redist_p2p_off_new_f(xmap, src_offsets, dst_offsets, &
371  datatype) bind(C, name='xt_redist_p2p_off_new_f') RESULT(res_ptr)
372  IMPORT :: xt_xmap, xt_redist, c_int, c_ptr, xt_mpi_fint_kind
373  IMPLICIT NONE
374  TYPE(xt_xmap), INTENT(in) :: xmap
375  INTEGER(xt_mpi_fint_kind), INTENT(in) :: src_offsets(*)
376  INTEGER(xt_mpi_fint_kind), INTENT(in) :: dst_offsets(*)
377  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: datatype
378  TYPE(c_ptr) :: res_ptr
379  END FUNCTION xt_redist_p2p_off_new_f
380  END INTERFACE
381 
382  res = xt_redist_c2f(&
383  xt_redist_p2p_off_new_f(xmap, src_offsets, dst_offsets, datatype))
384 
385  END FUNCTION xt_redist_p2p_off_new
386 
387  FUNCTION xt_redist_p2p_blocks_new(xmap, src_block_sizes, src_block_num, &
388  & dst_block_sizes, dst_block_num, &
389  & datatype) &
390  result(res)
391  IMPLICIT NONE
392  TYPE(xt_xmap), INTENT(in) :: xmap
393  INTEGER(c_int), INTENT(in) :: src_block_sizes(*)
394  INTEGER(c_int), VALUE, INTENT(in) :: src_block_num
395  INTEGER(c_int), INTENT(in) :: dst_block_sizes(*)
396  INTEGER(c_int), VALUE, INTENT(in) :: dst_block_num
397  INTEGER, VALUE, INTENT(in) :: datatype
398  TYPE(xt_redist) :: res
399  INTERFACE
400  FUNCTION xt_redist_p2p_blocks_new_f(xmap, &
401  & src_block_sizes, src_block_num, &
402  & dst_block_sizes, dst_block_num, &
403  & datatype) &
404  bind(c, name='xt_redist_p2p_blocks_new_f') result(res_ptr)
405  IMPORT :: xt_xmap, xt_mpi_fint_kind, xt_redist, c_int, c_ptr
406  IMPLICIT NONE
407  TYPE(xt_xmap), INTENT(in) :: xmap
408  INTEGER(c_int), INTENT(in) :: src_block_sizes(*)
409  INTEGER(c_int), VALUE, INTENT(in) :: src_block_num
410  INTEGER(c_int), INTENT(in) :: dst_block_sizes(*)
411  INTEGER(c_int), VALUE, INTENT(in) :: dst_block_num
412  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: datatype
413  TYPE(c_ptr) :: res_ptr
414  END FUNCTION xt_redist_p2p_blocks_new_f
415  END INTERFACE
416 
417  res = xt_redist_c2f(&
419  & src_block_sizes, src_block_num, &
420  & dst_block_sizes, dst_block_num, &
421  & datatype))
422  END FUNCTION xt_redist_p2p_blocks_new
423 
424  FUNCTION xt_redist_p2p_blocks_off_new(xmap, src_block_offsets, &
425  src_block_sizes, src_block_num, &
426  dst_block_offsets, dst_block_sizes, dst_block_num, &
427  datatype) RESULT(res)
428  IMPLICIT NONE
429  TYPE(xt_xmap), INTENT(in) :: xmap
430  INTEGER(c_int), INTENT(in) :: src_block_offsets(*)
431  INTEGER(c_int), INTENT(in) :: src_block_sizes(*)
432  INTEGER(c_int), VALUE, INTENT(in) :: src_block_num
433  INTEGER(c_int), INTENT(in) :: dst_block_offsets(*)
434  INTEGER(c_int), INTENT(in) :: dst_block_sizes(*)
435  INTEGER(c_int), VALUE, INTENT(in) :: dst_block_num
436  INTEGER, VALUE, INTENT(in) :: datatype
437  TYPE(xt_redist) :: res
438  INTERFACE
439  FUNCTION xt_redist_p2p_blocks_off_new_f(xmap, src_block_offsets, &
440  src_block_sizes, src_block_num, &
441  dst_block_offsets, dst_block_sizes, dst_block_num, &
442  datatype) bind(C, name='xt_redist_p2p_blocks_off_new_f') &
443  result(res_ptr)
444  IMPORT :: xt_xmap, xt_redist, xt_mpi_fint_kind, c_int, c_ptr
445  IMPLICIT NONE
446  TYPE(xt_xmap), INTENT(in) :: xmap
447  INTEGER(c_int), INTENT(in) :: src_block_offsets(*)
448  INTEGER(c_int), INTENT(in) :: src_block_sizes(*)
449  INTEGER(c_int), VALUE, INTENT(in) :: src_block_num
450  INTEGER(c_int), INTENT(in) :: dst_block_offsets(*)
451  INTEGER(c_int), INTENT(in) :: dst_block_sizes(*)
452  INTEGER(c_int), VALUE, INTENT(in) :: dst_block_num
453  INTEGER(xt_mpi_fint_kind), VALUE, INTENT(in) :: datatype
454  TYPE(c_ptr) :: res_ptr
455  END FUNCTION xt_redist_p2p_blocks_off_new_f
456  END INTERFACE
457 
458  res = xt_redist_c2f(&
459  xt_redist_p2p_blocks_off_new_f(xmap, src_block_offsets, &
460  src_block_sizes, src_block_num, &
461  dst_block_offsets, dst_block_sizes, dst_block_num, &
462  datatype))
463 
464  END FUNCTION xt_redist_p2p_blocks_off_new
465 
466  FUNCTION xt_redist_collection_static_new_a_i_2ak_i(redists, num_redists, &
467  src_displacements, dst_displacements, comm) RESULT(res)
468  TYPE(xt_redist), INTENT(in) :: redists(*)
469  INTEGER, INTENT(in) :: num_redists, comm
470  INTEGER(mpi_address_kind), INTENT(in) :: src_displacements(*), &
471  dst_displacements(*)
472  TYPE(xt_redist) :: res
473  INTEGER(c_int) :: num_redists_c
474 
475  num_redists_c = int(num_redists, c_int)
477  num_redists_c, src_displacements, dst_displacements, comm))
478  END FUNCTION xt_redist_collection_static_new_a_i_2ak_i
479 
480  FUNCTION xt_redist_collection_static_new_a_2ak_i(redists, &
481  src_displacements, dst_displacements, comm) RESULT(res)
482  TYPE(xt_redist), INTENT(in) :: redists(:)
483  INTEGER, INTENT(in) :: comm
484  INTEGER(mpi_address_kind), INTENT(in) :: src_displacements(:), &
485  dst_displacements(:)
486  TYPE(xt_redist) :: res
487  INTEGER :: num_redists
488  INTEGER(c_int) :: num_redists_c
489 
490  num_redists = SIZE(redists)
491  IF (num_redists > huge(1_c_int) &
492  .OR. num_redists /= SIZE(src_displacements) &
493  .OR. num_redists /= SIZE(dst_displacements)) &
494  CALL xt_abort("invalid number of redists", &
495  __file__, &
496  __line__)
497  num_redists_c = int(num_redists, c_int)
499  num_redists_c, src_displacements, dst_displacements, comm))
500  END FUNCTION xt_redist_collection_static_new_a_2ak_i
501 
502  FUNCTION xt_redist_collection_new_a_3i(redists, num_redists, cache_size, &
503  comm) RESULT(res)
504  TYPE(xt_redist), INTENT(in) :: redists(*)
505  INTEGER, INTENT(in) :: num_redists, cache_size, comm
506  TYPE(xt_redist) :: res
507 
508  res = xt_redist_c2f(xt_redist_collection_new_f(redists, num_redists, &
509  cache_size, comm))
510  END FUNCTION xt_redist_collection_new_a_3i
511 
512  FUNCTION xt_redist_collection_new_a_2i(redists, cache_size, comm) &
513  result(res)
514  TYPE(xt_redist), INTENT(in) :: redists(:)
515  INTEGER, INTENT(in) :: cache_size, comm
516  TYPE(xt_redist) :: res
517  INTEGER(c_int) :: num_redists_c
518 
519  num_redists_c = int(SIZE(redists), c_int)
521  num_redists_c, cache_size, comm))
522  END FUNCTION xt_redist_collection_new_a_2i
523 
524  FUNCTION xt_redist_collection_new_a_i(redists, comm) &
525  result(res)
526  TYPE(xt_redist), INTENT(in) :: redists(:)
527  INTEGER, INTENT(in) :: comm
528  TYPE(xt_redist) :: res
529 
530  res = xt_redist_collection_new_a_3i(redists, SIZE(redists), -1, comm)
531  END FUNCTION xt_redist_collection_new_a_i
532 
533 
534  FUNCTION xt_redist_repeat_new_i4_a1d(redist, src_extent, dst_extent, &
535  num_repetitions, displacements) RESULT(res)
536  TYPE(xt_redist), INTENT(in) :: redist
537  INTEGER(mpi_address_kind), INTENT(in) :: src_extent, dst_extent
538  INTEGER(i4), INTENT(in) :: num_repetitions
539  INTEGER(c_int), INTENT(in) :: displacements(num_repetitions)
540  TYPE(xt_redist) :: res
541 
542  res = xt_redist_c2f(xt_redist_repeat_new_c(xt_redist_f2c(redist), &
543  src_extent, dst_extent, num_repetitions, displacements))
544  END FUNCTION xt_redist_repeat_new_i4_a1d
545 
546  FUNCTION xt_redist_repeat_new_a1d(redist, src_extent, dst_extent, &
547  displacements) RESULT(res)
548  TYPE(xt_redist), INTENT(in) :: redist
549  INTEGER(mpi_address_kind), INTENT(in) :: src_extent, dst_extent
550  INTEGER(c_int), INTENT(in) :: displacements(:)
551  TYPE(xt_redist) :: res
552 
553  INTEGER(i4) :: num_repetitions
554 
555  num_repetitions = SIZE(displacements)
556  res = xt_redist_c2f(xt_redist_repeat_new_c(xt_redist_f2c(redist), &
557  src_extent, dst_extent, num_repetitions, displacements))
558  END FUNCTION xt_redist_repeat_new_a1d
559 
560  FUNCTION xt_redist_repeat_asym_new_i4_a1d(redist, src_extent, dst_extent, &
561  num_repetitions, src_displacements, dst_displacements) RESULT(res)
562  TYPE(xt_redist), INTENT(in) :: redist
563  INTEGER(mpi_address_kind), INTENT(in) :: src_extent, dst_extent
564  INTEGER(i4), INTENT(in) :: num_repetitions
565  INTEGER(c_int), INTENT(in) :: src_displacements(num_repetitions), &
566  & dst_displacements(num_repetitions)
567  TYPE(xt_redist) :: res
568  res = xt_redist_c2f(xt_redist_repeat_asym_new_c(xt_redist_f2c(redist), &
569  src_extent, dst_extent, num_repetitions, src_displacements, &
570  dst_displacements))
571  END FUNCTION xt_redist_repeat_asym_new_i4_a1d
572 
573  FUNCTION xt_redist_repeat_asym_new_a1d(redist, src_extent, dst_extent, &
574  src_displacements, dst_displacements) RESULT(res)
575  TYPE(xt_redist), INTENT(in) :: redist
576  INTEGER(mpi_address_kind), INTENT(in) :: src_extent, dst_extent
577  INTEGER(c_int), INTENT(in) :: src_displacements(:), dst_displacements(:)
578  TYPE(xt_redist) :: res
579 
580  INTEGER(i4) :: num_repetitions
581 
582  num_repetitions = SIZE(src_displacements)
583  IF (num_repetitions /= SIZE(dst_displacements)) &
584  CALL xt_abort("unequal size for src and dst displacements", &
585  __file__, &
586  __line__)
587 
588  res = xt_redist_c2f(xt_redist_repeat_asym_new_c(xt_redist_f2c(redist), &
589  src_extent, dst_extent, num_repetitions, src_displacements, &
590  dst_displacements))
591  END FUNCTION xt_redist_repeat_asym_new_a1d
592 
593  FUNCTION xt_redist_p2p_ext_new_i2_a1d_i2_a1d(xmap, num_src_ext, src_extents, &
594  num_dst_ext, dst_extents, datatype) RESULT(redist)
595  TYPE(xt_xmap), INTENT(in) :: xmap
596  INTEGER(i2), INTENT(in) :: num_src_ext, num_dst_ext
597  TYPE(xt_offset_ext), INTENT(in) :: src_extents(num_src_ext), &
598  dst_extents(num_dst_ext)
599  INTEGER, INTENT(in) :: datatype
600  TYPE(xt_redist) :: redist
601  INTEGER(c_int) :: num_src_ext_c, num_dst_ext_c
602  IF (num_src_ext < 0_i2 .OR. num_src_ext > huge(1_c_int) &
603  .OR. num_dst_ext < 0_i2 .OR. num_dst_ext > huge(1_c_int)) &
604  CALL xt_abort("invalid number of extents", &
605  __file__, &
606  __line__)
607  num_src_ext_c = int(num_src_ext, c_int)
608  num_dst_ext_c = int(num_dst_ext, c_int)
610  num_src_ext_c, src_extents, num_dst_ext_c, dst_extents, datatype))
611  END FUNCTION xt_redist_p2p_ext_new_i2_a1d_i2_a1d
612 
613  FUNCTION xt_redist_p2p_ext_new_i4_a1d_i4_a1d(xmap, num_src_ext, src_extents, &
614  num_dst_ext, dst_extents, datatype) RESULT(redist)
615  TYPE(xt_xmap), INTENT(in) :: xmap
616  INTEGER(i4), INTENT(in) :: num_src_ext, num_dst_ext
617  TYPE(xt_offset_ext), INTENT(in) :: src_extents(num_src_ext), &
618  dst_extents(num_dst_ext)
619  INTEGER, INTENT(in) :: datatype
620  TYPE(xt_redist) :: redist
621  INTEGER(c_int) :: num_src_ext_c, num_dst_ext_c
622  IF (num_src_ext < 0_i4 .OR. num_src_ext > huge(1_c_int) &
623  .OR. num_dst_ext < 0_i4 .OR. num_dst_ext > huge(1_c_int)) &
624  CALL xt_abort("invalid number of extents", &
625  __file__, &
626  __line__)
627  num_src_ext_c = int(num_src_ext, c_int)
628  num_dst_ext_c = int(num_dst_ext, c_int)
630  num_src_ext_c, src_extents, num_dst_ext_c, dst_extents, datatype))
631  END FUNCTION xt_redist_p2p_ext_new_i4_a1d_i4_a1d
632 
633  FUNCTION xt_redist_p2p_ext_new_i8_a1d_i8_a1d(xmap, num_src_ext, src_extents, &
634  num_dst_ext, dst_extents, datatype) RESULT(redist)
635  TYPE(xt_xmap), INTENT(in) :: xmap
636  INTEGER(i8), INTENT(in) :: num_src_ext, num_dst_ext
637  TYPE(xt_offset_ext), INTENT(in) :: src_extents(num_src_ext), &
638  dst_extents(num_dst_ext)
639  INTEGER, INTENT(in) :: datatype
640  TYPE(xt_redist) :: redist
641  INTEGER(c_int) :: num_src_ext_c, num_dst_ext_c
642  IF (num_src_ext < 0_i8 .OR. num_src_ext > huge(1_c_int) &
643  .OR. num_dst_ext < 0_i8 .OR. num_dst_ext > huge(1_c_int)) &
644  CALL xt_abort("invalid number of extents", &
645  __file__, &
646  __line__)
647  num_src_ext_c = int(num_src_ext, c_int)
648  num_dst_ext_c = int(num_dst_ext, c_int)
650  num_src_ext_c, src_extents, num_dst_ext_c, dst_extents, datatype))
651  END FUNCTION xt_redist_p2p_ext_new_i8_a1d_i8_a1d
652 
653  FUNCTION xt_redist_p2p_ext_new_a1d_a1d(xmap, src_extents, dst_extents, &
654  datatype) RESULT(redist)
655  TYPE(xt_xmap), INTENT(in) :: xmap
656  TYPE(xt_offset_ext), INTENT(in) :: src_extents(:), &
657  dst_extents(:)
658  INTEGER, INTENT(in) :: datatype
659  TYPE(xt_redist) :: redist
660  INTEGER :: num_src_ext, num_dst_ext
661  INTEGER(c_int) :: num_src_ext_c, num_dst_ext_c
662  num_src_ext = SIZE(src_extents)
663  num_dst_ext = SIZE(dst_extents)
664  IF (num_src_ext > huge(1_c_int) .OR. num_dst_ext > huge(1_c_int)) &
665  CALL xt_abort("invalid number of extents", &
666  __file__, &
667  __line__)
668  num_src_ext_c = int(num_src_ext, c_int)
669  num_dst_ext_c = int(num_dst_ext, c_int)
671  num_src_ext_c, src_extents, num_dst_ext_c, dst_extents, datatype))
672  END FUNCTION xt_redist_p2p_ext_new_a1d_a1d
673 
674 END MODULE xt_redist_base
675 !
676 ! Local Variables:
677 ! f90-continuation-indent: 5
678 ! coding: utf-8
679 ! indent-tabs-mode: nil
680 ! show-trailing-whitespace: t
681 ! require-trailing-newline: t
682 ! End:
683 !
Xt_redist xt_redist_repeat_new(Xt_redist redist, MPI_Aint src_extent, MPI_Aint dst_extent, int num_repetitions, const int displacements[num_repetitions])
integer, parameter, public i8
Definition: xt_core_f.f90:60
void xt_redist_delete(Xt_redist redist)
Definition: xt_redist.c:66
integer, parameter, public i4
Definition: xt_core_f.f90:59
Xt_redist xt_redist_p2p_blocks_off_new_f(struct xt_xmap_f *xmap_f, int *src_block_offsets, int *src_block_sizes, int src_block_num, int *dst_block_offsets, int *dst_block_sizes, int dst_block_num, MPI_Fint datatype_f)
Definition: yaxt_f2c.c:210
Xt_redist xt_redist_collection_static_new(Xt_redist *redists, int num_redists, const MPI_Aint src_displacements[num_redists], const MPI_Aint dst_displacements[num_redists], MPI_Comm comm)
void xt_redist_s_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data)
Definition: xt_redist.c:71
integer, parameter, public xt_mpi_fint_kind
Definition: xt_core_f.f90:66
integer, parameter, public i2
Definition: xt_core_f.f90:58
Xt_redist xt_redist_p2p_off_new_f(struct xt_xmap_f *xmap_f, MPI_Fint *src_offsets, MPI_Fint *dst_offsets, MPI_Fint datatype_f)
Definition: yaxt_f2c.c:241
Xt_redist xt_redist_collection_static_new_f(Xt_redist *redists, MPI_Fint num_redists, MPI_Aint *src_displacements, MPI_Aint *dst_displacements, MPI_Fint comm_f)
Definition: yaxt_f2c.c:259
Xt_redist xt_redist_p2p_ext_new(Xt_xmap xmap, int num_src_ext, const struct Xt_offset_ext src_extents[], int num_dst_ext, const struct Xt_offset_ext dst_extents[], MPI_Datatype datatype)
Xt_redist xt_redist_p2p_off_new(Xt_xmap xmap, const int *src_offsets, const int *dst_offsets, MPI_Datatype datatype)
void * xt_redist_p2p_ext_new_c2f(Xt_xmap *xmap, int num_src_ext, struct Xt_offset_ext src_extents[], int num_dst_ext, struct Xt_offset_ext dst_extents[], MPI_Fint datatype_f)
Definition: yaxt_f2c.c:318
Xt_redist xt_redist_collection_new_f(Xt_redist *redists, MPI_Fint num_redists, MPI_Fint cache_size, MPI_Fint comm_f)
Definition: yaxt_f2c.c:283
Xt_redist xt_redist_copy(Xt_redist redist)
Definition: xt_redist.c:61
type(xt_redist) function, public xt_redist_c2f(redist)
Xt_redist xt_redist_p2p_blocks_off_new(Xt_xmap xmap, const int *src_block_offsets, const int *src_block_sizes, int src_block_num, const int *dst_block_offsets, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype)
Xt_redist xt_redist_p2p_new_f(struct xt_xmap_f *xmap_f, MPI_Fint datatype_f)
Definition: yaxt_f2c.c:252
Xt_redist xt_redist_p2p_new(Xt_xmap xmap, MPI_Datatype datatype)
Xt_redist xt_redist_p2p_blocks_new(Xt_xmap xmap, const int *src_block_sizes, int src_block_num, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype)
void xt_redist_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data)
Definition: xt_redist.c:77
Xt_redist xt_redist_p2p_blocks_new_f(struct xt_xmap_f *xmap_f, int *src_block_sizes, int src_block_num, int *dst_block_sizes, int dst_block_num, MPI_Fint datatype_f)
Definition: yaxt_f2c.c:228
Xt_redist xt_redist_collection_new(Xt_redist *redists, int num_redists, int cache_size, MPI_Comm comm)