28static void utest_target_main(MPI_Comm target_comm);
29static void utest_source_main(MPI_Comm source_comm);
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");
49 int tgt_flag = comm_rank < 1;
52 MPI_Comm_split(MPI_COMM_WORLD, tgt_flag, 0, &
split_comm);
64static void utest_source_main(MPI_Comm source_comm) {
138 MPI_Comm_rank(source_comm, &my_source_rank);
140 double coordinates_x[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
141 double coordinates_y[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
143 size_t local_start[4][2] = {{0,0},{0,2},{3,2},{0,5}};
144 size_t local_count[4][2] = {{7,2},{3,3},{4,3},{7,2}};
146 int global_corner_mask[8][8] = {
159 utest_generate_basic_grid_data_reg2d(
161 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
163 int * src_corner_mask =
165 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
167 ((
int*)(&(global_corner_mask[0][0])))[
grid_data.vertex_ids[
i]];
180 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
182 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
224 .max_search_distance = 0.4 *
YAC_RAD}),
230 .max_search_distance = 1.3 *
YAC_RAD}),
238 .max_search_distance = 0.85 *
YAC_RAD}),
245 .max_search_distance = 0.85 *
YAC_RAD}),
247 enum {NUM_STACKS =
sizeof(method_stack) /
sizeof(method_stack[0])};
250 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
258 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
259 for (
size_t j = 0; j < 2; ++j) {
275 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
276 src_data[collection_idx][0] =
278 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
279 src_data[collection_idx][0][i] =
281 (
double)(collection_idx * 49);
288 free(src_data[collection_idx][0]);
289 free(src_data[collection_idx]);
299 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
400 MPI_Comm_rank(source_comm, &my_source_rank);
402 double coordinates_x[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
403 double coordinates_y[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
405 size_t local_start[4][2] = {{0,0},{0,2},{3,2},{0,5}};
406 size_t local_count[4][2] = {{7,2},{3,3},{4,3},{7,2}};
408 int global_corner_mask[8][8] = {
421 utest_generate_basic_grid_data_reg2d(
423 local_start[my_source_rank], local_count[my_source_rank],
with_halo);
425 int * src_corner_mask =
427 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
429 ((
int*)(&(global_corner_mask[0][0])))[
grid_data.vertex_ids[
i]];
442 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
444 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
466 for (
size_t i = 0;
i < 2; ++
i) {
470 weights, reorder_type[i], 1,
479 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
480 src_field[i] = (
double)(
grid_data.vertex_ids[
i]);
503 size_t local_start[2] = {0,0};
504 size_t local_count[2] = {3,3};
510 utest_generate_basic_grid_data_reg2d(
523 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
525 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
531 enum {NUM_STACKS = 1};
541 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
546 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
562 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
563 src_data[collection_idx][0] =
565 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
566 src_data[collection_idx][0][i] =
568 (
double)(collection_idx * 16);
575 free(src_data[collection_idx][0]);
576 free(src_data[collection_idx]);
585 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
599 size_t local_start[2] = {0,0};
600 size_t local_count[2] = {3,3};
606 utest_generate_basic_grid_data_reg2d(
619 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
621 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
627 enum {NUM_STACKS = 2};
644 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
649 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
665 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
666 src_data[collection_idx][0] =
668 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
669 src_data[collection_idx][0][i] =
671 (
double)(collection_idx * 16);
678 free(src_data[collection_idx][0]);
679 free(src_data[collection_idx]);
688 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
702 size_t local_start[2] = {0,0};
703 size_t local_count[2] = {3,3};
705 double edge_coordinates_x[] = {0.5,0.0,1.5,1.0,2.5,2.0,3.0,
706 0.5,0.0,1.5,1.0,2.5,2.0,3.0,
707 0.5,0.0,1.5,1.0,2.5,2.0,3.0,
709 double edge_coordinates_y[] = {0.0,0.5,0.0,0.5,0.0,0.5,0.5,
710 1.0,1.5,1.0,1.5,1.0,1.5,1.5,
711 2.0,2.5,2.0,2.5,2.0,2.5,2.5,
713 enum {num_edges =
sizeof(edge_coordinates_x) /
sizeof(edge_coordinates_x[0])};
715 xmalloc(num_edges *
sizeof(*edge_coordinates));
718 for (
size_t i = 0;
i < num_edges; ++
i)
720 edge_coordinates_x[i], edge_coordinates_y[i], edge_coordinates[i]);
723 utest_generate_basic_grid_data_reg2d(
738 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
740 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
746 enum {NUM_STACKS = 1};
756 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
761 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
777 src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
778 src_data[collection_idx][0] =
781 src_data[collection_idx][0][i] =
783 (
double)(collection_idx * 16);
790 free(src_data[collection_idx][0]);
791 free(src_data[collection_idx]);
800 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
809static double utest_compute_dist_result_(
810 size_t n,
size_t * src_indices,
size_t tgt_index,
811 double * src_coordinates_x,
double * src_coordinates_y,
size_t src_size_x,
812 double * tgt_coordinates_x,
double * tgt_coordinates_y,
size_t tgt_size_x) {
816 tgt_coordinates_x[tgt_index%tgt_size_x],
817 tgt_coordinates_y[tgt_index/tgt_size_x], tgt_coord);
820 double weights_sum = 0.0;
822 for (
size_t i = 0;
i <
n; ++
i) {
825 LLtoXYZ_deg(src_coordinates_x[src_indices[i]%src_size_x],
826 src_coordinates_y[src_indices[i]/src_size_x], src_coord);
829 result += weight * (double)src_indices[i];
830 weights_sum += weight;
832 return result / weights_sum;
835static double utest_compute_dist_result(
836 size_t n,
size_t * src_indices,
size_t tgt_index) {
839 utest_compute_dist_result_(
840 n, src_indices, tgt_index,
841 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},
842 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0}, 8,
843 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75},
844 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75}, 7);
847static double utest_compute_dist_result_2(
848 size_t n,
size_t * src_indices,
size_t tgt_index) {
851 utest_compute_dist_result_(
852 n, src_indices, tgt_index,
853 (
double[]){0.0,1.0,2.0,3.0},
854 (
double[]){0.0,1.0,2.0,3.0}, 4,
855 (
double[]){1.0,1.5,2.0},
856 (
double[]){1.0,1.5,2.0}, 3);
859static double utest_compute_dist_result_3(
860 size_t n,
size_t * src_indices,
size_t tgt_index) {
863 utest_compute_dist_result_(
864 n, src_indices, tgt_index,
865 (
double[]){0.0,1.0,2.0,3.0},
866 (
double[]){0.0,1.0,2.0,3.0}, 4,
867 (
double[]){1.0+90.0,1.5+90.0,2.0+90.0},
868 (
double[]){1.0,1.5,2.0}, 3);
871static double utest_compute_gauss_result_(
872 size_t n,
size_t * src_indices,
size_t tgt_index,
873 double * src_coordinates_x,
double * src_coordinates_y,
size_t src_size_x,
874 double * tgt_coordinates_x,
double * tgt_coordinates_y,
size_t tgt_size_x) {
878 for (
size_t i = 0;
i <
n; ++
i)
879 LLtoXYZ_deg(src_coordinates_x[src_indices[i]%src_size_x],
880 src_coordinates_y[src_indices[i]/src_size_x], src_coords[i]);
883 double src_distances_sum = 0.0;
884 for (
size_t i = 0;
i <
n; ++
i)
885 for (
size_t j = 0; j <
n; ++j)
888 size_t src_distance_count =
n *
n -
n;
891 double src_distance_mean = src_distances_sum / (double)src_distance_count;
892 double src_distance_mean_sq = src_distance_mean * src_distance_mean;
896 LLtoXYZ_deg(tgt_coordinates_x[tgt_index%tgt_size_x],
897 tgt_coordinates_y[tgt_index/tgt_size_x], tgt_coord);
899 for (
size_t i = 0;
i <
n; ++
i) {
902 exp(-1.0 * (tgt_distance * tgt_distance) /
907 double weights_sum = 0.0;
908 for (
size_t i = 0;
i <
n; ++
i) weights_sum += weights[i];
909 for (
size_t i = 0;
i <
n; ++
i) weights[i] /= weights_sum;
913 for (
size_t i = 0;
i <
n; ++
i)
914 result += weights[i] * (
double)src_indices[
i];
919static double utest_compute_gauss_result(
920 size_t n,
size_t * src_indices,
size_t tgt_index) {
923 utest_compute_gauss_result_(
924 n, src_indices, tgt_index,
925 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},
926 (
double[]){0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0}, 8,
927 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75},
928 (
double[]){0.75,1.75,2.75,3.75,4.75,5.75,6.75}, 7);
931static void utest_target_main(MPI_Comm target_comm) {
942 size_t local_start[2] = {0,0};
943 size_t local_count[2] = {7,7};
948 for (
size_t j = 0; j <
num_cells[0]; ++j, ++k)
953 utest_generate_basic_grid_data_reg2d(
968 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
970 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX};
1012 .max_search_distance = 0.4 *
YAC_RAD}),
1018 .max_search_distance = 1.3 *
YAC_RAD}),
1026 .max_search_distance = 0.85 *
YAC_RAD}),
1033 .max_search_distance = 0.85 *
YAC_RAD}),
1035 enum {NUM_STACKS =
sizeof(method_stack) /
sizeof(method_stack[0])};
1039 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1047 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1048 for (
size_t j = 0; j < 2; ++j) {
1059 double ref_tgt_field[][49] =
1060 {{8,10,11,12,13,14,15,
1061 17,17,19,20,21,22,23,
1062 25,26,26,28,29,30,31,
1063 33,34,35,35,37,38,39,
1064 41,42,43,44,44,46,47,
1065 49,50,51,52,53,53,55,
1066 57,58,59,60,61,62,62},
1067 {(1+8+10+16+17)/5.0,(1+2+10+11+17)/5.0,
1068 (2+3+10+11+12)/5.0,(3+4+11+12+13)/5.0,
1069 (4+5+12+13+14)/5.0,(5+6+13+14+15)/5.0,
1070 (6+7+14+15+23)/5.0,(8+16+17+24+25)/5.0,
1071 (10+17+19+25+26)/5.0,(10+11+19+20+26)/5.0,
1072 (11+12+19+20+21)/5.0,(12+13+20+21+22)/5.0,
1073 (13+14+21+22+23)/5.0,(14+15+22+23+31)/5.0,
1074 (16+17+24+25+26)/5.0,(17+19+25+26+34)/5.0,
1075 (19+20+26+28+35)/5.0,(19+20+21+28+29)/5.0,
1076 (20+21+28+29+30)/5.0,(21+22+29+30+31)/5.0,
1077 (22+23+30+31+39)/5.0,(24+25+32+33+34)/5.0,
1078 (25+26+33+34+35)/5.0,(26+28+34+35+43)/5.0,
1079 (28+29+35+37+44)/5.0,(28+29+30+37+38)/5.0,
1080 (29+30+37+38+39)/5.0,(30+31+38+39+47)/5.0,
1081 (32+33+40+41+42)/5.0,(33+34+41+42+43)/5.0,
1082 (34+35+42+43+44)/5.0,(35+37+43+44+52)/5.0,
1083 (37+38+44+46+53)/5.0,(37+38+39+46+47)/5.0,
1084 (38+39+46+47+55)/5.0,(40+41+48+49+50)/5.0,
1085 (41+42+49+50+51)/5.0,(42+43+50+51+52)/5.0,
1086 (43+44+51+52+53)/5.0,(44+46+52+53+61)/5.0,
1087 (46+47+53+55+62)/5.0,(46+47+53+55+62)/5.0,
1088 (48+49+56+57+58)/5.0,(49+50+57+58+59)/5.0,
1089 (50+51+58+59+60)/5.0,(51+52+59+60+61)/5.0,
1090 (52+53+60+61+62)/5.0,(53+55+60+61+62)/5.0,
1091 (47+53+55+61+62)/5.0},
1092 {utest_compute_dist_result(5, (
size_t[]){1,8,10,16,17}, 0),
1093 utest_compute_dist_result(5, (
size_t[]){1,2,10,11,17}, 1),
1094 utest_compute_dist_result(5, (
size_t[]){2,3,10,11,12}, 2),
1095 utest_compute_dist_result(5, (
size_t[]){3,4,11,12,13}, 3),
1096 utest_compute_dist_result(5, (
size_t[]){4,5,12,13,14}, 4),
1097 utest_compute_dist_result(5, (
size_t[]){5,6,13,14,15}, 5),
1098 utest_compute_dist_result(5, (
size_t[]){6,7,14,15,23}, 6),
1099 utest_compute_dist_result(5, (
size_t[]){8,16,17,24,25}, 7),
1100 utest_compute_dist_result(5, (
size_t[]){10,17,19,25,26}, 8),
1101 utest_compute_dist_result(5, (
size_t[]){10,11,19,20,26}, 9),
1102 utest_compute_dist_result(5, (
size_t[]){11,12,19,20,21}, 10),
1103 utest_compute_dist_result(5, (
size_t[]){12,13,20,21,22}, 11),
1104 utest_compute_dist_result(5, (
size_t[]){13,14,21,22,23}, 12),
1105 utest_compute_dist_result(5, (
size_t[]){14,15,22,23,31}, 13),
1106 utest_compute_dist_result(5, (
size_t[]){16,17,24,25,26}, 14),
1107 utest_compute_dist_result(5, (
size_t[]){17,19,25,26,34}, 15),
1108 utest_compute_dist_result(5, (
size_t[]){19,20,26,28,35}, 16),
1109 utest_compute_dist_result(5, (
size_t[]){19,20,21,28,29}, 17),
1110 utest_compute_dist_result(5, (
size_t[]){20,21,28,29,30}, 18),
1111 utest_compute_dist_result(5, (
size_t[]){21,22,29,30,31}, 19),
1112 utest_compute_dist_result(5, (
size_t[]){22,23,30,31,39}, 20),
1113 utest_compute_dist_result(5, (
size_t[]){24,25,32,33,34}, 21),
1114 utest_compute_dist_result(5, (
size_t[]){25,26,33,34,35}, 22),
1115 utest_compute_dist_result(5, (
size_t[]){26,28,34,35,43}, 23),
1116 utest_compute_dist_result(5, (
size_t[]){28,29,35,37,44}, 24),
1117 utest_compute_dist_result(5, (
size_t[]){28,29,30,37,38}, 25),
1118 utest_compute_dist_result(5, (
size_t[]){29,30,37,38,39}, 26),
1119 utest_compute_dist_result(5, (
size_t[]){30,31,38,39,47}, 27),
1120 utest_compute_dist_result(5, (
size_t[]){32,33,40,41,42}, 28),
1121 utest_compute_dist_result(5, (
size_t[]){33,34,41,42,43}, 29),
1122 utest_compute_dist_result(5, (
size_t[]){34,35,42,43,44}, 30),
1123 utest_compute_dist_result(5, (
size_t[]){35,37,43,44,52}, 31),
1124 utest_compute_dist_result(5, (
size_t[]){37,38,44,46,53}, 32),
1125 utest_compute_dist_result(5, (
size_t[]){37,38,39,46,47}, 33),
1126 utest_compute_dist_result(5, (
size_t[]){38,39,46,47,55}, 34),
1127 utest_compute_dist_result(5, (
size_t[]){40,41,48,49,50}, 35),
1128 utest_compute_dist_result(5, (
size_t[]){41,42,49,50,51}, 36),
1129 utest_compute_dist_result(5, (
size_t[]){42,43,50,51,52}, 37),
1130 utest_compute_dist_result(5, (
size_t[]){43,44,51,52,53}, 38),
1131 utest_compute_dist_result(5, (
size_t[]){44,46,52,53,61}, 39),
1132 utest_compute_dist_result(5, (
size_t[]){46,47,53,55,62}, 40),
1133 utest_compute_dist_result(5, (
size_t[]){46,47,53,55,62}, 41),
1134 utest_compute_dist_result(5, (
size_t[]){48,49,56,57,58}, 42),
1135 utest_compute_dist_result(5, (
size_t[]){49,50,57,58,59}, 43),
1136 utest_compute_dist_result(5, (
size_t[]){50,51,58,59,60}, 44),
1137 utest_compute_dist_result(5, (
size_t[]){51,52,59,60,61}, 45),
1138 utest_compute_dist_result(5, (
size_t[]){52,53,60,61,62}, 46),
1139 utest_compute_dist_result(5, (
size_t[]){53,55,60,61,62}, 47),
1140 utest_compute_dist_result(5, (
size_t[]){47,53,55,61,62}, 48)},
1141 {utest_compute_gauss_result(5, (
size_t[]){1,8,10,16,17}, 0),
1142 utest_compute_gauss_result(5, (
size_t[]){1,2,10,11,17}, 1),
1143 utest_compute_gauss_result(5, (
size_t[]){2,3,10,11,12}, 2),
1144 utest_compute_gauss_result(5, (
size_t[]){3,4,11,12,13}, 3),
1145 utest_compute_gauss_result(5, (
size_t[]){4,5,12,13,14}, 4),
1146 utest_compute_gauss_result(5, (
size_t[]){5,6,13,14,15}, 5),
1147 utest_compute_gauss_result(5, (
size_t[]){6,7,14,15,23}, 6),
1148 utest_compute_gauss_result(5, (
size_t[]){8,16,17,24,25}, 7),
1149 utest_compute_gauss_result(5, (
size_t[]){10,17,19,25,26}, 8),
1150 utest_compute_gauss_result(5, (
size_t[]){10,11,19,20,26}, 9),
1151 utest_compute_gauss_result(5, (
size_t[]){11,12,19,20,21}, 10),
1152 utest_compute_gauss_result(5, (
size_t[]){12,13,20,21,22}, 11),
1153 utest_compute_gauss_result(5, (
size_t[]){13,14,21,22,23}, 12),
1154 utest_compute_gauss_result(5, (
size_t[]){14,15,22,23,31}, 13),
1155 utest_compute_gauss_result(5, (
size_t[]){16,17,24,25,26}, 14),
1156 utest_compute_gauss_result(5, (
size_t[]){17,19,25,26,34}, 15),
1157 utest_compute_gauss_result(5, (
size_t[]){19,20,26,28,35}, 16),
1158 utest_compute_gauss_result(5, (
size_t[]){19,20,21,28,29}, 17),
1159 utest_compute_gauss_result(5, (
size_t[]){20,21,28,29,30}, 18),
1160 utest_compute_gauss_result(5, (
size_t[]){21,22,29,30,31}, 19),
1161 utest_compute_gauss_result(5, (
size_t[]){22,23,30,31,39}, 20),
1162 utest_compute_gauss_result(5, (
size_t[]){24,25,32,33,34}, 21),
1163 utest_compute_gauss_result(5, (
size_t[]){25,26,33,34,35}, 22),
1164 utest_compute_gauss_result(5, (
size_t[]){26,28,34,35,43}, 23),
1165 utest_compute_gauss_result(5, (
size_t[]){28,29,35,37,44}, 24),
1166 utest_compute_gauss_result(5, (
size_t[]){28,29,30,37,38}, 25),
1167 utest_compute_gauss_result(5, (
size_t[]){29,30,37,38,39}, 26),
1168 utest_compute_gauss_result(5, (
size_t[]){30,31,38,39,47}, 27),
1169 utest_compute_gauss_result(5, (
size_t[]){32,33,40,41,42}, 28),
1170 utest_compute_gauss_result(5, (
size_t[]){33,34,41,42,43}, 29),
1171 utest_compute_gauss_result(5, (
size_t[]){34,35,42,43,44}, 30),
1172 utest_compute_gauss_result(5, (
size_t[]){35,37,43,44,52}, 31),
1173 utest_compute_gauss_result(5, (
size_t[]){37,38,44,46,53}, 32),
1174 utest_compute_gauss_result(5, (
size_t[]){37,38,39,46,47}, 33),
1175 utest_compute_gauss_result(5, (
size_t[]){38,39,46,47,55}, 34),
1176 utest_compute_gauss_result(5, (
size_t[]){40,41,48,49,50}, 35),
1177 utest_compute_gauss_result(5, (
size_t[]){41,42,49,50,51}, 36),
1178 utest_compute_gauss_result(5, (
size_t[]){42,43,50,51,52}, 37),
1179 utest_compute_gauss_result(5, (
size_t[]){43,44,51,52,53}, 38),
1180 utest_compute_gauss_result(5, (
size_t[]){44,46,52,53,61}, 39),
1181 utest_compute_gauss_result(5, (
size_t[]){46,47,53,55,62}, 40),
1182 utest_compute_gauss_result(5, (
size_t[]){46,47,53,55,62}, 41),
1183 utest_compute_gauss_result(5, (
size_t[]){48,49,56,57,58}, 42),
1184 utest_compute_gauss_result(5, (
size_t[]){49,50,57,58,59}, 43),
1185 utest_compute_gauss_result(5, (
size_t[]){50,51,58,59,60}, 44),
1186 utest_compute_gauss_result(5, (
size_t[]){51,52,59,60,61}, 45),
1187 utest_compute_gauss_result(5, (
size_t[]){52,53,60,61,62}, 46),
1188 utest_compute_gauss_result(5, (
size_t[]){53,55,60,61,62}, 47),
1189 utest_compute_gauss_result(5, (
size_t[]){47,53,55,61,62}, 48)},
1197 {-1,10,11,12,13,14,15,
1198 17,-1,19,20,21,22,23,
1199 25,26,-1,28,29,30,31,
1200 33,34,35,-1,37,38,39,
1201 41,42,43,44,-1,46,47,
1202 49,50,51,52,53,-1,55,
1203 57,58,59,60,61,62,-1},
1205 (2+3+10+11+12)/5.0,(3+4+11+12+13)/5.0,
1206 (4+5+12+13+14)/5.0,(5+6+13+14+15)/5.0,
1207 (6+7+14+15+23)/5.0,-1.0,
1209 (11+12+19+20+21)/5.0,(12+13+20+21+22)/5.0,
1210 (13+14+21+22+23)/5.0,(14+15+22+23+31)/5.0,
1211 (16+17+24+25+26)/5.0,-1.0,
1213 (20+21+28+29+30)/5.0,(21+22+29+30+31)/5.0,
1214 (22+23+30+31+39)/5.0,(24+25+32+33+34)/5.0,
1215 (25+26+33+34+35)/5.0,-1.0,
1217 (29+30+37+38+39)/5.0,(30+31+38+39+47)/5.0,
1218 (32+33+40+41+42)/5.0,(33+34+41+42+43)/5.0,
1219 (34+35+42+43+44)/5.0,-1.0,
1221 (38+39+46+47+55)/5.0,(40+41+48+49+50)/5.0,
1222 (41+42+49+50+51)/5.0,(42+43+50+51+52)/5.0,
1223 (43+44+51+52+53)/5.0,-1.0,
1225 (48+49+56+57+58)/5.0,(49+50+57+58+59)/5.0,
1226 (50+51+58+59+60)/5.0,(51+52+59+60+61)/5.0,
1227 (52+53+60+61+62)/5.0,-1.0,
1234 {(1+8)/2.0,(2+10)/2.0,(3+10+11)/3.0,
1235 (4+11+12)/3.0,(5+12+13)/3.0,(6+13+14)/3.0,
1237 (16+17)/2.0,(10+17)/2.0,(11+19)/2.0,
1238 (12+19+20)/3.0,(13+20+21)/3.0,(14+21+22)/3.0,
1240 (17+24+25)/3.0,(25+26)/2.0,(19+26)/2.0,
1241 (20+28)/2.0,(21+28+29)/3.0,(22+29+30)/3.0,
1243 (25+32+33)/3.0,(26+33+34)/3.0,(34+35)/2.0,
1244 (28+35)/2.0,(29+37)/2.0,(30+37+38)/3.0,
1246 (33+40+41)/3.0,(34+41+42)/3.0,(35+42+43)/3.0,
1247 (43+44)/2.0,(37+44)/2.0,(38+46)/2.0,
1249 (41+48+49)/3.0,(42+49+50)/3.0,(43+50+51)/3.0,
1250 (44+51+52)/3.0,(52+53)/2.0,(46+53)/2.0,
1252 (49+56+57)/3.0,(50+57+58)/3.0,(51+58+59)/3.0,
1253 (52+59+60)/3.0,(53+60+61)/3.0,(61+62)/2.0,
1258 {-1.0,-1.0,(3+10+11)/3.0,
1259 (4+11+12)/3.0,(5+12+13)/3.0,(6+13+14)/3.0,
1262 (12+19+20)/3.0,(13+20+21)/3.0,(14+21+22)/3.0,
1264 (17+24+25)/3.0,-1.0,-1.0,
1265 -1.0,(21+28+29)/3.0,(22+29+30)/3.0,
1267 (25+32+33)/3.0,(26+33+34)/3.0,-1.0,
1268 -1.0,-1.0,(30+37+38)/3.0,
1270 (33+40+41)/3.0,(34+41+42)/3.0,(35+42+43)/3.0,
1273 (41+48+49)/3.0,(42+49+50)/3.0,(43+50+51)/3.0,
1274 (44+51+52)/3.0,-1.0,-1.0,
1276 (49+56+57)/3.0,(50+57+58)/3.0,(51+58+59)/3.0,
1277 (52+59+60)/3.0,(53+60+61)/3.0,-1.0,
1283 tgt_data[collection_idx] =
1290 for (
size_t j = 0, offset = collection_idx * 49;
1292 if (ref_tgt_field[i][j] == -1.0) {
1293 if (tgt_data[collection_idx][j] != -1.0)
1294 PUT_ERR(
"wrong interpolation result (fallback)");
1296 if ((tgt_data[collection_idx][j] != 0.0) &&
1297 (fabs((ref_tgt_field[i][j] + (
double)offset) -
1298 tgt_data[collection_idx][j]) > 1e-9))
1299 PUT_ERR(
"wrong interpolation result");
1305 free(tgt_data[collection_idx]);
1314 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
1329 size_t local_start[2] = {0,0};
1330 size_t local_count[2] = {7,7};
1332 int global_cell_mask[7][7] = {
1343 for (
size_t j = 0; j <
num_cells[0]; ++j, ++k)
1348 utest_generate_basic_grid_data_reg2d(
1352 int * tgt_cell_mask =
1356 ((
int*)(&(global_cell_mask[0][0])))[
grid_data.cell_ids[
i]];
1371 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1373 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1394 for (
size_t i = 0;
i < 2; ++
i) {
1398 weights, reorder_type[i], 1,
1404 double ref_tgt_field[49] =
1405 {(0+1+8+49)/4.0,(0+1+8+6)/4.0,(0+1+8+6)/4.0,(1+6+7+15)/4.0,
1406 (1+6+7+15)/4.0,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1407 (0+1+8+49)/4.0,(0+1+8+49)/4.0,(0+1+8+6)/4.0,(1+6+7+15)/4.0,
1408 (1+6+7+15)/4.0,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1409 (8+1+0+49)/4.0,(8+1+0+49)/4.0,-1,-1,
1410 -1,(1+6+7+15)/4.0,(1+6+7+15)/4.0,
1411 (48+49+8+57)/4.0,(48+49+8+57)/4.0,-1,-1,
1412 -1,(6+7+15+49)/4.0,(6+7+15+49)/4.0,
1413 (48+49+56+57)/4.0,(48+49+56+57)/4.0,-1,-1,
1414 -1,(6+7+15+49)/4.0,(6+7+15+49)/4.0,
1415 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,
1416 (48+49+56+57)/4.0,(48+49+15+57)/4.0,(6+7+15+49)/4.0,
1417 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,(48+49+56+57)/4.0,
1418 (48+49+56+57)/4.0,(48+49+56+57)/4.0,(49+57+56+15)/4.0};
1422 for (
size_t j = 0; j <
grid_data.num_cells; ++j) tgt_field[j] = -1.0;
1426 for (
size_t j = 0; j <
grid_data.num_cells; ++j)
1427 if (fabs(ref_tgt_field[j] - tgt_field[j]) > 1e-9)
1428 PUT_ERR(
"wrong interpolation result");
1447 size_t local_start[2] = {0,0};
1448 size_t local_count[2] = {2,2};
1450 int global_corner_mask[3*3] = {1,0,1, 0,1,0, 1,0,1};
1455 utest_generate_basic_grid_data_reg2d(
1459 int * tgt_corner_mask =
1461 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1462 tgt_corner_mask[i] = global_corner_mask[
grid_data.vertex_ids[i]];
1475 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1477 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1483 enum {NUM_STACKS = 1};
1494 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1499 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1510 double ref_tgt_field[][3*3] =
1512 -2.0, utest_compute_dist_result_2(4, (
size_t[]){5,6,9,10}, 4),-2.0,
1518 tgt_data[collection_idx] =
1520 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1521 tgt_data[collection_idx][i] = -2.0;
1528 for (
size_t j = 0, offset = collection_idx * 16;
1530 if (ref_tgt_field[i][j] != -2.0) {
1532 (ref_tgt_field[i][j] + (
double)offset) -
1533 tgt_data[collection_idx][j]) > 1e-9))
1534 PUT_ERR(
"wrong interpolation result");
1536 if (tgt_data[collection_idx][j] != -2.0)
1537 PUT_ERR(
"wrong interpolation result");
1543 free(tgt_data[collection_idx]);
1551 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
1563 size_t local_start[2] = {0,0};
1564 size_t local_count[2] = {2,2};
1566 int global_corner_mask[3*3] = {1,0,1, 0,1,0, 1,0,1};
1571 utest_generate_basic_grid_data_reg2d(
1575 int * tgt_corner_mask =
1577 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1578 tgt_corner_mask[i] = global_corner_mask[
grid_data.vertex_ids[i]];
1591 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1593 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = 0};
1599 enum {NUM_STACKS = 2};
1617 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1622 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1633 double ref_tgt_field[][3*3] =
1634 {{utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 0),-2.0,
1635 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 2),
1636 -2.0, utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 4),-2.0,
1637 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 6),-2.0,
1638 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 8)},
1639 {utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 0),-2.0,
1640 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 2),
1641 -2.0, utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 4),-2.0,
1642 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 6),-2.0,
1643 utest_compute_dist_result_3(4, (
size_t[]){3,7,11,15}, 8)}};
1648 tgt_data[collection_idx] =
1650 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1651 tgt_data[collection_idx][i] = -2.0;
1658 for (
size_t j = 0, offset = collection_idx * 16;
1660 if (ref_tgt_field[i][j] != -2.0) {
1662 (ref_tgt_field[i][j] + (
double)offset) -
1663 tgt_data[collection_idx][j]) > 1e-9) ||
1664 (tgt_data[collection_idx][j] !=
1665 tgt_data[collection_idx][j]))
1666 PUT_ERR(
"wrong interpolation result");
1668 if (tgt_data[collection_idx][j] != -2.0)
1669 PUT_ERR(
"wrong interpolation result");
1675 free(tgt_data[collection_idx]);
1683 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
1695 size_t local_start[2] = {0,0};
1696 size_t local_count[2] = {2,2};
1702 utest_generate_basic_grid_data_reg2d(
1715 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1717 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
1723 enum {NUM_STACKS = 1};
1734 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1739 for (
size_t i = 0;
i < NUM_STACKS; ++
i) {
1750 double ref_tgt_field[][3*3] =
1751 {{(0+3+7+1)*0.25,(2+5+9+3)*0.25,(4+6+11+5)*0.25,
1752 (7+10+14+8)*0.25,(9+12+16+10)*0.25,(11+13+18+12)*0.25,
1753 (14+17+21+15)*0.25,(16+19+22+17)*0.25,(18+20+23+19)*0.25}};
1758 tgt_data[collection_idx] =
1760 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
1761 tgt_data[collection_idx][i] = -2.0;
1768 for (
size_t j = 0, offset = collection_idx * 16;
1770 if (ref_tgt_field[i][j] != -2.0) {
1772 (ref_tgt_field[i][j] + (
double)offset) -
1773 tgt_data[collection_idx][j]) > 1e-9) ||
1774 (tgt_data[collection_idx][j] !=
1775 tgt_data[collection_idx][j]))
1776 PUT_ERR(
"wrong interpolation result");
1778 if (tgt_data[collection_idx][j] != -2.0)
1779 PUT_ERR(
"wrong interpolation result");
1785 free(tgt_data[collection_idx]);
1793 for (
size_t i = 0;
i < NUM_STACKS; ++
i)
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
size_t yac_basic_grid_add_mask_nocpy(struct yac_basic_grid *grid, enum yac_location location, int const *mask, char const *mask_name)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
struct yac_dist_grid_pair * yac_dist_grid_pair_new(struct yac_basic_grid *grid_a, struct yac_basic_grid *grid_b, MPI_Comm comm)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
static double get_vector_angle(double const a[3], double const b[3])
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
struct yac_interp_grid * yac_interp_grid_new(struct yac_dist_grid_pair *grid_pair, char const *src_grid_name, char const *tgt_grid_name, size_t num_src_fields, struct yac_interp_field const *src_fields, struct yac_interp_field const tgt_field)
void yac_interp_method_delete(struct interp_method **method)
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_fixed_new(double value)
struct interp_method * yac_interp_method_nnn_new(struct yac_interp_method_nnn_config config)
@ YAC_INTERP_NNN_GAUSS
distance with Gauss weights of n source points
@ YAC_INTERP_NNN_AVG
average of n source points
@ YAC_INTERP_NNN_DIST
distance weighted average of n source points
@ YAC_INTERP_NNN_ZERO
all weights are set to zero
#define YAC_INTERP_NNN_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_NNN_GAUSS_SCALE_DEFAULT
#define YAC_INTERP_NNN_N_MIN_DEFAULT
a value of 0 is interpreted as "use the value of n"
struct yac_interpolation * yac_interp_weights_get_interpolation(struct yac_interp_weights *weights, enum yac_interp_weights_reorder_type reorder, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, int is_source, int is_target)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
yac_interp_weights_reorder_type
@ YAC_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be applied at source processes
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
double const YAC_FRAC_MASK_NO_VALUE
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
static MPI_Comm split_comm
char const src_grid_name[]
char const tgt_grid_name[]
double cell_coordinates_y[]
double cell_coordinates_x[]
double(* yac_coordinate_pointer)[3]