22#define FRAC_MASK_VALUE (-1337.0)
25 ((X) * scaling_factors[scaling_factor_idx] + \
26 scaling_summand[scaling_summand_idx])
28static int utest_check_interpolation(
30 double * src_data_raw,
size_t num_src_fields,
size_t src_field_size,
31 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
33static int utest_check_interpolation_frac(
35 double * src_data_raw,
double * src_frac_mask_raw,
36 size_t num_src_fields,
size_t src_field_size,
37 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
43 xt_initialize(MPI_COMM_WORLD);
45 int comm_rank, comm_size;
46 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
47 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
48 MPI_Barrier(MPI_COMM_WORLD);
50 double scaling_factors[] = {1.0, 0.1, -1.0, 0.5, 10.0};
51 double scaling_summand[] = {0.0, -1.0, 1.0, 10.0};
54 NUM_SCALING_FACTORS =
sizeof(scaling_factors) /
sizeof(scaling_factors[0]),
55 NUM_SCALING_SUMMAND =
sizeof(scaling_summand) /
sizeof(scaling_summand[0]),
58 if (comm_size != num_procs) {
59 PUT_ERR(
"ERROR: wrong number of processes");
68 enum {num_fixed_values = 2};
69 double value[num_fixed_values] = {-1.0, 1.0};
70 size_t count[num_fixed_values] = {8, 8};
71 size_t pos[num_fixed_values][8] = {{0, 2, 4, 6, 8, 10, 12, 14},
72 {1, 3, 5, 7, 9, 11, 13, 15}};
74 for (
int scaling_factor_idx = 0;
75 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
76 for (
int scaling_summand_idx = 0;
77 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
85 scaling_factors[scaling_factor_idx],
86 scaling_summand[scaling_summand_idx]);
87 for (
int i = 0;
i < num_fixed_values; ++
i)
89 interp,
value[i], count[i], pos[i]);
91 enum {num_src_fields = 1};
92 enum {src_field_size = 0};
93 double * src_data_raw = NULL;
94 enum {tgt_field_size = 16};
96 {{-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1}};
98 if (utest_check_interpolation(
99 interp, src_data_raw, num_src_fields, src_field_size,
100 &ref_tgt_data_raw[0][0], tgt_field_size,
102 PUT_ERR(
"ERROR in yac_interpolation_add_fixed");
118 Xt_int src_indices[num_procs][4] =
119 {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
120 size_t num_src_indices[num_procs] = {4,4,0,0};
121 Xt_int dst_indices[num_procs][4] = {{-1},{0,2},{0,4,2,6},{-1}};
122 size_t num_dst_indices[num_procs] = {0,2,4,0};
123 Xt_idxlist src_idxlist =
124 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
125 Xt_idxlist dst_idxlist =
126 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
128 = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
129 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
130 xt_xmap_delete(xmap);
131 xt_idxlist_delete(dst_idxlist);
132 xt_idxlist_delete(src_idxlist);
138 } collection_selection_configs[] =
139 {{.N = 3, .indices = (
size_t[]){0, 2, 3}},
140 {.N = 4, .indices = (
size_t[]){0, 1, 2, 3}},
141 {.N = 2, .indices = NULL}};
143 NUM_COLL_SEL_CONFIGS =
144 sizeof(collection_selection_configs)/
145 sizeof(collection_selection_configs[0]) };
148 for (
size_t sel_idx = 0; sel_idx < NUM_COLL_SEL_CONFIGS; ++sel_idx) {
152 collection_selection_configs[sel_idx].
N,
153 collection_selection_configs[sel_idx].indices);
155 for (
int scaling_factor_idx = 0;
156 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
157 for (
int scaling_summand_idx = 0;
158 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
163 scaling_factors[scaling_factor_idx],
164 scaling_summand[scaling_summand_idx]);
168 size_t const src_field_size[num_procs] = {4,4,0,0};
170 {{{0,1,2,3}},{{4,5,6,7}},{{-1}},{{-1}}};
171 size_t const tgt_field_size[num_procs] = {0,4,4,0};
172 double ref_tgt_data_raw[num_procs][4] =
178 if (utest_check_interpolation(
180 (src_field_size[comm_rank] > 0)?
181 (&src_data_raw[comm_rank][0][0]):NULL,
183 (tgt_field_size[comm_rank] > 0)?
184 (&ref_tgt_data_raw[comm_rank][0]):NULL,
185 tgt_field_size[comm_rank], SRC_COLLECTION_SIZE,
187 PUT_ERR(
"ERROR in yac_interpolation_add_direct");
194 xt_redist_delete(redist);
205 Xt_int src_indices[num_procs][4] =
206 {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
207 size_t num_src_indices[num_procs] = {4,4,0,0};
208 Xt_int dst_indices[num_procs][4] = {{-1},{0,2},{0,4,2,6},{-1}};
209 size_t num_dst_indices[num_procs] = {0,2,4,0};
210 Xt_idxlist src_idxlist =
211 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
212 Xt_idxlist dst_idxlist =
213 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
215 = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
216 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
217 xt_xmap_delete(xmap);
218 xt_idxlist_delete(dst_idxlist);
219 xt_idxlist_delete(src_idxlist);
221 for (
int scaling_factor_idx = 0;
222 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
223 for (
int scaling_summand_idx = 0;
224 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
232 scaling_factors[scaling_factor_idx],
233 scaling_summand[scaling_summand_idx]);
236 enum {num_src_fields = 1};
237 size_t const src_field_size[num_procs] = {4,4,0,0};
238 double src_data_raw[num_procs][num_src_fields][4] =
239 {{{0,1,2,3}},{{4,5,6,7}},{{-1}},{{-1}}};
240 double src_frac_mask_raw[num_procs][num_src_fields][4] =
241 {{{1.0,1.0,0.0,1.0}},{{0.5,0.5,0.5,0.5}},{{-1}},{{-1}}};
242 size_t const tgt_field_size[num_procs] = {0,4,4,0};
249 if (utest_check_interpolation_frac(
251 (src_field_size[comm_rank] > 0)?
252 (&src_data_raw[comm_rank][0][0]):NULL,
253 (src_field_size[comm_rank] > 0)?
254 (&src_frac_mask_raw[comm_rank][0][0]):NULL,
255 num_src_fields, src_field_size[comm_rank],
256 (tgt_field_size[comm_rank] > 0)?
257 (&ref_tgt_data_raw[comm_rank][0][0]):NULL,
260 PUT_ERR(
"ERROR in yac_interpolation_add_direct");
266 xt_redist_delete(redist);
277 enum {num_src_fields = 2};
278 enum {num_src_indices = 4};
279 Xt_int src_indices[num_procs][num_src_indices] =
280 {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
281 Xt_int dst_indices[num_procs][2][2] = {{{-1},{-1}},
285 int src_offsets[num_procs] = {0,1,2,3};
286 int dst_offsets[num_procs][num_src_fields][2] = {{{-1},{-1}},
290 size_t num_dst_indices[num_procs][num_src_fields] =
291 {{0,0},{2,2},{2,2},{0,0}};
293 for (
int i = 0;
i < num_src_fields; ++
i) {
294 Xt_idxlist src_idxlist =
295 xt_idxvec_new(src_indices[comm_rank], num_src_indices);
296 Xt_idxlist dst_idxlist =
297 xt_idxvec_new(dst_indices[comm_rank][i], num_dst_indices[comm_rank][i]);
299 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
301 xt_redist_p2p_off_new(
302 xmap, src_offsets, dst_offsets[comm_rank][i], MPI_DOUBLE);
303 xt_xmap_delete(xmap);
304 xt_idxlist_delete(dst_idxlist);
305 xt_idxlist_delete(src_idxlist);
308 for (
int scaling_factor_idx = 0;
309 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
310 for (
int scaling_summand_idx = 0;
311 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
319 scaling_factors[scaling_factor_idx],
320 scaling_summand[scaling_summand_idx]);
323 size_t const src_field_size[num_procs] = {4,4,4,4};
324 double src_data_raw[num_procs][num_src_fields][num_src_indices] =
325 {{{0,1,2,3},{00,10,20,30}},
326 {{4,5,6,7},{40,50,60,70}},
327 {{8,9,10,11},{80,90,100,110}},
328 {{12,13,14,15},{120,130,140,150}}};
329 size_t const tgt_field_size[num_procs] = {0,4,4,0};
336 if (utest_check_interpolation(
338 (src_field_size[comm_rank] > 0)?
339 (&src_data_raw[comm_rank][0][0]):NULL,
340 num_src_fields, src_field_size[comm_rank],
341 (tgt_field_size[comm_rank] > 0)?
342 (&ref_tgt_data_raw[comm_rank][0][0]):NULL,
345 PUT_ERR(
"ERROR in yac_interpolation_add_direct_mf");
351 xt_redist_delete(redists[1]);
352 xt_redist_delete(redists[0]);
363 enum {num_src_fields = 2};
364 enum {num_src_indices = 4};
365 Xt_int src_indices[num_procs][num_src_indices] =
366 {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
367 Xt_int dst_indices[num_procs][2][2] = {{{-1},{-1}},
371 int src_offsets[num_procs] = {0,1,2,3};
372 int dst_offsets[num_procs][num_src_fields][2] = {{{-1},{-1}},
376 size_t num_dst_indices[num_procs][num_src_fields] =
377 {{0,0},{2,2},{2,2},{0,0}};
379 for (
int i = 0;
i < num_src_fields; ++
i) {
380 Xt_idxlist src_idxlist =
381 xt_idxvec_new(src_indices[comm_rank], num_src_indices);
382 Xt_idxlist dst_idxlist =
383 xt_idxvec_new(dst_indices[comm_rank][i], num_dst_indices[comm_rank][i]);
385 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
387 xt_redist_p2p_off_new(
388 xmap, src_offsets, dst_offsets[comm_rank][i], MPI_DOUBLE);
389 xt_xmap_delete(xmap);
390 xt_idxlist_delete(dst_idxlist);
391 xt_idxlist_delete(src_idxlist);
394 for (
int scaling_factor_idx = 0;
395 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
396 for (
int scaling_summand_idx = 0;
397 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
405 scaling_factors[scaling_factor_idx],
406 scaling_summand[scaling_summand_idx]);
409 size_t const src_field_size[num_procs] = {4,4,4,4};
410 double src_data_raw[num_procs][num_src_fields][num_src_indices] =
411 {{{0,1,2,3},{00,10,20,30}},
412 {{4,5,6,7},{40,50,60,70}},
413 {{8,9,10,11},{80,90,100,110}},
414 {{12,13,14,15},{120,130,140,150}}};
415 double src_frac_mask_raw[num_procs][num_src_fields][num_src_indices] =
416 {{{1.0,0.0,1.0,1.0},{1.0,1.0,1.0,1.0}},
417 {{0.0,1.0,1.0,1.0},{1.0,0.0,1.0,1.0}},
418 {{1.0,1.0,1.0,1.0},{1.0,1.0,1.0,1.0}},
419 {{1.0,1.0,1.0,1.0},{1.0,1.0,1.0,1.0}}};
420 size_t const tgt_field_size[num_procs] = {0,4,4,0};
427 if (utest_check_interpolation_frac(
429 (src_field_size[comm_rank] > 0)?
430 (&src_data_raw[comm_rank][0][0]):NULL,
431 (src_field_size[comm_rank] > 0)?
432 (&src_frac_mask_raw[comm_rank][0][0]):NULL,
433 num_src_fields, src_field_size[comm_rank],
434 (tgt_field_size[comm_rank] > 0)?
435 (&ref_tgt_data_raw[comm_rank][0][0]):NULL,
438 PUT_ERR(
"ERROR in yac_interpolation_add_direct_mf");
444 xt_redist_delete(redists[1]);
445 xt_redist_delete(redists[0]);
469 enum {num_src_fields = 2};
472 enum {num_src_indices = 4};
473 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
474 {{{0,1,2,3},{16,17,18,19}},
475 {{4,5,6,7},{20,21,22,23}},
476 {{8,9,10,11},{24,25,26,27}},
477 {{12,13,14,15},{28,29,30,31}}};
478 Xt_int dst_indices[num_procs][num_src_fields][1] =
483 size_t num_dst_indices[num_procs][num_src_fields] =
484 {{1,1},{1,1},{0,0},{0,0}};
486 Xt_idxlist src_idxlist =
487 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
488 Xt_idxlist dst_idxlist =
491 num_dst_indices[comm_rank][
field_id]);
493 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
494 halo_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
495 xt_xmap_delete(xmap);
496 xt_idxlist_delete(dst_idxlist);
497 xt_idxlist_delete(src_idxlist);
503 size_t tgt_count[num_procs] = {2,5,0,0};
505 size_t num_src_per_tgt[num_procs][5] =
506 {{4,4},{4,4,1,2,2},{(size_t)-1},{(size_t)-1}};
507 double weights[num_procs][13] =
517 size_t src_field_idx[num_procs][13] =
519 0,1,SIZE_MAX,SIZE_MAX},
520 {SIZE_MAX,SIZE_MAX,1,0,
524 1,1},{(size_t)-1},{(size_t)-1}};
527 size_t src_idx[num_procs][13] =
534 1,2},{(size_t)-1},{(size_t)-1}};
542 Xt_int src_indices[num_procs][5] = {{4,8},{5,6,7,10,11},{-1},{-1}};
543 size_t num_src_indices[num_procs] = {2,5,0,0};
544 Xt_int dst_indices[num_procs][4] = {{-1},{4,5,6,7},{8,4,10,11},{-1}};
545 size_t num_dst_indices[num_procs] = {0,4,4,0};
546 Xt_idxlist src_idxlist =
547 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
548 Xt_idxlist dst_idxlist =
549 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
550 Xt_xmap xmap = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
551 result_redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
552 xt_xmap_delete(xmap);
553 xt_idxlist_delete(dst_idxlist);
554 xt_idxlist_delete(src_idxlist);
557 for (
int scaling_factor_idx = 0;
558 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
559 for (
int scaling_summand_idx = 0;
560 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
561 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
569 scaling_factors[scaling_factor_idx],
570 scaling_summand[scaling_summand_idx]);
573 interp, halo_redists, tgt_count[comm_rank],
574 num_src_per_tgt[comm_rank], weights[comm_rank],
575 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields,
579 interp, halo_redists, tgt_count[comm_rank],
580 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
581 src_idx[comm_rank], num_src_fields, result_redist);
584 enum {src_field_size = 4};
585 double src_data_raw[num_procs][2][src_field_size] =
586 {{{0,1,2,3}, {16,17,18,19}},
587 {{4,5,6,7}, {20,21,22,23}},
588 {{8,9,10,11}, {24,25,26,27}},
589 {{12,13,14,15},{28,29,30,31}}};
590 size_t const tgt_field_size[num_procs] = {0,4,4,0};
597 {{
SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
598 SCALE(0.5*2+0.6*19+0.7*20+0.8*5),
599 SCALE(0.9*6+1.0*22+1.1*7+1.2*23),
601 {{
SCALE(1.4*2+1.5*19+1.6*22+1.7*7),
602 SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
604 SCALE(2.4*21+2.5*22)}},
607 if (utest_check_interpolation(
608 interp, &src_data_raw[comm_rank][0][0],
609 num_src_fields, src_field_size,
610 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
613 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_src/"
614 "yac_interpolation_add_weight_sum_mvp_at_src");
621 xt_redist_delete(result_redist);
622 xt_redist_delete(halo_redists[1]);
623 xt_redist_delete(halo_redists[0]);
649 enum {num_src_fields = 2};
652 enum {num_src_indices = 4};
653 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
654 {{{0,1,2,3},{16,17,18,19}},
655 {{4,5,6,7},{20,21,22,23}},
656 {{8,9,10,11},{24,25,26,27}},
657 {{12,13,14,15},{28,29,30,31}}};
658 Xt_int dst_indices[num_procs][num_src_fields][1] =
663 size_t num_dst_indices[num_procs][num_src_fields] =
664 {{1,1},{1,1},{0,0},{0,0}};
666 Xt_idxlist src_idxlist =
667 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
668 Xt_idxlist dst_idxlist =
671 num_dst_indices[comm_rank][
field_id]);
673 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
674 halo_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
675 xt_xmap_delete(xmap);
676 xt_idxlist_delete(dst_idxlist);
677 xt_idxlist_delete(src_idxlist);
683 size_t tgt_count[num_procs] = {2,5,0,0};
685 size_t num_src_per_tgt[num_procs][5] =
686 {{4,4},{4,4,1,2,2},{(size_t)-1},{(size_t)-1}};
687 double weights[num_procs][13] =
697 size_t src_field_idx[num_procs][13] =
699 0,1,SIZE_MAX,SIZE_MAX},
700 {SIZE_MAX,SIZE_MAX,1,0,
704 1,1},{(size_t)-1},{(size_t)-1}};
707 size_t src_idx[num_procs][13] =
714 1,2},{(size_t)-1},{(size_t)-1}};
722 Xt_int src_indices[num_procs][5] = {{4,8},{5,6,7,10,11},{-1},{-1}};
723 size_t num_src_indices[num_procs] = {2,5,0,0};
724 Xt_int dst_indices[num_procs][4] = {{-1},{4,5,6,7},{8,4,10,11},{-1}};
725 size_t num_dst_indices[num_procs] = {0,4,4,0};
726 Xt_idxlist src_idxlist =
727 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
728 Xt_idxlist dst_idxlist =
729 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
730 Xt_xmap xmap = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
731 result_redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
732 xt_xmap_delete(xmap);
733 xt_idxlist_delete(dst_idxlist);
734 xt_idxlist_delete(src_idxlist);
737 for (
int scaling_factor_idx = 0;
738 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
739 for (
int scaling_summand_idx = 0;
740 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
741 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
749 scaling_factors[scaling_factor_idx],
750 scaling_summand[scaling_summand_idx]);
753 interp, halo_redists, tgt_count[comm_rank],
754 num_src_per_tgt[comm_rank], weights[comm_rank],
755 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields,
759 interp, halo_redists, tgt_count[comm_rank],
760 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
761 src_idx[comm_rank], num_src_fields, result_redist);
764 enum {src_field_size = 4};
765 double src_data_raw[num_procs][2][src_field_size] =
766 {{{0,1,2,3}, {16,17,18,19}},
767 {{4,5,6,7}, {20,21,22,23}},
768 {{8,9,10,11}, {24,25,26,27}},
769 {{12,13,14,15},{28,29,30,31}}};
770 double src_frac_mask_raw[num_procs][2][src_field_size] =
771 {{{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
772 {{1.0, 0.5, 0.0, 0.0}, {0.5, 0.0, 0.0, 0.0}},
773 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
774 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}}};
775 size_t const tgt_field_size[num_procs] = {0,4,4,0};
778 {{
SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)*
780 SCALE((1.0*2+1.0*19+0.5*20+0.5*5)/(1.0+1.0+0.5+0.5)*
783 {{
SCALE((1.0*2+1.0*19+0.0*22+0.0*7)/(1.0+1.0+0.0+0.0)*
785 SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)*
787 SCALE((0.5*5+0.0*6)/(0.5+0.0)*
792 {{
SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
793 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
794 SCALE((1.0*0.5*2+1.0*0.6*19+0.5*0.7*20+0.5*0.8*5)/
795 (1.0*0.5+1.0*0.6+0.5*0.7+0.5*0.8)*
798 {{
SCALE((1.0*1.4*2+1.0*1.5*19+0.0*1.6*22+0.0*1.7*7)/
799 (1.0*1.4+1.0*1.5+0.0*1.6+0.0*1.7)*
801 SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
802 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
803 SCALE((0.5*2.2*5+0.0*2.3*6)/(0.5*2.2+0.0*2.3)*
808 if (utest_check_interpolation_frac(
809 interp, &src_data_raw[comm_rank][0][0],
810 &src_frac_mask_raw[comm_rank][0][0],
811 num_src_fields, src_field_size,
812 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
815 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_src/"
816 "yac_interpolation_add_weight_sum_mvp_at_src frac");
823 xt_redist_delete(result_redist);
824 xt_redist_delete(halo_redists[1]);
825 xt_redist_delete(halo_redists[0]);
849 enum {num_src_fields = 2};
852 enum {num_src_indices = 4};
853 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
854 {{{0,1,2,3},{16,17,18,19}},
855 {{4,5,6,7},{20,21,22,23}},
856 {{8,9,10,11},{24,25,26,27}},
857 {{12,13,14,15},{28,29,30,31}}};
859 Xt_int dst_indices[num_procs][num_src_fields][5] =
862 {{0,2,5,6,7},{17,19,21,22}},
864 size_t num_dst_indices[num_procs][num_src_fields] =
865 {{0,0},{2,2},{5,4},{0,0}};
867 Xt_idxlist src_idxlist =
868 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
869 Xt_idxlist dst_idxlist =
872 num_dst_indices[comm_rank][
field_id]);
874 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
875 src_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
876 xt_xmap_delete(xmap);
877 xt_idxlist_delete(dst_idxlist);
878 xt_idxlist_delete(src_idxlist);
883 size_t tgt_pos[num_procs][4] =
884 {{(size_t)-1},{0,1,2,3},{0,1,2,3},{(size_t)-1}};
886 size_t tgt_count[num_procs] = {0,4,4,0};
888 size_t num_src_per_tgt[num_procs][4] =
889 {{(size_t)-1},{4,4,4,1},{4,4,2,2},{(size_t)-1}};
890 double weights[num_procs][13] =
903 size_t src_field_idx[num_procs][13] =
905 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
906 SIZE_MAX,SIZE_MAX,1,0,
909 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
910 SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
916 size_t src_idx[num_procs][13] =
918 {0,2,1,3, 1,3,0,1, 2,2,3,3, 3},
919 {1,6,8,4, 0,5,1,6, 2,3, 7,8},
922 for (
int scaling_factor_idx = 0;
923 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
924 for (
int scaling_summand_idx = 0;
925 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
926 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
934 scaling_factors[scaling_factor_idx],
935 scaling_summand[scaling_summand_idx]);
938 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
939 num_src_per_tgt[comm_rank], weights[comm_rank],
940 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields);
943 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
944 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
945 src_idx[comm_rank], num_src_fields);
948 enum {src_field_size = 4};
949 double src_data_raw[num_procs][num_src_fields][src_field_size] =
950 {{{0,1,2,3}, {16,17,18,19}},
951 {{4,5,6,7}, {20,21,22,23}},
952 {{8,9,10,11}, {24,25,26,27}},
953 {{12,13,14,15},{28,29,30,31}}};
954 size_t const tgt_field_size[num_procs] = {0,4,4,0};
961 {{
SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
962 SCALE(0.5*2+0.6*19+0.7*20+0.8*5),
963 SCALE(0.9*6+1.0*22+1.1*7+1.2*23),
965 {{
SCALE(1.4*2+1.5*19+1.6*22+1.7*7),
966 SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
968 SCALE(2.4*21+2.5*22)}},
971 if (utest_check_interpolation(
972 interp, &src_data_raw[comm_rank][0][0],
973 num_src_fields, src_field_size,
974 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
977 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_tgt/"
978 "yac_interpolation_add_weight_sum_mvp_at_tgt");
985 xt_redist_delete(src_redists[1]);
986 xt_redist_delete(src_redists[0]);
1012 enum {num_src_fields = 2};
1015 enum {num_src_indices = 4};
1016 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
1017 {{{0,1,2,3},{16,17,18,19}},
1018 {{4,5,6,7},{20,21,22,23}},
1019 {{8,9,10,11},{24,25,26,27}},
1020 {{12,13,14,15},{28,29,30,31}}};
1022 Xt_int dst_indices[num_procs][num_src_fields][5] =
1025 {{0,2,5,6,7},{17,19,21,22}},
1027 size_t num_dst_indices[num_procs][num_src_fields] =
1028 {{0,0},{2,2},{5,4},{0,0}};
1030 Xt_idxlist src_idxlist =
1031 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
1032 Xt_idxlist dst_idxlist =
1035 num_dst_indices[comm_rank][
field_id]);
1037 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
1038 src_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
1039 xt_xmap_delete(xmap);
1040 xt_idxlist_delete(dst_idxlist);
1041 xt_idxlist_delete(src_idxlist);
1046 size_t tgt_pos[num_procs][4] =
1047 {{(size_t)-1},{0,1,2,3},{0,1,2,3},{(size_t)-1}};
1049 size_t tgt_count[num_procs] = {0,4,4,0};
1051 size_t num_src_per_tgt[num_procs][4] =
1052 {{(size_t)-1},{4,4,4,1},{4,4,2,2},{(size_t)-1}};
1053 double weights[num_procs][13] =
1066 size_t src_field_idx[num_procs][13] =
1068 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1069 SIZE_MAX,SIZE_MAX,1,0,
1072 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1073 SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1079 size_t src_idx[num_procs][13] =
1081 {0,2,1,3, 1,3,0,1, 2,2,3,3, 3},
1082 {1,6,8,4, 0,5,1,6, 2,3, 7,8},
1085 for (
int scaling_factor_idx = 0;
1086 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
1087 for (
int scaling_summand_idx = 0;
1088 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
1089 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
1097 scaling_factors[scaling_factor_idx],
1098 scaling_summand[scaling_summand_idx]);
1101 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
1102 num_src_per_tgt[comm_rank], weights[comm_rank],
1103 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields);
1106 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
1107 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
1108 src_idx[comm_rank], num_src_fields);
1111 enum {src_field_size = 4};
1112 double src_data_raw[num_procs][num_src_fields][src_field_size] =
1113 {{{0,1,2,3}, {16,17,18,19}},
1114 {{4,5,6,7}, {20,21,22,23}},
1115 {{8,9,10,11}, {24,25,26,27}},
1116 {{12,13,14,15},{28,29,30,31}}};
1117 double src_frac_mask_raw[num_procs][2][src_field_size] =
1118 {{{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
1119 {{1.0, 0.5, 0.0, 0.0}, {0.5, 0.0, 0.0, 0.0}},
1120 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
1121 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}}};
1122 size_t const tgt_field_size[num_procs] = {0,4,4,0};
1125 {{
SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)*
1127 SCALE((1.0*2+1.0*19+0.5*20+0.5*5)/(1.0+1.0+0.5+0.5)*
1130 {{
SCALE((1.0*2+1.0*19+0.0*22+0.0*7)/(1.0+1.0+0.0+0.0)*
1132 SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)*
1134 SCALE((0.5*5+0.0*6)/(0.5+0.0)*
1139 {{
SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
1140 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
1141 SCALE((1.0*0.5*2+1.0*0.6*19+0.5*0.7*20+0.5*0.8*5)/
1142 (1.0*0.5+1.0*0.6+0.5*0.7+0.5*0.8)*
1145 {{
SCALE((1.0*1.4*2+1.0*1.5*19+0.0*1.6*22+0.0*1.7*7)/
1146 (1.0*1.4+1.0*1.5+0.0*1.6+0.0*1.7)*
1148 SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
1149 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
1150 SCALE((0.5*2.2*5+0.0*2.3*6)/(0.5*2.2+0.0*2.3)*
1155 if (utest_check_interpolation_frac(
1157 &src_data_raw[comm_rank][0][0],
1158 &src_frac_mask_raw[comm_rank][0][0],
1159 num_src_fields, src_field_size,
1160 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
1163 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_tgt/"
1164 "yac_interpolation_add_weight_sum_mvp_at_tgt frac");
1171 xt_redist_delete(src_redists[1]);
1172 xt_redist_delete(src_redists[0]);
1182 double const scaling_factor = 1.0;
1183 double const scaling_summand = 0.0;
1189 scaling_factor, scaling_summand);
1195 size_t count[num_procs] = {1, 0, 0, 0};
1196 size_t pos[num_procs][1] = {{3},{SIZE_MAX},{SIZE_MAX},{SIZE_MAX}};
1198 interp,
fixed_value, count[comm_rank], pos[comm_rank]);
1204 Xt_int src_indices[num_procs][1] = {{-1},{1},{2},{3}};
1205 size_t num_src_indices[num_procs] = {0,1,1,1};
1206 Xt_int dst_indices[num_procs][3] = {{1,2,3},{-1},{-1},{-1}};
1207 size_t num_dst_indices[num_procs] = {3,0,0,0};
1208 Xt_idxlist src_idxlist =
1209 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
1210 Xt_idxlist dst_idxlist =
1211 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
1213 = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
1214 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
1215 xt_xmap_delete(xmap);
1216 xt_idxlist_delete(dst_idxlist);
1217 xt_idxlist_delete(src_idxlist);
1219 xt_redist_delete(redist);
1225 src_data[0][0] =
xmalloc(1 *
sizeof(**src_data));
1226 src_data[0][0][0] = (double)comm_rank;
1229 tgt_data[0] = tgt_data_raw;
1234 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1237 if (comm_rank == 0) {
1246 PUT_ERR(
"ERROR in yac_interpolation_execute_get_test");
1250 MPI_Barrier(MPI_COMM_WORLD);
1253 if (comm_rank != 0) {
1263 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1266 double ref_tgt_data_raw[num_procs][4] =
1269 for (
size_t i = 0;
i <
sizeof(tgt_data_raw)/
sizeof(tgt_data_raw[0]); ++
i) {
1270 if (tgt_data_raw[i] != ref_tgt_data_raw[comm_rank][i]) {
1271 PUT_ERR(
"ERROR in interpolation results");
1277 free(src_data[0][0]);
1289static void utest_init_tgt_data(
1292 if (tgt_data == NULL)
return;
1295 for (
size_t j = 0; j < tgt_field_size; ++j)
1296 tgt_data[i][j] =
UNSET;
1299static int utest_check_tgt_data(
1300 double ** tgt_data,
double * ref_tgt_data_raw,
1304 if (tgt_data != NULL)
1306 for (
size_t j = 0; j < tgt_field_size; ++j)
1307 if (fabs(tgt_data[i][j] - ref_tgt_data_raw[j]) > 1e-9)
1313static int utest_check_interpolation_execute(
1315 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t collection_size) {
1322 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1328 utest_check_tgt_data(tgt_data, ref_tgt_data_raw, tgt_field_size,
collection_size);
1330 MPI_Barrier(MPI_COMM_WORLD);
1335 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1338 if (src_data != NULL) {
1342 if (tgt_data == NULL)
1347 utest_check_tgt_data(tgt_data, ref_tgt_data_raw, tgt_field_size,
collection_size);
1350 if (tgt_data != NULL)
1352 if (src_data != NULL)
1357 utest_check_tgt_data(tgt_data, ref_tgt_data_raw, tgt_field_size,
collection_size);
1360 if (tgt_data != NULL)
1362 if (src_data != NULL)
1367 utest_check_tgt_data(
1372 for (
int i = 0;
i < 2; ++
i) {
1373 if (tgt_data != NULL)
1375 if (src_data != NULL)
1381 utest_check_tgt_data(
1387static int utest_check_interpolation_execute_frac(
1389 double *** src_frac_mask,
double ** tgt_data,
double * ref_tgt_data_raw,
1397 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1403 utest_check_tgt_data(tgt_data, ref_tgt_data_raw, tgt_field_size,
collection_size);
1405 MPI_Barrier(MPI_COMM_WORLD);
1410 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1413 if (src_data != NULL) {
1416 if (tgt_data == NULL)
1421 utest_check_tgt_data(tgt_data, ref_tgt_data_raw, tgt_field_size,
collection_size);
1426static int utest_check_interpolation(
1428 double * src_data_raw,
size_t num_src_fields,
size_t src_field_size,
1429 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
1433 double *** src_data = NULL;
1434 if (src_data_raw != NULL) {
1435 src_data =
xmalloc(src_collection_size *
sizeof(src_data));
1436 double ** src_field_data =
1437 xmalloc(src_collection_size * num_src_fields *
sizeof(*src_field_data));
1438 for (
size_t i = 0;
i < src_collection_size;
1439 ++
i, src_field_data += num_src_fields) {
1440 src_data[
i] = src_field_data;
1441 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1442 ++j, src_field_offset += src_field_size)
1443 src_data[i][j] = src_data_raw + src_field_offset;
1448 size_t tgt_collection_size =
1450 double ** tgt_data = NULL;
1451 if (ref_tgt_data_raw != NULL) {
1452 double * tgt_data_raw =
1453 xmalloc(tgt_collection_size * tgt_field_size *
sizeof(*tgt_data_raw));
1454 for (
size_t i = 0;
i < tgt_collection_size * tgt_field_size; ++
i)
1455 tgt_data_raw[i] =
UNSET;
1456 tgt_data =
xmalloc(tgt_collection_size *
sizeof(*tgt_data));
1457 for (
size_t i = 0;
i < tgt_collection_size; ++
i,
1458 tgt_data_raw += tgt_field_size)
1459 tgt_data[i] = tgt_data_raw;
1464 utest_check_interpolation_execute(
1465 interp, src_data, tgt_data, ref_tgt_data_raw,
1466 tgt_field_size, tgt_collection_size);
1470 utest_check_interpolation_execute(
1471 interp, src_data, tgt_data, ref_tgt_data_raw,
1472 tgt_field_size, tgt_collection_size);
1482 if (ref_tgt_data_raw != NULL) {
1486 if (src_data_raw != NULL) {
1494static int utest_check_interpolation_frac(
1496 double * src_data_raw,
double * src_frac_mask_raw,
1497 size_t num_src_fields,
size_t src_field_size,
1498 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
1502 double *** src_data = NULL;
1503 if (src_data_raw != NULL) {
1504 src_data =
xmalloc(src_collection_size *
sizeof(src_data));
1505 double ** src_field_data =
1506 xmalloc(src_collection_size * num_src_fields *
sizeof(*src_field_data));
1507 for (
size_t i = 0;
i < src_collection_size;
1508 ++
i, src_field_data += num_src_fields) {
1509 src_data[
i] = src_field_data;
1510 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1511 ++j, src_field_offset += src_field_size)
1512 src_data[i][j] = src_data_raw + src_field_offset;
1517 size_t tgt_collection_size =
1519 double *** src_frac_data = NULL;
1520 if (src_frac_mask_raw != NULL) {
1521 src_frac_data =
xmalloc(tgt_collection_size *
sizeof(src_frac_data));
1522 double ** src_frac_mask_data =
1524 tgt_collection_size * num_src_fields *
sizeof(*src_frac_mask_data));
1525 for (
size_t i = 0;
i < tgt_collection_size;
1526 ++
i, src_frac_mask_data += num_src_fields) {
1527 src_frac_data[
i] = src_frac_mask_data;
1528 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1529 ++j, src_field_offset += src_field_size)
1530 src_frac_data[i][j] = src_frac_mask_raw + src_field_offset;
1535 if ((src_data != NULL) && (src_frac_data != NULL))
1536 for (
size_t i = 0;
i < src_collection_size; ++
i)
1537 for (
size_t j = 0; j < num_src_fields; ++j)
1538 for (
size_t k = 0; k < src_field_size; ++k)
1539 src_data[i][j][k] *= src_frac_data[i][j][k];
1542 double ** tgt_data = NULL;
1543 if (ref_tgt_data_raw != NULL) {
1544 double * tgt_data_raw =
1545 xmalloc(tgt_collection_size * tgt_field_size *
sizeof(*tgt_data_raw));
1546 for (
size_t i = 0;
i < tgt_collection_size * tgt_field_size; ++
i)
1547 tgt_data_raw[i] =
UNSET;
1548 tgt_data =
xmalloc(tgt_collection_size *
sizeof(*tgt_data));
1549 for (
size_t i = 0;
i < tgt_collection_size;
1550 ++
i, tgt_data_raw += tgt_field_size)
1551 tgt_data[i] = tgt_data_raw;
1556 utest_check_interpolation_execute_frac(
1557 interp, src_data, src_frac_data, tgt_data, ref_tgt_data_raw,
1558 tgt_field_size, tgt_collection_size);
1562 utest_check_interpolation_execute_frac(
1563 interp, src_data, src_frac_data, tgt_data, ref_tgt_data_raw,
1564 tgt_field_size, tgt_collection_size);
1568 if (ref_tgt_data_raw != NULL) {
1572 if (src_frac_mask_raw != NULL) {
1573 free(src_frac_data[0]);
1574 free(src_frac_data);
1576 if (src_data_raw != NULL) {
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
int yac_collection_selection_compare(struct yac_collection_selection const *a, struct yac_collection_selection const *b)
Compare two collection selections.
struct yac_collection_selection * yac_collection_selection_new(size_t collection_size, size_t const *selection_indices)
Create a new collection selection.
void yac_interpolation_add_sum_at_src(struct yac_interpolation *interp, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist)
Add a sum operator where accumulation occurs on source processes.
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
Create a deep copy of an interpolation object.
void yac_interpolation_add_weight_sum_mvp_at_tgt(struct yac_interpolation *interp, Xt_redist *src_redists, size_t *tgt_pos, 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)
Add a weighted sum operator (distributed matrix-vector product), which computes the product at the ta...
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
void yac_interpolation_add_direct_mf(struct yac_interpolation *interp, Xt_redist *redists, size_t num_src_fields)
Add a direct redistribution operator for multiple source fields.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
void yac_interpolation_add_sum_at_tgt(struct yac_interpolation *interp, Xt_redist *src_redists, size_t *tgt_pos, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields)
Add a sum operator where accumulation occurs on target processes.
int yac_interpolation_execute_put_test(struct yac_interpolation *interp)
Test whether the asynchronous put phase has completed.
void yac_interpolation_add_fixed(struct yac_interpolation *interp, double value, size_t count, size_t *pos)
Add a fixed-value operator to an interpolation.
void yac_interpolation_execute_wait(struct yac_interpolation *interp)
Wait for completion of pending asynchronous interpolation operations.
void yac_interpolation_execute_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field)
Execute interpolation with fractional masks and write results to the target field.
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation and write results to the target field (get phase).
void yac_interpolation_execute_get_async(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation asynchronously and write results to the target field (get phase).
void yac_interpolation_add_direct(struct yac_interpolation *interp, Xt_redist redist)
Add a direct redistribution operator.
struct yac_interpolation * yac_interpolation_new(struct yac_collection_selection const *collection_selection, double frac_mask_fallback_value, double scale_factor, double scale_summand)
Create a new interpolation object.
void yac_interpolation_execute_put_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks)
Provide source field data with fractional masks and start asynchronous execution of interpolation (pu...
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
Provide source field data and start asynchronous execution of interpolation (put phase).
void yac_interpolation_add_weight_sum_mvp_at_src(struct yac_interpolation *interp, 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)
Add a weighted sum operator (distributed matrix-vector product), which computes the productes at the ...
int yac_interpolation_execute_get_test(struct yac_interpolation *interp)
Test whether the asynchronous get phase has completed.
double const YAC_FRAC_MASK_NO_VALUE
struct yac_collection_selection const * yac_interpolation_get_collection_selection(struct yac_interpolation const *interp)
Return the collection selection associated with an interpolation.
struct Xt_redist_ * Xt_redist
Defines internal basic interpolation definitions.
struct yac_collection_selection * collection_selection
Selection of field collections to which this interpolation applies.
static double const fixed_value