49 USE iso_c_binding,
ONLY: c_int, c_ptr, c_null_ptr, &
50 c_associated, c_f_pointer, c_loc
76 TYPE,
BIND(C),
PUBLIC :: xt_xmap
80 TYPE(c_ptr) :: cptr = c_null_ptr
83 TYPE,
BIND(c),
PUBLIC :: xt_xmap_iter
87 TYPE(c_ptr) :: cptr = c_null_ptr
98 FUNCTION xt_xmap_f2c(xmap) bind(c, name='xt_xmap_f2c')
RESULT(p)
101 TYPE(
xt_xmap),
INTENT(in) :: xmap
105 SUBROUTINE xt_xmap_delete_c(xmap) bind(C, name='xt_xmap_delete')
108 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
109 END SUBROUTINE xt_xmap_delete_c
114 MODULE PROCEDURE xt_xmap_delete_1
115 MODULE PROCEDURE xt_xmap_delete_a1d
119 MODULE PROCEDURE xt_xmap_is_null
120 MODULE PROCEDURE xt_xmap_iterator_is_null
121 END INTERFACE xt_is_null
124 FUNCTION xt_xmap_iterator_get_num_transfer_pos_c(iter)
RESULT(num) &
125 bind(c, name=
'xt_xmap_iterator_get_num_transfer_pos')
126 IMPORT :: c_int, c_ptr
127 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
128 INTEGER(c_int) :: num
129 END FUNCTION xt_xmap_iterator_get_num_transfer_pos_c
131 FUNCTION xt_xmap_iterator_get_num_transfer_pos_ext_c(iter)
RESULT(num) &
132 bind(c, name=
'xt_xmap_iterator_get_num_transfer_pos_ext')
133 IMPORT :: c_int, c_ptr
134 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
135 INTEGER(c_int) :: num
136 END FUNCTION xt_xmap_iterator_get_num_transfer_pos_ext_c
140 MODULE PROCEDURE xt_xmap_spread_a1d
141 MODULE PROCEDURE xt_xmap_spread_i2_a1d
142 MODULE PROCEDURE xt_xmap_spread_i4_a1d
143 MODULE PROCEDURE xt_xmap_spread_i8_a1d
146 CHARACTER(len=*),
PARAMETER :: filename =
'xt_xmap_f.f90'
149 FUNCTION xt_xmap_is_null(xmap)
RESULT(p)
150 TYPE(
xt_xmap),
INTENT(in) :: xmap
152 p = .NOT. c_associated(xmap%cptr)
153 END FUNCTION xt_xmap_is_null
157 TYPE(c_ptr),
INTENT(in) :: xmap
163 TYPE(
xt_xmap),
INTENT(in) :: xmap
166 FUNCTION xt_xmap_copy_c(xmap) bind(C, name='xt_xmap_copy')
RESULT(res_ptr)
169 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
170 TYPE(c_ptr) :: res_ptr
171 END FUNCTION xt_xmap_copy_c
173 xmap_copy%cptr = xt_xmap_copy_c(xmap%cptr)
175 SUBROUTINE xt_xmap_delete_1(xmap)
176 TYPE(
xt_xmap),
INTENT(inout) :: xmap
178 xmap%cptr = c_null_ptr
179 END SUBROUTINE xt_xmap_delete_1
181 SUBROUTINE xt_xmap_delete_a1d(xmaps)
182 TYPE(
xt_xmap),
INTENT(inout) :: xmaps(:)
187 xmaps(i)%cptr = c_null_ptr
189 END SUBROUTINE xt_xmap_delete_a1d
193 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist
194 TYPE(xt_idxlist),
INTENT(in) :: dst_idxlist
195 INTEGER,
VALUE,
INTENT(in) :: comm
199 FUNCTION xt_xmap_all2all_new_f(src_idxlist, dst_idxlist, comm) &
200 bind(c, name=
'xt_xmap_all2all_new_f') result(xmap_ptr)
201 IMPORT :: xt_idxlist,
xt_xmap, xt_mpi_fint_kind, c_ptr
203 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist, dst_idxlist
204 INTEGER(xt_mpi_fint_kind),
VALUE,
INTENT(in) :: comm
205 TYPE(c_ptr) :: xmap_ptr
206 END FUNCTION xt_xmap_all2all_new_f
209 xmap =
xt_xmap_c2f(xt_xmap_all2all_new_f(src_idxlist, dst_idxlist, comm))
214 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist
215 TYPE(xt_idxlist),
INTENT(in) :: dst_idxlist
216 INTEGER,
VALUE,
INTENT(in) :: comm
221 bind(c, name=
'xt_xmap_dist_dir_new_f') result(xmap_ptr)
222 IMPORT :: xt_idxlist,
xt_xmap, xt_mpi_fint_kind, c_ptr
224 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist, dst_idxlist
225 INTEGER(xt_mpi_fint_kind),
VALUE,
INTENT(in) :: comm
226 TYPE(c_ptr) :: xmap_ptr
234 inter_comm, intra_comm)
RESULT(xmap)
236 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist
237 TYPE(xt_idxlist),
INTENT(in) :: dst_idxlist
238 INTEGER,
VALUE,
INTENT(in) :: inter_comm, intra_comm
243 inter_comm, intra_comm) &
244 bind(c, name=
'xt_xmap_dist_dir_intercomm_new_f') result(xmap_ptr)
245 IMPORT :: xt_idxlist,
xt_xmap, xt_mpi_fint_kind, c_ptr
247 TYPE(xt_idxlist),
INTENT(in) :: src_idxlist, dst_idxlist
248 INTEGER(xt_mpi_fint_kind),
VALUE,
INTENT(in) :: inter_comm, intra_comm
249 TYPE(c_ptr) :: xmap_ptr
254 dst_idxlist, inter_comm, intra_comm))
258 TYPE(
xt_xmap),
INTENT(in) :: xmap
261 FUNCTION xt_xmap_get_num_destinations_c(xmap)
RESULT(num) &
262 bind(c, name=
'xt_xmap_get_num_destinations')
263 IMPORT :: c_ptr, c_int
265 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
266 INTEGER(c_int) :: num
267 END FUNCTION xt_xmap_get_num_destinations_c
269 num = int(xt_xmap_get_num_destinations_c(xmap%cptr))
273 TYPE(
xt_xmap),
INTENT(in) :: xmap
276 FUNCTION xt_xmap_get_num_sources_c(xmap)
RESULT(num) &
277 bind(c, name=
'xt_xmap_get_num_sources')
278 IMPORT :: c_ptr, c_int
280 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
281 INTEGER(c_int) :: num
282 END FUNCTION xt_xmap_get_num_sources_c
284 num = int(xt_xmap_get_num_sources_c(xmap%cptr))
288 TYPE(
xt_xmap),
INTENT(in) :: xmap
289 INTEGER(c_int),
INTENT(out) :: ranks(*)
291 SUBROUTINE xt_xmap_get_destination_ranks_c(xmap, ranks) &
292 bind(c, name=
'xt_xmap_get_destination_ranks')
293 IMPORT :: c_ptr, c_int
295 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
296 INTEGER(c_int),
INTENT(out) :: ranks(*)
297 END SUBROUTINE xt_xmap_get_destination_ranks_c
299 CALL xt_xmap_get_destination_ranks_c(xmap%cptr, ranks)
303 TYPE(
xt_xmap),
INTENT(in) :: xmap
304 INTEGER(c_int),
INTENT(out) :: ranks(*)
306 SUBROUTINE xt_xmap_get_source_ranks_c(xmap, ranks) &
307 bind(c, name=
'xt_xmap_get_source_ranks')
308 IMPORT :: c_ptr, c_int
310 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
311 INTEGER(c_int),
INTENT(out) :: ranks(*)
312 END SUBROUTINE xt_xmap_get_source_ranks_c
314 CALL xt_xmap_get_source_ranks_c(xmap%cptr, ranks)
318 TYPE(
xt_xmap),
INTENT(in) :: xmap
321 FUNCTION xt_xmap_get_max_src_pos_c(xmap)
RESULT(num) &
322 bind(c, name=
'xt_xmap_get_max_src_pos')
323 IMPORT :: c_ptr, c_int
325 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
326 INTEGER(c_int) :: num
327 END FUNCTION xt_xmap_get_max_src_pos_c
329 num = int(xt_xmap_get_max_src_pos_c(xmap%cptr))
333 TYPE(
xt_xmap),
INTENT(in) :: xmap
336 FUNCTION xt_xmap_get_max_dst_pos_c(xmap)
RESULT(num) &
337 bind(c, name=
'xt_xmap_get_max_dst_pos')
338 IMPORT :: c_ptr, c_int
340 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
341 INTEGER(c_int) :: num
342 END FUNCTION xt_xmap_get_max_dst_pos_c
344 num = int(xt_xmap_get_max_dst_pos_c(xmap%cptr))
349 TYPE(
xt_xmap),
INTENT(in) :: xmap
350 INTEGER(xt_reorder_type_kind),
INTENT(in) :: reorder_type
353 FUNCTION xt_xmap_reorder_c(xmap, reorder_type) &
354 bind(c, name=
'xt_xmap_reorder') result(xmap_reorder_ptr)
356 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
357 INTEGER(xt_reorder_type_kind),
VALUE,
INTENT(in) :: reorder_type
358 TYPE(c_ptr) :: xmap_reorder_ptr
359 END FUNCTION xt_xmap_reorder_c
362 IF (reorder_type < 0_xt_reorder_type_kind .OR. &
363 reorder_type > huge(1_c_int)) &
364 CALL xt_abort(
"invalid reorder type", filename, __line__)
365 xmap_reorder%cptr = xt_xmap_reorder_c(xmap%cptr, reorder_type)
371 TYPE(
xt_xmap),
INTENT(in) :: xmap
372 INTEGER,
TARGET,
INTENT(in) :: src_positions(*)
373 INTEGER,
TARGET,
INTENT(in) :: dst_positions(*)
375 INTEGER(c_int),
TARGET,
ALLOCATABLE :: src_positions_c(:), dst_positions_c(:)
376 TYPE(c_ptr) :: src_positions_p, dst_positions_p
378 FUNCTION xt_xmap_update_positions_c(xmap, src_positions, dst_positions) &
379 bind(c, name=
'xt_xmap_update_positions') result(xmap_updated_ptr)
381 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap, src_positions, dst_positions
382 TYPE(c_ptr) :: xmap_updated_ptr
383 END FUNCTION xt_xmap_update_positions_c
386 IF (c_int == kind(1))
THEN
387 src_positions_p = c_loc(src_positions)
388 dst_positions_p = c_loc(dst_positions)
391 src_positions_p = c_loc(src_positions_c)
393 dst_positions_p = c_loc(dst_positions_c)
395 xmap_updated%cptr = &
396 xt_xmap_update_positions_c(xmap%cptr, src_positions_p, dst_positions_p)
398 SUBROUTINE arg2ci(n, arg, argc)
399 INTEGER,
INTENT(in) :: n, arg(*)
400 INTEGER(c_int),
ALLOCATABLE,
INTENT(inout) :: argc(:)
404 argc(i) = int(arg(i), c_int)
406 END SUBROUTINE arg2ci
409 FUNCTION xt_xmap_spread_a1d(xmap, src_displacements, dst_displacements) &
412 TYPE(
xt_xmap),
INTENT(in) :: xmap
413 INTEGER,
INTENT(in) :: src_displacements(:)
414 INTEGER,
INTENT(in) :: dst_displacements(:)
416 INTEGER :: num_repetitions
417 INTEGER(i8) :: num_repetitions_i8
418 num_repetitions =
SIZE(src_displacements)
419 IF (num_repetitions /=
SIZE(dst_displacements)) &
420 CALL xt_abort(
"invalid number of repetitions", filename, __line__)
421 num_repetitions_i8 = int(num_repetitions, i8)
424 xmap, num_repetitions_i8, src_displacements, dst_displacements);
425 END FUNCTION xt_xmap_spread_a1d
427 FUNCTION xt_xmap_spread_i2_a1d(xmap, num_repetitions, src_displacements, &
431 TYPE(
xt_xmap),
INTENT(in) :: xmap
432 INTEGER(i2),
INTENT(in) :: num_repetitions
433 INTEGER,
INTENT(in) :: src_displacements(num_repetitions)
434 INTEGER,
INTENT(in) :: dst_displacements(num_repetitions)
436 INTEGER(i8) :: num_repetitions_i8
437 num_repetitions_i8 = int(num_repetitions, i8)
440 xmap, num_repetitions_i8, src_displacements, dst_displacements);
441 END FUNCTION xt_xmap_spread_i2_a1d
443 FUNCTION xt_xmap_spread_i4_a1d(xmap, num_repetitions, src_displacements, &
447 TYPE(
xt_xmap),
INTENT(in) :: xmap
448 INTEGER(i4),
INTENT(in) :: num_repetitions
449 INTEGER,
INTENT(in) :: src_displacements(num_repetitions)
450 INTEGER,
INTENT(in) :: dst_displacements(num_repetitions)
452 INTEGER(i8) :: num_repetitions_i8
453 num_repetitions_i8 = int(num_repetitions, i8)
456 xmap, num_repetitions_i8, src_displacements, dst_displacements);
457 END FUNCTION xt_xmap_spread_i4_a1d
459 FUNCTION xt_xmap_spread_i8_a1d(xmap, num_repetitions, src_displacements, &
463 TYPE(
xt_xmap),
INTENT(in) :: xmap
464 INTEGER(i8),
INTENT(in) :: num_repetitions
465 INTEGER,
TARGET,
INTENT(in) :: src_displacements(num_repetitions)
466 INTEGER,
TARGET,
INTENT(in) :: dst_displacements(num_repetitions)
467 INTEGER(c_int) :: num_repetitions_c
469 INTEGER(c_int),
TARGET,
ALLOCATABLE :: &
470 src_displacements_c(:), dst_displacements_c(:)
471 TYPE(c_ptr) :: src_displacements_p, dst_displacements_p
473 FUNCTION xt_xmap_spread_c(xmap, num_repetitions, src_displacements, &
475 bind(c, name=
'xt_xmap_spread') result(xmap_spread_ptr)
476 import:: c_ptr, c_int
477 TYPE(c_ptr),
VALUE,
INTENT(in) :: &
478 xmap, src_displacements, dst_displacements
479 INTEGER(c_int),
VALUE,
INTENT(in) :: num_repetitions
480 TYPE(c_ptr) :: xmap_spread_ptr
481 END FUNCTION xt_xmap_spread_c
483 IF (num_repetitions < 0_c_int .OR. &
484 num_repetitions > huge(1_c_int)) &
485 CALL xt_abort(
"invalid number of extents", filename, __line__)
486 num_repetitions_c = int(num_repetitions, c_int)
487 IF (c_int == kind(1))
THEN
488 src_displacements_p = c_loc(src_displacements)
489 dst_displacements_p = c_loc(dst_displacements)
491 CALL arg2ci(src_displacements, src_displacements_c)
492 src_displacements_p = c_loc(src_displacements_c)
493 CALL arg2ci(dst_displacements, dst_displacements_c)
494 dst_displacements_p = c_loc(dst_displacements_c)
498 xmap%cptr, num_repetitions_c, src_displacements_p, dst_displacements_p)
500 SUBROUTINE arg2ci(arg, argc)
501 INTEGER,
INTENT(in) :: arg(*)
502 INTEGER(c_int),
ALLOCATABLE,
INTENT(inout) :: argc(:)
504 n = int(num_repetitions)
507 argc(i) = int(arg(i), c_int)
509 END SUBROUTINE arg2ci
510 END FUNCTION xt_xmap_spread_i8_a1d
513 TYPE(
xt_xmap),
INTENT(in) :: xmap
516 FUNCTION xt_xmap_get_out_iterator_c(xmap)
RESULT(cptr) &
517 bind(c, name=
'xt_xmap_get_out_iterator')
519 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
521 END FUNCTION xt_xmap_get_out_iterator_c
523 iter%cptr = xt_xmap_get_out_iterator_c(xmap%cptr)
527 TYPE(
xt_xmap),
INTENT(in) :: xmap
530 FUNCTION xt_xmap_get_in_iterator_c(xmap)
RESULT(cptr) &
531 bind(c, name=
'xt_xmap_get_in_iterator')
533 TYPE(c_ptr),
VALUE,
INTENT(in) :: xmap
535 END FUNCTION xt_xmap_get_in_iterator_c
537 iter%cptr = xt_xmap_get_in_iterator_c(xmap%cptr)
540 FUNCTION xt_xmap_iterator_is_null(iter)
RESULT(p)
543 p = .NOT. c_associated(iter%cptr)
544 END FUNCTION xt_xmap_iterator_is_null
550 FUNCTION xt_xmap_iterator_next_c(iter)
RESULT(avail) &
551 bind(c, name=
'xt_xmap_iterator_next')
552 IMPORT :: c_ptr, c_int
553 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
554 INTEGER(c_int) :: avail
555 END FUNCTION xt_xmap_iterator_next_c
557 avail = xt_xmap_iterator_next_c(iter%cptr) /= 0
564 FUNCTION xt_xmap_iterator_get_rank_c(iter)
RESULT(rank) &
565 bind(c, name=
'xt_xmap_iterator_get_rank')
566 IMPORT :: c_ptr, c_int
567 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
568 INTEGER(c_int) :: rank
569 END FUNCTION xt_xmap_iterator_get_rank_c
571 rank = int(xt_xmap_iterator_get_rank_c(iter%cptr))
577 INTEGER(c_int),
POINTER :: transfer_pos(:)
580 FUNCTION xt_xmap_iterator_get_transfer_pos_c(iter)
RESULT(transfer_pos) &
581 bind(c, name=
'xt_xmap_iterator_get_transfer_pos')
583 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
584 TYPE(c_ptr) :: transfer_pos
585 END FUNCTION xt_xmap_iterator_get_transfer_pos_c
588 TYPE(c_ptr) :: transfer_pos_cptr
589 NULLIFY(transfer_pos)
590 n(1) = int(xt_xmap_iterator_get_num_transfer_pos_c(iter%cptr))
591 transfer_pos_cptr = xt_xmap_iterator_get_transfer_pos_c(iter%cptr)
592 CALL c_f_pointer(transfer_pos_cptr, transfer_pos, n)
598 num = int(xt_xmap_iterator_get_num_transfer_pos_c(iter%cptr))
604 TYPE(xt_pos_ext),
POINTER :: transfer_pos_ext(:)
607 FUNCTION xt_xmap_iterator_get_transfer_pos_ext_c(iter) &
608 result(transfer_pos_ext) &
609 bind(c, name=
'xt_xmap_iterator_get_transfer_pos_ext')
611 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
612 TYPE(c_ptr) :: transfer_pos_ext
613 END FUNCTION xt_xmap_iterator_get_transfer_pos_ext_c
616 TYPE(c_ptr) :: transfer_pos_ext_cptr
617 NULLIFY(transfer_pos_ext)
618 n(1) = int(xt_xmap_iterator_get_num_transfer_pos_ext_c(iter%cptr))
619 transfer_pos_ext_cptr = xt_xmap_iterator_get_transfer_pos_ext_c(iter%cptr)
620 CALL c_f_pointer(transfer_pos_ext_cptr, transfer_pos_ext, n)
626 num = int(xt_xmap_iterator_get_num_transfer_pos_ext_c(iter%cptr))
632 SUBROUTINE xt_xmap_iterator_delete_c(iter) &
633 bind(c, name=
'xt_xmap_iterator_delete')
635 TYPE(c_ptr),
VALUE,
INTENT(in) :: iter
636 END SUBROUTINE xt_xmap_iterator_delete_c
638 CALL xt_xmap_iterator_delete_c(iter%cptr)
639 iter%cptr = c_null_ptr
integer, parameter, public i8
integer, parameter, public i4
integer, parameter, public i2
@, public xt_reorder_none
@, public xt_reorder_send_up
type(xt_xmap) function, public xt_xmap_c2f(xmap)
integer, parameter, public xt_reorder_type_kind
@, public xt_reorder_recv_up
describes range of positions starting with start up to start + size - 1 i.e. [start,...
Xt_xmap xt_xmap_update_positions(Xt_xmap xmap, const int *src_positions, const int *dst_positions)
int xt_xmap_iterator_next(Xt_xmap_iter iter)
Xt_xmap xt_xmap_reorder(Xt_xmap xmap, enum xt_reorder_type type)
void xt_xmap_delete(Xt_xmap xmap)
Xt_xmap_iter xt_xmap_get_out_iterator(Xt_xmap xmap)
int xt_xmap_iterator_get_num_transfer_pos_ext(Xt_xmap_iter iter)
Xt_xmap xt_xmap_spread(Xt_xmap xmap, int num_repetitions, const int src_displacements[num_repetitions], const int dst_displacements[num_repetitions])
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
void xt_xmap_iterator_delete(Xt_xmap_iter iter)
int xt_xmap_get_num_destinations(Xt_xmap xmap)
Xt_xmap xt_xmap_copy(Xt_xmap xmap)
int xt_xmap_iterator_get_rank(Xt_xmap_iter iter)
int xt_xmap_get_max_dst_pos(Xt_xmap xmap)
int xt_xmap_get_num_sources(Xt_xmap xmap)
void xt_xmap_get_source_ranks(Xt_xmap xmap, int *ranks)
const struct Xt_pos_ext * xt_xmap_iterator_get_transfer_pos_ext(Xt_xmap_iter iter)
Xt_xmap_iter xt_xmap_get_in_iterator(Xt_xmap xmap)
void xt_xmap_get_destination_ranks(Xt_xmap xmap, int *ranks)
int xt_xmap_get_max_src_pos(Xt_xmap xmap)
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
Xt_xmap xt_xmap_dist_dir_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
Xt_xmap xt_xmap_dist_dir_intercomm_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm inter_comm, MPI_Comm intra_comm)
Xt_xmap xt_xmap_dist_dir_intercomm_new_f(struct xt_idxlist_f *src_idxlist_f, struct xt_idxlist_f *dst_idxlist_f, MPI_Fint inter_comm_f, MPI_Fint intra_comm_f)
Xt_xmap xt_xmap_f2c(struct xt_xmap_f *p)
Xt_xmap xt_xmap_dist_dir_new_f(struct xt_idxlist_f *src_idxlist_f, struct xt_idxlist_f *dst_idxlist_f, MPI_Fint comm_f)