YAC 3.20.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_dummy_coupling2_c.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#define EXACT
6
7#include <mpi.h>
8#include <yaxt.h>
9
10#include <stdlib.h>
11#include <stdio.h>
12#include <string.h>
13
14#include "yac.h"
15#include "utils_common.h"
16#include "geometry.h"
17#include "read_icon_grid.h"
19#include "test_function.h"
20#include "tests.h"
21
28#define DUMMY_VALUE (-1337.0)
29
30struct field_config {
31 double * data;
32 size_t data_size;
33 int id;
35};
36
37static void utest_generate_icon_grid(
38 int comm_rank, int comm_size, int comp_id, int * grid_id,
39 struct field_config * in_config, struct field_config * out_config,
40 char const * grid_dir);
41static void utest_generate_cube_grid(
42 int comm_rank, int comm_size, int comp_id, int * grid_id,
43 struct field_config * in_config, struct field_config * out_config);
45static void check_results(
46 struct field_config field_config, struct field_config ref_field_config);
47
48int main(int argc, char** argv) {
49
50 yac_cinit ();
51
53
54 int global_rank, global_size;
55 MPI_Comm_rank(MPI_COMM_WORLD, &global_rank);
56 MPI_Comm_size(MPI_COMM_WORLD, &global_size);
57
58 if (global_size != 3) {
59 fprintf(stderr, "Wrong number of processes (should be 3)\n");
60 exit(EXIT_FAILURE);
61 }
62
63 if (argc != 3) {
64 PUT_ERR("ERROR: missing config/grid file directory");
65 xt_finalize();
66 MPI_Finalize();
67 return TEST_EXIT_CODE;
68 }
69
70 // register component(s)
71 // (rank 0 => comp1; rank 1 => comp2; rank 2 => comp1 + comp2)
72 int comp_ids[2];
73 int num_comps;
74 if ((global_rank == 0) || (global_rank == 1)) {
75 yac_cdef_comp((global_rank == 0)?"comp1":"comp2", comp_ids);
76 num_comps = 1;
77 } else {
78 char const * comp_names[2] = {"comp1", "comp2"};
79 yac_cdef_comps(&(comp_names[0]), 2, comp_ids);
80 num_comps = 2;
81 }
82
83 // register grids
84 int grid_ids[2];
85 struct field_config in_field_configs[2];
86 struct field_config out_field_configs[2];
87 if ((global_rank == 0) || (global_rank == 2))
88 utest_generate_icon_grid(
89 (global_rank == 2), 2, comp_ids[0], &(grid_ids[0]),
90 &(in_field_configs[0]),
91 &(out_field_configs[0]), argv[2]);
92
93 if ((global_rank == 1) || (global_rank == 2))
94 utest_generate_cube_grid(
95 (global_rank == 2), 2, comp_ids[global_rank == 2],
96 &(grid_ids[global_rank == 2]),
97 &(in_field_configs[global_rank == 2]),
98 &(out_field_configs[global_rank == 2]));
99
100 // read configuration file
101 char * yaml_filename =
102 strcat(
103 strcpy(
104 malloc(strlen(argv[1]) + 32), argv[1]), "coupling_test2.yaml");
106 free(yaml_filename);
107
108 yac_cenddef();
109
110 // do some ping-pongs
111 for (int t = 0; t < 100; ++t) {
112
113 if (global_rank == 0) {
114
115 {
116 int send_info, recv_info, err;
117 int id = out_field_configs[0].id;
118 int dummy_id = out_field_configs[0].dummy_id;
119 double *point_set_data[1];
120 double **collection_data[1] = {point_set_data};
121 point_set_data[0] = out_field_configs[0].data;
122
124 id, dummy_id, 1, collection_data, NULL,
125 &send_info, &recv_info, &err);
126
127 if (send_info != YAC_ACTION_COUPLING) PUT_ERR("ERROR in yac_cexchange");
128 if (recv_info != YAC_ACTION_NONE) PUT_ERR("ERROR in yac_cexchange");
129 if (err) PUT_ERR("ERROR in yac_cexchange");
130 }
131
132 {
133 int send_info, recv_info, err;
134 int id = in_field_configs[0].id;
135 int dummy_id = in_field_configs[0].dummy_id;
136 double *collection_data[1] = {in_field_configs[0].data};
137
138 init_in_field_data(in_field_configs[0]);
139
141 dummy_id, id, 1, NULL, collection_data,
142 &send_info, &recv_info, &err);
143
144 check_results(in_field_configs[0], out_field_configs[0]);
145 if (send_info != YAC_ACTION_NONE) PUT_ERR("ERROR in yac_cexchange");
146 if (recv_info != YAC_ACTION_COUPLING) PUT_ERR("ERROR in yac_cexchange");
147 if (err) PUT_ERR("ERROR in yac_cexchange");
148 }
149 } else if (global_rank == 1) {
150
151 {
152 int info, err;
153 int id = in_field_configs[0].id;
154 double *collection_data[1] = {in_field_configs[0].data};
155
156 init_in_field_data(in_field_configs[0]);
157
158 yac_cget(id, 1, collection_data, &info, &err);
159
160 check_results(in_field_configs[0], out_field_configs[0]);
161 }
162
163 {
164 int info, err;
165 int id = out_field_configs[0].id;
166 double *point_set_data[1];
167 double **collection_data[1] = {point_set_data};
168 point_set_data[0] = out_field_configs[0].data;
169
170 yac_cput(id, 1, collection_data, &info, &err);
171 }
172 } else {
173
174 for (int i = 0; i < 2; ++i) {
175 int out_info, in_info, err;
176 int out_id = out_field_configs[i].id;
177 int in_id = in_field_configs[i^1].id;
178 double *out_point_set_data[1];
179 double **out_collection_data[1] = {out_point_set_data};
180 out_point_set_data[0] = out_field_configs[i].data;
181 double *in_collection_data[1] = {in_field_configs[i^1].data};
182
183 init_in_field_data(in_field_configs[i^1]);
184
186 out_id, in_id, 1, out_collection_data, in_collection_data,
187 &out_info, &in_info, &err);
188
189 check_results(in_field_configs[i^1], out_field_configs[i^1]);
190 }
191 }
192 }
193
194 // clean-up
195
196 for (int i = 0; i < num_comps; ++i) {
197 free(out_field_configs[i].data);
198 free(in_field_configs[i].data);
199 }
200
202
203 return TEST_EXIT_CODE;
204}
205
206static void utest_generate_icon_grid(
207 int comm_rank, int comm_size, int comp_id, int * grid_id,
208 struct field_config * in_config, struct field_config * out_config,
209 char const * grid_dir) {
210
211 int nbr_vertices;
212 int nbr_cells;
213 int * num_vertices_per_cell;
214 int * cell_to_vertex;
215 double * x_vertices;
216 double * y_vertices;
217 double * x_cells;
218 double * y_cells;
219
220 int * cell_mask;
221 int * global_cell_id;
222 int * cell_core_mask;
223 int * global_corner_id;
224 int * corner_core_mask;
225
226 char * grid_filename =
227 strcat(
228 strcpy(
229 malloc(strlen(grid_dir) + 32), grid_dir), "icon_grid_R02B01.nc");
231 grid_filename, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
232 &cell_to_vertex, &x_vertices, &y_vertices, &x_cells, &y_cells,
233 &global_cell_id, &cell_mask,
234 &cell_core_mask, &global_corner_id, &corner_core_mask,
235 comm_rank, comm_size);
236 free(grid_filename);
237
239 "icon", nbr_vertices, nbr_cells, num_vertices_per_cell,
240 x_vertices, y_vertices, cell_to_vertex, grid_id);
241
242 if (yac_cget_grid_size(YAC_LOCATION_CORNER, *grid_id) != (size_t)nbr_vertices)
243 PUT_ERR("error in yac_cget_grid_size");
244 if (yac_cget_grid_size(YAC_LOCATION_CELL, *grid_id) != (size_t)nbr_cells)
245 PUT_ERR("error in yac_cget_grid_size");
246
251
252 int corner_point_id, cell_point_id;
254 *grid_id, nbr_vertices, YAC_LOCATION_CORNER, x_vertices, y_vertices,
255 &corner_point_id);
257 *grid_id, nbr_cells, YAC_LOCATION_CELL, x_cells, y_cells,
259
260 if (yac_cget_points_size(corner_point_id) != (size_t)nbr_vertices)
261 PUT_ERR("error in yac_cget_points_size");
262 if (yac_cget_points_size(cell_point_id) != (size_t)nbr_cells)
263 PUT_ERR("error in yac_cget_points_size");
264
265 // for (int i = 0; i < nbr_cells; ++i) cell_mask[i] = cell_mask[i] == 0;
266
267 // yac_cset_mask(cell_mask, cell_point_id);
268
270 "icon_to_cube", comp_id, &cell_point_id, 1, 1, "1", YAC_TIME_UNIT_SECOND,
271 &(out_config->id));
272 // field with no associated coupling
274 "icon_to_cube_dummy", comp_id, &cell_point_id, 1, 1, "1",
275 YAC_TIME_UNIT_SECOND, &(out_config->dummy_id));
277 "cube_to_icon", comp_id, &cell_point_id, 1, 1, "1", YAC_TIME_UNIT_SECOND,
278 &(in_config->id));
279 // field with no associated coupling
281 "cube_to_icon_dummy", comp_id, &cell_point_id, 1, 1, "1",
282 YAC_TIME_UNIT_SECOND, &(in_config->dummy_id));
283
284 out_config->data = xmalloc(nbr_cells * sizeof(*(out_config->data)));
285 for (int i = 0; i < nbr_cells; ++i)
286 out_config->data[i] =
287 (cell_core_mask[i])?
288 (yac_test_harmonic(x_cells[i]*YAC_RAD, y_cells[i]*YAC_RAD)):
290 in_config->data = xmalloc(nbr_cells * sizeof(*(in_config->data)));
291
292 in_config->data_size = nbr_cells;
293 out_config->data_size = nbr_cells;
294
296 &global_cell_id,
298 &num_vertices_per_cell,
299 &global_corner_id,
300 &corner_core_mask,
302 &x_cells,
303 &y_cells,
304 &x_vertices,
305 &y_vertices);
306}
307
308static void utest_generate_cube_grid(
309 int comm_rank, int comm_size, int comp_id, int * grid_id,
310 struct field_config * in_config, struct field_config * out_config) {
311
312 unsigned n = 50;
313
314 unsigned nbr_vertices;
315 unsigned nbr_cells;
316 unsigned * num_vertices_per_cell;
317 unsigned * cell_to_vertex;
318 double * x_vertices;
319 double * y_vertices;
320 double * x_cells;
321 double * y_cells;
322
323 int * cell_core_mask;
324 int * corner_core_mask;
325 int * global_cell_id;
326 int * global_corner_id;
327
328 yac_generate_part_cube_grid_information(n, &nbr_vertices, &nbr_cells,
329 &num_vertices_per_cell, &cell_to_vertex,
330 &x_vertices, &y_vertices, &x_cells,
331 &y_cells, &global_cell_id,
332 &cell_core_mask, &global_corner_id,
333 &corner_core_mask, comm_rank, comm_size);
334
336 "cube", nbr_vertices, nbr_cells, (int*)num_vertices_per_cell,
337 x_vertices, y_vertices, (int*)cell_to_vertex, grid_id);
338
339 if (yac_cget_grid_size(YAC_LOCATION_CORNER, *grid_id) != nbr_vertices)
340 PUT_ERR("error in yac_cget_grid_size");
341 if (yac_cget_grid_size(YAC_LOCATION_CELL, *grid_id) != nbr_cells)
342 PUT_ERR("error in yac_cget_grid_size");
343
348
349 int corner_point_id, cell_point_id;
351 *grid_id, nbr_vertices, YAC_LOCATION_CORNER, x_vertices, y_vertices,
352 &corner_point_id);
354 *grid_id, nbr_cells, YAC_LOCATION_CELL, x_cells, y_cells,
356
357 if (yac_cget_points_size(corner_point_id) != nbr_vertices)
358 PUT_ERR("error in yac_cget_points_size");
359 if (yac_cget_points_size(cell_point_id) != nbr_cells)
360 PUT_ERR("error in yac_cget_points_size");
361
362 yac_cdef_field("cube_to_icon", comp_id, &cell_point_id, 1,
363 1, "1", YAC_TIME_UNIT_SECOND, &(out_config->id));
364 // field with no associated coupling
365 yac_cdef_field("cube_to_icon_dummy", comp_id, &cell_point_id, 1,
366 1, "1", YAC_TIME_UNIT_SECOND, &(out_config->dummy_id));
367 yac_cdef_field("icon_to_cube", comp_id, &cell_point_id, 1,
368 1, "1", YAC_TIME_UNIT_SECOND, &(in_config->id));
369 // field with no associated coupling
370 yac_cdef_field("icon_to_cube_dummy", comp_id, &cell_point_id, 1,
371 1, "1", YAC_TIME_UNIT_SECOND, &(in_config->dummy_id));
372
373 out_config->data = xmalloc(nbr_cells * sizeof(*(out_config->data)));
374 for (unsigned i = 0; i < nbr_cells; ++i)
375 out_config->data[i] =
376 (cell_core_mask[i])?
377 (yac_test_harmonic(x_cells[i]*YAC_RAD, y_cells[i]*YAC_RAD)):
379 in_config->data = xmalloc(nbr_cells * sizeof(*(in_config->data)));
380 out_config->data_size = nbr_cells;
381 in_config->data_size = nbr_cells;
382 free(cell_core_mask);
383 free(corner_core_mask);
384 free(global_cell_id);
385 free(global_corner_id);
386 free(x_vertices);
387 free(y_vertices);
388 free(x_cells);
389 free(y_cells);
390 free(num_vertices_per_cell);
391 free(cell_to_vertex);
392}
393
395 for (size_t i = 0; i < field_config.data_size; ++i)
397}
398
399static void check_results(
400 struct field_config field_config, struct field_config ref_field_config) {
401
402 if (field_config.data_size != ref_field_config.data_size) {
403 fputs("ERROR(check_results): inconsistent data_size\n", stderr);
404 exit(EXIT_FAILURE);
405 }
406
407 for (size_t i = 0; i < field_config.data_size; ++i) {
408 if (fabs(field_config.data[i] - ref_field_config.data[i]) > 1e-3) {
409 fputs("ERROR(check_results): data missmatch\n", stderr);
410 exit(EXIT_FAILURE);
411 }
412 }
413}
#define YAC_RAD
void yac_generate_part_cube_grid_information(unsigned n, unsigned *nbr_vertices, unsigned *nbr_cells, unsigned **num_vertices_per_cell, unsigned **cell_to_vertex, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **global_cell_id, int **cell_core_mask, int **global_corner_id, int **corner_core_mask, int rank, int size)
#define xmalloc(size)
Definition ppm_xfuncs.h:66
void yac_delete_icon_grid_data(int **cell_mask, int **global_cell_id, int **global_cell_id_rank, int **num_vertices_per_cell, int **global_corner_id, int **global_corner_id_rank, int **cell_to_vertex, double **x_cells, double **y_cells, double **x_vertices, double **y_vertices)
void yac_read_part_icon_grid_information(const char *filename, int *nbr_vertices, int *nbr_cells, int **num_vertices_per_cell, int **cell_to_vertex, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **global_cell_id, int **cell_mask, int **cell_core_mask, int **global_corner_id, int **corner_core_mask, int rank, int size)
#define DUMMY_VALUE
static void init_in_field_data(struct field_config field_config)
static void check_results(struct field_config field_config, struct field_config ref_field_config)
int * cell_to_vertex
int * cell_mask
char * yaml_filename
double * data
double yac_test_harmonic(double lon, double lat)
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10
int info
int comp_ids[1]
int * cell_core_mask
int grid_id
int cell_point_id
int comp_id
void yac_cenddef(void)
Definition yac.c:4947
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:5667
int const YAC_LOCATION_CELL
Definition yac.c:37
void yac_cinit(void)
Definition yac.c:721
void yac_cfinalize()
Finalises YAC.
Definition yac.c:971
int const YAC_LOCATION_CORNER
Definition yac.c:38
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:3246
int const YAC_TIME_UNIT_SECOND
Definition yac.c:63
void yac_cdef_grid_unstruct(const char *grid_name, int nbr_vertices, int nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex, int *grid_id)
Definition yac.c:5488
void yac_cexchange(int const send_field_id, int const recv_field_id, int const collection_size, double ***const send_field, double **recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4824
void yac_cdef_points_unstruct(int const grid_id, int const nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1601
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:4212
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:801
int const YAC_ACTION_NONE
no data exchanges
Definition yac.c:46
void yac_cdef_calendar(int calendar)
Definition yac.c:1000
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:5683
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:1293
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:72
int const YAC_ACTION_COUPLING
data exchange
Definition yac.c:48
size_t yac_cget_grid_size(int located, int grid_id)
Definition yac.c:5725
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:1307
void yac_cdef_field(char const *name, int const comp_id, int const *point_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
Definition yac.c:1891
size_t yac_cget_points_size(int points_id)
Definition yac.c:5746