17#ifdef YAC_NETCDF_ENABLED
25 int * nbr_vertices_per_cell);
33 double * temp_vertex_lat,
34 int * temp_nbr_vertices,
38 int * nbr_cells,
int ** num_vertices_per_cell,
40 double ** y_vertices,
double ** x_cells,
53 double * temp_vertex_lon;
54 double * temp_vertex_lat;
56 int temp_nbr_vertices;
59 nbr_cells, &nbr_vertices_per_cell);
63 int * old_to_new_id =
xmalloc(temp_nbr_vertices *
sizeof(*old_to_new_id));
66 &temp_nbr_vertices, old_to_new_id);
68 *nbr_vertices = temp_nbr_vertices;
70 *x_vertices =
xrealloc(temp_vertex_lon,
71 temp_nbr_vertices *
sizeof(**x_vertices));
72 *y_vertices =
xrealloc(temp_vertex_lat,
73 temp_nbr_vertices *
sizeof(**y_vertices));
75 *num_vertices_per_cell =
xmalloc(*nbr_cells *
sizeof(**num_vertices_per_cell));
76 for (
int i = 0; i < *nbr_cells; ++i)
83 for (
int i = 0, k = 0; i < *nbr_cells; ++i)
87 int new_size_cell_to_vertex = 0;
90 for (
int i = 0; i < *nbr_cells; ++i) {
91 (*cell_to_vertex)[new_size_cell_to_vertex++] =
96 (*cell_to_vertex)[new_size_cell_to_vertex++] =
97 (*cell_to_vertex)[i * nbr_vertices_per_cell + j];
99 (*num_vertices_per_cell)[i]--;
112 size_t temp_nbr_cells;
120 char const * filename) {
127 double * x_vertices = NULL;
128 double * y_vertices = NULL;
129 double * x_cells = NULL;
130 double * y_cells = NULL;
134 &x_vertices, &y_vertices,
153 char const * filename,
char const * gridname) {
167 int * nbr_vertices_per_cell) {
175 int glon_dimids[NC_MAX_VAR_DIMS];
176 int glat_dimids[NC_MAX_VAR_DIMS];
189 nc_inq_var (ncid, glon_id, 0, &glon_type, &glon_ndims, glon_dimids, &nbr_atts));
192 nc_inq_var (ncid, glat_id, 0, &glat_type, &glat_ndims, glat_dimids, &nbr_atts));
195 YAC_ASSERT(glon_type == glat_type,
"lon and lat datatypes do not match");
197 glon_ndims == 2 && glat_ndims == 2,
198 "unsupported number of dimensions for lon or lat");
202 size_t dimlen_lat[2];
203 size_t dimlen_lon[2];
205 for (
int i = 0; i < 2; ++i) {
209 dimlen_lon[i] == dimlen_lat[i],
210 "mismatching dimension size for lon and lat");
213 nbr_vertices = dimlen_lon[0] * dimlen_lon[1];
214 *nbr_cells = dimlen_lon[0];
215 *nbr_vertices_per_cell = dimlen_lon[1];
220 *vertex_lon = (
double * )
xmalloc ( nbr_vertices *
sizeof (
double ) );
221 *vertex_lat = (
double * )
xmalloc ( nbr_vertices *
sizeof (
double ) );
226 for (
size_t i = 0; i < nbr_vertices; ++i) {
237 size_t *nbr_cells ) {
245 int glon_dimids[NC_MAX_VAR_DIMS];
246 int glat_dimids[NC_MAX_VAR_DIMS];
257 nc_inq_var (ncid, glon_id, 0, &glon_type, &glon_ndims, glon_dimids, &nbr_atts));
259 nc_inq_var (ncid, glat_id, 0, &glat_type, &glat_ndims, glat_dimids, &nbr_atts));
262 YAC_ASSERT(glon_type == glat_type,
"lon and lat datatypes do not match");
264 glon_ndims == 1 && glat_ndims == 1,
265 "unsupported number of dimensions for lon or lat");
275 dimlen_lon == dimlen_lat,
"mismatching dimension size for lon and lat");
277 *nbr_cells = dimlen_lon;
287 for (
size_t i = 0; i < *nbr_cells; ++i) {
308 int lon_diff = fabs(a_->
p.
lon - b_->
p.
lon) > 1e-9;
309 int lat_diff = fabs(a_->
p.
lat - b_->
p.
lat) > 1e-9;
313 if (a_->
p.
lon > b_->
p.
lon)
return -1;
316 }
else if (lat_diff) {
318 if (a_->
p.
lat > b_->
p.
lat)
return -1;
325 double * temp_vertex_lat,
326 int * temp_nbr_vertices,
327 int * old_to_new_id) {
330 xmalloc(*temp_nbr_vertices *
sizeof(*sort_array));
332 for (
int i = 0;
i < *temp_nbr_vertices; ++
i) {
334 double curr_lon, curr_lat;
336 curr_lon = ((
double*)temp_vertex_lon)[
i];
337 curr_lat = ((
double*)temp_vertex_lat)[
i];
339 while (curr_lon < 0.0) curr_lon += 360.0;
340 while (curr_lon >= 360) curr_lon -= 360.0;
342 sort_array[
i].
p.
lon = curr_lon;
343 sort_array[
i].
p.
lat = curr_lat;
348 yac_mergesort(sort_array, *temp_nbr_vertices,
sizeof(*sort_array),
351 old_to_new_id[sort_array[0].
i] = 1;
353 int last_unique_idx = sort_array[0].
i;
355 for (
int i = 1;
i < *temp_nbr_vertices; ++
i) {
359 old_to_new_id[sort_array[
i].
i] = 1;
360 last_unique_idx = sort_array[
i].i;
364 old_to_new_id[sort_array[
i].
i] = -last_unique_idx;
370 size_t new_nbr_vertices = 0;
372 for (
int i = 0;
i < *temp_nbr_vertices; ++
i) {
374 if (old_to_new_id[
i] == 1) {
376 temp_vertex_lon[new_nbr_vertices] = temp_vertex_lon[
i];
377 temp_vertex_lat[new_nbr_vertices] = temp_vertex_lat[
i];
379 old_to_new_id[
i] = new_nbr_vertices;
385 for (
int i = 0;
i < *temp_nbr_vertices; ++
i)
386 if (old_to_new_id[
i] <= 0)
387 old_to_new_id[
i] = old_to_new_id[-old_to_new_id[
i]];
389 *temp_nbr_vertices = new_nbr_vertices;
395 char const * filename) {
399 "ERROR(yac_read_fesom_basic_grid_data): "
400 "YAC is built without the NetCDF support");
404 (
size_t[]){0,0}, (
int[]){0,0}, NULL, NULL);
408 char const * filename,
char const * gridname) {
413 "ERROR(yac_read_fesom_basic_grid): "
414 "YAC is built without the NetCDF support");
420 int * nbr_cells,
int ** num_vertices_per_cell,
422 double ** y_vertices,
double ** x_cells,
428 UNUSED(num_vertices_per_cell);
435 "ERROR(yac_read_fesom_grid_information): "
436 "YAC is built without the NetCDF support");
#define YAC_ASSERT(exp, msg)
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
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_unstruct(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
void yac_nc_inq_varid(int ncid, char const *name, int *varidp)
void yac_nc_open(const char *path, int omode, int *ncidp)
void yac_mergesort(void *base, size_t num, size_t size, int(*compar)(const void *, const void *))
#define xrealloc(ptr, size)
static int compare_point_with_index(const void *a, const void *b)
static void remove_duplicated_vertices(double *temp_vertex_lon, double *temp_vertex_lat, int *temp_nbr_vertices, int *old_to_new_id)
void yac_read_fesom_grid_information(const char *filename, int *nbr_vertices, int *nbr_cells, int **num_vertices_per_cell, int **cell_to_vertex, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells)
static void get_fesom_cell_center(int ncid, double **cell_lon, double **cell_lat, size_t *nbr_cells)
struct yac_basic_grid * yac_read_fesom_basic_grid(char const *filename, char const *gridname)
static void get_fesom_vertices(int ncid, double **vertex_lon, double **vertex_lat, int *nbr_cells, int *nbr_vertices_per_cell)
struct yac_basic_grid_data yac_read_fesom_basic_grid_data(char const *filename)
struct point_with_index::@5 p
int * num_vertices_per_cell
int nbr_vertices_per_cell[NBR_CELLS]
#define YAC_HANDLE_ERROR(exp)