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}};
292 Xt_redist redists[num_src_fields];
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}};
378 Xt_redist redists[num_src_fields];
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};
470 Xt_redist halo_redists[num_src_fields];
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}};
540 Xt_redist result_redist;
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};
650 Xt_redist halo_redists[num_src_fields];
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}};
720 Xt_redist result_redist;
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)),
779 SCALE((1.0*2+1.0*19+0.5*20+0.5*5)/(1.0+1.0+0.5+0.5)),
781 {{
SCALE((1.0*2+1.0*19+0.0*22+0.0*7)/(1.0+1.0+0.0+0.0)),
782 SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)),
783 SCALE((0.5*5+0.0*6)/(0.5+0.0)),
787 {{
SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
788 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
789 SCALE((1.0*0.5*2+1.0*0.6*19+0.5*0.7*20+0.5*0.8*5)/
790 (1.0*0.5+1.0*0.6+0.5*0.7+0.5*0.8)),
792 {{
SCALE((1.0*1.4*2+1.0*1.5*19+0.0*1.6*22+0.0*1.7*7)/
793 (1.0*1.4+1.0*1.5+0.0*1.6+0.0*1.7)),
794 SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
795 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
796 SCALE((0.5*2.2*5+0.0*2.3*6)/(0.5*2.2+0.0*2.3)),
800 if (utest_check_interpolation_frac(
801 interp, &src_data_raw[comm_rank][0][0],
802 &src_frac_mask_raw[comm_rank][0][0],
803 num_src_fields, src_field_size,
804 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
807 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_src/"
808 "yac_interpolation_add_weight_sum_mvp_at_src frac");
815 xt_redist_delete(result_redist);
816 xt_redist_delete(halo_redists[1]);
817 xt_redist_delete(halo_redists[0]);
841 enum {num_src_fields = 2};
842 Xt_redist src_redists[num_src_fields];
844 enum {num_src_indices = 4};
845 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
846 {{{0,1,2,3},{16,17,18,19}},
847 {{4,5,6,7},{20,21,22,23}},
848 {{8,9,10,11},{24,25,26,27}},
849 {{12,13,14,15},{28,29,30,31}}};
851 Xt_int dst_indices[num_procs][num_src_fields][5] =
854 {{0,2,5,6,7},{17,19,21,22}},
856 size_t num_dst_indices[num_procs][num_src_fields] =
857 {{0,0},{2,2},{5,4},{0,0}};
859 Xt_idxlist src_idxlist =
860 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
861 Xt_idxlist dst_idxlist =
864 num_dst_indices[comm_rank][
field_id]);
866 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
867 src_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
868 xt_xmap_delete(xmap);
869 xt_idxlist_delete(dst_idxlist);
870 xt_idxlist_delete(src_idxlist);
875 size_t tgt_pos[num_procs][4] =
876 {{(size_t)-1},{0,1,2,3},{0,1,2,3},{(size_t)-1}};
878 size_t tgt_count[num_procs] = {0,4,4,0};
880 size_t num_src_per_tgt[num_procs][4] =
881 {{(size_t)-1},{4,4,4,1},{4,4,2,2},{(size_t)-1}};
882 double weights[num_procs][13] =
895 size_t src_field_idx[num_procs][13] =
897 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
898 SIZE_MAX,SIZE_MAX,1,0,
901 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
902 SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
908 size_t src_idx[num_procs][13] =
910 {0,2,1,3, 1,3,0,1, 2,2,3,3, 3},
911 {1,6,8,4, 0,5,1,6, 2,3, 7,8},
914 for (
int scaling_factor_idx = 0;
915 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
916 for (
int scaling_summand_idx = 0;
917 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
918 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
926 scaling_factors[scaling_factor_idx],
927 scaling_summand[scaling_summand_idx]);
930 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
931 num_src_per_tgt[comm_rank], weights[comm_rank],
932 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields);
935 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
936 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
937 src_idx[comm_rank], num_src_fields);
940 enum {src_field_size = 4};
941 double src_data_raw[num_procs][num_src_fields][src_field_size] =
942 {{{0,1,2,3}, {16,17,18,19}},
943 {{4,5,6,7}, {20,21,22,23}},
944 {{8,9,10,11}, {24,25,26,27}},
945 {{12,13,14,15},{28,29,30,31}}};
946 size_t const tgt_field_size[num_procs] = {0,4,4,0};
953 {{
SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
954 SCALE(0.5*2+0.6*19+0.7*20+0.8*5),
955 SCALE(0.9*6+1.0*22+1.1*7+1.2*23),
957 {{
SCALE(1.4*2+1.5*19+1.6*22+1.7*7),
958 SCALE(0.1*0+0.2*17+0.3*2+0.4*19),
960 SCALE(2.4*21+2.5*22)}},
963 if (utest_check_interpolation(
964 interp, &src_data_raw[comm_rank][0][0],
965 num_src_fields, src_field_size,
966 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
969 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_tgt/"
970 "yac_interpolation_add_weight_sum_mvp_at_tgt");
977 xt_redist_delete(src_redists[1]);
978 xt_redist_delete(src_redists[0]);
1004 enum {num_src_fields = 2};
1005 Xt_redist src_redists[num_src_fields];
1007 enum {num_src_indices = 4};
1008 Xt_int src_indices[num_procs][num_src_fields][num_src_indices] =
1009 {{{0,1,2,3},{16,17,18,19}},
1010 {{4,5,6,7},{20,21,22,23}},
1011 {{8,9,10,11},{24,25,26,27}},
1012 {{12,13,14,15},{28,29,30,31}}};
1014 Xt_int dst_indices[num_procs][num_src_fields][5] =
1017 {{0,2,5,6,7},{17,19,21,22}},
1019 size_t num_dst_indices[num_procs][num_src_fields] =
1020 {{0,0},{2,2},{5,4},{0,0}};
1022 Xt_idxlist src_idxlist =
1023 xt_idxvec_new(src_indices[comm_rank][
field_id], num_src_indices);
1024 Xt_idxlist dst_idxlist =
1027 num_dst_indices[comm_rank][
field_id]);
1029 xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
1030 src_redists[
field_id] = xt_redist_p2p_new(xmap, MPI_DOUBLE);
1031 xt_xmap_delete(xmap);
1032 xt_idxlist_delete(dst_idxlist);
1033 xt_idxlist_delete(src_idxlist);
1038 size_t tgt_pos[num_procs][4] =
1039 {{(size_t)-1},{0,1,2,3},{0,1,2,3},{(size_t)-1}};
1041 size_t tgt_count[num_procs] = {0,4,4,0};
1043 size_t num_src_per_tgt[num_procs][4] =
1044 {{(size_t)-1},{4,4,4,1},{4,4,2,2},{(size_t)-1}};
1045 double weights[num_procs][13] =
1058 size_t src_field_idx[num_procs][13] =
1060 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1061 SIZE_MAX,SIZE_MAX,1,0,
1064 {SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1065 SIZE_MAX,SIZE_MAX,SIZE_MAX,SIZE_MAX,
1071 size_t src_idx[num_procs][13] =
1073 {0,2,1,3, 1,3,0,1, 2,2,3,3, 3},
1074 {1,6,8,4, 0,5,1,6, 2,3, 7,8},
1077 for (
int scaling_factor_idx = 0;
1078 scaling_factor_idx < NUM_SCALING_FACTORS; ++scaling_factor_idx) {
1079 for (
int scaling_summand_idx = 0;
1080 scaling_summand_idx < NUM_SCALING_SUMMAND; ++scaling_summand_idx) {
1081 for (
int with_weights = 0; with_weights < 2; ++with_weights) {
1089 scaling_factors[scaling_factor_idx],
1090 scaling_summand[scaling_summand_idx]);
1093 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
1094 num_src_per_tgt[comm_rank], weights[comm_rank],
1095 src_field_idx[comm_rank], src_idx[comm_rank], num_src_fields);
1098 interp, src_redists, tgt_pos[comm_rank], tgt_count[comm_rank],
1099 num_src_per_tgt[comm_rank], src_field_idx[comm_rank],
1100 src_idx[comm_rank], num_src_fields);
1103 enum {src_field_size = 4};
1104 double src_data_raw[num_procs][num_src_fields][src_field_size] =
1105 {{{0,1,2,3}, {16,17,18,19}},
1106 {{4,5,6,7}, {20,21,22,23}},
1107 {{8,9,10,11}, {24,25,26,27}},
1108 {{12,13,14,15},{28,29,30,31}}};
1109 double src_frac_mask_raw[num_procs][2][src_field_size] =
1110 {{{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
1111 {{1.0, 0.5, 0.0, 0.0}, {0.5, 0.0, 0.0, 0.0}},
1112 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}},
1113 {{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}}};
1114 size_t const tgt_field_size[num_procs] = {0,4,4,0};
1117 {{
SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)),
1118 SCALE((1.0*2+1.0*19+0.5*20+0.5*5)/(1.0+1.0+0.5+0.5)),
1120 {{
SCALE((1.0*2+1.0*19+0.0*22+0.0*7)/(1.0+1.0+0.0+0.0)),
1121 SCALE((1.0*0+1.0*17+1.0*2+1.0*19)/(1.0+1.0+1.0+1.0)),
1122 SCALE((0.5*5+0.0*6)/(0.5+0.0)),
1126 {{
SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
1127 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
1128 SCALE((1.0*0.5*2+1.0*0.6*19+0.5*0.7*20+0.5*0.8*5)/
1129 (1.0*0.5+1.0*0.6+0.5*0.7+0.5*0.8)),
1131 {{
SCALE((1.0*1.4*2+1.0*1.5*19+0.0*1.6*22+0.0*1.7*7)/
1132 (1.0*1.4+1.0*1.5+0.0*1.6+0.0*1.7)),
1133 SCALE((1.0*0.1*0+1.0*0.2*17+1.0*0.3*2+1.0*0.4*19)/
1134 (1.0*0.1+1.0*0.2+1.0*0.3+1.0*0.4)),
1135 SCALE((0.5*2.2*5+0.0*2.3*6)/(0.5*2.2+0.0*2.3)),
1139 if (utest_check_interpolation_frac(
1141 &src_data_raw[comm_rank][0][0],
1142 &src_frac_mask_raw[comm_rank][0][0],
1143 num_src_fields, src_field_size,
1144 &ref_tgt_data_raw[with_weights][comm_rank][0][0],
1147 PUT_ERR(
"ERROR in yac_interpolation_add_sum_at_tgt/"
1148 "yac_interpolation_add_weight_sum_mvp_at_tgt frac");
1155 xt_redist_delete(src_redists[1]);
1156 xt_redist_delete(src_redists[0]);
1166 double const scaling_factor = 1.0;
1167 double const scaling_summand = 0.0;
1173 scaling_factor, scaling_summand);
1178 double fixed_value = 4.0;
1179 size_t count[num_procs] = {1, 0, 0, 0};
1180 size_t pos[num_procs][1] = {{3},{SIZE_MAX},{SIZE_MAX},{SIZE_MAX}};
1182 interp, fixed_value, count[comm_rank], pos[comm_rank]);
1188 Xt_int src_indices[num_procs][1] = {{-1},{1},{2},{3}};
1189 size_t num_src_indices[num_procs] = {0,1,1,1};
1190 Xt_int dst_indices[num_procs][3] = {{1,2,3},{-1},{-1},{-1}};
1191 size_t num_dst_indices[num_procs] = {3,0,0,0};
1192 Xt_idxlist src_idxlist =
1193 xt_idxvec_new(src_indices[comm_rank], num_src_indices[comm_rank]);
1194 Xt_idxlist dst_idxlist =
1195 xt_idxvec_new(dst_indices[comm_rank], num_dst_indices[comm_rank]);
1197 = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
1198 Xt_redist redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
1199 xt_xmap_delete(xmap);
1200 xt_idxlist_delete(dst_idxlist);
1201 xt_idxlist_delete(src_idxlist);
1203 xt_redist_delete(redist);
1209 src_data[0][0] =
xmalloc(1 *
sizeof(**src_data));
1210 src_data[0][0][0] = (double)comm_rank;
1213 tgt_data[0] = tgt_data_raw;
1218 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1221 if (comm_rank == 0) {
1230 PUT_ERR(
"ERROR in yac_interpolation_execute_get_test");
1234 MPI_Barrier(MPI_COMM_WORLD);
1237 if (comm_rank != 0) {
1247 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1250 double ref_tgt_data_raw[num_procs][4] =
1253 for (
size_t i = 0;
i <
sizeof(tgt_data_raw)/
sizeof(tgt_data_raw[0]); ++
i) {
1254 if (tgt_data_raw[i] != ref_tgt_data_raw[comm_rank][i]) {
1255 PUT_ERR(
"ERROR in interpolation results");
1261 free(src_data[0][0]);
1276 if (tgt_data == NULL)
return;
1279 for (
size_t j = 0; j < tgt_field_size; ++j)
1280 tgt_data[i][j] =
UNSET;
1284 double ** tgt_data,
double * ref_tgt_data_raw,
1288 if (tgt_data != NULL)
1290 for (
size_t j = 0; j < tgt_field_size; ++j)
1291 if (fabs(tgt_data[i][j] - ref_tgt_data_raw[j]) > 1e-9)
1297static int utest_check_interpolation_execute(
1299 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t collection_size) {
1306 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1314 MPI_Barrier(MPI_COMM_WORLD);
1319 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1322 if (src_data != NULL) {
1326 if (tgt_data == NULL)
1334 if (tgt_data != NULL)
1336 if (src_data != NULL)
1344 if (tgt_data != NULL)
1346 if (src_data != NULL)
1355static int utest_check_interpolation_execute_frac(
1357 double *** src_frac_mask,
double ** tgt_data,
double * ref_tgt_data_raw,
1365 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1373 MPI_Barrier(MPI_COMM_WORLD);
1378 PUT_ERR(
"ERROR in yac_interpolation_execute_put/get_test");
1381 if (src_data != NULL) {
1384 if (tgt_data == NULL)
1394static int utest_check_interpolation(
1396 double * src_data_raw,
size_t num_src_fields,
size_t src_field_size,
1397 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
1401 double *** src_data = NULL;
1402 if (src_data_raw != NULL) {
1403 src_data =
xmalloc(src_collection_size *
sizeof(src_data));
1404 double ** src_field_data =
1405 xmalloc(src_collection_size * num_src_fields *
sizeof(*src_field_data));
1406 for (
size_t i = 0;
i < src_collection_size;
1407 ++
i, src_field_data += num_src_fields) {
1408 src_data[
i] = src_field_data;
1409 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1410 ++j, src_field_offset += src_field_size)
1411 src_data[i][j] = src_data_raw + src_field_offset;
1416 size_t tgt_collection_size =
1418 double ** tgt_data = NULL;
1419 if (ref_tgt_data_raw != NULL) {
1420 double * tgt_data_raw =
1421 xmalloc(tgt_collection_size * tgt_field_size *
sizeof(*tgt_data_raw));
1422 for (
size_t i = 0;
i < tgt_collection_size * tgt_field_size; ++
i)
1423 tgt_data_raw[i] =
UNSET;
1424 tgt_data =
xmalloc(tgt_collection_size *
sizeof(*tgt_data));
1425 for (
size_t i = 0;
i < tgt_collection_size; ++
i,
1426 tgt_data_raw += tgt_field_size)
1427 tgt_data[i] = tgt_data_raw;
1432 utest_check_interpolation_execute(
1433 interp, src_data, tgt_data, ref_tgt_data_raw,
1434 tgt_field_size, tgt_collection_size);
1438 utest_check_interpolation_execute(
1439 interp, src_data, tgt_data, ref_tgt_data_raw,
1440 tgt_field_size, tgt_collection_size);
1450 if (ref_tgt_data_raw != NULL) {
1454 if (src_data_raw != NULL) {
1462static int utest_check_interpolation_frac(
1464 double * src_data_raw,
double * src_frac_mask_raw,
1465 size_t num_src_fields,
size_t src_field_size,
1466 double * ref_tgt_data_raw,
size_t tgt_field_size,
size_t src_collection_size,
1470 double *** src_data = NULL;
1471 if (src_data_raw != NULL) {
1472 src_data =
xmalloc(src_collection_size *
sizeof(src_data));
1473 double ** src_field_data =
1474 xmalloc(src_collection_size * num_src_fields *
sizeof(*src_field_data));
1475 for (
size_t i = 0;
i < src_collection_size;
1476 ++
i, src_field_data += num_src_fields) {
1477 src_data[
i] = src_field_data;
1478 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1479 ++j, src_field_offset += src_field_size)
1480 src_data[i][j] = src_data_raw + src_field_offset;
1485 size_t tgt_collection_size =
1487 double *** src_frac_data = NULL;
1488 if (src_frac_mask_raw != NULL) {
1489 src_frac_data =
xmalloc(tgt_collection_size *
sizeof(src_frac_data));
1490 double ** src_frac_mask_data =
1492 tgt_collection_size * num_src_fields *
sizeof(*src_frac_mask_data));
1493 for (
size_t i = 0;
i < tgt_collection_size;
1494 ++
i, src_frac_mask_data += num_src_fields) {
1495 src_frac_data[
i] = src_frac_mask_data;
1496 for (
size_t j = 0, src_field_offset = 0; j < num_src_fields;
1497 ++j, src_field_offset += src_field_size)
1498 src_frac_data[i][j] = src_frac_mask_raw + src_field_offset;
1503 if ((src_data != NULL) && (src_frac_data != NULL))
1504 for (
size_t i = 0;
i < src_collection_size; ++
i)
1505 for (
size_t j = 0; j < num_src_fields; ++j)
1506 for (
size_t k = 0; k < src_field_size; ++k)
1507 src_data[i][j][k] *= src_frac_data[i][j][k];
1510 double ** tgt_data = NULL;
1511 if (ref_tgt_data_raw != NULL) {
1512 double * tgt_data_raw =
1513 xmalloc(tgt_collection_size * tgt_field_size *
sizeof(*tgt_data_raw));
1514 for (
size_t i = 0;
i < tgt_collection_size * tgt_field_size; ++
i)
1515 tgt_data_raw[i] =
UNSET;
1516 tgt_data =
xmalloc(tgt_collection_size *
sizeof(*tgt_data));
1517 for (
size_t i = 0;
i < tgt_collection_size;
1518 ++
i, tgt_data_raw += tgt_field_size)
1519 tgt_data[i] = tgt_data_raw;
1524 utest_check_interpolation_execute_frac(
1525 interp, src_data, src_frac_data, tgt_data, ref_tgt_data_raw,
1526 tgt_field_size, tgt_collection_size);
1530 utest_check_interpolation_execute_frac(
1531 interp, src_data, src_frac_data, tgt_data, ref_tgt_data_raw,
1532 tgt_field_size, tgt_collection_size);
1536 if (ref_tgt_data_raw != NULL) {
1540 if (src_frac_mask_raw != NULL) {
1541 free(src_frac_data[0]);
1542 free(src_frac_data);
1544 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.
Defines internal basic interpolation definitions.
struct yac_collection_selection * collection_selection
Selection of field collections to which this interpolation applies.
static int check_tgt_data(double **tgt_data, double *ref_tgt_data_raw, size_t tgt_field_size, size_t collection_size)
static void init_tgt_data(double **tgt_data, size_t tgt_field_size, size_t collection_size)