25static int utest_check_global_ids(
26 yac_int * global_ids,
int count,
int ref_global_count, MPI_Comm comm);
27static int utest_compare_global_ids(
30int main(
int argc,
char** argv) {
34 xt_initialize(MPI_COMM_WORLD);
36 int comm_rank, comm_size;
37 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
38 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
40 utest_set_even_io_rank_list(MPI_COMM_WORLD);
45 PUT_ERR(
"ERROR: missing grid file directory");
52 char * grid_filenames[] =
53 {
"icon_grid_R02B01.nc",
"icon_grid_R03B01.nc"};
54 for (
int i = 0;
i < 2; ++
i)
58 malloc(strlen(argv[1]) + strlen(grid_filenames[i]) + 2), argv[1]),
62 char const *
grid_names[2] = {
"R02B02",
"R02B03"};
64 for (
int i = 0;
i < 2; ++
i)
67 filenames[i], MPI_COMM_WORLD);
78 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
80 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
88 PUT_ERR(
"error in yac_interp_grid_get_src_grid_name");
92 PUT_ERR(
"error in yac_interp_grid_get_tgt_grid_name");
95 PUT_ERR(
"error in yac_interp_grid_get_num_src_fields");
99 PUT_ERR(
"error in yac_interp_grid_get_src_field_location");
104 for (
int i = 0;
i < 2; ++
i) {
110 if (comm_size >= 4) {
113 int do_test = comm_rank < 4;
115 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &comm);
116 int comm_rank, comm_size;
117 MPI_Comm_rank(comm, &comm_rank);
118 MPI_Comm_size(comm, &comm_size);
124 int is_tgt = comm_rank >= 2;
126 double coordinates_x[2][5] = {{0.0,1.0,2.0,3.0,4.0}, {0.5,1.5,2.5,3.5,-1.0}};
127 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5,-1.0}};
129 size_t local_start[4][2] = {{0,0},{2,0},{0,0},{2,0}};
130 size_t local_count[4][2] = {{2,3},{2,3},{2,2},{1,2}};
132 for (
int i = 0;
i < 2; ++
i){
138 utest_generate_basic_grid_data_reg2d(
140 local_start[comm_rank], local_count[comm_rank],
with_halo);
142 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
152 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
153 {.location =
YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
154 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
156 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
164 size_t * tgt_indices, tgt_count;
169 interp_grid, tgt_indices, tgt_count, tgt_global_ids);
171 double tgt_coordinates[12][3];
173 interp_grid, tgt_indices, tgt_count, tgt_coordinates);
176 int count_ = (int)tgt_count, counts[4], displs[4];
177 MPI_Allgather(&count_, 1, MPI_INT, counts, 1, MPI_INT, comm);
178 for (
int i = 0, accu = 0;
i < comm_size; accu += counts[
i++])
181 int global_count = 0;
182 for (
int i = 0;
i < comm_size; ++
i) global_count += counts[i];
183 if (global_count != 12)
184 PUT_ERR(
"error in yac_interp_grid_get_tgt_points");
186 yac_int all_tgt_global_ids[12];
188 tgt_global_ids, count_,
yac_int_dt, all_tgt_global_ids,
190 double all_tgt_coordinates[12][3];
191 for (
int i = 0;
i < comm_size; ++
i) counts[i] *= 3;
192 for (
int i = 0;
i < comm_size; ++
i) displs[i] *= 3;
194 tgt_coordinates, 3*count_, MPI_DOUBLE, all_tgt_coordinates,
195 counts, displs, MPI_DOUBLE, 0, comm);
197 if (comm_rank == 0) {
198 double ref_tgt_coords[12][3];
199 for (
size_t i = 0, k = 0;
i <
num_cells[1][1]+1; ++
i)
200 for (
size_t j = 0; j <
num_cells[1][0]+1; ++j, ++k)
203 &(ref_tgt_coords[k][0]));
205 if ((all_tgt_global_ids[i] >= 12) || (all_tgt_global_ids[i] < 0))
206 PUT_ERR(
"error in yac_interp_grid_get_tgt_points");
209 PUT_ERR(
"error in yac_interp_grid_get_tgt_points");
214 size_t ref_global_count[3] = {12, 20, 31};
215 for (
size_t src_field_idx = 0; src_field_idx < 3; ++src_field_idx) {
219 PUT_ERR(
"error in yac_interp_grid_get_src_field_location");
221 size_t * src_indices, src_count;
223 interp_grid, src_field_idx, &src_indices, &src_count);
227 interp_grid, src_indices, src_count, src_field_idx, src_global_ids);
229 if (utest_check_global_ids(
230 src_global_ids, src_count, ref_global_count[src_field_idx], comm))
231 PUT_ERR(
"error in yac_interp_grid_get_src_points or "
232 "yac_interp_grid_get_src_global_ids");
237 double search_coords[15][3];
238 for (
size_t i = 0, k = 0;
i <
num_cells[1][1]+1; ++
i)
239 for (
size_t j = 0; j <
num_cells[1][0]+1; ++j, ++k)
247 size_t src_cells[15];
249 interp_grid, search_coords, 15, src_cells);
258 for (
size_t i = 0;
i < 15; ++
i) {
260 size_t curr_src_cell = src_cells[
i];
261 if (curr_src_cell != SIZE_MAX) {
263 src_grid_data, curr_src_cell, &cell);
265 PUT_ERR(
"error in yac_interp_grid_do_points_search");
275 size_t count =
sizeof(bnd_circles) /
sizeof(bnd_circles[0]);
281 bnd_circles[0].sq_crd = DBL_MAX;
287 bnd_circles[1].sq_crd = DBL_MAX;
293 bnd_circles[2].sq_crd = DBL_MAX;
299 bnd_circles[3].sq_crd = DBL_MAX;
305 bnd_circles[4].sq_crd = DBL_MAX;
307 size_t ref_num_src_per_bnd_circle[] = {1, 3, 0, 12, 2};
308 yac_int ref_src_cell_global_ids[] =
309 {0, 0,1,4, 0,1,2,3,4,5,6,7,8,9,10,11, 5,6};
311 size_t * cells, num_cells_per_bnd_circle[count];
314 interp_grid, bnd_circles, count, 0,
315 &cells, num_cells_per_bnd_circle);
317 for (
size_t i = 0, displ = 0;
i < count; ++
i) {
318 if (num_cells_per_bnd_circle[i] != ref_num_src_per_bnd_circle[i]) {
319 PUT_ERR(
"error in yac_interp_grid_do_bnd_circle_search_src");
321 yac_int src_cell_global_ids[20];
323 interp_grid, cells + displ, num_cells_per_bnd_circle[i], 0,
324 src_cell_global_ids);
325 if (utest_compare_global_ids(
326 src_cell_global_ids, ref_src_cell_global_ids + displ,
327 num_cells_per_bnd_circle[i]))
328 PUT_ERR(
"error in yac_interp_grid_do_bnd_circle_search_src");
330 displ += num_cells_per_bnd_circle[
i];
342 } bnd_circle_configs[] = {
343 {.center.lon = 0.0, .center.lat = 0.0, .inc_angle = 0.1},
344 {.center.lon = 0.0, .center.lat = 0.0, .inc_angle = 0.9},
345 {.center.lon = 0.0, .center.lat = 0.0, .inc_angle = 2.0},
346 {.center.lon = -1.0, .center.lat = -1.0, .inc_angle = 0.5},
347 {.center.lon = 1.0, .center.lat = 1.0, .inc_angle = 0.5},
348 {.center.lon = 2.0, .center.lat = 1.5, .inc_angle = 2.5},
349 {.center.lon = 2.0, .center.lat = 2.0, .inc_angle = 10.0},
352 NUM_BND_CIRCLE_CONFIGS =
353 sizeof(bnd_circle_configs) /
sizeof(bnd_circle_configs[0])};
355 for (
size_t i = 0;
i < NUM_BND_CIRCLE_CONFIGS; ++
i) {
357 bnd_circle_configs[i].
center.lon,
358 bnd_circle_configs[i].center.lat, bnd_circles[i].base_vector);
359 double inc_angle_rad = bnd_circle_configs[
i].inc_angle *
YAC_RAD;
360 bnd_circles[
i].inc_angle =
362 bnd_circles[
i].sq_crd = DBL_MAX;
367 size_t num_points_per_bnd_circle[NUM_BND_CIRCLE_CONFIGS];
369 int const src_field_idx = 1;
371 interp_grid, bnd_circles, NUM_BND_CIRCLE_CONFIGS, src_field_idx,
372 &points, num_points_per_bnd_circle);
375 for (
size_t i = 0, displ = 0;
i < NUM_BND_CIRCLE_CONFIGS; ++
i) {
378 if (num_points_per_bnd_circle[i] > 0) {
379 yac_int src_point_global_ids[100];
381 xmalloc(num_points_per_bnd_circle[i] *
sizeof(*src_coords));
383 interp_grid, points + displ, num_points_per_bnd_circle[i],
384 src_field_idx, src_point_global_ids);
386 interp_grid, points + displ, num_points_per_bnd_circle[i],
387 src_field_idx, src_coords);
390 for (
size_t j = 0; j < num_points_per_bnd_circle[
i]; ++j) {
393 bnd_circles[i].base_vector, src_coords[j]);
395 PUT_ERR(
"error in yac_interp_grid_do_dnn_search_src: "
396 "point outside bounding circle");
400 displ += num_points_per_bnd_circle[
i];
407 size_t num_points_per_bnd_circle[NUM_BND_CIRCLE_CONFIGS];
410 interp_grid, bnd_circles, NUM_BND_CIRCLE_CONFIGS,
411 &points, num_points_per_bnd_circle);
414 for (
size_t i = 0, displ = 0;
i < NUM_BND_CIRCLE_CONFIGS; ++
i) {
417 if (num_points_per_bnd_circle[i] > 0) {
418 yac_int tgt_point_global_ids[50];
420 xmalloc(num_points_per_bnd_circle[i] *
sizeof(*tgt_coords));
422 interp_grid, points + displ, num_points_per_bnd_circle[i],
423 tgt_point_global_ids);
425 interp_grid, points + displ, num_points_per_bnd_circle[i],
429 for (
size_t j = 0; j < num_points_per_bnd_circle[
i]; ++j) {
432 bnd_circles[i].base_vector, tgt_coords[j]);
434 PUT_ERR(
"error in yac_interp_grid_do_dnn_search_tgt: "
435 "point outside bounding circle");
439 displ += num_points_per_bnd_circle[
i];
456 bnd_circles[0].sq_crd = DBL_MAX;
462 bnd_circles[1].sq_crd = DBL_MAX;
468 bnd_circles[2].sq_crd = DBL_MAX;
471 size_t num_points_per_bnd_circle[count];
474 interp_grid, bnd_circles, count,
475 &points, num_points_per_bnd_circle);
478 for (
size_t i = 0, displ = 0;
i < count; ++
i) {
481 if (num_points_per_bnd_circle[i] > 0) {
482 yac_int tgt_point_global_ids[50];
484 xmalloc(num_points_per_bnd_circle[i] *
sizeof(*tgt_coords));
486 interp_grid, points + displ, num_points_per_bnd_circle[i],
487 tgt_point_global_ids);
489 interp_grid, points + displ, num_points_per_bnd_circle[i],
493 for (
size_t j = 0; j < num_points_per_bnd_circle[
i]; ++j) {
497 PUT_ERR(
"error in yac_interp_grid_do_dnn_search_tgt: "
498 "point outside bounding circle");
502 displ += num_points_per_bnd_circle[
i];
508 size_t * tgt_cells, num_tgt_cells_per_corner[12];
510 interp_grid, tgt_indices, tgt_count,
511 &tgt_cells, num_tgt_cells_per_corner);
513 yac_int const * tgt_global_corner_ids =
516 yac_int const * tgt_global_cell_ids =
520 yac_int ref_tgt_corner_cells[12][4] =
521 {{0}, {0,1}, {1,2}, {2},
522 {0,3}, {0,1,3,4}, {1,2,4,5}, {2,5},
523 {3}, {3,4}, {4,5}, {5}};
524 size_t ref_num_tgt_cells_per_corner[12] =
525 {1,2,2,1, 2,4,4,2, 1,2,2,1};
527 for (
size_t i = 0, k = 0;
i < tgt_count; ++
i) {
528 if (ref_num_tgt_cells_per_corner[
529 tgt_global_corner_ids[tgt_indices[i]]] !=
530 num_tgt_cells_per_corner[i])
531 PUT_ERR(
"ERROR in yac_interp_grid_get_tgt_corner_cells");
533 for (
size_t j = 0; j < num_tgt_cells_per_corner[
i]; ++j, ++k)
534 if (ref_tgt_corner_cells[
535 tgt_global_corner_ids[tgt_indices[i]]][j] !=
536 tgt_global_cell_ids[tgt_cells[k]])
537 PUT_ERR(
"ERROR in yac_interp_grid_get_tgt_corner_cells");
544 for (
size_t src_field_idx = 0; src_field_idx < 3; ++src_field_idx) {
549 size_t * src_indices, src_count;
551 interp_grid, src_field_idx, &src_indices, &src_count);
555 interp_grid, src_indices, src_count, src_field_idx, src_global_ids);
557 size_t * src_cells, num_src_cells_per_corner[12];
559 interp_grid, src_indices, src_count,
560 &src_cells, num_src_cells_per_corner);
562 yac_int const * src_global_corner_ids =
565 yac_int const * src_global_cell_ids =
569 yac_int ref_src_corner_cells[20][4] =
570 {{0}, {0,1}, {1,2}, {2,3}, {3},
571 {0,4}, {0,1,4,5}, {1,2,5,6}, {2,3,6,7}, {3,7},
572 {4,8}, {4,5,8,9}, {5,6,9,10}, {6,7,10,11}, {7,11},
573 {8}, {8,9}, {9,10}, {10,11}, {11}};
574 size_t ref_num_src_cells_per_corner[20] =
575 {1,2,2,2,1, 2,4,4,4,2, 2,4,4,4,2, 1,2,2,2,1};
577 for (
size_t i = 0, k = 0;
i < src_count; ++
i) {
578 if (ref_num_src_cells_per_corner[
579 src_global_corner_ids[src_indices[i]]] !=
580 num_src_cells_per_corner[i])
581 PUT_ERR(
"ERROR in yac_interp_grid_get_src_corner_cells");
583 for (
size_t j = 0; j < num_src_cells_per_corner[
i]; ++j, ++k)
584 if (ref_src_corner_cells[
585 src_global_corner_ids[src_indices[i]]][j] !=
586 src_global_cell_ids[src_cells[k]])
587 PUT_ERR(
"ERROR in yac_interp_grid_get_src_corner_cells");
604 for (
int to_tgt_owner = 0; to_tgt_owner <= 1; ++to_tgt_owner) {
606 int is_tgt = comm_rank >= 2;
609 {0.5,1.5,2.5,3.5,-1.0}};
613 size_t local_start[4][2] = {{0,0},{2,0},{0,0},{2,0}};
614 size_t local_count[4][2] = {{2,3},{2,3},{2,2},{1,2}};
616 for (
int i = 0;
i < 2; ++
i){
622 utest_generate_basic_grid_data_reg2d(
624 local_start[comm_rank], local_count[comm_rank],
with_halo);
626 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
634 malloc(
grid_data.num_cells *
sizeof(*src_cell_coordinates));
636 for (
int j = 0; j < 3; ++j) src_cell_coordinates[i][j] = 0.0;
637 size_t * cell_vertices =
640 for (
int k = 0; k < 3; ++k)
641 src_cell_coordinates[i][k] +=
642 grid_data.vertex_coordinates[cell_vertices[j]][k];
648 free(src_cell_coordinates);
656 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
659 .masks_idx = SIZE_MAX};
672 interp_grid, tgt_points, tgt_count, tgt_global_ids);
676 malloc(tgt_count *
sizeof(*tgt_coordinates));
678 interp_grid, tgt_points, tgt_count, tgt_coordinates);
681 size_t *
src_points = malloc(tgt_count *
sizeof(*src_points));
683 interp_grid, tgt_coordinates, tgt_count, 1, src_points, M_PI);
684 free(tgt_coordinates);
687 double *
weights = malloc(tgt_count *
sizeof(*weights));
688 for (
size_t i = 0;
i < tgt_count; ++
i)
689 weights[i] = (
double)tgt_global_ids[
i];
694 &tgt_points, &weights, &tgt_count);
699 interp_grid, src_points, tgt_count, 0, src_global_ids);
701 interp_grid, tgt_points, tgt_count, tgt_global_ids);
703 tgt_global_ids, tgt_count, src_global_ids, weights);
706 size_t ref_num_points[2][4] = {{6,6,0,0},{0,0,9,3}};
707 yac_int ref_global_ids[2][4][9] =
708 {{{0,1,4,5,8,9},{2,3,6,7,10,11},{-1},{-1}},
709 {{-1},{-1},{0,1,2,4,5,6,8,9,10},{3,7,11}}};
710 if (tgt_count != ref_num_points[to_tgt_owner][comm_rank])
712 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
713 for (
size_t i = 0;
i < tgt_count; ++
i) {
714 if (src_global_ids[i] != ref_global_ids[to_tgt_owner][comm_rank][i])
716 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
717 if (tgt_global_ids[i] != ref_global_ids[to_tgt_owner][comm_rank][i])
719 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
720 if (weights[i] != (
double)ref_global_ids[to_tgt_owner][comm_rank][i])
722 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
739 size_t local_start[4][2] = {{0,0},{1,0},{2,0},{3,0}};
740 size_t local_count[2] = {1,3};
745 utest_generate_basic_grid_data_reg2d(
747 local_start[comm_rank], local_count,
with_halo);
748 const char *grid_name =
"identical_artificial_grid";
754 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
756 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
763 PUT_ERR(
"error in identical grid src name");
765 PUT_ERR(
"error in identical grid tgt name");
773 MPI_Comm_free(&comm);
776 PUT_ERR(
"insufficient number of processes");
786static int utest_check_global_ids(
787 yac_int * global_ids,
int count,
int ref_global_count, MPI_Comm comm) {
791 int comm_rank, comm_size;
792 MPI_Comm_rank(comm, &comm_rank);
793 MPI_Comm_size(comm, &comm_size);
795 int * counts =
xmalloc((
size_t)comm_size *
sizeof(*counts));
796 int * displs =
xmalloc((
size_t)comm_size *
sizeof(*displs));
797 MPI_Allgather(&count, 1, MPI_INT, counts, 1, MPI_INT, comm);
798 for (
int i = 0, accu = 0;
i < comm_size; accu += counts[
i++])
801 int global_count = 0;
802 for (
int i = 0;
i < comm_size; ++
i) global_count += counts[i];
806 xmalloc((
size_t)global_count *
sizeof(*all_global_ids)):
809 global_ids, count,
yac_int_dt, all_global_ids,
812 if (comm_rank == 0) {
815 for (
int i = 0;
i < global_count; ++
i) {
816 if ((all_global_ids[i] >= ref_global_count) ||
817 (all_global_ids[i] < 0)) {
820 if (!
flag[all_global_ids[i]]) ++flag_count;
821 flag[all_global_ids[
i]] = 1;
824 if (flag_count != ref_global_count) ++error_count;
828 free(all_global_ids);
835static int utest_compare_global_ids(
838 size_t match_count = 0;
839 for (
size_t i = 0;
i < count; ++
i)
840 for (
size_t j = 0; j < count; ++j)
841 if (global_ids[i] == ref_global_ids[j]) ++match_count;
842 return match_count != count;
char const * grid_names[]
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(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates, size_t count)
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
int yac_point_in_cell(double point_coords[3], struct yac_grid_cell cell)
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)
void yac_const_basic_grid_data_get_grid_cell(struct yac_const_basic_grid_data *grid_data, size_t cell_idx, struct yac_grid_cell *buffer_cell)
static struct sin_cos_angle get_vector_angle_2(double const a[3], double const b[3])
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
static int compare_angles(struct sin_cos_angle a, struct sin_cos_angle b)
static void normalise_vector(double v[])
static double get_vector_angle(double const a[3], double const b[3])
static struct sin_cos_angle sin_cos_angle_new(double sin, double cos)
void yac_init_grid_cell(struct yac_grid_cell *cell)
void yac_free_grid_cell(struct yac_grid_cell *cell)
void yac_interp_grid_do_points_search(struct yac_interp_grid *interp_grid, yac_coordinate_pointer search_coords, size_t count, size_t *src_cells)
size_t yac_interp_grid_get_num_src_fields(struct yac_interp_grid *interp_grid)
char const * yac_interp_grid_get_src_grid_name(struct yac_interp_grid *interp_grid)
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
void yac_interp_grid_get_tgt_points(struct yac_interp_grid *interp_grid, size_t **tgt_indices, size_t *count)
char const * yac_interp_grid_get_tgt_grid_name(struct yac_interp_grid *interp_grid)
void yac_interp_grid_do_dnn_search_src(struct yac_interp_grid *interp_grid, const_bounding_circle_pointer bnd_circles, size_t count, size_t src_field_idx, size_t **src_points, size_t *num_src_per_bnd_circle)
void yac_interp_grid_get_tgt_global_ids(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, yac_int *tgt_global_ids)
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_grid_do_bnd_circle_search_src(struct yac_interp_grid *interp_grid, const_bounding_circle_pointer bnd_circles, size_t count, size_t src_field_idx, size_t **src_cells, size_t *num_src_per_bnd_circle)
void yac_interp_grid_get_tgt_corner_cells(struct yac_interp_grid *interp_grid, size_t *tgt_corners, size_t count, size_t **tgt_cells, size_t *num_cells_per_corner)
void yac_interp_grid_get_src_points(struct yac_interp_grid *interp_grid, size_t src_field_idx, size_t **src_indices, size_t *count)
enum yac_location yac_interp_grid_get_src_field_location(struct yac_interp_grid *interp_grid, size_t src_field_idx)
void yac_interp_grid_do_dnn_search_tgt(struct yac_interp_grid *interp_grid, const_bounding_circle_pointer bnd_circles, size_t count, size_t **tgt_points, size_t *num_tgt_per_bnd_circle)
void yac_interp_grid_get_src_coordinates(struct yac_interp_grid *interp_grid, size_t *src_points, size_t count, size_t src_field_idx, yac_coordinate_pointer src_coordinates)
void yac_interp_grid_do_nnn_search_src(struct yac_interp_grid *interp_grid, yac_coordinate_pointer search_coords, size_t count, size_t n, size_t *src_points, double max_search_distance)
void yac_interp_grid_get_src_corner_cells(struct yac_interp_grid *interp_grid, size_t *src_corners, size_t count, size_t **src_cells, size_t *num_cells_per_corner)
void yac_interp_grid_get_tgt_coordinates(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, yac_coordinate_pointer tgt_coordinates)
struct yac_const_basic_grid_data * yac_interp_grid_get_basic_grid_data_tgt(struct yac_interp_grid *interp_grid)
void yac_interp_grid_get_src_global_ids(struct yac_interp_grid *interp_grid, size_t *src_points, size_t count, size_t src_field_idx, yac_int *src_global_ids)
void yac_interp_grid_relocate_src_tgt_pairs_orig(struct yac_interp_grid *interp_grid, int to_tgt_owner, enum yac_location src_location, size_t **src_points, size_t **tgt_points, double **weights, size_t *count)
struct yac_const_basic_grid_data * yac_interp_grid_get_basic_grid_data_src(struct yac_interp_grid *interp_grid)
#define xcalloc(nmemb, size)
struct yac_basic_grid_data yac_read_icon_basic_grid_data_parallel(const char *filename, MPI_Comm comm)
struct sin_cos_angle inc_angle
angle between the middle point and the boundary of the spherical cap
int * num_vertices_per_cell
const const_yac_int_pointer ids[3]
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
static void LLtoXYZ(double lon, double lat, double p_out[])
void yac_quicksort_index_yac_int_yac_int_double(yac_int *a, size_t n, yac_int *b, double *c)
double(* yac_coordinate_pointer)[3]