Yet Another eXchange Tool  DO_NOT_EDIT_HERE
yaxt.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 
49 MODULE yaxt
50  !
51  ! Fortran interface to yaxt implementation
52  !
53  USE xt_core, ONLY: i4, xt_int_kind, xt_int_mpidt, &
56  xt_pos_ext, OPERATOR(/=), OPERATOR(==)
58  USE xt_idxlist_abstract, ONLY: &
67  xt_idxlist_get_num_indices, xt_is_null, &
93  xt_redist_repeat_new, xt_is_null, xt_redist_get_mpi_comm, &
102 
103  USE iso_c_binding, ONLY: c_int, c_ptr, c_null_ptr, c_loc
104  IMPLICIT NONE
105 
106  PRIVATE
107 
108  PUBLIC :: xt_initialize, xt_finalize, xt_abort, xt_get_default_comm, &
131  xt_com_list, &
144  xt_redist_get_mpi_comm, &
148  xt_is_null, &
149  OPERATOR(==), OPERATOR(/=), char
150 
151  INTERFACE OPERATOR(==)
152  MODULE PROCEDURE xt_bounds_eq
153  END INTERFACE OPERATOR(==)
154 
155  INTERFACE OPERATOR(/=)
156  MODULE PROCEDURE xt_bounds_ne
157  END INTERFACE OPERATOR(/=)
158 
159  TYPE, bind(c), PUBLIC :: xt_modifier
160  TYPE(xt_idxlist) :: extract
161  TYPE(xt_idxlist) :: subst
162  INTEGER(c_int) :: mask
163  END TYPE xt_modifier
164 
165  INTERFACE
166  FUNCTION xt_idxmod_new_c(patch, modifier, modifier_num, mstate_ptr) &
167  bind(c, name='xt_idxmod_new') result(res)
168  IMPORT :: xt_int_kind, xt_modifier, c_ptr, c_int
169  IMPLICIT NONE
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
174  TYPE(c_ptr) :: res
175  END FUNCTION xt_idxmod_new_c
176  END INTERFACE
177 
178  INTERFACE xt_idxmod_new
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
184  END INTERFACE xt_idxmod_new
185 
186 CONTAINS
187 
188  FUNCTION xt_idxempty_new() RESULT(res)
189  IMPLICIT NONE
190  TYPE(xt_idxlist) :: res
191 
192  INTERFACE
193  FUNCTION xt_idxempty_new_c() &
194  bind(c, name='xt_idxempty_new') result(res_ptr)
195  IMPORT :: c_ptr
196  IMPLICIT NONE
197  TYPE(c_ptr) :: res_ptr
198  END FUNCTION xt_idxempty_new_c
199  END INTERFACE
200 
201  res = xt_idxlist_c2f(xt_idxempty_new_c())
202 
203  END FUNCTION xt_idxempty_new
204 
205  ELEMENTAL FUNCTION xt_bounds_eq(a, b) RESULT(a_equals_b)
206  TYPE(xt_bounds), INTENT(in) :: a, 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
210 
211  ELEMENTAL FUNCTION xt_bounds_ne(a, b) RESULT(a_equals_b)
212  TYPE(xt_bounds), INTENT(in) :: a, 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
216 
217  FUNCTION xt_idxmod_new_a1d(patch, modifier) RESULT(res)
218  IMPLICIT NONE
219  TYPE(xt_idxlist), INTENT(in) :: patch
220  TYPE(xt_modifier), INTENT(in) :: modifier(:)
221  TYPE(xt_idxlist) :: res
222 
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", &
228  __file__, &
229  __line__)
230  num_modifier_c = int(num_modifier, c_int)
231  res = xt_idxlist_c2f(xt_idxmod_new_c(xt_idxlist_f2c(patch), modifier, &
232  num_modifier_c, c_null_ptr))
233  END FUNCTION xt_idxmod_new_a1d
234 
235  FUNCTION xt_idxmod_new_a1d_a1d(patch, modifier, mstate) RESULT(res)
236  IMPLICIT NONE
237  TYPE(xt_idxlist), INTENT(in) :: patch
238  TYPE(xt_modifier), INTENT(in) :: modifier(:)
239  INTEGER(c_int), TARGET, INTENT(inout) :: mstate(*)
240  TYPE(xt_idxlist) :: res
241 
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", &
247  __file__, &
248  __line__)
249  num_modifier_c = int(num_modifier, c_int)
250  res = xt_idxlist_c2f(xt_idxmod_new_c(xt_idxlist_f2c(patch), modifier, &
251  num_modifier_c, c_loc(mstate)))
252  END FUNCTION xt_idxmod_new_a1d_a1d
253 
254  FUNCTION xt_idxmod_new_a1d_i4(patch, modifier, num_modifier) RESULT(res)
255  IMPLICIT NONE
256  TYPE(xt_idxlist), INTENT(in) :: patch
257  TYPE(xt_modifier), INTENT(in) :: modifier(*)
258  INTEGER(i4), INTENT(in) :: num_modifier
259  TYPE(xt_idxlist) :: res
260  INTEGER(c_int) :: num_modifier_c
261 
262  num_modifier_c = int(num_modifier, c_int)
263  res = xt_idxlist_c2f(xt_idxmod_new_c(xt_idxlist_f2c(patch), modifier, &
264  num_modifier_c, c_null_ptr))
265  END FUNCTION xt_idxmod_new_a1d_i4
266 
267  FUNCTION xt_idxmod_new_a1d_i4_a1d(patch, modifier, num_modifier, mstate) &
268  result(res)
269  IMPLICIT NONE
270  TYPE(xt_idxlist), INTENT(in) :: patch
271  TYPE(xt_modifier), INTENT(in) :: modifier(*)
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
276 
277  num_modifier_c = int(num_modifier, c_int)
278  res = xt_idxlist_c2f(xt_idxmod_new_c(xt_idxlist_f2c(patch), modifier, &
279  num_modifier_c, c_loc(mstate)))
280  END FUNCTION xt_idxmod_new_a1d_i4_a1d
281 
282  FUNCTION xt_idxmod_new_a1d_i4_a2d(patch, modifier, num_modifier, mstate) &
283  result(res)
284  IMPLICIT NONE
285  TYPE(xt_idxlist), INTENT(in) :: patch
286  TYPE(xt_modifier), INTENT(in) :: modifier(*)
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
291 
292  num_modifier_c = int(num_modifier, c_int)
293  res = xt_idxlist_c2f(xt_idxmod_new_c(xt_idxlist_f2c(patch), modifier, &
294  num_modifier_c, c_loc(mstate)))
295  END FUNCTION xt_idxmod_new_a1d_i4_a2d
296 
297 END MODULE yaxt
298 !
299 ! Local Variables:
300 ! f90-continuation-indent: 5
301 ! coding: utf-8
302 ! indent-tabs-mode: nil
303 ! show-trailing-whitespace: t
304 ! require-trailing-newline: t
305 ! End:
306 !
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)
Definition: xt_idxlist.c:97
void xt_redist_delete(Xt_redist redist)
Definition: xt_redist.c:66
void xt_xmap_get_source_ranks(Xt_xmap xmap, int *ranks)
Definition: xt_xmap.c:75
Xt_xmap_iter xt_xmap_get_out_iterator(Xt_xmap xmap)
Definition: xt_xmap.c:95
integer, parameter, public i4
Definition: xt_core_f.f90:59
int xt_xmap_get_num_sources(Xt_xmap xmap)
Definition: xt_xmap.c:65
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
Definition: xt_idxmod.c:59
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)
Definition: xt_redist.c:71
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)
Definition: xt_init.c:69
type(xt_idxlist) function, public xt_idxlist_c2f(idxlist)
type(xt_xmap) function, public xt_xmap_c2f(xmap)
Definition: xt_xmap_f.f90:140
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
Definition: xt_core_f.f90:91
const struct Xt_pos_ext * xt_xmap_iterator_get_transfer_pos_ext(Xt_xmap_iter iter)
Definition: xt_xmap.c:121
void xt_idxlist_get_indices(Xt_idxlist idxlist, Xt_int *indices)
Definition: xt_idxlist.c:101
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)
Definition: xt_xmap.c:115
void xt_idxlist_delete(Xt_idxlist idxlist)
Definition: xt_idxlist.c:73
external, public xt_idxlist_pack_f
int xt_idxlist_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
Definition: xt_idxlist.c:253
int xt_xmap_iterator_get_num_transfer_pos_ext(Xt_xmap_iter iter)
Definition: xt_xmap.c:125
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])
Definition: xt_idxlist.c:321
void xt_xmap_iterator_delete(Xt_xmap_iter iter)
Definition: xt_xmap.c:129
Xt_xmap xt_xmap_copy(Xt_xmap xmap)
Definition: xt_xmap.c:80
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
void xt_xmap_delete(Xt_xmap xmap)
Definition: xt_xmap.c:85
int xt_idxlist_get_positions_of_indices(Xt_idxlist idxlist, const Xt_int *indices, int num_indices, int *positions, int single_match_only)
Definition: xt_idxlist.c:192
external, public xt_slice_c_loc
Definition: xt_core_f.f90:143
int xt_idxlist_get_indices_at_positions(Xt_idxlist idxlist, const int *positions, int num_pos, Xt_int *indices, Xt_int undef_idx)
Definition: xt_idxlist.c:154
void xt_idxlist_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
Definition: xt_idxlist.c:117
void(* xt_sort_index)(Xt_int *a, int n, int *idx, int reset_index)
Definition: xt_sort.c:55
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)
Definition: xt_idxlist.c:226
int xt_idxlist_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
Definition: xt_idxlist.c:147
int xt_idxlist_get_position_of_index(Xt_idxlist idxlist, Xt_int index, int *position)
Definition: xt_idxlist.c:185
Xt_idxlist xt_idxempty_new(void)
Definition: xt_idxempty.c:165
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])
void xt_finalize(void)
Definition: xt_init.c:87
int xt_xmap_iterator_get_rank(Xt_xmap_iter iter)
Definition: xt_xmap.c:105
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
Definition: xt_core_f.f90:54
Xt_redist xt_redist_copy(Xt_redist redist)
Definition: xt_redist.c:61
int xt_xmap_get_num_destinations(Xt_xmap xmap)
Definition: xt_xmap.c:60
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)
Definition: xt_xmap.c:90
Xt_idxlist xt_idxvec_new(const Xt_int *idxlist, int num_indices)
Definition: xt_idxvec.c:163
Definition: yaxt.f90:49
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)
Definition: xt_idxlist.c:92
void xt_xmap_get_destination_ranks(Xt_xmap xmap, int *ranks)
Definition: xt_xmap.c:70
int xt_initialized(void)
Definition: xt_core_f.f90:172
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
Definition: xt_xmap.c:110
size_t xt_idxlist_get_pack_size(Xt_idxlist idxlist, MPI_Comm comm)
Definition: xt_idxlist.c:78
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
const Xt_int * xt_idxlist_get_indices_const(Xt_idxlist idxlist)
Definition: xt_idxlist.c:107
Xt_idxlist xt_idxstripes_new(struct Xt_stripe const *stripes, int num_stripes)
Xt_idxlist xt_idxlist_f2c(struct xt_idxlist_f *p)
Definition: yaxt_f2c.c:134
integer, parameter, public xt_int_mpidt
Definition: xt_core_f.f90:67
void xt_idxlist_pack(Xt_idxlist idxlist, void *buffer, int buffer_size, int *position, MPI_Comm comm)
Definition: xt_idxlist.c:84
int xt_xmap_iterator_next(Xt_xmap_iter iter)
Definition: xt_xmap.c:100
void(* xt_sort_int)(int *a, size_t n)
Definition: xt_sort.c:53
Xt_redist xt_redist_collection_new(Xt_redist *redists, int num_redists, int cache_size, MPI_Comm comm)
int xt_finalized(void)
Definition: xt_core_f.f90:184
Xt_idxlist xt_idxlist_get_intersection(Xt_idxlist idxlist_src, Xt_idxlist idxlist_dst)