YAC 3.8.0
Yet Another Coupler
Loading...
Searching...
No Matches
grid_unstruct.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 <string.h>
6
7#include "basic_grid_data.h"
8#include "geometry.h"
9#include "utils_common.h"
10
11struct temp_edge {
12 size_t vertex[2];
14};
15
16static int compare_temp_edges(void const * a, void const * b) {
17
18 struct temp_edge const * edge_a = (struct temp_edge const *)a;
19 struct temp_edge const * edge_b = (struct temp_edge const *)b;
20
21 if (edge_a->vertex[0] != edge_b->vertex[0])
22 return (edge_a->vertex[0] > edge_b->vertex[0])?1:-1;
23 return (edge_a->vertex[1] > edge_b->vertex[1]) -
24 (edge_a->vertex[1] < edge_b->vertex[1]);
25}
26
28 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
29 int *num_vertices_per_cell_,
30 double *x_vertices, double *y_vertices, yac_size_t_2_pointer edge_to_vertex,
31 size_t *cell_to_vertex, size_t *cell_to_edge,
32 void (*LLtoXYZ_ptr)(double, double, double[])) {
33
34 // convert 2D coordinates to 3D
36 xmalloc(nbr_vertices * sizeof(*vertex_coordinates));
37 for (size_t i = 0; i < nbr_vertices; ++i)
38 LLtoXYZ_ptr(
39 x_vertices[i], y_vertices[i], &(vertex_coordinates[i][0]));
40
41 // make an internal copy of num_vertices_per_cell
43 xmalloc(nbr_cells * sizeof(*num_vertices_per_cell));
44 memcpy(num_vertices_per_cell, num_vertices_per_cell_,
45 nbr_cells * sizeof(*num_vertices_per_cell));
46
47 // generate cell_to_vertex_offsets
48 size_t total_num_cell_corners = 0;
49 size_t * cell_to_vertex_offsets =
50 xmalloc(nbr_cells * sizeof(*cell_to_vertex_offsets));
51 for (size_t i = 0; i < nbr_cells; ++i) {
52 cell_to_vertex_offsets[i] = total_num_cell_corners;
53 total_num_cell_corners += (size_t)(num_vertices_per_cell[i]);
54 }
55
56 // generate num_cells_per_vertex
58 xcalloc(nbr_vertices, sizeof(*num_cells_per_vertex));
59 for (size_t i = 0; i < total_num_cell_corners; ++i)
61
62 // generate vertex_to_cell
63 size_t * vertex_to_cell =
64 xmalloc(total_num_cell_corners * sizeof(*vertex_to_cell));
65 size_t * vertex_to_cell_offsets =
66 xmalloc((nbr_vertices + 1) * sizeof(*vertex_to_cell_offsets));
68 for (size_t i = 0, accu = 0; i < nbr_vertices; ++i) {
69 vertex_to_cell_offsets[i+1] = accu;
70 accu += num_cells_per_vertex[i];
71 }
72 for (size_t i = 0, k = 0; i < nbr_cells; ++i) {
73 size_t curr_num_vertices = num_vertices_per_cell[i];
74 for (size_t j = 0; j < curr_num_vertices; ++j, ++k)
76 }
77
78 enum yac_edge_type * edge_type = xmalloc(nbr_edges * sizeof(*edge_type));
79 for (size_t i = 0; i < nbr_edges; ++i) edge_type[i] = YAC_GREAT_CIRCLE_EDGE;
80
81 struct yac_basic_grid_data grid;
82 grid.vertex_coordinates = vertex_coordinates;
83 grid.cell_ids = NULL;
84 grid.vertex_ids = NULL;
85 grid.edge_ids = NULL;
86 grid.num_cells = nbr_cells;
87 grid.num_vertices = nbr_vertices;
88 grid.num_edges = nbr_edges;
89 grid.core_cell_mask = NULL;
90 grid.core_vertex_mask = NULL;
91 grid.core_edge_mask = NULL;
92 grid.num_vertices_per_cell = num_vertices_per_cell;
93 grid.num_cells_per_vertex = num_cells_per_vertex;
94 grid.cell_to_vertex = cell_to_vertex;
95 grid.cell_to_vertex_offsets = cell_to_vertex_offsets;
96 grid.cell_to_edge = cell_to_edge;
97 grid.cell_to_edge_offsets = cell_to_vertex_offsets;
98 grid.vertex_to_cell = vertex_to_cell;
99 grid.vertex_to_cell_offsets = vertex_to_cell_offsets;
100 grid.edge_to_vertex = edge_to_vertex;
101 grid.edge_type = edge_type;
102 grid.num_total_cells = nbr_cells;
103 grid.num_total_vertices = nbr_vertices;
104 grid.num_total_edges = nbr_edges;
105 return grid;
106}
107
109 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
110 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
111 int *cell_to_edge_, int *edge_to_vertex_,
112 void (*LLtoXYZ_ptr)(double, double, double[])) {
113
114 // compute the sum of num_edges_per_cell
115 size_t total_num_cell_edges = 0;
116 for (size_t i = 0; i < nbr_cells; ++i)
117 total_num_cell_edges += (size_t)(num_edges_per_cell[i]);
118
119 // check consistency of cell_to_edge and convert to size_t
120 size_t * cell_to_edge =
121 xmalloc(total_num_cell_edges * sizeof(*cell_to_edge));
122 for (size_t i = 0; i < total_num_cell_edges; ++i) {
123 YAC_ASSERT_F(cell_to_edge_[i] >= 0,
124 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
125 "Index %zu in cell_to_edge (%d) is negative.",
126 i, cell_to_edge_[i])
127 YAC_ASSERT_F((size_t)(cell_to_edge_[i]) < nbr_edges,
128 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
129 "Index %zu in cell_to_edge (%d) is not smaller than nbr_edges (%zu).",
130 i, cell_to_edge_[i], nbr_edges)
131 cell_to_edge[i] = (size_t)(cell_to_edge_[i]);
132 }
133
134 // check consistency of edge_to_vertex and convert to size_t
136 xmalloc(nbr_edges * sizeof(*edge_to_vertex));
137 for (size_t i = 0; i < 2 * nbr_edges; ++i) {
138 YAC_ASSERT_F(edge_to_vertex_[i] >= 0,
139 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
140 "Index %zu in edge_to_vertex (%d) is negative.",
141 i, edge_to_vertex_[i])
142 YAC_ASSERT_F((size_t)(edge_to_vertex_[i]) < nbr_vertices,
143 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
144 "Index %zu in edge_to_vertex (%d) is not smaller than nbr_vertices (%zu).",
145 i, edge_to_vertex_[i], nbr_edges)
146 ((size_t*)edge_to_vertex)[i] = (size_t)(edge_to_vertex_[i]);
147 }
148
149 // generate cell_to_vertex
150 size_t * cell_to_vertex =
151 xmalloc(total_num_cell_edges * sizeof(*cell_to_vertex));
152 for (size_t i = 0, k = 0; i < nbr_cells; ++i) {
154 (num_edges_per_cell[i] == 0) || (num_edges_per_cell[i] >= 2),
155 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
156 "invalid number of edges per cell (num_edges_per_cell[%zu] = %d)",
157 i, num_edges_per_cell[i])
158 size_t curr_num_vertices = (size_t)(num_edges_per_cell[i]);
159 if (curr_num_vertices == 0) continue;
160 size_t first_vertex = edge_to_vertex[cell_to_edge[k]][0];
161 first_vertex =
163 (edge_to_vertex[cell_to_edge[k+1]][0] == first_vertex) ||
164 (edge_to_vertex[cell_to_edge[k+1]][1] == first_vertex)];
165 size_t prev_vertex;
166 size_t curr_vertex = first_vertex;
167 for (size_t j = 0; j < curr_num_vertices; ++j, ++k) {
168 cell_to_vertex[k] = curr_vertex;
169 size_t * curr_edge_vertices = edge_to_vertex[cell_to_edge[k]];
170 prev_vertex = curr_vertex;
171 curr_vertex = curr_edge_vertices[curr_edge_vertices[0] == prev_vertex];
173 (curr_edge_vertices[0] == prev_vertex) ||
174 (curr_edge_vertices[1] == prev_vertex),
175 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
176 "inconsistent definition of cell_to_edge or edge_to_vertex")
177 }
179 first_vertex == curr_vertex,
180 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
181 "inconsistent definition of cell_to_edge or edge_to_vertex")
182 }
183
184 return
186 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
187 x_vertices, y_vertices, edge_to_vertex, cell_to_vertex, cell_to_edge,
188 LLtoXYZ_ptr);
189}
190
192 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell,
193 double *x_vertices, double *y_vertices, int *cell_to_vertex_,
194 void (*LLtoXYZ_ptr)(double, double, double[])) {
195
196 // compute the sum of num_vertices_per_cell
197 size_t total_num_cell_corners = 0;
198 for (size_t i = 0; i < nbr_cells; ++i)
199 total_num_cell_corners += (size_t)(num_vertices_per_cell[i]);
200
201 // check consistency of cell_to_vertex and convert to size_t
202 size_t * cell_to_vertex =
203 xmalloc(total_num_cell_corners * sizeof(*cell_to_vertex));
204 for (size_t i = 0; i < total_num_cell_corners; ++i) {
205 YAC_ASSERT_F(cell_to_vertex_[i] >= 0,
206 "ERROR(yac_generate_basic_grid_data_unstruct_): "
207 "Index %zu in cell_to_vertex (%d) is negative.",
208 i, cell_to_vertex_[i])
209 YAC_ASSERT_F((size_t)(cell_to_vertex_[i]) < nbr_vertices,
210 "ERROR(yac_generate_basic_grid_data_unstruct_): "
211 "Index %zu in cell_to_vertex (%d) is not smaller than nbr_vertices (%zu).",
212 i, cell_to_vertex_[i], nbr_vertices)
213 cell_to_vertex[i] = (size_t)(cell_to_vertex_[i]);
214 }
215
216 // generate temporary array containing edge information
217 struct temp_edge * temp_edges =
218 xmalloc(total_num_cell_corners * sizeof(*temp_edges));
219 for (size_t i = 0, offset = 0, k = 0; i < nbr_cells; ++i) {
220 size_t * curr_cell_to_vertex = cell_to_vertex + offset;
221 size_t curr_num_edges = num_vertices_per_cell[i];
222 offset += curr_num_edges;
223 for (size_t j = 0; j < curr_num_edges; ++j, ++k) {
224 int order =
225 curr_cell_to_vertex[j] > curr_cell_to_vertex[(j+1)%curr_num_edges];
226 temp_edges[k].vertex[order] = curr_cell_to_vertex[j];
227 temp_edges[k].vertex[order^1] = curr_cell_to_vertex[(j+1)%curr_num_edges];
228 temp_edges[k].cell_to_edge_idx = k;
229 }
230 }
231 qsort(temp_edges, total_num_cell_corners,
232 sizeof(*temp_edges), compare_temp_edges);
233
234 // generate cell_to_edge and edge_to_vertex; count total number of edges
235 size_t * cell_to_edge =
236 xmalloc(total_num_cell_corners * sizeof(*cell_to_edge));
237 size_t nbr_edges = 0;
238 yac_size_t_2_pointer edge_to_vertex = (yac_size_t_2_pointer)temp_edges;
239 for (size_t i = 0, prev_indices[2] = {SIZE_MAX, SIZE_MAX};
240 i < total_num_cell_corners; ++i) {
241
242 size_t curr_cell_to_edge_idx = temp_edges[i].cell_to_edge_idx;
243 if ((prev_indices[0] != temp_edges[i].vertex[0]) ||
244 (prev_indices[1] != temp_edges[i].vertex[1])) {
245
246 prev_indices[0] = temp_edges[i].vertex[0];
247 prev_indices[1] = temp_edges[i].vertex[1];
248 edge_to_vertex[nbr_edges][0] = prev_indices[0];
249 edge_to_vertex[nbr_edges][1] = prev_indices[1];
250 ++nbr_edges;
251 }
252
253 cell_to_edge[curr_cell_to_edge_idx] = nbr_edges - 1;
254 }
255 edge_to_vertex =
256 xrealloc(edge_to_vertex, nbr_edges * sizeof(*edge_to_vertex));
257
258 return
260 nbr_vertices, nbr_cells, nbr_edges, num_vertices_per_cell,
261 x_vertices, y_vertices, edge_to_vertex, cell_to_vertex, cell_to_edge,
262 LLtoXYZ_ptr);
263}
264
266 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell_,
267 double *x_vertices, double *y_vertices, int *cell_to_vertex_) {
268
269 return
271 nbr_vertices, nbr_cells, num_vertices_per_cell_,
272 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ);
273}
274
276 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell_,
277 double *x_vertices, double *y_vertices, int *cell_to_vertex_) {
278
279 return
281 nbr_vertices, nbr_cells, num_vertices_per_cell_,
282 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ_deg);
283}
284
286 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
287 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
288 int *cell_to_edge, int *edge_to_vertex) {
289
290 return
292 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
293 x_vertices, y_vertices, cell_to_edge, edge_to_vertex, LLtoXYZ);
294}
295
297 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
298 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
299 int *cell_to_edge, int *edge_to_vertex) {
300
301 return
303 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
304 x_vertices, y_vertices, cell_to_edge, edge_to_vertex, LLtoXYZ_deg);
305}
306
309 double *x_vertices, double *y_vertices,
310 double (*get_angle_ptr)(double, double),
311 double angle_tol, double pole_y_vertex) {
312
313 for (size_t i = 0; i < grid_data.num_edges; ++i) {
314 int is_lon_edge =
315 (fabs(
316 get_angle_ptr(
317 x_vertices[grid_data.edge_to_vertex[i][0]],
318 x_vertices[grid_data.edge_to_vertex[i][1]])) < angle_tol) ||
319 ((fabs(fabs(y_vertices[grid_data.edge_to_vertex[i][0]]) -
320 pole_y_vertex) < angle_tol) ^
321 (fabs(fabs(y_vertices[grid_data.edge_to_vertex[i][1]]) -
322 pole_y_vertex) < angle_tol));
323 int is_lat_edge =
324 fabs(y_vertices[grid_data.edge_to_vertex[i][0]] -
325 y_vertices[grid_data.edge_to_vertex[i][1]]) < angle_tol;
327 is_lon_edge || is_lat_edge,
328 "ERROR(yac_generate_basic_grid_data_unstruct_ll): "
329 "edge is neither lon nor lat ((%lf,%lf),(%lf,%lf))",
330 x_vertices[grid_data.edge_to_vertex[i][0]],
331 y_vertices[grid_data.edge_to_vertex[i][0]],
332 x_vertices[grid_data.edge_to_vertex[i][1]],
333 y_vertices[grid_data.edge_to_vertex[i][1]]);
334 grid_data.edge_type[i] = (is_lon_edge)?YAC_LON_CIRCLE_EDGE:YAC_LAT_CIRCLE_EDGE;
335 }
336}
337
339 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell_,
340 double *x_vertices, double *y_vertices, int *cell_to_vertex_,
341 void (*LLtoXYZ_ptr)(double, double, double[]),
342 double (*get_angle_ptr)(double, double),
343 double angle_tol, double pole_y_vertex) {
344
347 nbr_vertices, nbr_cells, num_vertices_per_cell_,
348 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ_ptr);
349
351 grid_data, x_vertices, y_vertices, get_angle_ptr, angle_tol, pole_y_vertex);
352
353 return grid_data;
354}
355
357 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell_,
358 double *x_vertices, double *y_vertices, int *cell_to_vertex_) {
359
360 return
362 nbr_vertices, nbr_cells, num_vertices_per_cell_,
363 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ,
364 get_angle, yac_angle_tol, M_PI_2);
365}
366
368 size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell_,
369 double *x_vertices, double *y_vertices, int *cell_to_vertex_) {
370
371 return
373 nbr_vertices, nbr_cells, num_vertices_per_cell_,
374 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ_deg,
375 get_angle_deg, yac_angle_tol / M_PI * 180.0, 90.0);
376}
377
378static struct yac_basic_grid_data
380 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
381 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
382 int *cell_to_edge, int *edge_to_vertex,
383 void (*LLtoXYZ_ptr)(double, double, double[]),
384 double (*get_angle_ptr)(double, double),
385 double angle_tol, double pole_y_vertex) {
386
389 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
390 x_vertices, y_vertices, cell_to_edge, edge_to_vertex, LLtoXYZ_ptr);
391
393 grid_data, x_vertices, y_vertices, get_angle_ptr, angle_tol, pole_y_vertex);
394
395 return grid_data;
396}
397
399 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
400 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
401 int *cell_to_edge, int *edge_to_vertex) {
402
403 return
405 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
406 x_vertices, y_vertices, cell_to_edge, edge_to_vertex, LLtoXYZ,
407 get_angle, yac_angle_tol, M_PI_2);
408}
409
411 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
412 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
413 int *cell_to_edge, int *edge_to_vertex) {
414
415 return
417 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
418 x_vertices, y_vertices, cell_to_edge, edge_to_vertex, LLtoXYZ_deg,
419 get_angle_deg, yac_angle_tol / M_PI * 180.0, 90.0);
420}
#define YAC_ASSERT(exp, msg)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
Definition geometry.h:269
#define yac_angle_tol
Definition geometry.h:26
static double get_angle(double a_lon, double b_lon)
Definition geometry.h:110
static double get_angle_deg(double a_lon, double b_lon)
Definition geometry.h:126
yac_edge_type
Definition grid_cell.h:12
@ YAC_GREAT_CIRCLE_EDGE
great circle
Definition grid_cell.h:13
@ YAC_LAT_CIRCLE_EDGE
latitude circle
Definition grid_cell.h:14
@ YAC_LON_CIRCLE_EDGE
longitude circle
Definition grid_cell.h:15
static 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(*LLtoXYZ_ptr)(double, double, double[]))
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
static 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_, void(*LLtoXYZ_ptr)(double, double, double[]), double(*get_angle_ptr)(double, double), double angle_tol, double pole_y_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_deg(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
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_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_)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_ll(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
static void set_ll_edge_type(struct yac_basic_grid_data grid_data, double *x_vertices, double *y_vertices, double(*get_angle_ptr)(double, double), double angle_tol, double pole_y_vertex)
static struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_ll_(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex, void(*LLtoXYZ_ptr)(double, double, double[]), double(*get_angle_ptr)(double, double), double angle_tol, double pole_y_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_ll_deg(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
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_)
static struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_base(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_vertices_per_cell_, double *x_vertices, double *y_vertices, yac_size_t_2_pointer edge_to_vertex, size_t *cell_to_vertex, size_t *cell_to_edge, void(*LLtoXYZ_ptr)(double, double, double[]))
static struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge_, int *edge_to_vertex_, void(*LLtoXYZ_ptr)(double, double, double[]))
static int compare_temp_edges(void const *a, void const *b)
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_)
#define xrealloc(ptr, size)
Definition ppm_xfuncs.h:67
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
size_t vertex[2]
size_t cell_to_edge_idx
yac_coordinate_pointer vertex_coordinates
size_t * vertex_to_cell_offsets
yac_size_t_2_pointer edge_to_vertex
enum yac_edge_type * edge_type
size_t * cell_to_vertex_offsets
int * cell_to_vertex
static void LLtoXYZ(double lon, double lat, double p_out[])
Definition toy_scrip.c:587
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19
size_t(* yac_size_t_2_pointer)[2]
Definition yac_types.h:23
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:19