YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_point_sphere_part.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <float.h>
8#include <string.h>
9
10#include "tests.h"
11#include "test_common.h"
12#include "grids/basic_grid.h"
13#include "sphere_part.h"
14#include "geometry.h"
15
21static void utest_random_test(size_t const num_points);
22static void utest_zero_point_test();
23static void utest_single_point_test();
24static void utest_empty_branch_test(size_t num_points);
25static void utest_zero_balance_point();
26static void utest_duplicated_point_test();
27
28int main(void) {
29
30 srand(1365441);
31
32 for (size_t i = 0; i < 10; ++i) {
33 utest_random_test(1);
34 utest_random_test(10);
35 utest_random_test(100);
36 utest_random_test(650);
37 }
38 utest_zero_point_test();
39 utest_single_point_test();
40 utest_empty_branch_test(4);
41 utest_empty_branch_test(128);
42 utest_zero_balance_point();
43 utest_duplicated_point_test();
44
45 return TEST_EXIT_CODE;
46}
47
49 double distance;
50 size_t index;
51};
52
53static int compare_distance_index(const void * a, const void * b) {
54
55 int ret = (((struct distance_index*)a)->distance >
56 ((struct distance_index*)b)->distance) -
57 (((struct distance_index*)a)->distance <
58 ((struct distance_index*)b)->distance);
59 if (ret == 0)
60 ret = (((struct distance_index*)a)->index >
61 ((struct distance_index*)b)->index) -
62 (((struct distance_index*)a)->index <
63 ((struct distance_index*)b)->index);
64
65 return ret;
66}
67
69 struct point_sphere_part_search * search, size_t n,
70 double (*xyz_coordinates)[3], size_t num_points, size_t ** local_point_ids,
71 size_t * local_point_ids_array_size,
72 size_t * num_local_point_ids, struct distance_index * distances) {
73
75 search, num_points, xyz_coordinates, n, NULL, NULL, NULL, NULL,
76 local_point_ids, local_point_ids_array_size, num_local_point_ids);
77
78 // check results
79 for (size_t j = 0, offset = 0; j < num_points; ++j) {
80
81 struct distance_index * curr_distances = distances + j * num_points;
82
83 size_t ref_num_local_points = 1, m = 0;
84 for (; (ref_num_local_points < num_points); ++ref_num_local_points)
86 curr_distances[ref_num_local_points-1].distance,
87 curr_distances[ref_num_local_points].distance))
88 if (++m == n) break;
89
90 if (num_local_point_ids[j] != ref_num_local_points) {
91 PUT_ERR("wrong number of local points found\n");
92 continue;
93 }
94
95 size_t num_matching_points = 0;
96 for (size_t k = 0; k < ref_num_local_points; ++k)
97 for (size_t l = 0; l < ref_num_local_points; ++l)
98 if (curr_distances[k].index == (*local_point_ids)[offset+l])
99 ++num_matching_points;
100
101 if (num_matching_points != ref_num_local_points)
102 PUT_ERR("wrong results\n");
103
104 offset += ref_num_local_points;
105 }
106}
107
109 struct point_sphere_part_search * search, size_t num_points,
110 yac_coordinate_pointer xyz_coordinates, size_t n,
111 struct distance_index * distances) {
112
113 struct sin_cos_angle angles[num_points];
114
116 search, num_points, xyz_coordinates, n, angles);
117
118 for (size_t i = 0; i < num_points; ++i) {
119 double ref_ubound =
120 distances[i * num_points + n - 1].distance;
121
122 if (compare_angles(
123 sin_cos_angle_new(sin(ref_ubound), cos(ref_ubound)),
124 angles[i]) > 0)
125 PUT_ERR("wrong result");
126 }
127}
128
130 struct point_sphere_part_search * search, size_t num_points,
131 yac_coordinate_pointer xyz_coordinates, size_t n,
132 struct distance_index * distances) {
133
134 if (n == 0) return;
135
136 struct bounding_circle bnd_circles[num_points];
137
138 size_t cut_off = n / 2;
139
140 for (size_t i = 0; i < num_points; ++i) {
141
142 memcpy(
143 bnd_circles[i].base_vector, xyz_coordinates[i],
144 sizeof(*xyz_coordinates));
145 double distance =
146 distances[
147 i * num_points + ((i < num_points / 2)?cut_off:(n-1))].distance +
149 bnd_circles[i].inc_angle =
150 sin_cos_angle_new(sin(distance), cos(distance));
151 }
152
153 size_t * local_point_ids = NULL;
154 size_t local_point_ids_array_size = 0;
155 size_t * num_local_point_ids =
156 malloc(num_points * sizeof(*num_local_point_ids));
157
159 search, num_points, bnd_circles, n, &local_point_ids,
160 &local_point_ids_array_size, num_local_point_ids);
161
162 size_t offset = 0;
163 for (size_t i = 0; i < num_points; ++i) {
164
165 size_t ref_num_local_point_ids = (i < num_points / 2)?(n / 2 + 1):n;
166 double ref_distance =
167 distances[i * num_points + ref_num_local_point_ids - 1].distance;
168 for (; (ref_num_local_point_ids < MIN(n, num_points)) &&
169 (distances[
170 i * num_points + ref_num_local_point_ids].distance == ref_distance);
171 ++ref_num_local_point_ids);
172
173 if (ref_num_local_point_ids != num_local_point_ids[i])
174 PUT_ERR("wrong result");
175
176 for (size_t j = 0; j < num_local_point_ids[i]; ++j) {
177 int match_flag = 0;
178 for (size_t k = 0; (k < num_local_point_ids[i]) && !match_flag; ++k)
179 match_flag =
180 distances[i * num_points + k].index == local_point_ids[offset + j];
181 if (!match_flag) PUT_ERR("wrong result");
182 }
183 offset += num_local_point_ids[i];
184 }
185
186 free(local_point_ids);
187 free(num_local_point_ids);
188}
189
190static void gen_random_point(double * point) {
191
192 double x_coordinate = 2.0 * M_PI * (((double)rand()) / ((double)RAND_MAX));
193 double y_coordinate = M_PI * (((double)rand()) / ((double)RAND_MAX)) - M_PI_2;
194 LLtoXYZ(x_coordinate, y_coordinate, point);
195}
196
197static void gen_random_bnd_circle(struct bounding_circle * circle) {
198
200 double angle = M_PI_2 * (((double)rand()) / ((double)RAND_MAX));
201 circle->inc_angle = sin_cos_angle_new(sin(angle), cos(angle));
202 circle->sq_crd = DBL_MAX;
203}
204
205static void utest_random_test(size_t const num_points) {
206
207 double (*coordinates_xyz)[3];
208 double (*coordinates_xyz_a)[3];
209 double (*coordinates_xyz_b)[3];
210 struct bounding_circle * bnd_circles =
211 xmalloc(num_points * sizeof(*bnd_circles));
212 yac_int * global_ids = xmalloc(num_points * sizeof(*global_ids));
213
214 coordinates_xyz = xmalloc(2 * num_points * sizeof(*coordinates_xyz));
215 coordinates_xyz_a = coordinates_xyz;
216 coordinates_xyz_b = coordinates_xyz + num_points;
217
218 size_t * local_point_ids = NULL;
219 size_t local_point_ids_array_size = 0;
220 size_t * num_local_point_ids =
221 xmalloc(num_points * sizeof(*num_local_point_ids));
222 struct distance_index * distances =
223 xmalloc(num_points * num_points * sizeof(*distances));
224
225 for (size_t i = 0; i < num_points; ++i) {
226 gen_random_bnd_circle(bnd_circles + i);
227 global_ids[i] = (yac_int)i;
228 }
229 for (size_t k = 0; k < 2 * num_points; ++k)
230 gen_random_point(coordinates_xyz[k]);
231
232 for (size_t j = 0; j < num_points; ++j) {
233 for (size_t k = 0; k < num_points; ++k) {
234
235 distances[j * num_points + k].distance =
236 get_vector_angle(coordinates_xyz_a[k], coordinates_xyz_b[j]);
237 distances[j * num_points + k].index = k;
238 }
239 qsort(
240 distances + j * num_points, num_points, sizeof(*distances),
242 }
243
244 struct point_sphere_part_search * search =
246 num_points, (yac_const_coordinate_pointer)coordinates_xyz_a,
247 global_ids);
248
249 for (size_t n = 1; n < 16; ++n)
251 search, n, coordinates_xyz_b, num_points, &local_point_ids,
252 &local_point_ids_array_size, num_local_point_ids, distances);
253
254 for (size_t n = 1; n < MIN(num_points,16); ++n)
256 search, num_points, coordinates_xyz_b, n, distances);
257
258 for (size_t n = 1; n < MIN(num_points,16); ++n)
260 search, num_points, coordinates_xyz_b, n, distances);
261
263
264 free(distances);
265 free(local_point_ids);
266 free(num_local_point_ids);
267 free(global_ids);
268 free(bnd_circles);
269 free(coordinates_xyz);
270}
271
272static void utest_single_point_test() {
273
274 struct point_sphere_part_search * search;
275 double xyz_coordinate[1][3];
276 {
277 double x_coordinate = 0, y_coordinate = 0;
278 yac_int global_id[1] = {0};
279 LLtoXYZ(x_coordinate, y_coordinate, xyz_coordinate[0]);
280 search =
282 1, (yac_const_coordinate_pointer)xyz_coordinate, global_id);
283 }
284
285 double x_coordinates[] = {0.0,90.0,180.0,-90.0, 0.0, 0.0};
286 double y_coordinates[] = {0.0, 0.0, 0.0, 0.0,90.0,-90.0};
287 size_t num_points = sizeof(x_coordinates) / sizeof(x_coordinates[0]);
288 double xyz_coordinates[num_points][3];
289 for (size_t i = 0; i < num_points; ++i)
290 LLtoXYZ_deg(x_coordinates[i], y_coordinates[i], xyz_coordinates[i]);
291
292 size_t * local_point_ids = NULL;
293 size_t local_point_ids_array_size = 0;
294 size_t * num_local_point_ids =
295 xmalloc(num_points * sizeof(*num_local_point_ids));
296
298 search, num_points, xyz_coordinates, NULL, NULL, NULL, &local_point_ids,
299 &local_point_ids_array_size, num_local_point_ids);
300
301 for (size_t i = 0; i < num_points; ++i)
302 if ((num_local_point_ids[i] != 1) || (local_point_ids[i] != 0))
303 PUT_ERR("utest_single_point_test: wrong result\n");
304
305 struct sin_cos_angle angles[num_points];
307 search, num_points, xyz_coordinates, 1, angles);
308
309 for (size_t i = 0; i < num_points; ++i)
310 if (compare_angles(
311 angles[i],
313 xyz_coordinate[0], xyz_coordinates[i])) != 0)
314 PUT_ERR("wrong ubound");
315
316 free(local_point_ids);
317 free(num_local_point_ids);
319}
320
321static void utest_zero_point_test() {
322
323 struct point_sphere_part_search * search =
325
326 double x_coordinates[] = {0.0,90.0,180.0,-90.0, 0.0, 0.0};
327 double y_coordinates[] = {0.0, 0.0, 0.0, 0.0,90.0,-90.0};
328 size_t num_points = sizeof(x_coordinates) / sizeof(x_coordinates[0]);
329 double xyz_coordinates[num_points][3];
330 for (size_t i = 0; i < num_points; ++i)
331 LLtoXYZ_deg(x_coordinates[i], y_coordinates[i], xyz_coordinates[i]);
332
333 size_t * local_point_ids = NULL;
334 size_t local_point_ids_array_size = 0;
335 size_t * num_local_point_ids =
336 xmalloc(num_points * sizeof(*num_local_point_ids));
337
338 for (size_t i = 0; i < num_points; ++i)
339 num_local_point_ids[i] = (size_t)-1;
341 search, num_points, xyz_coordinates, NULL, NULL, NULL, &local_point_ids,
342 &local_point_ids_array_size, num_local_point_ids);
343
344 for (size_t i = 0; i < num_points; ++i)
345 if (num_local_point_ids[i] != 0) PUT_ERR("utest_zero_point_test: wrong result\n");
346
347 for (size_t i = 0; i < num_points; ++i)
348 num_local_point_ids[i] = (size_t)-1;
350 search, num_points, xyz_coordinates, 16, NULL, NULL, NULL, NULL,
351 &local_point_ids, &local_point_ids_array_size, num_local_point_ids);
352
353 for (size_t i = 0; i < num_points; ++i)
354 if (num_local_point_ids[i] != 0) PUT_ERR("utest_zero_point_test: wrong result\n");
355
356 free(local_point_ids);
357 free(num_local_point_ids);
359}
360
361static void utest_empty_branch_test(size_t num_points_a) {
362
363 yac_coordinate_pointer xyz_coordinates_a =
364 malloc(num_points_a * sizeof(*xyz_coordinates_a));
365 yac_int * global_ids = malloc(num_points_a * sizeof(*global_ids));
366 for (size_t i = 0; i < num_points_a; ++i) {
367 LLtoXYZ_deg(0.0, -5.0 + (10.0 / (double)num_points_a) * (double)i,
368 xyz_coordinates_a[i]);
369 global_ids[i] = (yac_int)i;
370 }
371
372 struct point_sphere_part_search * search =
374 num_points_a, (yac_const_coordinate_pointer)xyz_coordinates_a,
375 global_ids);
376 free(global_ids);
377
378 double x_coordinates_b[] = {-1.0,-1.0, 1.0,1.0};
379 double y_coordinates_b[] = {-1.0, 1.0,-1.0,1.0};
380 size_t num_points_b = sizeof(x_coordinates_b) / sizeof(x_coordinates_b[0]);
381 double xyz_coordinates_b[num_points_b][3];
382 for (size_t i = 0; i < num_points_b; ++i)
383 LLtoXYZ_deg(x_coordinates_b[i], y_coordinates_b[i], xyz_coordinates_b[i]);
384
385 size_t * local_point_ids = NULL;
386 size_t local_point_ids_array_size = 0;
387 size_t * num_local_point_ids =
388 xmalloc(num_points_b * sizeof(*num_local_point_ids));
389
390 struct distance_index distances[num_points_a * num_points_b];
391
392 for (size_t i = 0; i < num_points_b; ++i) {
393
394 for (size_t j = 0; j < num_points_a; ++j) {
395
396 distances[i * num_points_a + j].distance =
397 get_vector_angle(xyz_coordinates_a[j], xyz_coordinates_b[i]);
398 distances[i * num_points_a + j].index = j;
399 }
400 qsort(distances + i * num_points_a, num_points_a, sizeof(*distances),
402 }
403
404 for (size_t i = 0; i < num_points_b; ++i)
405 num_local_point_ids[i] = (size_t)-1;
407 search, num_points_b, xyz_coordinates_b, NULL, NULL, NULL,
408 &local_point_ids, &local_point_ids_array_size, num_local_point_ids);
409
410 // check results
411 for (size_t j = 0, offset = 0; j < num_points_b; ++j) {
412
413 struct distance_index * curr_distances = distances + j * num_points_a;
414
415 size_t ref_num_local_points;
416 for (ref_num_local_points = 1;
417 (ref_num_local_points < num_points_a); ++ref_num_local_points)
419 curr_distances[ref_num_local_points-1].distance,
420 curr_distances[ref_num_local_points].distance)) break;
421
422 if (num_local_point_ids[j] != ref_num_local_points) {
423 PUT_ERR("wrong number of local points found\n");
424 continue;
425 }
426
427 size_t num_matching_points = 0;
428 for (size_t k = 0; k < ref_num_local_points; ++k)
429 for (size_t l = 0; l < ref_num_local_points; ++l)
430 if (curr_distances[k].index == local_point_ids[offset+l])
431 ++num_matching_points;
432
433 if (num_matching_points != ref_num_local_points)
434 PUT_ERR("wrong results\n");
435
436 offset += ref_num_local_points;
437 }
438 free(local_point_ids);
439 free(num_local_point_ids);
440
441 struct sin_cos_angle angles[num_points_b];
442
444 search, num_points_b, xyz_coordinates_b, 1, angles);
445
446 // check results
447 for (size_t j = 0; j < num_points_b; ++j) {
448
449 struct sin_cos_angle min_angle = SIN_COS_M_PI;
450
451 for (size_t i = 0; i < num_points_a; ++i) {
452
453 struct sin_cos_angle curr_angle =
455 xyz_coordinates_a[i], xyz_coordinates_b[j]);
456
457 if (compare_angles(curr_angle, min_angle) < 0)
458 min_angle = curr_angle;
459 }
460
461 if (compare_angles(min_angle, angles[j]))
462 PUT_ERR("wrong results");
463 }
464
465 free(xyz_coordinates_a);
466
468}
469
470static void utest_zero_balance_point() {
471
472 struct point_sphere_part_search * search;
473 {
474 double x_coordinate = 0, y_coordinate = 0;
475 double xyz_coordinate[6][3] =
476 {{1,0,0}, {-1,0,0},
477 {0,1,0}, {0,-1,0},
478 {0,0,1}, {0,0,-1}};
479 yac_int global_ids[6] = {0,1,2,3,4,5};
480 LLtoXYZ(x_coordinate, y_coordinate, xyz_coordinate[0]);
481 search =
483 6, (yac_const_coordinate_pointer)xyz_coordinate, global_ids);
484 }
486}
487
488static void utest_duplicated_point_test() {
489
490 struct point_sphere_part_search * search;
491 {
492 double x_coordinates[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
493 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
494 2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,
495 3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,
496 4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,
497 2.0,2.0,2.0};
498 double y_coordinates[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
499 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
500 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
501 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
502 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
503 4.0,4.0,4.0};
504 enum {NUM_POINTS = sizeof(x_coordinates) / sizeof(x_coordinates[0])};
505 double xyz_coordinates[NUM_POINTS][3];
506 yac_int global_ids[NUM_POINTS] = {
507 0,1,2,3,4,5,6,7,8,9,
508 10,11,12,13,14,15,16,17,18,19,
509 20,21,22,23,24,25,26,27,28,29,
510 30,31,32,33,34,35,36,37,38,39,
511 40,41,42,43,44,45,46,47,48,49,
512 100,100,101};
513 for (size_t i = 0; i < NUM_POINTS; ++i) {
514 LLtoXYZ_deg(x_coordinates[i], y_coordinates[i], xyz_coordinates[i]);
515 global_ids[i] = (yac_int)i;
516 }
517 search =
520 global_ids);
521 }
522
523 double x_coordinates[] = {1.0,1.0,2.0,2.0,2.0,3.0,3.0,2.1,0.1};
524 double y_coordinates[] = {1.0,8.0,3.0,4.0,5.0,1.0,8.0,4.0,0.0};
525 enum {NUM_POINTS = sizeof(x_coordinates) / sizeof(x_coordinates[0])};
526 double xyz_coordinates[NUM_POINTS][3];
527 for (size_t i = 0; i < NUM_POINTS; ++i)
528 LLtoXYZ_deg(x_coordinates[i], y_coordinates[i], xyz_coordinates[i]);
529
530 size_t * local_point_ids = NULL;
531 size_t local_point_ids_array_size = 0;
532 size_t num_local_point_ids[NUM_POINTS];
533
534 double (*result_coordinates_xyz)[3] = NULL;
535 size_t result_coordinates_xyz_array_size = 0;
536
538 search, NUM_POINTS, xyz_coordinates, NULL,
539 &result_coordinates_xyz, &result_coordinates_xyz_array_size,
540 &local_point_ids, &local_point_ids_array_size, num_local_point_ids);
541
542 size_t ref_local_point_ids[NUM_POINTS][3] =
543 {{11}, {18}, {23}, {52}, {25}, {31}, {38}, {52}, {0}};
544 size_t ref_num_local_point_ids[NUM_POINTS] = {1,1,1,1,1,1,1,1,1};
545 double ref_x_coordinates[NUM_POINTS] = {1.0,1.0,2.0,2.0,2.0,3.0,3.0,2.0,0.0};
546 double ref_y_coordinates[NUM_POINTS] = {1.0,8.0,3.0,4.0,5.0,1.0,8.0,4.0,0.0};
547 double ref_result_coordinates_xyz[NUM_POINTS][3][3];
548
549 for (size_t i = 0; i < NUM_POINTS; ++i)
550 for (size_t j = 0; j < ref_num_local_point_ids[i]; ++j)
552 ref_x_coordinates[i], ref_y_coordinates[i],
553 ref_result_coordinates_xyz[i][j]);
554
555 for (size_t i = 0, offset = 0; i < NUM_POINTS;
556 offset += num_local_point_ids[i++]) {
557
558 if (num_local_point_ids[i] != ref_num_local_point_ids[i]) {
559 PUT_ERR("ERROR in yac_point_sphere_part_search_NN (num_local_point_ids)");
560 } else {
561
562 for (size_t j = 0; j < ref_num_local_point_ids[i]; ++j) {
563
565 result_coordinates_xyz[offset+j],
566 ref_result_coordinates_xyz[i][j]))
567 PUT_ERR("ERROR in yac_point_sphere_part_search_NN "
568 "(result_coordinates_xyz)");
569 if (local_point_ids[offset+j] != ref_local_point_ids[i][j])
570 PUT_ERR("ERROR in yac_point_sphere_part_search_NN (local_point_ids)");
571 }
572 }
573 }
574
575 free(local_point_ids);
576 free(result_coordinates_xyz);
578}
static struct sin_cos_angle get_vector_angle_2(double const a[3], double const b[3])
Definition geometry.h:361
static int points_are_identically(double const *a, double const *b)
Definition geometry.h:594
static const struct sin_cos_angle SIN_COS_M_PI
Definition geometry.h:41
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
Definition geometry.h:269
static int compare_angles(struct sin_cos_angle a, struct sin_cos_angle b)
Definition geometry.h:374
#define yac_angle_tol
Definition geometry.h:26
static double get_vector_angle(double const a[3], double const b[3])
Definition geometry.h:340
static struct sin_cos_angle sin_cos_angle_new(double sin, double cos)
Definition geometry.h:351
#define xmalloc(size)
Definition ppm_xfuncs.h:66
void yac_point_sphere_part_search_NNN_ubound(struct point_sphere_part_search *search, size_t num_points, yac_coordinate_pointer coordinates_xyz, size_t n, struct sin_cos_angle *angles)
void yac_point_sphere_part_search_NNN_bnd_circle(struct point_sphere_part_search *search, size_t num_bnd_circles, struct bounding_circle *bnd_circles, size_t n, size_t **local_point_ids, size_t *local_point_ids_array_size, size_t *num_local_point_ids)
void yac_delete_point_sphere_part_search(struct point_sphere_part_search *search)
struct point_sphere_part_search * yac_point_sphere_part_search_new(size_t num_points, yac_const_coordinate_pointer coordinates_xyz, yac_int const *ids)
void yac_point_sphere_part_search_NN(struct point_sphere_part_search *search, size_t num_points, double(*coordinates_xyz)[3], double *cos_angles, double(**result_coordinates_xyz)[3], size_t *result_coordinates_xyz_array_size, size_t **local_point_ids, size_t *local_point_ids_array_size, size_t *num_local_point_ids)
void yac_point_sphere_part_search_NNN(struct point_sphere_part_search *search, size_t num_points, double(*coordinates_xyz)[3], size_t n, double **cos_angles, size_t *cos_angles_array_size, double(**result_coordinates_xyz)[3], size_t *result_coordinates_xyz_array_size, size_t **local_point_ids, size_t *local_point_ids_array_size, size_t *num_local_point_ids)
algorithm for searching cells and points on a grid
struct sin_cos_angle inc_angle
angle between the middle point and the boundary of the spherical cap
Definition geometry.h:53
double base_vector[3]
Definition geometry.h:51
double sq_crd
Definition geometry.h:56
double sin
Definition geometry.h:33
double cos
Definition geometry.h:33
int double_are_unequal(double a, double b)
static int compare_distance_index(const void *a, const void *b)
static void point_sphere_test_NNN(struct point_sphere_part_search *search, size_t n, double(*xyz_coordinates)[3], size_t num_points, size_t **local_point_ids, size_t *local_point_ids_array_size, size_t *num_local_point_ids, struct distance_index *distances)
static void gen_random_bnd_circle(struct bounding_circle *circle)
static void gen_random_point(double *point)
static void point_sphere_test_NNN_bnd_circle(struct point_sphere_part_search *search, size_t num_points, yac_coordinate_pointer xyz_coordinates, size_t n, struct distance_index *distances)
static void point_sphere_test_NNN_ubound(struct point_sphere_part_search *search, size_t num_points, yac_coordinate_pointer xyz_coordinates, size_t n, struct distance_index *distances)
#define TEST_EXIT_CODE
Definition tests.h:14
#define PUT_ERR(string)
Definition tests.h:10
#define MIN(a, b)
Definition toy_common.h:29
static void LLtoXYZ(double lon, double lat, double p_out[])
Definition toy_scrip.c:587
static size_t num_points
Definition yac.c:159
double const (* yac_const_coordinate_pointer)[3]
Definition yac_types.h:20
YAC_INT yac_int
Definition yac_types.h:15
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:19