24static void utest_init_data(
26 double **** src_fields_frac_mask_collection,
double *** tgt_field_collection);
27static void utest_free_data(
29 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection);
30static void utest_check_direct(
32 double *** src_fields_collection,
double ** tgt_field_collection);
41#define TGT_UNSET_VALUE (-1.0)
46 xt_initialize(MPI_COMM_WORLD);
48 int comm_rank, comm_size;
49 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
50 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
53 PUT_ERR(
"ERROR: test requires 2 processes");
66 src_global_ids[src_idx] =
68 Xt_idxlist src_idxlist =
75 } collection_selection_configs[] =
76 {{.N = 3, .indices = (
size_t[]){0, 2, 3}},
77 {.N = 4, .indices = (
size_t[]){0, 1, 2, 3}},
78 {.N = 2, .indices = NULL}};
80 NUM_COLL_SEL_CONFIGS =
81 sizeof(collection_selection_configs)/
82 sizeof(collection_selection_configs[0]) };
85 for (
size_t sel_idx = 0; sel_idx < NUM_COLL_SEL_CONFIGS; ++sel_idx) {
89 collection_selection_configs[sel_idx].
N,
90 collection_selection_configs[sel_idx].indices);
106 } required_src_points;
119 {{.required_src_points = {.num_indices = 0, .indices = NULL},
122 {.required_src_points = {.num_indices = 0, .indices = NULL},
128 {{.required_src_points = {.num_indices = 0, .indices = NULL},
131 {.required_src_points = {.num_indices = 2,
132 .indices = (Xt_int[]){0, 1}},
138 {{.required_src_points = {.num_indices = 2,
139 .indices = (Xt_int[]){0, 1}},
142 {.required_src_points = {.num_indices = 2,
143 .indices = (Xt_int[]){2, 3}},
149 {{.required_src_points = {.num_indices = 2,
150 .indices = (Xt_int[]){0, 2}},
153 {.required_src_points = {.num_indices = 2,
154 .indices = (Xt_int[]){1, 3}},
158 NUM_INTERP_CONFIGS =
sizeof(interp_configs) /
sizeof(interp_configs[0])};
161 for (
size_t interp_config_idx = 0; interp_config_idx < NUM_INTERP_CONFIGS;
162 ++interp_config_idx) {
164 Xt_idxlist required_source_idxlist =
165 (interp_configs[interp_config_idx].
166 interp_data[comm_rank].required_src_points.num_indices > 0)?
168 interp_configs[interp_config_idx].
169 interp_data[comm_rank].required_src_points.indices,
170 interp_configs[interp_config_idx].
171 interp_data[comm_rank].required_src_points.num_indices):
176 src_idxlist, required_source_idxlist, MPI_COMM_WORLD);
177 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
179 xt_xmap_delete(xmap);
180 xt_idxlist_delete(required_source_idxlist);
186 for (
int use_copy = 0; use_copy <= 1; ++use_copy) {
192 interp = interp_copy;
195 for (
int with_frac_mask = 0; with_frac_mask <= 1; ++with_frac_mask) {
199 double frac_mask_fallback_value =
205 interp_configs[interp_config_idx].
206 interp_data[comm_rank].is_source)
210 interp_configs[interp_config_idx].
211 interp_data[comm_rank].is_target)
218 double *** src_fields_collection;
219 double *** src_fields_frac_mask_collection;
220 double ** tgt_field_collection;
222 sel, &src_fields_collection, &src_fields_frac_mask_collection,
223 &tgt_field_collection);
226 interp, src_fields_collection, src_fields_frac_mask_collection,
227 tgt_field_collection, frac_mask_fallback_value, 1.0, 0.0);
232 PUT_ERR(
"ERROR in execute_put_test");
235 PUT_ERR(
"ERROR in execute_get_test");
239 redist, sel, src_fields_collection, tgt_field_collection);
243 sel, src_fields_collection, src_fields_frac_mask_collection,
244 tgt_field_collection);
250 double *** src_fields_collection;
251 double *** src_fields_frac_mask_collection;
252 double ** tgt_field_collection;
255 sel, &src_fields_collection, &src_fields_frac_mask_collection,
256 &tgt_field_collection);
258 interp, src_fields_collection, src_fields_frac_mask_collection,
259 1, frac_mask_fallback_value, 1.0, 0.0);
261 interp, tgt_field_collection,
262 frac_mask_fallback_value, 1.0, 0.0);
267 PUT_ERR(
"ERROR in execute_put_test");
270 PUT_ERR(
"ERROR in execute_get_test");
274 redist, sel, src_fields_collection, tgt_field_collection);
278 sel, src_fields_collection, src_fields_frac_mask_collection,
279 tgt_field_collection);
285 double *** src_fields_collection;
286 double *** src_fields_frac_mask_collection;
287 double ** tgt_field_collection;
290 sel, &src_fields_collection, &src_fields_frac_mask_collection,
291 &tgt_field_collection);
294 interp, src_fields_collection, src_fields_frac_mask_collection,
295 1, frac_mask_fallback_value, 1.0, 0.0);
297 interp, tgt_field_collection,
298 frac_mask_fallback_value, 1.0, 0.0);
304 PUT_ERR(
"ERROR in execute_put_test");
307 PUT_ERR(
"ERROR in execute_get_test");
311 redist, sel, src_fields_collection, tgt_field_collection);
315 sel, src_fields_collection, src_fields_frac_mask_collection,
316 tgt_field_collection);
322 double *** src_fields_collection;
323 double *** src_fields_frac_mask_collection;
324 double ** tgt_field_collection;
326 sel, &src_fields_collection, &src_fields_frac_mask_collection,
327 &tgt_field_collection);
330 interp, src_fields_collection,
331 src_fields_frac_mask_collection,
332 1, frac_mask_fallback_value, 1.0, 0.0);
334 interp, tgt_field_collection,
335 frac_mask_fallback_value, 1.0, 0.0);
343 PUT_ERR(
"ERROR in execute_put_test");
346 PUT_ERR(
"ERROR in execute_get_test");
350 redist, sel, src_fields_collection, tgt_field_collection);
354 sel, src_fields_collection, src_fields_frac_mask_collection,
355 tgt_field_collection);
361 double *** src_fields_collection;
362 double *** src_fields_frac_mask_collection;
363 double ** tgt_field_collection;
365 sel, &src_fields_collection, &src_fields_frac_mask_collection,
366 &tgt_field_collection);
369 interp, tgt_field_collection,
370 frac_mask_fallback_value, 1.0, 0.0);
372 interp, src_fields_collection, src_fields_frac_mask_collection,
373 1, frac_mask_fallback_value, 1.0, 0.0);
379 PUT_ERR(
"ERROR in execute_put_test");
382 PUT_ERR(
"ERROR in execute_get_test");
386 redist, sel, src_fields_collection, tgt_field_collection);
390 sel, src_fields_collection, src_fields_frac_mask_collection,
391 tgt_field_collection);
399 xt_redist_delete(redist);
407 xt_idxlist_delete(src_idxlist);
415static void utest_init_data(
417 double **** src_fields_frac_mask_collection,
418 double *** tgt_field_collection) {
423 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
425 *src_fields_collection =
427 *src_fields_frac_mask_collection =
432 (*src_fields_collection)[c] =
434 (*src_fields_frac_mask_collection)[c] =
439 (*src_fields_collection)[c][f] =
441 (*src_fields_frac_mask_collection)[c][f] =
445 (*src_fields_collection)[c][f][
i] =
446 (double)(c*1000 + f*100 + rank*10 + i);
447 (*src_fields_frac_mask_collection)[c][f][
i] = 1.0;
452 *tgt_field_collection =
457 (*tgt_field_collection)[c] =
466static void utest_free_data(
468 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection) {
476 free(src_fields_collection[c][f]);
477 free(src_fields_frac_mask_collection[c][f]);
480 free(src_fields_collection[c]);
481 free(src_fields_frac_mask_collection[c]);
484 free(src_fields_collection);
485 free(src_fields_frac_mask_collection);
489 free(tgt_field_collection[c]);
492 free(tgt_field_collection);
495static void utest_check_direct(
497 double *** src_fields_collection,
double ** tgt_field_collection) {
501 size_t const * collection_indices =
507 double ** ref_tgt_field_collection =
510 ref_tgt_field_collection[c] =
521 size_t c_idx = (collection_indices == NULL)?c:collection_indices[c];
524 xt_redist_s_exchange1(
525 redist, src_fields_collection[c_idx][0], ref_tgt_field_collection[c]);
530 if (tgt_field_collection[c][i] != ref_tgt_field_collection[c][i])
531 PUT_ERR(
"wrong data in direct interpolation");
536 free(ref_tgt_field_collection[c]);
538 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_new(struct yac_collection_selection const *collection_selection, Xt_redist redist_)
Create a direct redistribution interpolation operator.
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.
Direct redistribution operator in YAC.
double const YAC_FRAC_MASK_NO_VALUE
Public interface for interpolation execution in YAC.
Abstract interpolation operator type.