29double const tol = 1e-7;
34char const file_name[] =
"test_interp_method_file_parallel_weights.nc";
35char const file_name_2[] =
"test_interp_method_file_parallel_weights_2.nc";
37static void utest_target_main(MPI_Comm target_comm);
38static void utest_source_main(MPI_Comm source_comm);
39static void utest_target_main_abort(MPI_Comm target_comm);
40static void utest_source_main_abort(MPI_Comm source_comm);
52static void utest_on_missing_abort_handler(
53 MPI_Comm comm,
char const * msg,
char const * source,
int line);
61 xt_initialize(MPI_COMM_WORLD);
63 int comm_rank, comm_size;
64 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
65 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
66 MPI_Barrier(MPI_COMM_WORLD);
69 PUT_ERR(
"ERROR: wrong number of processes");
75 int tgt_flag = comm_rank < 1;
76 MPI_Comm_split(MPI_COMM_WORLD, tgt_flag, 0, &
split_comm);
78 char const * io_ranks[3] = {
"0",
"1,2",
"0,1,2"};
80 for (
int i = 0; i < 3; ++i) {
81 utest_clear_yac_io_env();
82 setenv(
"YAC_IO_RANK_LIST", io_ranks[i], 1);
83 setenv(
"YAC_IO_MAX_NUM_RANKS_PER_NODE",
"3", 1);
89 if (tgt_flag) utest_target_main_abort(
split_comm);
99static void utest_source_main(MPI_Comm source_comm) {
102 MPI_Comm_rank(source_comm, &my_source_rank);
125 if (my_source_rank == 0) {
127 int src_indices[] = {0,1,2,3,4,5,6,7,8,9,10,11};
128 int tgt_indices[] = {0,1,2,3,4,5,6,7,8,9,10,11};
129 double weights[] = {0,1,2,3,4,5,6,7,8,9,10,11};
130 size_t num_links = 12;
133 unsigned num_src_fields = 2;
134 int num_links_per_field[2] = {num_links, 0};
135 int * tgt_id_fixed = NULL;
136 size_t num_fixed_tgt = 0;
137 double * fixed_values = NULL;
138 int * num_tgt_per_fixed_value = NULL;
139 size_t num_fixed_values = 0;
141 utest_write_weight_file(
142 file_name, src_indices, tgt_indices, weights, num_links,
143 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
144 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
150 size_t const num_global_cells[2] = {3,2};
151 size_t local_start[2][2] = {{0,0},{2,0}};
152 size_t local_count[2][2] = {{2,2},{1,2}};
154 int global_corner_mask[3][4] = {
155 {1,1,1,1}, {1,1,0,0}, {0,0,0,0}};
156 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
158 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
162 utest_generate_basic_grid_data_reg2d(
164 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
166 int * src_corner_mask =
168 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
170 ((
int*)(&(global_corner_mask[0][0])))[
grid_data.vertex_ids[
i]];
184 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
185 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
187 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
214 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
232 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
233 src_data[collection_idx][0] =
235 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
236 src_data[collection_idx][0][i] =
238 (
double)(collection_idx * 12);
245 free(src_data[collection_idx][0]);
246 free(src_data[collection_idx]);
269 if (my_source_rank == 0) unlink(
file_name);
292 if (my_source_rank == 0) {
294 int tgt_indices[] = { 0, 0, 0, 0,
300 int src_indices[] = { 0, 1, 4, 5,
306 double weights[] = {0.1,0.2,0.3,0.4,
312 size_t num_links = 24;
315 unsigned num_src_fields = 2;
316 int num_links_per_field[2] = {num_links, 0};
317 int * tgt_id_fixed = NULL;
318 size_t num_fixed_tgt = 0;
319 double * fixed_values = NULL;
320 int * num_tgt_per_fixed_value = NULL;
321 size_t num_fixed_values = 0;
323 utest_write_weight_file(
324 file_name, src_indices, tgt_indices, weights, num_links,
325 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
326 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
332 size_t const num_global_cells[2] = {3,2};
333 size_t local_start[2][2] = {{0,0},{2,0}};
334 size_t local_count[2][2] = {{2,2},{1,2}};
336 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
338 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
342 utest_generate_basic_grid_data_reg2d(
344 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
356 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
357 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
359 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
386 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
391 weights, reorder_type[i], 1,
398 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
399 double *** src_data = &src_fields;
403 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
404 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
430 if (my_source_rank == 0) unlink(
file_name);
465 if (my_source_rank == 0) {
467 int tgt_indices[] = { 0, 0, 0, 0,
473 int src_indices[] = { 0, 1, 4, 5,
479 double weights[] = {0.1,0.2,0.3,0.4,
485 size_t num_links = 24;
488 unsigned num_src_fields = 2;
489 int num_links_per_field[2] = {num_links, 0};
490 int * tgt_id_fixed = NULL;
491 size_t num_fixed_tgt = 0;
492 double * fixed_values = NULL;
493 int * num_tgt_per_fixed_value = NULL;
494 size_t num_fixed_values = 0;
496 utest_write_weight_file(
497 file_name, src_indices, tgt_indices, weights, num_links,
498 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
499 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
505 size_t const num_global_cells[2] = {3,2};
506 size_t local_start[2][2] = {{0,0},{2,0}};
507 size_t local_count[2][2] = {{2,2},{1,2}};
508 int global_src_vertex_mask[] = {1, 1, 1, 0,
511 int global_src_cell_mask[] = {1, 1, 0,
514 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
516 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
520 utest_generate_basic_grid_data_reg2d(
522 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
524 int * src_vertex_mask =
xmalloc(12 *
sizeof(*src_vertex_mask));
525 int * src_cell_mask =
xmalloc(6 *
sizeof(*src_cell_mask));;
526 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
528 global_src_vertex_mask[
grid_data.vertex_ids[i]];
531 global_src_cell_mask[
grid_data.cell_ids[i]];
544 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0},
545 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
546 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
548 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
575 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
580 weights, reorder_type[i], 1,
587 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
588 double *** src_data = &src_fields;
592 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
593 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
619 if (my_source_rank == 0) unlink(
file_name);
643 if (my_source_rank == 0) {
645 int * tgt_indices = NULL;
646 int * src_indices = NULL;
648 size_t num_links = 0;
651 unsigned num_src_fields = 2;
652 int num_links_per_field[2] = {num_links, 0};
653 int * tgt_id_fixed = NULL;
654 size_t num_fixed_tgt = 0;
655 double * fixed_values = NULL;
656 int * num_tgt_per_fixed_value = NULL;
657 size_t num_fixed_values = 0;
659 utest_write_weight_file(
660 file_name, src_indices, tgt_indices, weights, num_links,
661 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
662 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
668 size_t const num_global_cells[2] = {3,2};
669 size_t local_start[2][2] = {{0,0},{2,0}};
670 size_t local_count[2][2] = {{2,2},{1,2}};
672 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
674 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
678 utest_generate_basic_grid_data_reg2d(
680 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
691 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
692 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
693 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
695 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
722 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
727 weights, reorder_type[i], 1,
734 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
735 double *** src_data = &src_fields;
739 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
740 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
766 if (my_source_rank == 0) unlink(
file_name);
788 if (my_source_rank == 0) {
790 int * tgt_indices = NULL;
791 int * src_indices = NULL;
793 size_t num_links = 0;
796 unsigned num_src_fields = 2;
797 int num_links_per_field[2] = {num_links, 0};
798 int tgt_id_fixed[] = {0, 2, 4, 6};
799 size_t num_fixed_tgt = 4;
800 double fixed_values[] = {-1.0, -2.0};
801 int num_tgt_per_fixed_value[] = {1, 3};
802 size_t num_fixed_values = 2;
804 utest_write_weight_file(
805 file_name, src_indices, tgt_indices, weights, num_links,
806 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
807 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
813 size_t const num_global_cells[2] = {3,2};
814 size_t local_start[2][2] = {{0,0},{2,0}};
815 size_t local_count[2][2] = {{2,2},{1,2}};
817 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
819 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
823 utest_generate_basic_grid_data_reg2d(
825 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
836 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
837 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
838 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
840 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
867 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
872 weights, reorder_type[i], 1,
879 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
880 double *** src_data = &src_fields;
884 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
885 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
911 if (my_source_rank == 0) unlink(
file_name);
933 if (my_source_rank == 0) {
935 int * tgt_indices = NULL;
936 int * src_indices = NULL;
938 size_t num_links = 0;
941 unsigned num_src_fields = 1;
942 int num_links_per_field[1] = {num_links};
943 int tgt_id_fixed[] = {1,3,5,7,9,11,0,2,4,6,8,10};
944 size_t num_fixed_tgt = 12;
945 double fixed_values[] = {-1.0, -2.0};
946 int num_tgt_per_fixed_value[] = {6, 6};
947 size_t num_fixed_values = 2;
949 utest_write_weight_file(
950 file_name, src_indices, tgt_indices, weights, num_links,
951 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
952 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
958 size_t const num_global_cells[2] = {3,2};
959 size_t local_start[2][2] = {{0,0},{2,0}};
960 size_t local_count[2][2] = {{2,2},{1,2}};
962 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
964 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
968 utest_generate_basic_grid_data_reg2d(
970 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
981 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
982 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
984 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1011 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
1016 weights, reorder_type[i], 1,
1023 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
1024 double *** src_data = &src_fields;
1028 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1029 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
1034 free(src_fields[0]);
1055 if (my_source_rank == 0) unlink(
file_name);
1076 if (my_source_rank == 0) {
1078 int * tgt_indices = NULL;
1079 int * src_indices = NULL;
1081 size_t num_links = 0;
1084 unsigned num_src_fields = 1;
1085 int num_links_per_field[1] = {num_links};
1086 int tgt_id_fixed[] = {1,3,5,7,9,11,0,2,4,6,8,10};
1087 size_t num_fixed_tgt = 12;
1088 double fixed_values[] = {-1.0, NAN};
1089 int num_tgt_per_fixed_value[] = {6, 6};
1090 size_t num_fixed_values = 2;
1092 utest_write_weight_file(
1093 file_name, src_indices, tgt_indices, weights, num_links,
1094 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
1095 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
1101 size_t const num_global_cells[2] = {3,2};
1102 size_t local_start[2][2] = {{0,0},{2,0}};
1103 size_t local_count[2][2] = {{2,2},{1,2}};
1105 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
1107 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
1111 utest_generate_basic_grid_data_reg2d(
1113 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
1124 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
1125 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1127 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1170 for (
int from_file = 0; from_file <= 1; ++from_file) {
1171 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
1176 (from_file)?weights_from_file:
weights,
1184 double ** src_fields =
xmalloc(1 *
sizeof(*src_fields));
1185 double *** src_data = &src_fields;
1189 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1190 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
1195 free(src_fields[0]);
1217 if (my_source_rank == 0) unlink(
file_name);
1247 if (my_source_rank == 0) {
1249 int src_indices[3][36] = {{0,1,2,3,
1250 0,1,3,4, 1,2,4,5, 3,4,6,7, 4,5,7,8,
1251 0,1,3,5, 2,3,4,7, 5,6,8,10, 7,8,9,11},
1253 0,1,3,4, 1,2,4,5, 3,4,6,7, 4,5,7,8,
1254 0,1,3,5, 2,3,4,7, 5,6,8,10, 7,8,9,11},
1258 int tgt_indices[3][36] = {{0,1,2,3,
1259 0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3,
1260 0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3},
1262 0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3,
1263 0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3},
1267 double weights[3][36] = {{1,1,1,1,
1268 0.25,0.25,0.25,0.25, 0.25,0.25,0.25,0.25,
1269 0.25,0.25,0.25,0.25, 0.25,0.25,0.25,0.25,
1270 0.25,0.25,0.25,0.25, 0.25,0.25,0.25,0.25,
1271 0.25,0.25,0.25,0.25, 0.25,0.25,0.25,0.25},
1278 size_t num_links[3] = {1*4 + 4*4 + 4*4,
1284 unsigned num_src_fields = 3;
1285 int num_links_per_field[3][3] = {{1*4, 4*4, 4*4},
1288 int * tgt_id_fixed = NULL;
1289 size_t num_fixed_tgt = 0;
1290 double * fixed_values = NULL;
1291 int * num_tgt_per_fixed_value = NULL;
1292 size_t num_fixed_values = 0;
1294 utest_write_weight_file(
1297 num_src_fields, num_links_per_field[
weight_type], tgt_id_fixed,
1298 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
1304 size_t const num_global_cells[2] = {2,2};
1305 size_t local_start[2][2] = {{0,0},{1,0}};
1306 size_t local_count[2][2] = {{1,2},{1,2}};
1308 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
1310 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
1314 utest_generate_basic_grid_data_reg2d(
1316 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
1327 {{.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
1328 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
1329 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
1330 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1332 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1372 for (
int from_file = 0; from_file <= 1; ++from_file) {
1374 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
1382 (from_file)?weights_from_file:
weights,
1395 double ** src_fields =
xmalloc(3 *
sizeof(*src_fields));
1396 src_data[collection_idx] = src_fields;
1403 (
double)(
grid_data.cell_ids[
i] + 10 * collection_idx) + 0.0;
1409 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1411 (
double)(
grid_data.vertex_ids[
i] + 10 * collection_idx) + 0.3;
1419 (
double)(
grid_data.edge_ids[
i] + 10 * collection_idx) + 0.7;
1428 for (
size_t i = 0;
i < 3; ++
i) free(src_data[collection_idx][i]);
1429 free(src_data[collection_idx]);
1454 if (my_source_rank == 0) {
1489 if (my_source_rank == 0) {
1491 int src_indices[16] = {0,1,4,8,13,14,
1494 int tgt_indices[16] = {0,1,4,8,13,14,
1497 double weights[16] = {1,1,1,1,1,1,
1500 size_t num_links = 16;
1504 unsigned num_src_fields = 3;
1505 int num_links_per_field[3] = {6, 5, 5};
1506 int * tgt_id_fixed = NULL;
1507 size_t num_fixed_tgt = 0;
1508 double * fixed_values = NULL;
1509 int * num_tgt_per_fixed_value = NULL;
1510 size_t num_fixed_values = 0;
1512 utest_write_weight_file(
1513 file_name, src_indices, tgt_indices, weights, num_links,
1514 src_locations, num_src_fields, num_links_per_field, tgt_id_fixed,
1515 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
1521 size_t const num_global_cells[2] = {4,4};
1522 size_t local_start[2][2] = {{0,0},{2,0}};
1523 size_t local_count[2][2] = {{2,4},{2,4}};
1525 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
1527 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
1531 utest_generate_basic_grid_data_reg2d(
1533 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
1544 {{.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
1545 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
1546 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
1547 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1549 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1589 for (
int from_file = 0; from_file <= 1; ++from_file) {
1591 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
1599 (from_file)?weights_from_file:
weights,
1612 double ** src_fields =
xmalloc(3 *
sizeof(*src_fields));
1613 src_data[collection_idx] = src_fields;
1620 (
double)(
grid_data.cell_ids[
i] + 10 * collection_idx) + 0.0;
1626 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1628 (
double)(
grid_data.vertex_ids[
i] + 10 * collection_idx) + 0.3;
1636 (
double)(
grid_data.edge_ids[
i] + 10 * collection_idx) + 0.7;
1645 for (
size_t i = 0;
i < 3; ++
i) free(src_data[collection_idx][i]);
1646 free(src_data[collection_idx]);
1671 if (my_source_rank == 0) {
1684 if (my_source_rank == 0) {
1687 int * tgt_indices = NULL;
1688 int * src_indices = NULL;
1690 size_t num_links = 0;
1694 NUM_SRC_FIELDS =
sizeof(src_locations) /
sizeof(src_locations[0])};
1696 int * tgt_id_fixed = NULL;
1697 size_t num_fixed_tgt = 0;
1698 double * fixed_values = NULL;
1699 int * num_tgt_per_fixed_value = NULL;
1700 size_t num_fixed_values = 0;
1702 utest_write_weight_file(
1703 file_name, src_indices, tgt_indices, weights, num_links,
1704 src_locations,
NUM_SRC_FIELDS, num_links_per_field, tgt_id_fixed,
1705 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
1710 int * tgt_indices = NULL;
1711 int * src_indices = NULL;
1713 size_t num_links = 0;
1717 NUM_SRC_FIELDS =
sizeof(src_locations) /
sizeof(src_locations[0])};
1719 int tgt_id_fixed[] = {0, 1, 2, 3};
1720 size_t num_fixed_tgt = 4;
1721 double fixed_values[] = {999.0};
1722 int num_tgt_per_fixed_value[] = {4};
1723 size_t num_fixed_values = 1;
1725 utest_write_weight_file(
1726 file_name_2, src_indices, tgt_indices, weights, num_links,
1727 src_locations,
NUM_SRC_FIELDS, num_links_per_field, tgt_id_fixed,
1728 num_fixed_tgt, fixed_values, num_tgt_per_fixed_value,
1735 size_t num_vertices[2] = {3,3};
1747 {{.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
1748 enum {
NUM_SRC_FIELDS =
sizeof(src_fields) /
sizeof(src_fields[0])};
1750 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1794 double src_data_raw[NUM_CELLS] = {0.0, 0.0, 0.0, 0.0};
1818 if (my_source_rank == 0) {
1825static void utest_source_main_abort(MPI_Comm source_comm) {
1828 MPI_Comm_rank(source_comm, &my_source_rank);
1838 size_t num_vertices[2] = {3,3};
1851 enum {
NUM_SRC_FIELDS =
sizeof(src_fields) /
sizeof(src_fields[0])};
1853 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1862 for (
int on_missing_file_idx = 0;
1874 "missing_file.nc", curr_on_missing_file,
1885 int abort_handler_was_called = 0;
1887 MPI_IN_PLACE, &abort_handler_was_called, 1,
1888 MPI_INT, MPI_MAX, MPI_COMM_WORLD);
1893 "ERROR unsupported value for on_missing_file");
1895 switch(curr_on_missing_file) {
1898 if (abort_handler_was_called)
1899 PUT_ERR(
"error in handling of YAC_INTERP_FILE_MISSING_CONT");
1902 if (!abort_handler_was_called)
1903 PUT_ERR(
"error in handling of YAC_INTERP_FILE_MISSING_ERROR");
1907 if (abort_handler_was_called) {
1936 PUT_ERR(
"test internal error");
1939static void utest_target_main(MPI_Comm target_comm) {
1942 MPI_Comm_rank(target_comm, &my_target_rank);
1966 size_t const num_global_cells[2] = {2,2};
1967 size_t local_start[2] = {0,0};
1968 size_t local_count[2] = {2,2};
1970 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
1972 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
1976 utest_generate_basic_grid_data_reg2d(
1990 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
1991 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1993 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2020 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2037 tgt_data[collection_idx] =
2039 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2040 tgt_data[collection_idx][i] = -1;
2047 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2049 if (tgt_data[collection_idx][i] != -1.0)
2050 PUT_ERR(
"wrong interpolation result");
2051 }
else if (fabs((
double)(i * (i + 12 * collection_idx)) -
2052 tgt_data[collection_idx][i]) > 1e-9) {
2053 PUT_ERR(
"wrong interpolation result");
2058 free(tgt_data[collection_idx]);
2101 size_t const num_global_cells[2] = {2,2};
2102 size_t local_start[2] = {0,0};
2103 size_t local_count[2] = {2,2};
2105 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2107 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2111 utest_generate_basic_grid_data_reg2d(
2125 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
2126 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2128 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2155 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2160 weights, reorder_type[i], 1,
2167 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2170 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2171 tgt_data[0][i] = -1;
2173 double ref_tgt_field[9] =
2174 {0.1*0+0.2*1+0.3*4+0.4*5,
2175 0.5*1+0.6*2+0.7*5+0.8*6,
2176 0.9*2+1.0*3+1.1*6+1.2*7,
2177 1.3*4+1.4*5+1.5*8+1.6*9,
2178 1.7*5+1.8*6+1.9*9+2.0*10,
2179 2.1*6+2.2*7+2.3*10+2.4*11,
2184 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2186 if (tgt_data[0][i] != -1.0)
2187 PUT_ERR(
"wrong interpolation result");
2188 }
else if (fabs(ref_tgt_field[i] - tgt_data[0][i]) > 1e-9) {
2189 PUT_ERR(
"wrong interpolation result");
2234 size_t const num_global_cells[2] = {2,2};
2235 size_t local_start[2] = {0,0};
2236 size_t local_count[2] = {2,2};
2238 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2240 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2244 utest_generate_basic_grid_data_reg2d(
2258 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
2259 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2261 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2288 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2293 weights, reorder_type[i], 1,
2300 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2303 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2304 tgt_data[0][i] = -1;
2306 double ref_tgt_field[9] =
2307 {0.1*0+0.2*1+0.3*4+0.4*5,
2308 0.5*1+0.6*2+0.7*5+0.8*6,
2311 1.7*5+1.8*6+1.9*9+2.0*10,
2312 2.1*6+2.2*7+2.3*10+2.4*11,
2317 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2319 if (tgt_data[0][i] != -1.0)
2320 PUT_ERR(
"wrong interpolation result");
2321 }
else if (fabs(ref_tgt_field[i] - tgt_data[0][i]) > 1e-9) {
2322 PUT_ERR(
"wrong interpolation result");
2366 size_t const num_global_cells[2] = {2,2};
2367 size_t local_start[2] = {0,0};
2368 size_t local_count[2] = {2,2};
2370 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2372 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2376 utest_generate_basic_grid_data_reg2d(
2390 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
2391 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2393 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2420 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2425 weights, reorder_type[i], 1,
2432 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2435 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2436 tgt_data[0][i] = -1;
2440 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2441 if (tgt_data[0][i] != -1.0)
2442 PUT_ERR(
"wrong interpolation result");
2485 size_t const num_global_cells[2] = {2,2};
2486 size_t local_start[2] = {0,0};
2487 size_t local_count[2] = {2,2};
2489 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2491 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2495 utest_generate_basic_grid_data_reg2d(
2509 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
2510 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2512 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2539 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2544 weights, reorder_type[i], 1,
2551 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2554 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) tgt_data[0][i] = -3;
2556 double ref_tgt_field[9] =
2557 {-1,-3,-2, -3,-2,-3, -2,-3,-3};
2561 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2562 if (ref_tgt_field[i] != tgt_data[0][i])
2563 PUT_ERR(
"wrong interpolation result");
2606 size_t const num_global_cells[2] = {2,2};
2607 size_t local_start[2] = {0,0};
2608 size_t local_count[2] = {2,2};
2610 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2612 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2616 utest_generate_basic_grid_data_reg2d(
2630 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2632 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2659 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2664 weights, reorder_type[i], 1,
2671 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2673 for (
size_t i = 0;
i <
grid_data.num_edges; ++
i) tgt_data[0][i] = -3;
2675 double ref_tgt_field[12] = {-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1};
2680 if (ref_tgt_field[i] != tgt_data[0][i])
2681 PUT_ERR(
"wrong interpolation result");
2723 size_t const num_global_cells[2] = {2,2};
2724 size_t local_start[2] = {0,0};
2725 size_t local_count[2] = {2,2};
2727 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2729 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2733 utest_generate_basic_grid_data_reg2d(
2747 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2749 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2790 for (
int from_file = 0; from_file <= 1; ++from_file) {
2791 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2796 (from_file)?weights_from_file:
weights,
2804 double ** tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
2806 for (
size_t i = 0;
i <
grid_data.num_edges; ++
i) tgt_data[0][i] = -3;
2808 double ref_tgt_field[12] = {NAN,-1,NAN,-1,NAN,-1,NAN,-1,NAN,-1,NAN,-1};
2814 if (memcmp(&ref_tgt_field[i], &tgt_data[0][i],
sizeof(tgt_data[0][i])))
2815 PUT_ERR(
"wrong interpolation result");
2863 size_t const num_global_cells[2] = {1,1};
2864 size_t local_start[2] = {0,0};
2865 size_t local_count[2] = {1,1};
2867 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
2869 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
2873 utest_generate_basic_grid_data_reg2d(
2887 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
2888 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
2889 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
2891 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
2930 for (
int from_file = 0; from_file <= 1; ++from_file) {
2932 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
2940 (from_file)?weights_from_file:
weights,
2951 tgt_data[collection_idx] =
2953 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2954 tgt_data[collection_idx][i] = -3;
2957 double ref_tgt_field[3][4] =
2958 {{0.0 + 0.25 * (0.3+1.3+3.3+4.3) + 0.25 * (0.7+1.7+3.7+ 5.7),
2959 1.0 + 0.25 * (1.3+2.3+4.3+5.3) + 0.25 * (2.7+3.7+4.7+ 7.7),
2960 2.0 + 0.25 * (3.3+4.3+6.3+7.3) + 0.25 * (5.7+6.7+8.7+10.7),
2961 3.0 + 0.25 * (4.3+5.3+7.3+8.3) + 0.25 * (7.7+8.7+9.7+11.7)},
2962 {0.0 + (0.3+1.3+3.3+4.3) + (0.7+1.7+3.7+ 5.7),
2963 1.0 + (1.3+2.3+4.3+5.3) + (2.7+3.7+4.7+ 7.7),
2964 2.0 + (3.3+4.3+6.3+7.3) + (5.7+6.7+8.7+10.7),
2965 3.0 + (4.3+5.3+7.3+8.3) + (7.7+8.7+9.7+11.7)},
2966 {4.3, 1.0, 2.0, 11.7}};
2967 double collection_factor[3] = {30.0, 90.0, 10.0};
2973 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
2976 (
double)collection_idx) -
2977 tgt_data[collection_idx][i]) > 1e-9)
2978 PUT_ERR(
"wrong interpolation result");
2981 ++collection_idx) free(tgt_data[collection_idx]);
3041 size_t const num_global_cells[2] = {4,4};
3042 size_t local_start[2] = {0,0};
3043 size_t local_count[2] = {4,4};
3045 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
3047 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
3051 utest_generate_basic_grid_data_reg2d(
3065 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
3066 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
3067 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
3069 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
3108 for (
int from_file = 0; from_file <= 1; ++from_file) {
3110 for (
size_t i = 0;
i <
sizeof(reorder_type) /
sizeof(reorder_type[0]);
3118 (from_file)?weights_from_file:
weights,
3129 tgt_data[collection_idx] =
3132 tgt_data[collection_idx][i] = -3;
3135 double ref_tgt_field[16] =
3136 { 0.0, 1.0, 8.3, 8.7,
3137 4.0, 12.3, 13.3, 17.7,
3138 8.0, 17.3, 25.7, 26.7,
3139 30.7, 13.0, 14.0, 24.3};
3146 if (fabs((ref_tgt_field[i] + 10.0 * (
double)collection_idx) -
3147 tgt_data[collection_idx][i]) > 1e-9)
3148 PUT_ERR(
"wrong interpolation result");
3151 ++collection_idx) free(tgt_data[collection_idx]);
3183 size_t num_vertices[2] = {3,3};
3196 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
3198 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
3242 double tgt_data_raw[NUM_CELLS];
3243 double * tgt_data[] = {&(tgt_data_raw[0])};
3244 for (
size_t i = 0;
i < NUM_CELLS; ++
i) tgt_data_raw[i] = -1.0;
3250 for (
size_t i = 0;
i < NUM_CELLS; ++
i)
3251 if (tgt_data_raw[i] != ref_tgt_field_value[on_success_idx])
3252 PUT_ERR(
"wrong interpolation result");
3270static void utest_target_main_abort(MPI_Comm target_comm) {
3273 MPI_Comm_rank(target_comm, &my_target_rank);
3283 size_t num_vertices[2] = {3,3};
3296 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
3298 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
3307 for (
int on_missing_file_idx = 0;
3319 "missing_file.nc", curr_on_missing_file,
3330 int abort_handler_was_called = 0;
3332 MPI_IN_PLACE, &abort_handler_was_called, 1,
3333 MPI_INT, MPI_MAX, MPI_COMM_WORLD);
3338 "ERROR unsupported value for on_missing_file");
3340 switch(curr_on_missing_file) {
3343 if (abort_handler_was_called)
3344 PUT_ERR(
"error in handling of YAC_INTERP_FILE_MISSING_CONT");
3347 if (!abort_handler_was_called)
3348 PUT_ERR(
"error in handling of YAC_INTERP_FILE_MISSING_ERROR");
3352 if (abort_handler_was_called) {
3376 PUT_ERR(
"test internal error");
3380static void utest_on_missing_abort_handler(
3381 MPI_Comm
comm,
char const * msg,
char const * source,
int line) {
3388 int interpolation_complete = 0;
3391 MPI_IN_PLACE, &interpolation_complete, 1, MPI_INT, MPI_MAX,
comm),
comm);
3393 int abort_handler_was_called = 1;
3395 MPI_IN_PLACE, &abort_handler_was_called, 1,
3396 MPI_INT, MPI_MAX, MPI_COMM_WORLD);
#define YAC_ASSERT(exp, msg)
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
struct yac_basic_grid * yac_basic_grid_reg_2d_deg_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
size_t yac_basic_grid_add_mask_nocpy(struct yac_basic_grid *grid, enum yac_location location, int const *mask, char const *mask_name)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
struct yac_dist_grid_pair * yac_dist_grid_pair_new(struct yac_basic_grid *grid_a, struct yac_basic_grid *grid_b, MPI_Comm comm)
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
struct yac_interp_grid * yac_interp_grid_new(struct yac_dist_grid_pair *grid_pair, char const *src_grid_name, char const *tgt_grid_name, size_t num_src_fields, struct yac_interp_field const *src_fields, struct yac_interp_field const tgt_field)
MPI_Comm yac_interp_grid_get_MPI_Comm(struct yac_interp_grid *interp_grid)
void yac_interp_method_delete(struct interp_method **method)
Delete an interpolation stack and free its resources (but not the pointer array).
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
Perform weight computation using given interpolation stack and grid.
Defines the interface of the interpolation method "base class" in YAC.
struct interp_method * yac_interp_method_file_new(char const *weight_file_name, enum yac_interp_file_on_missing_file on_missing_file, enum yac_interp_file_on_success on_success)
yac_interp_file_on_missing_file
@ YAC_INTERP_FILE_MISSING_CONT
continue on missing file
@ YAC_INTERP_FILE_MISSING_ERROR
abort on missing file
yac_interp_file_on_success
@ YAC_INTERP_FILE_SUCCESS_CONT
@ YAC_INTERP_FILE_SUCCESS_STOP
struct yac_interpolation * yac_interp_weights_get_interpolation(struct yac_interp_weights *weights, enum yac_interp_weights_reorder_type reorder, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, int is_source, int is_target)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
void yac_interp_weights_write_to_file(struct yac_interp_weights *weights, char const *filename, char const *src_grid_name, char const *tgt_grid_name, size_t src_grid_size, size_t tgt_grid_size, enum yac_weight_file_on_existing on_existing)
yac_interp_weights_reorder_type
@ YAC_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be applied at source processes
@ YAC_WEIGHT_FILE_ERROR
error when weight file existis already
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
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_put(struct yac_interpolation *interp, double ***src_fields)
Provide source field data and start asynchronous execution of interpolation (put phase).
double const YAC_FRAC_MASK_NO_VALUE
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
enum yac_interp_file_on_success on_success_types[]
char const src_grid_name[]
char const tgt_grid_name[]
static MPI_Comm split_comm
enum yac_interp_file_on_missing_file on_missing_file_types[]
void yac_set_default_comm(MPI_Comm comm)
void(* yac_abort_func)(MPI_Comm comm, const char *msg, const char *source, int line) __attribute__((noreturn))
void yac_set_abort_handler(yac_abort_func custom_abort)
#define yac_mpi_call(call, comm)