30static char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
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");
52 MPI_COMM_WORLD, comm_rank < 2, 0, &
split_comm);
54 int split_comm_rank, split_comm_size;
78 int is_tgt = split_comm_size == 1;
79 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5}};
81 size_t const num_cells[2][2] = {{3,2}, {2,2}};
82 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
83 size_t local_count[2][2][2] = {{{2,2},{2,2}}, {{2,2}}};
93 local_start[is_tgt][split_comm_rank],
94 local_count[is_tgt][split_comm_rank],
with_halo);
105 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
107 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
113 for (
int partial_coverage = 0; partial_coverage <= 1; ++partial_coverage) {
135 double * ref_tgt_field = NULL;
136 double ref_global_tgt_field[9] =
137 {2.5, 3.5, 4.5, 6.5, 7.5, 8.5, -1, -1, -1};
142 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
143 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
146 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
147 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
153 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
154 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
155 PUT_ERR(
"wrong interpolation result");
205 int is_tgt = split_comm_size == 1;
206 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5}};
208 size_t const num_cells[2][2] = {{3,2}, {2,2}};
209 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
210 size_t local_count[2][2][2] = {{{2,2},{2,2}}, {{2,2}}};
211 int global_src_mask[12] = {1, 1, 1, 0,
223 local_start[is_tgt][split_comm_rank],
224 local_count[is_tgt][split_comm_rank],
with_halo);
232 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
233 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
240 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
241 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
243 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
268 double * ref_tgt_field = NULL;
269 double ref_global_tgt_field[9] =
270 {2.5, 3.5, -1, -1, 7.5, 8.5, -1, -1, -1};
275 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
276 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
279 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
280 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
286 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
287 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
288 PUT_ERR(
"wrong interpolation result");
344 int is_tgt = split_comm_size == 1;
345 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
346 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
347 size_t const num_cells[2][2] = {{3,3}, {3,3}};
348 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
349 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
350 int global_src_mask[16] = {0, 1, 1, 0,
363 local_start[is_tgt][split_comm_rank],
364 local_count[is_tgt][split_comm_rank],
with_halo);
373 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
374 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
382 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
383 for (
int i = 0, k = 0;
i < 3; ++
i)
384 for (
int j = 0; j < 3; ++j, ++k)
387 tgt_cell_coordinates[k]);
395 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
396 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
398 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
423 double * ref_tgt_field = NULL;
424 double ref_global_tgt_field[9] =
426 0.14963* 1.0 + 0.20075*( 2.0+ 5.0) + 0.44888* 6.0,
428 0.14963* 4.0 + 0.20075*( 5.0+ 8.0) + 0.44888* 9.0,
429 0.14963* 5.0 + 0.20075*( 6.0+ 9.0) + 0.44888*10.0,
430 0.14963* 6.0 + 0.20075*( 7.0+10.0) + 0.44888*11.0,
432 0.14963* 9.0 + 0.20075*(10.0+13.0) + 0.44888*14.0,
438 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
439 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
442 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
443 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
450 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
451 PUT_ERR(
"wrong interpolation result");
507 int is_tgt = split_comm_size == 1;
508 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
509 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
510 size_t const num_cells[2][2] = {{3,3}, {3,3}};
511 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
512 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
513 int global_src_mask[16] = {0, 1, 0, 0,
526 local_start[is_tgt][split_comm_rank],
527 local_count[is_tgt][split_comm_rank],
with_halo);
536 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
537 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
545 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
546 for (
int i = 0, k = 0;
i < 3; ++
i)
547 for (
int j = 0; j < 3; ++j, ++k)
550 tgt_cell_coordinates[k]);
558 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
559 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
561 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
586 double * ref_tgt_field = NULL;
587 double inv_dist_a = sqrt(8.0);
588 double inv_dist_b = sqrt(8.0/5.0);
589 double inv_dist_c = sqrt(8.0/9.0);
590 double ref_global_tgt_field[9] =
591 {(inv_dist_b*( 1.0+ 4.0) + inv_dist_a* 5.0)/(inv_dist_a + 2.0 * inv_dist_b),
592 (inv_dist_c* 1.0 + inv_dist_b* 5.0)/(inv_dist_b + inv_dist_c),
594 (inv_dist_c* 4.0 + inv_dist_b*( 5.0+ 8.0))/(2.0 * inv_dist_b + inv_dist_c),
595 (inv_dist_c* 5.0 + inv_dist_a*10.0)/(inv_dist_a + inv_dist_c),
596 (inv_dist_b*10.0 + inv_dist_a*11.0)/(inv_dist_a + inv_dist_b),
597 (inv_dist_c* 8.0 + inv_dist_a*13.0)/(inv_dist_a + inv_dist_c),
598 (inv_dist_b*(10.0+13.0) + inv_dist_a*14.0)/(inv_dist_a + 2.0 * inv_dist_b),
599 (inv_dist_c*10.0 + inv_dist_b*(11.0+14.0))/(2.0 * inv_dist_b + inv_dist_c)};
604 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
605 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
608 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
609 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
616 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
617 PUT_ERR(
"wrong interpolation result");
659 int is_tgt = split_comm_size == 1;
660 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
661 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
662 size_t const num_cells[2][2] = {{3,3}, {3,3}};
663 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
664 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
674 local_start[is_tgt][split_comm_rank],
675 local_count[is_tgt][split_comm_rank],
with_halo);
685 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
686 for (
int i = 0, k = 0;
i < 3; ++
i)
687 for (
int j = 0; j < 3; ++j, ++k)
690 tgt_cell_coordinates[k]);
698 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
699 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
701 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
726 double * ref_tgt_field = NULL;
727 double ref_global_tgt_field[9] =
728 {5.0, 6.0, 7.0, 9.0, 10.0, 11.0, 13.0, 14.0, 15.0};
733 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
734 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
737 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
738 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
745 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
746 PUT_ERR(
"wrong interpolation result");
802 int is_tgt = split_comm_size == 1;
806 size_t local_start[2][2][2] = {{{0,0},{0,4}}, {{0,0}}};
807 size_t local_count[2][2][2] = {{{7,4},{7,3}}, {{7,7}}};
817 local_start[is_tgt][split_comm_rank],
818 local_count[is_tgt][split_comm_rank],
with_halo);
826 src_point_coordinates =
829 double * middle_point = src_point_coordinates[
i];
830 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
831 size_t * curr_vertices =
834 for (
size_t j = 0; j < curr_num_vertices; ++j) {
835 double * curr_vertex_coord =
836 grid_data.vertex_coordinates[curr_vertices[j]];
837 for (
size_t k = 0; k < 3; ++k)
838 middle_point[k] += curr_vertex_coord[k];
848 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
849 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
851 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
876 double * ref_tgt_field = NULL;
877 double ref_global_tgt_field[64] =
878 {-4,-4,-4,-4,-4,-4,-4,-4,
879 -4, 0+ 1+ 7+ 8, 1+ 2+ 8+ 9, 2+ 3+ 9+10, 3+ 4+10+11, 4+ 5+11+12, 5+ 6+12+13,-4,
880 -4, 7+ 8+14+15, 8+ 9+15+16, 9+10+16+17,10+11+17+18,11+12+18+19,12+13+19+20,-4,
881 -4,14+15+21+22,15+16+22+23,16+17+23+24,17+18+24+25,18+19+25+26,19+20+26+27,-4,
882 -4,21+22+28+29,22+23+29+30,23+24+30+31,24+25+31+32,25+26+32+33,26+27+33+34,-4,
883 -4,28+29+35+36,29+30+36+37,30+31+37+38,31+32+38+39,32+33+39+40,33+34+40+41,-4,
884 -4,35+36+42+43,36+37+43+44,37+38+44+45,38+39+45+46,39+40+46+47,40+41+47+48,-4,
885 -4,-4,-4,-4,-4,-4,-4,-4};
887 i <
sizeof(ref_global_tgt_field) /
sizeof(ref_global_tgt_field[0]);
889 ref_global_tgt_field[i] /= 4.0;
894 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
895 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
899 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
905 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
906 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
907 PUT_ERR(
"wrong interpolation result");
940 int is_tgt = split_comm_size == 1;
941 double src_coordinates_x[2][2] = {{-0.5,0.5}, {0.5,-0.5}};
942 double src_coordinates_y[2][2][2] =
943 {{{-0.5,0.5}, {0.5,-0.5}}, {{89,90}, {90,89}}};
944 double src_coordinates_x_unstruct[4];
945 double src_coordinates_y_unstruct[4];
946 size_t const src_num_cells[2] = {1,1};
947 size_t src_local_start[2] = {0,0};
948 size_t src_local_count[2] = {1,1};
949 int src_cell_mask[4] = {1,1, 0,1};
951 {{{0,1,2,3},{2,3,0,1}},{{1,0,3,2},{3,2,1,0}}};
952 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
953 double tgt_coordinates_y[2][5] =
954 {{-0.5,-0.25,0.0,0.25,0.5}, {89.00,89.25,89.50,89.75,90.00}};
955 size_t const tgt_num_cells[2] = {4,4};
956 size_t tgt_local_start[2] = {0,0};
957 size_t tgt_local_count[2] = {4,4};
959 for (
size_t i = 0;
i < 2 * 2; ++
i)
960 (&(src_coordinates_x[0][0]))[
i] *=
YAC_RAD;
961 for (
size_t i = 0;
i < 2 * 2 * 2; ++
i)
962 (&(src_coordinates_y[0][0][0]))[
i] *=
YAC_RAD;
963 for (
size_t i = 0;
i < 5; ++
i) tgt_coordinates_x[i] *=
YAC_RAD;
964 for (
size_t i = 0;
i < 2 * 5; ++
i)
965 (&(tgt_coordinates_y[0][0]))[
i] *=
YAC_RAD;
967 for (
int partial_coverage = 0; partial_coverage < 2; ++partial_coverage) {
968 for (
int is_reg = 0; is_reg < 2; ++is_reg) {
969 for (
int at_pole = 0; at_pole <= is_reg; ++at_pole) {
970 for (
int with_mask = 0; with_mask < 2; ++with_mask) {
971 for (
int order_x = 0; order_x < 2; ++order_x) {
972 for (
int order_y = 0; order_y < 2; ++order_y) {
979 tgt_coordinates_x, tgt_coordinates_y[at_pole],
980 tgt_num_cells, tgt_local_start, tgt_local_count, 0);
985 src_coordinates_x[order_x],
986 src_coordinates_y[at_pole][order_y], src_num_cells,
987 src_local_start, src_local_count, 0);
989 for (
int i = 0;
i < 4; ++
i) {
990 src_coordinates_x_unstruct[
i] =
991 src_coordinates_x[order_x][
i&1];
992 src_coordinates_y_unstruct[
i] =
993 src_coordinates_y[at_pole][order_y][
i>>1];
998 src_coordinates_x_unstruct,
999 src_coordinates_y_unstruct, (
int[]){0,1,3,2});
1007 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1016 if (with_mask && !is_tgt) {
1018 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1020 src_cell_mask[src_reorder[order_x][order_y][i]];
1029 .masks_idx = (with_mask)?0:SIZE_MAX}};
1030 size_t num_src_fields =
1031 sizeof(src_fields) /
sizeof(src_fields[0]);
1034 .masks_idx = SIZE_MAX};
1060 double * ref_tgt_field = NULL;
1061 double ref_global_tgt_field[25];
1063 {{{{{1.00, 0.00, 0.00, 0.00},
1064 {0.75, 0.25, 0.00, 0.00},
1065 {0.50, 0.50, 0.00, 0.00},
1066 {0.25, 0.75, 0.00, 0.00},
1067 {0.00, 1.00, 0.00, 0.00},
1068 {0.75, 0.00, 0.25, 0.00},
1069 {0.75, 0.00, 0.00, 0.25},
1070 {0.50, 0.25, 0.00, 0.25},
1071 {0.25, 0.50, 0.00, 0.25},
1072 {0.00, 0.75, 0.00, 0.25},
1073 {0.50, 0.00, 0.50, 0.00},
1074 {0.50, 0.00, 0.25, 0.25},
1075 {0.50, 0.00, 0.00, 0.50},
1076 {0.25, 0.25, 0.00, 0.50},
1077 {0.00, 0.50, 0.00, 0.50},
1078 {0.25, 0.00, 0.75, 0.00},
1079 {0.25, 0.00, 0.50, 0.25},
1080 {0.25, 0.00, 0.25, 0.50},
1081 {0.25, 0.00, 0.00, 0.75},
1082 {0.00, 0.25, 0.00, 0.75},
1083 {0.00, 0.00, 1.00, 0.00},
1084 {0.00, 0.00, 0.75, 0.25},
1085 {0.00, 0.00, 0.50, 0.50},
1086 {0.00, 0.00, 0.25, 0.75},
1087 {0.00, 0.00, 0.00, 1.00}},
1088 {{1.00, 0.00, 0.00, 0.00},
1089 {0.75, 0.25, 0.00, 0.00},
1090 {0.50, 0.50, 0.00, 0.00},
1091 {0.25, 0.75, 0.00, 0.00},
1092 {0.00, 1.00, 0.00, 0.00},
1093 {0.00, 0.00, 0.00, 0.00},
1094 {0.75, 0.00, 0.00, 0.25},
1095 {0.50, 0.25, 0.00, 0.25},
1096 {0.25, 0.50, 0.00, 0.25},
1097 {0.00, 0.75, 0.00, 0.25},
1098 {0.00, 0.00, 0.00, 0.00},
1099 {0.00, 0.00, 0.00, 0.00},
1100 {0.50, 0.00, 0.00, 0.50},
1101 {0.25, 0.25, 0.00, 0.50},
1102 {0.00, 0.50, 0.00, 0.50},
1103 {0.00, 0.00, 0.00, 0.00},
1104 {0.00, 0.00, 0.00, 0.00},
1105 {0.00, 0.00, 0.00, 0.00},
1106 {0.25, 0.00, 0.00, 0.75},
1107 {0.00, 0.25, 0.00, 0.75},
1108 {0.00, 0.00, 0.00, 0.00},
1109 {0.00, 0.00, 0.00, 0.00},
1110 {0.00, 0.00, 0.00, 0.00},
1111 {0.00, 0.00, 0.00, 0.00},
1112 {0.00, 0.00, 0.00, 1.00}}},
1113 {{{1.00, 0.00, 0.00, 0.00},
1114 {0.75, 0.25, 0.00, 0.00},
1115 {0.50, 0.50, 0.00, 0.00},
1116 {0.25, 0.75, 0.00, 0.00},
1117 {0.00, 1.00, 0.00, 0.00},
1118 {0.75, 0.00, 0.25, 0.00},
1119 {0.75, 0.00, 0.00, 0.25},
1120 {0.50, 0.25, 0.00, 0.25},
1121 {0.25, 0.50, 0.00, 0.25},
1122 {0.00, 0.75, 0.00, 0.25},
1123 {0.50, 0.00, 0.50, 0.00},
1124 {0.50, 0.00, 0.25, 0.25},
1125 {0.50, 0.00, 0.00, 0.50},
1126 {0.25, 0.25, 0.00, 0.50},
1127 {0.00, 0.50, 0.00, 0.50},
1128 {0.25, 0.00, 0.75, 0.00},
1129 {0.25, 0.00, 0.50, 0.25},
1130 {0.25, 0.00, 0.25, 0.50},
1131 {0.25, 0.00, 0.00, 0.75},
1132 {0.00, 0.25, 0.00, 0.75},
1133 {0.00, 0.00, 1.00, 0.00},
1134 {0.00, 0.00, 0.75, 0.25},
1135 {0.00, 0.00, 0.50, 0.50},
1136 {0.00, 0.00, 0.25, 0.75},
1137 {0.00, 0.00, 0.00, 1.00}},
1138 {{1.00, 0.00, 0.00, 0.00},
1139 {0.75, 0.25, 0.00, 0.00},
1140 {0.50, 0.50, 0.00, 0.00},
1141 {0.25, 0.75, 0.00, 0.00},
1142 {0.00, 1.00, 0.00, 0.00},
1143 {1.00, 0.00, 0.00, 0.00},
1144 {0.75, 0.00, 0.00, 0.25},
1145 {0.50, 0.25, 0.00, 0.25},
1146 {0.25, 0.50, 0.00, 0.25},
1147 {0.00, 0.75, 0.00, 0.25},
1148 {1.00, 0.00, 0.00, 0.00},
1149 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1150 {0.50, 0.00, 0.00, 0.50},
1151 {0.25, 0.25, 0.00, 0.50},
1152 {0.00, 0.50, 0.00, 0.50},
1153 {1.00, 0.00, 0.00, 0.00},
1154 {0.50, 0.00, 0.00, 0.50},
1155 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1156 {0.25, 0.00, 0.00, 0.75},
1157 {0.00, 0.25, 0.00, 0.75},
1158 {0.00, 0.00, 0.00, 0.00},
1159 {0.00, 0.00, 0.00, 1.00},
1160 {0.00, 0.00, 0.00, 1.00},
1161 {0.00, 0.00, 0.00, 1.00},
1162 {0.00, 0.00, 0.00, 1.00}}}},
1163 {{{{1.00, 0.00, 0.00, 0.00},
1164 {0.75, 0.25, 0.00, 0.00},
1165 {0.50, 0.50, 0.00, 0.00},
1166 {0.25, 0.75, 0.00, 0.00},
1167 {0.00, 1.00, 0.00, 0.00},
1168 {0.75, 0.00, 0.25, 0.00},
1169 {0.75, 0.00, 0.00, 0.25},
1170 {0.50, 0.25, 0.00, 0.25},
1171 {0.25, 0.50, 0.00, 0.25},
1172 {0.00, 0.75, 0.00, 0.25},
1173 {0.50, 0.00, 0.50, 0.00},
1174 {0.50, 0.00, 0.25, 0.25},
1175 {0.50, 0.00, 0.00, 0.50},
1176 {0.25, 0.25, 0.00, 0.50},
1177 {0.00, 0.50, 0.00, 0.50},
1178 {0.25, 0.00, 0.75, 0.00},
1179 {0.25, 0.00, 0.50, 0.25},
1180 {0.25, 0.00, 0.25, 0.50},
1181 {0.25, 0.00, 0.00, 0.75},
1182 {0.00, 0.25, 0.00, 0.75},
1183 {0.00, 0.00, 0.50, 0.50},
1184 {0.00, 0.00, 0.50, 0.50},
1185 {0.00, 0.00, 0.50, 0.50},
1186 {0.00, 0.00, 0.50, 0.50},
1187 {0.00, 0.00, 0.50, 0.50}},
1188 {{1.00, 0.00, 0.00, 0.00},
1189 {0.75, 0.25, 0.00, 0.00},
1190 {0.50, 0.50, 0.00, 0.00},
1191 {0.25, 0.75, 0.00, 0.00},
1192 {0.00, 1.00, 0.00, 0.00},
1193 {0.00, 0.00, 0.00, 0.00},
1194 {0.75, 0.00, 0.00, 0.25},
1195 {0.50, 0.25, 0.00, 0.25},
1196 {0.25, 0.50, 0.00, 0.25},
1197 {0.00, 0.75, 0.00, 0.25},
1198 {0.00, 0.00, 0.00, 0.00},
1199 {0.00, 0.00, 0.00, 0.00},
1200 {0.50, 0.00, 0.00, 0.50},
1201 {0.25, 0.25, 0.00, 0.50},
1202 {0.00, 0.50, 0.00, 0.50},
1203 {0.00, 0.00, 0.00, 0.00},
1204 {0.00, 0.00, 0.00, 0.00},
1205 {0.00, 0.00, 0.00, 0.00},
1206 {0.25, 0.00, 0.00, 0.75},
1207 {0.00, 0.25, 0.00, 0.75},
1208 {0.00, 0.00, 0.00, 0.00},
1209 {0.00, 0.00, 0.00, 0.00},
1210 {0.00, 0.00, 0.00, 0.00},
1211 {0.00, 0.00, 0.00, 0.00},
1212 {0.00, 0.00, 0.00, 0.00}}},
1213 {{{1.00, 0.00, 0.00, 0.00},
1214 {0.75, 0.25, 0.00, 0.00},
1215 {0.50, 0.50, 0.00, 0.00},
1216 {0.25, 0.75, 0.00, 0.00},
1217 {0.00, 1.00, 0.00, 0.00},
1218 {0.75, 0.00, 0.25, 0.00},
1219 {0.75, 0.00, 0.00, 0.25},
1220 {0.50, 0.25, 0.00, 0.25},
1221 {0.25, 0.50, 0.00, 0.25},
1222 {0.00, 0.75, 0.00, 0.25},
1223 {0.50, 0.00, 0.50, 0.00},
1224 {0.50, 0.00, 0.25, 0.25},
1225 {0.50, 0.00, 0.00, 0.50},
1226 {0.25, 0.25, 0.00, 0.50},
1227 {0.00, 0.50, 0.00, 0.50},
1228 {0.25, 0.00, 0.75, 0.00},
1229 {0.25, 0.00, 0.50, 0.25},
1230 {0.25, 0.00, 0.25, 0.50},
1231 {0.25, 0.00, 0.00, 0.75},
1232 {0.00, 0.25, 0.00, 0.75},
1233 {0.00, 0.00, 0.50, 0.50},
1234 {0.00, 0.00, 0.50, 0.50},
1235 {0.00, 0.00, 0.50, 0.50},
1236 {0.00, 0.00, 0.50, 0.50},
1237 {0.00, 0.00, 0.50, 0.50}},
1238 {{1.00, 0.00, 0.00, 0.00},
1239 {0.75, 0.25, 0.00, 0.00},
1240 {0.50, 0.50, 0.00, 0.00},
1241 {0.25, 0.75, 0.00, 0.00},
1242 {0.00, 1.00, 0.00, 0.00},
1243 {1.00, 0.00, 0.00, 0.00},
1244 {0.75, 0.00, 0.00, 0.25},
1245 {0.50, 0.25, 0.00, 0.25},
1246 {0.25, 0.50, 0.00, 0.25},
1247 {0.00, 0.75, 0.00, 0.25},
1248 {1.00, 0.00, 0.00, 0.00},
1249 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1250 {0.50, 0.00, 0.00, 0.50},
1251 {0.25, 0.25, 0.00, 0.50},
1252 {0.00, 0.50, 0.00, 0.50},
1253 {1.00, 0.00, 0.00, 0.00},
1254 {0.50, 0.00, 0.00, 0.50},
1255 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1256 {0.25, 0.00, 0.00, 0.75},
1257 {0.00, 0.25, 0.00, 0.75},
1258 {0.00, 0.00, 0.00, 1.00},
1259 {0.00, 0.00, 0.00, 1.00},
1260 {0.00, 0.00, 0.00, 1.00},
1261 {0.00, 0.00, 0.00, 1.00},
1262 {0.00, 0.00, 0.00, 1.00}}}}};
1264 for (
size_t j = 0; j < 25; ++j) {
1265 ref_global_tgt_field[j] =
1266 (double)(src_reorder[order_x][order_y][0] + 1) *
1267 ref_weights[at_pole][partial_coverage][with_mask][j][0] +
1268 (double)(src_reorder[order_x][order_y][1] + 1) *
1269 ref_weights[at_pole][partial_coverage][with_mask][j][1] +
1270 (double)(src_reorder[order_x][order_y][2] + 1) *
1271 ref_weights[at_pole][partial_coverage][with_mask][j][2] +
1272 (double)(src_reorder[order_x][order_y][3] + 1) *
1273 ref_weights[at_pole][partial_coverage][with_mask][j][3];
1274 if (ref_global_tgt_field[j] == 0.0)
1275 ref_global_tgt_field[j] = -1.0;
1281 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1282 ref_tgt_field[i] = ref_global_tgt_field[i];
1285 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1286 src_field[i] = (
double)(
i) + 1.0;
1292 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1293 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1294 PUT_ERR(
"wrong interpolation result");
1298 free(ref_tgt_field);
1333 int is_tgt = split_comm_size == 1;
1334 size_t src_num_vertices = 4;
1335 size_t src_num_cells = 2;
1336 int src_num_vertices_per_cell[] = {3, 3};
1337 int src_cell_to_vertex[] = {0,1,3, 0,2,3};
1338 double src_coordinates_x[4] = {-0.5,0.5,-0.5,0.5};
1339 double src_coordinates_y[4] = {-0.5,-0.5,0.5,0.5};
1340 size_t tgt_num_vertices[2] = {5,5};
1341 int tgt_cyclic[2] = {0,0};
1342 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
1343 double tgt_coordinates_y[5] = {-0.5,-0.25,0.0,0.25,0.5};
1344 int src_cell_mask[4] = {1,1, 0,1};
1346 for (
int with_mask = 0; with_mask < 2; ++with_mask) {
1352 tgt_num_vertices, tgt_cyclic,
1353 tgt_coordinates_x, tgt_coordinates_y);
1357 src_num_vertices, src_num_cells, src_num_vertices_per_cell,
1358 src_coordinates_x, src_coordinates_y, src_cell_to_vertex);
1365 if (with_mask && !is_tgt) {
1367 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1368 mask[i] = src_cell_mask[i];
1377 .masks_idx = (with_mask)?0:SIZE_MAX}};
1378 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1381 .masks_idx = SIZE_MAX};
1387 for (
int partial_coverage = 0; partial_coverage < 2; ++partial_coverage) {
1408 double * ref_tgt_field = NULL;
1409 double ref_global_tgt_field[25];
1411 {{{{1.00, 0.00, 0.00, 0.00},
1412 {0.75, 0.25, 0.00, 0.00},
1413 {0.50, 0.50, 0.00, 0.00},
1414 {0.25, 0.75, 0.00, 0.00},
1415 {0.00, 1.00, 0.00, 0.00},
1416 {0.75, 0.00, 0.25, 0.00},
1417 {0.75, 0.00, 0.00, 0.25},
1418 {0.50, 0.25, 0.00, 0.25},
1419 {0.25, 0.50, 0.00, 0.25},
1420 {0.00, 0.75, 0.00, 0.25},
1421 {0.50, 0.00, 0.50, 0.00},
1422 {0.50, 0.00, 0.25, 0.25},
1423 {0.50, 0.00, 0.00, 0.50},
1424 {0.25, 0.25, 0.00, 0.50},
1425 {0.00, 0.50, 0.00, 0.50},
1426 {0.25, 0.00, 0.75, 0.00},
1427 {0.25, 0.00, 0.50, 0.25},
1428 {0.25, 0.00, 0.25, 0.50},
1429 {0.25, 0.00, 0.00, 0.75},
1430 {0.00, 0.25, 0.00, 0.75},
1431 {0.00, 0.00, 1.00, 0.00},
1432 {0.00, 0.00, 0.75, 0.25},
1433 {0.00, 0.00, 0.50, 0.50},
1434 {0.00, 0.00, 0.25, 0.75},
1435 {0.00, 0.00, 0.00, 1.00}},
1436 {{1.00, 0.00, 0.00, 0.00},
1437 {0.75, 0.25, 0.00, 0.00},
1438 {0.50, 0.50, 0.00, 0.00},
1439 {0.25, 0.75, 0.00, 0.00},
1440 {0.00, 1.00, 0.00, 0.00},
1441 {0.00, 0.00, 0.00, 0.00},
1442 {0.75, 0.00, 0.00, 0.25},
1443 {0.50, 0.25, 0.00, 0.25},
1444 {0.25, 0.50, 0.00, 0.25},
1445 {0.00, 0.75, 0.00, 0.25},
1446 {0.00, 0.00, 0.00, 0.00},
1447 {0.00, 0.00, 0.00, 0.00},
1448 {0.50, 0.00, 0.00, 0.50},
1449 {0.25, 0.25, 0.00, 0.50},
1450 {0.00, 0.50, 0.00, 0.50},
1451 {0.00, 0.00, 0.00, 0.00},
1452 {0.00, 0.00, 0.00, 0.00},
1453 {0.00, 0.00, 0.00, 0.00},
1454 {0.25, 0.00, 0.00, 0.75},
1455 {0.00, 0.25, 0.00, 0.75},
1456 {0.00, 0.00, 0.00, 0.00},
1457 {0.00, 0.00, 0.00, 0.00},
1458 {0.00, 0.00, 0.00, 0.00},
1459 {0.00, 0.00, 0.00, 0.00},
1460 {0.00, 0.00, 0.00, 1.00}}},
1461 {{{1.00, 0.00, 0.00, 0.00},
1462 {0.75, 0.25, 0.00, 0.00},
1463 {0.50, 0.50, 0.00, 0.00},
1464 {0.25, 0.75, 0.00, 0.00},
1465 {0.00, 1.00, 0.00, 0.00},
1466 {0.75, 0.00, 0.25, 0.00},
1467 {0.75, 0.00, 0.00, 0.25},
1468 {0.50, 0.25, 0.00, 0.25},
1469 {0.25, 0.50, 0.00, 0.25},
1470 {0.00, 0.75, 0.00, 0.25},
1471 {0.50, 0.00, 0.50, 0.00},
1472 {0.50, 0.00, 0.25, 0.25},
1473 {0.50, 0.00, 0.00, 0.50},
1474 {0.25, 0.25, 0.00, 0.50},
1475 {0.00, 0.50, 0.00, 0.50},
1476 {0.25, 0.00, 0.75, 0.00},
1477 {0.25, 0.00, 0.50, 0.25},
1478 {0.25, 0.00, 0.25, 0.50},
1479 {0.25, 0.00, 0.00, 0.75},
1480 {0.00, 0.25, 0.00, 0.75},
1481 {0.00, 0.00, 1.00, 0.00},
1482 {0.00, 0.00, 0.75, 0.25},
1483 {0.00, 0.00, 0.50, 0.50},
1484 {0.00, 0.00, 0.25, 0.75},
1485 {0.00, 0.00, 0.00, 1.00}},
1486 {{1.00, 0.00, 0.00, 0.00},
1487 {0.75, 0.25, 0.00, 0.00},
1488 {0.50, 0.50, 0.00, 0.00},
1489 {0.25, 0.75, 0.00, 0.00},
1490 {0.00, 1.00, 0.00, 0.00},
1491 {1.00, 0.00, 0.00, 0.00},
1492 {0.75, 0.00, 0.00, 0.25},
1493 {0.50, 0.25, 0.00, 0.25},
1494 {0.25, 0.50, 0.00, 0.25},
1495 {0.00, 0.75, 0.00, 0.25},
1496 {1.00, 0.00, 0.00, 0.00},
1497 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1498 {0.50, 0.00, 0.00, 0.50},
1499 {0.25, 0.25, 0.00, 0.50},
1500 {0.00, 0.50, 0.00, 0.50},
1501 {1.00, 0.00, 0.00, 0.00},
1502 {0.50, 0.00, 0.00, 0.50},
1503 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1504 {0.25, 0.00, 0.00, 0.75},
1505 {0.00, 0.25, 0.00, 0.75},
1506 {0.00, 0.00, 0.00, 0.00},
1507 {0.00, 0.00, 0.00, 1.00},
1508 {0.00, 0.00, 0.00, 1.00},
1509 {0.00, 0.00, 0.00, 1.00},
1510 {0.00, 0.00, 0.00, 1.00}}}};
1512 for (
size_t j = 0; j < 25; ++j) {
1513 ref_global_tgt_field[j] =
1514 1.0 *
ref_weights[partial_coverage][with_mask][j][0] +
1515 2.0 *
ref_weights[partial_coverage][with_mask][j][1] +
1516 3.0 *
ref_weights[partial_coverage][with_mask][j][2] +
1517 4.0 *
ref_weights[partial_coverage][with_mask][j][3];
1518 if (ref_global_tgt_field[j] == 0.0)
1519 ref_global_tgt_field[j] = -1.0;
1525 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1526 ref_tgt_field[i] = ref_global_tgt_field[i];
1529 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1530 src_field[i] = (
double)(
i) + 1.0;
1536 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1537 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1538 PUT_ERR(
"wrong interpolation result");
1542 free(ref_tgt_field);
1578 int is_tgt = split_comm_size == 1;
1579 double coordinates_x[2][7] = {{0.0,0.1,0.2}, {0.0,0.05,0.1,0.15,0.2}};
1580 double coordinates_y[2][7] = {{0.0,0.1,0.2}, {0.0,0.05,0.1,0.15,0.2}};
1581 size_t const num_cells[2][2] = {{2,2}, {4,4}};
1582 size_t local_start[2][2][2] = {{{0,0},{0,1}}, {{0,0}}};
1583 size_t local_count[2][2][2] = {{{2,1},{2,1}}, {{4,4}}};
1584 int global_mask[2][5*5] = {{1,1,1,
1593 for (
size_t i = 0;
i <=
num_cells[is_tgt][0]; ++
i)
1595 for (
size_t i = 0;
i <=
num_cells[is_tgt][1]; ++
i)
1601 local_start[is_tgt][split_comm_rank],
1602 local_count[is_tgt][split_comm_rank],
with_halo);
1608 int field_mask[5*5];
1609 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1610 field_mask[i] = global_mask[is_tgt][
grid_data.vertex_ids[i]];
1617 for (
int with_src_mask = 0; with_src_mask < 2; ++with_src_mask) {
1618 for (
int with_tgt_mask = 0; with_tgt_mask < 2; ++with_tgt_mask) {
1622 .coordinates_idx = SIZE_MAX,
1623 .masks_idx = (with_src_mask)?0:SIZE_MAX}};
1624 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1627 .coordinates_idx = SIZE_MAX,
1628 .masks_idx = (with_tgt_mask)?0:SIZE_MAX};
1642 ++weight_types_idx) {
1643 for (
int partial_coverage = 0; partial_coverage < 2;
1644 ++partial_coverage) {
1663 double src_field_data[3*3];
1667 {-2.0,-2.0,-2.0,-2.0,-2.0,
1668 -2.0,-2.0,-2.0,-2.0,-2.0,
1669 -2.0,-2.0,-2.0,-2.0,-2.0,
1670 -2.0,-2.0,-2.0,-2.0,-2.0,
1671 -2.0,-2.0,-2.0,-2.0,-2.0};
1675 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1676 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
1679 interpolation, &src_fields, &tgt_field);
1682 size_t src_per_tgt[5*5][4] =
1683 {{0,1,3,4},{0,1,3,4},{0,1,3,4},{1,2,4,5},{1,2,4,5},
1684 {0,1,3,4},{0,1,3,4},{0,1,3,4},{1,2,4,5},{1,2,4,5},
1685 {0,1,3,4},{0,1,3,4},{0,1,3,4},{1,2,4,5},{1,2,4,5},
1686 {3,4,6,7},{3,4,6,7},{3,4,6,7},{4,5,7,8},{4,5,7,8},
1687 {3,4,6,7},{3,4,6,7},{3,4,6,7},{4,5,7,8},{4,5,7,8}};
1688 double A = 0.345491502812526;
1689 double B = 0.154508497187473;
1693 {{{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},
1694 {C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},
1695 {C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},
1696 {C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},
1697 {C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C}},
1698 {{1,0,0,0},{A,A,B,B},{0,1,0,0},{A,A,B,B},{0,1,0,0},
1699 {A,B,A,B},{C,C,C,C},{B,A,B,A},{C,C,C,C},{B,A,B,A},
1700 {0,0,1,0},{B,B,A,A},{0,0,0,1},{B,B,A,A},{0,0,0,1},
1701 {A,B,A,B},{C,C,C,C},{B,A,B,A},{C,C,C,C},{B,A,B,A},
1702 {0,0,1,0},{B,B,A,A},{0,0,0,1},{B,B,A,A},{0,0,0,1}},
1703 {{1,0,0,0},{D,D,0,0},{0,1,0,0},{D,D,0,0},{0,1,0,0},
1704 {D,0,D,0},{D,0,0,D},{0,D,0,D},{D,0,0,D},{0,D,0,D},
1705 {0,0,1,0},{0,0,D,D},{0,0,0,1},{0,0,D,D},{0,0,0,1},
1706 {D,0,D,0},{D,0,0,D},{0,D,0,D},{D,0,0,D},{0,D,0,D},
1707 {0,0,1,0},{0,0,D,D},{0,0,0,1},{0,0,D,D},{0,0,0,1}}};
1709 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) {
1712 double src_values[4];
1715 double ref_tgt_value = 0.0;
1717 int contains_masked_src = 0;
1718 int contains_unmasked_src = 0;
1720 for (
int j = 0; j < 4; ++j) {
1721 size_t src_idx = src_per_tgt[tgt_idx][j];
1722 w[j] =
weights[weight_types_idx][tgt_idx][j];
1723 if (with_src_mask &&
1724 !global_mask[0][src_idx] &&
1726 src_values[j] = -1.0;
1728 contains_masked_src = 1;
1730 src_values[j] = (double)src_idx;
1731 contains_unmasked_src |= w[j] != 0.0;
1735 if (with_tgt_mask && !global_mask[1][tgt_idx]) {
1736 ref_tgt_value = -2.0;
1737 }
else if (contains_masked_src) {
1738 if (partial_coverage && contains_unmasked_src) {
1740 for (
int j = 0; j < 4; ++j)
1741 ref_tgt_value += w[j] * src_values[j];
1743 ref_tgt_value = -1.0;
1746 for (
int j = 0; j < 4; ++j)
1747 ref_tgt_value += w[j] * src_values[j];
1751 if (with_src_mask && partial_coverage &&
1754 (!with_tgt_mask || global_mask[1][tgt_idx])) {
1757 ref_tgt_value = 1.73879612503;
1761 ref_tgt_value = 4.0;
1767 if (fabs(ref_tgt_value - tgt_field[i]) > 1e-3)
1768 PUT_ERR(
"wrong interpolation result");
1803 int is_tgt = split_comm_size == 1;
1804 double src_coordinates_x[2][2] = {{-0.5,0.5}, {0.5,-0.5}};
1805 double src_coordinates_y[2][2] = {{89,90}, {90,89}};
1806 size_t const src_num_cells[2] = {1,1};
1807 size_t src_local_start[2] = {0,0};
1808 size_t src_local_count[2] = {1,1};
1809 yac_int src_reorder[2][2][4] =
1810 {{{0,1,2,3},{2,3,0,1}},{{1,0,3,2},{3,2,1,0}}};
1811 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
1812 double tgt_coordinates_y[5] = {89.00,89.25,89.50,89.75,90.00};
1813 size_t const tgt_num_cells[2] = {4,4};
1814 size_t tgt_local_start[2] = {0,0};
1815 size_t tgt_local_count[2] = {4,4};
1817 for (
size_t i = 0;
i < 2 * 2; ++
i)
1818 (&(src_coordinates_x[0][0]))[
i] *=
YAC_RAD;
1819 for (
size_t i = 0;
i < 2 * 2; ++
i)
1820 (&(src_coordinates_y[0][0]))[
i] *=
YAC_RAD;
1821 for (
size_t i = 0;
i < 5; ++
i) tgt_coordinates_x[i] *=
YAC_RAD;
1822 for (
size_t i = 0;
i < 5; ++
i)
1823 (&(tgt_coordinates_y[0]))[
i] *=
YAC_RAD;
1825 for (
int order_x = 0; order_x < 2; ++order_x) {
1826 for (
int order_y = 0; order_y < 2; ++order_y) {
1833 tgt_coordinates_x, tgt_coordinates_y,
1834 tgt_num_cells, tgt_local_start, tgt_local_count, 0);
1838 src_coordinates_x[order_x],
1839 src_coordinates_y[order_y], src_num_cells,
1840 src_local_start, src_local_count, 0);
1847 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1861 vertex_coordinates,
grid_data.vertex_coordinates,
1862 grid_data.num_vertices *
sizeof(*vertex_coordinates));
1865 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) {
1866 if (fabs(1.0 - fabs(vertex_coordinates[i][2])) < 1e-9) {
1867 vertex_coordinates[
i][0] = 0.0;
1868 vertex_coordinates[
i][1] = 0.0;
1880 .masks_idx = SIZE_MAX}};
1881 size_t num_src_fields =
1882 sizeof(src_fields) /
sizeof(src_fields[0]);
1885 .masks_idx = SIZE_MAX};
1891 int partial_coverage = 0;
1912 double * ref_tgt_field = NULL;
1913 double ref_global_tgt_field[25];
1915 {{1.00, 0.00, 0.00, 0.00},
1916 {0.75, 0.25, 0.00, 0.00},
1917 {0.50, 0.50, 0.00, 0.00},
1918 {0.25, 0.75, 0.00, 0.00},
1919 {0.00, 1.00, 0.00, 0.00},
1920 {0.75, 0.00, 0.25, 0.00},
1921 {0.75, 0.00, 0.00, 0.25},
1922 {0.50, 0.25, 0.00, 0.25},
1923 {0.25, 0.50, 0.00, 0.25},
1924 {0.00, 0.75, 0.00, 0.25},
1925 {0.50, 0.00, 0.50, 0.00},
1926 {0.50, 0.00, 0.25, 0.25},
1927 {0.50, 0.00, 0.00, 0.50},
1928 {0.25, 0.25, 0.00, 0.50},
1929 {0.00, 0.50, 0.00, 0.50},
1930 {0.25, 0.00, 0.75, 0.00},
1931 {0.25, 0.00, 0.50, 0.25},
1932 {0.25, 0.00, 0.25, 0.50},
1933 {0.25, 0.00, 0.00, 0.75},
1934 {0.00, 0.25, 0.00, 0.75},
1935 {0.00, 0.00, 0.50, 0.50},
1936 {0.00, 0.00, 0.50, 0.50},
1937 {0.00, 0.00, 0.50, 0.50},
1938 {0.00, 0.00, 0.50, 0.50},
1939 {0.00, 0.00, 0.50, 0.50}};
1941 for (
size_t j = 0; j < 25; ++j) {
1942 ref_global_tgt_field[j] =
1943 (double)(src_reorder[order_x][order_y][0] + 1) *
1945 (double)(src_reorder[order_x][order_y][1] + 1) *
1947 (double)(src_reorder[order_x][order_y][2] + 1) *
1949 (double)(src_reorder[order_x][order_y][3] + 1) *
1951 if (ref_global_tgt_field[j] == 0.0)
1952 ref_global_tgt_field[j] = -1.0;
1958 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1959 ref_tgt_field[i] = ref_global_tgt_field[i];
1962 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1963 src_field[i] = (
double)(
i) + 1.0;
1969 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1970 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1971 PUT_ERR(
"wrong interpolation result");
1975 free(ref_tgt_field);
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
size_t yac_basic_grid_add_mask(struct yac_basic_grid *grid, enum yac_location location, int const *mask, size_t count, char const *mask_name)
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)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_deg(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
void yac_correct_weights(size_t nSourceCells, double *weight)
correct interpolation weights
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 void normalise_vector(double v[])
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_weight_type
@ 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
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
int * num_vertices_per_cell
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
static char const * grid_names[2]
enum yac_interp_weights_reorder_type reorder_types[]
static MPI_Comm split_comm
enum yac_interp_spmap_weight_type weight_types[]
static double tgt_field_data[MAX_COLLECTION_SIZE][NUM_TGT_POINTS]
double cell_coordinates_y[]
double ref_weights[4 *36]
double cell_coordinates_x[]
struct yac_basic_grid ** grids
double(* yac_coordinate_pointer)[3]