30static void utest_compute_field_data_XYZ(
31 double (*vertices)[3],
size_t num_vertices,
double * f_v);
32static char const *
grid_names[2] = {
"src_grid",
"tgt_grid"};
38 xt_initialize(MPI_COMM_WORLD);
40 int comm_rank, comm_size;
41 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
42 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
43 MPI_Barrier(MPI_COMM_WORLD);
46 PUT_ERR(
"ERROR: wrong number of processes");
53 MPI_Comm_split(MPI_COMM_WORLD, comm_rank < 1, 0, &
split_comm);
55 int split_comm_rank, split_comm_size;
134 enum {NUM_SRC_DECOMP = 2};
137 int is_tgt = split_comm_size == 1;
138 for (
int case_idx = 0; case_idx < NUM_SRC_DECOMP; ++case_idx) {
141 {{{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}},
142 {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}}};
144 {{{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}},
145 {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}}};
146 size_t const num_cells[2][2] = {{7,7}, {9,9}};
147 size_t local_start[NUM_SRC_DECOMP][2][5][2] =
148 {{{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}},
149 {{{0,0},{1,0},{3,0},{3,3},{5,0}}, {{0,0}}}};
150 size_t local_count[NUM_SRC_DECOMP][2][5][2] =
151 {{{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{9,9}}},
152 {{{2,7},{2,7},{2,3},{2,4},{2,7}}, {{9,9}}}};
154 for (
size_t i = 0;
i < 10; ++
i) {
166 num_cells[is_tgt], local_start[case_idx][is_tgt][split_comm_rank],
167 local_count[case_idx][is_tgt][split_comm_rank],
with_halo);
178 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
180 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
205 double * ref_tgt_field = NULL;
211 utest_compute_field_data_XYZ(
212 grid_data.vertex_coordinates, 100, ref_tgt_field);
213 for (
size_t i = 0;
i < 100; ++
i) tgt_field[i] = -1;
218 utest_compute_field_data_XYZ(
225 for (
size_t i = 0;
i < 100; ++
i)
226 if (fabs(1.0 - ref_tgt_field[i] / tgt_field[i]) > 1e-2)
227 PUT_ERR(
"wrong interpolation result");
245 for (
int case_idx = 0; case_idx < NUM_SRC_DECOMP; ++case_idx) {
250 PUT_ERR(
"error in test setup");
252 if (tgt_fields[0][0][i] != tgt_fields[case_idx][reorder_type][i])
253 PUT_ERR(
"interpolation results are not "
254 "decomposition-independant");
257 for (
int case_idx = 0; case_idx < NUM_SRC_DECOMP; ++case_idx)
259 ++reorder_type) free(tgt_fields[case_idx][reorder_type]);
318 int is_tgt = split_comm_size == 1;
319 double coordinates_x[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
320 double coordinates_y[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
321 size_t const num_cells[2][2] = {{7,7}, {9,9}};
322 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
323 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{9,9}}};
325 for (
size_t i = 0;
i < 10; ++
i) {
337 local_start[is_tgt][split_comm_rank],
338 local_count[is_tgt][split_comm_rank],
with_halo);
348 {{.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX}};
349 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
351 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
376 double * ref_tgt_field = NULL;
382 utest_compute_field_data_XYZ(
383 grid_data.vertex_coordinates, 100, ref_tgt_field);
384 for (
size_t i = 0;
i < 100; ++
i) tgt_field[i] = -1;
387 utest_compute_field_data_XYZ(
394 for (
size_t i = 0;
i < 100; ++
i)
395 if (fabs(1.0 - ref_tgt_field[i] / tgt_field[i]) > 1e-2)
396 PUT_ERR(
"wrong interpolation result");
470 int is_tgt = split_comm_size == 1;
471 double coordinates_x[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
472 double coordinates_y[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
473 size_t const num_cells[2][2] = {{7,7}, {9,9}};
474 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
475 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{9,9}}};
477 for (
size_t i = 0;
i < 10; ++
i) {
489 local_start[is_tgt][split_comm_rank],
490 local_count[is_tgt][split_comm_rank],
with_halo);
494 src_point_coordinates =
497 double * middle_point = src_point_coordinates[
i];
498 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
499 size_t * curr_vertices =
502 for (
size_t j = 0; j < curr_num_vertices; ++j) {
503 double * curr_vertex_coord =
504 grid_data.vertex_coordinates[curr_vertices[j]];
505 for (
size_t k = 0; k < 3; ++k)
506 middle_point[k] += curr_vertex_coord[k];
522 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
523 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
525 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
550 double * ref_tgt_field = NULL;
556 utest_compute_field_data_XYZ(
557 grid_data.vertex_coordinates, 100, ref_tgt_field);
558 for (
size_t i = 0;
i < 100; ++
i) tgt_field[i] = -1;
561 utest_compute_field_data_XYZ(
562 src_point_coordinates,
grid_data.num_cells, src_field);
568 for (
size_t i = 0;
i < 100; ++
i)
569 if (fabs(1.0 - ref_tgt_field[i] / tgt_field[i]) > 1e-2)
570 PUT_ERR(
"wrong interpolation result");
645 int is_tgt = split_comm_size == 1;
646 double coordinates_x[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
647 double coordinates_y[2][10] = {{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0},{-1.0}};
648 size_t const num_cells[2][2] = {{7,7}, {9,9}};
649 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
650 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{9,9}}};
652 for (
size_t i = 0;
i < 10; ++
i) {
664 local_start[is_tgt][split_comm_rank],
665 local_count[is_tgt][split_comm_rank],
with_halo);
669 src_point_coordinates =
672 double * middle_point = src_point_coordinates[
i];
673 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
674 size_t * curr_vertices =
677 for (
size_t j = 0; j < curr_num_vertices; ++j) {
678 double * curr_vertex_coord =
679 grid_data.vertex_coordinates[curr_vertices[j]];
680 for (
size_t k = 0; k < 3; ++k)
681 middle_point[k] += curr_vertex_coord[k];
697 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
698 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
700 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
725 double * ref_tgt_field = NULL;
728 int is_outside_src_grid[] = {
729 0,0,0,0,0,0,1,1,1,1,
730 0,0,0,0,0,0,1,1,1,1,
731 0,0,0,0,0,0,1,1,1,1,
732 0,0,0,0,0,0,1,1,1,1,
733 0,0,0,0,0,0,1,1,1,1,
734 0,0,0,0,0,0,1,1,1,1,
735 1,1,1,1,1,1,1,1,1,1,
736 1,1,1,1,1,1,1,1,1,1,
737 1,1,1,1,1,1,1,1,1,1,
738 1,1,1,1,1,1,1,1,1,1};
742 utest_compute_field_data_XYZ(
743 grid_data.vertex_coordinates, 100, ref_tgt_field);
744 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i)
745 if (is_outside_src_grid[
grid_data.vertex_ids[i]])
746 ref_tgt_field[
i] = -1.0;
747 for (
size_t i = 0;
i < 100; ++
i) tgt_field[i] = -2.0;
750 utest_compute_field_data_XYZ(
751 src_point_coordinates,
grid_data.num_cells, src_field);
757 for (
size_t i = 0;
i < 100; ++
i)
758 if (fabs(1.0 - ref_tgt_field[i] / tgt_field[i]) > 1e-2)
759 PUT_ERR(
"wrong interpolation result");
833 int is_tgt = split_comm_size == 1;
835 {{72.00,72.25,72.50,72.75,73.00,73.25,73.5,73.75},{-1.0}};
837 {{90.0,89.75,89.50,89.25,89.00,88.75,88.50,88.25},{-1.0}};
838 size_t const num_cells[2][2] = {{7,7}, {9,9}};
839 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
840 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{9,9}}};
842 for (
size_t i = 0;
i < 10; ++
i) {
854 local_start[is_tgt][split_comm_rank],
855 local_count[is_tgt][split_comm_rank],
with_halo);
866 vertex_coordinates,
grid_data.vertex_coordinates,
867 grid_data.num_vertices *
sizeof(*vertex_coordinates));
870 for (
size_t i = 0;
i <
grid_data.num_vertices; ++
i) {
871 if (fabs(1.0 - fabs(vertex_coordinates[i][2])) < 1e-9) {
872 vertex_coordinates[
i][0] = 0.0;
873 vertex_coordinates[
i][1] = 0.0;
884 {{.location =
YAC_LOC_CORNER, .coordinates_idx = 0, .masks_idx = SIZE_MAX}};
885 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
887 {.location =
YAC_LOC_CORNER, .coordinates_idx = SIZE_MAX, .masks_idx = SIZE_MAX};
912 double * ref_tgt_field = NULL;
918 utest_compute_field_data_XYZ(
919 grid_data.vertex_coordinates, 100, ref_tgt_field);
920 for (
size_t i = 0;
i < 100; ++
i) tgt_field[i] = -1;
923 utest_compute_field_data_XYZ(
930 for (
size_t i = 0;
i < 100; ++
i)
931 if (fabs(1.0 - ref_tgt_field[i] / tgt_field[i]) > 1e-2)
932 PUT_ERR(
"wrong interpolation result");
959#if defined __INTEL_COMPILER
960#pragma intel optimization_level 0
964static void utest_compute_field_data_XYZ(
965 double (*vertices)[3],
size_t num_vertices,
double * f_v) {
967 for (
size_t i = 0;
i < num_vertices; ++
i) {
969 double x = vertices[
i][0];
970 double y = vertices[
i][1];
971 double z = vertices[
i][2];
974 f_v[
i] = 1.0 + pow(x, 8.0);
975 f_v[
i] += exp(2.0*y*y*y);
976 f_v[
i] += exp(2.0*x*x) + 10.0*
x*
y*z;
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
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)
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d(double const *global_coords_x, double const *global_coords_y, size_t const num_global_cells_[2], size_t const local_start[2], size_t const local_count[2], int with_halo)
static void normalise_vector(double v[])
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_fixed_new(double value)
struct interp_method * yac_interp_method_hcsbb_new()
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
int * num_vertices_per_cell
enum yac_location location
struct yac_interp_field tgt_field
struct yac_dist_grid_pair * grid_pair
struct yac_interp_field src_fields[]
static MPI_Comm split_comm
static char const * grid_names[2]
enum yac_interp_weights_reorder_type reorder_types[]
struct yac_basic_grid ** grids
double(* yac_coordinate_pointer)[3]