34#define DUMMY_VALUE (-1337.0)
71 MPI_Comm comp_comm, char const * comp_name,
72 int base_point_id,
int regional_point_id,
char const * config_dir);
75 char const * comp_pair_names[2],
int point_ids[2],
int nbr_cells[2],
76 int local_comp_indices[2],
char const * config_dir);
78static struct grid_data utest_generate_icon_grid_data(
79 MPI_Comm comm, char const * grid_dir);
80static struct grid_data utest_generate_cube_grid_data(MPI_Comm comm);
81static struct grid_data utest_generate_mpiom_grid_data(
82 MPI_Comm comm, char const * grid_dir);
85static void utest_def_default_fields(
87 int * in_field_ids,
int * out_field_id);
109int main(
int argc,
char** argv) {
110 MPI_Init(NULL, NULL);
111 xt_initialize(MPI_COMM_WORLD);
113 int global_rank, global_size;
114 MPI_Comm_rank(MPI_COMM_WORLD, &global_rank);
115 MPI_Comm_size(MPI_COMM_WORLD, &global_size);
118 fprintf(stderr,
"Wrong number of arguments (should be 4)\n");
122 if (global_size != 10) {
123 fprintf(stderr,
"Wrong number of processes (should be 10)\n");
129 if (global_rank > 7) {
138 char const * global_comp_names[] = {
"comp_a",
"comp_b",
"comp_c",
"dummy"};
139 char const * local_comp_names[2];
142 switch (global_rank) {
145 local_comp_names[0] = global_comp_names[0];
150 local_comp_names[0] = global_comp_names[1];
155 local_comp_names[0] = global_comp_names[2];
160 local_comp_names[0] = global_comp_names[0];
161 local_comp_names[1] = global_comp_names[1];
166 local_comp_names[0] = global_comp_names[0];
167 local_comp_names[1] = global_comp_names[2];
172 local_comp_names[0] = global_comp_names[1];
173 local_comp_names[1] = global_comp_names[2];
179 local_comp_names[0] = global_comp_names[3];
192 malloc(strlen(argv[1]) + 32), argv[1]),
"coupling_test3_default_c.yaml");
197 int default_comp_ids[2];
198 int default_num_comps = num_local_comps;
199 yac_cdef_comps(local_comp_names, default_num_comps, default_comp_ids);
201 MPI_Comm default_comp_comms[2];
202 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
204 default_comp_ids[comp_idx], &(default_comp_comms[comp_idx]));
208 int regional_grid_id = -1, regional_point_id = -1;
209 int nbr_vertices_regional = 0;
212 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
213 switch(local_comp_names[comp_idx][5]) {
215 comp_grid_data[comp_idx] =
216 utest_generate_icon_grid_data(default_comp_comms[comp_idx], argv[2]);
220 comp_grid_data[comp_idx] =
221 utest_generate_cube_grid_data(default_comp_comms[comp_idx]);
225 comp_grid_data[comp_idx] =
226 utest_generate_mpiom_grid_data(default_comp_comms[comp_idx], argv[3]);
233 comp_grid_data[comp_idx].
name,
240 &(grid_ids[comp_idx]));
255 grid_ids[comp_idx], comp_grid_data[comp_idx].
nbr_cells,
258 if (comp_grid_data[comp_idx].
cell_mask != NULL)
264 if ((global_rank == 0) || (global_rank == 1) || (global_rank == 2)) {
267 double regional_coord_x[] = {
268 -20,-18,-16,-14,-12,-10, -8, -6, -4, -2,
269 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
270 double regional_coord_y[] = {
271 -20,-18,-16,-14,-12,-10, -8, -6, -4, -2,
272 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
273 int num_vertices_regional[2] =
274 {
sizeof(regional_coord_x) /
sizeof(regional_coord_x[0]),
275 sizeof(regional_coord_y) /
sizeof(regional_coord_y[0])};
276 nbr_vertices_regional =
277 num_vertices_regional[0] * num_vertices_regional[1];
279 for (
int i = 0;
i < num_vertices_regional[0]; ++
i)
280 regional_coord_x[i] *=
YAC_RAD;
281 for (
int i = 0;
i < num_vertices_regional[1]; ++
i)
282 regional_coord_y[i] *=
YAC_RAD;
284 "regional_grid", num_vertices_regional,
cyclic,
285 regional_coord_x, regional_coord_y, ®ional_grid_id);
289 regional_coord_x, regional_coord_y, ®ional_point_id);
296 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
297 yac_intra_infos[comp_idx] =
298 utest_setup_intra_comp_yac(
299 default_comp_comms[comp_idx], local_comp_names[comp_idx],
303 int default_in_field_ids[2][2];
304 int default_out_field_ids[2];
306 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
307 utest_def_default_fields(
308 default_comp_ids[comp_idx], local_comp_names[comp_idx],
310 &(default_out_field_ids[comp_idx]));
315 if (strcmp(start_datetime,
"1800-01-01T00:00:00.000"))
316 PUT_ERR(
"error in yac_cget_start_datetime");
317 free(start_datetime);
320 if (strcmp(end_datetime,
"2100-01-01T00:00:00.000"))
321 PUT_ERR(
"error in yac_cget_end_datetime");
327 if (global_rank == 0) {
328 char yaml_filename_enddef[] =
"coupling_test3_default_c_enddef.yaml";
330 PUT_ERR(
"error in writing config file");
331 unlink(yaml_filename_enddef);
337 for (
int i = 0, k = 0;
i < 3; ++
i) {
339 int local_comp_idx[2];
341 local_comp_idx[0] = INT_MAX;
342 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
343 if (!strcmp(global_comp_names[i], local_comp_names[comp_idx]))
344 local_comp_idx[0] = comp_idx;
346 for (
int j = i + 1; j < 3; ++j, ++k) {
348 local_comp_idx[1] = INT_MAX;
349 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
350 if (!strcmp(global_comp_names[j], local_comp_names[comp_idx]))
351 local_comp_idx[1] = comp_idx;
353 char const * comp_pair_names[2] =
354 {global_comp_names[
i], global_comp_names[j]};
356 {comp_grid_data[0].nbr_cells, comp_grid_data[1].nbr_cells};
358 yac_comp_pair_infos[k] =
359 utest_setup_comp_pair_yac(
367 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
371 sprintf(field_name,
"%s_out", local_comp_names[comp_idx]);
373 default_out_field_ids[comp_idx]);
374 if (strcmp(timestep_string,
"PT01.000S"))
375 PUT_ERR(
"error in yac_cget_model_timestep_id");
377 default_out_field_ids[comp_idx]);
379 PUT_ERR(
"error in yac_cget_collection_size_from_field_id");
382 double * out_field_data[2];
383 double * in_field_data[2];
384 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
385 out_field_data[comp_idx] =
387 for (
int i = 0;
i < comp_grid_data[comp_idx].nbr_cells; ++
i)
388 out_field_data[comp_idx][i] =
391 comp_grid_data[comp_idx].x_cells[i],
393 in_field_data[comp_idx] =
398 for (
int t = 0;
t < 10; ++
t) {
400 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
402 int id = default_out_field_ids[comp_idx];
403 double *point_set_data[1];
404 double **collection_data[1] = {point_set_data};
405 point_set_data[0] = out_field_data[comp_idx];
409 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
410 for (
int field_idx = 0; field_idx < 2; ++field_idx) {
412 int id = default_in_field_ids[comp_idx][field_idx];
413 double *collection_data[1] = {in_field_data[comp_idx]};
415 for (
int i = 0;
i < comp_grid_data[comp_idx].nbr_cells; ++
i)
424 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
426 if (yac_intra_infos[comp_idx].is_comp_root) {
427 int out_info, in_info, err;
428 int out_id = yac_intra_infos[comp_idx].out_field_id;
429 double *out_point_set_data[1];
430 double **out_collection_data[1] = {out_point_set_data};
431 out_point_set_data[0] = in_field_data[comp_idx];
433 int in_id = yac_intra_infos[comp_idx].in_field_id;
434 double *in_collection_data[1] = {
435 xmalloc(nbr_vertices_regional *
sizeof(
double))};
436 for (
int i = 0;
i < nbr_vertices_regional; ++
i)
440 out_id, in_id, 1, out_collection_data, in_collection_data,
441 &out_info, &in_info, &err);
443 free(in_collection_data[0]);
446 int id = yac_intra_infos[comp_idx].out_field_id;
447 double *point_set_data[1];
448 double **collection_data[1] = {point_set_data};
449 point_set_data[0] = in_field_data[comp_idx];
456 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx) {
457 free(out_field_data[comp_idx]);
458 free(in_field_data[comp_idx]);
459 utest_grid_data_free(comp_grid_data[comp_idx]);
464 for (
int i = 0;
i < 3; ++
i) {
467 if (yac_comp_pair_infos[i].
yac_id == INT_MAX)
continue;
470 if ((yac_comp_pair_infos[i].
nbr_cells[0] > 0) &&
471 (yac_comp_pair_infos[i].
nbr_cells[1] > 0)) {
473 double * out_field_data[2];
474 double * in_field_data[2];
476 for (
int j = 0; j < 2; ++j) {
477 int nbr_cells = yac_comp_pair_infos[
i].nbr_cells[j];
479 for (
int k = 0; k <
nbr_cells; ++k) out_field_data[j][k] = 0.0;
484 for (
int j = 0; j < 2; ++j) {
486 int out_info, in_info, err;
487 int out_id = yac_comp_pair_infos[
i].out_field_ids[j];
488 double *out_point_set_data[1];
489 double **out_collection_data[1] = {out_point_set_data};
490 out_point_set_data[0] = out_field_data[j];
492 int in_id = yac_comp_pair_infos[
i].in_field_ids[j^1];
493 double *in_collection_data[1] = {in_field_data[j^1]};
496 out_id, in_id, 1, out_collection_data, in_collection_data,
497 &out_info, &in_info, &err);
499 for (
int j = 0; j < 2; ++j) {
500 free(out_field_data[j]);
501 free(in_field_data[j]);
506 for (
int j = 0; j < 2; ++j) {
509 if (yac_comp_pair_infos[i].
nbr_cells[j] > 0) {
511 int nbr_cells = yac_comp_pair_infos[
i].nbr_cells[j];
515 for (
int j = 0; j <
nbr_cells; ++j) out_field_data[j] = 0.0;
518 int id = yac_comp_pair_infos[
i].out_field_ids[j];
519 double *point_set_data[1];
520 double **collection_data[1] = {point_set_data};
521 point_set_data[0] = out_field_data;
524 free(out_field_data);
528 int nbr_cells = yac_comp_pair_infos[
i].nbr_cells[j^1];
533 int id = yac_comp_pair_infos[
i].in_field_ids[j^1];
534 double *collection_data[1] = {in_field_data};
546 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
547 MPI_Comm_free(&(default_comp_comms[comp_idx]));
550 for (
int i = 0;
i < 3; ++
i)
551 if (yac_comp_pair_infos[i].
yac_id != INT_MAX)
553 for (
int comp_idx = 0; comp_idx < num_local_comps; ++comp_idx)
565 MPI_Comm comp_comm, char const * comp_name,
566 int base_point_id,
int regional_point_id,
char const * config_dir) {
573 "%scoupling_test3_%s_intra.yaml", config_dir, comp_name);
578 MPI_Comm_rank(comp_comm, &comp_rank);
582 char const * comp_names[2] = {comp_name,
"comp_regional"};
583 int num_comps = (regional_point_id != -1)?2:1;
585 if (regional_point_id != -1)
593 "base_to_regional",
comp_ids[0], &base_point_id, 1, 1,
"1",
595 if (regional_point_id != -1)
597 "base_to_regional",
comp_ids[1], ®ional_point_id, 1, 1,
"1",
600 char yaml_filename_sync[256];
602 yaml_filename_sync,
sizeof(yaml_filename_sync),
603 "coupling_test3_c_%s_intra_sync.yaml", comp_name);
604 int include_definitions = 0;
611 if (comp_rank == 0) {
613 PUT_ERR(
"error in yac_cset_config_output_file_instance");
614 unlink(yaml_filename_sync);
618 if (strcmp(start_datetime,
"1800-01-01T00:00:00.000"))
619 PUT_ERR(
"error in yac_cget_start_datetime_instance");
620 free(start_datetime);
623 if (strcmp(end_datetime,
"2100-01-01T00:00:00.000"))
624 PUT_ERR(
"error in yac_cget_end_datetime_instance");
627 char json_filename_enddef[256];
629 json_filename_enddef,
sizeof(yaml_filename_sync),
630 "coupling_test3_c_%s_intra_enddef.json", comp_name);
638 if (comp_rank == 0) {
640 PUT_ERR(
"error in yac_cset_config_output_file_instance");
641 unlink(json_filename_enddef);
646 yac_intra_info.is_comp_root = regional_point_id != -1;
647 yac_intra_info.out_field_id = field_ids[0];
648 yac_intra_info.in_field_id = field_ids[1];
652 if (strcmp(timestep_string,
"PT01.000S"))
653 PUT_ERR(
"error in yac_cget_model_timestep_id");
656 PUT_ERR(
"error in yac_cget_collection_size_from_field_id");
657 return yac_intra_info;
661 char const * comp_pair_names[2],
int point_ids[2],
int nbr_cells[2],
662 int local_comp_indices[2],
char const * config_dir) {
664 if ((local_comp_indices[0] == INT_MAX) &&
665 (local_comp_indices[1] == INT_MAX))
669 MPI_Comm comp_pair_comm;
671 (
char const *[]){comp_pair_names[0], comp_pair_names[1]}, 2,
674 char * yaml_file_name =
676 strlen(config_dir) + strlen(comp_pair_names[0]) +
677 strlen(comp_pair_names[1]) + 32);
678 sprintf(yaml_file_name,
"%scoupling_test3_%s_%s.yaml",
679 config_dir, comp_pair_names[0], comp_pair_names[1]);
685 free(yaml_file_name);
689 char const * comp_names[2];
692 for (
int i = 0;
i < 2; ++
i)
693 if (local_comp_indices[i] != INT_MAX)
694 comp_names[num_comps++] = comp_pair_names[
i];
698 for (
int i = 0, k = 0;
i < 2; ++
i) {
700 int comp_idx = local_comp_indices[
i];
701 if (comp_idx == INT_MAX)
continue;
704 for (
int j = 0; j < 2; ++j) {
706 sprintf(field_name,
"comp_%c_out", comp_pair_names[j][5]);
708 field_name,
comp_ids[k], &(point_ids[comp_idx]), 1, 1,
"1",
717 MPI_Comm_free(&comp_pair_comm);
722 for (
int i = 0;
i < 2; ++
i) {
723 int comp_idx = local_comp_indices[
i];
724 if (comp_idx == INT_MAX) {
725 yac_info.nbr_cells[
i] = 0;
726 yac_info.out_field_ids[
i] = INT_MAX;
727 yac_info.in_field_ids[
i] = INT_MAX;
731 for (
int j = 0; j < 2; ++j) {
739 yac_info.out_field_ids[
i] = field_ids[
i][j];
742 yac_info.in_field_ids[
i] = field_ids[
i][j];
746 if (roles[0] == roles[1])
PUT_ERR(
"roles should not match");
753static void utest_def_default_fields(
757 int num_in_fields = 0;
759 for (
int i = 0;
i < 3; ++
i) {
760 char const *
field_names[3] = {
"comp_a_out",
"comp_b_out",
"comp_c_out"};
767 if (comp_name[5] == curr_field_name[5])
774static struct grid_data utest_generate_icon_grid_data(
777 int comm_rank, comm_size;
778 MPI_Comm_rank(comm, &comm_rank);
779 MPI_Comm_size(comm, &comm_size);
783 static char const * icon_grid_name =
"icon_grid";
786 char * grid_filename =
789 malloc(strlen(grid_dir) + 32), grid_dir),
"icon_grid_R02B01.nc");
808static struct grid_data utest_generate_cube_grid_data(MPI_Comm
comm) {
810 int comm_rank, comm_size;
811 MPI_Comm_rank(comm, &comm_rank);
812 MPI_Comm_size(comm, &comm_size);
816 static char const * cube_grid_name =
"cube_grid";
835static struct grid_data utest_generate_mpiom_grid_data(
838 int comm_rank, comm_size;
839 MPI_Comm_rank(comm, &comm_rank);
840 MPI_Comm_size(comm, &comm_size);
844 static char const * mpiom_grid_name =
"mpiom_grid";
847 char * grid_filename =
850 malloc(strlen(grid_dir) + 32), grid_dir),
"GR30_lsm.nc");
char const * field_names[8]
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)
int yac_file_exists(const char *filename)
Check whether a file exists.
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)
void yac_read_part_mpiom_grid_information(const char *filename, int *num_vertices, int *num_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)
int * num_vertices_per_cell
double yac_test_harmonic(double lon, double lat)
int const YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF
after end of definitions
char * yac_cget_start_datetime_instance(int yac_instance_id)
void yac_cset_global_index(int const *global_index, int location, int grid_id)
int yac_cget_role_from_field_id(int field_id)
char * yac_cget_end_datetime_instance(int yac_instance_id)
int const YAC_LOCATION_CELL
const char * yac_cget_timestep_from_field_id(int field_id)
void yac_csync_def_instance(int yac_instance_id)
void yac_cfinalize()
Finalises YAC.
void yac_cenddef_instance(int yac_instance_id)
void yac_cread_config_yaml_instance(int yac_instance_id, const char *yaml_filename)
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)
void yac_cdef_comp_instance(int yac_instance_id, char const *comp_name, int *comp_id)
int yac_cget_collection_size_from_field_id(int field_id)
void yac_cdef_grid_reg2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
void yac_cset_config_output_file_instance(int yac_instance_id, const char *filename, int fileformat, int sync_location, int include_definitions)
void yac_cdef_points_reg2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
void yac_cget_comps_comm(const char **comp_names, int num_comps, MPI_Comm *comps_comm)
void yac_cinit_comm_instance(MPI_Comm comm, int *yac_instance_id)
char * yac_cget_start_datetime(void)
int const YAC_CONFIG_OUTPUT_FORMAT_YAML
int const YAC_TIME_UNIT_SECOND
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_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)
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)
char * yac_cget_end_datetime(void)
void yac_cdef_calendar(int calendar)
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
int const YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF
after synchronization of definition
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
int const YAC_PROLEPTIC_GREGORIAN
void yac_cset_mask(int const *is_valid, int points_id)
void yac_ccleanup_instance(int yac_instance_id)
Clean-up a YAC instance (see Restarting YAC)
int const YAC_CONFIG_OUTPUT_FORMAT_JSON
void yac_cinit_dummy(void)
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_comps_instance(int yac_instance_id, char const **comp_names, int num_comps, int *comp_ids)