25static void utest_init_data(
27 double **** src_fields_frac_mask_collection,
double *** tgt_field_collection);
28static void utest_free_data(
30 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection);
31static void utest_check_direct_mf(
32 Xt_redist * redists,
size_t num_src_fields,
34 double *** src_fields_collection,
double ** tgt_field_collection);
43#define TGT_UNSET_VALUE (-1.0)
48 xt_initialize(MPI_COMM_WORLD);
50 int comm_rank, comm_size;
51 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
52 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
55 PUT_ERR(
"ERROR: test requires 2 processes");
65 } collection_selection_configs[] =
66 {{.N = 3, .indices = (
size_t[]){0, 3, 2}},
67 {.N = 4, .indices = (
size_t[]){0, 1, 2, 3}},
70 NUM_COLL_SEL_CONFIGS =
71 sizeof(collection_selection_configs) /
sizeof(collection_selection_configs[0])
81 src_global_ids[src_idx] =
83 Xt_idxlist src_idxlist =
87 for (
size_t sel_idx = 0; sel_idx < NUM_COLL_SEL_CONFIGS; ++sel_idx) {
91 collection_selection_configs[sel_idx].
N,
92 collection_selection_configs[sel_idx].indices);
123 {{.required_src_points = {{.num_indices = 0},
127 {.required_src_points = {{.num_indices = 0},
134 {{.required_src_points = {{.num_indices = 0},
138 {.required_src_points = {{.num_indices = 2,
139 .indices = (Xt_int[]){0, 1}},
141 .indices = (Xt_int[]){0, 1}}},
147 {{.required_src_points = {{.num_indices = 2,
148 .indices = (Xt_int[]){0, 1}},
150 .indices = (Xt_int[]){0, 1}}},
153 {.required_src_points = {{.num_indices = 2,
154 .indices = (Xt_int[]){2, 3}},
156 .indices = (Xt_int[]){2, 3}}},
162 {{.required_src_points = {{.num_indices = 2,
163 .indices = (Xt_int[]){0, 2}},
165 .indices = (Xt_int[]){1, 3}}},
168 {.required_src_points = {{.num_indices = 2,
169 .indices = (Xt_int[]){0, 2}},
171 .indices = (Xt_int[]){1, 3}}},
175 NUM_INTERP_CONFIGS =
sizeof(interp_configs) /
sizeof(interp_configs[0])};
178 for (
size_t interp_config_idx = 0; interp_config_idx < NUM_INTERP_CONFIGS;
179 ++interp_config_idx) {
185 Xt_idxlist required_source_idxlist =
186 (interp_configs[interp_config_idx].
187 interp_data[comm_rank].required_src_points[f].num_indices > 0)?
189 interp_configs[interp_config_idx].
190 interp_data[comm_rank].required_src_points[f].indices,
191 interp_configs[interp_config_idx].
192 interp_data[comm_rank].required_src_points[f].num_indices):
196 src_idxlist, required_source_idxlist, MPI_COMM_WORLD);
197 redists[f] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
198 xt_xmap_delete(xmap);
199 xt_idxlist_delete(required_source_idxlist);
205 for (
int use_copy = 0; use_copy <= 1; ++use_copy) {
211 interp = interp_copy;
217 interp_configs[interp_config_idx].
218 interp_data[comm_rank].is_source)
222 interp_configs[interp_config_idx].
223 interp_data[comm_rank].is_target)
230 double *** src_fields_collection;
231 double *** src_fields_frac_mask_collection;
232 double ** tgt_field_collection;
234 sel, &src_fields_collection, &src_fields_frac_mask_collection,
235 &tgt_field_collection);
238 interp, src_fields_collection,
239 src_fields_frac_mask_collection, tgt_field_collection,
245 PUT_ERR(
"ERROR in execute_put_test");
248 PUT_ERR(
"ERROR in execute_get_test");
251 utest_check_direct_mf(
253 src_fields_collection, tgt_field_collection);
257 sel, src_fields_collection, src_fields_frac_mask_collection,
258 tgt_field_collection);
264 double *** src_fields_collection;
265 double *** src_fields_frac_mask_collection;
266 double ** tgt_field_collection;
268 sel, &src_fields_collection, &src_fields_frac_mask_collection,
269 &tgt_field_collection);
272 interp, src_fields_collection,
273 src_fields_frac_mask_collection, 1,
276 interp, tgt_field_collection,
282 PUT_ERR(
"ERROR in execute_put_test");
285 PUT_ERR(
"ERROR in execute_get_test");
288 utest_check_direct_mf(
290 src_fields_collection, tgt_field_collection);
295 PUT_ERR(
"ERROR in execute_put_test");
298 PUT_ERR(
"ERROR in execute_get_test");
302 sel, src_fields_collection, src_fields_frac_mask_collection,
303 tgt_field_collection);
309 double *** src_fields_collection;
310 double *** src_fields_frac_mask_collection;
311 double ** tgt_field_collection;
313 sel, &src_fields_collection, &src_fields_frac_mask_collection,
314 &tgt_field_collection);
317 interp, src_fields_collection,
318 src_fields_frac_mask_collection, 1,
321 interp, tgt_field_collection,
326 utest_check_direct_mf(
328 src_fields_collection, tgt_field_collection);
332 sel, src_fields_collection, src_fields_frac_mask_collection,
333 tgt_field_collection);
339 double *** src_fields_collection;
340 double *** src_fields_frac_mask_collection;
341 double ** tgt_field_collection;
343 sel, &src_fields_collection, &src_fields_frac_mask_collection,
344 &tgt_field_collection);
347 interp, src_fields_collection,
348 src_fields_frac_mask_collection, 1,
351 interp, tgt_field_collection,
358 utest_check_direct_mf(
360 src_fields_collection, tgt_field_collection);
364 sel, src_fields_collection, src_fields_frac_mask_collection,
365 tgt_field_collection);
371 double *** src_fields_collection;
372 double *** src_fields_frac_mask_collection;
373 double ** tgt_field_collection;
375 sel, &src_fields_collection, &src_fields_frac_mask_collection,
376 &tgt_field_collection);
379 interp, tgt_field_collection,
382 interp, src_fields_collection,
383 src_fields_frac_mask_collection, 1,
388 utest_check_direct_mf(
390 src_fields_collection, tgt_field_collection);
394 sel, src_fields_collection, src_fields_frac_mask_collection,
395 tgt_field_collection);
403 xt_redist_delete(redists[f]);
410 xt_idxlist_delete(src_idxlist);
417static void utest_init_data(
419 double **** src_fields_frac_mask_collection,
420 double *** tgt_field_collection) {
425 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
427 *src_fields_collection =
429 *src_fields_frac_mask_collection =
434 (*src_fields_collection)[c] =
436 (*src_fields_frac_mask_collection)[c] =
441 (*src_fields_collection)[c][f] =
443 (*src_fields_frac_mask_collection)[c][f] =
447 (*src_fields_collection)[c][f][
i] =
448 (double)(c*1000 + f*100 + rank*10 + i);
449 (*src_fields_frac_mask_collection)[c][f][
i] = 1.0;
454 *tgt_field_collection =
459 (*tgt_field_collection)[c] =
468static void utest_free_data(
470 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection) {
478 free(src_fields_collection[c][f]);
479 free(src_fields_frac_mask_collection[c][f]);
482 free(src_fields_collection[c]);
483 free(src_fields_frac_mask_collection[c]);
486 free(src_fields_collection);
487 free(src_fields_frac_mask_collection);
491 free(tgt_field_collection[c]);
494 free(tgt_field_collection);
497static void utest_check_direct_mf(
498 Xt_redist * redists,
size_t num_src_fields,
500 double *** src_fields_collection,
double ** tgt_field_collection) {
508 double ** ref_tgt_field_collection =
511 ref_tgt_field_collection[c] =
522 size_t c_idx = (collection_indices == NULL) ? c : collection_indices[c];
525 for (
size_t f = 0; f < num_src_fields; ++f) {
528 xt_redist_s_exchange1(
529 redists[f], src_fields_collection[c_idx][f],
530 ref_tgt_field_collection[c]);
536 if (tgt_field_collection[c][i] != ref_tgt_field_collection[c][i]) {
537 PUT_ERR(
"wrong data in direct multi-field interpolation");
544 free(ref_tgt_field_collection[c]);
546 free(ref_tgt_field_collection);
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
size_t const * yac_collection_selection_get_indices(struct yac_collection_selection const *collection_selection)
Get explicit selection indices if non-contiguous.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
struct yac_collection_selection * yac_collection_selection_new(size_t collection_size, size_t const *selection_indices)
Create a new collection selection.
struct yac_interp_operator * yac_interp_operator_direct_mf_new(struct yac_collection_selection const *collection_selection, Xt_redist *redists, size_t num_src_fields)
Create a direct redistribution operator for multiple source fields.
void yac_interp_operator_execute_wait(struct yac_interp_operator *interp)
Wait for all pending put/get operations to finish.
int yac_interp_operator_is_target(struct yac_interp_operator *interp)
Checks if the current process holds target data for the interpolation operator.
struct yac_interp_operator * yac_interp_operator_copy(struct yac_interp_operator *interp)
Create a deep copy of the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_put_test(struct yac_interp_operator *interp)
Test whether the put phase has completed.
int yac_interp_operator_is_source(struct yac_interp_operator *interp)
Checks if the current process holds source data for the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_get_test(struct yac_interp_operator *interp)
Test whether the get phase has completed.
void yac_interp_operator_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute_put(struct yac_interp_operator *interp, double ***src_fields, double ***src_frac_masks, int is_target, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute_get_async(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute(struct yac_interp_operator *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_delete(struct yac_interp_operator *interp)
Delete the interpolation operator and free resources.
Multi-field direct redistribution operator in YAC.
double const YAC_FRAC_MASK_NO_VALUE
Public interface for interpolation execution in YAC.
Abstract interpolation operator type.