55 use,
INTRINSIC :: iso_c_binding, only: c_char, c_null_char, c_int, &
56 c_long, c_short, c_long_long, c_ptr, c_loc
63 PUBLIC ::
ut_init, ut_init_decomposition, &
65 ut_init_transposition, ut_transpose, &
75 INTEGER,
PARAMETER :: inflate_inner = 1
76 INTEGER,
PARAMETER :: inflate_outer = 2
86 INTERFACE ut_init_decomposition
87 MODULE PROCEDURE ut_init_decomposition_1d
88 END INTERFACE ut_init_decomposition
91 INTERFACE ut_init_transposition
92 MODULE PROCEDURE ut_init_transposition_simple
93 MODULE PROCEDURE ut_init_transposition_with_offsets
94 END INTERFACE ut_init_transposition
96 INTERFACE ut_transpose
97 MODULE PROCEDURE ut_transpose_int
98 END INTERFACE ut_transpose
101 SUBROUTINE xt_ut_abort(msg, source, line) bind(C, name='xt_ut_abort')
102 import:: c_char, c_int
104 CHARACTER(C_CHAR),
DIMENSION(*),
INTENT(in) :: msg
105 CHARACTER(C_CHAR),
DIMENSION(*),
INTENT(in) :: source
106 INTEGER(C_INT),
INTENT(in) :: line
111 SUBROUTINE xt_ut_init(decomp_size, comm_tmpl_size, comm_size, debug_lvl, &
112 mode, idebug_unit) bind(C, name='xt_ut_init')
115 INTEGER(C_INT),
VALUE,
INTENT(in) :: decomp_size, comm_tmpl_size, &
116 comm_size, debug_lvl, mode, idebug_unit
127 bind(c, name=
'xt_ut_init_decomposition_1d') result(r)
132 INTEGER(xt_int_kind),
DIMENSION(*),
INTENT(in) :: idx_vec
133 INTEGER(c_int),
VALUE,
INTENT(in) :: idx_vec_n
139 bind(c, name=
'xt_ut_destroy_decomposition')
142 INTEGER(C_INT),
VALUE,
INTENT(in) :: handle
148 decomp_handle_in, decomp_handle_out, mpi_world, check_unique) &
149 & bind(c, name=
'xt_ut_init_oneway_transposition_template') &
154 INTEGER(C_INT),
VALUE,
INTENT(in) :: decomp_handle_in, &
155 decomp_handle_out, mpi_world, check_unique
161 bind(c, name=
'xt_ut_destroy_transposition_template')
164 INTEGER(C_INT),
VALUE,
INTENT(in) :: handle
170 bind(c, name=
'xt_ut_init_transposition_simple')
172 INTEGER,
VALUE,
INTENT(in) :: itemplate
173 INTEGER,
VALUE,
INTENT(in) :: datatype
179 offset_in_size, offset_out, offset_out_size, &
180 & datatype) bind(C, name='xt_ut_init_transposition')
182 INTEGER,
VALUE,
INTENT(in) :: itemplate, offset_in_size, offset_out_size
183 INTEGER,
DIMENSION(*),
INTENT(in) :: offset_in, offset_out
184 INTEGER,
VALUE,
INTENT(in) :: datatype
190 bind(c, name=
'xt_ut_destroy_transposition')
193 INTEGER(C_INT),
VALUE,
INTENT(in) :: handle
199 direction, pt_out) bind(C, name='xt_ut_transpose')
200 import:: c_int, c_ptr
202 TYPE(c_ptr),
INTENT(in) :: pt_in, pt_out
203 INTEGER(C_INT),
VALUE,
INTENT(in) :: transposition_handle
204 INTEGER(C_INT),
VALUE,
INTENT(in) :: direction
209 LOGICAL,
PARAMETER :: debug = .true.
213 SUBROUTINE ut_abort(msg, source, line)
214 CHARACTER(len=*),
INTENT(in) :: msg
215 CHARACTER(len=*),
INTENT(in) :: source
216 INTEGER,
INTENT(in) :: line
218 CALL xt_ut_abort(trim(msg)//c_null_char, source, line)
226 SUBROUTINE ut_init(decomp_size, comm_tmpl_size, comm_size, debug_lvl, &
228 INTEGER,
INTENT(in) :: decomp_size
229 INTEGER,
INTENT(in) :: comm_tmpl_size
230 INTEGER,
INTENT(in) :: comm_size
231 INTEGER,
INTENT(in) :: debug_lvl
232 INTEGER,
INTENT(in) :: mode
233 INTEGER,
INTENT(in) :: debug_unit
235 CALL xt_ut_init(decomp_size, comm_tmpl_size, comm_size, debug_lvl, &
240 SUBROUTINE ut_init_decomposition_1d(myindex, global_size, handle)
241 INTEGER,
INTENT(in) :: myindex(:)
242 INTEGER,
INTENT(in) :: global_size
243 INTEGER,
INTENT(out) :: handle
245 INTEGER(c_int) :: size_myindex_c
246 IF (huge(1_xt_int_kind) < huge(myindex))
THEN 247 IF (any(myindex > huge(1_xt_int_kind)) &
248 .OR. any(myindex < -huge(1_xt_int_kind))) &
249 CALL ut_abort(
'ut_init_decomposition_1d: & 250 &index value not supported', &
254 IF (huge(
SIZE(myindex)) > huge(1_c_int))
THEN 255 IF (
SIZE(myindex) > huge(1_c_int)) &
256 CALL ut_abort(
'ut_init_decomposition_1: & 257 &array size unsupported', &
261 size_myindex_c = int(
SIZE(myindex), c_int)
263 idx_vec_n=size_myindex_c)
265 END SUBROUTINE ut_init_decomposition_1d
268 INTEGER,
INTENT(in) :: handle
275 decomp_handle_out, mpi_world, comm_tmpl_handle, check_unique)
276 INTEGER,
INTENT(in) :: decomp_handle_in
277 INTEGER,
INTENT(in) :: decomp_handle_out
278 INTEGER,
INTENT(in) :: mpi_world
279 INTEGER,
INTENT(out) :: comm_tmpl_handle
280 LOGICAL,
OPTIONAL,
INTENT(in) :: check_unique
282 INTEGER :: icheck_unique
285 IF (
PRESENT(check_unique))
THEN 286 IF (check_unique) icheck_unique = 1
289 decomp_handle_in, decomp_handle_out, mpi_world, icheck_unique)
294 INTEGER,
INTENT(in) :: handle
300 SUBROUTINE ut_init_transposition_simple(comm_template_handle, &
301 datatype, comm_handle)
302 INTEGER,
INTENT(in) :: comm_template_handle
303 INTEGER,
INTENT(in) :: datatype
304 INTEGER,
INTENT(out) :: comm_handle
309 END SUBROUTINE ut_init_transposition_simple
311 SUBROUTINE ut_init_transposition_with_offsets(comm_template_handle, &
312 offset_in, offset_out, datatype_in, datatype_out, comm_handle)
313 INTEGER,
INTENT(in) :: comm_template_handle
314 INTEGER,
INTENT(in) :: offset_in(:)
315 INTEGER,
INTENT(in) :: offset_out(:)
316 INTEGER,
INTENT(in) :: datatype_in
317 INTEGER,
INTENT(in) :: datatype_out
318 INTEGER,
INTENT(out) :: comm_handle
322 IF (datatype_in /= datatype_out)
THEN 323 CALL ut_abort(
'ut_init_transposition: & 324 &(datatype_in /= datatype_out) not supported', &
329 datatype = datatype_in
332 & offset_in,
SIZE(offset_in), &
333 & offset_out,
SIZE(offset_out), &
336 END SUBROUTINE ut_init_transposition_with_offsets
339 INTEGER,
INTENT(in) :: handle
345 SUBROUTINE ut_transpose_int(field_in, transposition_handle, direction, &
347 INTEGER,
POINTER :: field_in, field_out
348 INTEGER,
INTENT(in) :: transposition_handle
349 INTEGER,
INTENT(in) :: direction
351 TYPE(c_ptr) :: pt_in, pt_out
353 pt_in = c_loc(field_in)
354 pt_out = c_loc(field_out)
357 END SUBROUTINE ut_transpose_int
MPI_Fint xt_ut_init_oneway_transposition_template(int id_in, int id_out, int XT_UNUSED(mpi_world), int XT_UNUSED(icheck_unique))
MPI_Fint xt_ut_init_decomposition_1d(Xt_int *iv, int iv_n)
subroutine, public ut_init(decomp_size, comm_tmpl_size, comm_size, debug_lvl, mode, debug_unit)
MPI_Fint xt_ut_init_transposition_simple(MPI_Fint itemplate, MPI_Fint f_datatype)
integer, parameter, public ut_mode_pack_alltoall
subroutine, public ut_destroy_transposition_template(handle)
void xt_ut_transpose(const void **pt_in, int itrans, int XT_UNUSED(direction), void **pt_out)
void xt_ut_abort(char *msg, char *source, int *line) __attribute__((noreturn))
void xt_ut_init(int decomp_size, int comm_tmpl_size, int comm_trans_size, int debug_lvl, int mode, int debug_unit)
subroutine, public ut_destroy_transposition(handle)
MPI_Fint xt_ut_init_transposition(MPI_Fint itemplate, MPI_Fint offset_in[], MPI_Fint XT_UNUSED(offset_in_size), MPI_Fint offset_out[], MPI_Fint XT_UNUSED(offset_out_size), MPI_Fint f_datatype)
integer, parameter, public xt_int_kind
integer, parameter, public ut_mode_pack_p2p
void xt_ut_finalize(void)
subroutine, public ut_destroy_decomposition(handle)
integer, parameter, public ut_mode_dt_alltoall
subroutine, public ut_init_oneway_transposition_template(decomp_handle_in, decomp_handle_out, mpi_world, comm_tmpl_handle, check_unique)
integer, parameter, public comm_forward
void xt_ut_destroy_decomposition(int id)
integer, parameter, public comm_backward
void xt_ut_destroy_transposition(int id)
subroutine, public ut_abort(msg, source, line)
subroutine, public ut_finalize()
integer, parameter, public ut_mode_dt_p2p
void xt_ut_destroy_transposition_template(int id)