23static void utest_check_exchange(
25 int is_source,
int is_target,
int optional_put_get);
31 xt_initialize(MPI_COMM_WORLD);
33 int comm_rank, comm_size;
34 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
35 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
38 PUT_ERR(
"ERROR: wrong number of processes");
44 int is_source, is_target;
65 Xt_idxlist src_idxlist =
66 is_source?xt_idxvec_new((Xt_int[]){comm_rank}, 1):xt_idxempty_new();
67 Xt_idxlist tgt_idxlist =
68 is_target?xt_idxvec_new((Xt_int[]){0, 1}, 2):xt_idxempty_new();
71 xt_xmap_dist_dir_new(src_idxlist, tgt_idxlist, MPI_COMM_WORLD);
73 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
78 int with_frac_mask = 0;
87 xt_idxlist_delete(tgt_idxlist);
88 xt_idxlist_delete(src_idxlist);
91 enum {NUM_EXCH =
sizeof(exchanges) /
sizeof(exchanges[0])};
93 for (
int optional_put_get = 0; optional_put_get < 2; ++optional_put_get) {
101 for (
size_t exch_idx = 0; exch_idx < NUM_EXCH; ++exch_idx)
102 utest_check_exchange(
107 for (
size_t exch_idx = 0; exch_idx < NUM_EXCH; ++exch_idx)
117static void utest_check_exchange(
122 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
125 PUT_ERR(
"ERROR in yac_interpolation_exchange_is_source");
127 PUT_ERR(
"ERROR in yac_interpolation_exchange_is_target");
129 double send_data_[1] = {(double)comm_rank};
130 double const * send_data = {
is_source?&(send_data_[0]):NULL};
131 double recv_data_[2] = {-1.0, -1.0};
132 double * recv_data = {
is_target?&(recv_data_[0]):NULL};
138 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute");
141 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute");
144 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
150 recv_data_[0] = -1.0, recv_data_[1] = -1.0;
152 exchange, &send_data, &recv_data,
"utest_check_exchange");
154 if ((recv_data_[0] != 0.0) || (recv_data_[1] != 1.0))
155 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute");
158 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
163 exchange, &send_data,
"utest_check_exchange");
168 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
171 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute");
174 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
180 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
183 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
186 recv_data_[0] = -1.0, recv_data_[1] = -1.0;
189 exchange, &recv_data,
"utest_check_exchange");
190 if (
is_target && ((recv_data_[0] != 0.0) || (recv_data_[1] != 1.0)))
191 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute_get");
195 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
200 exchange, &send_data,
"utest_check_exchange");
207 recv_data_[0] = -1.0, recv_data_[1] = -1.0;
210 exchange, &recv_data,
"utest_check_exchange");
211 if (
is_target && ((recv_data_[0] != 0.0) || (recv_data_[1] != 1.0)))
212 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute_get");
216 for (
int put_get_order = 0; put_get_order < 2; ++put_get_order) {
219 for (
int i = 0;
i < 2; ++
i) {
220 if (put_get_order == i) {
223 exchange, &send_data,
"utest_check_exchange");
225 if (put_get_order != i) {
226 recv_data_[0] = -1.0, recv_data_[1] = -1.0;
229 exchange, &recv_data,
"utest_check_exchange");
233 if (
is_target && ((recv_data_[0] != 0.0) || (recv_data_[1] != 1.0)))
234 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute_get");
237 for (
int i = 0;
i < 2; ++
i) {
238 if (put_get_order == i) {
241 exchange, &send_data,
"utest_check_exchange");
245 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
247 if (put_get_order != i) {
248 recv_data_[0] = -1.0, recv_data_[1] = -1.0;
251 exchange, &recv_data,
"utest_check_exchange");
255 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
261 PUT_ERR(
"ERROR in yac_interpolation_exchange_status");
264 exchange,
"utest_check_exchange") ==
267 exchange,
"utest_check_exchange") ==
269 if (
is_target && ((recv_data_[0] != 0.0) || (recv_data_[1] != 1.0)))
270 PUT_ERR(
"ERROR in yac_interpolation_exchange_execute_get");
274 for (
int i = 0;
i < 4; ++
i) {
276 for (
int j = 0; j < 2; ++j) {
280 exchange, &send_data,
"utest_check_exchange");
286 exchange, &recv_data,
"utest_check_exchange");
293 for (
int i = 0;
i < 4; ++
i) {
296 exchange, &send_data, &recv_data,
"utest_check_exchange");
299 exchange, &send_data,
"utest_check_exchange");
302 exchange, &recv_data,
"utest_check_exchange");
int yac_interpolation_exchange_is_target(struct yac_interpolation_exchange *exchange)
Query whether the current process participates as target.
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase asynchronously.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the put phase has completed.
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
Create a deep copy of an interpolation exchange.
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
Delete an interpolation exchange and release resources.
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase and receive target data synchronously.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
Wait for completion of pending put/get phases.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the get phase has completed.
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
Execute only the put phase asynchronously.
struct yac_interpolation_exchange * yac_interpolation_exchange_new(Xt_redist *redists, size_t num_fields, size_t collection_size, int with_frac_mask, char const *name)
Create a new interpolation exchange object.
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
Execute the full exchange (put + get) synchronously.
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_source(struct yac_interpolation_exchange *exchange)
Query whether the current process participates as source.
Interpolation exchange object for temporary buffers and MPI exchanges.
@ YAC_INTERP_EXCH_INCOMPLETE
Operation still in progress.
@ YAC_INTERP_EXCH_COMPLETE
No ongoing operation.
YAC_INTERP_EXCH_STATUS
Status of an interpolation exchange.
@ YAC_INTERP_EXCH_ACTIVE
Exchange is active.
@ YAC_INTERP_EXCH_WAIT_PUT
Waiting for put phase completion.
@ YAC_INTERP_EXCH_WAIT_GET
Waiting for get phase completion.
@ YAC_INTERP_EXCH_IDLE
No ongoing exchange.