50static double utest_get_sq_sphere_radius(
52static double utest_compute_scale(
54 double src_cell_area,
double tgt_cell_area);
55static void utest_write_area_file(
56 char const * filename,
double * cell_areas,
size_t dim_x,
size_t dim_y);
62 xt_initialize(MPI_COMM_WORLD);
64 int comm_rank, comm_size;
65 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
66 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
67 MPI_Barrier(MPI_COMM_WORLD);
70 PUT_ERR(
"ERROR: wrong number of processes");
77 MPI_Comm_split(MPI_COMM_WORLD, comm_rank < 1, 0, &
split_comm);
79 int split_comm_rank, split_comm_size;
158 int is_tgt = split_comm_size == 1;
162 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
163 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{7,7}}};
164 int global_mask[7*7] = {
181 local_start[is_tgt][split_comm_rank],
182 local_count[is_tgt][split_comm_rank],
with_halo);
189 int valid_mask_value = (is_tgt)?2:1;
194 double * middle_point = point_coordinates[
i];
195 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
196 size_t * curr_vertices =
199 for (
size_t j = 0; j < curr_num_vertices; ++j) {
200 double * curr_vertex_coord =
201 grid_data.vertex_coordinates[curr_vertices[j]];
202 for (
size_t k = 0; k < 3; ++k)
203 middle_point[k] += curr_vertex_coord[k];
219 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
221 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
250 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) tgt_field[i] = -1;
254 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
259 double ref_tgt_field[7*7] = {
260 -1,-1,-1,-1,-1,-1,-1,
261 -1,-1,-1,2+3+9,4,5,6,
262 -1,-1,8+15,-2,25,-2,-2,
263 -1,14+21,24,-1,-1,-1,26,
264 -1,28,31,-1,-1,-1,33,
265 -1,35,38,-1,-1,-1,40,
266 -1,42,-2,-2,39,-2,-2};
270 if (ref_tgt_field[
grid_data.cell_ids[i]] != tgt_field[i])
271 PUT_ERR(
"wrong interpolation result");
363 int is_tgt = split_comm_size == 1;
367 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
368 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{7,7}}};
369 int global_mask[7*7] = {
386 local_start[is_tgt][split_comm_rank],
387 local_count[is_tgt][split_comm_rank],
with_halo);
394 int valid_mask_value = (is_tgt)?2:1;
399 double * middle_point = point_coordinates[
i];
400 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
401 size_t * curr_vertices =
404 for (
size_t j = 0; j < curr_num_vertices; ++j) {
405 double * curr_vertex_coord =
406 grid_data.vertex_coordinates[curr_vertices[j]];
407 for (
size_t k = 0; k < 3; ++k)
408 middle_point[k] += curr_vertex_coord[k];
423 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0}};
424 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
426 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
462 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) tgt_field[i] = -1;
466 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
471 double ref_tgt_field[7*7] = {
472 -1,-1,-1,-1,-1,-1,-1,
473 -1,-1,-1, 0, 0, 0, 0,
474 -1,-1, 0, 0, 0, 0, 0,
475 -1, 0, 0,-1,-1,-1, 0,
476 -1, 0, 0,-1,-1,-1, 0,
477 -1, 0, 0,-1,-1,-1, 0,
478 -1, 0, 0, 0, 0, 0, 0};
479 size_t coast_point[] = {2,3,4,5,6,
486 size_t num_coast_points =
sizeof(coast_point)/
sizeof(coast_point[0]);
487 size_t num_tgt_per_coast[] = {3,3,4,4,3,
494 size_t tgts[] = {10,11,17, 10,11,17, 10,11,12,18, 11,12,13,19, 12,13,20,
497 22,23,29, 16,22,23,30, 11,17,18,19, 20,27,34,
498 22,29,30,36, 23,29,30,37, 27,34,41,
499 29,36,37,43, 30,36,37,44, 45,46,47, 34,41,48,
502 for (
size_t i = 0, k = 0;
i < num_coast_points; ++
i) {
503 size_t curr_num_tgt = num_tgt_per_coast[
i];
504 double curr_data = (double)(coast_point[i]) / (double)curr_num_tgt;
505 for (
size_t j = 0; j < curr_num_tgt; ++j, ++k)
506 ref_tgt_field[tgts[k]] += curr_data;
511 if (fabs(ref_tgt_field[
grid_data.cell_ids[i]] -
512 tgt_field[i]) > 1e-6)
513 PUT_ERR(
"wrong interpolation result");
621 enum {NUM_X = 7, NUM_Y = 9};
622 int is_tgt = split_comm_size == 1;
623 double coordinates_x[NUM_X+1] = {0.0,1.01,2.03,3.06,4.1,5.15,6.21,7.28};
625 {-1.0,0.0,1.01,2.03,3.06,4.1,5.15,6.21,7.28,8.36};
626 size_t const num_cells[2] = {NUM_X,NUM_Y};
627 size_t local_start[2][5][2] = {{{0,0},{0,3},{0,4},{4,3},{0,6}}, {{0,0}}};
628 size_t local_count[2][5][2] = {{{7,3},{4,1},{4,2},{3,3},{7,3}},
630 int global_mask[NUM_X * NUM_Y] = {
641 double const grid_scale = 10.0;
642 for (
size_t i = 0;
i <= NUM_X; ++
i)
644 for (
size_t i = 0;
i <= NUM_Y; ++
i)
650 local_start[is_tgt][split_comm_rank],
651 local_count[is_tgt][split_comm_rank],
with_halo);
660 int valid_mask_value = (is_tgt)?2:1;
663 double * middle_point = point_coordinates[
i];
664 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
665 size_t * curr_vertices =
668 for (
size_t j = 0; j < curr_num_vertices; ++j) {
669 double * curr_vertex_coord =
670 grid_data.vertex_coordinates[curr_vertices[j]];
671 for (
size_t k = 0; k < 3; ++k)
672 middle_point[k] += curr_vertex_coord[k];
686 double grid_cell_areas[NUM_X*NUM_Y];
687 for (
int i = 0, k = 0;
i < NUM_Y; ++
i)
688 for (
int j = 0; j < NUM_X; ++j, ++k)
694 char const * area_filename =
"test_interp_method_spmap_area.nc";
696 utest_write_area_file(area_filename, grid_cell_areas, NUM_X, NUM_Y);
697 MPI_Barrier(MPI_COMM_WORLD);
700 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0}};
701 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
703 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
709 double const spread_distances[] = {3.7 * grid_scale, 0.0, 0.001};
710 enum {NUM_SPREAD_DISTANCES =
711 sizeof(spread_distances) /
sizeof(spread_distances[0])};
730 enum {NUM_SCALE_CONFIGS =
731 sizeof(scale_configs) /
sizeof(scale_configs[0])};
733 char const *
io_ranks[] = {
"0",
"3,5",
"1,3,5"};
734 enum {NUM_IO_CONFIGS =
sizeof(
io_ranks) /
sizeof(io_ranks[0])};
736 for (
size_t spread_distance_idx = 0;
737 spread_distance_idx < NUM_SPREAD_DISTANCES; ++spread_distance_idx) {
745 for (
size_t scale_config_idx = 0;
746 scale_config_idx < NUM_SCALE_CONFIGS; ++scale_config_idx) {
751 scale_configs[scale_config_idx].
src,
752 scale_configs[scale_config_idx].
tgt);
754 for (
size_t io_config_idx = 0; io_config_idx < NUM_IO_CONFIGS;
760 setenv(
"YAC_IO_RANK_LIST", io_ranks[io_config_idx], 1);
761 setenv(
"YAC_IO_MAX_NUM_RANKS_PER_NODE",
"12", 1);
765 YAC_RAD * spread_distances[spread_distance_idx],
779 for (
size_t reorder_type_idx = 0;
781 ++reorder_type_idx) {
803 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
807 interpolation, &src_fields, &tgt_field);
811 double ref_tgt_field[NUM_X * NUM_Y] = {
812 -1,-1,-1,-1,-1,-1,-1,
813 -1,-1,-1,-1,-1,-1,-1,
814 -1,-1,-1,-1,-1,-1, 0,
819 -1,-1,-1,-1,-1,-1, 0,
820 -1,-1,-1,-1,-1,-1,-1};
821 size_t coast_point[] = {14,22,30,37,43,49,
822 13,19,25,31,38,46,54};
825 sizeof(coast_point)/
sizeof(coast_point[0]),
826 MAX_NUM_TGT_PER_COAST = 12};
827 size_t num_tgt_per_coast[NUM_SPREAD_DISTANCES]
835 size_t tgts[NUM_SPREAD_DISTANCES]
837 [MAX_NUM_TGT_PER_COAST] =
838 {{{21,28,29,35,36,42},
845 {20,26,27,32,33,34,39,40,41},
846 {20,26,27,32,33,34,39,40,41},
847 {20,26,27,32,33,34,39,40,41,47,48},
848 {20,26,27,32,33,34,39,40,41,47,48,55},
849 {20,26,27,32,33,34,39,40,41,47,48,55},
850 {26,27,32,33,34,39,40,41,47,48,55},
851 {32,33,34,39,40,41,47,48,55}},
884 for (
size_t i = 0;
i < NUM_COAST_POINTS; ++
i) {
885 size_t curr_num_tgt =
886 num_tgt_per_coast[spread_distance_idx][
i];
888 (double)(coast_point[i]) / (double)curr_num_tgt;
889 for (
size_t j = 0; j < curr_num_tgt; ++j)
890 ref_tgt_field[tgts[spread_distance_idx][i][j]] +=
894 grid_cell_areas[coast_point[i]] *
895 utest_get_sq_sphere_radius(
899 tgts[spread_distance_idx][i][j]] *
900 utest_get_sq_sphere_radius(
907 for (
size_t i = 0, k = 0;
i < NUM_COAST_POINTS; ++
i) {
908 size_t * curr_tgts = tgts[spread_distance_idx][
i];
909 size_t curr_num_tgt =
910 num_tgt_per_coast[spread_distance_idx][
i];
911 size_t curr_coast_point = coast_point[
i];
912 double curr_src_data = (double)(curr_coast_point);
913 double inv_distances[curr_num_tgt];
914 double inv_distances_sum = 0.0;
915 for (
size_t j = 0; j < curr_num_tgt; ++j)
919 point_coordinates[curr_coast_point],
920 point_coordinates[curr_tgts[j]])));
921 for (
size_t j = 0; j < curr_num_tgt; ++j, ++k)
922 ref_tgt_field[curr_tgts[j]] +=
924 * (inv_distances[j] / inv_distances_sum) *
927 grid_cell_areas[coast_point[i]] *
928 utest_get_sq_sphere_radius(
932 tgts[spread_distance_idx][i][j]] *
933 utest_get_sq_sphere_radius(
941 if (((ref_tgt_field[
grid_data.cell_ids[i]] == 0.0) &&
942 (tgt_field[i] != -2.0)) ||
943 ((ref_tgt_field[
grid_data.cell_ids[i]] != 0.0) &&
944 (fabs(ref_tgt_field[
grid_data.cell_ids[i]] -
945 tgt_field[i]) > 1.0e-6)))
946 PUT_ERR(
"wrong interpolation result");
948 double src_sum = 0.0;
949 for (
size_t i = 0;
i < NUM_COAST_POINTS; ++
i) {
950 double curr_src_data = (double)(coast_point[i]);
957 grid_cell_areas[coast_point[
i]] *
958 utest_get_sq_sphere_radius(
961 src_sum += curr_src_data;
963 double tgt_sum = 0.0;
965 if ((tgt_field[i] != -1.0) &&
966 (tgt_field[i] != -2.0)) {
975 utest_get_sq_sphere_radius(
978 tgt_sum += curr_tgt_data;
981 if (fabs(src_sum - tgt_sum) > 1.0e-6)
982 PUT_ERR(
"wrong interpolation result (not conservative)");
1001 for (
size_t i = 0;
i < NUM_SCALE_CONFIGS; ++
i) {
1010 MPI_Barrier(MPI_COMM_WORLD);
1011 if (comm_rank == 0) unlink(area_filename);
1089 int is_tgt = split_comm_size == 1;
1090 double coordinates_x[8] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0};
1091 double coordinates_y[8] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0};
1093 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
1094 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{7,7}}};
1095 int global_mask[7*7] = {
1112 local_start[is_tgt][split_comm_rank],
1113 local_count[is_tgt][split_comm_rank],
with_halo);
1122 int valid_mask_value = (is_tgt)?2:1;
1124 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) {
1125 double * middle_point = point_coordinates[
i];
1126 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
1127 size_t * curr_vertices =
1130 for (
size_t j = 0; j < curr_num_vertices; ++j) {
1131 double * curr_vertex_coord =
1132 grid_data.vertex_coordinates[curr_vertices[j]];
1133 for (
size_t k = 0; k < 3; ++k)
1134 middle_point[k] += curr_vertex_coord[k];
1149 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0}};
1150 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1152 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1189 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) tgt_field[i] = -1;
1193 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
1200 double ref_tgt_field[7*7] = {
1201 -1,-1,-1,-1,-1,-1,-1,
1202 -1,-1,-1,-1,-1,-1,-1,
1203 -1,-1,-1,-1,-1,-1,-1,
1204 -1,-1,-1,-1,-1,-1,-1,
1205 -1,-1,-1,-1,-1,-1, 0,
1206 -1,-1,-1,-1,-1, 0,-2,
1207 -1,-1,-1,-1, 0,-2,-2};
1208 size_t coast_point[] = {0,8,16,24,27,32,33,39,45};
1209 size_t num_coast_points =
sizeof(coast_point)/
sizeof(coast_point[0]);
1210 size_t num_tgt_per_coast[] = {0,0,0,1,1,1,1,1,1};
1211 size_t tgts[] = {40,34,40,34,40,46};
1213 for (
size_t i = 0, k = 0;
i < num_coast_points; ++
i) {
1214 size_t curr_num_tgt = num_tgt_per_coast[
i];
1215 if (curr_num_tgt == 0)
continue;
1216 double curr_data = (double)(coast_point[i]) / (double)curr_num_tgt;
1217 for (
size_t j = 0; j < curr_num_tgt; ++j, ++k)
1218 ref_tgt_field[tgts[k]] += curr_data;
1222 if (fabs(ref_tgt_field[
grid_data.cell_ids[i]] -
1223 tgt_field[i]) > 1e-6)
1224 PUT_ERR(
"wrong interpolation result");
1248 int is_tgt = split_comm_size == 1;
1252 size_t local_start[2][5][2] = {{{0,0},{0,0},{0,0},{0,0},{0,0}}, {{0,0}}};
1253 size_t local_count[2][5][2] = {{{3,3},{3,3},{3,3},{3,3},{3,3}}, {{3,3}}};
1254 int global_mask[3*3] = {
1268 local_start[is_tgt][split_comm_rank],
1269 local_count[is_tgt][split_comm_rank],
with_halo);
1278 int valid_mask_value = (is_tgt)?2:1;
1280 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) {
1281 double * middle_point = point_coordinates[
i];
1282 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
1283 size_t * curr_vertices =
1286 for (
size_t j = 0; j < curr_num_vertices; ++j) {
1287 double * curr_vertex_coord =
1288 grid_data.vertex_coordinates[curr_vertices[j]];
1289 for (
size_t k = 0; k < 3; ++k)
1290 middle_point[k] += curr_vertex_coord[k];
1293 mask[
i] = (global_mask[
grid_data.cell_ids[
i]] & valid_mask_value) > 0;
1305 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0}};
1306 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1308 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1343 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) tgt_field[i] = -1;
1347 src_field[i] = (
double)(
grid_data.cell_ids[
i] + 1);
1353 double ref_tgt_field[3*3] = {-1,-1,0, -1,0,0, -2,0,-2};
1354 size_t coast_point[] = {0,1,3,4};
1356 NUM_COAST_POINTS =
sizeof(coast_point)/
sizeof(coast_point[0]),
1357 MAX_NUM_TGT_PER_COAST = 3};
1358 size_t num_tgt_per_coast[NUM_COAST_POINTS] = {3,2,3,1};
1359 size_t tgts[NUM_COAST_POINTS][MAX_NUM_TGT_PER_COAST] =
1360 {{4,5,7},{2,5},{4,5,7},{4}};
1363 for (
size_t i = 0, k = 0;
i < NUM_COAST_POINTS; ++
i) {
1364 size_t * curr_tgts = tgts[
i];
1365 size_t curr_num_tgt = num_tgt_per_coast[
i];
1366 size_t curr_coast_point = coast_point[
i];
1367 double curr_src_data = (double)(curr_coast_point + 1);
1368 double inv_distances[curr_num_tgt];
1369 double inv_distances_sum = 0.0;
1370 if ( curr_num_tgt == 1) {
1371 ref_tgt_field[curr_tgts[0]] += curr_src_data;
1373 for (
size_t j = 0; j < curr_num_tgt; ++j)
1374 inv_distances_sum +=
1375 ((inv_distances[j] =
1377 point_coordinates[curr_coast_point],
1378 point_coordinates[curr_tgts[j]])));
1379 for (
size_t j = 0; j < curr_num_tgt; ++j, ++k)
1380 ref_tgt_field[curr_tgts[j]] +=
1381 curr_src_data * (inv_distances[j] / inv_distances_sum);
1386 if (fabs(ref_tgt_field[
grid_data.cell_ids[i]] - tgt_field[i]) > 1e-9)
1387 PUT_ERR(
"wrong interpolation result");
1479 int is_tgt = split_comm_size == 1;
1480 double coordinates_x[8] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0};
1481 double coordinates_y[8] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0};
1483 size_t local_start[2][5][2] = {{{0,0},{0,2},{0,3},{4,2},{0,5}}, {{0,0}}};
1484 size_t local_count[2][5][2] = {{{7,2},{4,1},{4,2},{3,3},{7,2}}, {{7,7}}};
1485 int global_mask[7*7] = {
1502 local_start[is_tgt][split_comm_rank],
1503 local_count[is_tgt][split_comm_rank],
with_halo);
1510 int valid_mask_value = (is_tgt)?2:1;
1514 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) {
1515 double * middle_point = point_coordinates[
i];
1516 for (
size_t k = 0; k < 3; ++k) middle_point[k] = 0.0;
1517 size_t * curr_vertices =
1520 for (
size_t j = 0; j < curr_num_vertices; ++j) {
1521 double * curr_vertex_coord =
1522 grid_data.vertex_coordinates[curr_vertices[j]];
1523 for (
size_t k = 0; k < 3; ++k)
1524 middle_point[k] += curr_vertex_coord[k];
1539 {{.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0}};
1540 size_t num_src_fields =
sizeof(src_fields) /
sizeof(src_fields[0]);
1542 {.location =
YAC_LOC_CELL, .coordinates_idx = 0, .masks_idx = 0};
1548 enum {OVERWRITE_CONFIG_COUNT = 3};
1550 overwrite_configs[OVERWRITE_CONFIG_COUNT+1];
1551 overwrite_configs[OVERWRITE_CONFIG_COUNT] = NULL;
1565 overwrite_configs[0] =
1584 overwrite_configs[1] =
1603 overwrite_configs[2] =
1609 double const fixed_value = -2.0;
1635 for (
size_t i = 0;
i <
grid_data.num_cells; ++
i) tgt_field[i] = -1;
1639 src_field[i] = (
double)(
grid_data.cell_ids[
i]);
1644 double ref_tgt_field[7*7];
1645 for (
size_t i = 0;
i < 7*7; ++
i) ref_tgt_field[i] = 0.0;
1647 size_t unset_tgt[] = {0,1,2,3,4,5,6, 7,8,9, 14,15, 21, 28, 35, 42};
1648 for (
size_t i = 0;
i <
sizeof(unset_tgt)/
sizeof(unset_tgt[0]); ++
i)
1649 ref_tgt_field[unset_tgt[i]] = -1.0;
1655 {{.global_id = 2, .tgt_idx = 10}, {.global_id = 3, .tgt_idx = 10},
1656 {.global_id = 4, .tgt_idx = 11}, {.global_id = 5, .tgt_idx = 12},
1657 {.global_id = 14, .tgt_idx = 22}, {.global_id = 21, .tgt_idx = 22},
1658 {.global_id = 28, .tgt_idx = 29}, {.global_id = 35, .tgt_idx = 36},
1659 {.global_id = 42, .tgt_idx = 43}};
1660 for (
size_t i = 0;
i <
sizeof(direct)/
sizeof(direct[0]); ++
i)
1661 ref_tgt_field[direct[i].tgt_idx] += (
double)(direct[
i].global_id);
1669 .tgt_idx = (
size_t[]){10, 16,17, 22,23,24},
1672 .tgt_idx = (
size_t[]){10,11, 17},
1675 .tgt_idx = (
size_t[]){16,17, 23},
1677 for (
size_t i = 0;
i <
sizeof(wsum)/
sizeof(wsum[0]); ++
i)
1678 for (
size_t j = 0; j < wsum[
i].tgt_count; ++j)
1679 ref_tgt_field[wsum[i].tgt_idx[j]] +=
1680 (
double)(wsum[
i].global_id) / (
double)(wsum[
i].tgt_count);
1682 size_t fixed_tgt[] =
1683 {13, 18,19,20, 25,26,27, 30,31,32,33,34,
1684 37,38,39,40,41, 44,45,46,47,48};
1685 for (
size_t i = 0;
i <
sizeof(fixed_tgt)/
sizeof(fixed_tgt[0]); ++
i)
1686 ref_tgt_field[fixed_tgt[i]] = fixed_value;
1692 tgt_field[i]) > 1e-9)
PUT_ERR(
"wrong interpolation result");
1703 for (
size_t i = 0;
i < OVERWRITE_CONFIG_COUNT; ++
i)
1720static double utest_get_sq_sphere_radius(
1723 double sq_sphere_radius;
1727 double sphere_radius =
1729 sq_sphere_radius = sphere_radius * sphere_radius;
1730 }
else sq_sphere_radius = 1.0;
1731 return sq_sphere_radius;
1734static double utest_compute_scale(
1736 double src_cell_area,
double tgt_cell_area) {
1742 scale *= src_cell_area;
1745 scale /= tgt_cell_area;
1750static void utest_write_area_file(
1751 char const * filename,
double * cell_areas,
size_t dim_x,
size_t dim_y) {
1766 char const * area_2d_varname =
"area_2d";
1767 char const * area_1d_varname =
"area_1d";
1769 int area_2d_dim_ids[2] = {dim_x_id, dim_y_id};
1770 int area_1d_dim_ids[1] = {dim_xy_id};
1778 ncid, area_2d_varname, NC_DOUBLE, 2, area_2d_dim_ids, &area_2d_varid));
1781 ncid, area_1d_varname, NC_DOUBLE, 1, area_1d_dim_ids, &area_1d_varid));
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)
size_t yac_basic_grid_add_mask_nocpy(struct yac_basic_grid *grid, enum yac_location location, int const *mask, char const *mask_name)
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[])
static double get_vector_angle(double const a[3], double const b[3])
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 yac_spmap_cell_area_config const * yac_spmap_scale_config_get_tgt_cell_area_config(struct yac_spmap_scale_config const *scale_config)
double yac_spmap_cell_area_config_get_sphere_radius(struct yac_spmap_cell_area_config const *cell_area_config)
struct yac_spmap_cell_area_config * yac_spmap_cell_area_config_file_new(char const *filename, char const *varname, yac_int min_global_id)
struct yac_spmap_overwrite_config * yac_spmap_overwrite_config_new(struct yac_point_selection const *src_point_selection, struct yac_interp_spmap_config const *config)
enum yac_interp_spmap_cell_area_provider yac_spmap_cell_area_config_get_type(struct yac_spmap_cell_area_config const *cell_area_config)
struct yac_spmap_cell_area_config const * yac_spmap_scale_config_get_src_cell_area_config(struct yac_spmap_scale_config const *scale_config)
struct interp_method * yac_interp_method_spmap_new(struct yac_interp_spmap_config const *default_config, struct yac_spmap_overwrite_config const *const *overwrite_configs)
struct yac_interp_spmap_config * yac_interp_spmap_config_new(double spread_distance, double max_search_distance, enum yac_interp_spmap_weight_type weight_type, struct yac_spmap_scale_config const *scale_config)
void yac_spmap_scale_config_delete(struct yac_spmap_scale_config *scale_config)
void yac_interp_spmap_config_delete(struct yac_interp_spmap_config *config)
void yac_spmap_cell_area_config_delete(struct yac_spmap_cell_area_config *cell_area_config)
struct yac_spmap_cell_area_config * yac_spmap_cell_area_config_yac_new(double sphere_radius)
void yac_spmap_overwrite_config_delete(struct yac_spmap_overwrite_config *overwrite_config)
struct yac_spmap_scale_config * yac_spmap_scale_config_new(enum yac_interp_spmap_scale_type scale_type, struct yac_spmap_cell_area_config const *source_cell_area_config, struct yac_spmap_cell_area_config const *target_cell_area_config)
#define YAC_INTERP_SPMAP_MAX_SEARCH_DISTANCE_DEFAULT
yac_interp_spmap_scale_type
@ YAC_INTERP_SPMAP_NONE
weights are not scaled
@ YAC_INTERP_SPMAP_INVTGTAREA
@ YAC_INTERP_SPMAP_SRCAREA
@ YAC_INTERP_SPMAP_FRACAREA
#define YAC_INTERP_SPMAP_SCALE_CONFIG_DEFAULT
#define YAC_INTERP_SPMAP_WEIGHTED_DEFAULT
#define YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT
@ YAC_INTERP_SPMAP_CELL_AREA_YAC
yac_interp_spmap_weight_type
#define YAC_INTERP_SPMAP_OVERWRITE_DEFAULT
#define YAC_INTERP_SPMAP_DEFAULT_CONFIG
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
void yac_nc_create(const char *path, int cmode, int *ncidp)
struct yac_point_selection * yac_point_selection_bnd_circle_new(double center_lon, double center_lat, double inc_angle)
void yac_point_selection_delete(struct yac_point_selection *point_select)
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[]
struct yac_spmap_scale_config * scale_config
struct yac_spmap_cell_area_config * tgt
static MPI_Comm split_comm
static char const * grid_names[2]
enum yac_interp_spmap_scale_type scale_types[]
enum yac_interp_weights_reorder_type reorder_types[]
enum yac_interp_spmap_weight_type weight_types[]
#define YAC_HANDLE_ERROR(exp)
struct yac_basic_grid ** grids
double(* yac_coordinate_pointer)[3]