21#define TEST_GROUP_START() \
22 {++test_major_idx; test_minor_idx = 0;}
23#define TEST_START(DESC) \
26 printf("%d.%d) %s\n", test_major_idx, test_minor_idx, (DESC)); \
31 unsigned num_ref_cells);
35static void utest_check_weight_correction(
36 double * weights,
size_t count,
double *
ref_weights);
54 int test_major_idx = 0, test_minor_idx;
57 TEST_START(
"clipping with an empty source cell");
60 {utest_generate_cell_deg(NULL, NULL,
gc_edges, 0)};
62 utest_generate_cell_deg(
63 (
double[]){0.0, 0.5, 0.0, -0.5},
64 (
double[]){-0.5, 0.0, 0.7, 0.0},
gc_edges, 4);
66 if (utest_compare_cells(overlap_cell[0], SourceCells[0]))
67 PUT_ERR(
"ERROR: wrong clipping cell\n");
74 TEST_START(
"Simple test case with two quadrangle");
103 double intersection[3], intersection_lon, intersection_lat;
105 if (!utest_intersect(
109 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
116 utest_generate_cell_deg(
117 (
double[]){0.0, 0.5, 0.0, -0.5},
118 (
double[]){-0.5, 0.0, 0.7, 0.0},
gc_edges, 4),
119 utest_generate_cell_deg(
120 (
double[]){0.0, 0.6, 0.0, -0.6},
121 (
double[]){0.6, 0.0, -0.6, 0.0},
gc_edges, 4)},
124 utest_generate_cell_deg(
125 (
double[]){0.0, intersection_lon, 0.5, 0.0, -0.5, -intersection_lon},
126 (
double[]){0.6, intersection_lat, 0.0, -0.5, 0.0, intersection_lat},
gc_edges, 6)},
132 TEST_START(
"Simple test case with one quadrangle and one triangle");
159 double intersection[3], intersection_lon, intersection_lat;
160 if (!utest_intersect(
164 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
171 utest_generate_cell_deg(
172 (
double[]){ 0.0,-0.5,0.0,0.5},
173 (
double[]){-0.5,0.0,0.7,0.0},
gc_edges, 4),
174 utest_generate_cell_deg(
175 (
double[]){0.6,0.0,-0.6},
176 (
double[]){0.0,0.6,0.0},
gc_edges, 3)},
179 utest_generate_cell_deg(
180 (
double[]){0.0,intersection_lon,0.5,-0.5,-intersection_lon},
181 (
double[]){0.6,intersection_lat,0.0,0.0,intersection_lat},
187 TEST_START(
"Simple test case with one quadrangle and one triangle");
214 double intersection[2][3], intersection_lon[2], intersection_lat[2];
216 if (!utest_intersect(
220 if (!utest_intersect(
224 for (
int i = 0;
i < 2; ++
i) {
225 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
233 utest_generate_cell_deg(
234 (
double[]){0.0,-0.5,0.0,0.5},
235 (
double[]){-0.5,0.0,0.7,0.0},
gc_edges, 4),
236 utest_generate_cell_deg(
237 (
double[]){1.0,0.6,0.0},
238 (
double[]){0.1,0.6,0.1},
gc_edges, 3)},
241 utest_generate_cell_deg(
242 (
double[]){0.0,intersection_lon[0],intersection_lon[1]},
243 (
double[]){0.1,intersection_lat[0],intersection_lat[1]},
249 TEST_START(
"Simple test case with one quadrangle and one triangle");
276 double intersection[2][3], intersection_lon[2], intersection_lat[2];
278 if (!utest_intersect(
282 if (!utest_intersect(
286 for (
int i = 0;
i < 2; ++
i) {
287 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
295 utest_generate_cell_deg(
296 (
double[]){0.0,-0.5,0.0,0.5},
297 (
double[]){-0.5,0.0,0.7,0.0},
gc_edges, 4),
298 utest_generate_cell_deg(
299 (
double[]){0.5,0.0,-0.5},
300 (
double[]){0.1,0.6,0.1},
gc_edges, 3)},
303 utest_generate_cell_deg(
304 (
double[]){0.0,intersection_lon[0], intersection_lon[1],
305 -intersection_lon[1],-intersection_lon[0]},
306 (
double[]){0.6,intersection_lat[0],intersection_lat[1],
307 intersection_lat[1],intersection_lat[0]},
gc_edges, 5)},
313 TEST_START(
"Two source cells overlapping one target cell");
349 double intersection[3], intersection_lon, intersection_lat;
350 if (!utest_intersect(
354 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
359 utest_generate_cell_deg(
360 (
double[]){0.0,intersection_lon,0.5,-0.5,-intersection_lon},
361 (
double[]){0.5,intersection_lat,0.0,0.0,intersection_lat},
363 utest_generate_cell_deg(
364 (
double[]){0.0,-intersection_lon,-0.5,0.5,intersection_lon},
365 (
double[]){-0.5,-intersection_lat,0.0,0.0,-intersection_lat},
368 for (
int src_order_a = -1; src_order_a <= 1; src_order_a += 2) {
369 for (
int src_order_b = -1; src_order_b <= 1; src_order_b += 2) {
370 for (
int tgt_order = -1; tgt_order <= 1; tgt_order += 2) {
371 for (
int src_start_a = 0; src_start_a < 3; ++src_start_a) {
372 for (
int src_start_b = 0; src_start_b < 3; ++src_start_b) {
373 for (
int tgt_start = 0; tgt_start < 4; ++tgt_start) {
376 utest_generate_cell_deg(
377 (
double[]){0.6,0.0,-0.6},
378 (
double[]){0.0,0.5,0.0},
gc_edges, 3),
379 utest_generate_cell_deg(
380 (
double[]){0.6,-0.6,0.0},
381 (
double[]){0.0,0.0,-0.5},
gc_edges, 3)};
383 utest_generate_cell_deg(
384 (
double[]){0.5,0.0,-0.5,0.0},
385 (
double[]){0.0,0.7,0.0,-0.7},
gc_edges, 4);
388 if (utest_compare_cells(overlap_cell[0], ref_cells[0]) ||
389 utest_compare_cells(overlap_cell[1], ref_cells[1]))
390 PUT_ERR(
"ERROR: wrong clipping cell\n");
441 utest_generate_cell_deg(
442 (
double[]){0.0,0.6,-0.6},
443 (
double[]){0.5,0.0,0.0},
gc_edges, 3),
444 utest_generate_cell_deg(
445 (
double[]){0.0,0.6,-0.6},
446 (
double[]){-0.5,0.0,0.0},
gc_edges, 3)};
448 for (
int src_order_a = -1; src_order_a <= 1; src_order_a += 2) {
449 for (
int src_order_b = -1; src_order_b <= 1; src_order_b += 2) {
450 for (
int tgt_order = -1; tgt_order <= 1; tgt_order += 2) {
451 for (
int src_start_a = 0; src_start_a < 3; ++src_start_a) {
452 for (
int src_start_b = 0; src_start_b < 3; ++src_start_b) {
453 for (
int tgt_start = 0; tgt_start < 4; ++tgt_start) {
456 utest_generate_cell_deg(
457 (
double[]){0.6,0.0,-0.6},
458 (
double[]){0.0,0.5,0.0},
gc_edges, 3),
459 utest_generate_cell_deg(
460 (
double[]){0.6,-0.6,0.0},
461 (
double[]){0.0,0.0,-0.5},
gc_edges, 3)};
463 utest_generate_cell_deg(
464 (
double[]){0.0,-0.6,0.0,0.6},
465 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4);
468 if (utest_compare_cells(overlap_cell[0], ref_cells[0]) ||
469 utest_compare_cells(overlap_cell[1], ref_cells[1]))
470 PUT_ERR(
"ERROR: wrong clipping cell\n");
520 utest_generate_cell_deg(
521 (
double[]){0.0,-0.6,0.0,0.6},
522 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4),
523 utest_generate_cell_deg(
524 (
double[]){0.0,-0.6,0.0,0.6},
525 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
528 utest_generate_cell_deg(
529 (
double[]){0.0,-0.6,0.0,0.6},
530 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
535 TEST_START(
"Simple cases: source inside target cell");
569 utest_generate_cell_deg(
570 (
double[]){0.0,-0.5,0.0,0.5},
571 (
double[]){0.4,0.0,-0.4,0.0},
gc_edges, 4),
572 utest_generate_cell_deg(
573 (
double[]){0.0,-0.6,0.0,0.6},
574 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
577 utest_generate_cell_deg(
578 (
double[]){0.0,-0.5,0.0,0.5},
579 (
double[]){0.4,0.0,-0.4,0.0},
gc_edges, 4)},
584 TEST_START(
"Simple cases: target inside source cell");
618 utest_generate_cell_deg(
619 (
double[]){0.0,-0.7,0.0,0.7},
620 (
double[]){0.6,0.0,-0.6,0.0},
gc_edges, 4),
621 utest_generate_cell_deg(
622 (
double[]){0.0,-0.6,0.0,0.6},
623 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
626 utest_generate_cell_deg(
627 (
double[]){0.0,-0.6,0.0,0.6},
628 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
666 utest_generate_cell_deg(
667 (
double[]){0.0,0.6,1.0,0.5},
668 (
double[]){0.5,0.0,0.0,0.5},
gc_edges, 4),
669 utest_generate_cell_deg(
670 (
double[]){0.0,-0.6,0.0,0.6},
671 (
double[]){0.5,0.0,-0.5,0.0},
gc_edges, 4)},
674 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
703 double intersection[4][3], intersection_lon[4], intersection_lat[4];
705 if (!utest_intersect(
709 if (!utest_intersect(
713 if (!utest_intersect(
717 if (!utest_intersect(
721 for (
int i = 0;
i < 4; ++
i) {
722 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
730 utest_generate_cell_deg(
731 (
double[]){90.0,112.5,112.5,90.0},
732 (
double[]){-22.5,-22.5,0.0,0.0},
gc_edges, 4),
733 utest_generate_cell_deg(
734 (
double[]){108.0000,88.4979,108.0000},
735 (
double[]){-7.2167,-19.2921,-26.5650},
gc_edges, 3)},
738 utest_generate_cell_deg(
743 intersection_lon[3]},
748 intersection_lat[3]},
gc_edges, 5)},
776 double intersection[4][3], intersection_lon[4], intersection_lat[4];
778 if (!utest_intersect(
782 if (!utest_intersect(
786 if (!utest_intersect(
790 if (!utest_intersect(
794 for (
int i = 0;
i < 4; ++
i) {
795 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
803 utest_generate_cell_deg(
804 (
double[]){-0.5,0.5,0.5,-0.5},
805 (
double[]){-0.5,-0.5,0.5,0.5},
gc_edges, 4),
806 utest_generate_cell_deg(
807 (
double[]){0.0,-0.75,0.0},
808 (
double[]){0.0,0.0,-0.75},
gc_edges, 3)},
811 utest_generate_cell_deg(
816 intersection_lon[3]},
821 intersection_lat[3]},
gc_edges, 5)},
827 TEST_START(
"Special case in which no corner on any square is within the other");
852 double intersection[3], intersection_lon[8], intersection_lat[8];
853 double src_data[2][4] = {{-0.5,-0.5, 0.5, 0.5},
854 { 0.5,-0.5,-0.5, 0.5}};
855 double tgt_data[2][4] = {{ 0.0,-0.7, 0.0, 0.7},
856 { 0.7, 0.0,-0.7, 0.0}};
858 for (
int i = 0;
i < 8; ++
i) {
859 if (!utest_intersect(
862 src_data[0][(i/2+1)%4],
863 src_data[1][(i/2+1)%4],
865 tgt_data[1][((i+1)/2)%4],
866 tgt_data[0][((i+1)/2+1)%4],
867 tgt_data[1][((i+1)/2+1)%4], intersection))
869 XYZtoLL(intersection, &intersection_lon[i], &intersection_lat[i]);
877 utest_generate_cell_deg(
878 (
double[]){-0.5,0.5,0.5,-0.5},
879 (
double[]){-0.5,-0.5,0.5,0.5},
gc_edges, 4),
880 utest_generate_cell_deg(
881 (
double[]){0.0,0.7,0.0,-0.7},
882 (
double[]){-0.7,0.0,0.7,0.0},
gc_edges, 4)},
885 utest_generate_cell_deg(intersection_lon, intersection_lat,
gc_edges, 8)},
916 utest_generate_cell_deg(
917 (
double[]){0.0,1.0,1.0,0.0},
918 (
double[]){0.0,0.0,1.0,1.0},
gc_edges, 4),
919 utest_generate_cell_deg(
920 (
double[]){2.0,3.0,3.0,2.0},
921 (
double[]){0.0,0.0,1.0,1.0},
gc_edges, 4)},
923 (
struct yac_grid_cell[]){utest_generate_cell_deg(NULL, NULL, NULL, 0)},
953 utest_generate_cell_deg(
954 (
double[]){0.0,1.0,1.0,0.0},
955 (
double[]){0.0,0.0,1.0,1.0},
gc_edges, 4),
956 utest_generate_cell_deg(
957 (
double[]){1.0,2.0,2.0,1.0},
958 (
double[]){2.0,2.0,3.0,3.0},
gc_edges, 4)},
960 (
struct yac_grid_cell[]){utest_generate_cell_deg(NULL, NULL, NULL, 0)},
988 double intersection[2][3], intersection_lon[2], intersection_lat[2];
990 if (!utest_intersect(
994 if (!utest_intersect(
998 for (
int i = 0;
i < 2; ++
i) {
999 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1007 utest_generate_cell_deg(
1008 (
double[]){1.5,-1.5,0.0},
1009 (
double[]){0.5,0.5,-0.5},
gc_edges, 3),
1010 utest_generate_cell_deg(
1011 (
double[]){-1.0,1.0,1.0,-1.0},
1012 (
double[]){-1.0,-1.0,1.0,1.0},
gc_edges, 4)},
1015 utest_generate_cell_deg(
1017 intersection_lon[0],
1018 intersection_lon[1],
1019 -intersection_lon[1],
1020 -intersection_lon[0]},
1022 intersection_lat[0],
1023 intersection_lat[1],
1024 intersection_lat[1],
1025 intersection_lat[0]},
gc_edges, 5)},
1031 TEST_START(
"touching edges of two triangles");
1055 utest_generate_cell_deg(
1056 (
double[]){0.0,2.0,1.0},
1057 (
double[]){0.0,0.0,1.0},
gc_edges, 3),
1058 utest_generate_cell_deg(
1059 (
double[]){0.0,1.0, 0.5},
1060 (
double[]){0.0,0.0,-0.5},
gc_edges, 3)},
1063 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
1073 utest_generate_cell_deg(
1074 (
double[]){160.0,180.0,180.0},
1075 (
double[]){ 65.0, 65.0, 90.0},
gc_edges, 3),
1076 utest_generate_cell_deg(
1077 (
double[]){180.0,200.0, 0.0},
1078 (
double[]){ 70.0, 70.0, 90.0},
gc_edges, 3)},
1081 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
1087 TEST_START(
"test from test_interpolation_method_conserv.x");
1111 utest_generate_cell_deg(
1112 (
double[]){ 0.0, 1.0,1.0,0.0},
1114 utest_generate_cell_deg(
1115 (
double[]){-0.5, 0.5,0.5,-0.5},
1119 utest_generate_cell_deg(
1120 (
double[]){0.0,0.5, 0.5, 0.0},
1126 TEST_START(
"test from test_interpolation_method_conserv.x");
1150 utest_generate_cell_deg(
1151 (
double[]){ 0.0,-1.0,-1.0,0.0},
1153 utest_generate_cell_deg(
1154 (
double[]){-0.5, 0.5,0.5,-0.5},
1158 utest_generate_cell_deg(
1159 (
double[]){0.0,-0.5,-0.5, 0.0},
1188 double intersection[3], intersection_lon, intersection_lat;
1190 if (!utest_intersect(
1193 return EXIT_FAILURE;
1194 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
1201 utest_generate_cell_deg(
1202 (
double[]){-20.0,20.0,20.0,-20.0},
1204 utest_generate_cell_deg(
1205 (
double[]){-20.0, 0.0,20.0},
1206 (
double[]){ 39.0,22.0,39.0},
gc_edges, 3)},
1209 utest_generate_cell_deg(
1210 (
double[]){intersection_lon,-intersection_lon},
1211 (
double[]){intersection_lat,intersection_lat},
1214 utest_generate_cell_deg(
1215 (
double[]){intersection_lon,-intersection_lon},
1216 (
double[]){intersection_lat,intersection_lat},
1245 double intersection[3], intersection_lon, intersection_lat;
1247 if (!utest_intersect(
1250 return EXIT_FAILURE;
1251 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
1258 utest_generate_cell_deg(
1259 (
double[]){-20.0,20.0,20.0,-20.0},
1261 utest_generate_cell_deg(
1262 (
double[]){-20.0, 0.0,20.0},
1263 (
double[]){ 40.0,22.0,39.0},
gc_edges, 3)},
1266 utest_generate_cell_deg(
1267 (
double[]){-20.0,intersection_lon},
1268 (
double[]){ 40.0,intersection_lat},
1271 utest_generate_cell_deg(
1272 (
double[]){-20.0,intersection_lon},
1273 (
double[]){ 40.0,intersection_lat},
1302 double intersection[2][3], intersection_lon[2], intersection_lat[2];
1304 if (!utest_intersect(
1307 return EXIT_FAILURE;
1308 if (!utest_intersect(
1311 return EXIT_FAILURE;
1312 for (
int i = 0;
i < 2; ++
i) {
1313 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1321 utest_generate_cell_deg(
1322 (
double[]){-20.0,20.0,20.0,-20.0},
1324 utest_generate_cell_deg(
1325 (
double[]){-19.0, 0.0,19.0},
1326 (
double[]){ 59.0,80.0,59.0},
gc_edges, 3)},
1329 utest_generate_cell_deg(
1330 (
double[]){19.0,intersection_lon[0],
1331 fabs(intersection_lon[1]),
1332 -fabs(intersection_lon[1]),
1333 -intersection_lon[0],-19.0},
1334 (
double[]){59.0,60.0,60.0,60.0,60.0,59.0},
1338 utest_generate_cell_deg(
1339 (
double[]){19.0,intersection_lon[0],-intersection_lon[0],
1340 -19.0,-fabs(intersection_lon[1]),fabs(intersection_lon[1])},
1341 (
double[]){59.0,60.0,60.0,59.0,60.0,60.0},
1372 double intersection[2][3], intersection_lon[2], intersection_lat[2];
1374 if (!utest_intersect(
1377 return EXIT_FAILURE;
1378 if (!utest_intersect(
1381 return EXIT_FAILURE;
1382 for (
int i = 0;
i < 2; ++
i) {
1383 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1391 utest_generate_cell_deg(
1392 (
double[]){-20.0,20.0,20.0,-20.0},
1394 utest_generate_cell_deg(
1395 (
double[]){-20.0,21.0,21.0},
1396 (
double[]){ 60.0,80.0,59.0},
gc_edges, 3)},
1399 utest_generate_cell_deg(
1400 (
double[]){20.0,intersection_lon[0],intersection_lon[1]},
1401 (
double[]){60.0,intersection_lat[0],intersection_lat[1]},
1404 utest_generate_cell_deg(
1405 (
double[]){20.0,intersection_lon[0],-20.0,intersection_lon[1]},
1406 (
double[]){60.0,intersection_lat[0], 60.0,intersection_lat[1]},
1438 double intersection[3][3], intersection_lon[3], intersection_lat[3];
1440 if (!utest_intersect(
1443 return EXIT_FAILURE;
1444 if (!utest_intersect(
1447 return EXIT_FAILURE;
1448 if (!utest_intersect(
1451 return EXIT_FAILURE;
1452 for (
int i = 0;
i < 3; ++
i) {
1453 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1461 utest_generate_cell_deg(
1462 (
double[]){-20.0,20.0,20.0,-20.0},
1464 utest_generate_cell_deg(
1465 (
double[]){-20.0,21.0,21.0},
1466 (
double[]){ 60.0,40.0,59.0},
gc_edges, 3)},
1469 utest_generate_cell_deg(
1470 (
double[]){intersection_lon[0],intersection_lon[1],
1471 intersection_lon[2],-20.0},
1472 (
double[]){intersection_lat[0],intersection_lat[1],
1473 intersection_lat[2], 60.0},
1503 double intersection[3], intersection_lon, intersection_lat;
1505 if (!utest_intersect(
1508 return EXIT_FAILURE;
1509 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
1516 utest_generate_cell_deg(
1517 (
double[]){intersection_lon,intersection_lon+40.0,
1518 intersection_lon+40.0,intersection_lon},
1520 utest_generate_cell_deg(
1521 (
double[]){-20.0,20.0, 0.0},
1522 (
double[]){ 39.0,39.0,20.0},
gc_edges, 3)},
1525 utest_generate_cell_deg(
1526 (
double[]){intersection_lon,-intersection_lon},
1527 (
double[]){40.0,40.0},
1530 utest_generate_cell_deg(
1531 (
double[]){intersection_lon,-intersection_lon},
1532 (
double[]){40.0,40.0},
1561 double intersection[3][3], intersection_lon[3], intersection_lat[3];
1563 if (!utest_intersect(
1566 return EXIT_FAILURE;
1567 if (!utest_intersect(
1570 return EXIT_FAILURE;
1571 for (
int i = 0;
i < 2; ++
i) {
1572 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1576 if (!utest_intersect(
1579 intersection_lon[0],60.0, intersection[2]))
1580 return EXIT_FAILURE;
1581 XYZtoLL(intersection[2], &intersection_lon[2], &intersection_lat[2]);
1582 intersection_lon[2] /=
YAC_RAD;
1583 intersection_lat[2] /=
YAC_RAD;
1588 utest_generate_cell_deg(
1589 (
double[]){intersection_lon[0],
1590 intersection_lon[0]+40.0,
1591 intersection_lon[0]+40.0,
1592 intersection_lon[0]},
1594 utest_generate_cell_deg(
1595 (
double[]){-20.0,20.0,-20.0},
1596 (
double[]){ 39.0,39.0, 50.0},
gc_edges, 3)},
1599 utest_generate_cell_deg(
1600 (
double[]){intersection_lon[0],-intersection_lon[0],
1601 intersection_lon[1],intersection_lon[2]},
1602 (
double[]){40.0,40.0,40.0,intersection_lat[2]},
1635 utest_generate_cell_deg(
1636 (
double[]){-20.0,20.0,20.0,-20.0},
1638 utest_generate_cell_deg(
1639 (
double[]){-20.0, 0.0,20.0},
1640 (
double[]){ 40.0,20.0,40.0},
gc_edges, 3)},
1643 utest_generate_cell_deg(
1644 (
double[]){-20.0,20.0},
1645 (
double[]){ 40.0,40.0},
1648 utest_generate_cell_deg(
1649 (
double[]){-20.0,20.0},
1650 (
double[]){ 40.0,40.0},
1682 utest_generate_cell_deg(
1683 (
double[]){-20.0,20.0,20.0,-20.0},
1685 utest_generate_cell_deg(
1686 (
double[]){-20.0, 0.0,20.0},
1687 (
double[]){ 40.0,50.0,40.0},
gc_edges, 3)},
1690 utest_generate_cell_deg(
1691 (
double[]){-20.0,20.0,0.0},
1692 (
double[]){40.0,40.0,50.0},
1725 utest_generate_cell_deg(
1726 (
double[]){-20.0,20.0,20.0,-20.0},
1728 utest_generate_cell_deg(
1729 (
double[]){-20.0, 0.0,20.0},
1730 (
double[]){ 60.0,50.0,60.0},
gc_edges, 3)},
1733 utest_generate_cell_deg(
1734 (
double[]){-20.0,20.0,0.0},
1735 (
double[]){60.0,60.0,50.0},
1768 utest_generate_cell_deg(
1769 (
double[]){-20.0,20.0,20.0,-20.0},
1771 utest_generate_cell_deg(
1772 (
double[]){-20.0, 0.0,20.0},
1773 (
double[]){ 60.0,70.0,60.0},
gc_edges, 3)},
1776 utest_generate_cell_deg(
1777 (
double[]){-20.0,20.0},
1778 (
double[]){60.0,60.0},
1781 utest_generate_cell_deg(
1782 (
double[]){-20.0,20.0},
1783 (
double[]){60.0,60.0},
1815 utest_generate_cell_deg(
1816 (
double[]){-20.0,20.0,20.0,-20.0},
1818 utest_generate_cell_deg(
1819 (
double[]){-20.0, 0.0,20.0},
1820 (
double[]){-40.0,-50.0,-40.0},
gc_edges, 3)},
1823 utest_generate_cell_deg(
1824 (
double[]){-20.0,20.0,0.0},
1825 (
double[]){-40.0,-40.0,-50.0},
gc_edges, 3)},
1852 double intersection[3], intersection_lon, intersection_lat;
1854 if (!utest_intersect(
1857 return EXIT_FAILURE;
1858 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
1865 utest_generate_cell_deg(
1866 (
double[]){-20.0,20.0,20.0,-20.0},
1868 utest_generate_cell_deg(
1869 (
double[]){-15.0, 0.0,15.0},
1870 (
double[]){59.0,45.0,60.0},
gc_edges, 3)},
1873 utest_generate_cell_deg(
1874 (
double[]){intersection_lon,15.0,0.0,-15.0},
1875 (
double[]){intersection_lat,60.0,45.0,59.0},
1902 double intersection[2][3], intersection_lon[2], intersection_lat[2];
1904 if (!utest_intersect(
1907 return EXIT_FAILURE;
1908 if (!utest_intersect(
1911 return EXIT_FAILURE;
1912 for (
int i = 0;
i < 2; ++
i) {
1913 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1921 utest_generate_cell_deg(
1922 (
double[]){-20.0,20.0,20.0,-20.0},
1924 utest_generate_cell_deg(
1925 (
double[]){-20.0, 0.0,20.0},
1926 (
double[]){58.5,40.0,58.5},
gc_edges, 3)},
1929 utest_generate_cell_deg(
1930 (
double[]){ intersection_lon[0],
1931 intersection_lon[1],
1932 -intersection_lon[1],
1933 -intersection_lon[0]},
1934 (
double[]){59.0,60.0,60.0,59.0},
1964 double intersection[2][3], intersection_lon[2], intersection_lat[2];
1966 if (!utest_intersect(
1969 return EXIT_FAILURE;
1970 if (!utest_intersect(
1973 return EXIT_FAILURE;
1974 for (
int i = 0;
i < 2; ++
i) {
1975 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
1983 utest_generate_cell_deg(
1984 (
double[]){-20.0,20.0,20.0,-20.0},
1986 utest_generate_cell_deg(
1987 (
double[]){-20.0, 0.0,20.0},
1988 (
double[]){59.0,80.0,59.0},
gc_edges, 3)},
1991 utest_generate_cell_deg(
1992 (
double[]){20.0,intersection_lon[0],
1993 fabs(intersection_lon[1]),
1994 -fabs(intersection_lon[1]),
1995 -intersection_lon[0],-20.0},
1996 (
double[]){59.0,60.0,60.0,60.0,60.0,59.0},
2000 utest_generate_cell_deg(
2001 (
double[]){20.0,intersection_lon[0],
2002 -intersection_lon[0],-20.0,
2003 -fabs(intersection_lon[1]),
2004 fabs(intersection_lon[1])},
2005 (
double[]){59.0,60.0,60.0,59.0,60.0,60.0},
2035 double intersection[3], intersection_lon, intersection_lat;
2037 if (!utest_intersect(
2040 return EXIT_FAILURE;
2041 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
2048 utest_generate_cell_deg(
2049 (
double[]){-20.0,20.0,20.0,-20.0},
2051 utest_generate_cell_deg(
2052 (
double[]){-20.0, 0.0,20.0},
2053 (
double[]){59.0,50.0,59.0},
gc_edges, 3)},
2056 utest_generate_cell_deg(
2057 (
double[]){intersection_lon,-intersection_lon,
2059 (
double[]){60.0,60.0,59.0,50.0,59.0},
2089 double intersection[3], intersection_lon, intersection_lat;
2091 if (!utest_intersect(
2094 return EXIT_FAILURE;
2095 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
2102 utest_generate_cell_deg(
2103 (
double[]){-20.0,20.0,20.0,-20.0},
2105 utest_generate_cell_deg(
2106 (
double[]){-19.0,-19.0,19.0,19.0},
2107 (
double[]){ 19.0,-19.0,-19.0,19.0},
gc_edges, 4)},
2110 utest_generate_cell_deg(
2111 (
double[]){-19.0,intersection_lon,
2112 -intersection_lon,19.0,19.0,
2113 -intersection_lon,intersection_lon,-19.0},
2114 (
double[]){19.0,20.0,20.0,19.0,
2115 -19.0,-20.0,-20.0,-19.0},
2146 double intersection[3], intersection_lon, intersection_lat;
2148 if (!utest_intersect(
2151 return EXIT_FAILURE;
2152 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
2159 utest_generate_cell_deg(
2160 (
double[]){-20.0,20.0,20.0,-20.0},
2162 utest_generate_cell_deg(
2163 (
double[]){-40.0, 0.0,-20.0},
2164 (
double[]){ 45.0,45.0,55.0},
gc_edges, 3)},
2167 utest_generate_cell_deg(
2168 (
double[]){-20.0,-20.0,0.0},
2169 (
double[]){intersection_lat,55.0,45.0},
2202 utest_generate_cell_deg(
2203 (
double[]){-20.0,20.0,20.0,-20.0},
2205 utest_generate_cell_deg(
2206 (
double[]){-10.0,10.0,10.0},
2207 (
double[]){ 40.0,30.0,50.0},
gc_edges, 3)},
2210 utest_generate_cell_deg(
2211 (
double[]){-10.0,10.0,10.0},
2212 (
double[]){40.0,50.0,40.0},
2242 double intersection[2][3], intersection_lon[2], intersection_lat[2];
2244 if (!utest_intersect(
2247 return EXIT_FAILURE;
2248 if (!utest_intersect(
2251 return EXIT_FAILURE;
2252 for (
int i = 0;
i < 2; ++
i) {
2253 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
2261 utest_generate_cell_deg(
2262 (
double[]){-20.0,20.0,20.0,-20.0},
2264 utest_generate_cell_deg(
2265 (
double[]){-20.0,21.0,21.0},
2266 (
double[]){61.0,80.0,59.0},
gc_edges, 3)},
2269 utest_generate_cell_deg(
2270 (
double[]){20.0,intersection_lon[0],
2271 intersection_lon[1]},
2272 (
double[]){60.0,intersection_lat[0],
2273 intersection_lat[1]},
2302 double intersection[2][3], intersection_lon[2], intersection_lat[2];
2304 if (!utest_intersect(
2307 return EXIT_FAILURE;
2308 XYZtoLL(intersection[0], &intersection_lon[0], &intersection_lat[0]);
2309 intersection_lon[0] /=
YAC_RAD;
2310 intersection_lat[0] /=
YAC_RAD;
2311 if (!utest_intersect(
2314 return EXIT_FAILURE;
2315 XYZtoLL(intersection[1], &intersection_lon[1], &intersection_lat[1]);
2316 intersection_lon[1] /=
YAC_RAD;
2317 intersection_lat[1] /=
YAC_RAD;
2322 utest_generate_cell_deg(
2323 (
double[]){-20.0,20.0,20.0,-20.0},
2325 utest_generate_cell_deg(
2326 (
double[]){-20.0,20.0, 0.0},
2327 (
double[]){30.0,30.0,intersection_lat[0]},
2331 utest_generate_cell_deg(
2332 (
double[]){0.0,intersection_lon[1],
2333 -intersection_lon[1]},
2334 (
double[]){intersection_lat[0],40.0,40.0},
2363 double intersection[4][3], intersection_lon[4], intersection_lat[4];
2365 if (!utest_intersect(
2368 return EXIT_FAILURE;
2369 if (!utest_intersect(
2372 return EXIT_FAILURE;
2373 if (!utest_intersect(
2376 return EXIT_FAILURE;
2377 if (!utest_intersect(
2380 return EXIT_FAILURE;
2381 for (
int i = 0;
i < 4; ++
i) {
2382 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
2390 utest_generate_cell_deg(
2391 (
double[]){-20.0,20.0,20.0,-20.0},
2393 utest_generate_cell_deg(
2394 (
double[]){-21.0, 0.0,21.0},
2395 (
double[]){59.0,70.0,59.0},
gc_edges, 3)},
2398 utest_generate_cell_deg(
2399 (
double[]){20.0,20.0,intersection_lon[2],
2400 intersection_lon[3],-intersection_lon[3],
2401 -intersection_lon[2],-20.0,-20.0},
2402 (
double[]){intersection_lat[0],intersection_lat[1],
2403 60.0,60.0,60.0,60.0,intersection_lat[1],
2404 intersection_lat[0]},
2409 utest_generate_cell_deg(
2410 (
double[]){20.0,20.0,intersection_lon[2],
2411 intersection_lon[3],-intersection_lon[3],
2412 -intersection_lon[2],-20.0,-20.0,
2413 -intersection_lon[3],intersection_lon[3]},
2414 (
double[]){intersection_lat[0],intersection_lat[1],
2415 60.0,60.0,60.0,60.0,intersection_lat[1],
2416 intersection_lat[0],60.0,60.0},
2422 utest_generate_cell_deg(
2423 (
double[]){20.0,20.0,intersection_lon[2],
2424 -intersection_lon[2],-20.0,-20.0,
2425 -intersection_lon[3],intersection_lon[3]},
2426 (
double[]){intersection_lat[0],intersection_lat[1],
2427 60.0,60.0,intersection_lat[1],
2428 intersection_lat[0],60.0,60.0},
2460 double intersection[3][3], intersection_lon[3], intersection_lat[3];
2462 if (!utest_intersect(
2465 return EXIT_FAILURE;
2466 if (!utest_intersect(
2469 return EXIT_FAILURE;
2470 for (
int i = 0;
i < 2; ++
i) {
2471 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
2475 if (!utest_intersect(
2478 40.0, intersection[2]))
2479 return EXIT_FAILURE;
2480 XYZtoLL(intersection[2], &intersection_lon[2], &intersection_lat[2]);
2481 intersection_lon[2] /=
YAC_RAD;
2482 intersection_lat[2] /=
YAC_RAD;
2487 utest_generate_cell_deg(
2488 (
double[]){-intersection_lon[0],intersection_lon[0],
2489 intersection_lon[0],-intersection_lon[0]},
2491 utest_generate_cell_deg(
2492 (
double[]){-21.0, 0.0,21.0},
2493 (
double[]){59.0,70.0,59.0},
gc_edges, 3)},
2496 utest_generate_cell_deg(
2497 (
double[]){intersection_lon[2],intersection_lon[0],
2498 intersection_lon[1],-intersection_lon[1],
2499 -intersection_lon[0],-intersection_lon[2]},
2500 (
double[]){intersection_lat[2],60.0,60.0,60.0,60.0,
2501 intersection_lat[2]},
2505 utest_generate_cell_deg(
2506 (
double[]){intersection_lon[2],intersection_lon[0],
2507 intersection_lon[1],-intersection_lon[1],
2508 -intersection_lon[0],-intersection_lon[2],
2509 -intersection_lon[1],intersection_lon[1]},
2510 (
double[]){intersection_lat[2],60.0,60.0,60.0,60.0,
2511 intersection_lat[2],60.0,60.0},
2516 utest_generate_cell_deg(
2517 (
double[]){intersection_lon[2],intersection_lon[0],
2518 -intersection_lon[0],-intersection_lon[2],
2519 -intersection_lon[1],intersection_lon[1]},
2520 (
double[]){intersection_lat[2],60.0,60.0,
2521 intersection_lat[2],60.0,60.0},
2551 double intersection[3][3], intersection_lon[3], intersection_lat[3];
2553 if (!utest_intersect(
2556 return EXIT_FAILURE;
2557 if (!utest_intersect(
2560 return EXIT_FAILURE;
2562 if (!utest_intersect(
2565 return EXIT_FAILURE;
2566 for (
int i = 0;
i < 3; ++
i) {
2567 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
2575 utest_generate_cell_deg(
2576 (
double[]){-20.0,20.0,20.0,-20.0},
2578 utest_generate_cell_deg(
2579 (
double[]){-21.0, 0.0,21.0},
2580 (
double[]){59.0,50.0,59.0},
gc_edges, 3)},
2583 utest_generate_cell_deg(
2584 (
double[]){intersection_lon[0],20.0,20.0,0.0,-20.0,
2585 -20.0,-intersection_lon[0]},
2586 (
double[]){60.0,intersection_lat[1],
2587 intersection_lat[2],50.0,
2588 intersection_lat[2],intersection_lat[1],
2621 utest_generate_cell_deg(
2622 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2623 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2627 utest_generate_cell_deg(
2628 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2629 (
double[]){ 80.0,80.0,80.0,80.0,80.0},
2635 utest_generate_cell_deg(
2636 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2637 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2669 utest_generate_cell_deg(
2670 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2671 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2675 utest_generate_cell_deg(
2676 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2677 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2683 utest_generate_cell_deg(
2684 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2685 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2717 utest_generate_cell_deg(
2718 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2719 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2723 utest_generate_cell_deg(
2724 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2725 (
double[]){-85.0,-85.0,-85.0,-85.0,-85.0},
2731 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
2762 utest_generate_cell_deg(
2763 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2764 (
double[]){ 85.0,85.0,85.0,85.0,85.0},
2768 utest_generate_cell_deg(
2769 (
double[]){ 0.0,60.0,120.0,180.0,240.0,300.0},
2770 (
double[]){ 85.0,85.0,85.0,85.0,85.0,85.0},
2776 utest_generate_cell_deg(
2777 (
double[]){ 0.0,60.0,120.0,180.0,240.0,300.0},
2778 (
double[]){ 85.0,85.0,85.0,85.0,85.0,85.0},
2809 double intersection[2][3], intersection_lon[2], intersection_lat[2];
2811 if (!utest_intersect(
2814 return EXIT_FAILURE;
2815 if (!utest_intersect(
2818 return EXIT_FAILURE;
2819 for (
int i = 0;
i < 2; ++
i) {
2820 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
2828 utest_generate_cell_deg(
2829 (
double[]){ 0.0,72.0,144.0,216.0,288.0},
2830 (
double[]){ 85.5,85.5,85.5,85.5,85.5},
2834 utest_generate_cell_deg(
2835 (
double[]){ 0.0,60.0,120.0,180.0,240.0,300.0},
2836 (
double[]){ 85.0,85.0,85.0,85.0,85.0,85.0},
2843 utest_generate_cell_deg(
2844 (
double[]){intersection_lon[0]+60.0*0.0,
2845 intersection_lon[1]+60.0*0.0,
2846 intersection_lon[0]+60.0*1.0,
2847 intersection_lon[1]+60.0*1.0,
2848 intersection_lon[0]+60.0*2.0,
2849 intersection_lon[1]+60.0*2.0,
2850 intersection_lon[0]+60.0*3.0,
2851 intersection_lon[1]+60.0*3.0,
2852 intersection_lon[0]+60.0*4.0,
2853 intersection_lon[1]+60.0*4.0,
2854 intersection_lon[0]+60.0*5.0,
2855 intersection_lon[1]+60.0*5.0},
2856 (
double[]){85.5,85.5,85.5,85.5,85.5,85.5,85.5,85.5,
2857 85.5,85.5,85.5,85.5},
2871 TEST_START(
"example taken from bug report by Uwe");
2897 utest_generate_cell_deg(
2898 (
double[]){355.0,360.0,360.0,355.0},
2899 (
double[]){ 0.0, 0.0, 5.0, 5.0},
gc_edges, 4),
2900 utest_generate_cell_deg(
2901 (
double[]){240.0,250.0,250.0,240.0},
2902 (
double[]){-10.0,-10.0, 0.0, 0.0},
gc_edges, 4)},
2905 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
2937 utest_generate_cell_deg(
2938 (
double[]){ 2.0,2.0,4.0},
2939 (
double[]){-1.0,1.0,1.0},
gc_edges, 3),
2940 utest_generate_cell_deg(
2941 (
double[]){0.0,2.0,2.0,0.0},
2945 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
2953 double intersection[3], intersection_lon, intersection_lat;
2955 if (!utest_intersect(
2958 return EXIT_FAILURE;
2959 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
2966 utest_generate_cell_deg(
2967 (
double[]){ 0.0,180.0, 5.0},
2968 (
double[]){85.0,90.0,85.0},
gc_edges, 3),
2969 utest_generate_cell_deg(
2970 (
double[]){ 1.0,-5.0,-5.0,1.0},
2974 utest_generate_cell_deg(
2975 (
double[]){1.0,0.0,0.0},
2976 (
double[]){intersection_lat,85.0,90.0},
2987 double intersection[4][3], intersection_lon[4], intersection_lat[4];
2989 if (!utest_intersect(
2991 0.49087385212340517437,-0.88357293382212931387,
2993 0.46519399935013672209,-0.88122392525212978054,
2995 return EXIT_FAILURE;
2996 if (!utest_intersect(
2998 0.46633015951723494341,-0.85902924121595902740,
3000 0.46519399935013672209,-0.88122392525212978054,
3002 return EXIT_FAILURE;
3003 if (!utest_intersect(
3005 0.46633015951723494341,-0.85902924121595902740,
3007 0.46519399935013672209,-0.88122392525212978054,
3009 return EXIT_FAILURE;
3010 if (!utest_intersect(
3012 0.49087385212340517437,-0.85902924121595902740,
3014 0.46519399935013672209,-0.88122392525212978054,
3016 return EXIT_FAILURE;
3017 for (
int i = 0;
i < 4; ++
i) {
3018 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3026 utest_generate_cell_deg(
3027 (
double[]){ 0.46633015951723494341,
3028 0.49087385212340517437,
3029 0.49087385212340517437,
3030 0.46633015951723494341},
3031 (
double[]){-0.88357293382212931387,
3032 -0.88357293382212931387,
3033 -0.85902924121595902740,
3035 utest_generate_cell_deg(
3036 (
double[]){ 0.47953965147452792817,
3037 0.50100250912415544846,
3038 0.46519399935013672209},
3039 (
double[]){-0.90109638077934106626,
3040 -0.88440597750634275531,
3041 -0.88122392525212978054},
gc_edges, 3)},
3044 utest_generate_cell_deg(
3045 (
double[]){0.49087385212340517437,
3046 intersection_lon[0],
3047 0.46633015951723494341,
3048 0.46633015951723494341,
3049 0.49087385212340517437},
3050 (
double[]){-0.88357293382212931387,
3051 intersection_lat[0],
3052 intersection_lat[1],
3053 intersection_lat[2],
3054 intersection_lat[3]},
3066 double intersection[4][3], intersection_lon[4], intersection_lat[4];
3068 if (!utest_intersect(
3071 return EXIT_FAILURE;
3072 if (!utest_intersect(
3075 return EXIT_FAILURE;
3076 if (!utest_intersect(
3079 return EXIT_FAILURE;
3080 if (!utest_intersect(
3083 return EXIT_FAILURE;
3084 for (
int i = 0;
i < 4; ++
i) {
3085 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3093 utest_generate_cell_deg(
3094 (
double[]){180.2,180.3,180.3,180.2},
3095 (
double[]){-89.6,-89.6,-89.5,-89.5},
gc_edges, 4),
3096 utest_generate_cell_deg(
3097 (
double[]){180.00,180.25,180.25,180.00},
3098 (
double[]){-89.75,-89.75,-89.50,-89.50},
gc_edges, 4)},
3101 utest_generate_cell_deg(
3102 (
double[]){180.2,180.25,180.25,
3103 intersection_lon[2],180.20},
3104 (
double[]){-89.6,intersection_lat[0],
3105 intersection_lat[1],intersection_lat[2],
3106 intersection_lat[3]},
gc_edges, 5)},
3114 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3116 if (!utest_intersect(
3124 -0.76075226373764/
YAC_RAD, intersection[0]))
3125 return EXIT_FAILURE;
3126 if (!utest_intersect(
3134 -0.82925269516665/
YAC_RAD, intersection[1]))
3135 return EXIT_FAILURE;
3136 for (
int i = 0;
i < 2; ++
i) {
3137 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3146 utest_generate_cell_deg(
3147 (
double[]){ 1.20264093770234/
YAC_RAD,
3151 (
double[]){-0.76085447079128/
YAC_RAD,
3156 utest_generate_cell_deg(
3157 (
double[]){ 1.20552692320133/
YAC_RAD,
3160 (
double[]){-0.76075226373764/
YAC_RAD,
3165 utest_generate_cell_deg(
3166 (
double[]){1.20552692320133/
YAC_RAD,
3167 intersection_lon[0], intersection_lon[1]},
3168 (
double[]){-0.76075226373764/
YAC_RAD,
3169 intersection_lat[0], intersection_lat[1]},
3172 utest_generate_cell_deg(
3173 (
double[]){1.20552692320133/
YAC_RAD,
3174 intersection_lon[0],
3176 intersection_lon[1]},
3177 (
double[]){-0.76075226373764/
YAC_RAD,
3178 intersection_lat[0],
3180 intersection_lat[1]},
3188 TEST_START(
"example in which all coordinates are 0 (occurred in a test"
3189 " of Uwe due to erroneous input data)")
3195 utest_generate_cell_deg(
3196 (
double[]){0, 0, 0, 0},
3198 utest_generate_cell_deg(
3199 (
double[]){0, 0, 0},
3200 (
double[]){0, 0, 0},
gc_edges, 3)},
3203 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3208 TEST_START(
"example example take from ICON_toy");
3214 utest_generate_cell_deg(
3215 (
double[]){3.1415926372157803/
YAC_RAD,
3218 (
double[]){-1.5418135425481947/
YAC_RAD,
3222 utest_generate_cell_deg(
3223 (
double[]){1.2517283229146832/
YAC_RAD,
3227 (
double[]){-1.5707963267948966/
YAC_RAD,
3234 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3241 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3243 if (!utest_intersect(
3253 return EXIT_FAILURE;
3254 if (!utest_intersect(
3264 return EXIT_FAILURE;
3265 for (
int i = 0;
i < 2; ++
i) {
3266 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3275 utest_generate_cell_deg(
3276 (
double[]){ 3.1415926372157803/
YAC_RAD,
3279 (
double[]){-1.5418135425481947/
YAC_RAD,
3282 utest_generate_cell_deg(
3283 (
double[]){ 3.1170489609836229/
YAC_RAD,
3287 (
double[]){-1.5462526341887264/
YAC_RAD,
3294 utest_generate_cell_deg(
3295 (
double[]){ 3.1415926535897931/
YAC_RAD,
3296 intersection_lon[0],
3298 intersection_lon[1]},
3299 (
double[]){-1.5462526341887264/
YAC_RAD,
3300 intersection_lat[0],
3302 intersection_lat[1]},
3306 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3311 TEST_START(
"example example take from ICON_toy");
3313 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3315 if (!utest_intersect(
3325 return EXIT_FAILURE;
3326 if (!utest_intersect(
3336 return EXIT_FAILURE;
3337 for (
int i = 0;
i < 2; ++
i) {
3338 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3346 utest_generate_cell_deg(
3347 (
double[]){-1.2564300972590368/
YAC_RAD,
3350 (
double[]){ 1.5418206553283160/
YAC_RAD,
3353 utest_generate_cell_deg(
3354 (
double[]){ 0.0000000000000000/
YAC_RAD,
3358 (
double[]){ 1.5462526341887264/
YAC_RAD,
3365 utest_generate_cell_deg(
3366 (
double[]){0,intersection_lon[0],intersection_lon[1]},
3367 (
double[]){90.0,intersection_lat[0],
3368 intersection_lat[1]},
3375 TEST_START(
"example example take from ICON_toy");
3377 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3379 if (!utest_intersect(
3389 return EXIT_FAILURE;
3390 if (!utest_intersect(
3400 return EXIT_FAILURE;
3401 for (
int i = 0;
i < 2; ++
i) {
3402 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3411 utest_generate_cell_deg(
3412 (
double[]){-2.1798479726998332/
YAC_RAD,
3415 (
double[]){-0.0311624518327736/
YAC_RAD,
3419 utest_generate_cell_deg(
3420 (
double[]){ 4.0742529726242633/
YAC_RAD,
3424 (
double[]){ 0.0000000000000000/
YAC_RAD,
3431 utest_generate_cell_deg(
3432 (
double[]){-2.1991148570983681/
YAC_RAD,
3433 intersection_lon[0],
3434 intersection_lon[1]},
3435 (
double[]){0.0000000043633749/
YAC_RAD,
3444 TEST_START(
"example example take from ICON_toy");
3446 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3448 if (!utest_intersect(
3458 return EXIT_FAILURE;
3459 if (!utest_intersect(
3469 return EXIT_FAILURE;
3470 for (
int i = 0;
i < 2; ++
i) {
3471 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3480 utest_generate_cell_deg(
3481 (
double[]){ 3.1415926521557882/
YAC_RAD,
3484 (
double[]){-0.9805860393425995/
YAC_RAD,
3487 utest_generate_cell_deg(
3488 (
double[]){ 3.1170489609836229/
YAC_RAD,
3492 (
double[]){-1.0062913968529805/
YAC_RAD,
3499 utest_generate_cell_deg(
3500 (
double[]){ 3.1415926535897931/
YAC_RAD,
3502 intersection_lon[0],intersection_lon[1]},
3503 (
double[]){-0.9817477042468103/
YAC_RAD,
3509 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3514 TEST_START(
"example example take from ICON_toy");
3521 utest_generate_cell_deg(
3522 (
double[]){ 1.8849555814614660/
YAC_RAD,
3525 (
double[]){-1.5418135420482968/
YAC_RAD,
3528 utest_generate_cell_deg(
3529 (
double[]){ 1.0799224746714915/
YAC_RAD,
3533 (
double[]){-1.5707963267948966/
YAC_RAD,
3540 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3545 TEST_START(
"example example take from ICON_toy");
3552 utest_generate_cell_deg(
3553 (
double[]){ 3.1415926372157803/
YAC_RAD,
3556 (
double[]){-1.5418135425481947/
YAC_RAD,
3559 utest_generate_cell_deg(
3560 (
double[]){ 1.5707963267948966/
YAC_RAD,
3564 (
double[]){-1.5707963267948966/
YAC_RAD,
3571 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3576 TEST_START(
"example example take from ICON_toy");
3578 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3580 if (!utest_intersect(
3590 return EXIT_FAILURE;
3591 if (!utest_intersect(
3601 return EXIT_FAILURE;
3602 for (
int i = 0;
i < 2; ++
i) {
3603 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3612 utest_generate_cell_deg(
3613 (
double[]){1.25664579522418/
YAC_RAD,
3616 (
double[]){1.54180416508220/
YAC_RAD,
3619 utest_generate_cell_deg(
3620 (
double[]){0.90811662642830/
YAC_RAD,
3624 (
double[]){1.52170894158256/
YAC_RAD,
3631 utest_generate_cell_deg(
3632 (
double[]){0.93266031903447/
YAC_RAD,
3633 intersection_lon[0],
3634 intersection_lon[1]},
3635 (
double[]){1.54625263418873/
YAC_RAD,
3636 intersection_lat[0],
3637 intersection_lat[1]},
3640 utest_generate_cell_deg(
3641 (
double[]){0.93266031903447/
YAC_RAD,
3643 intersection_lon[0],
3644 intersection_lon[1]},
3645 (
double[]){1.54625263418873/
YAC_RAD,
3647 intersection_lat[0],
3648 intersection_lat[1]},
3655 TEST_START(
"example example take from ICON_toy");
3661 utest_generate_cell_deg(
3662 (
double[]){ 4.9999997254688875/
YAC_RAD,
3666 (
double[]){-1.2878426515089207/
YAC_RAD,
3671 utest_generate_cell_deg(
3672 (
double[]){ 5.0069132916587327/
YAC_RAD,
3676 (
double[]){-1.2946797849754812/
YAC_RAD,
3683 utest_generate_cell_deg(
3684 (
double[]){ 5.0069132916587327/
YAC_RAD,
3688 (
double[]){-1.2946797849754812/
YAC_RAD,
3702 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3704 if (!utest_intersect(
3714 return EXIT_FAILURE;
3715 if (!utest_intersect(
3725 return EXIT_FAILURE;
3726 for (
int i = 0;
i < 2; ++
i) {
3727 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3736 utest_generate_cell_deg(
3737 (
double[]){3.2637657012293961/
YAC_RAD,
3741 (
double[]){1.5358897417550099/
YAC_RAD,
3746 utest_generate_cell_deg(
3747 (
double[]){1.2566370614359175/
YAC_RAD,
3753 (
double[]){1.5494144670074232/
YAC_RAD,
3762 utest_generate_cell_deg(
3763 (
double[]){intersection_lon[0],
3766 (
double[]){1.5533430342749532/
YAC_RAD,
3768 intersection_lat[1]},
3783 utest_generate_cell_deg(
3784 (
double[]){ 1.8849563731522099/
YAC_RAD,
3787 (
double[]){-0.4124872765902973/
YAC_RAD,
3791 utest_generate_cell_deg(
3792 (
double[]){ 1.8443992887189797/
YAC_RAD,
3795 (
double[]){-0.4121554426487201/
YAC_RAD,
3801 utest_generate_cell_deg(
3802 (
double[]){ 1.8849563731522099/
YAC_RAD,
3805 (
double[]){-0.4124872765902973/
YAC_RAD,
3814 double intersection[3], intersection_lon, intersection_lat;
3816 if (!utest_intersect(
3826 return EXIT_FAILURE;
3827 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
3835 utest_generate_cell_deg(
3836 (
double[]){-1.9037843097448526/
YAC_RAD,
3839 (
double[]){-0.4401294427665800/
YAC_RAD,
3843 utest_generate_cell_deg(
3844 (
double[]){-1.8849555921538759/
YAC_RAD,
3847 (
double[]){-0.5268929705698896/
YAC_RAD,
3853 utest_generate_cell_deg(
3854 (
double[]){-1.8849555921538759/
YAC_RAD,
3857 (
double[]){-0.4636476094897370/
YAC_RAD,
3860 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
3868 double intersection[2][3], intersection_lon[2], intersection_lat[2];
3870 if (!utest_intersect(
3880 return EXIT_FAILURE;
3881 if (!utest_intersect(
3891 return EXIT_FAILURE;
3892 for (
int i = 0;
i < 2; ++
i) {
3893 XYZtoLL(intersection[i], &intersection_lon[i], &intersection_lat[i]);
3902 utest_generate_cell_deg(
3903 (
double[]){-1.2346024154180213/
YAC_RAD,
3906 (
double[]){-0.5882204740702072/
YAC_RAD,
3910 utest_generate_cell_deg(
3911 (
double[]){-1.2156135107669752/
YAC_RAD,
3914 (
double[]){-0.4835340719879115/
YAC_RAD,
3920 utest_generate_cell_deg(NULL, NULL, NULL, 0),
3921 utest_generate_cell_deg(
3922 (
double[]){-1.2566370573287293/
YAC_RAD,
3923 intersection_lon[0],
3924 intersection_lon[1]},
3925 (
double[]){-0.5535743562505872/
YAC_RAD,
3926 intersection_lat[0],
3927 intersection_lat[1]},
gc_edges, 3)},
3933 TEST_START(
"handling of 'triangle' in which all corners on on a gc");
3939 utest_generate_cell_deg(
3940 (
double[]){0, 1, 2},
3942 utest_generate_cell_deg(
3943 (
double[]){0, 1, 2},
3944 (
double[]){0, 0, 0},
gc_edges, 3)},
3947 utest_generate_cell_deg(NULL, NULL, NULL, 0),
3948 utest_generate_cell_deg(
3949 (
double[]){0, 1, 2},
3950 (
double[]){0, 0, 0},
gc_edges, 3)},
3955 TEST_START(
"handling of 'triangle' in which all corners on on a gc");
3961 utest_generate_cell_deg(
3962 (
double[]){0, 1, 1},
3964 utest_generate_cell_deg(
3965 (
double[]){0, 1, 2},
3966 (
double[]){0, 0, 0},
gc_edges, 3)},
3969 utest_generate_cell_deg(NULL, NULL, NULL, 0),
3970 utest_generate_cell_deg(
3971 (
double[]){0, 1, 2},
3972 (
double[]){0, 0, 0},
gc_edges, 3)},
3984 utest_generate_cell_deg(
3985 (
double[]){ 1.5462526341887264/
YAC_RAD,
3989 (
double[]){-1.5707963267948966/
YAC_RAD,
3994 utest_generate_cell_deg(
3995 (
double[]){ 1.5707963267948966/
YAC_RAD,
3999 (
double[]){-1.5462526341887277/
YAC_RAD,
4006 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4014 double intersection[3], intersection_lon, intersection_lat;
4016 if (!utest_intersect(
4026 return EXIT_FAILURE;
4027 XYZtoLL(intersection, &intersection_lon, &intersection_lat);
4034 utest_generate_cell_deg(
4039 (
double[]){-1.5462526341887264/
YAC_RAD,
4044 utest_generate_cell_deg(
4049 (
double[]){-1.5339807878856395/
YAC_RAD,
4056 utest_generate_cell_deg(
4061 (
double[]){-1.5217089415825564/
YAC_RAD,
4073 TEST_START(
"lon-lat cell that touches the pole");
4094 utest_generate_cell_deg(
4095 (
double[]){-5.0, 5.0, 0.0},
4096 (
double[]){85.0, 85.0, 90.0},
4099 utest_generate_cell_deg(
4100 (
double[]){ 0.0,60.0,120.0,180.0,240.0,300.0},
4101 (
double[]){ 84.0,84.0,84.0,84.0,84.0,84.0},
4107 utest_generate_cell_deg(
4108 (
double[]){-5.0, 5.0, 0.0},
4109 (
double[]){85.0, 85.0, 90.0},
4117 TEST_START(
"two square that partially share two edges");
4141 utest_generate_cell_deg(
4142 (
double[]){-1.0, 1.0, 1.0,-1.0},
4144 utest_generate_cell_deg(
4145 (
double[]){-1.0, 1.0, 1.0,-1.0},
4149 utest_generate_cell_deg(
4150 (
double[]){-1.0, 1.0, 1.0,-1.0},
4157 TEST_START(
"two polygons with two edges touch in a single point");
4178 double touch_point[3], touch_lon, touch_lat;
4180 if (!utest_intersect(
4183 return EXIT_FAILURE;
4184 XYZtoLL(touch_point, &touch_lon, &touch_lat);
4192 utest_generate_cell_deg(
4193 (
double[]){-10.0, 10.0, 10.0, -10.0},
4194 (
double[]){touch_lat, touch_lat, 90.0, 90.0},
4196 utest_generate_cell_deg(
4197 (
double[]){0.0, 10.0, -10.0},
4198 (
double[]){0.0, 80.0, 80.0},
gc_edges, 3)},
4200 (
struct yac_grid_cell[]){utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4206 TEST_START(
"two polygons with two edges touch in a single point");
4227 double touch_point[3], touch_lon, touch_lat;
4229 if (!utest_intersect(
4232 return EXIT_FAILURE;
4233 XYZtoLL(touch_point, &touch_lon, &touch_lat);
4241 utest_generate_cell_deg(
4242 (
double[]){-15.0, 15.0, 15.0, -15.0},
4243 (
double[]){60.0, 60.0, touch_lat, touch_lat},
4245 utest_generate_cell_deg(
4246 (
double[]){0.0, 10.0, -10.0},
4247 (
double[]){70.0, 80.0, 80.0},
gc_edges, 3)},
4250 utest_generate_cell_deg(
4251 (
double[]){0.0, 10.0, -10.0},
4252 (
double[]){70.0, 80.0, 80.0},
gc_edges, 3),
4253 utest_generate_cell_deg(
4254 (
double[]){0.0, 10.0, 0.0, -10.0},
4255 (
double[]){70.0, 80.0, touch_lat, 80.0},
gc_edges, 4)},
4276 utest_generate_cell_deg(
4277 (
double[]){0.0, 1.0, 1.0, 0.0},
4278 (
double[]){0.0, 0.0, 1.0, 1.0},
4280 utest_generate_cell_deg((
double[]){0.0}, (
double[]){0.0},
gc_edges, 1)},
4282 (
struct yac_grid_cell[]){utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4310 utest_generate_cell_deg(
4311 (
double[]){0.0,0.5,2.0,0.5,0.0,-0.5,-2.0,-0.5},
4312 (
double[]){2.0,0.5,0.0,-0.5,-2.0,-0.5,0.0,0.5},
4314 utest_generate_cell_deg(
4315 (
double[]){-0.4,0.4,0.4,-0.4},
4319 utest_generate_cell_deg(
4320 (
double[]){-0.4,0.4,0.4,-0.4},
4331 utest_generate_cell_3d(
4334 {{-0.25877962570833368, 0.0045170151688387894, -0.9659258262890682},
4335 {-0.25881904510252096, 3.1696191514317674e-17, -0.9659258262890682},
4336 {-0.27563735581699916, 3.3755840552672809e-17, -0.96126169593831889},
4337 {-0.27559537491262875, 0.004810535163016382, -0.96126169593831889}},
4339 utest_generate_cell_3d(
4342 {{0.26672229713350176, 7.0351165064716449e-15, -0.96377342576553127},
4343 {0.26954589843896026, 3.2931183713464971e-16, -0.9629875433434919},
4344 {0.26812958837053386, -0.0028554026633992114, -0.9633786226172335}},
4349 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4361 utest_generate_cell_3d(
4364 {{2.696547328754725914e-01,4.443826381960052641e-01, -8.542894099237189343e-01},
4365 {2.688564204809740787e-01,4.437764761162059091e-01, -8.548559319628309394e-01},
4366 {2.699802844797243861e-01,4.433103539234195534e-01, -8.547435732993490243e-01}},
4368 utest_generate_cell_3d(
4371 {{2.697116319678348195e-01, 4.415099038379987628e-01, -8.557596861235099439e-01},
4372 {2.697419421247737037e-01, 4.439739859929083821e-01, -8.544743322185424095e-01},
4373 {2.697443730259111994e-01, 4.441790962908549467e-01, -8.543669607604787997e-01}},
4378 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4384 TEST_START(
"degenerated cell that collapses into a single point");
4401 utest_generate_cell_deg(
4402 (
double[]){0.0, 10.0, 10.0, 0.0},
4403 (
double[]){40.0, 40.0, 50.0, 50.0},
4405 utest_generate_cell_deg(
4406 (
double[]){0.0, 30.0, 60.0},
4407 (
double[]){45.0, 45.0, 45.0},
4413 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4426 utest_generate_cell_deg(
4427 (
double[]){0.0, 10.0, 10.0, 0.0},
4428 (
double[]){40.0, 40.0, 50.0, 50.0},
4430 utest_generate_cell_deg(
4431 (
double[]){0.0, 30.0, 60.0},
4432 (
double[]){45.0, 45.0, 45.0},
4438 utest_generate_cell_deg(NULL, NULL, NULL, 0)},
4464 double lat_offset_factor[] = {1.0e-2, 2.0e-2, 4.0e-2, 8.0e-2};
4466 lat_offset_factor_count =
4467 sizeof(lat_offset_factor) /
sizeof(lat_offset_factor[0])};
4469 for (
size_t i = 0;
i < lat_offset_factor_count; ++
i) {
4477 utest_generate_cell_deg(
4478 (
double[]){10.0, 0.0, -10.0},
4479 (
double[]){-lat_offset, 2.0, lat_offset},
4481 utest_generate_cell_deg(
4482 (
double[]){-20.0, 20.0, 20.0, -20.0},
4483 (
double[]){0.0, 0.0, 4.0, 4.0},
gc_edges, 4)},
4487 utest_generate_cell_deg(
4488 (
double[]){10.0, 0.0, -10.0},
4489 (
double[]){0.0, 2.0, 0.0},
gc_edges, 3)},
4498 enum {num_weights = 5};
4499 double weights[num_weights] = {1,3,2,0.5,3.5};
4500 double ref_weights[num_weights] = {0.1,0.3,0.2,0.05,0.35};
4501 utest_check_weight_correction(weights, num_weights,
ref_weights);
4505 enum {num_weights = 1};
4506 double weights[num_weights] = {3};
4508 utest_check_weight_correction(weights, num_weights,
ref_weights);
4512 enum {num_weights = 4};
4513 double weights[num_weights] = {1,2,3,4};
4514 double ref_weights[num_weights] = {0.1,0.2,0.3,0.4};
4515 utest_check_weight_correction(weights, num_weights,
ref_weights);
4523 enum {num_weights = 4};
4524 double weights[num_weights] = {1.0, -2.0, 3.0, -2.0};
4525 double ref_weights[num_weights] = {1.0, -2.0, 3.0, -2.0};
4527 for (
size_t i = 0;
i < num_weights; ++
i)
4532 enum {num_weights = 3};
4533 double weights[num_weights] = {0.0, 0.0, 0.0};
4534 double ref_weights[num_weights] = {0.0, 0.0, 0.0};
4536 for (
size_t i = 0;
i < num_weights; ++
i)
4543 if (weights[0] != 1.0)
PUT_ERR(
"wrong weight");
4549 double points_LL[][2] = {{0.0,0.0}, {45.0, 45.0}, {45.0+180.0,-45.0}, {90.0,90.0}};
4552 double ll[2], xyz[3];
4556 {{.a.ll = {-5.0, 0.0}, .b.ll = {5.0, 0.0}, .type =
GREAT_CIRCLE},
4557 {.a.ll = {0.0, 0.0}, .b.ll = {45.0, 45.0}, .type =
GREAT_CIRCLE},
4558 {.a.ll = {10.0, 5.0}, .b.ll = {10.0, 10.0}, .type =
GREAT_CIRCLE},
4559 {.a.ll = {10.0, 85.0}, .b.ll = {10.0+180.0, 88.0}, .type =
GREAT_CIRCLE},
4560 {.a.ll = {10.0, 85.0}, .b.ll = {10.0+180.0, 90.0}, .type =
GREAT_CIRCLE},
4561 {.a.ll = {1.0, 1.0}, .b.ll = {1.0, 1.1}, .type =
GREAT_CIRCLE},
4562 {.a.ll = {-5.0, 0.0}, .b.ll = {5.0, 0.0}, .type =
LAT_CIRCLE},
4563 {.a.ll = {35.0, 45.0}, .b.ll = {44.0, 45.0}, .type =
LAT_CIRCLE},
4564 {.a.ll = {44.0, 45.0}, .b.ll = {46.0, 45.0}, .type =
LAT_CIRCLE},
4565 {.a.ll = {5.0, 90.0}, .b.ll = {10.0, 90.0}, .type =
LAT_CIRCLE},
4566 {.a.ll = {5.0, 60.0}, .b.ll = {10.0, 60.0}, .type =
LAT_CIRCLE},
4567 {.a.ll = {0.0, -5.0}, .b.ll = {0.0, 5.0}, .type =
LON_CIRCLE},
4568 {.a.ll = {45.0, 45.0}, .b.ll = {45.0, 47.0}, .type =
LON_CIRCLE},
4569 {.a.ll = {10.0, 85.0}, .b.ll = {10.0, 90.0}, .type =
LON_CIRCLE},
4570 {.a.ll = {20.0, 30.0}, .b.ll = {20.0, 35.0}, .type =
LON_CIRCLE},
4571 {.a.ll = {0.0, 0.0}, .b.ll = {0.0, 0.0}, .type =
POINT},
4572 {.a.ll = {1.0, 1.0}, .b.ll = {1.0, 1.0}, .type =
POINT},
4573 {.a.ll = {15.0, 90.0}, .b.ll = {15.0, 90.0}, .type =
POINT}};
4575 NUM_POINTS =
sizeof(points_LL) /
sizeof(points_LL[0]),
4576 NUM_EDGES =
sizeof(edges) /
sizeof(edges[0]),
4580 {1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0},
4581 {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
4582 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
4583 {0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}};
4585 for (
size_t i = 0;
i < NUM_EDGES; ++
i) {
4586 LLtoXYZ_deg(edges[i].a.ll[0], edges[i].a.ll[1], edges[i].a.xyz);
4587 LLtoXYZ_deg(edges[i].b.ll[0], edges[i].b.ll[1], edges[i].b.xyz);
4589 for (
size_t point_idx = 0; point_idx <
NUM_POINTS; ++point_idx) {
4593 points_LL[point_idx][0], points_LL[point_idx][1], point);
4595 for (
size_t edge_idx = 0; edge_idx < NUM_EDGES; ++edge_idx)
4597 point, edges[edge_idx].a.xyz, edges[edge_idx].b.xyz,
4598 edges[edge_idx].type) != ref_results[point_idx][edge_idx]) {
4599 fprintf(stderr,
"points_idx = %zu, edge_idx = %zu\n", point_idx, edge_idx);
4600 PUT_ERR(
"ERROR in yac_point_on_edge");
4613 double const tol = 1e-8;
4622 for (
int order = -1; order <= 1; order += 2) {
4623 for (
int start = 0; start < (int)(a.
num_corners); ++start) {
4625 int differences = 0;
4642 if (!differences)
return 0;
4651 unsigned num_ref_cells) {
4653 int order[2], start[2];
4654 double mem_dummy_[2][128][3];
4659 .edge_type = edge_dummy[0],
4662 .edge_type = edge_dummy[1],
4667 for (order[0] = -1; order[0] <= 1; order[0] += 2) {
4668 for (order[1] = -1; order[1] <= 1; order[1] += 2) {
4669 for (start[0] = 0; start[0] < (int)(cells[0].num_corners); ++start[0]) {
4670 for (start[1] = 0; start[1] < (int)(cells[1].num_corners); ++start[1]) {
4672 for (
int k = 0; k <= 1; ++k) {
4673 for (
int i = 0;
i < ((int)(cells[k].num_corners)); ++
i) {
4675 (((int)(cells[k].num_corners))+start[k]+i*order[k])%
4676 ((int)(cells[k].num_corners));
4681 (((int)(cells[k].num_corners)) + j - (order[k] < 0))%
4687 for (
int k = 0; k <= 1; ++k) {
4690 for (
int i = 0;
i < (int)num_ref_cells; ++
i)
4691 match |= !utest_compare_cells(overlap_cell, ref_cells[i]);
4693 PUT_ERR(
"ERROR: wrong clipping cell\n");
4701 for (
unsigned i = 0;
i < num_ref_cells; ++
i)
4706static void utest_check_weight_correction(
4707 double * weights,
size_t count,
double *
ref_weights) {
4709 double scales[] = {0.001, 0.01, 0.1, 1.0, 10.0, 100.0};
4710 size_t num_tests =
sizeof(scales) /
sizeof(scales[0]);
4712 for (
size_t i = 0;
i < num_tests; ++
i) {
4714 double temp_weights[count];
4715 for (
size_t j = 0; j < count; ++j)
4716 temp_weights[j] = weights[j] * scales[i];
4720 double weight_diff = 1.0;
4721 for (
size_t j = 0; j < count; ++j) {
4722 weight_diff -= temp_weights[j];
4723 if (fabs(
ref_weights[j] - temp_weights[j]) > 1e-9)
4726 if (fabs(weight_diff) > 1e-12)
PUT_ERR(
"wrong weight sum");
double yac_grid_cell_area(struct yac_grid_cell cell)
Area calculation of a spherical cell.
Structs and interfaces for area calculations.
void yac_correct_weights(size_t nSourceCells, double *weight)
correct interpolation weights
void yac_cell_clipping(size_t N, struct yac_grid_cell *source_cell, struct yac_grid_cell target_cell, struct yac_grid_cell *overlap_buffer)
cell clipping to get the cells describing the intersections
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
int yac_point_on_edge(double p[3], double const a[3], double const b[3], enum yac_circle_type circle_type)
static double get_vector_angle(double const a[3], double const b[3])
void yac_init_grid_cell(struct yac_grid_cell *cell)
void yac_free_grid_cell(struct yac_grid_cell *cell)
@ YAC_GREAT_CIRCLE_EDGE
great circle
@ YAC_LAT_CIRCLE_EDGE
latitude circle
@ YAC_LON_CIRCLE_EDGE
longitude circle
enum yac_edge_type * edge_type
double(* coordinates_xyz)[3]
#define TEST_GROUP_START()
static enum yac_edge_type gc_edges[]
static enum yac_edge_type latlon_edges[4]
double ref_weights[4 *36]
static void XYZtoLL(double const p_in[], double *lon, double *lat)
double(* yac_coordinate_pointer)[3]