YAC 3.12.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
9#include <stdlib.h>
10#include <stdio.h>
11#include <string.h>
12
13#include "yac.h"
14#include "utils_common.h"
15#include "geometry.h"
16#include "read_icon_grid.h"
18#include "test_function.h"
19#include "tests.h"
20
27#define DUMMY_VALUE (-1337.0)
28
29struct field_config {
30 double * data;
31 size_t data_size;
32 int id;
34};
35
36static void utest_generate_icon_grid(
37 int comm_rank, int comm_size, int comp_id, int * grid_id,
38 struct field_config * in_config, struct field_config * out_config,
39 char const * grid_dir);
40static void utest_generate_cube_grid(
41 int comm_rank, int comm_size, int comp_id, int * grid_id,
42 struct field_config * in_config, struct field_config * out_config);
44static void check_results(
45 struct field_config field_config, struct field_config ref_field_config);
46
47int main(int argc, char** argv) {
48
49 yac_cinit ();
50
52
53 int global_rank, global_size;
54 MPI_Comm_rank(MPI_COMM_WORLD, &global_rank);
55 MPI_Comm_size(MPI_COMM_WORLD, &global_size);
56
57 if (global_size != 3) {
58 fprintf(stderr, "Wrong number of processes (should be 3)\n");
59 exit(EXIT_FAILURE);
60 }
61
62 if (argc != 3) {
63 PUT_ERR("ERROR: missing config/grid file directory");
64 xt_finalize();
65 MPI_Finalize();
66 return TEST_EXIT_CODE;
67 }
68
69 // register component(s)
70 // (rank 0 => comp1; rank 1 => comp2; rank 2 => comp1 + comp2)
71 int comp_ids[2];
72 int num_comps;
73 if ((global_rank == 0) || (global_rank == 1)) {
74 yac_cdef_comp((global_rank == 0)?"comp1":"comp2", comp_ids);
75 num_comps = 1;
76 } else {
77 char const * comp_names[2] = {"comp1", "comp2"};
78 yac_cdef_comps(&(comp_names[0]), 2, comp_ids);
79 num_comps = 2;
80 }
81
82 // register grids
83 int grid_ids[2];
84 struct field_config in_field_configs[2];
85 struct field_config out_field_configs[2];
86 if ((global_rank == 0) || (global_rank == 2))
87 utest_generate_icon_grid(
88 (global_rank == 2), 2, comp_ids[0], &(grid_ids[0]),
89 &(in_field_configs[0]),
90 &(out_field_configs[0]), argv[2]);
91
92 if ((global_rank == 1) || (global_rank == 2))
93 utest_generate_cube_grid(
94 (global_rank == 2), 2, comp_ids[global_rank == 2],
95 &(grid_ids[global_rank == 2]),
96 &(in_field_configs[global_rank == 2]),
97 &(out_field_configs[global_rank == 2]));
98
99 // read configuration file
100 char * yaml_filename =
101 strcat(
102 strcpy(
103 malloc(strlen(argv[1]) + 32), argv[1]), "coupling_test2.yaml");
105 free(yaml_filename);
106
107 yac_cenddef();
108
109 // do some ping-pongs
110 for (int t = 0; t < 100; ++t) {
111
112 if (global_rank == 0) {
113
114 {
115 int send_info, recv_info, err;
116 int id = out_field_configs[0].id;
117 int dummy_id = out_field_configs[0].dummy_id;
118 double *point_set_data[1];
119 double **collection_data[1] = {point_set_data};
120 point_set_data[0] = out_field_configs[0].data;
121
123 id, dummy_id, 1, collection_data, NULL,
124 &send_info, &recv_info, &err);
125
126 if (send_info != YAC_ACTION_COUPLING) PUT_ERR("ERROR in yac_cexchange");
127 if (recv_info != YAC_ACTION_NONE) PUT_ERR("ERROR in yac_cexchange");
128 if (err) PUT_ERR("ERROR in yac_cexchange");
129 }
130
131 {
132 int send_info, recv_info, err;
133 int id = in_field_configs[0].id;
134 int dummy_id = in_field_configs[0].dummy_id;
135 double *collection_data[1] = {in_field_configs[0].data};
136
137 init_in_field_data(in_field_configs[0]);
138
140 dummy_id, id, 1, NULL, collection_data,
141 &send_info, &recv_info, &err);
142
143 check_results(in_field_configs[0], out_field_configs[0]);
144 if (send_info != YAC_ACTION_NONE) PUT_ERR("ERROR in yac_cexchange");
145 if (recv_info != YAC_ACTION_COUPLING) PUT_ERR("ERROR in yac_cexchange");
146 if (err) PUT_ERR("ERROR in yac_cexchange");
147 }
148 } else if (global_rank == 1) {
149
150 {
151 int info, err;
152 int id = in_field_configs[0].id;
153 double *collection_data[1] = {in_field_configs[0].data};
154
155 init_in_field_data(in_field_configs[0]);
156
157 yac_cget(id, 1, collection_data, &info, &err);
158
159 check_results(in_field_configs[0], out_field_configs[0]);
160 }
161
162 {
163 int info, err;
164 int id = out_field_configs[0].id;
165 double *point_set_data[1];
166 double **collection_data[1] = {point_set_data};
167 point_set_data[0] = out_field_configs[0].data;
168
169 yac_cput(id, 1, collection_data, &info, &err);
170 }
171 } else {
172
173 for (int i = 0; i < 2; ++i) {
174 int out_info, in_info, err;
175 int out_id = out_field_configs[i].id;
176 int in_id = in_field_configs[i^1].id;
177 double *out_point_set_data[1];
178 double **out_collection_data[1] = {out_point_set_data};
179 out_point_set_data[0] = out_field_configs[i].data;
180 double *in_collection_data[1] = {in_field_configs[i^1].data};
181
182 init_in_field_data(in_field_configs[i^1]);
183
185 out_id, in_id, 1, out_collection_data, in_collection_data,
186 &out_info, &in_info, &err);
187
188 check_results(in_field_configs[i^1], out_field_configs[i^1]);
189 }
190 }
191 }
192
193 // clean-up
194
195 for (int i = 0; i < num_comps; ++i) {
196 free(out_field_configs[i].data);
197 free(in_field_configs[i].data);
198 }
199
201
202 return TEST_EXIT_CODE;
203}
204
205static void utest_generate_icon_grid(
206 int comm_rank, int comm_size, int comp_id, int * grid_id,
207 struct field_config * in_config, struct field_config * out_config,
208 char const * grid_dir) {
209
210 int nbr_vertices;
211 int nbr_cells;
212 int * num_vertices_per_cell;
213 int * cell_to_vertex;
214 double * x_vertices;
215 double * y_vertices;
216 double * x_cells;
217 double * y_cells;
218
219 int * cell_mask;
220 int * global_cell_id;
221 int * cell_core_mask;
222 int * global_corner_id;
223 int * corner_core_mask;
224
225 char * grid_filename =
226 strcat(
227 strcpy(
228 malloc(strlen(grid_dir) + 32), grid_dir), "icon_grid_0030_R02B03_G.nc");
230 grid_filename, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
231 &cell_to_vertex, &x_vertices, &y_vertices, &x_cells, &y_cells,
232 &global_cell_id, &cell_mask,
233 &cell_core_mask, &global_corner_id, &corner_core_mask,
234 comm_rank, comm_size);
235 free(grid_filename);
236
238 "icon", nbr_vertices, nbr_cells, num_vertices_per_cell,
239 x_vertices, y_vertices, cell_to_vertex, grid_id);
240
241 if (yac_cget_grid_size(YAC_LOCATION_CORNER, *grid_id) != (size_t)nbr_vertices)
242 PUT_ERR("error in yac_cget_grid_size");
243 if (yac_cget_grid_size(YAC_LOCATION_CELL, *grid_id) != (size_t)nbr_cells)
244 PUT_ERR("error in yac_cget_grid_size");
245
250
251 int corner_point_id, cell_point_id;
253 *grid_id, nbr_vertices, YAC_LOCATION_CORNER, x_vertices, y_vertices,
254 &corner_point_id);
256 *grid_id, nbr_cells, YAC_LOCATION_CELL, x_cells, y_cells,
258
259 if (yac_cget_points_size(corner_point_id) != (size_t)nbr_vertices)
260 PUT_ERR("error in yac_cget_points_size");
261 if (yac_cget_points_size(cell_point_id) != (size_t)nbr_cells)
262 PUT_ERR("error in yac_cget_points_size");
263
264 for (int i = 0; i < nbr_cells; ++i) cell_mask[i] = cell_mask[i] == 0;
265
267
269 "icon_to_cube", comp_id, &cell_point_id, 1, 1, "1", YAC_TIME_UNIT_SECOND,
270 &(out_config->id));
272 "icon_to_cube_dummy", comp_id, &cell_point_id, 1, 1, "1",
273 YAC_TIME_UNIT_SECOND, &(out_config->dummy_id));
275 "cube_to_icon", comp_id, &cell_point_id, 1, 1, "1", YAC_TIME_UNIT_SECOND,
276 &(in_config->id));
278 "cube_to_icon_dummy", comp_id, &cell_point_id, 1, 1, "1",
279 YAC_TIME_UNIT_SECOND, &(in_config->dummy_id));
280
281 out_config->data = xmalloc(nbr_cells * sizeof(*(out_config->data)));
282 for (int i = 0; i < nbr_cells; ++i)
283 out_config->data[i] =
284 (cell_core_mask[i])?
285 (yac_test_harmonic(x_cells[i]*YAC_RAD, y_cells[i]*YAC_RAD)):
287 in_config->data = xmalloc(nbr_cells * sizeof(*(in_config->data)));
288
289 in_config->data_size = nbr_cells;
290 out_config->data_size = nbr_cells;
291
293 &global_cell_id,
295 &num_vertices_per_cell,
296 &global_corner_id,
297 &corner_core_mask,
299 &x_cells,
300 &y_cells,
301 &x_vertices,
302 &y_vertices);
303}
304
305static void utest_generate_cube_grid(
306 int comm_rank, int comm_size, int comp_id, int * grid_id,
307 struct field_config * in_config, struct field_config * out_config) {
308
309 unsigned n = 50;
310
311 unsigned nbr_vertices;
312 unsigned nbr_cells;
313 unsigned * num_vertices_per_cell;
314 unsigned * cell_to_vertex;
315 double * x_vertices;
316 double * y_vertices;
317 double * x_cells;
318 double * y_cells;
319
320 int * cell_core_mask;
321 int * corner_core_mask;
322 int * global_cell_id;
323 int * global_corner_id;
324
325 yac_generate_part_cube_grid_information(n, &nbr_vertices, &nbr_cells,
326 &num_vertices_per_cell, &cell_to_vertex,
327 &x_vertices, &y_vertices, &x_cells,
328 &y_cells, &global_cell_id,
329 &cell_core_mask, &global_corner_id,
330 &corner_core_mask, comm_rank, comm_size);
331
333 "cube", nbr_vertices, nbr_cells, (int*)num_vertices_per_cell,
334 x_vertices, y_vertices, (int*)cell_to_vertex, grid_id);
335
336 if (yac_cget_grid_size(YAC_LOCATION_CORNER, *grid_id) != nbr_vertices)
337 PUT_ERR("error in yac_cget_grid_size");
338 if (yac_cget_grid_size(YAC_LOCATION_CELL, *grid_id) != nbr_cells)
339 PUT_ERR("error in yac_cget_grid_size");
340
345
346 int corner_point_id, cell_point_id;
348 *grid_id, nbr_vertices, YAC_LOCATION_CORNER, x_vertices, y_vertices,
349 &corner_point_id);
351 *grid_id, nbr_cells, YAC_LOCATION_CELL, x_cells, y_cells,
353
354 if (yac_cget_points_size(corner_point_id) != nbr_vertices)
355 PUT_ERR("error in yac_cget_points_size");
356 if (yac_cget_points_size(cell_point_id) != nbr_cells)
357 PUT_ERR("error in yac_cget_points_size");
358
359 yac_cdef_field("cube_to_icon", comp_id, &cell_point_id, 1,
360 1, "1", YAC_TIME_UNIT_SECOND, &(out_config->id));
361 yac_cdef_field("cube_to_icon_dummy", comp_id, &cell_point_id, 1,
362 1, "1", YAC_TIME_UNIT_SECOND, &(out_config->dummy_id));
363 yac_cdef_field("icon_to_cube", comp_id, &cell_point_id, 1,
364 1, "1", YAC_TIME_UNIT_SECOND, &(in_config->id));
365 yac_cdef_field("icon_to_cube_dummy", comp_id, &cell_point_id, 1,
366 1, "1", YAC_TIME_UNIT_SECOND, &(in_config->dummy_id));
367
368 out_config->data = xmalloc(nbr_cells * sizeof(*(out_config->data)));
369 for (unsigned i = 0; i < nbr_cells; ++i)
370 out_config->data[i] =
371 (cell_core_mask[i])?
372 (yac_test_harmonic(x_cells[i]*YAC_RAD, y_cells[i]*YAC_RAD)):
374 in_config->data = xmalloc(nbr_cells * sizeof(*(in_config->data)));
375 out_config->data_size = nbr_cells;
376 in_config->data_size = nbr_cells;
377 free(cell_core_mask);
378 free(corner_core_mask);
379 free(global_cell_id);
380 free(global_corner_id);
381 free(x_vertices);
382 free(y_vertices);
383 free(x_cells);
384 free(y_cells);
385 free(num_vertices_per_cell);
386 free(cell_to_vertex);
387}
388
390 for (size_t i = 0; i < field_config.data_size; ++i)
392}
393
394static void check_results(
395 struct field_config field_config, struct field_config ref_field_config) {
396
397 if (field_config.data_size != ref_field_config.data_size) {
398 fputs("ERROR(check_results): inconsistent data_size\n", stderr);
399 exit(EXIT_FAILURE);
400 }
401
402 for (size_t i = 0; i < field_config.data_size; ++i) {
403 if (fabs(field_config.data[i] - ref_field_config.data[i]) > 1e-3) {
404 fputs("ERROR(check_results): data missmatch\n", stderr);
405 exit(EXIT_FAILURE);
406 }
407 }
408}
#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:14
#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:4363
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:5012
int const YAC_LOCATION_CELL
Definition yac.c:31
void yac_cinit(void)
Definition yac.c:488
void yac_cfinalize()
Finalises YAC.
Definition yac.c:717
int const YAC_LOCATION_CORNER
Definition yac.c:32
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2729
int const YAC_TIME_UNIT_SECOND
Definition yac.c:56
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:4830
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:4308
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:1158
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:3684
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:572
int const YAC_ACTION_NONE
no data exchanges
Definition yac.c:39
void yac_cdef_calendar(int calendar)
Definition yac.c:746
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:5028
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:976
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:65
void yac_cset_mask(int const *is_valid, int points_id)
Definition yac.c:1281
int const YAC_ACTION_COUPLING
data exchange
Definition yac.c:41
size_t yac_cget_grid_size(int located, int grid_id)
Definition yac.c:5068
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:990
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:1373
size_t yac_cget_points_size(int points_id)
Definition yac.c:5088