32static void utest_test1_callback(
33 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
34 int const ** global_results_points,
double ** result_weights,
36static void utest_test2_callback(
37 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
38 int const ** global_results_points,
double ** result_weights,
40static void utest_test3_callback(
41 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
42 int const ** global_results_points,
double ** result_weights,
44static void utest_test4_callback(
45 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
46 int const ** global_results_points,
double ** result_weights,
48static char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
55 int comm_rank, comm_size;
56 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
57 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
58 MPI_Barrier(MPI_COMM_WORLD);
61 PUT_ERR(
"ERROR: wrong number of processes");
74 {{.func = utest_test1_callback, .key =
"test1", .user_data = 1},
75 {.func = utest_test2_callback, .key =
"test2", .user_data = 2},
76 {.func = utest_test3_callback, .key =
"test3", .user_data = 3}};
77 enum {NUM_CALLBACKS =
sizeof(callbacks) /
sizeof(callbacks[0])};
79 for (
size_t i = 0;
i < NUM_CALLBACKS; ++
i)
81 callbacks[i].func, (
void*)&(callbacks[
i].user_data), callbacks[i].
key);
84 callbacks[1].func, (
void*)&(callbacks[1].
user_data), callbacks[1].
key);
86 for (
size_t i = 0;
i < NUM_CALLBACKS; ++
i) {
94 if (func != callbacks[i].func)
96 "ERROR in yac_interp_method_callback_get_compute_weights_callback");
99 "ERROR in yac_interp_method_callback_get_compute_weights_callback");
119 int is_tgt = comm_rank == 2;
120 double coordinates_x[2][5] = {{0.0,1.0,2.0,3.0}, {-0.5,0.5,1.5,2.5,3.5}};
121 double coordinates_y[2][4] = {{0.0,1.0,2.0}, {-0.5,0.5,1.5,2.5}};
122 size_t const num_cells[2][2] = {{3,2}, {4,3}};
123 size_t local_start[2][2][2] = {{{0,0},{1,0}}, {{0,0}}};
124 size_t local_count[2][2][2] = {{{1,2},{2,2}}, {{4,3}}};
132 utest_generate_basic_grid_data_reg2d(
134 local_start[is_tgt][(is_tgt)?0:comm_rank],
135 local_count[is_tgt][(is_tgt)?0:comm_rank],
with_halo);
159 {.location =
YAC_LOC_CELL, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
160 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
162 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
174 utest_test2_callback,
175 utest_test4_callback};
181 {{-1.0, -1.0, -1.0, -1.0, -1.0,
182 -1.0, -1.0, -1.0, -1.0, -1.0,
183 -1.0, -1.0, -1.0, -1.0, -1.0,
184 -1.0, -1.0, -1.0, -1.0, -1.0},
185 {-1.0, -1.0, -1.0, -1.0, -1.0,
186 -1.0, 0.5*0+0.125*(0+1+4+5), 0.5*1+0.125*(1+2+5+6), 0.5*2+0.125*(2+3+6+7), -1.0,
187 -1.0, 0.5*3+0.125*(4+5+8+9), 0.5*4+0.125*(5+6+9+10), 0.5*5+0.125*(6+7+10+11), -1.0,
188 -1.0, -1.0, -1.0, -1.0, -1.0},
189 {-1.0, -1.0, -1.0, -1.0, -1.0,
190 -1.0, -1.0, 0.5*1+0.125*(1+2+5+6), -1.0, -1.0,
191 -1.0, 0.5*3+0.125*(4+5+8+9), -1.0, 0.5*5+0.125*(6+7+10+11), -1.0,
192 -1.0, -1.0, -1.0, -1.0, -1.0}};
193 double collection_factor[] = {0.0, 10.0, 10.0};
211 for (
size_t reorder_idx = 0; reorder_idx < 2; ++reorder_idx) {
220 double *** src_data = NULL;
221 double ** tgt_data = NULL;
227 tgt_data[collection_idx] =
229 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
230 tgt_data[collection_idx][i] = -1337.0;
236 src_data[collection_idx] =
xmalloc(2 *
sizeof(**src_data));
237 src_data[collection_idx][0] =
239 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
240 src_data[collection_idx][0][i] =
241 (
double)(vertex_ids[
i] + 10 * collection_idx);
242 src_data[collection_idx][1] =
245 src_data[collection_idx][1][i] =
246 (
double)(cell_ids[
i] + 10 * collection_idx);
257 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
258 if (ref_tgt_data[test_idx][vertex_ids[i]] == -1.0) {
259 if (tgt_data[collection_idx][i] != -1.0)
262 if (fabs(tgt_data[collection_idx][i] -
263 (ref_tgt_data[test_idx][vertex_ids[i]] +
264 (
double)collection_idx *
265 collection_factor[test_idx])) > 1e-9)
271 ++collection_idx) free(tgt_data[collection_idx]);
276 for (
size_t src_field_idx = 0; src_field_idx < num_src_fields;
278 free(src_data[collection_idx][src_field_idx]);
279 free(src_data[collection_idx]);
306 double src_coordinates_x[51];
307 double src_coordinates_y[51];
308 size_t const src_num_cells[2] = {50,50};
309 size_t src_local_start[3][2] = {{20,10},{20,0},{0,0}};
310 size_t src_local_count[3][2] = {{30,40},{30,10},{20,50}};
312 for (
size_t i = 0;
i <= src_num_cells[0]; ++
i)
313 src_coordinates_x[i] = (
double)
i *
YAC_RAD;
314 for (
size_t i = 0;
i <= src_num_cells[1]; ++
i)
315 src_coordinates_y[i] = (
double)
i *
YAC_RAD;
318 utest_generate_basic_grid_data_reg2d(
319 src_coordinates_x, src_coordinates_y, src_num_cells,
320 src_local_start[comm_rank], src_local_count[comm_rank],
with_halo);
322 double tgt_coordinates_x[50];
323 double tgt_coordinates_y[50];
324 size_t const tgt_num_cells[2] = {49,49};
325 size_t tgt_local_start[2] = {0,0};
326 size_t tgt_local_count[2] = {49,49};
327 for (
size_t i = 0;
i <= tgt_num_cells[0]; ++
i)
328 tgt_coordinates_x[i] = (0.5 + (
double)i) *
YAC_RAD;
329 for (
size_t i = 0;
i <= tgt_num_cells[1]; ++
i)
330 tgt_coordinates_y[i] = (0.5 + (
double)i) *
YAC_RAD;
335 utest_generate_basic_grid_data_reg2d(
336 tgt_coordinates_x, tgt_coordinates_y, tgt_num_cells,
337 tgt_local_start, tgt_local_count,
with_halo);
352 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
354 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
374 double *** src_data = NULL;
375 double ** tgt_data = NULL;
377 if (comm_rank == 0) {
378 tgt_data =
xmalloc(1 *
sizeof(*tgt_data));
379 tgt_data[0] =
xmalloc(tgt_grid_data.num_vertices *
sizeof(**tgt_data));
380 for (
size_t i = 0;
i < tgt_grid_data.num_vertices; ++
i)
381 tgt_data[0][i] = -1.0;
384 src_data =
xmalloc(1 *
sizeof(*src_data));
385 src_data[0] =
xmalloc(1 *
sizeof(**src_data));
388 for (
size_t i = 0;
i < src_grid_data.
num_cells; ++
i)
389 src_data[0][0][i] = (
double)(src_grid_data.
cell_ids[
i]);
393 if (comm_rank == 0) {
396 for (
size_t i = 0;
i < tgt_grid_data.num_vertices; ++
i)
397 if (tgt_data[0][i] != (
double)(tgt_grid_data.vertex_ids[i]))
404 free(src_data[0][0]);
424static void utest_test1_callback(
425 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
426 int const ** global_results_points,
double ** result_weights,
427 size_t * result_count,
void *
user_data) {
433 size_t num_src_fields = *(
size_t*)
user_data;
435 for (
size_t i = 0;
i < num_src_fields; ++
i) {
436 global_results_points[
i] = NULL;
437 result_weights[
i] = NULL;
442static void utest_test2_callback(
443 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
444 int const ** global_results_points,
double ** result_weights,
445 size_t * result_count,
void *
user_data) {
452 if ((
info->num_grid_cells <= src_cell_idx) ||
453 (
info->cell_ids[src_cell_idx] != src_cell_id)) {
454 fputs(
"ERROR(test2_callback): inconsistent data\n", stderr);
458 static double vertex_weights[4] = {0.125, 0.125, 0.125, 0.125};
459 static double cell_weight[1] = {0.5};
461 static int vertex_result_points[4];
462 static int cell_result_points[1];
464 for (
size_t i = 0;
i < 4; ++
i)
465 vertex_result_points[i] =
466 (
int)(
info->vertex_ids[
info->cell_to_vertex[4*src_cell_idx +
i]]);
467 cell_result_points[0] = (int)src_cell_id;
469 global_results_points[0] = vertex_result_points;
470 global_results_points[1] = cell_result_points;
471 result_weights[0] = vertex_weights;
472 result_weights[1] = cell_weight;
477static void utest_test3_callback(
478 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
479 int const ** global_results_points,
double ** result_weights,
480 size_t * result_count,
void *
user_data) {
487 static int result_points[1];
488 static double weight[1] = {1.0};
490 result_points[0] = (int)src_cell_id;
492 global_results_points[0] = result_points;
493 result_weights[0] = weight;
497static void utest_test4_callback(
498 double const tgt_coords[3],
int src_cell_id,
size_t src_cell_idx,
499 int const ** global_results_points,
double ** result_weights,
500 size_t * result_count,
void *
user_data) {
507 if ((
info->num_grid_cells <= src_cell_idx) ||
508 (
info->cell_ids[src_cell_idx] != src_cell_id)) {
509 fputs(
"ERROR(test2_callback): inconsistent data\n", stderr);
513 static double vertex_weights[4] = {0.125, 0.125, 0.125, 0.125};
514 static double cell_weight[1] = {0.5};
516 static int vertex_result_points[4];
517 static int cell_result_points[1];
519 for (
size_t i = 0;
i < 4; ++
i)
520 vertex_result_points[i] =
521 (
int)(
info->vertex_ids[
info->cell_to_vertex[4*src_cell_idx +
i]]);
522 cell_result_points[0] = (int)src_cell_id;
525 global_results_points[0] = vertex_result_points;
526 global_results_points[1] = cell_result_points;
527 result_weights[0] = vertex_weights;
528 result_weights[1] = cell_weight;
532 global_results_points[0] = NULL;
533 global_results_points[1] = NULL;
534 result_weights[0] = NULL;
535 result_weights[1] = NULL;
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
struct yac_dist_grid_pair * yac_dist_grid_pair_new(struct yac_basic_grid *grid_a, struct yac_basic_grid *grid_b, MPI_Comm comm)
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
struct yac_interp_grid * yac_interp_grid_new(struct yac_dist_grid_pair *grid_pair, char const *src_grid_name, char const *tgt_grid_name, size_t num_src_fields, struct yac_interp_field const *src_fields, struct yac_interp_field const tgt_field)
void yac_interp_method_delete(struct interp_method **method)
Delete an interpolation stack and free its resources (but not the pointer array).
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
Perform weight computation using given interpolation stack and grid.
Defines the interface of the interpolation method "base class" in YAC.
void yac_interp_method_callback_get_compute_weights_callback(char const *key, yac_func_compute_weights *compute_weights_callback, void **user_data)
struct interp_method * yac_interp_method_callback_new(yac_func_compute_weights compute_weights_callback, void *user_data)
void yac_interp_method_callback_add_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
void yac_interp_method_callback_buf_free()
void(* yac_func_compute_weights)(double const tgt_coords[3], int src_cell_id, size_t src_cell_idx, int const **global_results_points, double **result_weights, size_t *result_count, void *user_data)
struct interp_method * yac_interp_method_fixed_new(double value)
struct yac_interpolation * yac_interp_weights_get_interpolation(struct yac_interp_weights *weights, enum yac_interp_weights_reorder_type reorder, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, int is_source, int is_target)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
yac_interp_weights_reorder_type
@ YAC_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be applied at source processes
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
double const YAC_FRAC_MASK_NO_VALUE
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
static char const * grid_names[2]
struct @1 test_functions[]
void yac_yaxt_init(MPI_Comm comm)