YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_read_icon_parallel_c.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 <string.h>
8#include <math.h>
9#include <unistd.h>
10
11#include "tests.h"
12#include "test_common.h"
13#include "read_icon_grid.h"
14#include "geometry.h"
15#include "grid2vtk.h"
16#include "io_utils.h"
18
19#include <netcdf.h>
20
21#include <mpi.h>
22
28int main(void) {
29
30 MPI_Init(NULL, NULL);
31
32 int comm_size, comm_rank;
33
34 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
35 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
36
37 if ((comm_size != 4) && (comm_rank == 0)) {
38 fputs("wrong number of processes (has to be four)\n", stderr);
39 exit(EXIT_FAILURE);
40 }
41
42 char const filename[] = "test_read_icon_parallel_grid_c.nc";
43
44
45
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},
50 {4,5,6,7,2,3,8,9,15},
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];
59
60 {
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},
64 {3,7,8}, {7,8,11}};
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;
71 break;
72 }
73 }
74 }
75 }
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) {
78 ref_cell_owner[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;
81 }
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) {
84 ref_vertex_owner[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;
87 }
88 }
89
90 enum coord_units coord_unit[] = {RAD, DEG};
91 enum {NUM_COORD_UNIT = sizeof(coord_unit) / sizeof(coord_unit[0])};
92
93 for (int coord_unit_idx = 0; coord_unit_idx < NUM_COORD_UNIT;
94 ++coord_unit_idx) {
95
96 if (comm_rank == 0)
97 write_test_grid_file(filename, coord_unit[coord_unit_idx]);
98
99 // ensure that the grid file exists
100 MPI_Barrier(MPI_COMM_WORLD);
101
102 { // test yac_read_icon_grid_information_parallel (incl. halos)
103 int nbr_vertices, nbr_cells;
104 int * num_vertices_per_cell;
105 int * cell_to_vertex;
106 int * global_cell_ids;
107 int * cell_owner;
108 int * global_vertex_ids;
109 int * vertex_owner;
110 double * x_vertices, * y_vertices;
111 double * x_cells, * y_cells;
112 int * cell_mask;
113
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);
118
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)
128 if (cell_to_vertex[3 * i + j] != ref_cell_to_vertex[i][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])
133 PUT_ERR("wrong cell owner\n");
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");
140 if (cell_mask[i] != mask[ref_global_cell_ids[comm_rank][i]])
141 PUT_ERR("wrong cell mask\n");
142 }
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");
153
154 }
155 free(num_vertices_per_cell);
156 free(cell_to_vertex);
157 free(cell_owner);
158 free(vertex_owner);
159 free(global_cell_ids);
160 free(global_vertex_ids);
161 free(x_vertices);
162 free(y_vertices);
163 free(x_cells);
164 free(y_cells);
165 free(cell_mask);
166 }
167
168 {
169 set_even_io_rank_list(MPI_COMM_WORLD);
171 yac_read_icon_basic_grid_data_parallel(filename, MPI_COMM_WORLD);
172 if (grid_data.num_cells != 4)
173 PUT_ERR("error in yac_read_icon_basic_grid_data_parallel");
174 if (grid_data.num_vertices != 6)
175 PUT_ERR("error in yac_read_icon_basic_grid_data_parallel");
178 }
179
180 {
181 struct yac_basic_grid * icon_grid =
183 filename, "icon_grid", MPI_COMM_WORLD);
184 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CELL) != 4)
185 PUT_ERR("error in yac_read_icon_basic_grid_parallel");
186 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CORNER) != 6)
187 PUT_ERR("error in yac_read_icon_basic_grid_parallel");
188 yac_basic_grid_delete(icon_grid);
189 }
190
191 {
192 struct yac_basic_grid * icon_grid;
193 size_t cell_coordinates_idx;
194 int * cell_mask;
196 filename, "icon_grid", MPI_COMM_WORLD, &icon_grid,
197 &cell_coordinates_idx, &cell_mask);
198 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CELL) != 4)
199 PUT_ERR("error in yac_read_icon_basic_grid_parallel_2");
200 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CORNER) != 6)
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");
204 yac_basic_grid_delete(icon_grid);
205 free(cell_mask);
206 }
207
208 // ensure that all processes finished reading the file
209 MPI_Barrier(MPI_COMM_WORLD);
210 if (comm_rank == 0) unlink(filename);
211 }
212
213 MPI_Finalize();
214
215 return TEST_EXIT_CODE;
216}
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:147
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:70
void yac_basic_grid_data_free(struct yac_basic_grid_data grid)
#define YAC_RAD
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_CELL
Definition location.h:14
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 clear_yac_io_env()
void set_even_io_rank_list(MPI_Comm comm)
int * cell_to_vertex
int * cell_mask
#define RAD
void write_test_grid_file(char const *file_name, enum coord_units coord_unit)
static int mask[16]
static double vlon[15]
static double clon[16]
static double vlat[15]
static double clat[16]
#define TEST_EXIT_CODE
Definition tests.h:14
#define PUT_ERR(string)
Definition tests.h:10