28 size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges,
29 int *num_vertices_per_cell_,
32 void (*LLtoXYZ_ptr)(double, double,
double[])) {
37 for (
size_t i = 0; i < nbr_vertices; ++i)
48 size_t total_num_cell_corners = 0;
51 for (
size_t i = 0; i < nbr_cells; ++i) {
59 for (
size_t i = 0; i < total_num_cell_corners; ++i)
68 for (
size_t i = 0, accu = 0; i < nbr_vertices; ++i) {
72 for (
size_t i = 0, k = 0; i < nbr_cells; ++i) {
74 for (
size_t j = 0; j < curr_num_vertices; ++j, ++k)
84 grid.vertex_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;
102 grid.num_total_cells = nbr_cells;
103 grid.num_total_vertices = nbr_vertices;
104 grid.num_total_edges = nbr_edges;
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[])) {
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]);
122 for (
size_t i = 0; i < total_num_cell_edges; ++i) {
124 "ERROR(yac_generate_basic_grid_data_unstruct_edge_): "
125 "Index %zu in cell_to_edge (%d) is negative.",
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)
137 for (
size_t i = 0; i < 2 * nbr_edges; ++i) {
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)
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;
166 size_t curr_vertex = first_vertex;
167 for (
size_t j = 0; j < curr_num_vertices; ++j, ++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")
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")
186 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
193 double *x_vertices,
double *y_vertices,
int *cell_to_vertex_,
194 void (*LLtoXYZ_ptr)(double, double,
double[])) {
197 size_t total_num_cell_corners = 0;
198 for (
size_t i = 0; i < nbr_cells; ++i)
204 for (
size_t i = 0; i < total_num_cell_corners; ++i) {
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)
218 xmalloc(total_num_cell_corners *
sizeof(*temp_edges));
219 for (
size_t i = 0, offset = 0, k = 0; i < nbr_cells; ++i) {
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) {
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];
231 qsort(temp_edges, total_num_cell_corners,
235 size_t * cell_to_edge =
236 xmalloc(total_num_cell_corners *
sizeof(*cell_to_edge));
237 size_t nbr_edges = 0;
239 for (
size_t i = 0, prev_indices[2] = {SIZE_MAX, SIZE_MAX};
240 i < total_num_cell_corners; ++i) {
243 if ((prev_indices[0] != temp_edges[i].
vertex[0]) ||
244 (prev_indices[1] != temp_edges[i].
vertex[1])) {
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];
253 cell_to_edge[curr_cell_to_edge_idx] = nbr_edges - 1;
256 xrealloc(edge_to_vertex, nbr_edges *
sizeof(*edge_to_vertex));
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,
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_) {
271 nbr_vertices, nbr_cells, num_vertices_per_cell_,
272 x_vertices, y_vertices, cell_to_vertex_,
LLtoXYZ);
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_) {
281 nbr_vertices, nbr_cells, num_vertices_per_cell_,
282 x_vertices, y_vertices, cell_to_vertex_,
LLtoXYZ_deg);
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,
292 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
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,
303 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
309 double *x_vertices,
double *y_vertices,
310 double (*get_angle_ptr)(
double,
double),
311 double angle_tol,
double pole_y_vertex) {
313 for (
size_t i = 0; i <
grid_data.num_edges; ++i) {
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));
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]]);
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) {
347 nbr_vertices, nbr_cells, num_vertices_per_cell_,
348 x_vertices, y_vertices, cell_to_vertex_, LLtoXYZ_ptr);
351 grid_data, x_vertices, y_vertices, get_angle_ptr, angle_tol, pole_y_vertex);
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_) {
362 nbr_vertices, nbr_cells, num_vertices_per_cell_,
363 x_vertices, y_vertices, cell_to_vertex_,
LLtoXYZ,
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_) {
373 nbr_vertices, nbr_cells, num_vertices_per_cell_,
374 x_vertices, y_vertices, cell_to_vertex_,
LLtoXYZ_deg,
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,
383 void (*LLtoXYZ_ptr)(double, double,
double[]),
384 double (*get_angle_ptr)(double, double),
385 double angle_tol,
double pole_y_vertex) {
389 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
393 grid_data, x_vertices, y_vertices, get_angle_ptr, angle_tol, pole_y_vertex);
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,
405 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
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,
417 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
#define YAC_ASSERT(exp, msg)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
static double get_angle(double a_lon, double b_lon)
static double get_angle_deg(double a_lon, double b_lon)
@ YAC_GREAT_CIRCLE_EDGE
great circle
@ YAC_LAT_CIRCLE_EDGE
latitude circle
@ YAC_LON_CIRCLE_EDGE
longitude circle
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)
#define xcalloc(nmemb, size)
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 * num_vertices_per_cell
int * num_cells_per_vertex
static void LLtoXYZ(double lon, double lat, double p_out[])
#define YAC_ASSERT_F(exp, format,...)
size_t(* yac_size_t_2_pointer)[2]
double(* yac_coordinate_pointer)[3]