48 MODULE test_redist_common
50 USE iso_c_binding
, ONLY: c_loc
65 USE ftest_common
, ONLY: test_abort
68 INTERFACE check_redist
69 MODULE PROCEDURE check_redist_dp
70 MODULE PROCEDURE check_redist_dp2_i2
71 MODULE PROCEDURE check_redist_dp2_i4
72 MODULE PROCEDURE check_redist_dp2_i8
73 MODULE PROCEDURE check_redist_dp2
74 MODULE PROCEDURE check_redist_dp2_2d
75 MODULE PROCEDURE check_redist_xi
76 MODULE PROCEDURE check_redist_i2
77 MODULE PROCEDURE check_redist_i4
78 MODULE PROCEDURE check_redist_i8
79 END INTERFACE check_redist
80 PUBLIC :: build_odd_selection_xmap, check_redist, communicators_are_congruent
81 PUBLIC :: check_redist_xi
85 FUNCTION build_odd_selection_xmap(src_slice_len)
RESULT(xmap)
86 INTEGER,
INTENT(in) :: src_slice_len
88 INTEGER :: i, j, dst_slice_len
89 INTEGER,
PARAMETER :: dst_step = 2
90 INTEGER(xt_int_kind),
ALLOCATABLE :: index_list(:)
91 TYPE(xt_idxlist) :: src_idxlist, dst_idxlist
93 dst_slice_len = (src_slice_len + dst_step - 1)/dst_step
94 ALLOCATE(index_list(src_slice_len))
95 DO i = 1, src_slice_len
96 index_list(i) = int(i, xt_int_kind)
100 DO i = 1, src_slice_len, dst_step
101 index_list(j) = int(i, xt_int_kind)
105 DEALLOCATE(index_list)
110 END FUNCTION build_odd_selection_xmap
112 FUNCTION communicators_are_congruent(comm1, comm2)
RESULT(congruent)
113 INTEGER,
INTENT(in) :: comm1, comm2
116 INTEGER :: ierror, rcode
118 CALL mpi_comm_compare(comm1, comm2, rcode, ierror)
119 congruent = ((rcode == mpi_ident) .OR. (rcode == mpi_congruent))
120 END FUNCTION communicators_are_congruent
122 SUBROUTINE check_redist_dp(redist, src, dst_size, dst, ref_dst)
123 TYPE(xt_redist),
INTENT(in) :: redist
124 INTEGER,
INTENT(in) :: dst_size
125 DOUBLE PRECISION,
TARGET,
INTENT(in) :: src(*)
126 DOUBLE PRECISION,
INTENT(in) :: ref_dst(dst_size)
127 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(dst_size)
130 IF (any(dst /= ref_dst)) &
131 CALL test_abort(
"error in xt_redist_s_exchange1", &
134 END SUBROUTINE check_redist_dp
136 SUBROUTINE check_redist_dp2(redist, src, dst, ref_dst)
137 TYPE(xt_redist),
INTENT(in) :: redist
138 DOUBLE PRECISION,
INTENT(in) :: src(:)
139 DOUBLE PRECISION,
INTENT(in) :: ref_dst(:)
140 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(:)
142 INTEGER :: dst_size, ref_dst_size
144 ref_dst_size =
SIZE(ref_dst)
145 IF (dst_size /= ref_dst_size) &
146 CALL test_abort(
"error: ref_dst larger than dst", &
151 IF (any(dst /= ref_dst)) &
152 CALL test_abort(
"error in xt_redist_s_exchange", &
155 END SUBROUTINE check_redist_dp2
157 SUBROUTINE check_redist_dp2_i2(redist, src, dst, ref_dst)
158 TYPE(xt_redist),
INTENT(in) :: redist
159 DOUBLE PRECISION,
INTENT(in) :: src(:)
160 INTEGER(i2),
INTENT(in) :: ref_dst(:)
161 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(:)
163 INTEGER :: dst_size, ref_dst_size
165 ref_dst_size =
SIZE(ref_dst)
166 IF (dst_size /= ref_dst_size) &
167 CALL test_abort(
"error: ref_dst larger than dst", &
172 IF (any(dst /= dble(ref_dst))) &
173 CALL test_abort(
"error in xt_redist_s_exchange", &
176 END SUBROUTINE check_redist_dp2_i2
178 SUBROUTINE check_redist_dp2_i4(redist, src, dst, ref_dst)
179 TYPE(xt_redist),
INTENT(in) :: redist
180 DOUBLE PRECISION,
INTENT(in) :: src(:)
181 INTEGER(i4),
INTENT(in) :: ref_dst(:)
182 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(:)
184 INTEGER :: dst_size, ref_dst_size
186 ref_dst_size =
SIZE(ref_dst)
187 IF (dst_size /= ref_dst_size) &
188 CALL test_abort(
"error: ref_dst larger than dst", &
193 IF (any(dst /= dble(ref_dst))) &
194 CALL test_abort(
"error in xt_redist_s_exchange", &
197 END SUBROUTINE check_redist_dp2_i4
199 SUBROUTINE check_redist_dp2_i8(redist, src, dst, ref_dst)
200 TYPE(xt_redist),
INTENT(in) :: redist
201 DOUBLE PRECISION,
INTENT(in) :: src(:)
202 INTEGER(i8),
INTENT(in) :: ref_dst(:)
203 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(:)
205 INTEGER :: dst_size, ref_dst_size
207 ref_dst_size =
SIZE(ref_dst)
208 IF (dst_size /= ref_dst_size) &
209 CALL test_abort(
"error: ref_dst larger than dst", &
214 IF (any(dst /= dble(ref_dst))) &
215 CALL test_abort(
"error in xt_redist_s_exchange", &
218 END SUBROUTINE check_redist_dp2_i8
220 SUBROUTINE check_redist_dp2_2d(redist, src, dst, ref_dst)
221 TYPE(xt_redist),
INTENT(in) :: redist
222 DOUBLE PRECISION,
INTENT(in) :: src(:,:)
223 DOUBLE PRECISION,
INTENT(in) :: ref_dst(:,:)
224 DOUBLE PRECISION,
TARGET,
INTENT(inout) :: dst(:,:)
226 INTEGER :: dst_size, ref_dst_size
228 ref_dst_size =
SIZE(ref_dst)
229 IF (dst_size /= ref_dst_size) &
230 CALL test_abort(
"error: ref_dst larger than dst", &
235 IF (any(dst /= ref_dst)) &
236 CALL test_abort(
"error in xt_redist_s_exchange", &
239 END SUBROUTINE check_redist_dp2_2d
241 SUBROUTINE check_redist_xi(redist, src, dst_size, dst, ref_dst)
242 TYPE(xt_redist),
INTENT(in) :: redist
243 INTEGER,
INTENT(in) :: dst_size
244 INTEGER(xi),
TARGET,
INTENT(in) :: src(*)
245 INTEGER(xi),
INTENT(in) :: ref_dst(dst_size)
246 INTEGER(xi),
TARGET,
INTENT(inout) :: dst(dst_size)
249 IF (any(dst /= ref_dst)) &
250 CALL test_abort(
"error in xt_redist_s_exchange1", &
253 END SUBROUTINE check_redist_xi
255 SUBROUTINE check_redist_i2(redist, src, dst, ref_dst)
256 TYPE(xt_redist),
INTENT(in) :: redist
257 INTEGER(i2),
INTENT(in) :: src(:)
258 INTEGER(i2),
INTENT(in) :: ref_dst(:)
259 INTEGER(i2),
TARGET,
INTENT(inout) :: dst(:)
261 INTEGER :: dst_size, ref_dst_size
263 ref_dst_size =
SIZE(ref_dst)
264 IF (dst_size /= ref_dst_size) &
265 CALL test_abort(
"error: ref_dst larger than dst", &
270 IF (any(dst /= ref_dst)) &
271 CALL test_abort(
"error in xt_redist_s_exchange", &
274 END SUBROUTINE check_redist_i2
276 SUBROUTINE check_redist_i4(redist, src, dst, ref_dst)
277 TYPE(xt_redist),
INTENT(in) :: redist
278 INTEGER(i4),
INTENT(in) :: src(:)
279 INTEGER(i4),
INTENT(in) :: ref_dst(:)
280 INTEGER(i4),
TARGET,
INTENT(inout) :: dst(:)
282 INTEGER :: dst_size, ref_dst_size
284 ref_dst_size =
SIZE(ref_dst)
285 IF (dst_size /= ref_dst_size) &
286 CALL test_abort(
"error: ref_dst larger than dst", &
291 IF (any(dst /= ref_dst)) &
292 CALL test_abort(
"error in xt_redist_s_exchange", &
295 END SUBROUTINE check_redist_i4
297 SUBROUTINE check_redist_i8(redist, src, dst, ref_dst)
298 TYPE(xt_redist),
INTENT(in) :: redist
299 INTEGER(i8),
INTENT(in) :: src(:)
300 INTEGER(i8),
INTENT(in) :: ref_dst(:)
301 INTEGER(i8),
TARGET,
INTENT(inout) :: dst(:)
303 INTEGER :: dst_size, ref_dst_size
305 ref_dst_size =
SIZE(ref_dst)
306 IF (dst_size /= ref_dst_size) &
307 CALL test_abort(
"error: ref_dst larger than dst", &
312 IF (any(dst /= ref_dst)) &
313 CALL test_abort(
"error in xt_redist_s_exchange", &
316 END SUBROUTINE check_redist_i8
318 END MODULE test_redist_common