YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_read_scrip_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 <string.h>
7#include <unistd.h>
8
9#include "tests.h"
10#include "test_common.h"
11#include "grid_file_common.h"
12#include "read_scrip_grid.h"
13#include "grid2vtk.h"
14#include "io_utils.h"
15
21// #define HAVE_OASIS_FILES
22// #define WRITE_VTK_GRID_FILE
23#define DUMMY_GRID_NAME ("dummy_grid")
24
25int main(void) {
26
27 char * grid_filename = "test_read_scrip_c_grids.nc";
28 char * mask_filename = "test_read_scrip_c_masks.nc";
29 utest_write_dummy_scrip_grid_file(
30 DUMMY_GRID_NAME, grid_filename, mask_filename, 1,
31 360, 10, (double[]){0.0,360.0}, (double[]){0.0, 10.0});
32
33 size_t ref_num_cells = 360 * 10;
34 size_t ref_num_vertices = 360 * 11;
35
36 int valid_mask_value = 0;
37
38 if (!yac_file_exists(grid_filename)) return EXIT_FAILURE;
39 if (!yac_file_exists(mask_filename)) return EXIT_FAILURE;
40
41 { // read unstructured grid
42
43 char * gridname = DUMMY_GRID_NAME;
44
45 { // test yac_read_scrip_basic_grid
46 size_t * duplicated_cell_idx = NULL;
47 yac_int * orig_cell_global_ids = NULL;
48 size_t nbr_duplicated_cells = 0;
49
50 size_t cell_coord_idx;
51
52 struct yac_basic_grid * scrip_grid =
54 grid_filename, mask_filename, gridname, valid_mask_value, gridname,
55 0, &cell_coord_idx, &duplicated_cell_idx, &orig_cell_global_ids,
56 &nbr_duplicated_cells);
57
58 if (ref_num_vertices !=
60 PUT_ERR("error in yac_read_scrip_grid");
61 if (ref_num_cells !=
63 PUT_ERR("error in yac_read_scrip_grid");
64
65 free(duplicated_cell_idx);
66 free(orig_cell_global_ids);
67
68 #ifdef WRITE_VTK_GRID_FILE
69 yac_write_basic_grid_to_file(scrip_grid, gridname);
70 #else
71 char const * vtk_gridname = "test_read_scrip_grid_c";
72 char const * vtk_filename = "test_read_scrip_grid_c.vtk";
73
74 yac_write_basic_grid_to_file(scrip_grid, vtk_gridname);
75
76 if (!yac_file_exists(vtk_filename))
77 PUT_ERR("ERROR in yac_write_basic_grid_to_file");
78
79 unlink(vtk_filename);
80 #endif // WRITE_VTK_GRID_FILE
81
82 yac_basic_grid_delete(scrip_grid);
83 }
84
85 { // test yac_read_scrip_grid_information
86
87 size_t num_vertices;
88 size_t num_cells;
89 int * num_vertices_per_cell;
90 double * x_vertices;
91 double * y_vertices;
92 double * x_cells;
93 double * y_cells;
94 int * cell_to_vertex;
95 int * cell_core_mask;
96 size_t * duplicated_cell_idx;
97 size_t * orig_cell_idx;
98 size_t nbr_duplicated_cells;
99
101 grid_filename, mask_filename, gridname, valid_mask_value,
102 &num_vertices, &num_cells, &num_vertices_per_cell,
103 &x_vertices, &y_vertices, &x_cells, &y_cells,
105 &duplicated_cell_idx, &orig_cell_idx, &nbr_duplicated_cells);
106
107 if (ref_num_vertices != num_vertices)
108 PUT_ERR("error in yac_read_scrip_grid_information");
109 if (ref_num_cells != num_cells)
110 PUT_ERR("error in yac_read_scrip_grid_information");
111
112 free(num_vertices_per_cell);
113 free(x_vertices);
114 free(y_vertices);
115 free(x_cells);
116 free(y_cells);
117 free(cell_to_vertex);
118 free(cell_core_mask);
119 free(duplicated_cell_idx);
120 free(orig_cell_idx);
121 }
122 }
123
124 { // read lon/lat grid
125 char * gridname = DUMMY_GRID_NAME;
126
127 struct yac_basic_grid * scrip_grid =
129 grid_filename, mask_filename, gridname, valid_mask_value, gridname,
130 1, NULL, NULL, NULL, NULL);
131
132#ifdef WRITE_VTK_GRID_FILE
133 char vtk_gridname[64];
135 scrip_grid, strcat(strcpy(vtk_gridname, gridname), "_ll"));
136#endif // WRITE_VTK_GRID_FILE
137
138 yac_basic_grid_delete(scrip_grid);
139 }
140
141 { // read cloud grid (containing only cell centers)
142
143 // create grid files
144 char * grid_filename = "test_read_scrip_cloud_c_grids.nc";
145 char * mask_filename = "test_read_scrip_cloud_c_masks.nc";
146 utest_write_dummy_scrip_grid_file(
147 DUMMY_GRID_NAME, grid_filename, mask_filename, 0,
148 380, 180, (double[]){0.0,380.0}, (double[]){-90.0, 90.0});
149
150 size_t vertex_coord_idx;
151 size_t * duplicated_vertex_idx;
152 yac_int * orig_vertex_global_ids;
153 size_t nbr_duplicated_vertices;
154 struct yac_basic_grid * scrip_cloud_grid =
156 grid_filename, mask_filename, DUMMY_GRID_NAME, 0,
157 DUMMY_GRID_NAME, &vertex_coord_idx, &duplicated_vertex_idx,
158 &orig_vertex_global_ids, &nbr_duplicated_vertices);
159
160#ifdef WRITE_VTK_GRID_FILE
162#endif // WRITE_VTK_GRID_FILE
163
164 if (strcmp(yac_basic_grid_get_name(scrip_cloud_grid), DUMMY_GRID_NAME))
165 PUT_ERR("wrong grid name");
166
167 {
168 struct yac_basic_grid_data * scrip_cloud_grid_data =
169 yac_basic_grid_get_data(scrip_cloud_grid);
170
171 if (scrip_cloud_grid_data->num_cells != 0)
172 PUT_ERR("wrong number of cells");
173 if (scrip_cloud_grid_data->num_vertices != 380 * 180)
174 PUT_ERR("wrong global number of vertices");
175 if (nbr_duplicated_vertices != 20 * 180)
176 PUT_ERR("wrong global number of duplicated vertices");
177 if (scrip_cloud_grid_data->num_edges != 0)
178 PUT_ERR("wrong number of edges");
179 }
180
181 {
182 struct yac_basic_grid_data scrip_cloud_grid_data =
184 grid_filename, mask_filename, DUMMY_GRID_NAME, 0);
185
186 if (scrip_cloud_grid_data.num_cells != 0)
187 PUT_ERR("wrong number of cells");
188 if (scrip_cloud_grid_data.num_vertices != 380 * 180)
189 PUT_ERR("wrong global number of vertices");
190 if (scrip_cloud_grid_data.num_edges != 0)
191 PUT_ERR("wrong number of edges");
192
193 yac_basic_grid_data_free(scrip_cloud_grid_data);
194 }
195
196 free(duplicated_vertex_idx);
197 free(orig_vertex_global_ids);
198 yac_basic_grid_delete(scrip_cloud_grid);
199
200 // delete grid files
201 unlink(grid_filename);
202 unlink(mask_filename);
203 }
204
205 { // read cloud grid containing masked cells
206
207 char * grid_filename = "test_read_scrip_masked_cloud_c_grids.nc";
208 char * mask_filename = "test_read_scrip_masked_cloud_c_masks.nc";
209 enum {NUM_LON = 36, NUM_LAT = 18, INVALID_CELL_STRIDE = 3};
211 DUMMY_GRID_NAME, grid_filename, mask_filename, 0,
212 NUM_LON, NUM_LAT, (double[]){0.0,360.0}, (double[]){-90.0, 90.0}, 3);
213
214 size_t ref_num_valid_vertices = 0;
215 for (size_t i = 0; i < NUM_LON * NUM_LAT; ++i)
216 if (i % INVALID_CELL_STRIDE) ++ref_num_valid_vertices;
217
220 grid_filename, mask_filename, DUMMY_GRID_NAME, 0);
221
222 if (grid_data.num_vertices != NUM_LON * NUM_LAT)
223 PUT_ERR("wrong number of vertices");
224 if (grid_data.num_cells != 0)
225 PUT_ERR("wrong number of cells");
226
227 size_t num_valid_vertices = 0;
228 for (size_t i = 0; i < grid_data.num_vertices; ++i)
229 if (grid_data.core_vertex_mask[i]) ++num_valid_vertices;
230 if (num_valid_vertices != ref_num_valid_vertices)
231 PUT_ERR("wrong number of unmasked vertices");
232
234
235 unlink(grid_filename);
236 unlink(mask_filename);
237 }
238
239 { // read grid containing masked cells and cells with more than four
240 // vertices (which cannot be represented by logically rectangular edges)
241
242 char * grid_filename = "test_read_scrip_penta_c_grids.nc";
243 char * mask_filename = "test_read_scrip_penta_c_masks.nc";
244 enum {NUM_LON = 36, NUM_LAT = 18, INVALID_CELL_STRIDE = 5};
246 DUMMY_GRID_NAME, grid_filename, mask_filename, 5,
247 NUM_LON, NUM_LAT, (double[]){0.0,360.0}, (double[]){-90.0, 90.0},
248 INVALID_CELL_STRIDE);
249
250 size_t ref_num_valid_cells = 0;
251 for (size_t i = 0; i < NUM_LON * NUM_LAT; ++i)
252 if (i % INVALID_CELL_STRIDE) ++ref_num_valid_cells;
253
254 // use_ll is requested, but the grid has cells with more than four
255 // vertices, hence the reader has to fall back to great circle edges
256 struct yac_basic_grid * scrip_grid =
258 grid_filename, mask_filename, DUMMY_GRID_NAME, 0, DUMMY_GRID_NAME,
259 1, NULL, NULL, NULL, NULL);
260
261 struct yac_basic_grid_data * penta_grid_data =
262 yac_basic_grid_get_data(scrip_grid);
263 if (penta_grid_data->num_cells != NUM_LON * NUM_LAT)
264 PUT_ERR("wrong number of cells");
265
266 size_t num_valid_cells = 0;
267 for (size_t i = 0; i < penta_grid_data->num_cells; ++i)
268 if (penta_grid_data->core_cell_mask[i]) ++num_valid_cells;
269 if (num_valid_cells != ref_num_valid_cells)
270 PUT_ERR("wrong number of unmasked cells");
271
272 yac_basic_grid_delete(scrip_grid);
273
274 unlink(grid_filename);
275 unlink(mask_filename);
276 }
277
278 unlink(grid_filename);
279 unlink(mask_filename);
280
281 return TEST_EXIT_CODE;
282}
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:137
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:130
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:145
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:77
void yac_basic_grid_data_free(struct yac_basic_grid_data grid)
void yac_write_basic_grid_to_file(struct yac_basic_grid *grid, char const *name)
Definition grid2vtk.c:283
void write_dummy_scrip_grid_file_ext(char *grid_name, char *grid_filename, char *mask_filename, size_t num_corners, size_t num_lon, size_t num_lat, double lon_range[2], double lat_range[2], size_t invalid_cell_stride)
int yac_file_exists(const char *filename)
Check whether a file exists.
Definition io_utils.c:394
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_CELL
Definition location.h:14
void yac_read_scrip_grid_information(char const *grid_filename, char const *mask_filename, char const *grid_name, int valid_mask_value, size_t *num_vertices, size_t *num_cells, int **num_vertices_per_cell, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **cell_to_vertex, int **cell_core_mask, size_t **duplicated_cell_idx, size_t **orig_cell_idx, size_t *nbr_duplicated_cells)
struct yac_basic_grid_data yac_read_scrip_cloud_basic_grid_data(char const *grid_filename, char const *mask_filename, char const *grid_name, int valid_mask_value)
struct yac_basic_grid * yac_read_scrip_cloud_basic_grid(char const *grid_filename, char const *mask_filename, char const *grid_name, int valid_mask_value, char const *name, size_t *vertex_coord_idx, size_t **duplicated_vertex_idx, yac_int **orig_vertex_global_ids, size_t *nbr_duplicated_vertices)
struct yac_basic_grid * yac_read_scrip_basic_grid(char const *grid_filename, char const *mask_filename, char const *grid_name, int valid_mask_value, char const *name, int use_ll_edges, size_t *cell_coord_idx, size_t **duplicated_cell_idx, yac_int **orig_cell_global_ids, size_t *nbr_duplicated_cells)
int * cell_to_vertex
size_t num_cells[2]
#define DUMMY_GRID_NAME
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10
int * cell_core_mask
YAC_INT yac_int
Definition yac_types.h:15