YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_interp_grid_parallel.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 <stdlib.h>
6#include <string.h>
7#include <float.h>
8
9#include <mpi.h>
10#include <yaxt.h>
11#include <netcdf.h>
12
13#include "tests.h"
14#include "test_common.h"
15#include "geometry.h"
16#include "read_icon_grid.h"
18#include "dist_grid_utils.h"
19#include "yac_mpi.h"
20
26static int utest_check_global_ids(
27 yac_int * global_ids, int count, int ref_global_count, MPI_Comm comm);
28static int utest_compare_global_ids(
29 yac_int * global_ids, yac_int * ref_global_ids, size_t count);
30
31int main(int argc, char** argv) {
32
33 MPI_Init(NULL, NULL);
34
35 xt_initialize(MPI_COMM_WORLD);
36
37 int comm_rank, comm_size;
38 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
39 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
40
41 set_even_io_rank_list(MPI_COMM_WORLD);
42
43 { // general test using ICON grid files
44
45 if (argc != 2) {
46 PUT_ERR("ERROR: missing grid file directory");
47 xt_finalize();
48 MPI_Finalize();
49 return TEST_EXIT_CODE;
50 }
51
52 char * filenames[2];
53 char * grid_filenames[] =
54 {"icon_grid_0030_R02B03_G.nc", "icon_grid_0043_R02B04_G.nc"};
55 for (int i = 0; i < 2; ++i)
56 filenames[i] =
57 strcat(
58 strcpy(
59 malloc(strlen(argv[1]) + strlen(grid_filenames[i]) + 2), argv[1]),
60 grid_filenames[i]);
61
63 char const * grid_names[2] = {"R02B02", "R02B03"};
64
65 for (int i = 0; i < 2; ++i)
66 grid_data[i] =
68 filenames[i], MPI_COMM_WORLD);
69
70 struct yac_basic_grid * grids[2] =
73
74 struct yac_dist_grid_pair * grid_pair =
75 yac_dist_grid_pair_new(grids[0], grids[1], MPI_COMM_WORLD);
76
77 struct yac_interp_field src_fields[] =
78 {{.location = YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
79 size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
81 {.location = YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
82
83 struct yac_interp_grid * interp_grid =
86
87 if (strcmp(
89 PUT_ERR("error in yac_interp_grid_get_src_grid_name");
90
91 if (strcmp(
93 PUT_ERR("error in yac_interp_grid_get_tgt_grid_name");
94
95 if (yac_interp_grid_get_num_src_fields(interp_grid) != 1)
96 PUT_ERR("error in yac_interp_grid_get_num_src_fields");
97
98 if (yac_interp_grid_get_src_field_location(interp_grid, 0) !=
100 PUT_ERR("error in yac_interp_grid_get_src_field_location");
101
102 yac_interp_grid_delete(interp_grid);
104
105 for (int i = 0; i < 2; ++i) {
107 free(filenames[i]);
108 }
109 }
110
111 if (comm_size >= 4) { // test with artificial grids
112
113 // we only need 4 processes
114 int do_test = comm_rank < 4;
115 MPI_Comm comm;
116 MPI_Comm_split(MPI_COMM_WORLD, do_test, 0, &comm);
117 int comm_rank, comm_size;
118 MPI_Comm_rank(comm, &comm_rank);
119 MPI_Comm_size(comm, &comm_size);
120
121 if (do_test) {
122
123 {
124
125 int is_tgt = comm_rank >= 2;
126
127 double coordinates_x[2][5] = {{0.0,1.0,2.0,3.0,4.0}, {0.5,1.5,2.5,3.5,-1.0}};
128 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0}, {0.5,1.5,2.5,-1.0}};
129 size_t num_cells[2][2] = {{4,3},{3,2}};
130 size_t local_start[4][2] = {{0,0},{2,0},{0,0},{2,0}};
131 size_t local_count[4][2] = {{2,3},{2,3},{2,2},{1,2}};
132 int with_halo = 0;
133 for (int i = 0; i < 2; ++i){
134 for (int j = 0; j < 5; ++j) coordinates_x[i][j] *= YAC_RAD;
135 for (int j = 0; j < 4; ++j) coordinates_y[i][j] *= YAC_RAD;
136 }
137
140 coordinates_x[is_tgt], coordinates_y[is_tgt], num_cells[is_tgt],
141 local_start[comm_rank], local_count[comm_rank], with_halo);
142
143 char const * grid_names[2] = {"src_grid", "tgt_grid"};
144 struct yac_basic_grid * grids[] =
147
148 struct yac_dist_grid_pair * grid_pair =
150
151 struct yac_interp_field src_fields[] =
152 {{.location = YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
153 {.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
154 {.location = YAC_LOC_EDGE, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
155 size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
157 {.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
158
159 struct yac_interp_grid * interp_grid =
162
163 // check
164
165 size_t * tgt_indices, tgt_count;
166 yac_interp_grid_get_tgt_points(interp_grid, &tgt_indices, &tgt_count);
167
168 yac_int tgt_global_ids[12];
170 interp_grid, tgt_indices, tgt_count, tgt_global_ids);
171
172 double tgt_coordinates[12][3];
174 interp_grid, tgt_indices, tgt_count, tgt_coordinates);
175
176 {
177 int count_ = (int)tgt_count, counts[4], displs[4];
178 MPI_Allgather(&count_, 1, MPI_INT, counts, 1, MPI_INT, comm);
179 for (int i = 0, accu = 0; i < comm_size; accu += counts[i++])
180 displs[i] = accu;
181
182 int global_count = 0;
183 for (int i = 0; i < comm_size; ++i) global_count += counts[i];
184 if (global_count != 12)
185 PUT_ERR("error in yac_interp_grid_get_tgt_points");
186
187 yac_int all_tgt_global_ids[12];
188 MPI_Gatherv(
189 tgt_global_ids, count_, yac_int_dt, all_tgt_global_ids,
190 counts, displs, yac_int_dt, 0, comm);
191 double all_tgt_coordinates[12][3];
192 for (int i = 0; i < comm_size; ++i) counts[i] *= 3;
193 for (int i = 0; i < comm_size; ++i) displs[i] *= 3;
194 MPI_Gatherv(
195 tgt_coordinates, 3*count_, MPI_DOUBLE, all_tgt_coordinates,
196 counts, displs, MPI_DOUBLE, 0, comm);
197
198 if (comm_rank == 0) {
199 double ref_tgt_coords[12][3];
200 for (size_t i = 0, k = 0; i < num_cells[1][1]+1; ++i)
201 for (size_t j = 0; j < num_cells[1][0]+1; ++j, ++k)
202 LLtoXYZ(
203 coordinates_x[1][j], coordinates_y[1][i],
204 &(ref_tgt_coords[k][0]));
205 for (yac_int i = 0; i < 12; ++i) {
206 if ((all_tgt_global_ids[i] >= 12) || (all_tgt_global_ids[i] < 0))
207 PUT_ERR("error in yac_interp_grid_get_tgt_points");
208 if (get_vector_angle(ref_tgt_coords[all_tgt_global_ids[i]],
209 all_tgt_coordinates[i]) > yac_angle_tol)
210 PUT_ERR("error in yac_interp_grid_get_tgt_points");
211 }
212 }
213 }
214
215 size_t ref_global_count[3] = {12, 20, 31};
216 for (size_t src_field_idx = 0; src_field_idx < 3; ++src_field_idx) {
217
219 interp_grid, src_field_idx) != src_fields[src_field_idx].location)
220 PUT_ERR("error in yac_interp_grid_get_src_field_location");
221
222 size_t * src_indices, src_count;
224 interp_grid, src_field_idx, &src_indices, &src_count);
225
226 yac_int src_global_ids[31];
228 interp_grid, src_indices, src_count, src_field_idx, src_global_ids);
229
230 if (utest_check_global_ids(
231 src_global_ids, src_count, ref_global_count[src_field_idx], comm))
232 PUT_ERR("error in yac_interp_grid_get_src_points or "
233 "yac_interp_grid_get_src_global_ids");
234 free(src_indices);
235 }
236
237 {
238 double search_coords[15][3];
239 for (size_t i = 0, k = 0; i < num_cells[1][1]+1; ++i)
240 for (size_t j = 0; j < num_cells[1][0]+1; ++j, ++k)
241 LLtoXYZ(
242 coordinates_x[1][j], coordinates_y[1][i], &(search_coords[k][0]));
243 LLtoXYZ(4.5*YAC_RAD, 0.5*YAC_RAD, &(search_coords[12][0]));
244 LLtoXYZ(4.5*YAC_RAD, 1.5*YAC_RAD, &(search_coords[13][0]));
245 LLtoXYZ(4.5*YAC_RAD, 2.5*YAC_RAD, &(search_coords[14][0]));
246
247 // test yac_interp_grid_do_points_search
248 size_t src_cells[15];
250 interp_grid, search_coords, 15, src_cells);
251
252 struct yac_grid_cell cell;
253 yac_init_grid_cell(&cell);
254
255 struct yac_const_basic_grid_data * src_grid_data =
257
258 // check search results
259 for (size_t i = 0; i < 15; ++i) {
260
261 size_t curr_src_cell = src_cells[i];
262 if (curr_src_cell != SIZE_MAX) {
264 src_grid_data, curr_src_cell, &cell);
265 if (!yac_point_in_cell(search_coords[i], cell))
266 PUT_ERR("error in yac_interp_grid_do_points_search");
267 }
268 }
269
270 yac_free_grid_cell(&cell);
271 }
272
273 {
274 double a[3], b[3];
275 struct bounding_circle bnd_circles[5];
276 size_t count = sizeof(bnd_circles) / sizeof(bnd_circles[0]);
277
278 LLtoXYZ_deg(0.0, 0.0, a);
279 LLtoXYZ_deg(0.4, 0.4, b);
280 LLtoXYZ_deg(0.0, 0.0, bnd_circles[0].base_vector);
281 bnd_circles[0].inc_angle = get_vector_angle_2(a, b);
282 bnd_circles[0].sq_crd = DBL_MAX;
283
284 LLtoXYZ_deg(0.0, 0.0, a);
285 LLtoXYZ_deg(0.0, 0.9, b);
286 LLtoXYZ_deg(0.0, 0.0, bnd_circles[1].base_vector);
287 bnd_circles[1].inc_angle = get_vector_angle_2(a, b);
288 bnd_circles[1].sq_crd = DBL_MAX;
289
290 LLtoXYZ_deg(-1.0, -1.0, a);
291 LLtoXYZ_deg(-0.9, -0.0, b);
292 LLtoXYZ_deg(-1.0, -1.0, bnd_circles[2].base_vector);
293 bnd_circles[2].inc_angle = get_vector_angle_2(a, b);
294 bnd_circles[2].sq_crd = DBL_MAX;
295
296 LLtoXYZ_deg(2.0, 1.5, a);
297 LLtoXYZ_deg(4.0, 3.0, b);
298 LLtoXYZ_deg(2.0, 1.5, bnd_circles[3].base_vector);
299 bnd_circles[3].inc_angle = get_vector_angle_2(a, b);
300 bnd_circles[3].sq_crd = DBL_MAX;
301
302 LLtoXYZ_deg(2.0, 1.5, a);
303 LLtoXYZ_deg(2.1, 1.5, b);
304 LLtoXYZ_deg(2.0, 1.5, bnd_circles[4].base_vector);
305 bnd_circles[4].inc_angle = get_vector_angle_2(a, b);
306 bnd_circles[4].sq_crd = DBL_MAX;
307
308 size_t ref_num_src_per_bnd_circle[] = {1, 3, 0, 12, 2};
309 yac_int ref_src_cell_global_ids[] =
310 {0, 0,1,4, 0,1,2,3,4,5,6,7,8,9,10,11, 5,6};
311
312 size_t * cells, num_cells_per_bnd_circle[count];
313
315 interp_grid, bnd_circles, count, 0,
316 &cells, num_cells_per_bnd_circle);
317
318 for (size_t i = 0, displ = 0; i < count; ++i) {
319 if (num_cells_per_bnd_circle[i] != ref_num_src_per_bnd_circle[i]) {
320 PUT_ERR("error in yac_interp_grid_do_bnd_circle_search_src");
321 } else {
322 yac_int src_cell_global_ids[20];
324 interp_grid, cells + displ, num_cells_per_bnd_circle[i], 0,
325 src_cell_global_ids);
326 if (utest_compare_global_ids(
327 src_cell_global_ids, ref_src_cell_global_ids + displ,
328 num_cells_per_bnd_circle[i]))
329 PUT_ERR("error in yac_interp_grid_do_bnd_circle_search_src");
330 }
331 displ += num_cells_per_bnd_circle[i];
332 }
333 free(cells);
334 }
335
336 {
337 size_t * tgt_cells, num_tgt_cells_per_corner[12];
339 interp_grid, tgt_indices, tgt_count,
340 &tgt_cells, num_tgt_cells_per_corner);
341
342 yac_int const * tgt_global_corner_ids =
344 interp_grid)->ids[YAC_LOC_CORNER];
345 yac_int const * tgt_global_cell_ids =
347 interp_grid)->ids[YAC_LOC_CELL];
348
349 yac_int ref_tgt_corner_cells[12][4] =
350 {{0}, {0,1}, {1,2}, {2},
351 {0,3}, {0,1,3,4}, {1,2,4,5}, {2,5},
352 {3}, {3,4}, {4,5}, {5}};
353 size_t ref_num_tgt_cells_per_corner[12] =
354 {1,2,2,1, 2,4,4,2, 1,2,2,1};
355
356 for (size_t i = 0, k = 0; i < tgt_count; ++i) {
357 if (ref_num_tgt_cells_per_corner[
358 tgt_global_corner_ids[tgt_indices[i]]] !=
359 num_tgt_cells_per_corner[i])
360 PUT_ERR("ERROR in yac_interp_grid_get_tgt_corner_cells");
361
362 for (size_t j = 0; j < num_tgt_cells_per_corner[i]; ++j, ++k)
363 if (ref_tgt_corner_cells[
364 tgt_global_corner_ids[tgt_indices[i]]][j] !=
365 tgt_global_cell_ids[tgt_cells[k]])
366 PUT_ERR("ERROR in yac_interp_grid_get_tgt_corner_cells");
367 }
368
369 free(tgt_cells);
370 }
371
372 {
373 for (size_t src_field_idx = 0; src_field_idx < 3; ++src_field_idx) {
374
376 interp_grid, src_field_idx) != YAC_LOC_CORNER) continue;
377
378 size_t * src_indices, src_count;
380 interp_grid, src_field_idx, &src_indices, &src_count);
381
382 yac_int src_global_ids[31];
384 interp_grid, src_indices, src_count, src_field_idx, src_global_ids);
385
386 size_t * src_cells, num_src_cells_per_corner[12];
388 interp_grid, src_indices, src_count,
389 &src_cells, num_src_cells_per_corner);
390
391 yac_int const * src_global_corner_ids =
393 interp_grid)->ids[YAC_LOC_CORNER];
394 yac_int const * src_global_cell_ids =
396 interp_grid)->ids[YAC_LOC_CELL];
397
398 yac_int ref_src_corner_cells[20][4] =
399 {{0}, {0,1}, {1,2}, {2,3}, {3},
400 {0,4}, {0,1,4,5}, {1,2,5,6}, {2,3,6,7}, {3,7},
401 {4,8}, {4,5,8,9}, {5,6,9,10}, {6,7,10,11}, {7,11},
402 {8}, {8,9}, {9,10}, {10,11}, {11}};
403 size_t ref_num_src_cells_per_corner[20] =
404 {1,2,2,2,1, 2,4,4,4,2, 2,4,4,4,2, 1,2,2,2,1};
405
406 for (size_t i = 0, k = 0; i < src_count; ++i) {
407 if (ref_num_src_cells_per_corner[
408 src_global_corner_ids[src_indices[i]]] !=
409 num_src_cells_per_corner[i])
410 PUT_ERR("ERROR in yac_interp_grid_get_src_corner_cells");
411
412 for (size_t j = 0; j < num_src_cells_per_corner[i]; ++j, ++k)
413 if (ref_src_corner_cells[
414 src_global_corner_ids[src_indices[i]]][j] !=
415 src_global_cell_ids[src_cells[k]])
416 PUT_ERR("ERROR in yac_interp_grid_get_src_corner_cells");
417 }
418
419 free(src_cells);
420 free(src_indices);
421 }
422 }
423
424 free(tgt_indices);
425 yac_interp_grid_delete(interp_grid);
426 yac_dist_grid_pair_delete(grid_pair);
429 }
430
431 { // test yac_interp_grid_relocate_src_tgt_pairs_orig
432
433 for (int to_tgt_owner = 0; to_tgt_owner <= 1; ++to_tgt_owner) {
434
435 int is_tgt = comm_rank >= 2;
436
437 double coordinates_x[2][5] = {{0.0,1.0,2.0,3.0,4.0},
438 {0.5,1.5,2.5,3.5,-1.0}};
439 double coordinates_y[2][4] = {{0.0,1.0,2.0,3.0},
440 {0.5,1.5,2.5,-1.0}};
441 size_t num_cells[2][2] = {{4,3},{3,2}};
442 size_t local_start[4][2] = {{0,0},{2,0},{0,0},{2,0}};
443 size_t local_count[4][2] = {{2,3},{2,3},{2,2},{1,2}};
444 int with_halo = 0;
445 for (int i = 0; i < 2; ++i){
446 for (int j = 0; j < 5; ++j) coordinates_x[i][j] *= YAC_RAD;
447 for (int j = 0; j < 4; ++j) coordinates_y[i][j] *= YAC_RAD;
448 }
449
452 coordinates_x[is_tgt], coordinates_y[is_tgt], num_cells[is_tgt],
453 local_start[comm_rank], local_count[comm_rank], with_halo);
454
455 char const * grid_names[2] = {"src_grid", "tgt_grid"};
456 struct yac_basic_grid * grids[] =
459
460 if (!is_tgt) {
461
462 yac_coordinate_pointer src_cell_coordinates =
463 malloc(grid_data.num_cells * sizeof(*src_cell_coordinates));
464 for (size_t i = 0; i < grid_data.num_cells; ++i) {
465 for (int j = 0; j < 3; ++j) src_cell_coordinates[i][j] = 0.0;
466 size_t * cell_vertices =
467 grid_data.cell_to_vertex + grid_data.cell_to_vertex_offsets[i];
468 for (int j = 0; j < grid_data.num_vertices_per_cell[i]; ++j)
469 for (int k = 0; k < 3; ++k)
470 src_cell_coordinates[i][k] +=
471 grid_data.vertex_coordinates[cell_vertices[j]][k];
472 normalise_vector(src_cell_coordinates[i]);
473 }
474
476 grids[0], YAC_LOC_CELL, src_cell_coordinates, grid_data.num_cells);
477 free(src_cell_coordinates);
478 }
479
480 struct yac_dist_grid_pair * grid_pair =
482
483 struct yac_interp_field src_fields[] =
484 {{.location = YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
485 size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
487 {.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX,
488 .masks_idx = SIZE_MAX};
489
490 struct yac_interp_grid * interp_grid =
493
494 // get local tgt indices
495 size_t * tgt_points, tgt_count;
496 yac_interp_grid_get_tgt_points(interp_grid, &tgt_points, &tgt_count);
497
498 // get local global tgt ids
499 yac_int tgt_global_ids[12];
501 interp_grid, tgt_points, tgt_count, tgt_global_ids);
502
503 // get local tgt coordinates
504 yac_coordinate_pointer tgt_coordinates =
505 malloc(tgt_count * sizeof(*tgt_coordinates));
507 interp_grid, tgt_points, tgt_count, tgt_coordinates);
508
509 // get matching source cells for each local tgt point
510 size_t * src_points = malloc(tgt_count * sizeof(*src_points));
512 interp_grid, tgt_coordinates, tgt_count, 1, src_points, M_PI);
513 free(tgt_coordinates);
514
515 // generate dummy weights
516 double * weights = malloc(tgt_count * sizeof(*weights));
517 for (size_t i = 0; i < tgt_count; ++i)
518 weights[i] = (double)tgt_global_ids[i];
519
520 // relocate target and matching source points to original owners
522 interp_grid, to_tgt_owner, YAC_LOC_CELL, &src_points,
523 &tgt_points, &weights, &tgt_count);
524
525 // sort src points, tgt points and weights
526 yac_int src_global_ids[12];
528 interp_grid, src_points, tgt_count, 0, src_global_ids);
530 interp_grid, tgt_points, tgt_count, tgt_global_ids);
532 tgt_global_ids, tgt_count, src_global_ids, weights);
533
534 // check results
535 size_t ref_num_points[2][4] = {{6,6,0,0},{0,0,9,3}};
536 yac_int ref_global_ids[2][4][9] =
537 {{{0,1,4,5,8,9},{2,3,6,7,10,11},{-1},{-1}},
538 {{-1},{-1},{0,1,2,4,5,6,8,9,10},{3,7,11}}};
539 if (tgt_count != ref_num_points[to_tgt_owner][comm_rank])
540 PUT_ERR(
541 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
542 for (size_t i = 0; i < tgt_count; ++i) {
543 if (src_global_ids[i] != ref_global_ids[to_tgt_owner][comm_rank][i])
544 PUT_ERR(
545 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
546 if (tgt_global_ids[i] != ref_global_ids[to_tgt_owner][comm_rank][i])
547 PUT_ERR(
548 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
549 if (weights[i] != (double)ref_global_ids[to_tgt_owner][comm_rank][i])
550 PUT_ERR(
551 "error in yac_interp_grid_relocate_src_tgt_pairs_orig");
552 }
553
554 free(tgt_points);
555 free(weights);
556 free(src_points);
557 yac_interp_grid_delete(interp_grid);
561 }
562 }
563 }
564
565 MPI_Comm_free(&comm);
566
567 } else {
568 PUT_ERR("insufficient number of processes");
569 }
570
571 xt_finalize();
572
573 MPI_Finalize();
574
575 return TEST_EXIT_CODE;
576}
577
578static int utest_check_global_ids(
579 yac_int * global_ids, int count, int ref_global_count, MPI_Comm comm) {
580
581 int error_count = 0;
582
583 int comm_rank, comm_size;
584 MPI_Comm_rank(comm, &comm_rank);
585 MPI_Comm_size(comm, &comm_size);
586
587 int * counts = xmalloc((size_t)comm_size * sizeof(*counts));
588 int * displs = xmalloc((size_t)comm_size * sizeof(*displs));
589 MPI_Allgather(&count, 1, MPI_INT, counts, 1, MPI_INT, comm);
590 for (int i = 0, accu = 0; i < comm_size; accu += counts[i++])
591 displs[i] = accu;
592
593 int global_count = 0;
594 for (int i = 0; i < comm_size; ++i) global_count += counts[i];
595
596 yac_int * all_global_ids =
597 (comm_rank == 0)?
598 xmalloc((size_t)global_count * sizeof(*all_global_ids)):
599 NULL;
600 MPI_Gatherv(
601 global_ids, count, yac_int_dt, all_global_ids,
602 counts, displs, yac_int_dt, 0, comm);
603
604 if (comm_rank == 0) {
605 int * flag = xcalloc((size_t)ref_global_count, sizeof(*flag));
606 int flag_count = 0;
607 for (int i = 0; i < global_count; ++i) {
608 if ((all_global_ids[i] >= ref_global_count) ||
609 (all_global_ids[i] < 0)) {
610 ++error_count;
611 } else {
612 if (!flag[all_global_ids[i]]) ++flag_count;
613 flag[all_global_ids[i]] = 1;
614 }
615 }
616 if (flag_count != ref_global_count) ++error_count;
617 free(flag);
618 }
619
620 free(all_global_ids);
621 free(displs);
622 free(counts);
623
624 return error_count;
625}
626
627static int utest_compare_global_ids(
628 yac_int * global_ids, yac_int * ref_global_ids, size_t count) {
629
630 size_t match_count = 0;
631 for (size_t i = 0; i < count; ++i)
632 for (size_t j = 0; j < count; ++j)
633 if (global_ids[i] == ref_global_ids[j]) ++match_count;
634 return match_count != count;
635}
char const * grid_names[]
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:50
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:232
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
Definition basic_grid.c:63
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:70
int yac_point_in_cell(double point_coords[3], struct yac_grid_cell cell)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
Definition dist_grid.c:2313
struct yac_dist_grid_pair * yac_dist_grid_pair_new(struct yac_basic_grid *grid_a, struct yac_basic_grid *grid_b, MPI_Comm comm)
Definition dist_grid.c:2061
void yac_const_basic_grid_data_get_grid_cell(struct yac_const_basic_grid_data *grid_data, size_t cell_idx, struct yac_grid_cell *buffer_cell)
Definition dist_grid.c:2354
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d(double const *global_coords_x, double const *global_coords_y, size_t const num_global_cells_[2], size_t const local_start[2], size_t const local_count[2], int with_halo)
#define YAC_RAD
static struct sin_cos_angle get_vector_angle_2(double const a[3], double const b[3])
Definition geometry.h:361
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
Definition geometry.h:269
#define yac_angle_tol
Definition geometry.h:26
static void normalise_vector(double v[])
Definition geometry.h:635
static double get_vector_angle(double const a[3], double const b[3])
Definition geometry.h:340
void yac_init_grid_cell(struct yac_grid_cell *cell)
Definition grid_cell.c:14
void yac_free_grid_cell(struct yac_grid_cell *cell)
Definition grid_cell.c:44
void yac_interp_grid_do_points_search(struct yac_interp_grid *interp_grid, yac_coordinate_pointer search_coords, size_t count, size_t *src_cells)
size_t yac_interp_grid_get_num_src_fields(struct yac_interp_grid *interp_grid)
char const * yac_interp_grid_get_src_grid_name(struct yac_interp_grid *interp_grid)
Definition interp_grid.c:77
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
void yac_interp_grid_get_tgt_points(struct yac_interp_grid *interp_grid, size_t **tgt_indices, size_t *count)
Definition interp_grid.c:99
char const * yac_interp_grid_get_tgt_grid_name(struct yac_interp_grid *interp_grid)
Definition interp_grid.c:82
void yac_interp_grid_get_tgt_global_ids(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, yac_int *tgt_global_ids)
struct yac_interp_grid * yac_interp_grid_new(struct yac_dist_grid_pair *grid_pair, char const *src_grid_name, char const *tgt_grid_name, size_t num_src_fields, struct yac_interp_field const *src_fields, struct yac_interp_field const tgt_field)
Definition interp_grid.c:31
void yac_interp_grid_do_bnd_circle_search_src(struct yac_interp_grid *interp_grid, const_bounding_circle_pointer bnd_circles, size_t count, size_t src_field_idx, size_t **src_cells, size_t *num_src_per_bnd_circle)
void yac_interp_grid_get_tgt_corner_cells(struct yac_interp_grid *interp_grid, size_t *tgt_corners, size_t count, size_t **tgt_cells, size_t *num_cells_per_corner)
void yac_interp_grid_get_src_points(struct yac_interp_grid *interp_grid, size_t src_field_idx, size_t **src_indices, size_t *count)
Definition interp_grid.c:87
enum yac_location yac_interp_grid_get_src_field_location(struct yac_interp_grid *interp_grid, size_t src_field_idx)
void yac_interp_grid_do_nnn_search_src(struct yac_interp_grid *interp_grid, yac_coordinate_pointer search_coords, size_t count, size_t n, size_t *src_points, double max_search_distance)
void yac_interp_grid_get_src_corner_cells(struct yac_interp_grid *interp_grid, size_t *src_corners, size_t count, size_t **src_cells, size_t *num_cells_per_corner)
void yac_interp_grid_get_tgt_coordinates(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, yac_coordinate_pointer tgt_coordinates)
struct yac_const_basic_grid_data * yac_interp_grid_get_basic_grid_data_tgt(struct yac_interp_grid *interp_grid)
void yac_interp_grid_get_src_global_ids(struct yac_interp_grid *interp_grid, size_t *src_points, size_t count, size_t src_field_idx, yac_int *src_global_ids)
void yac_interp_grid_relocate_src_tgt_pairs_orig(struct yac_interp_grid *interp_grid, int to_tgt_owner, enum yac_location src_location, size_t **src_points, size_t **tgt_points, double **weights, size_t *count)
struct yac_const_basic_grid_data * yac_interp_grid_get_basic_grid_data_src(struct yac_interp_grid *interp_grid)
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_EDGE
Definition location.h:16
@ YAC_LOC_CELL
Definition location.h:14
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_basic_grid_data yac_read_icon_basic_grid_data_parallel(const char *filename, MPI_Comm comm)
double base_vector[3]
Definition geometry.h:51
const const_yac_int_pointer ids[3]
enum yac_location location
Definition basic_grid.h:16
struct yac_interp_field tgt_field
Definition interp_grid.c:26
size_t num_src_fields
Definition interp_grid.c:27
struct yac_dist_grid_pair * grid_pair
Definition interp_grid.c:25
struct yac_interp_field src_fields[]
Definition interp_grid.c:28
void set_even_io_rank_list(MPI_Comm comm)
double coordinates_x[]
size_t num_cells[2]
double coordinates_y[]
#define TEST_EXIT_CODE
Definition tests.h:14
#define PUT_ERR(string)
Definition tests.h:10
int const * location
static void LLtoXYZ(double lon, double lat, double p_out[])
Definition toy_scrip.c:587
void yac_quicksort_index_yac_int_yac_int_double(yac_int *a, size_t n, yac_int *b, double *c)
struct yac_basic_grid ** grids
Definition yac.c:152
YAC_INT yac_int
Definition yac_types.h:15
#define yac_int_dt
Definition yac_types.h:16
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:19