29static char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
35 xt_initialize(MPI_COMM_WORLD);
37 int comm_rank, comm_size;
38 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
39 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
40 MPI_Barrier(MPI_COMM_WORLD);
43 PUT_ERR(
"ERROR: wrong number of processes");
51 MPI_COMM_WORLD, comm_rank < 2, 0, &
split_comm);
78 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5}};
80 size_t const num_cells[2][2] = {{3,2}, {2,2}};
81 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
82 size_t local_count[2][2][2] = {{{2,2},{2,2}}, {{2,2}}};
90 utest_generate_basic_grid_data_reg2d(
104 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
106 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
112 for (
int partial_coverage = 0; partial_coverage <= 1; ++partial_coverage) {
134 double * ref_tgt_field = NULL;
135 double ref_global_tgt_field[9] =
136 {2.5, 3.5, 4.5, 6.5, 7.5, 8.5, -1, -1, -1};
141 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
142 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
145 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
146 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
152 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
153 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
154 PUT_ERR(
"wrong interpolation result");
205 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5}};
207 size_t const num_cells[2][2] = {{3,2}, {2,2}};
208 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
209 size_t local_count[2][2][2] = {{{2,2},{2,2}}, {{2,2}}};
210 int global_src_mask[12] = {1, 1, 1, 0,
220 utest_generate_basic_grid_data_reg2d(
231 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
232 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
239 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
240 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
242 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
267 double * ref_tgt_field = NULL;
268 double ref_global_tgt_field[9] =
269 {2.5, 3.5, -1, -1, 7.5, 8.5, -1, -1, -1};
274 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
275 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
278 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
279 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
285 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
286 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
287 PUT_ERR(
"wrong interpolation result");
344 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
345 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
346 size_t const num_cells[2][2] = {{3,3}, {3,3}};
347 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
348 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
349 int global_src_mask[16] = {0, 1, 1, 0,
360 utest_generate_basic_grid_data_reg2d(
372 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
373 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
381 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
382 for (
int i = 0, k = 0;
i < 3; ++
i)
383 for (
int j = 0; j < 3; ++j, ++k)
386 tgt_cell_coordinates[k]);
394 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
395 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
397 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
422 double * ref_tgt_field = NULL;
423 double ref_global_tgt_field[9] =
425 0.14963* 1.0 + 0.20075*( 2.0+ 5.0) + 0.44888* 6.0,
427 0.14963* 4.0 + 0.20075*( 5.0+ 8.0) + 0.44888* 9.0,
428 0.14963* 5.0 + 0.20075*( 6.0+ 9.0) + 0.44888*10.0,
429 0.14963* 6.0 + 0.20075*( 7.0+10.0) + 0.44888*11.0,
431 0.14963* 9.0 + 0.20075*(10.0+13.0) + 0.44888*14.0,
437 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
438 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
441 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
442 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
449 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
450 PUT_ERR(
"wrong interpolation result");
507 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
508 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
509 size_t const num_cells[2][2] = {{3,3}, {3,3}};
510 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
511 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
512 int global_src_mask[16] = {0, 1, 0, 0,
523 utest_generate_basic_grid_data_reg2d(
535 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
536 src_mask[i] = global_src_mask[
grid_data.vertex_ids[i]];
544 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
545 for (
int i = 0, k = 0;
i < 3; ++
i)
546 for (
int j = 0; j < 3; ++j, ++k)
549 tgt_cell_coordinates[k]);
557 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0}};
558 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
560 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
585 double * ref_tgt_field = NULL;
586 double inv_dist_a = sqrt(8.0);
587 double inv_dist_b = sqrt(8.0/5.0);
588 double inv_dist_c = sqrt(8.0/9.0);
589 double ref_global_tgt_field[9] =
590 {(inv_dist_b*( 1.0+ 4.0) + inv_dist_a* 5.0)/(inv_dist_a + 2.0 * inv_dist_b),
591 (inv_dist_c* 1.0 + inv_dist_b* 5.0)/(inv_dist_b + inv_dist_c),
593 (inv_dist_c* 4.0 + inv_dist_b*( 5.0+ 8.0))/(2.0 * inv_dist_b + inv_dist_c),
594 (inv_dist_c* 5.0 + inv_dist_a*10.0)/(inv_dist_a + inv_dist_c),
595 (inv_dist_b*10.0 + inv_dist_a*11.0)/(inv_dist_a + inv_dist_b),
596 (inv_dist_c* 8.0 + inv_dist_a*13.0)/(inv_dist_a + inv_dist_c),
597 (inv_dist_b*(10.0+13.0) + inv_dist_a*14.0)/(inv_dist_a + 2.0 * inv_dist_b),
598 (inv_dist_c*10.0 + inv_dist_b*(11.0+14.0))/(2.0 * inv_dist_b + inv_dist_c)};
603 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
604 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
607 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
608 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
615 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
616 PUT_ERR(
"wrong interpolation result");
659 double coordinates_x[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
660 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.0,1.0,2.0,3.0}};
661 size_t const num_cells[2][2] = {{3,3}, {3,3}};
662 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
663 size_t local_count[2][2][2] = {{{2,3},{2,3}}, {{3,3}}};
671 utest_generate_basic_grid_data_reg2d(
684 tgt_cell_coordinates =
xmalloc(9 *
sizeof(*tgt_cell_coordinates));
685 for (
int i = 0, k = 0;
i < 3; ++
i)
686 for (
int j = 0; j < 3; ++j, ++k)
689 tgt_cell_coordinates[k]);
697 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
698 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
700 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
725 double * ref_tgt_field = NULL;
726 double ref_global_tgt_field[9] =
727 {5.0, 6.0, 7.0, 9.0, 10.0, 11.0, 13.0, 14.0, 15.0};
732 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
733 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
736 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
737 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
744 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
745 PUT_ERR(
"wrong interpolation result");
805 size_t local_start[2][2][2] = {{{0,0},{0,4}}, {{0,0}}};
806 size_t local_count[2][2][2] = {{{7,4},{7,3}}, {{7,7}}};
814 utest_generate_basic_grid_data_reg2d(
825 src_point_coordinates =
828 double * middle_point = src_point_coordinates[
i];
829 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
830 size_t * curr_vertices =
833 for (
size_t j = 0; j < curr_num_vertices; ++j) {
834 double * curr_vertex_coord =
835 grid_data.vertex_coordinates[curr_vertices[j]];
836 for (
size_t k = 0; k < 3; ++k)
837 middle_point[k] += curr_vertex_coord[k];
847 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
848 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
850 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
875 double * ref_tgt_field = NULL;
876 double ref_global_tgt_field[64] =
877 {-4,-4,-4,-4,-4,-4,-4,-4,
878 -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,
879 -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,
880 -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,
881 -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,
882 -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,
883 -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,
884 -4,-4,-4,-4,-4,-4,-4,-4};
886 i <
sizeof(ref_global_tgt_field) /
sizeof(ref_global_tgt_field[0]);
888 ref_global_tgt_field[i] /= 4.0;
893 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
894 ref_tgt_field[i] = ref_global_tgt_field[
grid_data.vertex_ids[i]];
898 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
904 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
905 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-9)
906 PUT_ERR(
"wrong interpolation result");
940 double src_coordinates_x[2][2] = {{-0.5,0.5}, {0.5,-0.5}};
941 double src_coordinates_y[2][2][2] =
942 {{{-0.5,0.5}, {0.5,-0.5}}, {{89,90}, {90,89}}};
943 double src_coordinates_x_unstruct[4];
944 double src_coordinates_y_unstruct[4];
945 size_t const src_num_cells[2] = {1,1};
946 size_t src_local_start[2] = {0,0};
947 size_t src_local_count[2] = {1,1};
948 int src_cell_mask[4] = {1,1, 0,1};
950 {{{0,1,2,3},{2,3,0,1}},{{1,0,3,2},{3,2,1,0}}};
951 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
952 double tgt_coordinates_y[2][5] =
953 {{-0.5,-0.25,0.0,0.25,0.5}, {89.00,89.25,89.50,89.75,90.00}};
954 size_t const tgt_num_cells[2] = {4,4};
955 size_t tgt_local_start[2] = {0,0};
956 size_t tgt_local_count[2] = {4,4};
958 for (
size_t i = 0;
i < 2 * 2; ++
i)
959 (&(src_coordinates_x[0][0]))[
i] *=
YAC_RAD;
960 for (
size_t i = 0;
i < 2 * 2 * 2; ++
i)
961 (&(src_coordinates_y[0][0][0]))[
i] *=
YAC_RAD;
962 for (
size_t i = 0;
i < 5; ++
i) tgt_coordinates_x[i] *=
YAC_RAD;
963 for (
size_t i = 0;
i < 2 * 5; ++
i)
964 (&(tgt_coordinates_y[0][0]))[
i] *=
YAC_RAD;
966 for (
int partial_coverage = 0; partial_coverage < 2; ++partial_coverage) {
967 for (
int is_reg2d_grid = 0; is_reg2d_grid < 2; ++is_reg2d_grid) {
968 for (
int at_pole = 0; at_pole < 2; ++at_pole) {
969 for (
int with_mask = 0; with_mask < 2; ++with_mask) {
970 for (
int order_x = 0; order_x < 2; ++order_x) {
971 for (
int order_y = 0; order_y < 2; ++order_y) {
977 utest_generate_basic_grid_data_reg2d(
978 tgt_coordinates_x, tgt_coordinates_y[at_pole],
979 tgt_num_cells, tgt_local_start, tgt_local_count, 0);
983 utest_generate_basic_grid_data_reg2d(
984 src_coordinates_x[order_x],
985 src_coordinates_y[at_pole][order_y], src_num_cells,
986 src_local_start, src_local_count, 0);
988 for (
int i = 0;
i < 4; ++
i) {
989 src_coordinates_x_unstruct[
i] =
990 src_coordinates_x[order_x][
i&1];
991 src_coordinates_y_unstruct[
i] =
992 src_coordinates_y[at_pole][order_y][
i>>1];
997 src_coordinates_x_unstruct,
998 src_coordinates_y_unstruct, (
int[]){0,1,3,2});
1006 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1015 if (with_mask && !is_tgt) {
1017 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1019 src_cell_mask[src_reorder[order_x][order_y][i]];
1028 .masks_idx = (with_mask)?0:SIZE_MAX}};
1029 size_t num_src_fields =
1030 sizeof(src_fields) /
sizeof(src_fields[0]);
1033 .masks_idx = SIZE_MAX};
1059 double * ref_tgt_field = NULL;
1060 double ref_global_tgt_field[25];
1062 {{{{{1.00, 0.00, 0.00, 0.00},
1063 {0.75, 0.25, 0.00, 0.00},
1064 {0.50, 0.50, 0.00, 0.00},
1065 {0.25, 0.75, 0.00, 0.00},
1066 {0.00, 1.00, 0.00, 0.00},
1067 {0.75, 0.00, 0.25, 0.00},
1068 {0.75, 0.00, 0.00, 0.25},
1069 {0.50, 0.25, 0.00, 0.25},
1070 {0.25, 0.50, 0.00, 0.25},
1071 {0.00, 0.75, 0.00, 0.25},
1072 {0.50, 0.00, 0.50, 0.00},
1073 {0.50, 0.00, 0.25, 0.25},
1074 {0.50, 0.00, 0.00, 0.50},
1075 {0.25, 0.25, 0.00, 0.50},
1076 {0.00, 0.50, 0.00, 0.50},
1077 {0.25, 0.00, 0.75, 0.00},
1078 {0.25, 0.00, 0.50, 0.25},
1079 {0.25, 0.00, 0.25, 0.50},
1080 {0.25, 0.00, 0.00, 0.75},
1081 {0.00, 0.25, 0.00, 0.75},
1082 {0.00, 0.00, 1.00, 0.00},
1083 {0.00, 0.00, 0.75, 0.25},
1084 {0.00, 0.00, 0.50, 0.50},
1085 {0.00, 0.00, 0.25, 0.75},
1086 {0.00, 0.00, 0.00, 1.00}},
1087 {{1.00, 0.00, 0.00, 0.00},
1088 {0.75, 0.25, 0.00, 0.00},
1089 {0.50, 0.50, 0.00, 0.00},
1090 {0.25, 0.75, 0.00, 0.00},
1091 {0.00, 1.00, 0.00, 0.00},
1092 {0.00, 0.00, 0.00, 0.00},
1093 {0.75, 0.00, 0.00, 0.25},
1094 {0.50, 0.25, 0.00, 0.25},
1095 {0.25, 0.50, 0.00, 0.25},
1096 {0.00, 0.75, 0.00, 0.25},
1097 {0.00, 0.00, 0.00, 0.00},
1098 {0.00, 0.00, 0.00, 0.00},
1099 {0.50, 0.00, 0.00, 0.50},
1100 {0.25, 0.25, 0.00, 0.50},
1101 {0.00, 0.50, 0.00, 0.50},
1102 {0.00, 0.00, 0.00, 0.00},
1103 {0.00, 0.00, 0.00, 0.00},
1104 {0.00, 0.00, 0.00, 0.00},
1105 {0.25, 0.00, 0.00, 0.75},
1106 {0.00, 0.25, 0.00, 0.75},
1107 {0.00, 0.00, 0.00, 0.00},
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, 1.00}}},
1112 {{{1.00, 0.00, 0.00, 0.00},
1113 {0.75, 0.25, 0.00, 0.00},
1114 {0.50, 0.50, 0.00, 0.00},
1115 {0.25, 0.75, 0.00, 0.00},
1116 {0.00, 1.00, 0.00, 0.00},
1117 {0.75, 0.00, 0.25, 0.00},
1118 {0.75, 0.00, 0.00, 0.25},
1119 {0.50, 0.25, 0.00, 0.25},
1120 {0.25, 0.50, 0.00, 0.25},
1121 {0.00, 0.75, 0.00, 0.25},
1122 {0.50, 0.00, 0.50, 0.00},
1123 {0.50, 0.00, 0.25, 0.25},
1124 {0.50, 0.00, 0.00, 0.50},
1125 {0.25, 0.25, 0.00, 0.50},
1126 {0.00, 0.50, 0.00, 0.50},
1127 {0.25, 0.00, 0.75, 0.00},
1128 {0.25, 0.00, 0.50, 0.25},
1129 {0.25, 0.00, 0.25, 0.50},
1130 {0.25, 0.00, 0.00, 0.75},
1131 {0.00, 0.25, 0.00, 0.75},
1132 {0.00, 0.00, 1.00, 0.00},
1133 {0.00, 0.00, 0.75, 0.25},
1134 {0.00, 0.00, 0.50, 0.50},
1135 {0.00, 0.00, 0.25, 0.75},
1136 {0.00, 0.00, 0.00, 1.00}},
1137 {{1.00, 0.00, 0.00, 0.00},
1138 {0.75, 0.25, 0.00, 0.00},
1139 {0.50, 0.50, 0.00, 0.00},
1140 {0.25, 0.75, 0.00, 0.00},
1141 {0.00, 1.00, 0.00, 0.00},
1142 {1.00, 0.00, 0.00, 0.00},
1143 {0.75, 0.00, 0.00, 0.25},
1144 {0.50, 0.25, 0.00, 0.25},
1145 {0.25, 0.50, 0.00, 0.25},
1146 {0.00, 0.75, 0.00, 0.25},
1147 {1.00, 0.00, 0.00, 0.00},
1148 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1149 {0.50, 0.00, 0.00, 0.50},
1150 {0.25, 0.25, 0.00, 0.50},
1151 {0.00, 0.50, 0.00, 0.50},
1152 {1.00, 0.00, 0.00, 0.00},
1153 {0.50, 0.00, 0.00, 0.50},
1154 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1155 {0.25, 0.00, 0.00, 0.75},
1156 {0.00, 0.25, 0.00, 0.75},
1157 {0.00, 0.00, 0.00, 0.00},
1158 {0.00, 0.00, 0.00, 1.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 {{{{1.00, 0.00, 0.00, 0.00},
1163 {0.75, 0.25, 0.00, 0.00},
1164 {0.50, 0.50, 0.00, 0.00},
1165 {0.25, 0.75, 0.00, 0.00},
1166 {0.00, 1.00, 0.00, 0.00},
1167 {0.75, 0.00, 0.25, 0.00},
1168 {0.75, 0.00, 0.00, 0.25},
1169 {0.50, 0.25, 0.00, 0.25},
1170 {0.25, 0.50, 0.00, 0.25},
1171 {0.00, 0.75, 0.00, 0.25},
1172 {0.50, 0.00, 0.50, 0.00},
1173 {0.50, 0.00, 0.25, 0.25},
1174 {0.50, 0.00, 0.00, 0.50},
1175 {0.25, 0.25, 0.00, 0.50},
1176 {0.00, 0.50, 0.00, 0.50},
1177 {0.25, 0.00, 0.75, 0.00},
1178 {0.25, 0.00, 0.50, 0.25},
1179 {0.25, 0.00, 0.25, 0.50},
1180 {0.25, 0.00, 0.00, 0.75},
1181 {0.00, 0.25, 0.00, 0.75},
1182 {0.00, 0.00, 0.50, 0.50},
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 {{1.00, 0.00, 0.00, 0.00},
1188 {0.75, 0.25, 0.00, 0.00},
1189 {0.50, 0.50, 0.00, 0.00},
1190 {0.25, 0.75, 0.00, 0.00},
1191 {0.00, 1.00, 0.00, 0.00},
1192 {0.00, 0.00, 0.00, 0.00},
1193 {0.75, 0.00, 0.00, 0.25},
1194 {0.50, 0.25, 0.00, 0.25},
1195 {0.25, 0.50, 0.00, 0.25},
1196 {0.00, 0.75, 0.00, 0.25},
1197 {0.00, 0.00, 0.00, 0.00},
1198 {0.00, 0.00, 0.00, 0.00},
1199 {0.50, 0.00, 0.00, 0.50},
1200 {0.25, 0.25, 0.00, 0.50},
1201 {0.00, 0.50, 0.00, 0.50},
1202 {0.00, 0.00, 0.00, 0.00},
1203 {0.00, 0.00, 0.00, 0.00},
1204 {0.00, 0.00, 0.00, 0.00},
1205 {0.25, 0.00, 0.00, 0.75},
1206 {0.00, 0.25, 0.00, 0.75},
1207 {0.00, 0.00, 0.00, 0.00},
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 {{{1.00, 0.00, 0.00, 0.00},
1213 {0.75, 0.25, 0.00, 0.00},
1214 {0.50, 0.50, 0.00, 0.00},
1215 {0.25, 0.75, 0.00, 0.00},
1216 {0.00, 1.00, 0.00, 0.00},
1217 {0.75, 0.00, 0.25, 0.00},
1218 {0.75, 0.00, 0.00, 0.25},
1219 {0.50, 0.25, 0.00, 0.25},
1220 {0.25, 0.50, 0.00, 0.25},
1221 {0.00, 0.75, 0.00, 0.25},
1222 {0.50, 0.00, 0.50, 0.00},
1223 {0.50, 0.00, 0.25, 0.25},
1224 {0.50, 0.00, 0.00, 0.50},
1225 {0.25, 0.25, 0.00, 0.50},
1226 {0.00, 0.50, 0.00, 0.50},
1227 {0.25, 0.00, 0.75, 0.00},
1228 {0.25, 0.00, 0.50, 0.25},
1229 {0.25, 0.00, 0.25, 0.50},
1230 {0.25, 0.00, 0.00, 0.75},
1231 {0.00, 0.25, 0.00, 0.75},
1232 {0.00, 0.00, 0.50, 0.50},
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 {{1.00, 0.00, 0.00, 0.00},
1238 {0.75, 0.25, 0.00, 0.00},
1239 {0.50, 0.50, 0.00, 0.00},
1240 {0.25, 0.75, 0.00, 0.00},
1241 {0.00, 1.00, 0.00, 0.00},
1242 {1.00, 0.00, 0.00, 0.00},
1243 {0.75, 0.00, 0.00, 0.25},
1244 {0.50, 0.25, 0.00, 0.25},
1245 {0.25, 0.50, 0.00, 0.25},
1246 {0.00, 0.75, 0.00, 0.25},
1247 {1.00, 0.00, 0.00, 0.00},
1248 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1249 {0.50, 0.00, 0.00, 0.50},
1250 {0.25, 0.25, 0.00, 0.50},
1251 {0.00, 0.50, 0.00, 0.50},
1252 {1.00, 0.00, 0.00, 0.00},
1253 {0.50, 0.00, 0.00, 0.50},
1254 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1255 {0.25, 0.00, 0.00, 0.75},
1256 {0.00, 0.25, 0.00, 0.75},
1257 {0.00, 0.00, 0.00, 1.00},
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}}}}};
1263 for (
size_t j = 0; j < 25; ++j) {
1264 ref_global_tgt_field[j] =
1265 (double)(src_reorder[order_x][order_y][0] + 1) *
1266 ref_weights[at_pole][partial_coverage][with_mask][j][0] +
1267 (double)(src_reorder[order_x][order_y][1] + 1) *
1268 ref_weights[at_pole][partial_coverage][with_mask][j][1] +
1269 (double)(src_reorder[order_x][order_y][2] + 1) *
1270 ref_weights[at_pole][partial_coverage][with_mask][j][2] +
1271 (double)(src_reorder[order_x][order_y][3] + 1) *
1272 ref_weights[at_pole][partial_coverage][with_mask][j][3];
1273 if (ref_global_tgt_field[j] == 0.0)
1274 ref_global_tgt_field[j] = -1.0;
1280 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1281 ref_tgt_field[i] = ref_global_tgt_field[i];
1284 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1285 src_field[i] = (
double)(
i) + 1.0;
1292 if (is_tgt && !(!is_reg2d_grid && at_pole))
1293 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1294 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1295 PUT_ERR(
"wrong interpolation result");
1299 free(ref_tgt_field);
1335 size_t src_num_vertices = 4;
1336 size_t src_num_cells = 2;
1337 int src_num_vertices_per_cell[] = {3, 3};
1338 int src_cell_to_vertex[] = {0,1,3, 0,2,3};
1339 double src_coordinates_x[4] = {-0.5,0.5,-0.5,0.5};
1340 double src_coordinates_y[4] = {-0.5,-0.5,0.5,0.5};
1341 size_t tgt_num_vertices[2] = {5,5};
1342 int tgt_cyclic[2] = {0,0};
1343 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
1344 double tgt_coordinates_y[5] = {-0.5,-0.25,0.0,0.25,0.5};
1345 int src_cell_mask[4] = {1,1, 0,1};
1347 for (
int with_mask = 0; with_mask < 2; ++with_mask) {
1353 tgt_num_vertices, tgt_cyclic,
1354 tgt_coordinates_x, tgt_coordinates_y);
1358 src_num_vertices, src_num_cells, src_num_vertices_per_cell,
1359 src_coordinates_x, src_coordinates_y, src_cell_to_vertex);
1366 if (with_mask && !is_tgt) {
1368 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1369 mask[i] = src_cell_mask[i];
1378 .masks_idx = (with_mask)?0:SIZE_MAX}};
1379 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1382 .masks_idx = SIZE_MAX};
1388 for (
int partial_coverage = 0; partial_coverage < 2; ++partial_coverage) {
1409 double * ref_tgt_field = NULL;
1410 double ref_global_tgt_field[25];
1412 {{{{1.00, 0.00, 0.00, 0.00},
1413 {0.75, 0.25, 0.00, 0.00},
1414 {0.50, 0.50, 0.00, 0.00},
1415 {0.25, 0.75, 0.00, 0.00},
1416 {0.00, 1.00, 0.00, 0.00},
1417 {0.75, 0.00, 0.25, 0.00},
1418 {0.75, 0.00, 0.00, 0.25},
1419 {0.50, 0.25, 0.00, 0.25},
1420 {0.25, 0.50, 0.00, 0.25},
1421 {0.00, 0.75, 0.00, 0.25},
1422 {0.50, 0.00, 0.50, 0.00},
1423 {0.50, 0.00, 0.25, 0.25},
1424 {0.50, 0.00, 0.00, 0.50},
1425 {0.25, 0.25, 0.00, 0.50},
1426 {0.00, 0.50, 0.00, 0.50},
1427 {0.25, 0.00, 0.75, 0.00},
1428 {0.25, 0.00, 0.50, 0.25},
1429 {0.25, 0.00, 0.25, 0.50},
1430 {0.25, 0.00, 0.00, 0.75},
1431 {0.00, 0.25, 0.00, 0.75},
1432 {0.00, 0.00, 1.00, 0.00},
1433 {0.00, 0.00, 0.75, 0.25},
1434 {0.00, 0.00, 0.50, 0.50},
1435 {0.00, 0.00, 0.25, 0.75},
1436 {0.00, 0.00, 0.00, 1.00}},
1437 {{1.00, 0.00, 0.00, 0.00},
1438 {0.75, 0.25, 0.00, 0.00},
1439 {0.50, 0.50, 0.00, 0.00},
1440 {0.25, 0.75, 0.00, 0.00},
1441 {0.00, 1.00, 0.00, 0.00},
1442 {0.00, 0.00, 0.00, 0.00},
1443 {0.75, 0.00, 0.00, 0.25},
1444 {0.50, 0.25, 0.00, 0.25},
1445 {0.25, 0.50, 0.00, 0.25},
1446 {0.00, 0.75, 0.00, 0.25},
1447 {0.00, 0.00, 0.00, 0.00},
1448 {0.00, 0.00, 0.00, 0.00},
1449 {0.50, 0.00, 0.00, 0.50},
1450 {0.25, 0.25, 0.00, 0.50},
1451 {0.00, 0.50, 0.00, 0.50},
1452 {0.00, 0.00, 0.00, 0.00},
1453 {0.00, 0.00, 0.00, 0.00},
1454 {0.00, 0.00, 0.00, 0.00},
1455 {0.25, 0.00, 0.00, 0.75},
1456 {0.00, 0.25, 0.00, 0.75},
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, 0.00},
1461 {0.00, 0.00, 0.00, 1.00}}},
1462 {{{1.00, 0.00, 0.00, 0.00},
1463 {0.75, 0.25, 0.00, 0.00},
1464 {0.50, 0.50, 0.00, 0.00},
1465 {0.25, 0.75, 0.00, 0.00},
1466 {0.00, 1.00, 0.00, 0.00},
1467 {0.75, 0.00, 0.25, 0.00},
1468 {0.75, 0.00, 0.00, 0.25},
1469 {0.50, 0.25, 0.00, 0.25},
1470 {0.25, 0.50, 0.00, 0.25},
1471 {0.00, 0.75, 0.00, 0.25},
1472 {0.50, 0.00, 0.50, 0.00},
1473 {0.50, 0.00, 0.25, 0.25},
1474 {0.50, 0.00, 0.00, 0.50},
1475 {0.25, 0.25, 0.00, 0.50},
1476 {0.00, 0.50, 0.00, 0.50},
1477 {0.25, 0.00, 0.75, 0.00},
1478 {0.25, 0.00, 0.50, 0.25},
1479 {0.25, 0.00, 0.25, 0.50},
1480 {0.25, 0.00, 0.00, 0.75},
1481 {0.00, 0.25, 0.00, 0.75},
1482 {0.00, 0.00, 1.00, 0.00},
1483 {0.00, 0.00, 0.75, 0.25},
1484 {0.00, 0.00, 0.50, 0.50},
1485 {0.00, 0.00, 0.25, 0.75},
1486 {0.00, 0.00, 0.00, 1.00}},
1487 {{1.00, 0.00, 0.00, 0.00},
1488 {0.75, 0.25, 0.00, 0.00},
1489 {0.50, 0.50, 0.00, 0.00},
1490 {0.25, 0.75, 0.00, 0.00},
1491 {0.00, 1.00, 0.00, 0.00},
1492 {1.00, 0.00, 0.00, 0.00},
1493 {0.75, 0.00, 0.00, 0.25},
1494 {0.50, 0.25, 0.00, 0.25},
1495 {0.25, 0.50, 0.00, 0.25},
1496 {0.00, 0.75, 0.00, 0.25},
1497 {1.00, 0.00, 0.00, 0.00},
1498 {0.50/0.75, 0.00, 0.00, 0.25/0.75},
1499 {0.50, 0.00, 0.00, 0.50},
1500 {0.25, 0.25, 0.00, 0.50},
1501 {0.00, 0.50, 0.00, 0.50},
1502 {1.00, 0.00, 0.00, 0.00},
1503 {0.50, 0.00, 0.00, 0.50},
1504 {0.25/0.75, 0.00, 0.00, 0.50/0.75},
1505 {0.25, 0.00, 0.00, 0.75},
1506 {0.00, 0.25, 0.00, 0.75},
1507 {0.00, 0.00, 0.00, 0.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},
1511 {0.00, 0.00, 0.00, 1.00}}}};
1513 for (
size_t j = 0; j < 25; ++j) {
1514 ref_global_tgt_field[j] =
1515 1.0 *
ref_weights[partial_coverage][with_mask][j][0] +
1516 2.0 *
ref_weights[partial_coverage][with_mask][j][1] +
1517 3.0 *
ref_weights[partial_coverage][with_mask][j][2] +
1518 4.0 *
ref_weights[partial_coverage][with_mask][j][3];
1519 if (ref_global_tgt_field[j] == 0.0)
1520 ref_global_tgt_field[j] = -1.0;
1526 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1527 ref_tgt_field[i] = ref_global_tgt_field[i];
1530 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1531 src_field[i] = (
double)(
i) + 1.0;
1537 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1538 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1539 PUT_ERR(
"wrong interpolation result");
1543 free(ref_tgt_field);
1580 double coordinates_x[2][7] = {{0.0,0.1,0.2}, {0.0,0.05,0.1,0.15,0.2}};
1581 double coordinates_y[2][7] = {{0.0,0.1,0.2}, {0.0,0.05,0.1,0.15,0.2}};
1582 size_t const num_cells[2][2] = {{2,2}, {4,4}};
1583 size_t local_start[2][2][2] = {{{0,0},{0,1}}, {{0,0}}};
1584 size_t local_count[2][2][2] = {{{2,1},{2,1}}, {{4,4}}};
1585 int global_mask[2][5*5] = {{1,1,1,
1594 for (
size_t i = 0;
i <=
num_cells[is_tgt][0]; ++
i)
1596 for (
size_t i = 0;
i <=
num_cells[is_tgt][1]; ++
i)
1600 utest_generate_basic_grid_data_reg2d(
1609 int field_mask[5*5];
1610 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1611 field_mask[i] = global_mask[is_tgt][
grid_data.vertex_ids[i]];
1618 for (
int with_src_mask = 0; with_src_mask < 2; ++with_src_mask) {
1619 for (
int with_tgt_mask = 0; with_tgt_mask < 2; ++with_tgt_mask) {
1623 .coordinates_idx = SIZE_MAX,
1624 .masks_idx = (with_src_mask)?0:SIZE_MAX}};
1625 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1628 .coordinates_idx = SIZE_MAX,
1629 .masks_idx = (with_tgt_mask)?0:SIZE_MAX};
1643 ++weight_types_idx) {
1644 for (
int partial_coverage = 0; partial_coverage < 2;
1645 ++partial_coverage) {
1664 double src_field_data[3*3];
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,
1672 -2.0,-2.0,-2.0,-2.0,-2.0};
1676 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1677 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
1680 interpolation, &src_fields, &tgt_field);
1683 size_t src_per_tgt[5*5][4] =
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 {0,1,3,4},{0,1,3,4},{0,1,3,4},{1,2,4,5},{1,2,4,5},
1687 {3,4,6,7},{3,4,6,7},{3,4,6,7},{4,5,7,8},{4,5,7,8},
1688 {3,4,6,7},{3,4,6,7},{3,4,6,7},{4,5,7,8},{4,5,7,8}};
1689 double A = 0.345491502812526;
1690 double B = 0.154508497187473;
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 {C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C},{C,C,C,C}},
1699 {{1,0,0,0},{A,A,B,B},{0,1,0,0},{A,A,B,B},{0,1,0,0},
1700 {A,B,A,B},{C,C,C,C},{B,A,B,A},{C,C,C,C},{B,A,B,A},
1701 {0,0,1,0},{B,B,A,A},{0,0,0,1},{B,B,A,A},{0,0,0,1},
1702 {A,B,A,B},{C,C,C,C},{B,A,B,A},{C,C,C,C},{B,A,B,A},
1703 {0,0,1,0},{B,B,A,A},{0,0,0,1},{B,B,A,A},{0,0,0,1}},
1704 {{1,0,0,0},{D,D,0,0},{0,1,0,0},{D,D,0,0},{0,1,0,0},
1705 {D,0,D,0},{D,0,0,D},{0,D,0,D},{D,0,0,D},{0,D,0,D},
1706 {0,0,1,0},{0,0,D,D},{0,0,0,1},{0,0,D,D},{0,0,0,1},
1707 {D,0,D,0},{D,0,0,D},{0,D,0,D},{D,0,0,D},{0,D,0,D},
1708 {0,0,1,0},{0,0,D,D},{0,0,0,1},{0,0,D,D},{0,0,0,1}}};
1710 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) {
1713 double src_values[4];
1716 double ref_tgt_value = 0.0;
1718 int contains_masked_src = 0;
1719 int contains_unmasked_src = 0;
1721 for (
int j = 0; j < 4; ++j) {
1722 size_t src_idx = src_per_tgt[tgt_idx][j];
1723 w[j] =
weights[weight_types_idx][tgt_idx][j];
1724 if (with_src_mask &&
1725 !global_mask[0][src_idx] &&
1727 src_values[j] = -1.0;
1729 contains_masked_src = 1;
1731 src_values[j] = (double)src_idx;
1732 contains_unmasked_src |= w[j] != 0.0;
1736 if (with_tgt_mask && !global_mask[1][tgt_idx]) {
1737 ref_tgt_value = -2.0;
1738 }
else if (contains_masked_src) {
1739 if (partial_coverage && contains_unmasked_src) {
1741 for (
int j = 0; j < 4; ++j)
1742 ref_tgt_value += w[j] * src_values[j];
1744 ref_tgt_value = -1.0;
1747 for (
int j = 0; j < 4; ++j)
1748 ref_tgt_value += w[j] * src_values[j];
1752 if (with_src_mask && partial_coverage &&
1755 (!with_tgt_mask || global_mask[1][tgt_idx])) {
1758 ref_tgt_value = 1.73879612503;
1762 ref_tgt_value = 4.0;
1768 if (fabs(ref_tgt_value - tgt_field[i]) > 1e-3)
1769 PUT_ERR(
"wrong interpolation result");
1805 double src_coordinates_x[2][2] = {{-0.5,0.5}, {0.5,-0.5}};
1806 double src_coordinates_y[2][2] = {{89,90}, {90,89}};
1807 size_t const src_num_cells[2] = {1,1};
1808 size_t src_local_start[2] = {0,0};
1809 size_t src_local_count[2] = {1,1};
1810 yac_int src_reorder[2][2][4] =
1811 {{{0,1,2,3},{2,3,0,1}},{{1,0,3,2},{3,2,1,0}}};
1812 double tgt_coordinates_x[5] = {-0.5,-0.25,0.0,0.25,0.5};
1813 double tgt_coordinates_y[5] = {89.00,89.25,89.50,89.75,90.00};
1814 size_t const tgt_num_cells[2] = {4,4};
1815 size_t tgt_local_start[2] = {0,0};
1816 size_t tgt_local_count[2] = {4,4};
1818 for (
size_t i = 0;
i < 2 * 2; ++
i)
1819 (&(src_coordinates_x[0][0]))[
i] *=
YAC_RAD;
1820 for (
size_t i = 0;
i < 2 * 2; ++
i)
1821 (&(src_coordinates_y[0][0]))[
i] *=
YAC_RAD;
1822 for (
size_t i = 0;
i < 5; ++
i) tgt_coordinates_x[i] *=
YAC_RAD;
1823 for (
size_t i = 0;
i < 5; ++
i)
1824 (&(tgt_coordinates_y[0]))[
i] *=
YAC_RAD;
1826 for (
int order_x = 0; order_x < 2; ++order_x) {
1827 for (
int order_y = 0; order_y < 2; ++order_y) {
1833 utest_generate_basic_grid_data_reg2d(
1834 tgt_coordinates_x, tgt_coordinates_y,
1835 tgt_num_cells, tgt_local_start, tgt_local_count, 0);
1838 utest_generate_basic_grid_data_reg2d(
1839 src_coordinates_x[order_x],
1840 src_coordinates_y[order_y], src_num_cells,
1841 src_local_start, src_local_count, 0);
1848 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1862 vertex_coordinates,
grid_data.vertex_coordinates,
1863 grid_data.num_vertices *
sizeof(*vertex_coordinates));
1866 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) {
1867 if (fabs(1.0 - fabs(vertex_coordinates[i][2])) < 1e-9) {
1868 vertex_coordinates[
i][0] = 0.0;
1869 vertex_coordinates[
i][1] = 0.0;
1881 .masks_idx = SIZE_MAX}};
1882 size_t num_src_fields =
1883 sizeof(src_fields) /
sizeof(src_fields[0]);
1886 .masks_idx = SIZE_MAX};
1892 int partial_coverage = 0;
1913 double * ref_tgt_field = NULL;
1914 double ref_global_tgt_field[25];
1916 {{1.00, 0.00, 0.00, 0.00},
1917 {0.75, 0.25, 0.00, 0.00},
1918 {0.50, 0.50, 0.00, 0.00},
1919 {0.25, 0.75, 0.00, 0.00},
1920 {0.00, 1.00, 0.00, 0.00},
1921 {0.75, 0.00, 0.25, 0.00},
1922 {0.75, 0.00, 0.00, 0.25},
1923 {0.50, 0.25, 0.00, 0.25},
1924 {0.25, 0.50, 0.00, 0.25},
1925 {0.00, 0.75, 0.00, 0.25},
1926 {0.50, 0.00, 0.50, 0.00},
1927 {0.50, 0.00, 0.25, 0.25},
1928 {0.50, 0.00, 0.00, 0.50},
1929 {0.25, 0.25, 0.00, 0.50},
1930 {0.00, 0.50, 0.00, 0.50},
1931 {0.25, 0.00, 0.75, 0.00},
1932 {0.25, 0.00, 0.50, 0.25},
1933 {0.25, 0.00, 0.25, 0.50},
1934 {0.25, 0.00, 0.00, 0.75},
1935 {0.00, 0.25, 0.00, 0.75},
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},
1940 {0.00, 0.00, 0.50, 0.50}};
1942 for (
size_t j = 0; j < 25; ++j) {
1943 ref_global_tgt_field[j] =
1944 (double)(src_reorder[order_x][order_y][0] + 1) *
1946 (double)(src_reorder[order_x][order_y][1] + 1) *
1948 (double)(src_reorder[order_x][order_y][2] + 1) *
1950 (double)(src_reorder[order_x][order_y][3] + 1) *
1952 if (ref_global_tgt_field[j] == 0.0)
1953 ref_global_tgt_field[j] = -1.0;
1959 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1960 ref_tgt_field[i] = ref_global_tgt_field[i];
1963 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1964 src_field[i] = (
double)(
i) + 1.0;
1970 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1971 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1e-3)
1972 PUT_ERR(
"wrong interpolation result");
1976 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)
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)
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_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[]
double(* yac_coordinate_pointer)[3]