YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_interp_method_callback_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
8#include "tests.h"
9#include "test_common.h"
10#include "geometry.h"
14#include "dist_grid_utils.h"
15#include "yac_mpi.h"
16
17#include <mpi.h>
18#include <yaxt.h>
19
25struct grid_info {
30};
31
32static void utest_test1_callback(
33 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
34 int const ** global_results_points, double ** result_weights,
35 size_t * result_count, void * user_data);
36static void utest_test2_callback(
37 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
38 int const ** global_results_points, double ** result_weights,
39 size_t * result_count, void * user_data);
40static void utest_test3_callback(
41 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
42 int const ** global_results_points, double ** result_weights,
43 size_t * result_count, void * user_data);
44static void utest_test4_callback(
45 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
46 int const ** global_results_points, double ** result_weights,
47 size_t * result_count, void * user_data);
48static char const * grid_names[2] = {"src_grid", "tgt_grid"};
49
50int main(void) {
51
53 yac_yaxt_init(MPI_COMM_WORLD);
54
55 int comm_rank, comm_size;
56 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
57 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
58 MPI_Barrier(MPI_COMM_WORLD);
59
60 if (comm_size != 3) {
61 PUT_ERR("ERROR: wrong number of processes");
62 xt_finalize();
63 MPI_Finalize();
64 return TEST_EXIT_CODE;
65 }
66
67 { // test setting and getting callbacks
68
69 struct {
71 char const * key;
72 int user_data;
73 } callbacks[] =
74 {{.func = utest_test1_callback, .key = "test1", .user_data = 1},
75 {.func = utest_test2_callback, .key = "test2", .user_data = 2},
76 {.func = utest_test3_callback, .key = "test3", .user_data = 3}};
77 enum {NUM_CALLBACKS = sizeof(callbacks) / sizeof(callbacks[0])};
78
79 for (size_t i = 0; i < NUM_CALLBACKS; ++i)
81 callbacks[i].func, (void*)&(callbacks[i].user_data), callbacks[i].key);
82 // add the second key again
84 callbacks[1].func, (void*)&(callbacks[1].user_data), callbacks[1].key);
85
86 for (size_t i = 0; i < NUM_CALLBACKS; ++i) {
87
89 void * user_data;
90
92 callbacks[i].key, &func, &user_data);
93
94 if (func != callbacks[i].func)
95 PUT_ERR(
96 "ERROR in yac_interp_method_callback_get_compute_weights_callback");
97 if (user_data != (void*)&(callbacks[i].user_data))
98 PUT_ERR(
99 "ERROR in yac_interp_method_callback_get_compute_weights_callback");
100 }
101 }
102
103 { // test with two source processes, one target process and two source fields
104 // the global source grid is a 4x2 grid:
105 // 08--14--09--15--10--16--11
106 // | | | |
107 // 08 03 10 04 12 05 13
108 // | | | |
109 // 04--07--05--09--06--11--07
110 // | | | |
111 // 01 00 03 01 05 02 06
112 // | | | |
113 // 00--00--01--02--02--04--03
114 //
115 //---------------
116 // setup
117 //---------------
118
119 int is_tgt = comm_rank == 2;
120 double coordinates_x[2][5] = {{0.0,1.0,2.0,3.0}, {-0.5,0.5,1.5,2.5,3.5}};
121 double coordinates_y[2][4] = {{0.0,1.0,2.0}, {-0.5,0.5,1.5,2.5}};
122 size_t const num_cells[2][2] = {{3,2}, {4,3}};
123 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
124 size_t local_count[2][2][2] = {{{1,2},{2,2}}, {{4,3}}};
125 int with_halo = 0;
126 for (size_t i = 0; i <= num_cells[is_tgt][0]; ++i)
127 coordinates_x[is_tgt][i] *= YAC_RAD;
128 for (size_t i = 0; i <= num_cells[is_tgt][1]; ++i)
129 coordinates_y[is_tgt][i] *= YAC_RAD;
130
132 utest_generate_basic_grid_data_reg2d(
133 coordinates_x[is_tgt], coordinates_y[is_tgt], num_cells[is_tgt],
134 local_start[is_tgt][(is_tgt)?0:comm_rank],
135 local_count[is_tgt][(is_tgt)?0:comm_rank], with_halo);
136
137 yac_int * cell_ids =
138 xmalloc(grid_data.num_cells * sizeof(*cell_ids));
139 memcpy(cell_ids, grid_data.cell_ids,
140 grid_data.num_cells * sizeof(*cell_ids));
141 size_t * cell_to_vertex =
142 xmalloc(4 * grid_data.num_cells * sizeof(*cell_to_vertex));
144 4 * grid_data.num_cells * sizeof(*cell_to_vertex));
146 xmalloc(grid_data.num_vertices * sizeof(*vertex_ids));
147 memcpy(vertex_ids, grid_data.vertex_ids,
148 grid_data.num_vertices * sizeof(*vertex_ids));
149
150 struct yac_basic_grid * grids[2] =
153
154 struct yac_dist_grid_pair * grid_pair =
155 yac_dist_grid_pair_new(grids[0], grids[1], MPI_COMM_WORLD);
156
157 struct yac_interp_field src_fields[] =
158 {{.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX},
159 {.location = YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
160 size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
162 {.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
163
164 struct yac_interp_grid * interp_grid =
167
168 struct grid_info grid_info = {
170 .vertex_ids = vertex_ids,
171 .cell_ids = cell_ids,
172 .num_grid_cells = grid_data.num_cells};
173 yac_func_compute_weights test_functions[] = {utest_test1_callback,
174 utest_test2_callback,
175 utest_test4_callback};
176 enum {
177 NUM_TEST_FUNCTIONS = sizeof(test_functions) / sizeof(test_functions[0])};
179 {(void*)&num_src_fields, (void*)&grid_info, (void*)&grid_info};
180 double ref_tgt_data[NUM_TEST_FUNCTIONS][20] =
181 {{-1.0, -1.0, -1.0, -1.0, -1.0,
182 -1.0, -1.0, -1.0, -1.0, -1.0,
183 -1.0, -1.0, -1.0, -1.0, -1.0,
184 -1.0, -1.0, -1.0, -1.0, -1.0},
185 {-1.0, -1.0, -1.0, -1.0, -1.0,
186 -1.0, 0.5*0+0.125*(0+1+4+5), 0.5*1+0.125*(1+2+5+6), 0.5*2+0.125*(2+3+6+7), -1.0,
187 -1.0, 0.5*3+0.125*(4+5+8+9), 0.5*4+0.125*(5+6+9+10), 0.5*5+0.125*(6+7+10+11), -1.0,
188 -1.0, -1.0, -1.0, -1.0, -1.0},
189 {-1.0, -1.0, -1.0, -1.0, -1.0,
190 -1.0, -1.0, 0.5*1+0.125*(1+2+5+6), -1.0, -1.0,
191 -1.0, 0.5*3+0.125*(4+5+8+9), -1.0, 0.5*5+0.125*(6+7+10+11), -1.0,
192 -1.0, -1.0, -1.0, -1.0, -1.0}};
193 double collection_factor[] = {0.0, 10.0, 10.0};
194
195 for (size_t test_idx = 0; test_idx < NUM_TEST_FUNCTIONS; ++test_idx) {
196
197 struct interp_method * method_stack[] =
199 test_functions[test_idx], user_data[test_idx]),
200 yac_interp_method_fixed_new(-1.0), NULL};
201
202 struct yac_interp_weights * weights =
203 yac_interp_method_do_search(method_stack, interp_grid);
204
205 enum yac_interp_weights_reorder_type reorder_type[2] =
207
208 for (size_t collection_size = 1; collection_size <= 16;
209 collection_size *= 2) {
210
211 for (size_t reorder_idx = 0; reorder_idx < 2; ++reorder_idx) {
212
213 struct yac_interpolation * interpolation =
215 weights, reorder_type[reorder_idx], collection_size,
216 YAC_FRAC_MASK_NO_VALUE, 1.0, 0.0, NULL, 1, 1);
217
218 // check generated interpolation
219 {
220 double *** src_data = NULL;
221 double ** tgt_data = NULL;
222
223 if (is_tgt) {
224 tgt_data = xmalloc(collection_size * sizeof(*tgt_data));
225 for (size_t collection_idx = 0; collection_idx < collection_size;
226 ++collection_idx) {
227 tgt_data[collection_idx] =
228 xmalloc(grid_data.num_vertices * sizeof(**tgt_data));
229 for (size_t i = 0; i < grid_data.num_vertices; ++i)
230 tgt_data[collection_idx][i] = -1337.0;
231 }
232 } else {
233 src_data = xmalloc(collection_size * sizeof(*src_data));
234 for (size_t collection_idx = 0; collection_idx < collection_size;
235 ++collection_idx) {
236 src_data[collection_idx] = xmalloc(2 * sizeof(**src_data));
237 src_data[collection_idx][0] =
238 xmalloc(grid_data.num_vertices * sizeof(***src_data));
239 for (size_t i = 0; i < grid_data.num_vertices; ++i)
240 src_data[collection_idx][0][i] =
241 (double)(vertex_ids[i] + 10 * collection_idx);
242 src_data[collection_idx][1] =
243 xmalloc(grid_data.num_cells * sizeof(***src_data));
244 for (size_t i = 0; i < grid_data.num_cells; ++i)
245 src_data[collection_idx][1][i] =
246 (double)(cell_ids[i] + 10 * collection_idx);
247 }
248 }
249
250 yac_interpolation_execute(interpolation, src_data, tgt_data);
251
252 if (is_tgt) {
253
254 // check results
255 for (size_t collection_idx = 0; collection_idx < collection_size;
256 ++collection_idx) {
257 for (size_t i = 0; i < grid_data.num_vertices; ++i)
258 if (ref_tgt_data[test_idx][vertex_ids[i]] == -1.0) {
259 if (tgt_data[collection_idx][i] != -1.0)
260 PUT_ERR("wrong results");
261 } else {
262 if (fabs(tgt_data[collection_idx][i] -
263 (ref_tgt_data[test_idx][vertex_ids[i]] +
264 (double)collection_idx *
265 collection_factor[test_idx])) > 1e-9)
266 PUT_ERR("wrong results");
267 }
268 }
269
270 for (size_t collection_idx = 0; collection_idx < collection_size;
271 ++collection_idx) free(tgt_data[collection_idx]);
272 free(tgt_data);
273 } else {
274 for (size_t collection_idx = 0; collection_idx < collection_size;
275 ++collection_idx) {
276 for (size_t src_field_idx = 0; src_field_idx < num_src_fields;
277 ++src_field_idx)
278 free(src_data[collection_idx][src_field_idx]);
279 free(src_data[collection_idx]);
280 }
281 free(src_data);
282 }
283 }
284 yac_interpolation_delete(interpolation);
285 }
286 }
287
289 yac_interp_method_delete(method_stack);
290 }
291 yac_interp_grid_delete(interp_grid);
292 yac_dist_grid_pair_delete(grid_pair);
293 yac_basic_grid_delete(grids[1]);
294 yac_basic_grid_delete(grids[0]);
295 free(cell_to_vertex);
296 free(vertex_ids);
297 free(cell_ids);
298 }
299
300 {
301 // All three ranks are source processes. Rank 0 is also a target process.
302 //---------------
303 // setup
304 //---------------
305
306 double src_coordinates_x[51];
307 double src_coordinates_y[51];
308 size_t const src_num_cells[2] = {50,50};
309 size_t src_local_start[3][2] = {{20,10},{20,0},{0,0}};
310 size_t src_local_count[3][2] = {{30,40},{30,10},{20,50}};
311 int with_halo = 0;
312 for (size_t i = 0; i <= src_num_cells[0]; ++i)
313 src_coordinates_x[i] = (double)i * YAC_RAD;
314 for (size_t i = 0; i <= src_num_cells[1]; ++i)
315 src_coordinates_y[i] = (double)i * YAC_RAD;
316
317 struct yac_basic_grid_data src_grid_data =
318 utest_generate_basic_grid_data_reg2d(
319 src_coordinates_x, src_coordinates_y, src_num_cells,
320 src_local_start[comm_rank], src_local_count[comm_rank], with_halo);
321
322 double tgt_coordinates_x[50];
323 double tgt_coordinates_y[50];
324 size_t const tgt_num_cells[2] = {49,49};
325 size_t tgt_local_start[2] = {0,0};
326 size_t tgt_local_count[2] = {49,49};
327 for (size_t i = 0; i <= tgt_num_cells[0]; ++i)
328 tgt_coordinates_x[i] = (0.5 + (double)i) * YAC_RAD;
329 for (size_t i = 0; i <= tgt_num_cells[1]; ++i)
330 tgt_coordinates_y[i] = (0.5 + (double)i) * YAC_RAD;
331
332 struct yac_basic_grid_data tgt_grid_data;
333 if (comm_rank == 0)
334 tgt_grid_data =
335 utest_generate_basic_grid_data_reg2d(
336 tgt_coordinates_x, tgt_coordinates_y, tgt_num_cells,
337 tgt_local_start, tgt_local_count, with_halo);
338
339 struct yac_basic_grid * src_grid =
340 yac_basic_grid_new(grid_names[0], src_grid_data);
341 struct yac_basic_grid * tgt_grid = NULL;
342 if (comm_rank == 0)
343 tgt_grid = yac_basic_grid_new(grid_names[1], tgt_grid_data);
344 else
346
347 struct yac_dist_grid_pair * grid_pair =
348 yac_dist_grid_pair_new(src_grid, tgt_grid, MPI_COMM_WORLD);
349
350 struct yac_interp_field src_fields[] =
351 {{.location = YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
352 size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
354 {.location = YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
355
356 struct yac_interp_grid * interp_grid =
359
360 struct interp_method * method_stack[] =
361 {yac_interp_method_callback_new(utest_test3_callback, NULL),
362 yac_interp_method_fixed_new(-1.0), NULL};
363
364 struct yac_interp_weights * weights =
365 yac_interp_method_do_search(method_stack, interp_grid);
366
367 struct yac_interpolation * interpolation =
369 weights, YAC_MAPPING_ON_SRC, 1,
370 YAC_FRAC_MASK_NO_VALUE, 1.0, 0.0, NULL, 1, 1);
371
372 // check generated interpolation
373 {
374 double *** src_data = NULL;
375 double ** tgt_data = NULL;
376
377 if (comm_rank == 0) {
378 tgt_data = xmalloc(1 * sizeof(*tgt_data));
379 tgt_data[0] = xmalloc(tgt_grid_data.num_vertices * sizeof(**tgt_data));
380 for (size_t i = 0; i < tgt_grid_data.num_vertices; ++i)
381 tgt_data[0][i] = -1.0;
382 }
383
384 src_data = xmalloc(1 * sizeof(*src_data));
385 src_data[0] = xmalloc(1 * sizeof(**src_data));
386 src_data[0][0] =
387 xmalloc(src_grid_data.num_cells * sizeof(***src_data));
388 for (size_t i = 0; i < src_grid_data.num_cells; ++i)
389 src_data[0][0][i] = (double)(src_grid_data.cell_ids[i]);
390
391 yac_interpolation_execute(interpolation, src_data, tgt_data);
392
393 if (comm_rank == 0) {
394
395 // check results
396 for (size_t i = 0; i < tgt_grid_data.num_vertices; ++i)
397 if (tgt_data[0][i] != (double)(tgt_grid_data.vertex_ids[i]))
398 PUT_ERR("wrong results");
399
400 free(tgt_data[0]);
401 free(tgt_data);
402 }
403
404 free(src_data[0][0]);
405 free(src_data[0]);
406 free(src_data);
407 }
408 yac_interpolation_delete(interpolation);
410 yac_interp_method_delete(method_stack);
411 yac_interp_grid_delete(interp_grid);
412 yac_dist_grid_pair_delete(grid_pair);
413 yac_basic_grid_delete(tgt_grid);
414 yac_basic_grid_delete(src_grid);
415 }
416
417 // cleanup
420
421 return TEST_EXIT_CODE;
422}
423
424static void utest_test1_callback(
425 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
426 int const ** global_results_points, double ** result_weights,
427 size_t * result_count, void * user_data) {
428
429 UNUSED(tgt_coords);
430 UNUSED(src_cell_id);
431 UNUSED(src_cell_idx);
432
433 size_t num_src_fields = *(size_t*)user_data;
434
435 for (size_t i = 0; i < num_src_fields; ++i) {
436 global_results_points[i] = NULL;
437 result_weights[i] = NULL;
438 result_count[i] = 0;
439 }
440}
441
442static void utest_test2_callback(
443 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
444 int const ** global_results_points, double ** result_weights,
445 size_t * result_count, void * user_data) {
446
447 UNUSED(tgt_coords);
448
449 struct grid_info * info = (struct grid_info *)user_data;
450
451 // consistency check
452 if ((info->num_grid_cells <= src_cell_idx) ||
453 (info->cell_ids[src_cell_idx] != src_cell_id)) {
454 fputs("ERROR(test2_callback): inconsistent data\n", stderr);
455 exit(EXIT_FAILURE);
456 }
457
458 static double vertex_weights[4] = {0.125, 0.125, 0.125, 0.125};
459 static double cell_weight[1] = {0.5};
460
461 static int vertex_result_points[4];
462 static int cell_result_points[1];
463
464 for (size_t i = 0; i < 4; ++i)
465 vertex_result_points[i] =
466 (int)(info->vertex_ids[info->cell_to_vertex[4*src_cell_idx + i]]);
467 cell_result_points[0] = (int)src_cell_id;
468
469 global_results_points[0] = vertex_result_points;
470 global_results_points[1] = cell_result_points;
471 result_weights[0] = vertex_weights;
472 result_weights[1] = cell_weight;
473 result_count[0] = 4;
474 result_count[1] = 1;
475}
476
477static void utest_test3_callback(
478 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
479 int const ** global_results_points, double ** result_weights,
480 size_t * result_count, void * user_data) {
481
482 UNUSED(tgt_coords);
483 UNUSED(src_cell_id);
484 UNUSED(src_cell_idx);
486
487 static int result_points[1];
488 static double weight[1] = {1.0};
489
490 result_points[0] = (int)src_cell_id;
491
492 global_results_points[0] = result_points;
493 result_weights[0] = weight;
494 result_count[0] = 1;
495}
496
497static void utest_test4_callback(
498 double const tgt_coords[3], int src_cell_id, size_t src_cell_idx,
499 int const ** global_results_points, double ** result_weights,
500 size_t * result_count, void * user_data) {
501
502 UNUSED(tgt_coords);
503
504 struct grid_info * info = (struct grid_info *)user_data;
505
506 // consistency check
507 if ((info->num_grid_cells <= src_cell_idx) ||
508 (info->cell_ids[src_cell_idx] != src_cell_id)) {
509 fputs("ERROR(test2_callback): inconsistent data\n", stderr);
510 exit(EXIT_FAILURE);
511 }
512
513 static double vertex_weights[4] = {0.125, 0.125, 0.125, 0.125};
514 static double cell_weight[1] = {0.5};
515
516 static int vertex_result_points[4];
517 static int cell_result_points[1];
518
519 for (size_t i = 0; i < 4; ++i)
520 vertex_result_points[i] =
521 (int)(info->vertex_ids[info->cell_to_vertex[4*src_cell_idx + i]]);
522 cell_result_points[0] = (int)src_cell_id;
523
524 if (src_cell_id&1) {
525 global_results_points[0] = vertex_result_points;
526 global_results_points[1] = cell_result_points;
527 result_weights[0] = vertex_weights;
528 result_weights[1] = cell_weight;
529 result_count[0] = 4;
530 result_count[1] = 1;
531 } else {
532 global_results_points[0] = NULL;
533 global_results_points[1] = NULL;
534 result_weights[0] = NULL;
535 result_weights[1] = NULL;
536 result_count[0] = 0;
537 result_count[1] = 0;
538 }
539}
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_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
#define UNUSED(x)
Definition core.h:72
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
Definition dist_grid.c:2377
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:2089
#define YAC_RAD
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
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_method_delete(struct interp_method **method)
Delete an interpolation stack and free its resources (but not the pointer array).
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
Perform weight computation using given interpolation stack and grid.
Defines the interface of the interpolation method "base class" in YAC.
void * user_data
void yac_interp_method_callback_get_compute_weights_callback(char const *key, yac_func_compute_weights *compute_weights_callback, void **user_data)
char * key
struct interp_method * yac_interp_method_callback_new(yac_func_compute_weights compute_weights_callback, void *user_data)
void yac_interp_method_callback_add_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
void yac_interp_method_callback_buf_free()
void(* yac_func_compute_weights)(double const tgt_coords[3], int src_cell_id, size_t src_cell_idx, int const **global_results_points, double **result_weights, size_t *result_count, void *user_data)
struct interp_method * yac_interp_method_fixed_new(double value)
struct yac_interpolation * yac_interp_weights_get_interpolation(struct yac_interp_weights *weights, enum yac_interp_weights_reorder_type reorder, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, int is_source, int is_target)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
yac_interp_weights_reorder_type
@ YAC_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be applied at source processes
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
double const YAC_FRAC_MASK_NO_VALUE
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_CELL
Definition location.h:14
#define xmalloc(size)
Definition ppm_xfuncs.h:66
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
int * cell_to_vertex
int collection_size
static char const * grid_names[2]
double coordinates_x[]
size_t num_cells[2]
double coordinates_y[]
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10
int info
@ NUM_TEST_FUNCTIONS
Definition toy_scrip.c:136
struct @1 test_functions[]
void yac_mpi_finalize()
Definition yac_mpi.c:106
void yac_yaxt_init(MPI_Comm comm)
Definition yac_mpi.c:41
void yac_mpi_init()
Definition yac_mpi.c:77
YAC_INT yac_int
Definition yac_types.h:15