26#define YAC_RAD (0.01745329251994329576923690768489)
28static void utest_submain_1(
31static void utest_submain_2(
34int main(
int argc,
char *argv[]) {
37 PUT_ERR(
"wrong number of arguments\n");
45 PUT_ERR(
"invalid argument (has to be either \"src\" or \"tgt\")\n");
51 xt_initialize(MPI_COMM_WORLD);
53 int comm_rank, comm_size;
54 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
55 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
56 MPI_Barrier(MPI_COMM_WORLD);
59 PUT_ERR(
"ERROR: wrong number of processes");
67 int comp_flag = comm_rank < 2;
70 MPI_Comm_split(MPI_COMM_WORLD, comp_flag, 0, &
split_comm);
72 if (comp_flag) utest_submain_1(
split_comm, reorder_type);
73 else utest_submain_2(
split_comm, reorder_type);
125static void utest_submain_2(
128 char const local_grid_name[] =
"grid2";
129 char const remote_grid_name[] =
"grid1";
132 MPI_Comm_rank(comp_comm, &my_rank);
136 double edge_coordinates_x[] = {
137 0.25,0.0,1.25,1.0,2.25,2.0,3.25,3.0,4.0,
138 0.25,0.0,1.25,1.0,2.25,2.0,3.25,3.0,4.0,
139 0.25,0.0,1.25,1.0,2.25,2.0,3.25,3.0,4.0,
140 0.25,0.0,1.25,1.0,2.25,2.0,3.25,3.0,4.0,
141 0.25,1.25,2.25,3.25};
142 double edge_coordinates_y[] = {
143 0.0,0.25,0.0,0.25,0.0,0.25,0.0,0.25,0.25,
144 1.0,1.25,1.0,1.25,1.0,1.25,1.0,1.25,1.25,
145 2.0,2.25,2.0,2.25,2.0,2.25,2.0,2.25,2.25,
146 3.0,3.25,3.0,3.25,3.0,3.25,3.0,3.25,3.25,
148 double edge_coords[40][3];
150 size_t local_start[2][2] = {{0,0},{2,0}};
151 size_t local_count[2][2] = {{2,4},{2,4}};
155 for (
size_t i = 0;
i < 40; ++
i)
156 LLtoXYZ_deg(edge_coordinates_x[i], edge_coordinates_y[i], edge_coords[i]);
161 local_start[my_rank], local_count[my_rank],
with_halo);
170 yac_int masked_corner_ids[] = {10,11,12,15,16,17};
171 size_t num_masked_corners =
172 sizeof(masked_corner_ids)/
sizeof(masked_corner_ids[0]);
174 int * corner_mask =
xmalloc(num_vertices *
sizeof(*corner_mask));
175 for (
size_t i = 0;
i < num_vertices; ++
i) {
177 for (
size_t j = 0; j < num_masked_corners; ++j)
178 if (
grid_data.vertex_ids[i] == masked_corner_ids[j]) corner_mask[
i] = 0;
181 yac_int masked_edge_ids[] = {18,19,20,21,23,27,29};
182 size_t num_masked_edges =
183 sizeof(masked_edge_ids)/
sizeof(masked_edge_ids[0]);
186 for (
size_t i = 0;
i < num_edges; ++
i) {
188 for (
size_t j = 0; j < num_masked_edges; ++j)
193 xmalloc(num_edges *
sizeof(*edge_field_coords));
194 for (
size_t i = 0;
i < num_edges; ++
i)
195 memcpy(edge_field_coords[i], edge_coords[
grid_data.edge_ids[i]],
212 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
214 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
242 weights_out, reorder_type, 1,
246 weights_in, reorder_type, 1,
256 double * source_data_field =
257 xmalloc(num_vertices *
sizeof(*source_data_field));
258 double * source_data_pointset[1] = {source_data_field};
259 double ** source_data[1] = {source_data_pointset};
260 for (
size_t i = 0;
i < num_vertices; ++
i)
261 source_data_field[i] =
263 ((double)(
grid_data.vertex_ids[i])):(-1.0);
266 double * target_data_field =
267 xmalloc(num_vertices *
sizeof(*target_data_field));
268 double * target_data[1] = {target_data_field};
269 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
278 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
281 1338, 13, 14, 15, 16,
282 1338, 18, 19, 20, 21};
284 for (
size_t i = 0;
i < num_vertices; ++
i) {
288 ref_global_target_data[
grid_data.vertex_ids[i]]))
289 PUT_ERR(
"error in interpolated data on target side\n");
291 if (target_data[0][i] != -1.0)
292 PUT_ERR(
"error in interpolated data on target side\n");
300 free(target_data_field);
301 free(source_data_field);
314 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
316 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
344 weights_out, reorder_type, 1,
348 weights_in, reorder_type, 1,
358 double * source_data_field =
359 xmalloc(num_vertices *
sizeof(*source_data_field));
360 double * source_data_pointset[1] = {source_data_field};
361 double ** source_data[1] = {source_data_pointset};
362 for (
size_t i = 0;
i < num_vertices; ++
i)
363 source_data_field[i] =
365 ((double)(
grid_data.vertex_ids[i])):(-1.0);
368 double * target_data_field =
369 xmalloc(num_vertices *
sizeof(*target_data_field));
370 double * target_data[1] = {target_data_field};
371 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
380 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
381 1338, 3,1338,1338,1338,
382 1338, 8,1338,1338,1338,
383 1338, 13,1338,1338,1338,
384 1338, 18, 19, 20, 21};
386 for (
size_t i = 0;
i < num_vertices; ++
i) {
390 ref_global_target_data[
grid_data.vertex_ids[i]]))
391 PUT_ERR(
"error in interpolated data on target side\n");
393 if (target_data[0][i] != -1.0)
394 PUT_ERR(
"error in interpolated data on target side\n");
402 free(target_data_field);
403 free(source_data_field);
416 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
418 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
446 weights_out, reorder_type, 1,
450 weights_in, reorder_type, 1,
460 double * source_data_field =
461 xmalloc(num_vertices *
sizeof(*source_data_field));
462 double * source_data_pointset[1] = {source_data_field};
463 double ** source_data[1] = {source_data_pointset};
464 for (
size_t i = 0;
i < num_vertices; ++
i)
465 source_data_field[i] =
467 ((double)(
grid_data.vertex_ids[i])):(-1.0);
470 double * target_data_field =
471 xmalloc(num_vertices *
sizeof(*target_data_field));
472 double * target_data[1] = {target_data_field};
473 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
482 double ref_global_target_data[] = {1338,1338, 1338,1338,1338,
483 1338, 3, 3, 2.5, 3.5,
484 1338, 8, 8.5,1338,1338,
485 1338, 13,44.0/3.0,17.5,18.5,
486 1338, 18, 19, 20, 21};
488 for (
size_t i = 0;
i < num_vertices; ++
i) {
490 if (fabs(target_data[0][i] -
491 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
492 PUT_ERR(
"error in interpolated data on target side\n");
494 if (target_data[0][i] != -1.0)
495 PUT_ERR(
"error in interpolated data on target side\n");
503 free(target_data_field);
504 free(source_data_field);
521 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
523 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
527 num_src_fields, src_fields, tgt_field);
533 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
535 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
539 num_src_fields, src_fields, tgt_field);
561 weights_out, reorder_type, 1,
565 weights_in, reorder_type, 1,
575 double * source_data_field =
576 xmalloc(num_vertices *
sizeof(*source_data_field));
577 double * source_data_pointset[1] = {source_data_field};
578 double ** source_data[1] = {source_data_pointset};
579 for (
size_t i = 0;
i < num_vertices; ++
i)
580 source_data_field[i] =
582 ((double)(
grid_data.vertex_ids[i])):(-1.0);
585 double * target_data_field =
586 xmalloc(num_vertices *
sizeof(*target_data_field));
587 double * target_data[1] = {target_data_field};
588 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
597 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
598 1338, 3, 3, 2.5, 3.5,
599 -1, -1, -1,1338,1338,
600 -1, -1, -1,17.5,18.5,
601 1338, 18, 19, 20, 21};
603 for (
size_t i = 0;
i < num_vertices; ++
i) {
604 if ((
grid_data.core_vertex_mask[i]) && corner_mask[i]) {
605 if (fabs(target_data[0][i] -
606 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
607 PUT_ERR(
"error in interpolated data on target side\n");
609 if (target_data[0][i] != -1.0)
610 PUT_ERR(
"error in interpolated data on target side\n");
618 free(target_data_field);
619 free(source_data_field);
635 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
637 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
640 num_src_fields, src_fields, tgt_field);
645 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
647 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
650 num_src_fields, src_fields, tgt_field);
672 weights_out, reorder_type, 1,
676 weights_in, reorder_type, 1,
686 double * source_data_field =
687 xmalloc(num_vertices *
sizeof(*source_data_field));
688 double * source_data_pointset[1] = {source_data_field};
689 double ** source_data[1] = {source_data_pointset};
690 for (
size_t i = 0;
i < num_vertices; ++
i)
691 source_data_field[i] =
693 ((double)(
grid_data.vertex_ids[i])):(-1.0);
696 double * target_data_field =
697 xmalloc(num_edges *
sizeof(*target_data_field));
698 double * target_data[1] = {target_data_field};
699 for (
size_t i = 0;
i < num_edges; ++
i) target_data_field[i] = -1.0;
708 double ref_global_target_data[] = {
709 1338,1338,1338,1338, 1338, 1338,1338,1338,1338,
710 1338,1338, 3, 3, 3, 3, 2.5, 2.5, 3.5,
711 -1, -1, -1, -1, 8.5, -1,1338,1338,1338,
712 -1,1338, -1, 13,44.0/3.0,44.0/3.0,17.5,17.5,18.5,
715 for (
size_t i = 0;
i < num_edges; ++
i) {
716 if ((
grid_data.core_edge_mask[i]) && edge_mask[i]) {
717 if (fabs(target_data[0][i] -
718 ref_global_target_data[
grid_data.edge_ids[i]]) > 1e-9)
719 PUT_ERR(
"error in interpolated data on target side\n");
721 if (target_data[0][i] != -1.0)
722 PUT_ERR(
"error in interpolated data on target side\n");
730 free(target_data_field);
731 free(source_data_field);
746 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
748 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
751 num_src_fields, src_fields, tgt_field);
764 double frac_mask_value = -1337.0;
768 weights, reorder_type, 1, frac_mask_value, 1.0, 0.0, NULL, 1, 1);
772 double * target_data_field =
773 xmalloc(num_edges *
sizeof(*target_data_field));
774 double * target_data[1] = {target_data_field};
776 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx) {
782 for (
size_t i = 0;
i < num_edges; ++
i) target_data_field[i] = -1.0;
790 double ref_global_target_data[] = {
791 1337,1337,1337,1337, 1337, 1337,1337,1337,1337,
792 1337,1337, 3, 3, 3, 3, 2.5, 2.5, 3.5,
793 -1, -1, -1, -1, 8.5, -1,1337,1337,1337,
794 -1,1337, -1, 13,44.0/3.0,44.0/3.0,17.5,17.5,18.5,
797 for (
size_t i = 0;
i < num_edges; ++
i) {
798 if ((
grid_data.core_edge_mask[i]) && edge_mask[i]) {
799 if (fabs(target_data[0][i] -
800 ref_global_target_data[
grid_data.edge_ids[i]]) > 1e-9)
801 PUT_ERR(
"error in interpolated data on target side\n");
803 if (target_data[0][i] != -1.0)
804 PUT_ERR(
"error in interpolated data on target side\n");
813 free(target_data_field);
814 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx)
872static void utest_submain_1(
875 char const local_grid_name[] =
"grid1";
876 char const remote_grid_name[] =
"grid2";
879 MPI_Comm_rank(comp_comm, &my_rank);
881 double vertex_coordinates_x[] = {0.5, 1.5, 2.5, 3.5, 4.5};
882 double vertex_coordinates_y[] = {0.5, 1.5, 2.5, 3.5, 4.5};
886 size_t const num_global_cells[2] = {4,4};
887 size_t local_start[2][2] = {{0,0},{0,2}};
888 size_t local_count[2][2] = {{4,2},{4,2}};
890 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
891 vertex_coordinates_x[i] *=
YAC_RAD;
892 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
893 vertex_coordinates_y[i] *=
YAC_RAD;
894 for (
size_t i = 0, k = 0;
i < num_global_cells[1]; ++
i)
895 for (
size_t j = 0; j < num_global_cells[0]; ++j, ++k)
900 vertex_coordinates_x, vertex_coordinates_y, num_global_cells,
901 local_start[my_rank], local_count[my_rank],
with_halo);
910 yac_int masked_corner_ids[] = {7,8,9,12,13,14};
911 size_t num_masked_corners =
912 sizeof(masked_corner_ids)/
sizeof(masked_corner_ids[0]);
914 int * corner_mask =
xmalloc(num_vertices *
sizeof(*corner_mask));
915 for (
size_t i = 0;
i < num_vertices; ++
i) {
917 for (
size_t j = 0; j < num_masked_corners; ++j)
918 if (
grid_data.vertex_ids[i] == masked_corner_ids[j]) corner_mask[
i] = 0;
921 yac_int masked_cell_ids[] = {6,7};
922 size_t num_masked_cells =
923 sizeof(masked_cell_ids)/
sizeof(masked_cell_ids[0]);
928 for (
size_t j = 0; j < num_masked_cells; ++j)
952 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
954 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
982 weights_in, reorder_type, 1,
986 weights_out, reorder_type, 1,
996 double * source_data_field =
997 xmalloc(num_vertices *
sizeof(*source_data_field));
998 double * source_data_pointset[1] = {source_data_field};
999 double ** source_data[1] = {source_data_pointset};
1000 for (
size_t i = 0;
i < num_vertices; ++
i)
1001 source_data_field[i] =
1003 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1006 double * target_data_field =
1007 xmalloc(num_vertices *
sizeof(*target_data_field));
1008 double * target_data[1] = {target_data_field};
1009 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1018 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1020 13, 14, 15, 16,1337,
1021 18, 19, 20, 21,1337,
1022 1337,1337,1337,1337,1337};
1024 for (
size_t i = 0;
i < num_vertices; ++
i) {
1028 ref_global_target_data[
grid_data.vertex_ids[i]]))
1029 PUT_ERR(
"error in interpolated data on target side\n");
1031 if (target_data[0][i] != -1.0)
1032 PUT_ERR(
"error in interpolated data on target side\n");
1040 free(target_data_field);
1041 free(source_data_field);
1054 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1056 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1084 weights_in, reorder_type, 1,
1088 weights_out, reorder_type, 1,
1098 double * source_data_field =
1099 xmalloc(num_vertices *
sizeof(*source_data_field));
1100 double * source_data_pointset[1] = {source_data_field};
1101 double ** source_data[1] = {source_data_pointset};
1102 for (
size_t i = 0;
i < num_vertices; ++
i)
1103 source_data_field[i] =
1105 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1108 double * target_data_field =
1109 xmalloc(num_vertices *
sizeof(*target_data_field));
1110 double * target_data[1] = {target_data_field};
1111 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1120 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1121 1337,1337,1337, 11,1337,
1122 1337,1337,1337, 16,1337,
1123 1337,1337,1337, 21,1337,
1124 1337,1337,1337,1337,1337};
1126 for (
size_t i = 0;
i < num_vertices; ++
i) {
1130 ref_global_target_data[
grid_data.vertex_ids[i]]))
1131 PUT_ERR(
"error in interpolated data on target side\n");
1133 if (target_data[0][i] != -1.0)
1134 PUT_ERR(
"error in interpolated data on target side\n");
1142 free(target_data_field);
1143 free(source_data_field);
1156 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1158 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1186 weights_in, reorder_type, 1,
1190 weights_out, reorder_type, 1,
1200 double * source_data_field =
1201 xmalloc(num_vertices *
sizeof(*source_data_field));
1202 double * source_data_pointset[1] = {source_data_field};
1203 double ** source_data[1] = {source_data_pointset};
1204 for (
size_t i = 0;
i < num_vertices; ++
i)
1205 source_data_field[i] =
1207 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1210 double * target_data_field =
1211 xmalloc(num_vertices *
sizeof(*target_data_field));
1212 double * target_data[1] = {target_data_field};
1213 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1222 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1223 5.5, 6.5,28.0/3.0, 11,1337,
1224 1337,1337, 15.5, 16,1337,
1225 20.5,21.5, 21, 21,1337,
1226 1337,1337, 1337,1337,1337};
1228 for (
size_t i = 0;
i < num_vertices; ++
i) {
1230 if (fabs(target_data[0][i] -
1231 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
1232 PUT_ERR(
"error in interpolated data on target side\n");
1234 if (target_data[0][i] != -1.0)
1235 PUT_ERR(
"error in interpolated data on target side\n");
1243 free(target_data_field);
1244 free(source_data_field);
1261 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1263 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1267 num_src_fields, src_fields, tgt_field);
1273 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1275 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1279 num_src_fields, src_fields, tgt_field);
1301 weights_in, reorder_type, 1,
1305 weights_out, reorder_type, 1,
1315 double * source_data_field =
1316 xmalloc(num_vertices *
sizeof(*source_data_field));
1317 double * source_data_pointset[1] = {source_data_field};
1318 double ** source_data[1] = {source_data_pointset};
1319 for (
size_t i = 0;
i < num_vertices; ++
i)
1320 source_data_field[i] =
1322 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1325 double * target_data_field =
1326 xmalloc(num_vertices *
sizeof(*target_data_field));
1327 double * target_data[1] = {target_data_field};
1328 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1337 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1338 5.5, 6.5, -1, -1, -1,
1339 1337,1337, -1, -1, -1,
1340 20.5,21.5, 21, 21,1337,
1341 1337,1337,1337,1337,1337};
1343 for (
size_t i = 0;
i < num_vertices; ++
i) {
1344 if ((
grid_data.core_vertex_mask[i]) && corner_mask[i]) {
1345 if (fabs(target_data[0][i] -
1346 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
1347 PUT_ERR(
"error in interpolated data on target side\n");
1349 if (target_data[0][i] != -1.0)
1350 PUT_ERR(
"error in interpolated data on target side\n");
1358 free(target_data_field);
1359 free(source_data_field);
1375 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1377 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1380 num_src_fields, src_fields, tgt_field);
1385 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1387 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
1390 num_src_fields, src_fields, tgt_field);
1412 weights_in, reorder_type, 1,
1416 weights_out, reorder_type, 1,
1426 double * source_data_field =
1427 xmalloc(num_vertices *
sizeof(*source_data_field));
1428 double * source_data_pointset[1] = {source_data_field};
1429 double ** source_data[1] = {source_data_pointset};
1430 for (
size_t i = 0;
i < num_vertices; ++
i)
1431 source_data_field[i] =
1433 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1436 double * target_data_field =
1438 double * target_data[1] = {target_data_field};
1439 for (
size_t i = 0;
i <
num_cells; ++
i) target_data_field[i] = -1.0;
1448 double ref_global_target_data[] = { 3, 4, 5, 6,
1455 if (fabs(target_data[0][i] -
1456 ref_global_target_data[
grid_data.cell_ids[i]]) > 1e-9)
1457 PUT_ERR(
"error in interpolated data on target side\n");
1459 if (target_data[0][i] != -1.0)
1460 PUT_ERR(
"error in interpolated data on target side\n");
1468 free(target_data_field);
1469 free(source_data_field);
1484 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1486 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
1489 num_src_fields, src_fields, tgt_field);
1502 double frac_mask_value = -1337.0;
1506 weights, reorder_type, 1, frac_mask_value, 1.0, 0.0, NULL, 1, 1);
1517 double * source_data_field =
1518 xmalloc(num_vertices *
sizeof(*source_data_field));
1519 double * source_data_pointset[1] = {source_data_field};
1520 double ** source_data[1] = {source_data_pointset};
1521 double * source_frac_mask_data =
1522 xmalloc(num_vertices *
sizeof(*source_frac_mask_data));
1523 double * source_frac_mask_pointset[1] = {source_frac_mask_data};
1524 double ** source_frac_mask[1] = {source_frac_mask_pointset};
1525 for (
size_t i = 0;
i < num_vertices; ++
i) source_frac_mask_data[i] = 0.5;
1526 for (
size_t i = 0;
i < num_vertices; ++
i)
1527 source_data_field[i] =
1529 ((double)(
grid_data.vertex_ids[i])*source_frac_mask_data[
i]):(-1.0);
1531 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx)
1539 free(source_frac_mask_data);
1540 free(source_data_field);
1541 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx)
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[])
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_avg_new(enum yac_interp_avg_weight_type weight_type, int partial_coverage)
@ YAC_INTERP_AVG_ARITHMETIC
struct interp_method * yac_interp_method_fixed_new(double value)
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
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
Create a deep copy of an interpolation object.
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_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).
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[]
int double_are_unequal(double a, double b)
static MPI_Comm split_comm
double cell_coordinates_y[]
double cell_coords[36][3]
double cell_coordinates_x[]
struct @6 interpolations[]
double(* yac_coordinate_pointer)[3]