29static void utest_target_main(MPI_Comm target_comm);
30static void utest_source_main(MPI_Comm source_comm);
36 xt_initialize(MPI_COMM_WORLD);
38 int comm_rank, comm_size;
39 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
40 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
41 MPI_Barrier(MPI_COMM_WORLD);
44 PUT_ERR(
"ERROR: wrong number of processes");
50 int tgt_flag = comm_rank < 1;
53 MPI_Comm_split(MPI_COMM_WORLD, tgt_flag, 0, &
split_comm);
65static void utest_source_main(MPI_Comm source_comm) {
139 MPI_Comm_rank(source_comm, &my_source_rank);
141 double coordinates_x[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
142 double coordinates_y[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
144 size_t local_start[4][2] = {{0,0},{0,2},{3,2},{0,5}};
145 size_t local_count[4][2] = {{7,2},{3,3},{4,3},{7,2}};
147 int global_corner_mask[8][8] = {
162 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
164 int * src_corner_mask =
166 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
168 ((
int*)(&(global_corner_mask[0][0])))[
grid_data.vertex_ids[
i]];
181 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
183 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
189 size_t num_stacks = 7;
220 .max_search_distance = 0.4 *
YAC_RAD}),
228 for (
size_t i = 0;
i < num_stacks; ++
i) {
236 for (
size_t i = 0;
i < num_stacks; ++
i) {
237 for (
size_t j = 0; j < 2; ++j) {
253 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
254 src_data[collection_idx][0] =
256 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
257 src_data[collection_idx][0][i] =
259 (
double)(collection_idx * 49);
266 free(src_data[collection_idx][0]);
267 free(src_data[collection_idx]);
277 for (
size_t i = 0;
i < num_stacks; ++
i)
378 MPI_Comm_rank(source_comm, &my_source_rank);
380 double coordinates_x[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
381 double coordinates_y[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
383 size_t local_start[4][2] = {{0,0},{0,2},{3,2},{0,5}};
384 size_t local_count[4][2] = {{7,2},{3,3},{4,3},{7,2}};
386 int global_corner_mask[8][8] = {
401 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
403 int * src_corner_mask =
405 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
407 ((
int*)(&(global_corner_mask[0][0])))[
grid_data.vertex_ids[
i]];
420 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
422 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
443 for (
size_t i = 0;
i < 2; ++
i) {
447 weights, reorder_type[i], 1,
456 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
457 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
480 size_t local_start[2] = {0,0};
481 size_t local_count[2] = {3,3};
500 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
502 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
508 enum {NUM_STACKS = 1};
517 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
522 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
538 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
539 src_data[collection_idx][0] =
541 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
542 src_data[collection_idx][0][i] =
544 (
double)(collection_idx * 16);
551 free(src_data[collection_idx][0]);
552 free(src_data[collection_idx]);
561 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
575 size_t local_start[2] = {0,0};
576 size_t local_count[2] = {3,3};
595 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
597 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
603 enum {NUM_STACKS = 2};
618 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
623 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
639 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
640 src_data[collection_idx][0] =
642 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
643 src_data[collection_idx][0][i] =
645 (
double)(collection_idx * 16);
652 free(src_data[collection_idx][0]);
653 free(src_data[collection_idx]);
662 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
676 size_t local_start[2] = {0,0};
677 size_t local_count[2] = {3,3};
679 double edge_coordinates_x[] = {0.5,0.0,1.5,1.0,2.5,2.0,3.0,
680 0.5,0.0,1.5,1.0,2.5,2.0,3.0,
681 0.5,0.0,1.5,1.0,2.5,2.0,3.0,
683 double edge_coordinates_y[] = {0.0,0.5,0.0,0.5,0.0,0.5,0.5,
684 1.0,1.5,1.0,1.5,1.0,1.5,1.5,
685 2.0,2.5,2.0,2.5,2.0,2.5,2.5,
687 enum {num_edges =
sizeof(edge_coordinates_x) /
sizeof(edge_coordinates_x[0])};
689 xmalloc(num_edges *
sizeof(*edge_coordinates));
692 for (
size_t i = 0;
i < num_edges; ++
i)
694 edge_coordinates_x[i], edge_coordinates_y[i], edge_coordinates[i]);
712 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
714 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
720 enum {NUM_STACKS = 1};
729 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
734 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
750 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
751 src_data[collection_idx][0] =
754 src_data[collection_idx][0][i] =
756 (
double)(collection_idx * 16);
763 free(src_data[collection_idx][0]);
764 free(src_data[collection_idx]);
773 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
783 size_t n,
size_t * src_indices,
size_t tgt_index,
784 double * src_coordinates_x,
double * src_coordinates_y,
size_t src_size_x,
785 double * tgt_coordinates_x,
double * tgt_coordinates_y,
size_t tgt_size_x) {
789 tgt_coordinates_x[tgt_index%tgt_size_x],
790 tgt_coordinates_y[tgt_index/tgt_size_x], tgt_coord);
793 double weights_sum = 0.0;
795 for (
size_t i = 0; i < n; ++i) {
798 LLtoXYZ_deg(src_coordinates_x[src_indices[i]%src_size_x],
799 src_coordinates_y[src_indices[i]/src_size_x], src_coord);
802 result += weight * (double)src_indices[i];
803 weights_sum += weight;
805 return result / weights_sum;
809 size_t n,
size_t * src_indices,
size_t tgt_index) {
813 n, src_indices, tgt_index,
814 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},
815 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0}, 8,
816 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75},
817 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75}, 7);
821 size_t n,
size_t * src_indices,
size_t tgt_index) {
825 n, src_indices, tgt_index,
826 (
double[]){0.0,1.0,2.0,3.0},
827 (
double[]){0.0,1.0,2.0,3.0}, 4,
828 (
double[]){1.0,1.5,2.0},
829 (
double[]){1.0,1.5,2.0}, 3);
833 size_t n,
size_t * src_indices,
size_t tgt_index) {
837 n, src_indices, tgt_index,
838 (
double[]){0.0,1.0,2.0,3.0},
839 (
double[]){0.0,1.0,2.0,3.0}, 4,
840 (
double[]){1.0+90.0,1.5+90.0,2.0+90.0},
841 (
double[]){1.0,1.5,2.0}, 3);
845 size_t n,
size_t * src_indices,
size_t tgt_index,
846 double * src_coordinates_x,
double * src_coordinates_y,
size_t src_size_x,
847 double * tgt_coordinates_x,
double * tgt_coordinates_y,
size_t tgt_size_x) {
849 double src_coords[n][3];
851 for (
size_t i = 0; i < n; ++i)
852 LLtoXYZ_deg(src_coordinates_x[src_indices[i]%src_size_x],
853 src_coordinates_y[src_indices[i]/src_size_x], src_coords[i]);
856 double src_distances_sum = 0.0;
857 for (
size_t i = 0; i < n; ++i)
858 for (
size_t j = 0; j < n; ++j)
861 size_t src_distance_count = n * n - n;
864 double src_distance_mean = src_distances_sum / (double)src_distance_count;
865 double src_distance_mean_sq = src_distance_mean * src_distance_mean;
869 LLtoXYZ_deg(tgt_coordinates_x[tgt_index%tgt_size_x],
870 tgt_coordinates_y[tgt_index/tgt_size_x], tgt_coord);
872 for (
size_t i = 0; i < n; ++i) {
875 exp(-1.0 * (tgt_distance * tgt_distance) /
880 double weights_sum = 0.0;
881 for (
size_t i = 0; i < n; ++i) weights_sum += weights[i];
882 for (
size_t i = 0; i < n; ++i) weights[i] /= weights_sum;
886 for (
size_t i = 0; i < n; ++i)
887 result += weights[i] * (
double)src_indices[i];
893 size_t n,
size_t * src_indices,
size_t tgt_index) {
897 n, src_indices, tgt_index,
898 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},
899 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0}, 8,
900 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75},
901 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75}, 7);
904static void utest_target_main(MPI_Comm target_comm) {
915 size_t local_start[2] = {0,0};
916 size_t local_count[2] = {7,7};
921 for (
size_t j = 0; j <
num_cells[0]; ++j, ++k)
941 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
943 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
949 size_t num_stacks = 7;
980 .max_search_distance = 0.4 *
YAC_RAD}),
985 .max_search_distance = 1.3 *
YAC_RAD}),
990 for (
size_t i = 0;
i < num_stacks; ++
i) {
998 for (
size_t i = 0;
i < num_stacks; ++
i) {
999 for (
size_t j = 0; j < 2; ++j) {
1010 double ref_tgt_field[][49] =
1011 {{8,10,11,12,13,14,15,
1012 17,17,19,20,21,22,23,
1013 25,26,26,28,29,30,31,
1014 33,34,35,35,37,38,39,
1015 41,42,43,44,44,46,47,
1016 49,50,51,52,53,53,55,
1017 57,58,59,60,61,62,62},
1018 {(1+8+10+16+17)/5.0,(1+2+10+11+17)/5.0,
1019 (2+3+10+11+12)/5.0,(3+4+11+12+13)/5.0,
1020 (4+5+12+13+14)/5.0,(5+6+13+14+15)/5.0,
1021 (6+7+14+15+23)/5.0,(8+16+17+24+25)/5.0,
1022 (10+17+19+25+26)/5.0,(10+11+19+20+26)/5.0,
1023 (11+12+19+20+21)/5.0,(12+13+20+21+22)/5.0,
1024 (13+14+21+22+23)/5.0,(14+15+22+23+31)/5.0,
1025 (16+17+24+25+26)/5.0,(17+19+25+26+34)/5.0,
1026 (19+20+26+28+35)/5.0,(19+20+21+28+29)/5.0,
1027 (20+21+28+29+30)/5.0,(21+22+29+30+31)/5.0,
1028 (22+23+30+31+39)/5.0,(24+25+32+33+34)/5.0,
1029 (25+26+33+34+35)/5.0,(26+28+34+35+43)/5.0,
1030 (28+29+35+37+44)/5.0,(28+29+30+37+38)/5.0,
1031 (29+30+37+38+39)/5.0,(30+31+38+39+47)/5.0,
1032 (32+33+40+41+42)/5.0,(33+34+41+42+43)/5.0,
1033 (34+35+42+43+44)/5.0,(35+37+43+44+52)/5.0,
1034 (37+38+44+46+53)/5.0,(37+38+39+46+47)/5.0,
1035 (38+39+46+47+55)/5.0,(40+41+48+49+50)/5.0,
1036 (41+42+49+50+51)/5.0,(42+43+50+51+52)/5.0,
1037 (43+44+51+52+53)/5.0,(44+46+52+53+61)/5.0,
1038 (46+47+53+55+62)/5.0,(46+47+53+55+62)/5.0,
1039 (48+49+56+57+58)/5.0,(49+50+57+58+59)/5.0,
1040 (50+51+58+59+60)/5.0,(51+52+59+60+61)/5.0,
1041 (52+53+60+61+62)/5.0,(53+55+60+61+62)/5.0,
1042 (47+53+55+61+62)/5.0},
1148 {-1,10,11,12,13,14,15,
1149 17,-1,19,20,21,22,23,
1150 25,26,-1,28,29,30,31,
1151 33,34,35,-1,37,38,39,
1152 41,42,43,44,-1,46,47,
1153 49,50,51,52,53,-1,55,
1154 57,58,59,60,61,62,-1},
1156 (2+3+10+11+12)/5.0,(3+4+11+12+13)/5.0,
1157 (4+5+12+13+14)/5.0,(5+6+13+14+15)/5.0,
1158 (6+7+14+15+23)/5.0,-1.0,
1160 (11+12+19+20+21)/5.0,(12+13+20+21+22)/5.0,
1161 (13+14+21+22+23)/5.0,(14+15+22+23+31)/5.0,
1162 (16+17+24+25+26)/5.0,-1.0,
1164 (20+21+28+29+30)/5.0,(21+22+29+30+31)/5.0,
1165 (22+23+30+31+39)/5.0,(24+25+32+33+34)/5.0,
1166 (25+26+33+34+35)/5.0,-1.0,
1168 (29+30+37+38+39)/5.0,(30+31+38+39+47)/5.0,
1169 (32+33+40+41+42)/5.0,(33+34+41+42+43)/5.0,
1170 (34+35+42+43+44)/5.0,-1.0,
1172 (38+39+46+47+55)/5.0,(40+41+48+49+50)/5.0,
1173 (41+42+49+50+51)/5.0,(42+43+50+51+52)/5.0,
1174 (43+44+51+52+53)/5.0,-1.0,
1176 (48+49+56+57+58)/5.0,(49+50+57+58+59)/5.0,
1177 (50+51+58+59+60)/5.0,(51+52+59+60+61)/5.0,
1178 (52+53+60+61+62)/5.0,-1.0,
1184 tgt_data[collection_idx] =
1191 for (
size_t j = 0, offset = collection_idx * 49;
1193 if (ref_tgt_field[i][j] == -1.0) {
1194 if (tgt_data[collection_idx][j] != -1.0)
1195 PUT_ERR(
"wrong interpolation result (fallback)");
1197 if ((tgt_data[collection_idx][j] != 0.0) &&
1198 (fabs((ref_tgt_field[i][j] + (
double)offset) -
1199 tgt_data[collection_idx][j]) > 1e-9))
1200 PUT_ERR(
"wrong interpolation result");
1206 free(tgt_data[collection_idx]);
1215 for (
size_t i = 0;
i < num_stacks; ++
i)
1230 size_t local_start[2] = {0,0};
1231 size_t local_count[2] = {7,7};
1233 int global_cell_mask[7][7] = {
1244 for (
size_t j = 0; j <
num_cells[0]; ++j, ++k)
1253 int * tgt_cell_mask =
1257 ((
int*)(&(global_cell_mask[0][0])))[
grid_data.cell_ids[
i]];
1272 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1274 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1294 for (
size_t i = 0;
i < 2; ++
i) {
1298 weights, reorder_type[i], 1,
1304 double ref_tgt_field[49] =
1305 {(0+1+8+49)/4.0,(0+1+8+6)/4.0,(0+1+8+6)/4.0,(1+6+7+15)/4.0,
1306 (1+6+7+15)/4.0,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1307 (0+1+8+49)/4.0,(0+1+8+49)/4.0,(0+1+8+6)/4.0,(1+6+7+15)/4.0,
1308 (1+6+7+15)/4.0,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1309 (8+1+0+49)/4.0,(8+1+0+49)/4.0,-1,-1,
1310 -1,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1311 (48+49+8+57)/4.0,(48+49+8+57)/4.0,-1,-1,
1312 -1,(6+7+15+49)/4.0,(6+7+15+49)/4.0,
1313 (48+49+56+57)/4.0,(48+49+56+57)/4.0,-1,-1,
1314 -1,(6+7+15+49)/4.0,(6+7+15+49)/4.0,
1315 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,
1316 (48+49+56+57)/4.0,(48+49+15+57)/4.0,(6+7+15+49)/4.0,
1317 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,
1318 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(49+57+56+15)/4.0};
1322 for (
size_t j = 0; j <
grid_data.num_cells; ++j) tgt_field[j] = -1.0;
1326 for (
size_t j = 0; j <
grid_data.num_cells; ++j)
1327 if (fabs(ref_tgt_field[j] - tgt_field[j]) > 1e-9)
1328 PUT_ERR(
"wrong interpolation result");
1347 size_t local_start[2] = {0,0};
1348 size_t local_count[2] = {2,2};
1350 int global_corner_mask[3*3] = {1,0,1, 0,1,0, 1,0,1};
1359 int * tgt_corner_mask =
1361 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1362 tgt_corner_mask[i] = global_corner_mask[
grid_data.vertex_ids[i]];
1375 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1377 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1383 enum {NUM_STACKS = 1};
1393 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1398 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1409 double ref_tgt_field[][3*3] =
1417 tgt_data[collection_idx] =
1419 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1420 tgt_data[collection_idx][i] = -2.0;
1427 for (
size_t j = 0, offset = collection_idx * 16;
1429 if (ref_tgt_field[i][j] != -2.0) {
1431 (ref_tgt_field[i][j] + (
double)offset) -
1432 tgt_data[collection_idx][j]) > 1e-9))
1433 PUT_ERR(
"wrong interpolation result");
1435 if (tgt_data[collection_idx][j] != -2.0)
1436 PUT_ERR(
"wrong interpolation result");
1442 free(tgt_data[collection_idx]);
1450 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
1462 size_t local_start[2] = {0,0};
1463 size_t local_count[2] = {2,2};
1465 int global_corner_mask[3*3] = {1,0,1, 0,1,0, 1,0,1};
1474 int * tgt_corner_mask =
1476 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1477 tgt_corner_mask[i] = global_corner_mask[
grid_data.vertex_ids[i]];
1490 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1492 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1498 enum {NUM_STACKS = 2};
1514 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1519 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1530 double ref_tgt_field[][3*3] =
1545 tgt_data[collection_idx] =
1547 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1548 tgt_data[collection_idx][i] = -2.0;
1555 for (
size_t j = 0, offset = collection_idx * 16;
1557 if (ref_tgt_field[i][j] != -2.0) {
1559 (ref_tgt_field[i][j] + (
double)offset) -
1560 tgt_data[collection_idx][j]) > 1e-9) ||
1561 (tgt_data[collection_idx][j] !=
1562 tgt_data[collection_idx][j]))
1563 PUT_ERR(
"wrong interpolation result");
1565 if (tgt_data[collection_idx][j] != -2.0)
1566 PUT_ERR(
"wrong interpolation result");
1572 free(tgt_data[collection_idx]);
1580 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
1592 size_t local_start[2] = {0,0};
1593 size_t local_count[2] = {2,2};
1612 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1614 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1620 enum {NUM_STACKS = 1};
1630 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1635 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1646 double ref_tgt_field[][3*3] =
1647 {{(0+3+7+1)*0.25,(2+5+9+3)*0.25,(4+6+11+5)*0.25,
1648 (7+10+14+8)*0.25,(9+12+16+10)*0.25,(11+13+18+12)*0.25,
1649 (14+17+21+15)*0.25,(16+19+22+17)*0.25,(18+20+23+19)*0.25}};
1654 tgt_data[collection_idx] =
1656 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1657 tgt_data[collection_idx][i] = -2.0;
1664 for (
size_t j = 0, offset = collection_idx * 16;
1666 if (ref_tgt_field[i][j] != -2.0) {
1668 (ref_tgt_field[i][j] + (
double)offset) -
1669 tgt_data[collection_idx][j]) > 1e-9) ||
1670 (tgt_data[collection_idx][j] !=
1671 tgt_data[collection_idx][j]))
1672 PUT_ERR(
"wrong interpolation result");
1674 if (tgt_data[collection_idx][j] != -2.0)
1675 PUT_ERR(
"wrong interpolation result");
1681 free(tgt_data[collection_idx]);
1689 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
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)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d(double const *global_coords_x, double const *global_coords_y, size_t const num_global_cells_[2], size_t const local_start[2], size_t const local_count[2], int with_halo)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
static double get_vector_angle(double const a[3], double const b[3])
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)
void yac_interp_method_delete(struct interp_method **method)
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
struct interp_method * yac_interp_method_fixed_new(double value)
struct interp_method * yac_interp_method_nnn_new(struct yac_nnn_config config)
@ YAC_INTERP_NNN_GAUSS
distance with Gauss weights of n source points
@ YAC_INTERP_NNN_AVG
average of n source points
@ YAC_INTERP_NNN_DIST
distance weighted average of n source points
@ YAC_INTERP_NNN_ZERO
all weights are set to zero
#define YAC_INTERP_NNN_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_NNN_GAUSS_SCALE_DEFAULT
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)
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
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_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
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[]
static MPI_Comm split_comm
static double compute_dist_result_3(size_t n, size_t *src_indices, size_t tgt_index)
static double compute_gauss_result_(size_t n, size_t *src_indices, size_t tgt_index, double *src_coordinates_x, double *src_coordinates_y, size_t src_size_x, double *tgt_coordinates_x, double *tgt_coordinates_y, size_t tgt_size_x)
static double compute_gauss_result(size_t n, size_t *src_indices, size_t tgt_index)
char const src_grid_name[]
char const tgt_grid_name[]
static double compute_dist_result_(size_t n, size_t *src_indices, size_t tgt_index, double *src_coordinates_x, double *src_coordinates_y, size_t src_size_x, double *tgt_coordinates_x, double *tgt_coordinates_y, size_t tgt_size_x)
static double compute_dist_result(size_t n, size_t *src_indices, size_t tgt_index)
static double compute_dist_result_2(size_t n, size_t *src_indices, size_t tgt_index)
double cell_coordinates_y[]
double cell_coordinates_x[]
double(* yac_coordinate_pointer)[3]