A test for internal interpolation routines.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>
#include "tests.h"
#include "test_common.h"
#include "dist_grid_utils.h"
#define YAC_RAD (0.01745329251994329576923690768489)
#define MAX_COLLECTION_SIZE (10)
char const grid_name_src[] = "src_grid";
char const grid_name_tgt[] = "tgt_grid";
static void target_main(
static void source_main(
int main(
int argc,
char *argv[]) {
if (argc != 2) {
PUT_ERR("wrong number of arguments\n");
return TEST_EXIT_CODE;
}
PUT_ERR("invalid argument (has to be either \"src\" or \"tgt\")\n");
return TEST_EXIT_CODE;
}
MPI_Init(NULL, NULL);
xt_initialize(MPI_COMM_WORLD);
int comm_rank, comm_size;
MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
MPI_Barrier(MPI_COMM_WORLD);
if (comm_size != 4) {
PUT_ERR("ERROR: wrong number of processes");
xt_finalize();
MPI_Finalize();
return TEST_EXIT_CODE;
}
int tgt_flag = comm_rank < 2;
MPI_Comm split_comm;
MPI_Comm_split(MPI_COMM_WORLD, tgt_flag, 0, &split_comm);
if (tgt_flag) target_main(split_comm, reorder_type);
else source_main(split_comm, reorder_type);
MPI_Comm_free(&split_comm);
xt_finalize();
MPI_Finalize();
return TEST_EXIT_CODE;
}
static void source_main(
int my_source_rank;
MPI_Comm_rank(source_comm, &my_source_rank);
double coordinates_x[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
double coordinates_y[] = {0.0, 1.0, 2.0, 3.0, 4.0};
size_t const num_cells[2] = {5,4};
size_t local_start[2][2] = {{0,0},{3,0}};
size_t local_count[2][2] = {{3,4},{2,4}};
int with_halo = 1;
for (
size_t i = 0; i <= num_cells[0]; ++i) coordinates_x[i] *=
YAC_RAD;
for (
size_t i = 0; i <= num_cells[1]; ++i) coordinates_y[i] *=
YAC_RAD;
yac_generate_basic_grid_data_reg2d(
local_start[my_source_rank], local_count[my_source_rank], with_halo);
size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
NULL};
double *** src_data =
xmalloc(MAX_COLLECTION_SIZE *
sizeof(*src_data));
for (size_t collection_idx = 0; collection_idx < MAX_COLLECTION_SIZE;
++collection_idx) {
src_data[collection_idx] =
xmalloc(1 *
sizeof(**src_data));
src_data[collection_idx][0] =
src_data[collection_idx][0][i] =
((double)(grid_data.
vertex_ids[i]) + (double)(collection_idx * 30)):
(-1.0);
}
}
for (size_t collection_idx = 0; collection_idx < MAX_COLLECTION_SIZE;
++collection_idx) {
free(src_data[collection_idx][0]);
free(src_data[collection_idx]);
}
free(src_data);
}
static void target_main(
int my_target_rank;
MPI_Comm_rank(target_comm, &my_target_rank);
double coordinates_x[] = {0.5,1.5,2.5,3.5,4.5,5.5,6.5};
double coordinates_y[] = {0.5,1.5,2.5,3.5};
size_t const num_cells[2] = {6,3};
size_t local_start[2][2] = {{0,0},{3,0}};
size_t local_count[2][2] = {{3,3},{3,3}};
int with_halo = 0;
for (
size_t i = 0; i <= num_cells[0]; ++i) coordinates_x[i] *=
YAC_RAD;
for (
size_t i = 0; i <= num_cells[1]; ++i) coordinates_y[i] *=
YAC_RAD;
yac_generate_basic_grid_data_reg2d(
local_start[my_target_rank], local_count[my_target_rank], with_halo);
size_t num_src_fields = sizeof(src_fields) / sizeof(src_fields[0]);
NULL};
double target_field[MAX_COLLECTION_SIZE][16];
double * target_data[MAX_COLLECTION_SIZE];
for (unsigned i = 0; i < MAX_COLLECTION_SIZE; ++i)
target_data[i] = target_field[i];
interpolation[0] =
for (size_t k = 0; k < 2; ++k) {
for (unsigned j = 0; j < 16; ++j)
target_field[i][j] = -1;
double ref_target_data[2][16] = {{3.5,4.5,5.5,6.5,
9.5,10.5,11.5,12.5,
15.5,16.5,17.5,18.5,
21.5,22.5,23.5,24.5},
{6.5,7.5,1337,1337,
12.5,13.5,1337,1337,
18.5,19.5,1337,1337,
24.5,25.5,1337,1337}};
for (unsigned j = 0; j < 16; ++j) {
if ((double_are_equal(ref_target_data[my_target_rank][j], -1.0)) ||
(double_are_equal(ref_target_data[my_target_rank][j], 1337.0))) {
if (double_are_unequal(target_data[i][j],
ref_target_data[my_target_rank][j]))
PUT_ERR("error in interpolated data on target side\n");
} else {
if (double_are_unequal(
target_data[i][j],
ref_target_data[my_target_rank][j] + (double)(i * 30)))
PUT_ERR("error in interpolated data on target side\n");
}
}
}
}
for (int i = 0; i < 2; ++i)
}
}
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)
int main(int argc, char **argv)
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)
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
struct interp_method * yac_interp_method_avg_new(enum yac_interp_avg_weight_type weight_type, int partial_coverage)
@ YAC_INTERP_AVG_ARITHMETIC
struct interp_method * yac_interp_method_fixed_new(double value)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
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)
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
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
void yac_interpolation_delete(struct yac_interpolation *interp)
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
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[]