32 int comm_size, comm_rank;
34 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
35 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
37 if ((comm_size != 4) && (comm_rank == 0)) {
38 fputs(
"wrong number of processes (has to be four)\n", stderr);
42 char const filename[] =
"test_read_icon_parallel_grid_c.nc";
46 int ref_nbr_cells[4] = {11, 9, 14, 9};
47 int ref_nbr_vertices[4] = {11, 10, 13, 10};
48 int ref_cell_to_vertex[14][3];
49 int ref_global_cell_ids[4][14] = {{0,1,2,3,4,5,7,8,9,10,11},
51 {8,9,10,11,0,1,2,3,4,5,7,12,14,15},
52 {12,13,14,15,7,8,9,10,11}};
53 int ref_cell_owner[14];
54 int ref_global_vertex_ids[4][13] = {{0,1,2,5,6,7,9,10,11,12,13},
55 {5,6,7,8,9,10,11,12,13,14},
56 {0,1,2,3,5,6,7,8,9,10,11,12,13},
57 {1,2,3,4,6,7,8,10,11,13}};
58 int ref_vertex_owner[13];
61 int all_cell_to_vertex[16][3] =
62 {{0,1,5}, {1,5,6}, {5,6,9}, {6,9,10}, {9,10,12}, {10,12,13}, {12,13,14},
63 {10,11,13}, {7,10,11}, {6,7,10}, {2,6,7}, {1,2,6}, {2,3,7}, {3,4,8},
65 for (
int i = 0;
i < ref_nbr_cells[comm_rank]; ++
i) {
66 for (
int j = 0; j < 3; ++j) {
67 for (
int k = 0; k < ref_nbr_vertices[comm_rank]; ++k) {
68 if (all_cell_to_vertex[ref_global_cell_ids[comm_rank][i]][j] ==
69 ref_global_vertex_ids[comm_rank][k]) {
70 ref_cell_to_vertex[
i][j] = k;
76 int global_cell_owner[16] = {0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3};
77 for (
int i = 0;
i < ref_nbr_cells[comm_rank]; ++
i) {
79 global_cell_owner[ref_global_cell_ids[comm_rank][
i]];
80 if (ref_cell_owner[i] == comm_rank) ref_cell_owner[
i] = -1;
82 int global_vertex_owner[15] = {0,2,3,3,3,0,2,3,3,1,2,3,1,1,1};
83 for (
int i = 0;
i < ref_nbr_vertices[comm_rank]; ++
i) {
85 global_vertex_owner[ref_global_vertex_ids[comm_rank][
i]];
86 if (ref_vertex_owner[i] == comm_rank) ref_vertex_owner[
i] = -1;
91 enum {NUM_COORD_UNIT =
sizeof(coord_unit) /
sizeof(coord_unit[0])};
93 for (
int coord_unit_idx = 0; coord_unit_idx < NUM_COORD_UNIT;
100 MPI_Barrier(MPI_COMM_WORLD);
103 int nbr_vertices, nbr_cells;
104 int * num_vertices_per_cell;
106 int * global_cell_ids;
108 int * global_vertex_ids;
110 double * x_vertices, * y_vertices;
111 double * x_cells, * y_cells;
115 filename, MPI_COMM_WORLD, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
116 &
cell_to_vertex, &global_cell_ids, &cell_owner, &global_vertex_ids,
117 &vertex_owner, &x_vertices, &y_vertices, &x_cells, &y_cells, &
cell_mask);
119 if (nbr_cells != ref_nbr_cells[comm_rank])
120 PUT_ERR(
"wrong number of vertices\n");
121 if (nbr_vertices != ref_nbr_vertices[comm_rank])
122 PUT_ERR(
"wrong number of vertices\n");
123 for (
int i = 0;
i < nbr_cells; ++
i)
124 if (num_vertices_per_cell[i] != 3)
125 PUT_ERR(
"wrong number of vertices per cell\n");
126 for (
int i = 0;
i < nbr_cells; ++
i) {
127 for (
int j = 0; j < 3; ++j)
129 PUT_ERR(
"error in cell_to_vertex\n");
130 if (global_cell_ids[i] != ref_global_cell_ids[comm_rank][i])
131 PUT_ERR(
"wrong global cell id\n");
132 if (cell_owner[i] != ref_cell_owner[i])
135 x_cells[i],
clon[ref_global_cell_ids[comm_rank][i]] *
YAC_RAD))
136 PUT_ERR(
"wrong cell longitude\n");
138 y_cells[i],
clat[ref_global_cell_ids[comm_rank][i]] *
YAC_RAD))
139 PUT_ERR(
"wrong cell latitude\n");
143 for (
int i = 0;
i < nbr_vertices; ++
i) {
144 if (global_vertex_ids[i] != ref_global_vertex_ids[comm_rank][i])
145 PUT_ERR(
"wrong global vertex id\n");
146 if (vertex_owner[i] != ref_vertex_owner[i])
PUT_ERR(
"wrong vertex owner\n");
148 x_vertices[i],
vlon[ref_global_vertex_ids[comm_rank][i]] *
YAC_RAD))
149 PUT_ERR(
"wrong vertex longitude\n");
151 y_vertices[i],
vlat[ref_global_vertex_ids[comm_rank][i]] *
YAC_RAD))
152 PUT_ERR(
"wrong vertex latitude\n");
155 free(num_vertices_per_cell);
159 free(global_cell_ids);
160 free(global_vertex_ids);
173 PUT_ERR(
"error in yac_read_icon_basic_grid_data_parallel");
175 PUT_ERR(
"error in yac_read_icon_basic_grid_data_parallel");
183 filename,
"icon_grid", MPI_COMM_WORLD);
185 PUT_ERR(
"error in yac_read_icon_basic_grid_parallel");
187 PUT_ERR(
"error in yac_read_icon_basic_grid_parallel");
193 size_t cell_coordinates_idx;
196 filename,
"icon_grid", MPI_COMM_WORLD, &icon_grid,
199 PUT_ERR(
"error in yac_read_icon_basic_grid_parallel_2");
201 PUT_ERR(
"error in yac_read_icon_basic_grid_parallel_2");
202 if (cell_coordinates_idx != 0)
203 PUT_ERR(
"error in yac_read_icon_basic_grid_parallel_2");
209 MPI_Barrier(MPI_COMM_WORLD);
210 if (comm_rank == 0) unlink(filename);
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
void yac_basic_grid_data_free(struct yac_basic_grid_data grid)
struct yac_basic_grid_data yac_read_icon_basic_grid_data_parallel(const char *filename, MPI_Comm comm)
void yac_read_icon_grid_information_parallel(const char *filename, MPI_Comm comm, int *nbr_vertices, int *nbr_cells, int **num_vertices_per_cell, int **cell_to_vertex, int **global_cell_ids, int **cell_owner, int **global_vertex_ids, int **vertex_owner, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **cell_msk)
void yac_read_icon_basic_grid_parallel_2(char const *filename, char const *gridname, MPI_Comm comm, struct yac_basic_grid **basic_grid, size_t *cell_coordinate_idx, int **cell_mask)
struct yac_basic_grid * yac_read_icon_basic_grid_parallel(char const *filename, char const *gridname, MPI_Comm comm)
int double_are_unequal(double a, double b)
void set_even_io_rank_list(MPI_Comm comm)
void write_test_grid_file(char const *file_name, enum coord_units coord_unit)