28#define DUMMY_VALUE (-1337.0)
30static int point_id = INT_MAX;
31double * field_out_data = NULL;
32double * field_in_data = NULL;
33size_t field_data_size = 0;
36static void utest_generate_icon_grid(
37 int comm_rank,
int comm_size,
char const * grid_dir);
38static void utest_generate_cube_grid(
int comm_rank,
int comm_size);
40static void utest_run_model_config(
41 int icon_to_cube,
int cube_to_icon,
int config_from_file,
42 char const * grid_dir) {
45 int global_rank, global_size;
46 MPI_Comm_rank(MPI_COMM_WORLD, &global_rank);
47 MPI_Comm_size(MPI_COMM_WORLD, &global_size);
52 if (global_size < 3) {
53 fprintf(stderr,
"Wrong number of processes (should be at least 3)\n");
57 int is_icon = global_rank < (global_size / 2);
64 int local_rank, local_size;
66 MPI_Comm_rank(local_comm, &local_rank);
67 MPI_Comm_size(local_comm, &local_size);
68 MPI_Comm_free(&local_comm);
71 if (point_id == INT_MAX) {
72 if (is_icon) utest_generate_icon_grid(local_rank, local_size, grid_dir);
73 else utest_generate_cube_grid(local_rank, local_size);
77 int field_out_id, field_in_id;
80 receives_data = cube_to_icon;
82 "icon_to_cube",
comp_id, &point_id, 1, 1,
"1",
85 "cube_to_icon",
comp_id, &point_id, 1, 1,
"1",
88 receives_data = icon_to_cube;
90 "cube_to_icon",
comp_id, &point_id, 1, 1,
"1",
93 "icon_to_cube",
comp_id, &point_id, 1, 1,
"1",
100 if (config_from_file) {
112 if (icon_to_cube && !is_icon)
114 "icon",
"icon",
"icon_to_cube",
115 "cube",
"cube",
"icon_to_cube",
118 if (cube_to_icon && is_icon)
120 "cube",
"cube",
"cube_to_icon",
121 "icon",
"icon",
"cube_to_icon",
130 if (global_rank == 0) {
132 fputs(config, config_file);
140 for (
int t = 0;
t < 10; ++
t) {
144 double *point_set_data[1];
145 double **collection_data[1] = {point_set_data};
147 yac_cput(field_out_id, 1, collection_data, &info, &err);
155 double *collection_data[1] = {field_in_data};
156 yac_cget(field_in_id, 1, collection_data, &info, &err);
160 if (fabs(field_in_data[i] - field_out_data[i]) > 1e-3)
173int main(
int argc,
char** argv) {
176 PUT_ERR(
"ERROR: missing grid file directory");
181 for (
int icon_to_cube = 0; icon_to_cube < 2; ++icon_to_cube)
182 for (
int cube_to_icon = 0; cube_to_icon < 2; ++cube_to_icon)
183 for (
int config_from_file = 0; config_from_file < 2; ++config_from_file)
184 utest_run_model_config(
185 icon_to_cube, cube_to_icon, config_from_file, argv[1]);
188 free(field_out_data);
192 MPI_Comm_rank(MPI_COMM_WORLD, &global_rank);
200static void utest_generate_icon_grid(
201 int comm_rank,
int comm_size,
char const * grid_dir) {
205 int * num_vertices_per_cell;
213 int * global_cell_id;
215 int * global_corner_id;
216 int * corner_core_mask;
218 char const * grid_filename =
220 strcpy(malloc(strlen(grid_dir) + 32), grid_dir),
221 "icon_grid_0030_R02B03_G.nc");
224 grid_filename, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
228 comm_rank, comm_size);
232 "icon", nbr_vertices, nbr_cells, num_vertices_per_cell,
247 field_out_data =
xmalloc(nbr_cells *
sizeof(*field_out_data));
248 field_data_size = nbr_cells;
249 for (
int i = 0;
i < nbr_cells; ++
i)
254 field_in_data =
xmalloc(nbr_cells *
sizeof(*field_in_data));
259 &num_vertices_per_cell,
269static void utest_generate_cube_grid(
int comm_rank,
int comm_size) {
273 unsigned nbr_vertices;
275 unsigned * num_vertices_per_cell;
283 int * corner_core_mask;
284 int * global_cell_id;
285 int * global_corner_id;
289 &x_vertices, &y_vertices, &x_cells,
290 &y_cells, &global_cell_id,
292 &corner_core_mask, comm_rank, comm_size);
296 "cube", nbr_vertices, nbr_cells, (
int*)num_vertices_per_cell,
307 field_out_data =
xmalloc(nbr_cells *
sizeof(*field_out_data));
308 for (
unsigned i = 0;
i < nbr_cells; ++
i)
313 field_in_data =
xmalloc(nbr_cells *
sizeof(*field_in_data));
314 field_data_size = nbr_cells;
316 free(corner_core_mask);
317 free(global_cell_id);
318 free(global_corner_id);
323 free(num_vertices_per_cell);
int const YAC_YAML_EMITTER_DEFAULT
emit to YAML format
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)
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)
double yac_test_harmonic(double lon, double lat)
char const * config_filename
void yac_cenddef_and_emit_config(int emit_flags, char **config)
void yac_cset_global_index(int const *global_index, int location, int grid_id)
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
int const YAC_LOCATION_CELL
void yac_ccleanup()
Clean-up default YAC instance (see Restarting YAC)
void yac_cfinalize()
Finalises YAC.
int const YAC_LOCATION_CORNER
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
int const YAC_TIME_UNIT_SECOND
void yac_cadd_interp_stack_config_conservative(int interp_stack_config_id, int order, int enforced_conserv, int partial_coverage, int normalisation)
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)
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)
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
void yac_cread_config_yaml(const char *yaml_filename)
void yac_cdef_calendar(int calendar)
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
int const YAC_PROLEPTIC_GREGORIAN
void yac_cset_mask(int const *is_valid, int points_id)
void yac_cfree_interp_stack_config(int interp_stack_config_id)
void yac_cget_interp_stack_config(int *interp_stack_config_id)
void yac_cdef_comp(char const *comp_name, int *comp_id)
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)
void yac_cdef_couple(char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag)
int const YAC_REDUCTION_TIME_NONE