27static void utest_init_data(
29 double **** src_fields_frac_mask_collection,
double *** tgt_field_collection);
30static void utest_free_data(
32 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection);
34 Xt_redist * src_halo_redists,
35 Xt_redist tgt_result_redist,
37 size_t * num_src_points_per_field,
38 size_t * num_src_per_tgt,
double * weights,
39 size_t * src_field_idx,
size_t * src_idx,
40 size_t num_src_fields,
41 double frac_mask_fallback_value,
42 double *** src_fields_collection,
43 double *** src_fields_frac_mask_collection,
44 double ** tgt_field_collection);
53#define TGT_UNSET_VALUE (-1.0)
58 xt_initialize(MPI_COMM_WORLD);
60 int comm_rank, comm_size;
61 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
62 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
65 PUT_ERR(
"ERROR: test requires 2 processes");
77 } collection_selection_configs[] =
79 {.N = 3, .indices = (
size_t[]){0, 3, 2}},
81 {.N = 4, .indices = (
size_t[]){0, 1, 2, 3}},
83 {.N = 4, .indices = NULL}};
84 enum { NUM_COLL_SEL_CONFIGS =
85 sizeof(collection_selection_configs) /
86 sizeof(collection_selection_configs[0]) };
89 for (
size_t sel_idx = 0; sel_idx < NUM_COLL_SEL_CONFIGS; ++sel_idx) {
93 collection_selection_configs[sel_idx].
N,
94 collection_selection_configs[sel_idx].indices);
166 size_t * num_src_per_tgt;
169 size_t * src_field_idx;
184 size_t num_src_fields;
196 .src_global_ids_per_field = {NULL},
197 .num_src_points_per_field = {0},
198 .num_src_per_tgt = NULL,
200 .src_field_idx = NULL,
211 .src_global_ids_per_field = {NULL},
212 .num_src_points_per_field = {0},
213 .num_src_per_tgt = NULL,
215 .src_field_idx = NULL,
219 .num_src_fields = 1},
237 .ids = (Xt_int[]){4,5,6,7},
239 .src_global_ids_per_field = {NULL,NULL,NULL},
240 .num_src_points_per_field = {0,0,0},
241 .num_src_per_tgt = (
size_t[]){1,1,1,1},
242 .weights = (
double[]){1.0,1.0,1.0,1.0},
243 .src_field_idx = (
size_t[]){1,1,1,1},
244 .src_idx = (
size_t[]){0,1,2,3}},
248 {.ids = (Xt_int[]){4,5,6,7},
249 .offsets = (
int[]){0,1,2,3},
254 .src_global_ids_per_field = {NULL,NULL,NULL},
255 .num_src_points_per_field = {0,0,0},
256 .num_src_per_tgt = NULL,
258 .src_field_idx = NULL,
262 .num_src_fields = 3},
278 .ids = (Xt_int[]){5,7},
280 .src_global_ids_per_field = {NULL,NULL,NULL},
281 .num_src_points_per_field = {0,0,0},
282 .num_src_per_tgt = (
size_t[]){3,3},
283 .weights = (
double[]){0.4,0.3,0.3, 0.4,0.3,0.3},
284 .src_field_idx = (
size_t[]){0,1,2, 0,1,2},
285 .src_idx = (
size_t[]){1,1,1, 3,3,3}},
289 {.ids = (Xt_int[]){5,7},
290 .offsets = (
int[]){1,3},
295 .src_global_ids_per_field = {NULL,NULL,NULL},
296 .num_src_points_per_field = {0,0,0},
297 .num_src_per_tgt = NULL,
299 .src_field_idx = NULL,
303 .num_src_fields = 3},
315 {.ids = (Xt_int[]){1,3},
316 .offsets = (
int[]){1,3},
319 .ids = (Xt_int[]){1,3},
321 .src_global_ids_per_field = {NULL,NULL,NULL},
322 .num_src_points_per_field = {0,0,0},
323 .num_src_per_tgt = (
size_t[]){3,3},
324 .weights = (
double[]){0.4,0.3,0.3, 0.4,0.3,0.3},
325 .src_field_idx = (
size_t[]){0,1,2, 0,1,2},
326 .src_idx = (
size_t[]){1,1,1, 3,3,3}},
336 .src_global_ids_per_field = {NULL,NULL,NULL},
337 .num_src_points_per_field = {0,0,0},
338 .num_src_per_tgt = NULL,
340 .src_field_idx = NULL,
344 .num_src_fields = 3},
362 .ids = (Xt_int[]){4,6},
364 .src_global_ids_per_field = {NULL,
367 .num_src_points_per_field = {0,2,1},
368 .num_src_per_tgt = (
size_t[]){4,3},
369 .weights = (
double[]){0.1,0.1,0.1,0.1, 0.2,0.2,0.2},
370 .src_field_idx = (
size_t[]){1,1,SIZE_MAX,SIZE_MAX,
372 .src_idx = (
size_t[]){0,1,0,1, 2,2,2}},
376 {.ids = (Xt_int[]){4,6},
377 .offsets = (
int[]){0,2},
382 .src_global_ids_per_field = {NULL,NULL,NULL},
383 .num_src_points_per_field = {0,0,0},
384 .num_src_per_tgt = NULL,
386 .src_field_idx = NULL,
390 .num_src_fields = 3},
413 {.ids = (Xt_int[]){0,1,2,3},
414 .offsets = (
int[]){0,1,2,3},
417 .ids = (Xt_int[]){1,2,0,4,5},
419 .src_global_ids_per_field = {(Xt_int[]){6,7},
422 .num_src_points_per_field = {2,2,1},
423 .num_src_per_tgt = (
size_t[]){4,2,1,4,2},
424 .weights = (
double[]){0.1,0.2,0.3,0.4,
429 .src_field_idx = (
size_t[]){0,0,SIZE_MAX,SIZE_MAX,
432 1,1,SIZE_MAX,SIZE_MAX,
434 .src_idx = (
size_t[]){0,1,0,1,
442 {.ids = (Xt_int[]){4,5,6,7},
443 .offsets = (
int[]){0,1,2,3},
446 .ids = (Xt_int[]){3,6,7},
448 .src_global_ids_per_field = {(Xt_int[]){0,1},
451 .num_src_points_per_field = {2,2,0},
452 .num_src_per_tgt = (
size_t[]){4,4,2},
453 .weights = (
double[]){0.25,0.25,0.25,0.25,
456 .src_field_idx = (
size_t[]){2,2,2,2,
457 SIZE_MAX,SIZE_MAX,0,0,
459 .src_idx = (
size_t[]){0,1,2,3,
464 .num_src_fields = 3}};
466 NUM_INTERP_CONFIGS =
sizeof(interp_configs) /
sizeof(interp_configs[0])};
475 src_global_ids[src_idx] =
477 Xt_idxlist src_idxlist =
481 for (
size_t interp_config_idx = 0; interp_config_idx < NUM_INTERP_CONFIGS;
482 ++interp_config_idx) {
486 size_t num_src_fields =
487 interp_configs[interp_config_idx].num_src_fields;
488 Xt_redist src_halo_redists[num_src_fields];
489 for (
size_t src_field_idx = 0; src_field_idx < num_src_fields;
495 Xt_idxlist required_source_idxlist =
496 (interp_configs[interp_config_idx].
497 interp_data[comm_rank].
498 tgt_send.num_src_points_per_field[src_field_idx] > 0)?
500 interp_configs[interp_config_idx].
501 interp_data[comm_rank].
502 tgt_send.src_global_ids_per_field[src_field_idx],
503 interp_configs[interp_config_idx].
504 interp_data[comm_rank].
505 tgt_send.num_src_points_per_field[src_field_idx]):
509 src_idxlist, required_source_idxlist, MPI_COMM_WORLD);
510 src_halo_redists[src_field_idx] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
511 xt_xmap_delete(xmap);
512 xt_idxlist_delete(required_source_idxlist);
518 Xt_redist tgt_result_redist;
520 Xt_idxlist interpolated_target_idxlist =
521 (interp_configs[interp_config_idx].
522 interp_data[comm_rank].tgt_send.count > 0)?
524 interp_configs[interp_config_idx].
525 interp_data[comm_rank].tgt_send.ids,
526 interp_configs[interp_config_idx].
527 interp_data[comm_rank].tgt_send.count):
529 int * interpolated_target_offsets =
531 interp_configs[interp_config_idx].
532 interp_data[comm_rank].tgt_send.count *
533 sizeof(*interpolated_target_offsets));
535 t < interp_configs[interp_config_idx].
536 interp_data[comm_rank].tgt_send.count; ++t) {
537 interpolated_target_offsets[t] = (int)t;
539 Xt_idxlist required_target_idxlist =
540 (interp_configs[interp_config_idx].
541 interp_data[comm_rank].tgt_receive.count > 0)?
543 interp_configs[interp_config_idx].
544 interp_data[comm_rank].tgt_receive.ids,
545 interp_configs[interp_config_idx].
546 interp_data[comm_rank].tgt_receive.count):
551 interpolated_target_idxlist, required_target_idxlist,
554 xt_redist_p2p_off_new(
555 xmap, interpolated_target_offsets,
556 interp_configs[interp_config_idx].
557 interp_data[comm_rank].tgt_receive.offsets, MPI_DOUBLE);
559 xt_xmap_delete(xmap);
560 xt_idxlist_delete(required_target_idxlist);
561 xt_idxlist_delete(interpolated_target_idxlist);
562 free(interpolated_target_offsets);
565 for (
int with_frac_mask = 0; with_frac_mask <= 1; ++with_frac_mask) {
569 double frac_mask_fallback_value =
572 for (
int use_weights = 0; use_weights <= 1; ++use_weights) {
577 interp_configs[interp_config_idx].
578 interp_data[comm_rank].tgt_send.weights:NULL;
582 size_t total_num_receive_src_points = 0;
584 i < interp_configs[interp_config_idx].
585 interp_data[comm_rank].tgt_send.count; ++i) {
586 total_num_receive_src_points +=
587 interp_configs[interp_config_idx].
588 interp_data[comm_rank].tgt_send.num_src_per_tgt[i];
590 for (
size_t i = 0; i < total_num_receive_src_points; ++i) {
592 (interp_configs[interp_config_idx].
593 interp_data[comm_rank].
594 tgt_send.src_field_idx[i] == SIZE_MAX) ||
595 (interp_configs[interp_config_idx].
596 interp_data[comm_rank].
597 tgt_send.src_field_idx[i] < num_src_fields),
598 "ERROR in src_field_idx");
600 interp_configs[interp_config_idx].
601 interp_data[comm_rank].tgt_send.src_idx[i] <
602 total_num_receive_src_points,
610 sel, src_halo_redists,
611 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
612 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
614 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
615 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
616 num_src_fields, tgt_result_redist, with_frac_mask);
620 for (
int use_copy = 0; use_copy <= 1; ++use_copy) {
626 interp = interp_copy;
632 interp_configs[interp_config_idx].
633 interp_data[comm_rank].is_source)
637 interp_configs[interp_config_idx].
638 interp_data[comm_rank].is_target)
645 double *** src_fields_collection;
646 double *** src_fields_frac_mask_collection;
647 double ** tgt_field_collection;
649 sel, &src_fields_collection, &src_fields_frac_mask_collection,
650 &tgt_field_collection);
653 interp, src_fields_collection, src_fields_frac_mask_collection,
654 tgt_field_collection, frac_mask_fallback_value, 1.0, 0.0);
659 PUT_ERR(
"ERROR in execute_put_test");
662 PUT_ERR(
"ERROR in execute_get_test");
665 utest_check_sum_mvp_at_src(
666 sel, src_halo_redists, tgt_result_redist,
667 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
668 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_points_per_field,
669 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
671 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
672 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
673 num_src_fields, frac_mask_fallback_value,
674 src_fields_collection, src_fields_frac_mask_collection,
675 tgt_field_collection);
679 sel, src_fields_collection, src_fields_frac_mask_collection,
680 tgt_field_collection);
686 double *** src_fields_collection;
687 double *** src_fields_frac_mask_collection;
688 double ** tgt_field_collection;
690 sel, &src_fields_collection, &src_fields_frac_mask_collection,
691 &tgt_field_collection);
694 interp, src_fields_collection,
695 src_fields_frac_mask_collection,
696 1, frac_mask_fallback_value, 1.0, 0.0);
698 interp, tgt_field_collection,
699 frac_mask_fallback_value, 1.0, 0.0);
704 PUT_ERR(
"ERROR in execute_put_test");
707 PUT_ERR(
"ERROR in execute_get_test");
710 utest_check_sum_mvp_at_src(
711 sel, src_halo_redists, tgt_result_redist,
712 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
713 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_points_per_field,
714 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
716 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
717 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
718 num_src_fields, frac_mask_fallback_value,
719 src_fields_collection, src_fields_frac_mask_collection,
720 tgt_field_collection);
724 sel, src_fields_collection, src_fields_frac_mask_collection,
725 tgt_field_collection);
731 double *** src_fields_collection;
732 double *** src_fields_frac_mask_collection;
733 double ** tgt_field_collection;
735 sel, &src_fields_collection, &src_fields_frac_mask_collection,
736 &tgt_field_collection);
739 interp, src_fields_collection,
740 src_fields_frac_mask_collection,
741 1, frac_mask_fallback_value, 1.0, 0.0);
743 interp, tgt_field_collection,
744 frac_mask_fallback_value, 1.0, 0.0);
750 PUT_ERR(
"ERROR in execute_put_test");
753 PUT_ERR(
"ERROR in execute_get_test");
756 utest_check_sum_mvp_at_src(
757 sel, src_halo_redists, tgt_result_redist,
758 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
759 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_points_per_field,
760 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
762 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
763 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
764 num_src_fields, frac_mask_fallback_value,
765 src_fields_collection, src_fields_frac_mask_collection,
766 tgt_field_collection);
770 sel, src_fields_collection, src_fields_frac_mask_collection,
771 tgt_field_collection);
777 double *** src_fields_collection;
778 double *** src_fields_frac_mask_collection;
779 double ** tgt_field_collection;
781 sel, &src_fields_collection, &src_fields_frac_mask_collection,
782 &tgt_field_collection);
785 interp, src_fields_collection,
786 src_fields_frac_mask_collection,
787 1, frac_mask_fallback_value, 1.0, 0.0);
789 interp, tgt_field_collection,
790 frac_mask_fallback_value, 1.0, 0.0);
798 PUT_ERR(
"ERROR in execute_put_test");
801 PUT_ERR(
"ERROR in execute_get_test");
804 utest_check_sum_mvp_at_src(
805 sel, src_halo_redists, tgt_result_redist,
806 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
807 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_points_per_field,
808 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
810 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
811 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
812 num_src_fields, frac_mask_fallback_value,
813 src_fields_collection, src_fields_frac_mask_collection,
814 tgt_field_collection);
818 sel, src_fields_collection, src_fields_frac_mask_collection,
819 tgt_field_collection);
825 double *** src_fields_collection;
826 double *** src_fields_frac_mask_collection;
827 double ** tgt_field_collection;
829 sel, &src_fields_collection, &src_fields_frac_mask_collection,
830 &tgt_field_collection);
833 interp, tgt_field_collection,
834 frac_mask_fallback_value, 1.0, 0.0);
836 interp, src_fields_collection,
837 src_fields_frac_mask_collection,
838 1, frac_mask_fallback_value, 1.0, 0.0);
844 PUT_ERR(
"ERROR in execute_put_test");
847 PUT_ERR(
"ERROR in execute_get_test");
850 utest_check_sum_mvp_at_src(
851 sel, src_halo_redists, tgt_result_redist,
852 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.count,
853 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_points_per_field,
854 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.num_src_per_tgt,
856 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_field_idx,
857 interp_configs[interp_config_idx].interp_data[comm_rank].tgt_send.src_idx,
858 num_src_fields, frac_mask_fallback_value,
859 src_fields_collection, src_fields_frac_mask_collection,
860 tgt_field_collection);
864 sel, src_fields_collection, src_fields_frac_mask_collection,
865 tgt_field_collection);
875 xt_redist_delete(tgt_result_redist);
876 for (
size_t f = 0; f < num_src_fields; ++f)
877 xt_redist_delete(src_halo_redists[f]);
881 xt_idxlist_delete(src_idxlist);
891static void utest_init_data(
893 double **** src_fields_frac_mask_collection,
894 double *** tgt_field_collection) {
899 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
901 *src_fields_collection =
903 *src_fields_frac_mask_collection =
908 (*src_fields_collection)[c] =
910 (*src_fields_frac_mask_collection)[c] =
915 (*src_fields_collection)[c][f] =
917 (*src_fields_frac_mask_collection)[c][f] =
921 (*src_fields_collection)[c][f][
i] =
922 (double)(c*1000 + f*100 + rank*10 + i);
923 (*src_fields_frac_mask_collection)[c][f][
i] = 1.0;
928 *tgt_field_collection =
933 (*tgt_field_collection)[c] =
942static void utest_free_data(
944 double *** src_fields_frac_mask_collection,
double ** tgt_field_collection) {
952 free(src_fields_collection[c][f]);
953 free(src_fields_frac_mask_collection[c][f]);
956 free(src_fields_collection[c]);
957 free(src_fields_frac_mask_collection[c]);
960 free(src_fields_collection);
961 free(src_fields_frac_mask_collection);
965 free(tgt_field_collection[c]);
968 free(tgt_field_collection);
972 Xt_redist * src_halo_redists,
973 Xt_redist tgt_result_redist,
975 size_t * num_src_points_per_field,
976 size_t * num_src_per_tgt,
double * weights,
977 size_t * src_field_idx,
size_t * src_idx,
978 size_t num_src_fields,
979 double frac_mask_fallback_value,
980 double *** src_fields_collection,
981 double *** src_fields_frac_mask_collection,
982 double ** tgt_field_collection) {
990 double ** ref_tgt_field_collection =
993 ref_tgt_field_collection[c] =
1002 size_t * prefix_num_src_per_tgt =
1003 xmalloc((tgt_count+1) *
sizeof(*prefix_num_src_per_tgt));
1004 prefix_num_src_per_tgt[0] = 0;
1005 for (
size_t i = 0, accu = 0;
i < tgt_count; ++
i) {
1006 accu += num_src_per_tgt[
i];
1007 prefix_num_src_per_tgt[
i+1] = accu;
1013 double ** temp_tgt_field_collection =
1016 temp_tgt_field_collection[c] =
1017 xmalloc(tgt_count *
sizeof(**temp_tgt_field_collection));
1018 for (
size_t i = 0;
i < tgt_count; ++
i) {
1025 size_t * tgt_pos =
xmalloc(tgt_count *
sizeof(*tgt_pos));
1026 for (
size_t t = 0;
t < tgt_count; ++
t) {tgt_pos[
t] =
t;}
1030 double *** cont_src_fields_collection =
1032 double *** cont_src_fields_frac_mask_collection =
1036 size_t c_idx = (collection_indices == NULL) ? c : collection_indices[c];
1037 cont_src_fields_collection[c] =
1038 src_fields_collection[c_idx];
1039 cont_src_fields_frac_mask_collection[c] =
1040 src_fields_frac_mask_collection[c_idx];
1050 enum {SRC_FIELD = 0, SRC_FRAC_MASK = 1};
1054 for (
size_t i = 0;
i < 2; ++
i) {
1057 remote_src_buffer[
i][c] =
1060 sizeof(remote_src_buffer[i][c][0]));
1064 remote_src_buffer[
i][c][k] = NAN;
1069 for (
size_t f = 0, offset = 0; f < num_src_fields; ++f) {
1070 remote_src_fields[c][f] =
1071 &remote_src_buffer[SRC_FIELD][c][offset];
1072 remote_src_frac_masks[c][f] =
1073 &remote_src_buffer[SRC_FRAC_MASK][c][offset];
1074 offset += num_src_points_per_field[f];
1082 size_t c_idx = (collection_indices == NULL) ? c : collection_indices[c];
1085 for (
size_t f = 0; f < num_src_fields; ++f) {
1089 xt_redist_s_exchange1(
1090 src_halo_redists[f],
1091 (
const void *)(src_fields_collection[c_idx][f]),
1092 (
void *)(remote_src_fields[c][f]));
1093 xt_redist_s_exchange1(
1094 src_halo_redists[f],
1095 (
const void *)(src_fields_frac_mask_collection[c_idx][f]),
1096 (
void *)(remote_src_frac_masks[c][f]));
1102 (
double const * restrict **)cont_src_fields_collection,
1103 (
double const * restrict **)cont_src_fields_frac_mask_collection,
1104 (
double const **)remote_src_fields,
1105 (
double const **)remote_src_frac_masks,
1106 temp_tgt_field_collection,
1107 tgt_pos, tgt_count, prefix_num_src_per_tgt, weights,
1109 frac_mask_fallback_value, 1.0, 0.0);
1116 xt_redist_s_exchange1(
1118 (
const void *)(temp_tgt_field_collection[c]),
1119 (
void *)(ref_tgt_field_collection[c]));
1128 if (fabs(tgt_field_collection[c][i] -
1129 ref_tgt_field_collection[c][i]) > 1e-9) {
1130 PUT_ERR(
"wrong data in sum_mvp_at_src interpolation");
1136 free(prefix_num_src_per_tgt);
1137 free(cont_src_fields_collection);
1138 free(cont_src_fields_frac_mask_collection);
1139 for (
size_t i = 0;
i < 2; ++
i) {
1141 free(remote_src_buffer[i][c]);
1145 free(ref_tgt_field_collection[c]);
1147 free(ref_tgt_field_collection);
1149 free(temp_tgt_field_collection[c]);
1151 free(temp_tgt_field_collection);
#define YAC_ASSERT(exp, msg)
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_sum_mvp_at_src_new(struct yac_collection_selection const *collection_selection, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist_, int with_frac_mask)
Create a sum (weighted or unweighted) interpolation operator computed on the source processes.
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.
Weighted/unweighted sum operator at source in YAC.
double const YAC_FRAC_MASK_NO_VALUE
Public interface for interpolation execution in YAC.
static void compute_tgt_field_wgt(double const *restrict **src_fields, double const *restrict **src_frac_masks, double const *restrict *remote_src_fields, double const *restrict *remote_src_frac_masks, double *restrict *tgt_field, size_t const *restrict tgt_pos, size_t tgt_count, size_t const *restrict prefix_num_src_per_tgt, double const *restrict weights, size_t const *restrict src_field_idx, size_t const *restrict src_idx, size_t num_src_fields, size_t collection_size, double frac_mask_fallback_value, double scale_factor, double scale_summand)
Compute target field values optionally using weighted sums of source data and optionally applying fra...
Abstract interpolation operator type.