103 USE iso_c_binding
, ONLY: c_int, c_ptr, c_null_ptr, c_loc
144 xt_redist_get_mpi_comm, &
149 OPERATOR(==),
OPERATOR(/=), char
151 INTERFACE OPERATOR(==)
152 MODULE PROCEDURE xt_bounds_eq
153 END INTERFACE OPERATOR(==)
155 INTERFACE OPERATOR(/=)
156 MODULE PROCEDURE xt_bounds_ne
157 END INTERFACE OPERATOR(/=)
162 INTEGER(c_int) :: mask
167 bind(c, name=
'xt_idxmod_new') result(res)
170 TYPE(c_ptr),
VALUE,
INTENT(in) :: patch
171 INTEGER(c_int),
VALUE,
INTENT(in) :: modifier_num
172 TYPE(
xt_modifier),
INTENT(in) :: modifier(modifier_num)
173 TYPE(c_ptr),
VALUE,
INTENT(in) :: mstate_ptr
179 MODULE PROCEDURE xt_idxmod_new_a1d
180 MODULE PROCEDURE xt_idxmod_new_a1d_a1d
181 MODULE PROCEDURE xt_idxmod_new_a1d_i4
182 MODULE PROCEDURE xt_idxmod_new_a1d_i4_a1d
183 MODULE PROCEDURE xt_idxmod_new_a1d_i4_a2d
190 TYPE(xt_idxlist) :: res
193 FUNCTION xt_idxempty_new_c() &
194 bind(c, name=
'xt_idxempty_new') result(res_ptr)
197 TYPE(c_ptr) :: res_ptr
198 END FUNCTION xt_idxempty_new_c
201 res = xt_idxlist_c2f(xt_idxempty_new_c())
205 ELEMENTAL FUNCTION xt_bounds_eq(a, b)
RESULT(a_equals_b)
207 LOGICAL :: a_equals_b
208 a_equals_b = a%size == b%size .AND. a%start == b%start
209 END FUNCTION xt_bounds_eq
211 ELEMENTAL FUNCTION xt_bounds_ne(a, b)
RESULT(a_equals_b)
213 LOGICAL :: a_equals_b
214 a_equals_b = a%size /= b%size .OR. a%start /= b%start
215 END FUNCTION xt_bounds_ne
217 FUNCTION xt_idxmod_new_a1d(patch, modifier)
RESULT(res)
219 TYPE(xt_idxlist),
INTENT(in) :: patch
221 TYPE(xt_idxlist) :: res
223 INTEGER :: num_modifier
224 INTEGER(c_int) :: num_modifier_c
225 num_modifier =
SIZE(modifier)
226 IF (num_modifier > huge(1_c_int)) &
227 CALL xt_abort(
"number of modifiers too high", &
230 num_modifier_c = int(num_modifier, c_int)
232 num_modifier_c, c_null_ptr))
233 END FUNCTION xt_idxmod_new_a1d
235 FUNCTION xt_idxmod_new_a1d_a1d(patch, modifier, mstate)
RESULT(res)
237 TYPE(xt_idxlist),
INTENT(in) :: patch
239 INTEGER(c_int),
TARGET,
INTENT(inout) :: mstate(*)
240 TYPE(xt_idxlist) :: res
242 INTEGER :: num_modifier
243 INTEGER(c_int) :: num_modifier_c
244 num_modifier =
SIZE(modifier)
245 IF (num_modifier > huge(1_c_int)) &
246 CALL xt_abort(
"number of modifiers too high", &
249 num_modifier_c = int(num_modifier, c_int)
251 num_modifier_c, c_loc(mstate)))
252 END FUNCTION xt_idxmod_new_a1d_a1d
254 FUNCTION xt_idxmod_new_a1d_i4(patch, modifier, num_modifier)
RESULT(res)
256 TYPE(xt_idxlist),
INTENT(in) :: patch
258 INTEGER(i4),
INTENT(in) :: num_modifier
259 TYPE(xt_idxlist) :: res
260 INTEGER(c_int) :: num_modifier_c
262 num_modifier_c = int(num_modifier, c_int)
264 num_modifier_c, c_null_ptr))
265 END FUNCTION xt_idxmod_new_a1d_i4
267 FUNCTION xt_idxmod_new_a1d_i4_a1d(patch, modifier, num_modifier, mstate) &
270 TYPE(xt_idxlist),
INTENT(in) :: patch
272 INTEGER(i4),
INTENT(in) :: num_modifier
273 INTEGER(c_int),
TARGET,
INTENT(inout) :: mstate(*)
274 TYPE(xt_idxlist) :: res
275 INTEGER(c_int) :: num_modifier_c
277 num_modifier_c = int(num_modifier, c_int)
279 num_modifier_c, c_loc(mstate)))
280 END FUNCTION xt_idxmod_new_a1d_i4_a1d
282 FUNCTION xt_idxmod_new_a1d_i4_a2d(patch, modifier, num_modifier, mstate) &
285 TYPE(xt_idxlist),
INTENT(in) :: patch
287 INTEGER(i4),
INTENT(in) :: num_modifier
288 INTEGER(c_int),
TARGET,
INTENT(inout) :: mstate(1,*)
289 TYPE(xt_idxlist) :: res
290 INTEGER(c_int) :: num_modifier_c
292 num_modifier_c = int(num_modifier, c_int)
294 num_modifier_c, c_loc(mstate)))
295 END FUNCTION xt_idxmod_new_a1d_i4_a2d
type(xt_idxlist) function, public xt_idxfsection_new(start, global_size, local_size, local_start)
Fortran style version of xt_idxsection_new. Compared to xt_idxsection_new, here the elements of the v...
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])
Xt_idxlist xt_idxlist_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
Xt_idxlist xt_idxvec_from_stripes_new(const struct Xt_stripe *stripes, int num_stripes)
int xt_idxlist_get_num_indices(Xt_idxlist idxlist)
void xt_redist_delete(Xt_redist redist)
void xt_xmap_get_source_ranks(Xt_xmap xmap, int *ranks)
Xt_xmap_iter xt_xmap_get_out_iterator(Xt_xmap xmap)
integer, parameter, public i4
int xt_xmap_get_num_sources(Xt_xmap xmap)
Xt_idxlist xt_idxstripes_from_idxlist_new(Xt_idxlist idxlist_src)
Xt_idxlist xt_idxmod_new(Xt_idxlist patch_idxlist, struct Xt_modifier *modifier, int modifier_num, int *mstate)
generates a new index list based on an index list and a sequence of modifiers
external, public xt_idxlist_unpack_f
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)
Xt_xmap xt_xmap_dist_dir_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
void xt_initialize(MPI_Comm default_comm)
type(xt_idxlist) function, public xt_idxlist_c2f(idxlist)
type(xt_xmap) function, public xt_xmap_c2f(xmap)
describes range of positions starting with start up to start + size - 1 i.e. [start,start+size) if size is positive and down to start + size + 1 i.e. (start+size,start] if size is negative
const struct Xt_pos_ext * xt_xmap_iterator_get_transfer_pos_ext(Xt_xmap_iter iter)
void xt_idxlist_get_indices(Xt_idxlist idxlist, Xt_int *indices)
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)
void xt_idxlist_delete(Xt_idxlist idxlist)
external, public xt_idxlist_pack_f
int xt_idxlist_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
int xt_xmap_iterator_get_num_transfer_pos_ext(Xt_xmap_iter iter)
void xt_idxlist_get_bounding_box(Xt_idxlist idxlist, unsigned ndim, const Xt_int global_size[ndim], Xt_int global_start_index, struct Xt_bounds bounds[ndim])
void xt_xmap_iterator_delete(Xt_xmap_iter iter)
Xt_xmap xt_xmap_copy(Xt_xmap xmap)
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
void xt_xmap_delete(Xt_xmap xmap)
int xt_idxlist_get_positions_of_indices(Xt_idxlist idxlist, const Xt_int *indices, int num_indices, int *positions, int single_match_only)
external, public xt_slice_c_loc
int xt_idxlist_get_indices_at_positions(Xt_idxlist idxlist, const int *positions, int num_pos, Xt_int *indices, Xt_int undef_idx)
void xt_idxlist_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
void(* xt_sort_index)(Xt_int *a, int n, int *idx, int reset_index)
Xt_xmap xt_xmap_intersection_new(int num_src_intersections, const struct Xt_com_list src_com[num_src_intersections], int num_dst_intersections, const struct Xt_com_list dst_com[num_dst_intersections], Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
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_xmap xt_xmap_dist_dir_intercomm_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm inter_comm, MPI_Comm intra_comm)
int xt_idxlist_get_pos_exts_of_index_stripes(Xt_idxlist idxlist, int num_stripes, const struct Xt_stripe stripes[num_stripes], int *num_ext, struct Xt_pos_ext **pos_ext, int single_match_only)
int xt_idxlist_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
int xt_idxlist_get_position_of_index(Xt_idxlist idxlist, Xt_int index, int *position)
Xt_idxlist xt_idxempty_new(void)
Xt_idxlist xt_idxsection_new(Xt_int start, int num_dimensions, const Xt_int global_size[num_dimensions], const int local_size[num_dimensions], const Xt_int local_start[num_dimensions])
int xt_xmap_iterator_get_rank(Xt_xmap_iter iter)
Xt_redist xt_redist_p2p_off_new(Xt_xmap xmap, const int *src_offsets, const int *dst_offsets, MPI_Datatype datatype)
integer, parameter, public xt_int_kind
Xt_redist xt_redist_copy(Xt_redist redist)
int xt_xmap_get_num_destinations(Xt_xmap xmap)
type(xt_redist) function, public xt_redist_c2f(redist)
Xt_idxlist xt_idxlist_collection_new(Xt_idxlist *idxlists, int num_idxlists)
Xt_xmap xt_xmap_intersection_ext_new(int num_src_intersections, const struct Xt_com_list src_com[num_src_intersections], int num_dst_intersections, const struct Xt_com_list dst_com[num_dst_intersections], Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
Xt_xmap_iter xt_xmap_get_in_iterator(Xt_xmap xmap)
Xt_idxlist xt_idxvec_new(const Xt_int *idxlist, int num_indices)
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_idxlist xt_idxlist_copy(Xt_idxlist idxlist)
void xt_xmap_get_destination_ranks(Xt_xmap xmap, int *ranks)
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
size_t xt_idxlist_get_pack_size(Xt_idxlist idxlist, MPI_Comm comm)
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)
const Xt_int * xt_idxlist_get_indices_const(Xt_idxlist idxlist)
Xt_idxlist xt_idxstripes_new(struct Xt_stripe const *stripes, int num_stripes)
Xt_idxlist xt_idxlist_f2c(struct xt_idxlist_f *p)
integer, parameter, public xt_int_mpidt
void xt_idxlist_pack(Xt_idxlist idxlist, void *buffer, int buffer_size, int *position, MPI_Comm comm)
int xt_xmap_iterator_next(Xt_xmap_iter iter)
void(* xt_sort_int)(int *a, size_t n)
Xt_redist xt_redist_collection_new(Xt_redist *redists, int num_redists, int cache_size, MPI_Comm comm)
Xt_idxlist xt_idxlist_get_intersection(Xt_idxlist idxlist_src, Xt_idxlist idxlist_dst)