YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
basic_grid.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 <stdio.h>
6#include <string.h>
7
8#include "basic_grid.h"
9#include "grid_cell.h"
10#include "field_data_set.h"
11
18
20 .vertex_coordinates = NULL,
21 .cell_ids = NULL,
22 .vertex_ids = NULL,
23 .edge_ids = NULL,
24 .num_cells = 0,
25 .num_vertices = 0,
26 .num_edges = 0,
27 .core_cell_mask = NULL,
28 .core_vertex_mask = NULL,
29 .core_edge_mask = NULL,
30 .num_vertices_per_cell = NULL,
31 .num_cells_per_vertex = NULL,
32 .cell_to_vertex = NULL,
33 .cell_to_vertex_offsets = NULL,
34 .cell_to_edge = NULL,
35 .cell_to_edge_offsets = NULL,
36 .vertex_to_cell = NULL,
37 .vertex_to_cell_offsets = NULL,
38 .edge_to_vertex = NULL,
39 .edge_type = NULL,
40 .num_total_cells = 0,
41 .num_total_vertices = 0,
42 .num_total_edges = 0
43};
44
46 char const * name, struct yac_basic_grid_data grid_data) {
47
48 struct yac_basic_grid * grid = xmalloc(1 * sizeof(*grid));
49
50 grid->name = strdup(name);
51 grid->is_empty = 0;
53 grid->data = grid_data;
54
55 return grid;
56};
57
59 struct yac_basic_grid * grid =
61 grid->is_empty = 1;
62 return grid;
63}
64
66
68 grid, "ERROR(yac_basic_grid_delete): "
69 "NULL is not a valid value for argument grid")
70 free(grid->name);
73 free(grid);
74}
75
77 struct yac_basic_grid * grid, struct yac_interp_field field) {
78
80 grid, "ERROR(yac_basic_grid_get_field_coordinates): "
81 "NULL is not a valid value for argument grid")
82
84 (field.coordinates_idx != SIZE_MAX)?
87 field.coordinates_idx):NULL;
88
89 // if no field coordinates are defined, but the location is at the corners of
90 // of the grid cells, return coordinates of them
91 return
92 ((coords != NULL) || (field.location != YAC_LOC_CORNER))?
94}
95
97 struct yac_basic_grid * grid, enum yac_location location) {
98
100 (location == YAC_LOC_CELL) ||
101 (location == YAC_LOC_CORNER) ||
102 (location == YAC_LOC_EDGE),
103 "ERROR(yac_basic_grid_get_core_mask): invalid location")
104
105 switch (location) {
106 default:
107 case(YAC_LOC_CELL): return grid->data.core_cell_mask;
108 case(YAC_LOC_CORNER): return grid->data.core_vertex_mask;
109 case(YAC_LOC_EDGE): return grid->data.core_edge_mask;
110 };
111}
112
114 struct yac_basic_grid * grid, struct yac_interp_field field) {
115
116 if (field.masks_idx == SIZE_MAX) return NULL;
117
118 return
121}
122
123char const * yac_basic_grid_get_name(struct yac_basic_grid * grid) {
124
126 grid, "ERROR(yac_basic_grid_get_name): "
127 "NULL is not a valid value for argument grid")
128
129 return grid->name;
130}
131
133 struct yac_basic_grid * grid) {
134
136 grid, "ERROR(yac_basic_grid_get_data): "
137 "NULL is not a valid value for argument grid")
138
139 return &(grid->data);
140}
141
143 struct yac_basic_grid * grid, enum yac_location location) {
144
146 grid, "ERROR(yac_basic_grid_get_data_size): "
147 "NULL is not a valid value for argument grid")
149 (location == YAC_LOC_CELL) ||
150 (location == YAC_LOC_CORNER) ||
151 (location == YAC_LOC_EDGE),
152 "ERROR(yac_basic_grid_get_data_size): invalid location")
153
154 switch (location) {
155 default:
156 case (YAC_LOC_CELL):
157 return grid->data.num_cells;
158 case (YAC_LOC_CORNER):
159 return grid->data.num_vertices;
160 case (YAC_LOC_EDGE):
161 return grid->data.num_edges;
162 };
163}
164
166 struct yac_basic_grid * grid, int location) {
167
168 return
170}
171
173 struct yac_basic_grid * grid, enum yac_location location,
174 char const * mask_name) {
175
176 if (mask_name == NULL) return SIZE_MAX;
177
178 struct yac_field_data * data =
179 yac_basic_grid_get_field_data(grid, location);
180
181 if (data == NULL) return SIZE_MAX;
182
183 size_t mask_idx = SIZE_MAX;
185
186 for (size_t i = 0; (i < masks_count) && (mask_idx == SIZE_MAX); ++i) {
187 char const * curr_mask_name =
189 if ((curr_mask_name != NULL) &&
190 (!strcmp(mask_name, curr_mask_name)))
191 mask_idx = i;
192 }
193
195 mask_idx != SIZE_MAX,
196 "ERROR(yac_basic_grid_get_named_mask_idx): grid \"%s\" does not contain "
197 "%s-mask with the name \"%s\"",
198 grid->name, yac_loc2str(location), mask_name)
199
200 return mask_idx;
201}
202
204 struct yac_basic_grid * grid,
206
208 grid, "ERROR(yac_basic_grid_add_coordinates_nocpy): "
209 "NULL is not a valid value for argument grid")
211 !grid->is_empty, "ERROR(yac_basic_grid_add_coordinates_nocpy): "
212 "grid \"%s\" is an empty grid", grid->name)
213
214 return
216 grid->field_data_set, location, coordinates);
217}
218
220 struct yac_basic_grid * grid, int location, double * coordinates) {
221
222 return
225}
226
228 struct yac_basic_grid * grid, enum yac_location location,
229 yac_coordinate_pointer coordinates, size_t count) {
230
232 grid, "ERROR(yac_basic_grid_add_coordinates): "
233 "NULL is not a valid value for argument grid")
235 !grid->is_empty, "ERROR(yac_basic_grid_add_coordinates): "
236 "grid \"%s\" is an empty grid", grid->name)
237
238 return
240 grid->field_data_set, location, coordinates, count);
241}
242
244 struct yac_basic_grid * grid, int location,
245 double * coordinates, size_t count) {
246
247 return
249 grid, yac_get_location(location),
251}
252
254 struct yac_basic_grid * grid,
255 enum yac_location location, int const * mask,
256 char const * mask_name) {
257
259 grid, "ERROR(yac_basic_grid_add_mask_nocpy): "
260 "NULL is not a valid value for argument grid")
262 !grid->is_empty, "ERROR(yac_basic_grid_add_mask_nocpy): "
263 "grid \"%s\" is an empty grid", grid->name)
264
265 return
267 grid->field_data_set, location, mask, mask_name);
268}
269
271 struct yac_basic_grid * grid, int location,
272 int const * mask, char const * mask_name) {
273
274 return
276 grid, yac_get_location(location), mask, mask_name);
277}
278
280 struct yac_basic_grid * grid, enum yac_location location,
281 int const * mask, size_t count, char const * mask_name) {
282
284 grid, "ERROR(yac_basic_grid_add_mask): "
285 "NULL is not a valid value for argument grid")
287 !grid->is_empty, "ERROR(yac_basic_grid_add_mask): "
288 "grid \"%s\" is an empty grid", grid->name)
289
290 return
292 grid->field_data_set, location, mask, count, mask_name);
293}
294
296 struct yac_basic_grid * grid, int location,
297 int const * mask, size_t count, char const * mask_name) {
298
299 return
301 grid, yac_get_location(location), mask, count, mask_name);
302}
303
305 struct yac_basic_grid * grid, enum yac_location location) {
306
308 grid, "ERROR(yac_basic_grid_get_field_data): "
309 "NULL is not a valid value for argument grid")
310
311 if (grid->is_empty)
312 return NULL;
313 else
314 return
316 grid->field_data_set, location);
317}
318
320 char const * name, size_t nbr_vertices[2], int cyclic[2],
321 double *lon_vertices, double *lat_vertices) {
322
323 return
325 name,
327 nbr_vertices, cyclic, lon_vertices, lat_vertices));
328}
329
331 char const * name, size_t nbr_vertices[2], int cyclic[2],
332 double *lon_vertices, double *lat_vertices) {
333
334 return
336 name,
338 nbr_vertices, cyclic, lon_vertices, lat_vertices));
339}
340
342 char const * name, size_t nbr_vertices[2], int cyclic[2],
343 double *lon_vertices, double *lat_vertices) {
344
345 return
347 name,
349 nbr_vertices, cyclic, lon_vertices, lat_vertices));
350}
351
353 char const * name, size_t nbr_vertices[2], int cyclic[2],
354 double *lon_vertices, double *lat_vertices) {
355
356 return
358 name,
360 nbr_vertices, cyclic, lon_vertices, lat_vertices));
361}
362
364 char const * name, size_t nbr_vertices, size_t nbr_cells,
365 int *num_vertices_per_cell, double *x_vertices, double *y_vertices,
366 int *cell_to_vertex) {
367
368 return
370 name,
372 nbr_vertices, nbr_cells, num_vertices_per_cell,
373 x_vertices, y_vertices, cell_to_vertex));
374}
375
377 char const * name, size_t nbr_vertices, size_t nbr_cells,
378 int *num_vertices_per_cell, double *x_vertices, double *y_vertices,
379 int *cell_to_vertex) {
380
381 return
383 name,
385 nbr_vertices, nbr_cells, num_vertices_per_cell,
386 x_vertices, y_vertices, cell_to_vertex));
387}
388
390 char const * name, size_t nbr_vertices, size_t nbr_cells,
391 int *num_vertices_per_cell, double *x_vertices, double *y_vertices,
392 int *cell_to_vertex) {
393
394 return
396 name,
398 nbr_vertices, nbr_cells, num_vertices_per_cell,
399 x_vertices, y_vertices, cell_to_vertex));
400}
401
403 char const * name, size_t nbr_vertices, size_t nbr_cells,
404 int *num_vertices_per_cell, double *x_vertices, double *y_vertices,
405 int *cell_to_vertex) {
406
407 return
409 name,
411 nbr_vertices, nbr_cells, num_vertices_per_cell,
412 x_vertices, y_vertices, cell_to_vertex));
413}
static struct yac_basic_grid_data yac_basic_grid_data_empty
Definition basic_grid.c:19
struct yac_field_data * yac_basic_grid_get_field_data(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:304
size_t yac_basic_grid_get_named_mask_idx(struct yac_basic_grid *grid, enum yac_location location, char const *mask_name)
Definition basic_grid.c:172
int const * yac_basic_grid_get_field_mask(struct yac_basic_grid *grid, struct yac_interp_field field)
Definition basic_grid.c:113
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:45
struct yac_basic_grid * yac_basic_grid_reg_2d_deg_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition basic_grid.c:330
struct yac_basic_grid * yac_basic_grid_unstruct_deg_new(char const *name, size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
Definition basic_grid.c:376
struct yac_basic_grid * yac_basic_grid_unstruct_new(char const *name, size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
Definition basic_grid.c:363
yac_const_coordinate_pointer yac_basic_grid_get_field_coordinates(struct yac_basic_grid *grid, struct yac_interp_field field)
Definition basic_grid.c:76
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:132
size_t yac_basic_grid_add_mask(struct yac_basic_grid *grid, enum yac_location location, int const *mask, size_t count, char const *mask_name)
Definition basic_grid.c:279
struct yac_basic_grid * yac_basic_grid_reg_2d_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition basic_grid.c:319
struct yac_basic_grid * yac_basic_grid_unstruct_ll_new(char const *name, size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
Definition basic_grid.c:389
size_t yac_basic_grid_get_data_size_f2c(struct yac_basic_grid *grid, int location)
Definition basic_grid.c:165
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
Definition basic_grid.c:203
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:123
size_t yac_basic_grid_add_mask_nocpy_f2c(struct yac_basic_grid *grid, int location, int const *mask, char const *mask_name)
Definition basic_grid.c:270
size_t yac_basic_grid_add_coordinates_f2c(struct yac_basic_grid *grid, int location, double *coordinates, size_t count)
Definition basic_grid.c:243
size_t yac_basic_grid_add_coordinates(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates, size_t count)
Definition basic_grid.c:227
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:142
struct yac_basic_grid * yac_basic_grid_unstruct_ll_deg_new(char const *name, size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
Definition basic_grid.c:402
int const * yac_basic_grid_get_core_mask(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:96
size_t yac_basic_grid_add_coordinates_nocpy_f2c(struct yac_basic_grid *grid, int location, double *coordinates)
Definition basic_grid.c:219
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
Definition basic_grid.c:58
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:65
size_t yac_basic_grid_add_mask_f2c(struct yac_basic_grid *grid, int location, int const *mask, size_t count, char const *mask_name)
Definition basic_grid.c:295
struct yac_basic_grid * yac_basic_grid_curve_2d_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition basic_grid.c:341
struct yac_basic_grid * yac_basic_grid_curve_2d_deg_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition basic_grid.c:352
size_t yac_basic_grid_add_mask_nocpy(struct yac_basic_grid *grid, enum yac_location location, int const *mask, char const *mask_name)
Definition basic_grid.c:253
void yac_basic_grid_data_free(struct yac_basic_grid_data 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)
Definition grid_reg2d.c:65
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_ll(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_curve_2d_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
struct yac_basic_grid_data yac_generate_basic_grid_data_curve_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)
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)
Definition grid_reg2d.c:74
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_ll_deg(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
size_t yac_field_data_get_masks_count(struct yac_field_data *field_data)
Definition field_data.c:57
yac_const_coordinate_pointer yac_field_data_get_coordinates_data(struct yac_field_data *field_data, size_t coordinates_idx)
Definition field_data.c:97
int const * yac_field_data_get_mask_data(struct yac_field_data *field_data, size_t mask_idx)
Definition field_data.c:62
char const * yac_field_data_get_mask_name(struct yac_field_data *field_data, size_t mask_idx)
Definition field_data.c:82
void yac_field_data_set_delete(struct yac_field_data_set *field_data_set)
size_t yac_field_data_set_add_mask_nocpy(struct yac_field_data_set *field_data_set, enum yac_location location, int const *mask, char const *mask_name)
struct yac_field_data * yac_field_data_set_get_field_data(struct yac_field_data_set *field_data_set, enum yac_location location)
size_t yac_field_data_set_add_mask(struct yac_field_data_set *field_data_set, enum yac_location location, int const *mask, size_t count, char const *mask_name)
struct yac_field_data_set * yac_field_data_set_empty_new()
size_t yac_field_data_set_add_coordinates(struct yac_field_data_set *field_data_set, enum yac_location location, yac_coordinate_pointer coordinates, size_t count)
size_t yac_field_data_set_add_coordinates_nocpy(struct yac_field_data_set *field_data_set, enum yac_location location, yac_coordinate_pointer coordinates)
char const * yac_loc2str(enum yac_location location)
Definition location.c:32
enum yac_location yac_get_location(int const location)
Definition location.c:44
yac_location
Definition location.h:12
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_EDGE
Definition location.h:16
@ YAC_LOC_CELL
Definition location.h:14
#define xmalloc(size)
Definition ppm_xfuncs.h:66
yac_coordinate_pointer vertex_coordinates
struct yac_basic_grid_data data
Definition basic_grid.c:16
struct yac_field_data_set * field_data_set
Definition basic_grid.c:15
size_t masks_count
Definition field_data.c:15
yac_coordinate_pointer * coordinates
Definition field_data.c:16
enum yac_location location
Definition basic_grid.h:18
size_t coordinates_idx
Definition basic_grid.h:19
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:18
#define YAC_ASSERT(exp, msg)
Definition yac_assert.h:15
double const (*const yac_const_coordinate_pointer)[3]
Definition yac_types.h:20
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:19