21#define YAC_RAD (0.01745329251994329576923690768489)
33#define FRAC_MASK_VALUE (1337.0)
35static void utest_aggregation();
36static void utest_changing_frac_mask();
37static void utest_self_coupling();
43 utest_changing_frac_mask();
44 utest_self_coupling();
51static void utest_init_ref_recv_field(
54 for (
int i = 0;
i < 3; ++
i)
57 ref_recv_field[i][j][k] = 0.0;
60 ref_recv_field[3][j][k] = DBL_MAX;
61 ref_recv_field[4][j][k] = -DBL_MAX;
66static void utest_init_temp_frac_mask(
72 temp_frac_mask[i][j][0][k] = 0.0;
75static void utest_aggregation() {
82 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
83 MPI_Comm_size ( MPI_COMM_WORLD, &size );
86 fputs(
"wrong number of processes (has to be 2)\n", stderr);
90 int is_target =
rank == 1;
99 (is_target)?
"target_grid":
"source_grid", (int[2]){3,3}, (
int[2]){0,0},
113 {
"time_op_accu_field",
115 "time_op_none_field",
117 "time_op_max_field"};
118 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
122 &field_ids[field_idx]);
124 (is_target)?
"target_comp":
"source_comp",
125 (is_target)?
"target_grid":
"source_grid",
130 int interp_stack_nnn;
142 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx)
144 "source_comp",
"source_grid",
fieldName[field_idx],
145 "target_comp",
"target_grid",
fieldName[field_idx],
147 interp_stack_nnn, 0, 0);
153 {{{ 1, 2, 3, 4, 5, 6, 7, 8, 9}},
154 {{10,11,12,13,14,15,16,17,18}},
155 {{19,20,21,22,23,24,25,26,27}}};
157 {{{{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}},
158 {{1.0, 1.0, 0.7, 0.7, 0.5, 0.3, 0.3, 0.0, 0.0}},
159 {{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0}}},
160 {{{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0}},
161 {{0.7, 0.7, 0.7, 0.7, 0.5, 0.3, 0.3, 0.3, 0.3}},
162 {{1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0}}},
163 {{{0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0}},
164 {{0.3, 0.3, 0.3, 0.3, 0.5, 0.7, 0.7, 0.7, 0.7}},
165 {{1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}},
166 {{{0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}},
167 {{0.0, 0.0, 0.3, 0.3, 0.5, 0.7, 0.7, 1.0, 1.0}},
168 {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}}};
171 utest_init_ref_recv_field(ref_recv_field);
172 utest_init_temp_frac_mask(temp_frac_mask);
179 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
190 if (
info != ref_send_info)
PUT_ERR(
"error in yac_cput_: wrong info");
196 double scale = ((
t == 0)?1.0:0.25);
201 double frac_send_field_value =
202 frac_mask_value * send_field[
i][0][j];
204 if (frac_mask_value != 0.0) {
207 ref_recv_field[0][
i][j] += frac_send_field_value;
208 temp_frac_mask[0][
i][0][j] += frac_mask_value * scale;
211 ref_recv_field[1][
i][j] += frac_send_field_value * scale;
212 temp_frac_mask[1][
i][0][j] += frac_mask_value * scale;
215 if (ref_recv_field[3][i][j] > frac_send_field_value) {
216 ref_recv_field[3][
i][j] = frac_send_field_value;
217 temp_frac_mask[3][
i][0][j] = frac_mask_value;
221 if (ref_recv_field[4][i][j] < frac_send_field_value) {
222 ref_recv_field[4][
i][j] = frac_send_field_value;
223 temp_frac_mask[4][
i][0][j] = frac_mask_value;
229 ref_recv_field[2][
i][j] = frac_send_field_value;
230 temp_frac_mask[2][
i][0][j] = frac_mask_value;
238 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
244 recv_field[j][k] = -1;
253 if (
info != ref_recv_info)
PUT_ERR(
"error in yac_cget_: wrong info");
259 if (temp_frac_mask[field_idx][j][0][k] != 0.0) {
260 if (fabs(recv_field[j][k] -
261 (ref_recv_field[field_idx][j][k] /
262 temp_frac_mask[field_idx][j][0][k])) > 1e-6)
263 PUT_ERR(
"error in yac_cget_: wrong recv_field (unmasked)");
266 PUT_ERR(
"error in yac_cget_: wrong recv_field (masked)");
273 if (recv_field[j][k] != -1)
274 PUT_ERR(
"error in yac_cget_: wrong recv_field");
283 send_field[i][0][j] += i - 1;
287 utest_init_ref_recv_field(ref_recv_field);
288 utest_init_temp_frac_mask(temp_frac_mask);
295static void utest_changing_frac_mask() {
302 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
303 MPI_Comm_size ( MPI_COMM_WORLD, &size );
306 fputs(
"wrong number of processes (has to be 2)\n", stderr);
310 int is_target =
rank == 1;
320 "target_grid_2", (
int[2]){2,2}, (
int[2]){0,0},
325 "source_grid_2", (
int[2]){3,3}, (
int[2]){0,0},
346 (is_target)?
"target_comp":
"source_comp",
347 (is_target)?
"target_grid_2":
"source_grid_2",
351 int interp_stack_nnn;
358 "source_comp",
"source_grid_2",
"field",
359 "target_comp",
"target_grid_2",
"field",
361 interp_stack_nnn, 0, 0);
366 enum {NUM_TIMESTEP = 5, SRC_FIELD_SIZE = 4};
368 double send_field[NUM_TIMESTEP][SRC_FIELD_SIZE] =
369 {{ 1, 2, 3, 4}, {10,11,12,13}, {20,21,22,23},
370 {30,31,32,33}, {40,41,42,43}};
371 double frac_mask[NUM_TIMESTEP][SRC_FIELD_SIZE] =
372 {{1.0,1.0,0.0,0.0}, {1.0,0.0,1.0,0.0}, {1.0,1.0,0.0,0.0},
373 {1.0,1.0,1.0,1.0}, {0.0,0.0,0.0,0.0}};
375 for (
int t = 0;
t < NUM_TIMESTEP; ++
t) {
388 double const weight = 0.25;
389 double ref_recv_field = 0.0;
390 double frac_weight_sum = 0.0;
391 for (
int i = 0;
i < SRC_FIELD_SIZE; ++
i) {
392 ref_recv_field += send_field[
t][
i] * frac_mask[
t][
i] * weight;
393 frac_weight_sum += weight * frac_mask[
t][
i];
396 (frac_weight_sum < 1.e-9)?
404 PUT_ERR(
"error in yac_cget_: wrong info");
406 if (fabs(recv_field - ref_recv_field) > 1.e-9)
407 PUT_ERR(
"error in yac_cget_: wrong recv_field");
414static void utest_self_coupling() {
420 int comm_rank, comm_size;
421 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
422 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
424 if (comm_size != 2) {
425 fputs(
"wrong number of processes (has to be 2)\n", stderr);
429 int is_comp_b = (comm_rank == 1);
434 enum { NX = 3, NY = 3, NUM_CELLS = NX * NY };
435 double x_verts[NX + 1], y_verts[NY + 1];
436 double x_cells[NX], y_cells[NY];
437 for (
int i = 0;
i <= NX; ++
i) x_verts[i] = (
double)
i *
YAC_RAD;
438 for (
int j = 0; j <= NY; ++j) y_verts[j] = (
double)j *
YAC_RAD;
439 for (
int i = 0;
i < NX; ++
i) x_cells[i] = (0.5 + i) *
YAC_RAD;
440 for (
int j = 0; j < NY; ++j) y_cells[j] = (0.5 + j) *
YAC_RAD;
444 is_comp_b ?
"grid_b" :
"grid_a",
445 (int[2]){NX + 1, NY + 1}, (
int[2]){0, 0},
451 int src_field_id = -1, tgt_field_id = -1;
454 "src_field",
comp_id, &point_id, 1, 1,
"1",
457 "tgt_field",
comp_id, &point_id, 1, 1,
"1",
470 "comp_a",
"grid_a",
"src_field",
471 "comp_a",
"grid_a",
"tgt_field",
479 double src_data[NUM_CELLS], tgt_data[NUM_CELLS];
480 for (
int i = 0;
i < NUM_CELLS; ++
i) {
481 src_data[
i] = (double)i;
486 src_field_id, tgt_field_id, 1,
487 src_data, tgt_data, &send_info, &recv_info, &ierr);
489 PUT_ERR(
"wrong send_info in self-coupling exchange");
491 PUT_ERR(
"wrong recv_info in self-coupling exchange");
493 PUT_ERR(
"error in self-coupling exchange");
494 for (
int i = 0;
i < NUM_CELLS; ++
i)
495 if (tgt_data[i] != src_data[i])
496 PUT_ERR(
"wrong value in self-coupled tgt_field");
int const YAC_REDUCTION_TIME_AVERAGE
void yac_cenable_field_frac_mask(const char *comp_name, const char *grid_name, const char *field_name, double frac_mask_fallback_value)
void yac_cget_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
Definition of job start and end datetime for the default YAC instance.
int const YAC_LOCATION_CELL
int const YAC_REDUCTION_TIME_MINIMUM
void yac_cput_frac_(int const field_id, int const collection_size, double *send_field, double *send_frac_mask, int *info, int *ierr)
void yac_ccleanup()
Clean-up default YAC instance (see Restarting YAC)
int const YAC_REDUCTION_TIME_MAXIMUM
void yac_cfinalize()
Finalises YAC.
int const YAC_LOCATION_CORNER
void yac_cexchange_(int const send_field_id, int const recv_field_id, int const collection_size, double *send_field, double *recv_field, int *send_info, int *recv_info, int *ierr)
int const YAC_REDUCTION_TIME_ACCUMULATE
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)
int const YAC_TIME_UNIT_SECOND
int const YAC_ACTION_NONE
no data exchanges
void yac_cdef_calendar(int calendar)
int const YAC_ACTION_REDUCTION
data reduction, but data exchange
int const YAC_PROLEPTIC_GREGORIAN
int const YAC_ACTION_COUPLING
data exchange
void yac_cfree_interp_stack_config(int interp_stack_config_id)
void yac_cadd_interp_stack_config_nnn(int interp_stack_config_id, int type, size_t n, double max_search_distance, double scale)
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