21#define YAC_RAD (0.01745329251994329576923690768489)
33#define FRAC_MASK_VALUE (1337.0)
35static void utest_aggregation();
36static void utest_changing_frac_mask();
42 utest_changing_frac_mask();
52 for (
int i = 0; i < 3; ++i)
55 ref_recv_field[i][j][k] = 0.0;
58 ref_recv_field[3][j][k] = DBL_MAX;
59 ref_recv_field[4][j][k] = -DBL_MAX;
70 temp_frac_mask[i][j][0][k] = 0.0;
73static void utest_aggregation() {
80 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
81 MPI_Comm_size ( MPI_COMM_WORLD, &size );
84 fputs(
"wrong number of processes (has to be 2)\n", stderr);
88 int is_target =
rank == 1;
97 (is_target)?
"target_grid":
"source_grid", (int[2]){3,3}, (
int[2]){0,0},
111 {
"time_op_accu_field",
113 "time_op_none_field",
115 "time_op_max_field"};
116 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
120 &field_ids[field_idx]);
122 (is_target)?
"target_comp":
"source_comp",
123 (is_target)?
"target_grid":
"source_grid",
128 int interp_stack_nnn;
140 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx)
142 "source_comp",
"source_grid",
fieldName[field_idx],
143 "target_comp",
"target_grid",
fieldName[field_idx],
145 interp_stack_nnn, 0, 0);
151 {{{ 1, 2, 3, 4, 5, 6, 7, 8, 9}},
152 {{10,11,12,13,14,15,16,17,18}},
153 {{19,20,21,22,23,24,25,26,27}}};
155 {{{{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}},
156 {{1.0, 1.0, 0.7, 0.7, 0.5, 0.3, 0.3, 0.0, 0.0}},
157 {{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0}}},
158 {{{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0}},
159 {{0.7, 0.7, 0.7, 0.7, 0.5, 0.3, 0.3, 0.3, 0.3}},
160 {{1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0}}},
161 {{{0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0}},
162 {{0.3, 0.3, 0.3, 0.3, 0.5, 0.7, 0.7, 0.7, 0.7}},
163 {{1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}},
164 {{{0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}},
165 {{0.0, 0.0, 0.3, 0.3, 0.5, 0.7, 0.7, 1.0, 1.0}},
166 {{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}}};
177 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
188 if (info != ref_send_info)
PUT_ERR(
"error in yac_cput_: wrong info");
194 double scale = ((
t == 0)?1.0:0.25);
199 double frac_send_field_value =
200 frac_mask_value * send_field[
i][0][j];
202 if (frac_mask_value != 0.0) {
205 ref_recv_field[0][
i][j] += frac_send_field_value;
206 temp_frac_mask[0][
i][0][j] += frac_mask_value * scale;
209 ref_recv_field[1][
i][j] += frac_send_field_value * scale;
210 temp_frac_mask[1][
i][0][j] += frac_mask_value * scale;
213 if (ref_recv_field[3][i][j] > frac_send_field_value) {
214 ref_recv_field[3][
i][j] = frac_send_field_value;
215 temp_frac_mask[3][
i][0][j] = frac_mask_value;
219 if (ref_recv_field[4][i][j] < frac_send_field_value) {
220 ref_recv_field[4][
i][j] = frac_send_field_value;
221 temp_frac_mask[4][
i][0][j] = frac_mask_value;
227 ref_recv_field[2][
i][j] = frac_send_field_value;
228 temp_frac_mask[2][
i][0][j] = frac_mask_value;
236 for (
int field_idx = 0; field_idx <
NUM_FIELDS; ++field_idx) {
242 recv_field[j][k] = -1;
251 if (info != ref_recv_info)
PUT_ERR(
"error in yac_cget_: wrong info");
257 if (temp_frac_mask[field_idx][j][0][k] != 0.0) {
258 if (fabs(recv_field[j][k] -
259 (ref_recv_field[field_idx][j][k] /
260 temp_frac_mask[field_idx][j][0][k])) > 1e-6)
261 PUT_ERR(
"error in yac_cget_: wrong recv_field (unmasked)");
264 PUT_ERR(
"error in yac_cget_: wrong recv_field (masked)");
271 if (recv_field[j][k] != -1)
272 PUT_ERR(
"error in yac_cget_: wrong recv_field");
281 send_field[i][0][j] += i - 1;
293static void utest_changing_frac_mask() {
300 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
301 MPI_Comm_size ( MPI_COMM_WORLD, &size );
304 fputs(
"wrong number of processes (has to be 2)\n", stderr);
308 int is_target =
rank == 1;
318 "target_grid_2", (
int[2]){2,2}, (
int[2]){0,0},
323 "source_grid_2", (
int[2]){3,3}, (
int[2]){0,0},
344 (is_target)?
"target_comp":
"source_comp",
345 (is_target)?
"target_grid_2":
"source_grid_2",
349 int interp_stack_nnn;
356 "source_comp",
"source_grid_2",
"field",
357 "target_comp",
"target_grid_2",
"field",
359 interp_stack_nnn, 0, 0);
364 enum {NUM_TIMESTEP = 5, SRC_FIELD_SIZE = 4};
366 double send_field[NUM_TIMESTEP][SRC_FIELD_SIZE] =
367 {{ 1, 2, 3, 4}, {10,11,12,13}, {20,21,22,23},
368 {30,31,32,33}, {40,41,42,43}};
369 double frac_mask[NUM_TIMESTEP][SRC_FIELD_SIZE] =
370 {{1.0,1.0,0.0,0.0}, {1.0,0.0,1.0,0.0}, {1.0,1.0,0.0,0.0},
371 {1.0,1.0,1.0,1.0}, {0.0,0.0,0.0,0.0}};
373 for (
int t = 0;
t < NUM_TIMESTEP; ++
t) {
379 field_id, 1, &send_field[t][0], &frac_mask[t][0], &info, &
ierror);
386 double const weight = 0.25;
387 double ref_recv_field = 0.0;
388 double frac_weight_sum = 0.0;
389 for (
int i = 0;
i < SRC_FIELD_SIZE; ++
i) {
390 ref_recv_field += send_field[
t][
i] * frac_mask[
t][
i] * weight;
391 frac_weight_sum += weight * frac_mask[
t][
i];
394 (frac_weight_sum < 1.e-9)?
402 PUT_ERR(
"error in yac_cget_: wrong info");
404 if (fabs(recv_field - ref_recv_field) > 1.e-9)
405 PUT_ERR(
"error in yac_cget_: wrong recv_field");
static void init_temp_frac_mask(double temp_frac_mask[][COLLECTION_SIZE][NUM_POINTSETS][NUM_POINTS])
static void init_ref_recv_field(double ref_recv_field[][COLLECTION_SIZE][NUM_POINTS])
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)
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
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