18#define YAC_RAD (0.01745329251994329576923690768489)
20static void utest_run_comp_a(
char const * config_dir);
21static void utest_run_comp_b(
char const * config_dir);
23int main(
int argc,
char** argv) {
26 xt_initialize(MPI_COMM_WORLD);
29 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
32 PUT_ERR(
"ERROR: missing config file directory");
44 MPI_Comm_free(&yac_comm);
48 utest_run_comp_a(argv[1]);
51 utest_run_comp_b(argv[1]);
54 PUT_ERR(
"wrong number of processes (has to be 3)");
63static void utest_run_comp_a(
char const * config_dir) {
69 char * json_filename =
72 malloc(strlen(config_dir) + 32), config_dir),
"coupling_test6.json");
88 MPI_Allgather(sendbuf, 1, MPI_CHAR, recvbuf, 1, MPI_CHAR, pair_comm);
90 if ((recvbuf[0] !=
'A') || (recvbuf[1] !=
'B'))
91 PUT_ERR(
"ERROR in yac_cget_comps_instance");
93 MPI_Comm_free(&pair_comm);
98 double x_vertices[4] =
100 double y_vertices[4] =
135 int cell_mask_id, vertex_mask_id;
149 int multi_field_point_ids[2], multi_field_mask_ids[2];
152 multi_field_mask_ids[0] = cell_mask_id;
153 multi_field_mask_ids[1] = vertex_mask_id;
155 "A_to_B_multi",
comp_id, multi_field_point_ids, multi_field_mask_ids,
163 const char* src_comp_name;
165 const char* src_field_name;
167 "comp_B",
"grid_B",
"A_to_B_tgt",
170 if (strcmp(src_comp_name,
"comp_A") ||
172 strcmp(src_field_name,
"A_to_B_src"))
173 PUT_ERR(
"ERROR in yac_cget_field_source");
178 double send_field_data[2] = {3.0, 4.0};
179 double * send_field_[1] = {&send_field_data[0]};
180 double ** send_field[1] = {&send_field_[0]};
185 double send_cell_field_data[2] = {3.0, 4.0};
186 double send_vertex_field_data[4] = {3.0, 4.0, 5.0, 6.0};
187 double * send_field_[2] =
188 {&send_cell_field_data[0], &send_vertex_field_data[0]};
189 double ** send_field[1] = {&send_field_[0]};
198static void utest_run_comp_b(
char const * config_dir) {
205 char * json_filename =
208 malloc(strlen(config_dir) + 32), config_dir),
"coupling_test6.json");
223 char * sendbuf =
"B";
225 MPI_Allgather(sendbuf, 1, MPI_CHAR, recvbuf, 1, MPI_CHAR, pair_comm);
226 if ((recvbuf[0] !=
'A') || (recvbuf[1] !=
'B'))
227 PUT_ERR(
"ERROR in yac_cget_comps_comm");
229 MPI_Comm_free(&pair_comm);
231 int nbr_vertices[2] = {2,3};
251 "grid_B", nbr_vertices,
cyclic, x_vertices, y_vertices, &grid_id_B);
253 int nbr_cells[2] = {1,2};
254 double x_cells[1] = {0.0 *
YAC_RAD};
277 const char* src_comp_name;
279 const char* src_field_name;
284 if (strcmp(src_comp_name,
"comp_A") ||
286 strcmp(src_field_name,
"A_to_B_src"))
287 PUT_ERR(
"ERROR in yac_cget_field_source");
291 double recv_field_data[2] = {-1.0, -1.0};
292 double * recv_field[1] = {&recv_field_data[0]};
295 if ((recv_field_data[0] != -2.0) || (recv_field_data[1] != -2.0))
296 PUT_ERR(
"ERROR: wrong results from multi field exchange");
301 MPI_Comm internal_comm;
305 int internal_instance_id;
311 malloc(strlen(config_dir) + 32), config_dir),
312 "coupling_test6_local.yaml");
317 int internal_comp_id;
320 int nbr_vertices[2] = {2,3};
344 "grid_C", nbr_vertices,
cyclic, x_vertices, y_vertices, &grid_id_C);
350 x_vertices, y_vertices, &point_id_C);
353 int field_id_src, field_id_tgt;
355 "B_to_C", internal_comp_id, &point_id_B, 1, 1,
"1",
358 "B_to_C", internal_comp_id, &point_id_C, 1, 1,
"1",
368 double * send_field_[1] = {&recv_field_data[0]};
369 double ** send_field[1] = {&send_field_[0]};
370 double recv_field_data_C[6] = {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0};
371 double * recv_field[1] = {&recv_field_data_C[0]};
374 &send_info, &recv_info, &
ierror);
376 double ref_recv_field_data_C[6] = {4.0, 4.0, 4.0, 4.0, 3.0, 3.0};
377 for (
int i = 0;
i < 6; ++
i)
378 if (recv_field_data_C[i] != ref_recv_field_data_C[i])
383 MPI_Comm_free(&internal_comm);
int nbr_vertices_per_cell[NBR_CELLS]
char const src_grid_name[]
void yac_cinit_comm_dummy(MPI_Comm comm)
void yac_cdef_field_mask(char const *name, int const comp_id, int const *point_ids, int const *mask_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
int const YAC_LOCATION_CELL
void yac_cdef_grid_curve2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
void yac_cread_config_json(const char *yaml_filename)
void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const **group_names, MPI_Comm *group_comms)
void yac_cget_field_source(const char *tgt_comp_name, const char *tgt_grid_name, const char *tgt_field_name, const char **src_comp_name, const char **src_grid_name, const char **src_field_name)
void yac_cfinalize_instance(int yac_instance_id)
Finalises YAC.
void yac_cfinalize()
Finalises YAC.
void yac_cenddef_instance(int yac_instance_id)
const char * yac_cget_mpi_handshake_group_name(void)
Retrieve the MPI handshake group name used by YAC.
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)
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_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)
void yac_cread_config_json_instance(int yac_instance_id, const char *yaml_filename)
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_cdef_calendar(int calendar)
int const YAC_PROLEPTIC_GREGORIAN
void yac_cget_comps_comm_instance(int yac_instance_id, char const **comp_names, int num_comps, MPI_Comm *comps_comm)
void yac_cget_field_source_instance(int yac_instance_id, const char *tgt_comp_name, const char *tgt_grid_name, const char *tgt_field_name, const char **src_comp_name, const char **src_grid_name, const char **src_field_name)
void yac_cdef_mask(int const grid_id, int const nbr_points, int const located, int const *is_valid, int *mask_id)
void yac_cdef_points_curve2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
void yac_ccleanup_instance(int yac_instance_id)
Clean-up a YAC instance (see Restarting YAC)
void yac_cinit_instance(int *yac_instance_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)
static int default_instance_id