YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_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 <string.h>
6
7#include "tests.h"
8#include "test_common.h"
9#include "grids/basic_grid.h"
10#include "geometry.h"
11
19enum {
20 NUM_LOCACTIONS = sizeof(locations) / sizeof(locations[0])
21};
22
23static void utest_check_basic_grid(
24 struct yac_basic_grid * grid, char const * ref_grid_name,
25 struct yac_basic_grid_data ref_grid_data,
26 int const * const * ref_core_masks,
27 size_t const * ref_grid_data_sizes);
28
29static void utest_check_interp_field(
30 struct yac_basic_grid * grid, struct yac_interp_field field,
31 yac_const_coordinate_pointer ref_coords, int const * ref_mask);
32
33// declaration of Fortran to C interfaces
35 struct yac_basic_grid * grid, int location);
37 struct yac_basic_grid * grid, int location, double * coordinates);
39 struct yac_basic_grid * grid, int location,
40 double * coordinates, size_t count);
42 struct yac_basic_grid * grid, int location,
43 int const * mask, char const * mask_name);
45 struct yac_basic_grid * grid, int location,
46 int const * mask, size_t count, char const * mask_name);
47
48int main (void) {
49
50 char const * grid_name = "basic_grid_name";
51
52 { // test yac_basic_grid_new
53
54 size_t nbr_vertices[2] = {2,3};
55 int cyclic[2] = {0,0};
56 double lon_vertices[] = {0,1};
57 double lat_vertices[] = {0,1,2};
58
61 nbr_vertices, cyclic, lon_vertices, lat_vertices);
62
63 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
64
65 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
66 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
67
68 // some basic checks
69 utest_check_basic_grid(
70 grid, grid_name, grid_data, ref_core_masks, ref_grid_data_sizes);
71
72 // cleanup
74 }
75
76 { // test yac_basic_grid_empty_new
77
78 struct yac_basic_grid * grid = yac_basic_grid_empty_new(grid_name);
79
80 struct yac_basic_grid_data ref_grid_data =
81 yac_generate_basic_grid_data_unstruct(0, 0, NULL, NULL, NULL, NULL);
82 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
83 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {0, 0, 0};
84
85 // some basic checks
86 utest_check_basic_grid(
87 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
88
89 // cleanup
90 yac_basic_grid_data_free(ref_grid_data);
92 }
93
94 { // test yac_basic_grid_reg_2d_new
95
96 size_t nbr_vertices[2] = {2,3};
97 int cyclic[2] = {0,0};
98 double lon_vertices[] = {0.0,0.1};
99 double lat_vertices[] = {0.0,0.1,0.2};
100
101 struct yac_basic_grid * grid =
103 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices);
104
105 struct yac_basic_grid_data ref_grid_data =
107 nbr_vertices, cyclic, lon_vertices, lat_vertices);
108 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
109 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
110
111 // some basic checks
112 utest_check_basic_grid(
113 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
114
115 // cleanup
116 yac_basic_grid_data_free(ref_grid_data);
118 }
119
120 { // test yac_basic_grid_reg_2d_deg_new
121
122 size_t nbr_vertices[2] = {2,3};
123 int cyclic[2] = {0,0};
124 double lon_vertices[] = {0.0,0.1};
125 double lat_vertices[] = {0.0,0.1,0.2};
126
127 struct yac_basic_grid * grid =
129 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices);
130
131 struct yac_basic_grid_data ref_grid_data =
133 nbr_vertices, cyclic, lon_vertices, lat_vertices);
134 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
135 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
136
137 // some basic checks
138 utest_check_basic_grid(
139 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
140
141 // cleanup
142 yac_basic_grid_data_free(ref_grid_data);
144 }
145
146 { // test yac_basic_grid_curve_2d_new
147
148 size_t nbr_vertices[2] = {2,3};
149 int cyclic[2] = {0,0};
150 double lon_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
151 double lat_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
152
153 struct yac_basic_grid * grid =
155 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices);
156
157 struct yac_basic_grid_data ref_grid_data =
159 nbr_vertices, cyclic, lon_vertices, lat_vertices);
160 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
161 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
162
163 // some basic checks
164 utest_check_basic_grid(
165 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
166
167 // cleanup
168 yac_basic_grid_data_free(ref_grid_data);
170 }
171
172 { // test yac_basic_grid_curve_2d_deg_new
173
174 size_t nbr_vertices[2] = {2,3};
175 int cyclic[2] = {0,0};
176 double lon_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
177 double lat_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
178
179 struct yac_basic_grid * grid =
181 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices);
182
183 struct yac_basic_grid_data ref_grid_data =
185 nbr_vertices, cyclic, lon_vertices, lat_vertices);
186 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
187 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
188
189 // some basic checks
190 utest_check_basic_grid(
191 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
192
193 // cleanup
194 yac_basic_grid_data_free(ref_grid_data);
196 }
197
198 { // test yac_basic_grid_unstruct_new
199
200 size_t nbr_vertices = 6;
201 size_t nbr_cells = 2;
202 int num_vertices_per_cell[] = {4, 4};
203 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
204 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
205 int cell_to_vertex[] = {0,1,3,2, 2,3,5,4};
206
207 struct yac_basic_grid * grid =
209 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
210 x_vertices, y_vertices, cell_to_vertex);
211
212 struct yac_basic_grid_data ref_grid_data =
214 nbr_vertices, nbr_cells, num_vertices_per_cell,
215 x_vertices, y_vertices, cell_to_vertex);
216 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
217 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
218
219 // some basic checks
220 utest_check_basic_grid(
221 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
222
223 // cleanup
224 yac_basic_grid_data_free(ref_grid_data);
226 }
227
228 { // test yac_basic_grid_unstruct_deg_new
229
230 size_t nbr_vertices = 6;
231 size_t nbr_cells = 2;
232 int num_vertices_per_cell[] = {4, 4};
233 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
234 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
235 int cell_to_vertex[] = {0,1,3,2, 2,3,5,4};
236
237 struct yac_basic_grid * grid =
239 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
240 x_vertices, y_vertices, cell_to_vertex);
241
242 struct yac_basic_grid_data ref_grid_data =
244 nbr_vertices, nbr_cells, num_vertices_per_cell,
245 x_vertices, y_vertices, cell_to_vertex);
246 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
247 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
248
249 // some basic checks
250 utest_check_basic_grid(
251 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
252
253 // cleanup
254 yac_basic_grid_data_free(ref_grid_data);
256 }
257
258 { // test yac_basic_grid_unstruct_ll_new
259
260 size_t nbr_vertices = 6;
261 size_t nbr_cells = 2;
262 int num_vertices_per_cell[] = {4, 4};
263 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
264 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
265 int cell_to_vertex[] = {0,1,3,2, 2,3,5,4};
266
267 struct yac_basic_grid * grid =
269 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
270 x_vertices, y_vertices, cell_to_vertex);
271
272 struct yac_basic_grid_data ref_grid_data =
274 nbr_vertices, nbr_cells, num_vertices_per_cell,
275 x_vertices, y_vertices, cell_to_vertex);
276 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
277 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
278
279 // some basic checks
280 utest_check_basic_grid(
281 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
282
283 // cleanup
284 yac_basic_grid_data_free(ref_grid_data);
286 }
287
288 { // test yac_basic_grid_unstruct_ll_deg_new
289
290 size_t nbr_vertices = 6;
291 size_t nbr_cells = 2;
292 int num_vertices_per_cell[] = {4, 4};
293 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
294 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
295 int cell_to_vertex[] = {0,1,3,2, 2,3,5,4};
296
297 struct yac_basic_grid * grid =
299 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
300 x_vertices, y_vertices, cell_to_vertex);
301
302 struct yac_basic_grid_data ref_grid_data =
304 nbr_vertices, nbr_cells, num_vertices_per_cell,
305 x_vertices, y_vertices, cell_to_vertex);
306 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
307 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
308
309 // some basic checks
310 utest_check_basic_grid(
311 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
312
313 // cleanup
314 yac_basic_grid_data_free(ref_grid_data);
316 }
317
318 { // test yac_basic_grid_unstruct_edge_new
319
320 size_t nbr_vertices = 6;
321 size_t nbr_cells = 2;
322 size_t nbr_edges = 7;
323 int num_edges_per_cell[] = {4, 4};
324 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
325 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
326 int cell_to_edge[] = {0,2,3,1, 3,5,6,4};
327 int edge_to_vertex[] = {0,1, 0,2, 1,3, 2,3, 2,4, 3,5, 4,5};
328
329 struct yac_basic_grid * grid =
331 grid_name, nbr_vertices, nbr_cells, nbr_edges,
332 num_edges_per_cell, x_vertices, y_vertices,
333 cell_to_edge, edge_to_vertex);
334
335 struct yac_basic_grid_data ref_grid_data =
337 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
338 x_vertices, y_vertices, cell_to_edge, edge_to_vertex);
339 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
340 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
341
342 // some basic checks
343 utest_check_basic_grid(
344 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
345
346 // cleanup
347 yac_basic_grid_data_free(ref_grid_data);
349 }
350
351 { // test yac_basic_grid_unstruct_deg_new
352
353 size_t nbr_vertices = 6;
354 size_t nbr_cells = 2;
355 size_t nbr_edges = 7;
356 int num_edges_per_cell[] = {4, 4};
357 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
358 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
359 int cell_to_edge[] = {0,2,3,1, 3,5,6,4};
360 int edge_to_vertex[] = {0,1, 0,2, 1,3, 2,3, 2,4, 3,5, 4,5};
361
362 struct yac_basic_grid * grid =
364 grid_name, nbr_vertices, nbr_cells, nbr_edges,
365 num_edges_per_cell, x_vertices, y_vertices,
366 cell_to_edge, edge_to_vertex);
367
368 struct yac_basic_grid_data ref_grid_data =
370 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
371 x_vertices, y_vertices, cell_to_edge, edge_to_vertex);
372 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
373 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
374
375 // some basic checks
376 utest_check_basic_grid(
377 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
378
379 // cleanup
380 yac_basic_grid_data_free(ref_grid_data);
382 }
383
384 { // test yac_basic_grid_unstruct_ll_new
385
386 size_t nbr_vertices = 6;
387 size_t nbr_cells = 2;
388 size_t nbr_edges = 7;
389 int num_edges_per_cell[] = {4, 4};
390 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
391 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
392 int cell_to_edge[] = {0,2,3,1, 3,5,6,4};
393 int edge_to_vertex[] = {0,1, 0,2, 1,3, 2,3, 2,4, 3,5, 4,5};
394
395 struct yac_basic_grid * grid =
397 grid_name, nbr_vertices, nbr_cells, nbr_edges,
398 num_edges_per_cell, x_vertices, y_vertices,
399 cell_to_edge, edge_to_vertex);
400
401 struct yac_basic_grid_data ref_grid_data =
403 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
404 x_vertices, y_vertices, cell_to_edge, edge_to_vertex);
405 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
406 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
407
408 // some basic checks
409 utest_check_basic_grid(
410 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
411
412 // cleanup
413 yac_basic_grid_data_free(ref_grid_data);
415 }
416
417 { // test yac_basic_grid_unstruct_ll_deg_new
418
419 size_t nbr_vertices = 6;
420 size_t nbr_cells = 2;
421 size_t nbr_edges = 7;
422 int num_edges_per_cell[] = {4, 4};
423 double x_vertices[] = {0.0,0.1,0.0,0.1,0.0,0.1};
424 double y_vertices[] = {0.0,0.0,0.1,0.1,0.2,0.2};
425 int cell_to_edge[] = {0,2,3,1, 3,5,6,4};
426 int edge_to_vertex[] = {0,1, 0,2, 1,3, 2,3, 2,4, 3,5, 4,5};
427
428 struct yac_basic_grid * grid =
430 grid_name, nbr_vertices, nbr_cells, nbr_edges,
431 num_edges_per_cell, x_vertices, y_vertices,
432 cell_to_edge, edge_to_vertex);
433
434 struct yac_basic_grid_data ref_grid_data =
436 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
437 x_vertices, y_vertices, cell_to_edge, edge_to_vertex);
438 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
439 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
440
441 // some basic checks
442 utest_check_basic_grid(
443 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
444
445 // cleanup
446 yac_basic_grid_data_free(ref_grid_data);
448 }
449
450 { // test yac_basic_grid_cloud_new
451
452 size_t nbr_points = 6;
453 double x_points[] = {0.0,0.1,0.0,0.1,0.0,0.1};
454 double y_points[] = {0.0,0.0,0.1,0.1,0.2,0.2};
455
456 struct yac_basic_grid * grid =
458 grid_name, nbr_points, x_points, y_points);
459
460 struct yac_basic_grid_data ref_grid_data =
461 yac_generate_basic_grid_data_cloud(nbr_points, x_points, y_points);
462 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
463 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {0, 6, 0};
464
465 // some basic checks
466 utest_check_basic_grid(
467 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
468
469 // cleanup
470 yac_basic_grid_data_free(ref_grid_data);
472 }
473
474 { // test yac_basic_grid_cloud_deg_new
475
476 size_t nbr_points = 6;
477 double x_points[] = {0.0,0.1,0.0,0.1,0.0,0.1};
478 double y_points[] = {0.0,0.0,0.1,0.1,0.2,0.2};
479
480 struct yac_basic_grid * grid =
482 grid_name, nbr_points, x_points, y_points);
483
484 struct yac_basic_grid_data ref_grid_data =
485 yac_generate_basic_grid_data_cloud_deg(nbr_points, x_points, y_points);
486 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
487 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {0, 6, 0};
488
489 // some basic checks
490 utest_check_basic_grid(
491 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
492
493 // cleanup
494 yac_basic_grid_data_free(ref_grid_data);
496 }
497
498 { // test yac_basic_grid_reg_2d_new
499
500 size_t nbr_vertices[2] = {2,3};
501 int cyclic[2] = {0,0};
502 double lon_vertices[] = {-0.5*YAC_RAD,0.5*YAC_RAD};
503 double lat_vertices[] = {-0.5*YAC_RAD,0.0*YAC_RAD,0.5*YAC_RAD};
504 double north_pole_lon = 180.0*YAC_RAD;
505 double north_pole_lat = 45.0*YAC_RAD;
506
507 struct yac_basic_grid * grid =
509 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices,
510 north_pole_lon, north_pole_lat);
511
512 struct yac_basic_grid_data ref_grid_data =
514 nbr_vertices, cyclic, lon_vertices, lat_vertices,
515 north_pole_lon, north_pole_lat);
516 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
517 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
518
519 // some basic checks
520 utest_check_basic_grid(
521 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
522
523 // cleanup
524 yac_basic_grid_data_free(ref_grid_data);
526 }
527
528 { // test yac_basic_grid_reg_2d_deg_new
529
530 size_t nbr_vertices[2] = {2,3};
531 int cyclic[2] = {0,0};
532 double lon_vertices[] = {-0.5,0.5};
533 double lat_vertices[] = {-0.5,0.0,0.5};
534 double north_pole_lon = 180.0;
535 double north_pole_lat = 45.0;
536
537 struct yac_basic_grid * grid =
539 grid_name, nbr_vertices, cyclic, lon_vertices, lat_vertices,
540 north_pole_lon, north_pole_lat);
541
542 struct yac_basic_grid_data ref_grid_data =
544 nbr_vertices, cyclic, lon_vertices, lat_vertices,
545 north_pole_lon, north_pole_lat);
546 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
547 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {2, 6, 7};
548
549 // some basic checks
550 utest_check_basic_grid(
551 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
552
553 // cleanup
554 yac_basic_grid_data_free(ref_grid_data);
556 }
557
558 { // test yac_interp_fields
559
560 size_t nbr_vertices[2] = {2,3};
561 int cyclic[2] = {0,0};
562 double lon_vertices[] = {0,1};
563 double lat_vertices[] = {0,1,2};
564
567 nbr_vertices, cyclic, lon_vertices, lat_vertices);
568
569 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
570
571 {
572 double ref_cell_center_coordinates[2][3];
573 int ref_cell_mask[] = {0,1};
574 LLtoXYZ_deg(0.5, 0.5, ref_cell_center_coordinates[0]);
575 LLtoXYZ_deg(0.5, 1.5, ref_cell_center_coordinates[1]);
576 struct yac_interp_field cell_interp_field =
577 {
579 .coordinates_idx =
581 grid, YAC_LOC_CELL, ref_cell_center_coordinates, 2),
582 .masks_idx =
584 grid, YAC_LOC_CELL, ref_cell_mask, 2, NULL)
585 };
586
587 utest_check_interp_field(
588 grid, cell_interp_field,
589 (yac_const_coordinate_pointer)ref_cell_center_coordinates, ref_cell_mask);
590 }
591
592 {
593 struct yac_interp_field cell_interp_field =
594 {
596 .coordinates_idx = SIZE_MAX,
597 .masks_idx = SIZE_MAX
598 };
599
600 utest_check_interp_field(
601 grid, cell_interp_field, NULL, NULL);
602 }
603
604 // cleanup
606 }
607
608 { // test named masks
609
610 size_t nbr_vertices[2] = {2,3};
611 int cyclic[2] = {0,0};
612 double lon_vertices[] = {0,1};
613 double lat_vertices[] = {0,1,2};
614
617 nbr_vertices, cyclic, lon_vertices, lat_vertices);
618
619 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
620
621 int const cell_mask[] = {1,0,1,0,1,0};
622
623 char const mask_name[] = "test_mask";
624
625 size_t ref_mask_idx =
627 grid, YAC_LOC_CORNER, cell_mask, 6, mask_name);
628
629 if (ref_mask_idx !=
631 grid, YAC_LOC_CORNER, mask_name))
632 PUT_ERR("ERROR in yac_basic_grid_get_named_mask_idx");
633
634 if (SIZE_MAX !=
636 grid, YAC_LOC_CORNER, NULL))
637 PUT_ERR("ERROR in yac_basic_grid_get_named_mask_idx");
638
639 // cleanup
641 }
642
643 { // test field data
644
645 size_t nbr_vertices[2] = {2,3};
646 int cyclic[2] = {0,0};
647 double lon_vertices[] = {0,1};
648 double lat_vertices[] = {0,1,2};
649
652 nbr_vertices, cyclic, lon_vertices, lat_vertices);
653
654 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
655
656 {
657 double cell_coordinates[2][2][3];
658 double vertex_coordinates[1][6][3];
659 int cell_mask[3][2] = {{1,0},{0,1},{0,0}};
660 int edge_mask[2][7] = {{0,0,0,1,1,1,1},{1,1,1,0,0,0,0}};
661
662 LLtoXYZ_deg(0.5, 0.5, cell_coordinates[0][0]);
663 LLtoXYZ_deg(0.5, 1.5, cell_coordinates[0][1]);
664 LLtoXYZ_deg(0.6, 0.6, cell_coordinates[1][0]);
665 LLtoXYZ_deg(0.6, 1.6, cell_coordinates[1][1]);
666
667 LLtoXYZ_deg(0, 0, vertex_coordinates[0][0]);
668 LLtoXYZ_deg(1, 0, vertex_coordinates[0][1]);
669 LLtoXYZ_deg(0, 1, vertex_coordinates[0][2]);
670 LLtoXYZ_deg(1, 1, vertex_coordinates[0][3]);
671 LLtoXYZ_deg(0, 2, vertex_coordinates[0][4]);
672 LLtoXYZ_deg(1, 2, vertex_coordinates[0][5]);
673
674 enum {
675 NUM_CELL_COORDS =
676 sizeof(cell_coordinates)/sizeof(cell_coordinates[0]),
677 NUM_CELL_MASKS = sizeof(cell_mask)/sizeof(cell_mask[0]),
678 NUM_CORNER_COORDS =
679 sizeof(vertex_coordinates)/sizeof(vertex_coordinates[0]),
680 NUM_CORNER_MASKS = 0,
681 NUM_EDGE_COORDS = 0,
682 NUM_EDGE_MASKS = sizeof(edge_mask)/sizeof(edge_mask[0]),
683 };
684
685 size_t ref_coordinates_idxs[3][2] = {
687 grid, YAC_LOC_CELL, cell_coordinates[0], 2),
689 grid, YAC_LOC_CELL, cell_coordinates[1], 2)},
691 grid, YAC_LOC_CORNER, vertex_coordinates[0], 6)},
692 {SIZE_MAX}
693 };
694 size_t ref_masks_idxs[3][3] = {
696 grid, YAC_LOC_CELL, cell_mask[0], 2, NULL),
698 grid, YAC_LOC_CELL, cell_mask[1], 2, NULL),
700 grid, YAC_LOC_CELL, cell_mask[2], 2, NULL)},
701 {SIZE_MAX},
703 grid, YAC_LOC_EDGE, edge_mask[0], 7, NULL),
705 grid, YAC_LOC_EDGE, edge_mask[1], 7, NULL)}
706 };
707
708 size_t ref_num_coords[3] =
709 {NUM_CELL_COORDS, NUM_CORNER_COORDS, NUM_EDGE_COORDS};
710 size_t ref_num_masks[3] =
711 {NUM_CELL_MASKS, NUM_CORNER_MASKS, NUM_EDGE_MASKS};
712
713 for (size_t loc_idx = 0; loc_idx < NUM_LOCACTIONS; ++loc_idx) {
714
715 struct yac_field_data * field_data =
717
718 if (ref_num_coords[loc_idx] !=
720 PUT_ERR("ERROR in yac_field_data_get_coordinates_count");
721
722 size_t data_size = yac_basic_grid_get_data_size(grid, locations[loc_idx]);
723
724 for (size_t coord_idx = 0; coord_idx < ref_num_coords[loc_idx];
725 ++coord_idx) {
726
727 struct yac_interp_field interp_field =
728 {.location = locations[loc_idx],
729 .coordinates_idx = ref_coordinates_idxs[loc_idx][coord_idx],
730 .masks_idx = SIZE_MAX};
731
733 yac_basic_grid_get_field_coordinates(grid, interp_field);
735 yac_field_data_get_coordinates_data(field_data, coord_idx);
736
737 for (size_t i = 0; i < data_size; ++i)
738 if (get_vector_angle(ref_coords[i], coords[i]) > yac_angle_tol)
739 PUT_ERR("ERROR in yac_basic_grid_get_field_data");
740 }
741
742 for (size_t masks_idx = 0; masks_idx < ref_num_masks[loc_idx];
743 ++masks_idx) {
744
745 struct yac_interp_field interp_field =
746 {.location = locations[loc_idx],
747 .coordinates_idx = SIZE_MAX,
748 .masks_idx = ref_masks_idxs[loc_idx][masks_idx]};
749
750 int const * ref_masks =
751 yac_basic_grid_get_field_mask(grid, interp_field);
752 int const * masks =
754
755 for (size_t i = 0; i < data_size; ++i)
756 if (ref_masks[i] != masks[i])
757 PUT_ERR("ERROR in yac_basic_grid_get_field_data");
758 }
759 }
760 }
761
762 // cleanup
764 }
765
766 { // test Fortran to C interfaces
767
768 size_t nbr_vertices[2] = {2,3};
769 int cyclic[2] = {0,0};
770 double lon_vertices[] = {0,1};
771 double lat_vertices[] = {0,1,2};
772
775 nbr_vertices, cyclic, lon_vertices, lat_vertices);
776
777 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
778
779 {
780 double ref_cell_center_coordinates[2][2][3];
781 int ref_cell_mask[2][2] = {{0,1},{1,0}};
782 LLtoXYZ_deg(0.5, 0.5, ref_cell_center_coordinates[0][0]);
783 LLtoXYZ_deg(0.5, 1.5, ref_cell_center_coordinates[0][1]);
784 LLtoXYZ_deg(0.6, 0.6, ref_cell_center_coordinates[1][0]);
785 LLtoXYZ_deg(0.6, 1.6, ref_cell_center_coordinates[1][1]);
786
787 struct yac_interp_field interp_fields[2] = {
788 {
790 .coordinates_idx =
792 grid, YAC_LOC_CELL, TO_POINTER(ref_cell_center_coordinates[0])),
793 .masks_idx =
795 grid, YAC_LOC_CELL, TO_POINTER(ref_cell_mask[0]), NULL)
796 },
797 {
798 .location = YAC_LOC_CELL,
799 .coordinates_idx =
801 grid, YAC_LOC_CELL, &(ref_cell_center_coordinates[1][0][0]), 2),
802 .masks_idx =
804 grid, YAC_LOC_CELL, ref_cell_mask[1], 2, NULL)
805 }
806 };
807 enum {NUM_FIELDS = sizeof(interp_fields) / sizeof(interp_fields[0])};
808
809 for (size_t loc_idx = 0; loc_idx < NUM_LOCACTIONS; ++loc_idx) {
810 if (yac_basic_grid_get_data_size(grid, locations[loc_idx]) !=
811 yac_basic_grid_get_data_size_f2c(grid, (int)(locations[loc_idx])))
812 PUT_ERR("ERROR in yac_basic_grid_get_data_size_f2c");
813 }
814
815 for (size_t i = 0; i < NUM_FIELDS; ++i)
816 utest_check_interp_field(
817 grid, interp_fields[i],
818 (yac_const_coordinate_pointer)(ref_cell_center_coordinates[i]),
819 ref_cell_mask[i]);
820 }
821
822 // cleanup
824 }
825
826 { // check for bug that occured in edge-based unstruct grid definition
827
828 char const * grid_name = "unstruct_edge_bug";
829 enum {NBR_EDGES = 3};
830 size_t nbr_vertices = NBR_EDGES;
831 size_t nbr_cells = 1;
832 size_t nbr_edges = NBR_EDGES;
833 int num_edges_per_cell[] = {NBR_EDGES};
834 double x_vertices[] = {-0.1,0.0,0.1};
835 double y_vertices[] = {0.0,0.0,0.1};
836 int cell_to_edge[][NBR_EDGES] =
837 {{0,1,2}, {0,2,1}, {1,0,2}, {1,2,0}, {2,0,1}, {2,1,0}};
838 int edge_to_vertex[NBR_EDGES][2] = {{0,1}, {1,2}, {2,0}};
839 int ref_edge_to_vertex[] = {0,1, 1,2, 2,0};
840
841 for (size_t i = 0; i < sizeof(cell_to_edge) / sizeof(cell_to_edge[0]);
842 ++i) {
843
844 int edge_vertex_ordering[NBR_EDGES];
845 for (edge_vertex_ordering[0] = 0; edge_vertex_ordering[0] < 2;
846 ++edge_vertex_ordering[0]) {
847 for (edge_vertex_ordering[1] = 0; edge_vertex_ordering[1] < 2;
848 ++edge_vertex_ordering[1]) {
849 for (edge_vertex_ordering[2] = 0; edge_vertex_ordering[2] < 2;
850 ++edge_vertex_ordering[2]) {
851
852 struct yac_basic_grid_data ref_grid_data =
854 nbr_vertices, nbr_cells, nbr_edges, num_edges_per_cell,
855 x_vertices, y_vertices, cell_to_edge[i], ref_edge_to_vertex);
856
857 int temp_edge_to_vertex[NBR_EDGES][2];
858
859 for (size_t j = 0; j < NBR_EDGES; ++j) {
860 temp_edge_to_vertex[j][edge_vertex_ordering[j]] =
861 edge_to_vertex[j][0];
862 temp_edge_to_vertex[j][edge_vertex_ordering[j]^1] =
863 edge_to_vertex[j][1];
864 }
865
866 struct yac_basic_grid * grid =
868 grid_name, nbr_vertices, nbr_cells, nbr_edges,
869 num_edges_per_cell, x_vertices, y_vertices,
870 cell_to_edge[i], &temp_edge_to_vertex[0][0]);
871
872 int const * ref_core_masks[NUM_LOCACTIONS] = {NULL, NULL, NULL};
873 size_t const ref_grid_data_sizes[NUM_LOCACTIONS] = {1, 3, 3};
874
875 // some basic checks
876 utest_check_basic_grid(
877 grid, grid_name, ref_grid_data, ref_core_masks, ref_grid_data_sizes);
878
879 // cleanup
881 yac_basic_grid_data_free(ref_grid_data);
882 }
883 }
884 }
885 }
886 }
887
888 { // test yac_basic_grid_check_coordinates
889
890 size_t nbr_vertices[2] = {2,3};
891 int cyclic[2] = {0,0};
892 double lon_vertices[] = {0,1};
893 double lat_vertices[] = {0,1,2};
894
895 int core_cell_mask[] = {1,0};
896 int core_vertex_mask[] = {1,1,1,1,1,0};
897 int core_edge_mask[] = {1,1,1,1,1,1,0};
898
901 nbr_vertices, cyclic, lon_vertices, lat_vertices);
902
903 // adds core masks for cell, vertices and edges
904 grid_data.core_cell_mask = TO_POINTER(core_cell_mask);
905 grid_data.core_vertex_mask = TO_POINTER(core_vertex_mask);
906 grid_data.core_edge_mask = TO_POINTER(core_edge_mask);
907
908 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
909
910 // add cell center coordinates
911 yac_coordinate_pointer cell_center_coordinates =
912 malloc(2 * sizeof(*cell_center_coordinates));
913 LLtoXYZ_deg(0.5, 0.5, cell_center_coordinates[0]);
914 LLtoXYZ_deg(90.0, 90.0, cell_center_coordinates[1]);
916 grid, YAC_LOC_CELL, cell_center_coordinates);
917
918 // add cell coordinates for upper left corner of each cell
919 yac_coordinate_pointer cell_upper_left_coordinates =
920 malloc(2 * sizeof(*cell_upper_left_coordinates));
921 LLtoXYZ_deg(0.0, 1.0, cell_upper_left_coordinates[0]);
922 LLtoXYZ_deg(0.0, 2.0, cell_upper_left_coordinates[1]);
924 grid, YAC_LOC_CELL, cell_upper_left_coordinates);
925
926 // add corner coordinates for all vertices
927 yac_coordinate_pointer vertex_coordinates =
928 malloc(6 * sizeof(*vertex_coordinates));
929 LLtoXYZ_deg(0, 0, vertex_coordinates[0]);
930 LLtoXYZ_deg(1, 0, vertex_coordinates[1]);
931 LLtoXYZ_deg(0, 1, vertex_coordinates[2]);
932 LLtoXYZ_deg(1, 1, vertex_coordinates[3]);
933 LLtoXYZ_deg(0, 2, vertex_coordinates[4]);
934 LLtoXYZ_deg(90.0, 90.0, vertex_coordinates[5]);
936 grid, YAC_LOC_CORNER, vertex_coordinates);
937
938 // add edge middle point coordinates for all edges
939 yac_coordinate_pointer edge_middle_coordinates =
940 malloc(7 * sizeof(*edge_middle_coordinates));
941 LLtoXYZ_deg(0.5, 0.0, edge_middle_coordinates[0]);
942 LLtoXYZ_deg(0.0, 0.5, edge_middle_coordinates[1]);
943 LLtoXYZ_deg(1.0, 0.5, edge_middle_coordinates[2]);
944 LLtoXYZ_deg(0.5, 1.0, edge_middle_coordinates[3]);
945 LLtoXYZ_deg(0.0, 1.5, edge_middle_coordinates[4]);
946 LLtoXYZ_deg(1.0, 1.5, edge_middle_coordinates[5]);
947 LLtoXYZ_deg(90.0, 90.0, edge_middle_coordinates[6]);
949 grid, YAC_LOC_EDGE, edge_middle_coordinates);
950
951 // add starting point of each edge as edge coordinates
952 yac_coordinate_pointer edge_start_coordinates =
953 malloc(7 * sizeof(*edge_start_coordinates));
954 LLtoXYZ_deg(0.0, 0.0, edge_start_coordinates[0]);
955 LLtoXYZ_deg(0.0, 0.0, edge_start_coordinates[1]);
956 LLtoXYZ_deg(1.0, 0.0, edge_start_coordinates[2]);
957 LLtoXYZ_deg(0.0, 1.0, edge_start_coordinates[3]);
958 LLtoXYZ_deg(0.0, 1.0, edge_start_coordinates[4]);
959 LLtoXYZ_deg(1.0, 1.0, edge_start_coordinates[5]);
960 LLtoXYZ_deg(0.0, 2.0, edge_start_coordinates[6]);
962 grid, YAC_LOC_EDGE, edge_start_coordinates);
963
964 int is_fatal = 1;
965
966 if (yac_basic_grid_check_coordinates(grid, is_fatal) != 0)
967 PUT_ERR("ERROR in yac_basic_grid_check_coordinates");
968
969 // cleanup
971 }
972
973 { // test yac_basic_grid_check_coordinates with invalid cell coordinates
974
975 size_t nbr_vertices[2] = {2,3};
976 int cyclic[2] = {0,0};
977 double lon_vertices[] = {0,1};
978 double lat_vertices[] = {0,1,2};
979
982 nbr_vertices, cyclic, lon_vertices, lat_vertices);
983
984 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
985
986 // add invalid cell center coordinates for all cells
987 double deg_offset = 2.0;
988 yac_coordinate_pointer cell_center_coordinates =
989 malloc(2 * sizeof(*cell_center_coordinates));
990 LLtoXYZ_deg(0.5 + deg_offset, 0.5, cell_center_coordinates[0]);
991 LLtoXYZ_deg(0.5 + deg_offset, 1.5, cell_center_coordinates[1]);
993 grid, YAC_LOC_CELL, cell_center_coordinates);
994
995 int is_fatal = 0;
996
997 if (yac_basic_grid_check_coordinates(grid, is_fatal) != 1)
998 PUT_ERR("ERROR in yac_basic_grid_check_coordinates");
999
1000 // cleanup
1002 }
1003
1004 { // test yac_basic_grid_check_coordinates with invalid vertex coordinates
1005
1006 size_t nbr_vertices[2] = {2,3};
1007 int cyclic[2] = {0,0};
1008 double lon_vertices[] = {0,1};
1009 double lat_vertices[] = {0,1,2};
1010
1013 nbr_vertices, cyclic, lon_vertices, lat_vertices);
1014
1015 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
1016
1017 // add invalid vertex coordinates for all vertices
1018 double deg_offset = 0.1;
1019 yac_coordinate_pointer vertex_coordinates =
1020 malloc(6 * sizeof(*vertex_coordinates));
1021 LLtoXYZ_deg(0 + deg_offset, 0, vertex_coordinates[0]);
1022 LLtoXYZ_deg(1 + deg_offset, 0, vertex_coordinates[1]);
1023 LLtoXYZ_deg(0 + deg_offset, 1, vertex_coordinates[2]);
1024 LLtoXYZ_deg(1 + deg_offset, 1, vertex_coordinates[3]);
1025 LLtoXYZ_deg(0 + deg_offset, 2, vertex_coordinates[4]);
1026 LLtoXYZ_deg(1 + deg_offset, 2, vertex_coordinates[5]);
1028 grid, YAC_LOC_CORNER, vertex_coordinates);
1029
1030 int is_fatal = 0;
1031
1032 if (yac_basic_grid_check_coordinates(grid, is_fatal) != 1)
1033 PUT_ERR("ERROR in yac_basic_grid_check_coordinates");
1034
1035 // cleanup
1037 }
1038
1039 { // test yac_basic_grid_check_coordinates with invalid edge coordinates
1040
1041 size_t nbr_vertices[2] = {2,3};
1042 int cyclic[2] = {0,0};
1043 double lon_vertices[] = {0,1};
1044 double lat_vertices[] = {0,1,2};
1045
1048 nbr_vertices, cyclic, lon_vertices, lat_vertices);
1049
1050 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
1051
1052 // add invalid edge middle point coordinates for all edges
1053 double deg_offset = 1.0;
1054 yac_coordinate_pointer edge_middle_coordinates =
1055 malloc(7 * sizeof(*edge_middle_coordinates));
1056 LLtoXYZ_deg(0.5 + deg_offset, 0.0, edge_middle_coordinates[0]);
1057 LLtoXYZ_deg(0.0 + deg_offset, 0.5, edge_middle_coordinates[1]);
1058 LLtoXYZ_deg(1.0 + deg_offset, 0.5, edge_middle_coordinates[2]);
1059 LLtoXYZ_deg(0.5 + deg_offset, 1.0, edge_middle_coordinates[3]);
1060 LLtoXYZ_deg(0.0 + deg_offset, 1.5, edge_middle_coordinates[4]);
1061 LLtoXYZ_deg(1.0 + deg_offset, 1.5, edge_middle_coordinates[5]);
1062 LLtoXYZ_deg(0.5 + deg_offset, 2.0, edge_middle_coordinates[6]);
1064 grid, YAC_LOC_EDGE, edge_middle_coordinates);
1065
1066 int is_fatal = 0;
1067
1068 if (yac_basic_grid_check_coordinates(grid, is_fatal) != 1)
1069 PUT_ERR("ERROR in yac_basic_grid_check_coordinates");
1070
1071 // cleanup
1073 }
1074
1075 { // test yac_basic_grid_check_coordinates with a regular grid containg
1076 // the north pole (results in one edge having a length of 0)
1077
1078 size_t nbr_vertices[2] = {2,3};
1079 int cyclic[2] = {0,0};
1080 double lon_vertices[] = {0,1};
1081 double lat_vertices[] = {88,89,90};
1082
1085 nbr_vertices, cyclic, lon_vertices, lat_vertices);
1086
1087 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
1088
1089 // add edge middle point coordinates for all edges
1090 yac_coordinate_pointer edge_middle_coordinates =
1091 malloc(7 * sizeof(*edge_middle_coordinates));
1092 LLtoXYZ_deg(0.5, 88.0, edge_middle_coordinates[0]);
1093 LLtoXYZ_deg(0.0, 88.5, edge_middle_coordinates[1]);
1094 LLtoXYZ_deg(1.0, 88.5, edge_middle_coordinates[2]);
1095 LLtoXYZ_deg(0.5, 89.0, edge_middle_coordinates[3]);
1096 LLtoXYZ_deg(0.0, 89.5, edge_middle_coordinates[4]);
1097 LLtoXYZ_deg(1.0, 89.5, edge_middle_coordinates[5]);
1098 LLtoXYZ_deg(0.5, 90.0, edge_middle_coordinates[6]);
1100 grid, YAC_LOC_EDGE, edge_middle_coordinates);
1101
1102 int is_fatal = 1;
1103
1104 if (yac_basic_grid_check_coordinates(grid, is_fatal) != 0)
1105 PUT_ERR("ERROR in yac_basic_grid_check_coordinates");
1106 }
1107
1108 return TEST_EXIT_CODE;
1109}
1110
1111static void utest_check_basic_grid(
1112 struct yac_basic_grid * grid, char const * ref_grid_name,
1113 struct yac_basic_grid_data ref_grid_data,
1114 int const * const * ref_core_masks,
1115 size_t const * ref_grid_data_sizes) {
1116
1117 // yac_basic_grid_get_name
1118 if (strcmp(ref_grid_name, yac_basic_grid_get_name(grid)))
1119 PUT_ERR("ERROR in yac_basic_grid_get_name");
1120
1121 // yac_basic_grid_get_data
1122 utest_check_basic_grid_data(
1123 ref_grid_data, *yac_basic_grid_get_data(grid), ref_grid_name);
1124
1125 for (size_t loc_idx = 0; loc_idx < NUM_LOCACTIONS; ++loc_idx) {
1126
1127 // yac_basic_grid_get_core_mask
1128 if (ref_core_masks[loc_idx] !=
1130 PUT_ERR("ERROR in yac_basic_grid_get_core_mask");
1131
1132 // yac_basic_grid_get_data_size
1133 if (ref_grid_data_sizes[loc_idx] !=
1135 PUT_ERR("ERROR in yac_basic_grid_get_data_size");
1136 }
1137
1138 size_t num_cells = ref_grid_data.num_cells;
1139 double * cell_areas = malloc(num_cells * sizeof(*cell_areas));
1140 for (size_t i = 0; i < num_cells; ++i) cell_areas[i] = DBL_MAX;
1141 yac_basic_grid_compute_cell_areas(grid, cell_areas);
1142 for (size_t i = 0; i < num_cells; ++i)
1143 if (cell_areas[i] == DBL_MAX)
1144 PUT_ERR("ERROR in yac_basic_grid_compute_cell_areas");
1145 free(cell_areas);
1146}
1147
1148static void utest_check_interp_field(
1149 struct yac_basic_grid * grid, struct yac_interp_field field,
1150 yac_const_coordinate_pointer ref_coords, int const * ref_mask) {
1151
1152 size_t data_size = yac_basic_grid_get_data_size(grid, field.location);
1153
1156
1157 if ((ref_coords == NULL) != (coords == NULL))
1158 PUT_ERR("ERROR in yac_basic_grid_get_field_coordinates");
1159
1160 if (ref_coords != NULL)
1161 for (size_t i = 0; i < data_size; ++i)
1162 if (get_vector_angle(ref_coords[i], coords[i]) > yac_angle_tol)
1163 PUT_ERR("ERROR in yac_basic_grid_get_field_coordinates");
1164
1165 int const * mask =
1166 yac_basic_grid_get_field_mask(grid, field);
1167
1168 if ((ref_mask == NULL) != (mask == NULL))
1169 PUT_ERR("ERROR in yac_basic_grid_get_field_mask");
1170
1171 if (ref_mask != NULL)
1172 for (size_t i = 0; i < data_size; ++i)
1173 if (ref_mask[i] != mask[i])
1174 PUT_ERR("ERROR in yac_basic_grid_get_field_mask");
1175}
struct yac_basic_grid * yac_basic_grid_unstruct_edge_new(char const *name, 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)
Definition basic_grid.c:396
struct yac_basic_grid * yac_basic_grid_unstruct_edge_ll_new(char const *name, 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)
Definition basic_grid.c:422
struct yac_field_data * yac_basic_grid_get_field_data(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:287
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:120
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:57
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:311
struct yac_basic_grid * yac_basic_grid_reg_2d_rot_deg_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pole_lon, double north_pole_lat)
Definition basic_grid.c:479
struct yac_basic_grid * yac_basic_grid_cloud_new(char const *name, size_t nbr_points, double *x_points, double *y_points)
Definition basic_grid.c:448
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:357
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:344
yac_const_coordinate_pointer yac_basic_grid_get_field_coordinates(struct yac_basic_grid *grid, struct yac_interp_field field)
Definition basic_grid.c:86
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:137
struct yac_basic_grid * yac_basic_grid_cloud_deg_new(char const *name, size_t nbr_points, double *x_points, double *y_points)
Definition basic_grid.c:457
struct yac_basic_grid * yac_basic_grid_unstruct_edge_deg_new(char const *name, 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)
Definition basic_grid.c:409
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:266
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:300
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:370
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:202
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:130
void yac_basic_grid_compute_cell_areas(struct yac_basic_grid *grid, double *cell_areas)
struct yac_basic_grid * yac_basic_grid_reg_2d_rot_new(char const *name, size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pole_lon, double north_pole_lat)
Definition basic_grid.c:466
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:222
int yac_basic_grid_check_coordinates(struct yac_basic_grid *grid, int fatal)
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:145
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:383
int const * yac_basic_grid_get_core_mask(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:104
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
Definition basic_grid.c:70
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:77
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:322
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:333
struct yac_basic_grid * yac_basic_grid_unstruct_edge_ll_deg_new(char const *name, 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)
Definition basic_grid.c:435
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:62
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_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)
struct yac_basic_grid_data yac_generate_basic_grid_data_cloud(size_t nbr_points, double *x_points, double *y_points)
Definition grid_cloud.c:50
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_reg_2d_rot_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pole_lon, double north_pole_lat)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_rot(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pole_lon, double north_pole_lat)
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)
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_cloud_deg(size_t nbr_points, double *x_points, double *y_points)
Definition grid_cloud.c:58
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:71
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)
#define YAC_RAD
size_t yac_field_data_get_coordinates_count(struct yac_field_data *field_data)
Definition field_data.c:86
yac_const_coordinate_pointer yac_field_data_get_coordinates_data(struct yac_field_data *field_data, size_t coordinates_idx)
Definition field_data.c:91
int const * yac_field_data_get_mask_data(struct yac_field_data *field_data, size_t mask_idx)
Definition field_data.c:62
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
Definition geometry.h:278
#define yac_angle_tol
Definition geometry.h:26
static double get_vector_angle(double const a[3], double const b[3])
Definition geometry.h:472
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
yac_size_t_2_pointer edge_to_vertex
enum yac_location location
Definition basic_grid.h:16
@ NUM_LOCACTIONS
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_mask_nocpy_f2c(struct yac_basic_grid *grid, int location, int const *mask, char const *mask_name)
Definition basic_grid.c:257
size_t yac_basic_grid_add_coordinates_f2c(struct yac_basic_grid *grid, int location, double *coordinates, size_t count)
Definition basic_grid.c:234
size_t yac_basic_grid_add_coordinates_nocpy_f2c(struct yac_basic_grid *grid, int location, double *coordinates)
Definition basic_grid.c:214
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:278
static enum yac_location locations[]
#define TO_POINTER(a)
Definition test_common.h:14
int * cell_to_vertex
int * cell_mask
size_t num_cells[2]
unsigned cyclic[2]
static int mask[16]
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10
int const * location
double const (* yac_const_coordinate_pointer)[3]
Definition yac_types.h:22
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:21