27#define YAC_RAD (0.01745329251994329576923690768489)
29static void utest_submain_1(
32static void utest_submain_2(
35int main(
int argc,
char *argv[]) {
38 PUT_ERR(
"wrong number of arguments\n");
46 PUT_ERR(
"invalid argument (has to be either \"src\" or \"tgt\")\n");
52 xt_initialize(MPI_COMM_WORLD);
54 int comm_rank, comm_size;
55 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
56 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
57 MPI_Barrier(MPI_COMM_WORLD);
60 PUT_ERR(
"ERROR: wrong number of processes");
68 int comp_flag = comm_rank < 2;
71 MPI_Comm_split(MPI_COMM_WORLD, comp_flag, 0, &
split_comm);
73 if (comp_flag) utest_submain_1(
split_comm, reorder_type);
74 else utest_submain_2(
split_comm, reorder_type);
126static void utest_submain_2(
129 char const local_grid_name[] =
"grid2";
130 char const remote_grid_name[] =
"grid1";
133 MPI_Comm_rank(comp_comm, &my_rank);
137 double edge_coordinates_x[] = {
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,0.0,1.25,1.0,2.25,2.0,3.25,3.0,4.0,
142 0.25,1.25,2.25,3.25};
143 double edge_coordinates_y[] = {
144 0.0,0.25,0.0,0.25,0.0,0.25,0.0,0.25,0.25,
145 1.0,1.25,1.0,1.25,1.0,1.25,1.0,1.25,1.25,
146 2.0,2.25,2.0,2.25,2.0,2.25,2.0,2.25,2.25,
147 3.0,3.25,3.0,3.25,3.0,3.25,3.0,3.25,3.25,
149 double edge_coords[40][3];
151 size_t local_start[2][2] = {{0,0},{2,0}};
152 size_t local_count[2][2] = {{2,4},{2,4}};
156 for (
size_t i = 0;
i < 40; ++
i)
157 LLtoXYZ_deg(edge_coordinates_x[i], edge_coordinates_y[i], edge_coords[i]);
160 utest_generate_basic_grid_data_reg2d(
162 local_start[my_rank], local_count[my_rank],
with_halo);
171 yac_int masked_corner_ids[] = {10,11,12,15,16,17};
172 size_t num_masked_corners =
173 sizeof(masked_corner_ids)/
sizeof(masked_corner_ids[0]);
175 int * corner_mask =
xmalloc(num_vertices *
sizeof(*corner_mask));
176 for (
size_t i = 0;
i < num_vertices; ++
i) {
178 for (
size_t j = 0; j < num_masked_corners; ++j)
179 if (
grid_data.vertex_ids[i] == masked_corner_ids[j]) corner_mask[
i] = 0;
182 yac_int masked_edge_ids[] = {18,19,20,21,23,27,29};
183 size_t num_masked_edges =
184 sizeof(masked_edge_ids)/
sizeof(masked_edge_ids[0]);
187 for (
size_t i = 0;
i < num_edges; ++
i) {
189 for (
size_t j = 0; j < num_masked_edges; ++j)
194 xmalloc(num_edges *
sizeof(*edge_field_coords));
195 for (
size_t i = 0;
i < num_edges; ++
i)
196 memcpy(edge_field_coords[i], edge_coords[
grid_data.edge_ids[i]],
213 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
215 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
243 weights_out, reorder_type, 1,
247 weights_in, reorder_type, 1,
257 double * source_data_field =
258 xmalloc(num_vertices *
sizeof(*source_data_field));
259 double * source_data_pointset[1] = {source_data_field};
260 double ** source_data[1] = {source_data_pointset};
261 for (
size_t i = 0;
i < num_vertices; ++
i)
262 source_data_field[i] =
264 ((double)(
grid_data.vertex_ids[i])):(-1.0);
267 double * target_data_field =
268 xmalloc(num_vertices *
sizeof(*target_data_field));
269 double * target_data[1] = {target_data_field};
270 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
279 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
282 1338, 13, 14, 15, 16,
283 1338, 18, 19, 20, 21};
285 for (
size_t i = 0;
i < num_vertices; ++
i) {
287 if (utest_double_are_unequal(
289 ref_global_target_data[
grid_data.vertex_ids[i]]))
290 PUT_ERR(
"error in interpolated data on target side\n");
292 if (target_data[0][i] != -1.0)
293 PUT_ERR(
"error in interpolated data on target side\n");
301 free(target_data_field);
302 free(source_data_field);
315 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
317 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
345 weights_out, reorder_type, 1,
349 weights_in, reorder_type, 1,
359 double * source_data_field =
360 xmalloc(num_vertices *
sizeof(*source_data_field));
361 double * source_data_pointset[1] = {source_data_field};
362 double ** source_data[1] = {source_data_pointset};
363 for (
size_t i = 0;
i < num_vertices; ++
i)
364 source_data_field[i] =
366 ((double)(
grid_data.vertex_ids[i])):(-1.0);
369 double * target_data_field =
370 xmalloc(num_vertices *
sizeof(*target_data_field));
371 double * target_data[1] = {target_data_field};
372 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
381 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
382 1338, 3,1338,1338,1338,
383 1338, 8,1338,1338,1338,
384 1338, 13,1338,1338,1338,
385 1338, 18, 19, 20, 21};
387 for (
size_t i = 0;
i < num_vertices; ++
i) {
389 if (utest_double_are_unequal(
391 ref_global_target_data[
grid_data.vertex_ids[i]]))
392 PUT_ERR(
"error in interpolated data on target side\n");
394 if (target_data[0][i] != -1.0)
395 PUT_ERR(
"error in interpolated data on target side\n");
403 free(target_data_field);
404 free(source_data_field);
417 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
419 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
447 weights_out, reorder_type, 1,
451 weights_in, reorder_type, 1,
461 double * source_data_field =
462 xmalloc(num_vertices *
sizeof(*source_data_field));
463 double * source_data_pointset[1] = {source_data_field};
464 double ** source_data[1] = {source_data_pointset};
465 for (
size_t i = 0;
i < num_vertices; ++
i)
466 source_data_field[i] =
468 ((double)(
grid_data.vertex_ids[i])):(-1.0);
471 double * target_data_field =
472 xmalloc(num_vertices *
sizeof(*target_data_field));
473 double * target_data[1] = {target_data_field};
474 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
483 double ref_global_target_data[] = {1338,1338, 1338,1338,1338,
484 1338, 3, 3, 2.5, 3.5,
485 1338, 8, 8.5,1338,1338,
486 1338, 13,44.0/3.0,17.5,18.5,
487 1338, 18, 19, 20, 21};
489 for (
size_t i = 0;
i < num_vertices; ++
i) {
491 if (fabs(target_data[0][i] -
492 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
493 PUT_ERR(
"error in interpolated data on target side\n");
495 if (target_data[0][i] != -1.0)
496 PUT_ERR(
"error in interpolated data on target side\n");
504 free(target_data_field);
505 free(source_data_field);
522 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
524 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
528 num_src_fields, src_fields, tgt_field);
534 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
536 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
540 num_src_fields, src_fields, tgt_field);
562 weights_out, reorder_type, 1,
566 weights_in, reorder_type, 1,
576 double * source_data_field =
577 xmalloc(num_vertices *
sizeof(*source_data_field));
578 double * source_data_pointset[1] = {source_data_field};
579 double ** source_data[1] = {source_data_pointset};
580 for (
size_t i = 0;
i < num_vertices; ++
i)
581 source_data_field[i] =
583 ((double)(
grid_data.vertex_ids[i])):(-1.0);
586 double * target_data_field =
587 xmalloc(num_vertices *
sizeof(*target_data_field));
588 double * target_data[1] = {target_data_field};
589 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
598 double ref_global_target_data[] = {1338,1338,1338,1338,1338,
599 1338, 3, 3, 2.5, 3.5,
600 -1, -1, -1,1338,1338,
601 -1, -1, -1,17.5,18.5,
602 1338, 18, 19, 20, 21};
604 for (
size_t i = 0;
i < num_vertices; ++
i) {
605 if ((
grid_data.core_vertex_mask[i]) && corner_mask[i]) {
606 if (fabs(target_data[0][i] -
607 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
608 PUT_ERR(
"error in interpolated data on target side\n");
610 if (target_data[0][i] != -1.0)
611 PUT_ERR(
"error in interpolated data on target side\n");
619 free(target_data_field);
620 free(source_data_field);
636 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
638 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
641 num_src_fields, src_fields, tgt_field);
646 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
648 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
651 num_src_fields, src_fields, tgt_field);
673 weights_out, reorder_type, 1,
677 weights_in, reorder_type, 1,
687 double * source_data_field =
688 xmalloc(num_vertices *
sizeof(*source_data_field));
689 double * source_data_pointset[1] = {source_data_field};
690 double ** source_data[1] = {source_data_pointset};
691 for (
size_t i = 0;
i < num_vertices; ++
i)
692 source_data_field[i] =
694 ((double)(
grid_data.vertex_ids[i])):(-1.0);
697 double * target_data_field =
698 xmalloc(num_edges *
sizeof(*target_data_field));
699 double * target_data[1] = {target_data_field};
700 for (
size_t i = 0;
i < num_edges; ++
i) target_data_field[i] = -1.0;
709 double ref_global_target_data[] = {
710 1338,1338,1338,1338, 1338, 1338,1338,1338,1338,
711 1338,1338, 3, 3, 3, 3, 2.5, 2.5, 3.5,
712 -1, -1, -1, -1, 8.5, -1,1338,1338,1338,
713 -1,1338, -1, 13,44.0/3.0,44.0/3.0,17.5,17.5,18.5,
716 for (
size_t i = 0;
i < num_edges; ++
i) {
717 if ((
grid_data.core_edge_mask[i]) && edge_mask[i]) {
718 if (fabs(target_data[0][i] -
719 ref_global_target_data[
grid_data.edge_ids[i]]) > 1e-9)
720 PUT_ERR(
"error in interpolated data on target side\n");
722 if (target_data[0][i] != -1.0)
723 PUT_ERR(
"error in interpolated data on target side\n");
731 free(target_data_field);
732 free(source_data_field);
747 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
749 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
752 num_src_fields, src_fields, tgt_field);
765 double frac_mask_value = -1337.0;
769 weights, reorder_type, 1, frac_mask_value, 1.0, 0.0, NULL, 1, 1);
773 double * target_data_field =
774 xmalloc(num_edges *
sizeof(*target_data_field));
775 double * target_data[1] = {target_data_field};
777 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx) {
783 for (
size_t i = 0;
i < num_edges; ++
i) target_data_field[i] = -1.0;
791 double ref_global_target_data[] = {
792 1337,1337,1337,1337, 1337, 1337,1337,1337,1337,
793 1337,1337, 3, 3, 3, 3, 2.5, 2.5, 3.5,
794 -1, -1, -1, -1, 8.5, -1,1337,1337,1337,
795 -1,1337, -1, 13,44.0/3.0,44.0/3.0,17.5,17.5,18.5,
798 for (
size_t i = 0;
i < num_edges; ++
i) {
799 if ((
grid_data.core_edge_mask[i]) && edge_mask[i]) {
800 if (fabs(target_data[0][i] -
801 ref_global_target_data[
grid_data.edge_ids[i]]) > 1e-9)
802 PUT_ERR(
"error in interpolated data on target side\n");
804 if (target_data[0][i] != -1.0)
805 PUT_ERR(
"error in interpolated data on target side\n");
814 free(target_data_field);
815 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx)
873static void utest_submain_1(
876 char const local_grid_name[] =
"grid1";
877 char const remote_grid_name[] =
"grid2";
880 MPI_Comm_rank(comp_comm, &my_rank);
882 double vertex_coordinates_x[] = {0.5, 1.5, 2.5, 3.5, 4.5};
883 double vertex_coordinates_y[] = {0.5, 1.5, 2.5, 3.5, 4.5};
887 size_t const num_global_cells[2] = {4,4};
888 size_t local_start[2][2] = {{0,0},{0,2}};
889 size_t local_count[2][2] = {{4,2},{4,2}};
891 for (
size_t i = 0;
i <= num_global_cells[0]; ++
i)
892 vertex_coordinates_x[i] *=
YAC_RAD;
893 for (
size_t i = 0;
i <= num_global_cells[1]; ++
i)
894 vertex_coordinates_y[i] *=
YAC_RAD;
895 for (
size_t i = 0, k = 0;
i < num_global_cells[1]; ++
i)
896 for (
size_t j = 0; j < num_global_cells[0]; ++j, ++k)
900 utest_generate_basic_grid_data_reg2d(
901 vertex_coordinates_x, vertex_coordinates_y, num_global_cells,
902 local_start[my_rank], local_count[my_rank],
with_halo);
911 yac_int masked_corner_ids[] = {7,8,9,12,13,14};
912 size_t num_masked_corners =
913 sizeof(masked_corner_ids)/
sizeof(masked_corner_ids[0]);
915 int * corner_mask =
xmalloc(num_vertices *
sizeof(*corner_mask));
916 for (
size_t i = 0;
i < num_vertices; ++
i) {
918 for (
size_t j = 0; j < num_masked_corners; ++j)
919 if (
grid_data.vertex_ids[i] == masked_corner_ids[j]) corner_mask[
i] = 0;
922 yac_int masked_cell_ids[] = {6,7};
923 size_t num_masked_cells =
924 sizeof(masked_cell_ids)/
sizeof(masked_cell_ids[0]);
929 for (
size_t j = 0; j < num_masked_cells; ++j)
953 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
955 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
983 weights_in, reorder_type, 1,
987 weights_out, reorder_type, 1,
997 double * source_data_field =
998 xmalloc(num_vertices *
sizeof(*source_data_field));
999 double * source_data_pointset[1] = {source_data_field};
1000 double ** source_data[1] = {source_data_pointset};
1001 for (
size_t i = 0;
i < num_vertices; ++
i)
1002 source_data_field[i] =
1004 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1007 double * target_data_field =
1008 xmalloc(num_vertices *
sizeof(*target_data_field));
1009 double * target_data[1] = {target_data_field};
1010 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1019 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1021 13, 14, 15, 16,1337,
1022 18, 19, 20, 21,1337,
1023 1337,1337,1337,1337,1337};
1025 for (
size_t i = 0;
i < num_vertices; ++
i) {
1027 if (utest_double_are_unequal(
1029 ref_global_target_data[
grid_data.vertex_ids[i]]))
1030 PUT_ERR(
"error in interpolated data on target side\n");
1032 if (target_data[0][i] != -1.0)
1033 PUT_ERR(
"error in interpolated data on target side\n");
1041 free(target_data_field);
1042 free(source_data_field);
1055 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1057 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1085 weights_in, reorder_type, 1,
1089 weights_out, reorder_type, 1,
1099 double * source_data_field =
1100 xmalloc(num_vertices *
sizeof(*source_data_field));
1101 double * source_data_pointset[1] = {source_data_field};
1102 double ** source_data[1] = {source_data_pointset};
1103 for (
size_t i = 0;
i < num_vertices; ++
i)
1104 source_data_field[i] =
1106 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1109 double * target_data_field =
1110 xmalloc(num_vertices *
sizeof(*target_data_field));
1111 double * target_data[1] = {target_data_field};
1112 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1121 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1122 1337,1337,1337, 11,1337,
1123 1337,1337,1337, 16,1337,
1124 1337,1337,1337, 21,1337,
1125 1337,1337,1337,1337,1337};
1127 for (
size_t i = 0;
i < num_vertices; ++
i) {
1129 if (utest_double_are_unequal(
1131 ref_global_target_data[
grid_data.vertex_ids[i]]))
1132 PUT_ERR(
"error in interpolated data on target side\n");
1134 if (target_data[0][i] != -1.0)
1135 PUT_ERR(
"error in interpolated data on target side\n");
1143 free(target_data_field);
1144 free(source_data_field);
1157 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1159 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1187 weights_in, reorder_type, 1,
1191 weights_out, reorder_type, 1,
1201 double * source_data_field =
1202 xmalloc(num_vertices *
sizeof(*source_data_field));
1203 double * source_data_pointset[1] = {source_data_field};
1204 double ** source_data[1] = {source_data_pointset};
1205 for (
size_t i = 0;
i < num_vertices; ++
i)
1206 source_data_field[i] =
1208 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1211 double * target_data_field =
1212 xmalloc(num_vertices *
sizeof(*target_data_field));
1213 double * target_data[1] = {target_data_field};
1214 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1223 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1224 5.5, 6.5,28.0/3.0, 11,1337,
1225 1337,1337, 15.5, 16,1337,
1226 20.5,21.5, 21, 21,1337,
1227 1337,1337, 1337,1337,1337};
1229 for (
size_t i = 0;
i < num_vertices; ++
i) {
1231 if (fabs(target_data[0][i] -
1232 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
1233 PUT_ERR(
"error in interpolated data on target side\n");
1235 if (target_data[0][i] != -1.0)
1236 PUT_ERR(
"error in interpolated data on target side\n");
1244 free(target_data_field);
1245 free(source_data_field);
1262 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1264 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1268 num_src_fields, src_fields, tgt_field);
1274 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1276 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1280 num_src_fields, src_fields, tgt_field);
1302 weights_in, reorder_type, 1,
1306 weights_out, reorder_type, 1,
1316 double * source_data_field =
1317 xmalloc(num_vertices *
sizeof(*source_data_field));
1318 double * source_data_pointset[1] = {source_data_field};
1319 double ** source_data[1] = {source_data_pointset};
1320 for (
size_t i = 0;
i < num_vertices; ++
i)
1321 source_data_field[i] =
1323 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1326 double * target_data_field =
1327 xmalloc(num_vertices *
sizeof(*target_data_field));
1328 double * target_data[1] = {target_data_field};
1329 for (
size_t i = 0;
i < num_vertices; ++
i) target_data_field[i] = -1.0;
1338 double ref_global_target_data[] = { 3, 4, 5, 6,1337,
1339 5.5, 6.5, -1, -1, -1,
1340 1337,1337, -1, -1, -1,
1341 20.5,21.5, 21, 21,1337,
1342 1337,1337,1337,1337,1337};
1344 for (
size_t i = 0;
i < num_vertices; ++
i) {
1345 if ((
grid_data.core_vertex_mask[i]) && corner_mask[i]) {
1346 if (fabs(target_data[0][i] -
1347 ref_global_target_data[
grid_data.vertex_ids[i]]) > 1e-9)
1348 PUT_ERR(
"error in interpolated data on target side\n");
1350 if (target_data[0][i] != -1.0)
1351 PUT_ERR(
"error in interpolated data on target side\n");
1359 free(target_data_field);
1360 free(source_data_field);
1376 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1378 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1381 num_src_fields, src_fields, tgt_field);
1386 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1388 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
1391 num_src_fields, src_fields, tgt_field);
1413 weights_in, reorder_type, 1,
1417 weights_out, reorder_type, 1,
1427 double * source_data_field =
1428 xmalloc(num_vertices *
sizeof(*source_data_field));
1429 double * source_data_pointset[1] = {source_data_field};
1430 double ** source_data[1] = {source_data_pointset};
1431 for (
size_t i = 0;
i < num_vertices; ++
i)
1432 source_data_field[i] =
1434 ((double)(
grid_data.vertex_ids[i])):(-1.0);
1437 double * target_data_field =
1439 double * target_data[1] = {target_data_field};
1440 for (
size_t i = 0;
i <
num_cells; ++
i) target_data_field[i] = -1.0;
1449 double ref_global_target_data[] = { 3, 4, 5, 6,
1456 if (fabs(target_data[0][i] -
1457 ref_global_target_data[
grid_data.cell_ids[i]]) > 1e-9)
1458 PUT_ERR(
"error in interpolated data on target side\n");
1460 if (target_data[0][i] != -1.0)
1461 PUT_ERR(
"error in interpolated data on target side\n");
1469 free(target_data_field);
1470 free(source_data_field);
1485 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1487 {.location =
YAC_LOC_EDGE, .coordinates_idx = 0, .masks_idx = 0};
1490 num_src_fields, src_fields, tgt_field);
1503 double frac_mask_value = -1337.0;
1507 weights, reorder_type, 1, frac_mask_value, 1.0, 0.0, NULL, 1, 1);
1518 double * source_data_field =
1519 xmalloc(num_vertices *
sizeof(*source_data_field));
1520 double * source_data_pointset[1] = {source_data_field};
1521 double ** source_data[1] = {source_data_pointset};
1522 double * source_frac_mask_data =
1523 xmalloc(num_vertices *
sizeof(*source_frac_mask_data));
1524 double * source_frac_mask_pointset[1] = {source_frac_mask_data};
1525 double ** source_frac_mask[1] = {source_frac_mask_pointset};
1526 for (
size_t i = 0;
i < num_vertices; ++
i) source_frac_mask_data[i] = 0.5;
1527 for (
size_t i = 0;
i < num_vertices; ++
i)
1528 source_data_field[i] =
1530 ((double)(
grid_data.vertex_ids[i])*source_frac_mask_data[
i]):(-1.0);
1532 for (
int interp_idx = 0; interp_idx < 2; ++interp_idx)
1540 free(source_frac_mask_data);
1541 free(source_data_field);
1542 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)
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)
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_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[]
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]