47 PROGRAM test_idxlist_collection_f
48 USE ftest_common
, ONLY: init_mpi, finish_mpi, test_abort
50 USE test_idxlist_utils
, ONLY: check_idxlist, test_err_count, &
51 idxlist_pack_unpack_copy, check_idxlist_copy
62 CALL test_idxlist_collection_pack_unpack
63 CALL test_idxlist_collection_copy
64 CALL test_idxlist_collection_intersection
65 CALL test_idxlist_collection_heterogeneous
66 CALL test_bounding_box1
67 CALL test_bounding_box2
70 IF (test_err_count() /= 0) &
71 CALL test_abort(
"non-zero error count!", &
77 SUBROUTINE test_idxlist_collection_pack_unpack
78 INTEGER,
PARAMETER :: num_indices = 7, num_vec = 2
79 INTEGER(xt_int_kind) :: i, j
80 INTEGER(xt_int_kind),
PARAMETER :: index_list(num_indices, num_vec) = &
81 reshape((/ ((int(i, xt_int_kind), i = 1, num_indices), &
82 & j = 1, num_vec) /), &
83 & shape = (/ num_indices, num_vec /))
84 TYPE(xt_idxlist) :: idxlists(num_vec), collectionlist, collectionlist_copy
92 CALL check_idxlist(collectionlist, &
93 reshape(index_list, (/
SIZE(index_list) /)))
94 collectionlist_copy = idxlist_pack_unpack_copy(collectionlist)
95 CALL check_idxlist_copy(collectionlist, collectionlist_copy, &
96 reshape(index_list, (/
SIZE(index_list) /)), ref_stripes)
99 END SUBROUTINE test_idxlist_collection_pack_unpack
101 SUBROUTINE test_idxlist_collection_copy
102 INTEGER,
PARAMETER :: num_indices = 7, num_vec = 2
103 INTEGER(xt_int_kind) :: i, j
104 INTEGER(xt_int_kind),
PARAMETER :: index_list(num_indices, num_vec) = &
105 reshape((/ ((int(num_indices - (j * num_indices + 1 - j - i) &
106 & * (2*j - 1), xt_int_kind), &
107 & i=1, num_indices), j=1,0,-1) /), &
108 & (/ num_indices, num_vec /))
109 TYPE(xt_idxlist) :: idxlists(num_vec), collectionlist, collectionlist_copy
110 TYPE(
xt_stripe),
PARAMETER :: ref_stripes(num_vec) &
118 CALL check_idxlist(collectionlist, &
119 reshape(index_list, (/
SIZE(index_list) /)))
120 collectionlist_copy = idxlist_pack_unpack_copy(collectionlist)
121 CALL check_idxlist_copy(collectionlist, collectionlist_copy, &
122 reshape(index_list, (/
SIZE(index_list) /)), ref_stripes)
125 END SUBROUTINE test_idxlist_collection_copy
127 SUBROUTINE test_idxlist_collection_intersection
128 INTEGER,
PARAMETER :: num_indices = 7, num_lists = 3
129 INTEGER,
PARAMETER :: xi = xt_int_kind
130 INTEGER(xt_int_kind),
PARAMETER :: index_list(num_indices, num_lists) &
131 = reshape((/ 1_xi, 2_xi, 3_xi, 4_xi, 5_xi, 6_xi, 7_xi, &
132 & 7_xi, 6_xi, 5_xi, 4_xi, 3_xi, 2_xi, 1_xi, &
133 & 2_xi, 6_xi, 1_xi, 4_xi, 7_xi, 3_xi, 0_xi /), &
134 & (/ num_indices, num_lists /)), &
135 sorted_index_list(
SIZE(index_list)) &
136 = (/ 0_xi, 1_xi, 1_xi, 1_xi, 2_xi, 2_xi, 2_xi, &
137 & 3_xi, 3_xi, 3_xi, 4_xi, 4_xi, 4_xi, 5_xi, &
138 & 5_xi, 6_xi, 6_xi, 6_xi, 7_xi, 7_xi, 7_xi /)
139 TYPE(xt_idxlist) :: idxlists(num_lists), collectionlist, intersection, &
150 CALL check_idxlist(collectionlist, &
151 reshape(index_list, (/
SIZE(index_list) /)))
152 ref_idxvec =
xt_idxvec_new(reshape(index_list, (/
SIZE(index_list) /)), &
155 CALL check_idxlist(intersection, sorted_index_list)
158 CALL check_idxlist(intersection, sorted_index_list)
163 END SUBROUTINE test_idxlist_collection_intersection
165 SUBROUTINE test_idxlist_collection_heterogeneous
166 INTEGER,
PARAMETER :: num_indices = 6, num_lists = 3
167 INTEGER,
PARAMETER :: xi = xt_int_kind
168 INTEGER(xt_int_kind),
PARAMETER :: &
169 index_list(num_indices) = (/ 1_xi, 3_xi, 5_xi, 7_xi, 9_xi, 11_xi /)
172 INTEGER(xt_int_kind),
PARAMETER :: local_start(2) = 2
173 INTEGER(xt_int_kind),
PARAMETER :: global_size(2) = (/ 10_xi, 10_xi /)
174 INTEGER,
PARAMETER :: local_size(2) = 5
175 INTEGER,
PARAMETER :: ref_size = num_indices + stripes(1)%nstrides &
176 + stripes(2)%nstrides + local_size(1) * local_size(2)
177 INTEGER(xt_int_kind),
PARAMETER :: ref_index_list(ref_size) &
178 = (/ 1_xi, 3_xi, 5_xi, 7_xi, 9_xi, 11_xi, &
179 & 0_xi, 2_xi, 4_xi, 6_xi, 8_xi, 1_xi, 3_xi, 5_xi, 7_xi, 9_xi, &
180 & 22_xi, 23_xi, 24_xi, 25_xi, 26_xi, &
181 & 32_xi, 33_xi, 34_xi, 35_xi, 36_xi, &
182 & 42_xi, 43_xi, 44_xi, 45_xi, 46_xi, &
183 & 52_xi, 53_xi, 54_xi, 55_xi, 56_xi, &
184 & 62_xi, 63_xi, 64_xi, 65_xi, 66_xi /)
185 TYPE(xt_idxlist) :: idxlists(num_lists), collectionlist
198 CALL check_idxlist(collectionlist, ref_index_list)
202 END SUBROUTINE test_idxlist_collection_heterogeneous
204 SUBROUTINE test_bounding_box1
205 INTEGER,
PARAMETER :: ndim=3, num_lists = 2
206 INTEGER(xt_int_kind),
PARAMETER :: global_size_bb(ndim) = 4, &
207 global_start_index = 0
208 TYPE(xt_idxlist) :: idxlists(num_lists), collectionlist
219 IF (any(bounds%size /= 0)) &
220 CALL test_abort(
"ERROR: non-zero bounding box size", &
224 END SUBROUTINE test_bounding_box1
226 SUBROUTINE test_bounding_box2
227 INTEGER,
PARAMETER :: ndim = 3, num_lists = 2, num_indices = 3
228 INTEGER,
PARAMETER :: xi = xt_int_kind
229 INTEGER(xt_int_kind),
PARAMETER :: indices(num_indices, num_lists) &
230 = reshape( (/ 45_xi, 35_xi, 32_xi, 32_xi, 48_xi, 33_xi /), &
231 & (/ num_indices, num_lists /)), &
232 global_size(ndim) = (/ 5_xi, 4_xi, 3_xi /), &
233 global_start_index = 1
234 TYPE(xt_idxlist) :: idxlists(num_lists), collectionlist
249 IF (any(bounds /= bounds_ref)) &
250 CALL test_abort(
"ERROR: unexpected boundaries", &
253 END SUBROUTINE test_bounding_box2
255 END PROGRAM test_idxlist_collection_f