25static void utest_get_basic_grid_data(
26 char * filename,
size_t *
num_cells,
size_t * num_vertices,
29static void utest_check_indices(
31 size_t count,
size_t global_count);
33static void utest_check_global_ids(
34 yac_int const * ids,
size_t count,
35 int *
mask,
int global_count,
36 int * core_mask, MPI_Comm comm);
38static void utest_check_unmasked_global_ids(
39 yac_int const * ids,
size_t count,
40 int *
mask,
int global_count,
41 int * global_core_mask, MPI_Comm comm);
43static void utest_check_dist_owner(
46 int with_cell_ids, MPI_Comm comm);
48int main(
int argc,
char** argv) {
52 xt_initialize(MPI_COMM_WORLD);
56 int comm_rank, comm_size;
57 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
58 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
62 PUT_ERR(
"ERROR: missing grid file directory");
69 char * grid_filenames[] =
70 {
"icon_grid_0030_R02B03_G.nc",
"icon_grid_0043_R02B04_G.nc"};
71 for (
int i = 0;
i < 2; ++
i)
75 malloc(strlen(argv[1]) + strlen(grid_filenames[i]) + 2), argv[1]),
79 char const *
grid_names[2] = {
"grid_1",
"grid2"};
81 for (
int i = 0;
i < 2; ++
i)
87 for (
int i = 0;
i < 2; ++
i) {
91 for (
size_t j = 0; j <
grid_data[
i].num_edges; ++j) {
93 for (
size_t k = 0; k < 3; ++k)
94 edge_coordinates[i][j][k] =
108 for (
int i = 0;
i < 2; ++
i) {
110 edge_field[
i].coordinates_idx =
113 edge_field[
i].masks_idx = SIZE_MAX;
117 size_t num_search_coords[2];
118 for (
int i = 0;
i < 2; ++
i) {
119 search_coordinates[
i] = edge_coordinates[
i];
120 num_search_coords[
i] =
grid_data[
i].num_edges / 32;
121 for (
size_t j = 0; j < num_search_coords[
i]; ++j)
122 for (
int k = 0; k < 3; ++k)
123 search_coordinates[i][j][k] =
124 search_coordinates[i][32 * j][k];
125 search_coordinates[
i] =
127 search_coordinates[i],
128 num_search_coords[i] *
sizeof(*search_coordinates[i]));
136 for (
int i = 0;
i < 2; ++
i) {
137 global_ids[
i][0].global_ids =
grid_data[
i].cell_ids;
138 global_ids[
i][0].core_mask =
grid_data[
i].core_cell_mask;
139 global_ids[
i][1].global_ids =
grid_data[
i].vertex_ids;
140 global_ids[
i][1].core_mask =
grid_data[
i].core_vertex_mask;
141 global_ids[
i][2].global_ids =
grid_data[
i].edge_ids;
142 global_ids[
i][2].core_mask =
grid_data[
i].core_edge_mask;
145 for (
int k = 0; k < 8; ++k) {
147 for (
int i = 0;
i < 2; ++
i) {
151 curr_basic_grid_data->
cell_ids = NULL;
154 curr_basic_grid_data->
cell_ids = global_ids[
i][0].global_ids;
161 curr_basic_grid_data->
vertex_ids = global_ids[
i][1].global_ids;
165 curr_basic_grid_data->
edge_ids = NULL;
168 curr_basic_grid_data->
edge_ids = global_ids[
i][2].global_ids;
176 for (
int i = 0;
i < 2; ++
i) {
186 utest_get_basic_grid_data(filenames[i], &counts[0], &counts[1], &counts[2]);
196 for (
size_t j = 0; j < 3; ++j) {
199 uint64_t local_count =
202 uint64_t global_count;
204 &local_count, &global_count, 1, MPI_UINT64_T, MPI_SUM,
206 if ((uint64_t)(counts[j]) != global_count)
207 PUT_ERR(
"error in yac_dist_grid_get_local_count\n");
210 size_t * indices,
count;
213 .coordinates_idx = SIZE_MAX,
214 .masks_idx = SIZE_MAX},
217 if (
count != local_count)
218 PUT_ERR(
"error in yac_dist_grid_get_local_unmasked_points\n");
220 utest_check_indices(
ids[j], indices,
count, counts[j]);
226 size_t * result_ids =
227 malloc(1 * num_search_coords[i^1] *
sizeof(*result_ids));
229 grid_pair,
grid_names[i], search_coordinates[i^1],
230 num_search_coords[i^1], result_ids, 1, edge_field[i], M_PI);
236 for (
int i = 0;
i < 2; ++
i) {
240 free(curr_basic_grid_data->
cell_ids);
242 curr_basic_grid_data->
cell_ids = NULL;
252 free(curr_basic_grid_data->
edge_ids);
254 curr_basic_grid_data->
edge_ids = NULL;
260 for (
int i = 0;
i < 2; ++
i) {
262 for (
int j = 0; j < 3; ++j) {
263 free(global_ids[i][j].global_ids);
264 free(global_ids[i][j].core_mask);
267 free(search_coordinates[i]);
271 if (comm_size >= 4) {
274 int do_test = comm_rank < 4;
276 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &comm);
280 int comm_rank, comm_size;
281 MPI_Comm_rank(comm, &comm_rank);
282 MPI_Comm_size(comm, &comm_size);
284 int is_tgt = comm_rank >= 2;
286 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}};
287 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5,-1.0}};
289 size_t local_start[4][2] = {{0,0},{2,0},{0,0},{2,0}};
290 size_t local_count[4][2] = {{2,3},{2,3},{2,2},{1,2}};
311 for (
int i = 0;
i < 2; ++
i){
319 local_start[comm_rank], local_count[comm_rank],
with_halo);
323 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
329 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
339 size_t num_points[2][3] = {{12,20,31}, {6,12,17}};
342 int * core_masks[2][3] =
343 {{core_cell_mask[0], core_vertex_mask[0], core_edge_mask[0]},
344 {core_cell_mask[1], core_vertex_mask[1], core_edge_mask[1]}};
345 for (
int i = 0;
i < 2; ++
i)
346 for (
int j = 0; j < 3; ++j)
347 utest_check_dist_owner(
349 core_masks[i][j], 1,
comm);
354 int ref_num_cells[2] = {12, 6};
355 int ref_num_vertices[2] = {20, 12};
356 int ref_num_edges[2] = {31, 17};
357 int ref_cell_to_vertex[2][12][4] =
358 {{{0,1,6,5},{1,2,7,6},{2,3,8,7},{3,4,9,8},
359 {5,6,11,10},{6,7,12,11},{7,8,13,12},{8,9,14,13},
360 {10,11,16,15},{11,12,17,16},{12,13,18,17},{13,14,19,18}},
361 {{0,1,5,4},{1,2,6,5},{2,3,7,6},
362 {4,5,9,8},{5,6,10,9},{6,7,11,10}}};
363 int ref_cell_to_edge[2][12][4] =
364 {{{0,3,9,1},{2,5,11,3},{4,7,13,5},{6,8,15,7},
365 {9,12,18,10},{11,14,20,12},{13,16,22,14},{15,17,24,16},
366 {18,21,27,19},{20,23,28,21},{22,25,29,23},{24,26,30,25}},
367 {{0,3,7,1},{2,5,9,3},{4,6,11,5},
368 {7,10,14,8},{9,12,15,10},{11,13,16,12}}};
383 int * core_masks[2][3] =
384 {{core_cell_mask[0], core_vertex_mask[0], core_edge_mask[0]},
385 {core_cell_mask[1], core_vertex_mask[1], core_edge_mask[1]}};
391 for (
int i = 0;
i < 2; ++
i) {
397 utest_check_global_ids(
400 utest_check_global_ids(
402 vertex_mask, ref_num_vertices[i], core_masks[i][
YAC_LOC_CORNER], comm);
403 utest_check_global_ids(
405 edge_mask, ref_num_edges[i], core_masks[i][
YAC_LOC_EDGE], comm);
412 PUT_ERR(
"error in num_vertices_per_cell");
414 for (
int k = 0; k < 4; ++k) {
415 if (ref_cell_to_vertex[i][curr_cell_id][k] !=
418 grid_data->cell_to_vertex_offsets[j]+k]])
419 PUT_ERR(
"error in cell_to_vertex");
421 if (ref_cell_to_edge[i][curr_cell_id][k] !=
425 PUT_ERR(
"error in cell_to_edge");
436 size_t * local_vertex_indices, local_vertex_count;
440 .coordinates_idx = SIZE_MAX,
441 .masks_idx = SIZE_MAX},
442 &local_vertex_indices, &local_vertex_count);
444 yac_int global_vertex_indices[20];
446 for (
size_t j = 0; j < local_vertex_count; ++j)
447 global_vertex_indices[j] =
450 utest_check_unmasked_global_ids(
451 global_vertex_indices, local_vertex_count,
452 vertex_mask, ref_num_vertices[i], core_vertex_mask[i],
455 free(local_vertex_indices);
460 yac_int global_edge_ids[ref_num_edges[
i]];
461 size_t local_edge_ids[ref_num_edges[
i]];
462 size_t edge_count = 0;
463 for (
int j = 0; j < ref_num_edges[
i]; ++j)
464 if (core_edge_mask[i][j])
465 global_edge_ids[edge_count++] = j;
469 YAC_LOC_EDGE, global_edge_ids, edge_count, local_edge_ids);
475 for (
size_t j = 0; j < edge_count; ++j) {
479 PUT_ERR(
"ERROR in yac_dist_grid_global_to_local");
481 if (ref_edge_type[i][global_edge_ids[j]] !=
483 PUT_ERR(
"ERROR in yac_dist_grid_global_to_local");
489 size_t * local_vertex_indices, local_vertex_count;
493 .coordinates_idx = SIZE_MAX,
494 .masks_idx = SIZE_MAX},
495 &local_vertex_indices, &local_vertex_count);
497 size_t * vertex_to_cell;
498 size_t num_cells_per_vertex[20];
500 grid_pair,
grid_names[i], local_vertex_indices,
501 local_vertex_count, &vertex_to_cell, num_cells_per_vertex);
503 yac_int const * global_corner_ids =
507 yac_int const * global_cell_ids =
512 yac_int ref_corner_cells[2][20][4] =
513 {{{-1}, {-1}, {-1}, {-1}, {-1},
514 {-1}, {5}, {5,6}, {6}, {-1},
515 {-1}, {5}, {5,6}, {6}, {-1},
516 {-1}, {-1}, {-1}, {-1}, {-1}},
517 {{-1}, {-1}, {-1}, {-1},
518 {-1}, {4}, {4}, {-1},
519 {-1}, {4}, {4}, {-1}}};
520 size_t ref_num_cells_per_corner[2][20] =
521 {{0,0,0,0,0, 0,1,2,1,0, 0,1,2,1,0, 0,0,0,0,0},
522 {0,0,0,0, 0,1,1,0, 0,1,1,0}};
524 for (
size_t j = 0, l = 0; j < local_vertex_count; ++j) {
525 if (ref_num_cells_per_corner[i][
526 global_corner_ids[local_vertex_indices[j]]] !=
527 num_cells_per_vertex[j])
528 PUT_ERR(
"ERROR in yac_dist_grid_pair_get_corner_cells");
530 for (
size_t k = 0; k < num_cells_per_vertex[j]; ++k, ++l)
531 if (ref_corner_cells[i][
533 local_vertex_indices[j]]][k] !=
534 global_cell_ids[vertex_to_cell[l]])
535 PUT_ERR(
"ERROR in yac_dist_grid_pair_get_corner_cells");
538 free(local_vertex_indices);
539 free(vertex_to_cell);
549 MPI_Comm_free(&comm);
552 PUT_ERR(
"insufficient number of processes");
555 if (comm_size >= 3) {
558 int do_test = comm_rank < 3;
560 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &comm);
564 int comm_rank, comm_size;
565 MPI_Comm_rank(comm, &comm_rank);
566 MPI_Comm_size(comm, &comm_size);
568 int is_tgt = comm_rank == 2;
570 for (
int with_cell_ids = 0; with_cell_ids < 2; ++with_cell_ids) {
574 size_t nbr_vertices[2] = {5, 2};
576 double lon_vertices[] = {-2.0,-1.0,0.0,1.0,2.0};
577 double lat_vertices[] = {-0.5,0.5};
580 nbr_vertices,
cyclic, lon_vertices, lat_vertices);
582 size_t nbr_vertices[2] = {7,8};
583 size_t nbr_cells[2] = {4,4};
585 double x_vertices[2][8] = {{-1.5,-0.5,0.5,-2.0,0.0,-0.75,0.5},
586 {-0.5,0.5,1.5,0.0,2.0,-0.75,0.5,1.5}};
587 double y_vertices[2][8] = {{-0.5,-0.5,-0.5,0.0,0.0,0.5,0.5},
588 {-0.5,-0.5,-0.5,0.0,0.0,0.5,0.5,0.5}};
589 int cell_to_vertex[2][12] = {{0,1,4,5,3, 1,2,4, 4,6,5},
590 {0,1,3, 1,2,4,7,6,3, 3,6,5}};
592 static yac_int vertex_ids[2][8] = {{0,1,2,4,5,7,8}, {1,2,3,4,6,7,8,9}};
593 static yac_int edge_ids[2][10] = {{0,1,2,3,5,7,8,9,11}, {2,3,4,5,6,8,9,10,11,12}};
595 static int core_vertex_mask[2][8] = {{1,1,0,1,1,1,0},{0,1,1,1,1,0,1,1}};
596 static int core_edge_mask[2][10] = {{1,1,0,1,0,1,1,0,0}, {0,0,1,1,1,0,1,1,0,1}};
599 nbr_vertices[comm_rank], nbr_cells[comm_rank],
601 x_vertices[comm_rank], y_vertices[comm_rank],
613 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
623 size_t num_points[2][3] = {{5,10,13}, {4,10,13}};
626 int core_masks[2][3][13] =
627 {{{1,0,0,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,0,1,1,1,1,1,1,1,1,0,1}},
629 {1,1,1,1,1,1,1,1,1,1},
630 {1,1,1,1,1,1,1,1,1,1,1,1,1}}};
631 for (
int i = 0;
i < 2; ++
i)
632 for (
int j = 0; j < 3; ++j)
633 utest_check_dist_owner(
635 core_masks[i][j], with_cell_ids,
comm);
645 MPI_Comm_free(&
comm);
648 PUT_ERR(
"insufficient number of processes");
655 int do_test = comm_rank < 1;
657 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &
comm);
661 int comm_rank, comm_size;
662 MPI_Comm_rank(
comm, &comm_rank);
663 MPI_Comm_size(
comm, &comm_size);
665 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}};
666 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5,-1.0}};
668 size_t local_start[2][2] = {{0,0},{0,0}};
669 size_t local_count[2][2] = {{4,3},{3,2}};
671 for (
int i = 0;
i < 2; ++
i){
679 local_start[0], local_count[0],
with_halo),
682 local_start[1], local_count[1],
with_halo)};
683 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
694 int ref_num_cells[2] = {12, 6};
695 int ref_num_vertices[2] = {20, 12};
696 int ref_num_edges[2] = {31, 17};
697 int ref_cell_to_vertex[2][12][4] =
698 {{{0,1,6,5},{1,2,7,6},{2,3,8,7},{3,4,9,8},
699 {5,6,11,10},{6,7,12,11},{7,8,13,12},{8,9,14,13},
700 {10,11,16,15},{11,12,17,16},{12,13,18,17},{13,14,19,18}},
701 {{0,1,5,4},{1,2,6,5},{2,3,7,6},
702 {4,5,9,8},{5,6,10,9},{6,7,11,10}}};
703 int ref_cell_to_edge[2][12][4] =
704 {{{0,3,9,1},{2,5,11,3},{4,7,13,5},{6,8,15,7},
705 {9,12,18,10},{11,14,20,12},{13,16,22,14},{15,17,24,16},
706 {18,21,27,19},{20,23,28,21},{22,25,29,23},{24,26,30,25}},
707 {{0,3,7,1},{2,5,9,3},{4,6,11,5},
708 {7,10,14,8},{9,12,15,10},{11,13,16,12}}};
728 for (
int i = 0;
i < 2; ++
i) {
734 utest_check_global_ids(
736 cell_mask, ref_num_cells[i], NULL, comm);
737 utest_check_global_ids(
739 vertex_mask, ref_num_vertices[i], NULL, comm);
740 utest_check_global_ids(
742 edge_mask, ref_num_edges[i], NULL, comm);
749 PUT_ERR(
"error in num_vertices_per_cell");
751 for (
int k = 0; k < 4; ++k) {
752 if (ref_cell_to_vertex[i][curr_cell_id][k] !=
755 grid_data->cell_to_vertex_offsets[j]+k]])
756 PUT_ERR(
"error in cell_to_vertex");
758 if (ref_cell_to_edge[i][curr_cell_id][k] !=
762 PUT_ERR(
"error in cell_to_edge");
778 MPI_Comm_free(&comm);
786 int do_test = comm_rank < 1;
788 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &comm);
792 int comm_rank, comm_size;
793 MPI_Comm_rank(comm, &comm_rank);
794 MPI_Comm_size(comm, &comm_size);
796 double x_vertices[] = {0,1,2,3,0,1,2,3};
797 double y_vertices[] = {0,0,0,0,1,1,1,1};
798 int cell_to_vertex[][4] = {{0,1,5,4},{1,2,6,5},{2,3,7,6}};
800 size_t nbr_vertices =
sizeof(x_vertices)/
sizeof(x_vertices[0]);
804 yac_int vertex_ids[] = {0,1,2,3,4,5,6,7};
805 yac_int edge_ids[] = {0,1,2,3,4,5,6,7,8,9};
806 int core_cell_mask[] = {0,1,0};
807 int core_vertex_mask[] = {0,1,1,1,0,1,1,1};
808 int core_edge_mask[] = {0,0,1,1,0,1,0,0,1,1};
811 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
814 for (
int i = 0;
i < 2; ++
i) {
817 nbr_vertices, nbr_cells, num_vertices_per_cell,
834 size_t ref_local_count[] = {1, 6, 5};
841 for (
int i = 0;
i < 3; ++
i) {
843 if (ref_local_count[i] !=
845 PUT_ERR(
"ERROR in yac_dist_grid_get_local_count");
855 MPI_Comm_free(&
comm);
863 int do_test = comm_rank < 1;
865 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &
comm);
869 int comm_rank, comm_size;
870 MPI_Comm_rank(
comm, &comm_rank);
871 MPI_Comm_size(
comm, &comm_size);
873 double x_vertices[] = {-1.0,0.0,1.0,-0.5,0.5,0.0};
874 double y_vertices[] = {0.0,0.0,0.0,1.0,1.0,2.0};
875 int cell_to_vertex[][3] = {{0,1,3},{1,2,4},{1,4,3},{3,4,5},{1,4,3}};
877 size_t nbr_vertices =
sizeof(x_vertices)/
sizeof(x_vertices[0]);
880 yac_int cell_ids[] = {0,1,2,3,4};
881 int core_cell_mask[] = {1,1,1,1,0};
884 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
887 for (
int i = 0;
i < 2; ++
i) {
890 nbr_vertices, nbr_cells, num_vertices_per_cell,
905 MPI_Comm_free(&
comm);
910 MPI_Comm_dup(MPI_COMM_WORLD, &
comm);
913 double coordinates_y[] = {-M_PI_2, 0.1-M_PI_2, 0.2-M_PI_2, 0.3-M_PI_2};
914 size_t num_vertices[] = {4,4};
917 int comm_rank, comm_size;
918 MPI_Comm_rank(
comm, &comm_rank);
919 MPI_Comm_size(
comm, &comm_size);
921 int is_tgt = comm_rank == 0;
927 char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
938 for (
int i = 0;
i < 2; ++
i) {
948 MPI_Comm_free(&
comm);
958static void utest_get_basic_grid_data(
959 char * filename,
size_t *
num_cells,
size_t * num_vertices,
960 size_t * num_edges) {
977static void utest_check_indices(
979 size_t count,
size_t global_count) {
981 int comm_rank, comm_size;
982 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
983 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
986 (global_count * (size_t)comm_rank + (
size_t)comm_size - 1) /
988 size_t next_local_start =
989 (global_count * (size_t)(comm_rank + 1) + (size_t)comm_size - 1) /
991 size_t local_size = next_local_start - local_start;
993 Xt_int * src_global_ids =
xmalloc(count *
sizeof(*src_global_ids));
994 for (
size_t i = 0;
i < count; ++
i)
995 src_global_ids[i] = (Xt_int)(ids[indices[
i]]);
997 struct Xt_stripe dst_stripe =
998 {.start = (Xt_int)local_start, .stride = 1, .nstrides = (
int)local_size};
1000 Xt_idxlist src_idxlist = xt_idxvec_new(src_global_ids, (
int)count);
1001 Xt_idxlist dst_idxlist = xt_idxstripes_new(&dst_stripe, 1);
1002 Xt_xmap xmap = xt_xmap_dist_dir_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);
1003 Xt_redist redist = xt_redist_p2p_new(xmap, Xt_int_dt);
1005 Xt_int * collected_ids =
xmalloc(local_size *
sizeof(*collected_ids));
1007 xt_redist_s_exchange1(redist, src_global_ids, collected_ids);
1009 for (
size_t i = 0;
i < local_size; ++
i)
1010 if (collected_ids[i] != (Xt_int)(i + local_start))
PUT_ERR(
"missing id");
1012 free(collected_ids);
1013 xt_redist_delete(redist);
1014 xt_xmap_delete(xmap);
1015 xt_idxlist_delete(dst_idxlist);
1016 xt_idxlist_delete(src_idxlist);
1017 free(src_global_ids);
1020static void utest_check_global_ids(
yac_int const * ids,
size_t count,
1021 int *
mask,
int global_count,
1022 int * core_mask, MPI_Comm comm) {
1024 for (
int i = 0;
i < global_count; ++
i)
mask[i] = 0;
1026 for (
size_t i = 0;
i < count; ++
i)
mask[ids[i]] = 1;
1028 MPI_Allreduce(MPI_IN_PLACE,
mask, global_count, MPI_INT, MPI_MAX, comm);
1030 for (
int i = 0;
i < global_count; ++
i) {
1031 if (((core_mask == NULL) || core_mask[i]) || core_mask == NULL) {
1039static void utest_check_unmasked_global_ids(
yac_int const * ids,
size_t count,
1040 int *
mask,
int global_count,
1041 int * global_core_mask, MPI_Comm comm) {
1043 for (
int i = 0;
i < global_count; ++
i)
mask[i] = 0;
1045 for (
size_t i = 0;
i < count; ++
i)
mask[ids[i]] = 1;
1047 MPI_Allreduce(MPI_IN_PLACE,
mask, global_count, MPI_INT, MPI_SUM, comm);
1049 for (
int i = 0;
i < global_count; ++
i) {
1051 if (
mask[i] != global_core_mask[i])
1052 PUT_ERR(
"masked data is owned by a process");
1056static void utest_check_dist_owner(
1059 int with_cell_ids, MPI_Comm comm) {
1068 size_t points[local_size];
1069 for (
size_t i = 0;
i < local_size; ++
i)
points[i] = i;
1072 int local_ranks[local_size];
1074 grid_pair, grid_name,
points, local_size,
location, local_ranks);
1077 int global_ranks[global_size];
1078 for (
size_t i = 0;
i < global_size; ++
i) global_ranks[i] = INT_MAX;
1079 for (
size_t i = 0;
i < local_size; ++
i)
1080 global_ranks[local_ids[i]] = local_ranks[i];
1082 MPI_IN_PLACE, global_ranks, (
int)global_size, MPI_INT, MPI_MIN, comm);
1086 if (with_cell_ids) {
1087 for (
size_t i = 0;
i < global_size; ++
i)
1088 if (((global_ranks[i] == INT_MAX) && core_mask[i]) ||
1089 ((global_ranks[i] != INT_MAX) && !core_mask[i]))
1090 PUT_ERR(
"ERROR in yac_dist_grid_pair_determine_dist_owner");
1092 size_t num_unmasked = 0;
1093 size_t num_owners = 0;
1094 for (
size_t i = 0;
i < global_size; ++
i) {
1095 if (core_mask[i]) ++num_unmasked;
1096 if (global_ranks[i] != INT_MAX) ++num_owners;
1098 if (num_unmasked != num_owners)
1099 PUT_ERR(
"ERROR in yac_dist_grid_pair_determine_dist_owner");
1102 for (
size_t i = 0;
i < global_size; ++
i)
1103 if (global_ranks[i] == INT_MAX)
1104 PUT_ERR(
"ERROR in yac_dist_grid_pair_determine_dist_owner");
1108 for (
size_t i = 0;
i < local_size; ++
i)
1109 if (global_ranks[local_ids[i]] != local_ranks[i])
1110 PUT_ERR(
"ERROR in yac_dist_grid_pair_determine_dist_owner");
1113 MPI_Comm_rank(comm, &comm_rank);
1116 for (
size_t i = 0;
i < global_size; ++
i) {
1117 if (global_ranks[i] == comm_rank) {
1119 for(
size_t j = 0; (j < local_size) && !found; ++j)
1120 if (local_ids[j] == (
yac_int)
i) found = 1;
1122 PUT_ERR(
"ERROR in yac_dist_grid_pair_determine_dist_owner");
char const * grid_names[]
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
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)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_deg(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
void yac_dist_grid_pair_determine_dist_owner(struct yac_dist_grid_pair *grid_pair, char const *grid_name, size_t *points, size_t count, enum yac_location location, int *ranks)
size_t yac_dist_grid_get_local_count(struct yac_dist_grid *dist_grid, enum yac_location location)
void yac_dist_grid_pair_do_nnn_search(struct yac_dist_grid_pair *grid_pair, char const *grid_name, yac_coordinate_pointer search_coords, size_t count, size_t *local_ids, size_t n, struct yac_interp_field field, double max_search_distance)
yac_size_t_2_pointer yac_dist_grid_generate_edge_to_cell(struct yac_dist_grid_pair *grid_pair, char const *grid_name)
struct yac_dist_grid * yac_dist_grid_pair_get_dist_grid(struct yac_dist_grid_pair *grid_pair, char const *grid_name)
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_dist_grid_get_local_unmasked_points(struct yac_dist_grid *dist_grid, struct yac_interp_field field, size_t **indices, size_t *num_indices)
struct yac_const_basic_grid_data * yac_dist_grid_get_basic_grid_data(struct yac_dist_grid *dist_grid)
void yac_dist_grid_global_to_local(struct yac_dist_grid *dist_grid, enum yac_location location, yac_int *global_ids, size_t count, size_t *local_ids)
void yac_dist_grid_pair_get_corner_cells(struct yac_dist_grid_pair *grid_pair, char const *grid_name, size_t *vertices, size_t count, size_t **vertex_to_cell, size_t *num_cells_per_vertex)
yac_int const * const_yac_int_pointer
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d(double const *global_coords_x, double const *global_coords_y, size_t const num_global_cells_[2], size_t const local_start[2], size_t const local_count[2], int with_halo)
static void normalise_vector(double v[])
@ YAC_LAT_CIRCLE_EDGE
latitude circle
@ YAC_LON_CIRCLE_EDGE
longitude circle
void yac_nc_open(const char *path, int omode, int *ncidp)
void yac_nc_inq_dimid(int ncid, char const *name, int *dimidp)
struct yac_basic_grid_data yac_read_icon_basic_grid_data_parallel(const char *filename, MPI_Comm comm)
int * num_vertices_per_cell
yac_coordinate_pointer vertex_coordinates
yac_size_t_2_pointer edge_to_vertex
int * num_vertices_per_cell
const const_int_pointer num_vertices_per_cell
const const_yac_int_pointer ids[3]
int * num_vertices_per_cell
enum yac_location location
static enum yac_location locations[]
void set_even_io_rank_list(MPI_Comm comm)
#define YAC_HANDLE_ERROR(exp)
static struct user_input_data_points ** points
struct yac_basic_grid ** grids
size_t(* yac_size_t_2_pointer)[2]
double(* yac_coordinate_pointer)[3]