250 char const * weight_filename,
int src_address_offset,
251 int tgt_address_offset,
struct link_data ** links,
252 unsigned * num_links,
enum yac_location ** src_locations,
253 enum yac_location * tgt_location,
unsigned * max_src_idx,
254 unsigned * max_tgt_idx) {
256 int ncid, dimid, var_id;
264 "ERROR(read_link_data): unsupported weight file type")
271 YAC_HANDLE_ERROR(nc_inq_attlen(ncid, var_id,
"contains_links", &str_link_len));
272 str_link = malloc(str_link_len + 1);
273 str_link[str_link_len] =
'\0';
274 YAC_HANDLE_ERROR(nc_get_att_text(ncid, var_id,
"contains_links", str_link));
277 (strlen(
"TRUE") == str_link_len) &&
278 !strncmp(
"TRUE", str_link, str_link_len);
281 ((strlen(
"FALSE") == str_link_len) &&
282 !strncmp(
"FALSE", str_link, str_link_len)),
283 "invalid global attribute contains_links")
287 if (!contains_links) {
290 *src_locations = NULL;
301 num_wgts == 1,
"unsupported number of weights per link "
302 "(num_wgts = %zu; has to be 1)", num_wgts)
305 size_t num_links_in_file = 0;
308 YAC_ASSERT(num_links_in_file > 0,
"no links defined")
309 *num_links = num_links_in_file;
310 *links = malloc(num_links_in_file *
sizeof(**links));
312 size_t num_pointsets = 0;
313 unsigned * num_links_per_pointset;
324 YAC_ASSERT(num_pointsets > 0,
"no point sets in file")
327 size_t max_loc_str_len;
332 "wrong max location string length in weight file")
335 *src_locations = malloc(num_pointsets *
sizeof(**src_locations));
338 for (
unsigned i = 0; i < num_pointsets; ++i) {
342 size_t str_start[2] = {i, 0};
346 nc_get_vara_text(ncid, var_id, str_start, str_count, loc_str));
360 num_links_per_pointset =
361 malloc(num_pointsets *
sizeof(*num_links_per_pointset));
371 *src_locations = malloc(num_pointsets *
sizeof(**src_locations));
374 num_links_per_pointset =
375 malloc(num_pointsets *
sizeof(*num_links_per_pointset));
376 num_links_per_pointset[0] = num_links_in_file;
383 for (
unsigned i = 0; i < num_links_per_pointset[
points_idx];
386 free(num_links_per_pointset);
389 int * address = malloc(num_links_in_file *
sizeof(*address));
393 for (
unsigned i = 0; i < num_links_in_file; ++i) {
394 int idx = address[i] + src_address_offset;
396 if ((
unsigned)idx > *max_src_idx) *max_src_idx = (unsigned)idx;
397 (*links)[i].src_idx = (unsigned)idx;
403 for (
unsigned i = 0; i < num_links_in_file; ++i) {
404 int idx = address[i] + tgt_address_offset;
406 if ((
unsigned)idx > *max_tgt_idx) *max_tgt_idx = (unsigned)idx;
407 (*links)[i].tgt_idx = (unsigned)idx;
411 double * weights = malloc(num_links_in_file *
sizeof(*weights));
414 for (
size_t i = 0; i < num_links_in_file; ++i)
415 (*links)[i].weight = weights[i];
542 struct link_data * links,
unsigned num_links,
550 size_t num_grid_corners[2] =
551 {src_grid.num_vertices, tgt_grid.num_vertices};
552 size_t total_num_points =
553 num_grid_corners[0] + num_grid_corners[1] + 2 * (size_t)num_links;
554 size_t num_polygons[3] =
555 {src_grid.num_cells, tgt_grid.num_cells, num_links};
556 size_t total_num_polygons =
557 num_polygons[0] + num_polygons[1] + num_polygons[2];
562 memcpy(
points, src_grid.vertex_coordinates,
563 src_grid.num_vertices *
sizeof(*
points));
564 memcpy(
points + src_grid.num_vertices, tgt_grid.vertex_coordinates,
565 tgt_grid.num_vertices *
sizeof(*
points));
567 links, num_links, &src_grid, &tgt_grid, src_locations, tgt_location,
568 points + num_grid_corners[0] + num_grid_corners[1]);
570 unsigned * num_points_per_polygon =
571 malloc(total_num_polygons *
sizeof(*num_points_per_polygon));
572 unsigned num_points_per_polygon_sum[3] = {0, 0, 0};
573 for (
size_t i = 0; i < num_polygons[0]; ++i) {
574 num_points_per_polygon_sum[0] +=
575 (num_points_per_polygon[i] =
576 (unsigned)(src_grid.num_vertices_per_cell[i]));
578 for (
size_t i = 0; i < num_polygons[1]; ++i) {
579 num_points_per_polygon_sum[1] +=
580 (num_points_per_polygon[num_polygons[0] + i] =
581 (unsigned)(tgt_grid.num_vertices_per_cell[i]));
583 for (
size_t i = 0; i < num_polygons[2]; ++i)
584 num_points_per_polygon[num_polygons[0] + num_polygons[1] + i] = 2;
585 num_points_per_polygon_sum[2] = 2 * num_polygons[2];
587 unsigned * polygon_data =
588 malloc((num_points_per_polygon_sum[0] + num_points_per_polygon_sum[1] +
589 num_points_per_polygon_sum[2]) *
sizeof(*polygon_data));
592 num_grid_corners[0]);
594 num_links, polygon_data + num_points_per_polygon_sum[0] +
595 num_points_per_polygon_sum[1], num_grid_corners[0] + num_grid_corners[1]);
601 unsigned * polygon_type = malloc(total_num_polygons *
sizeof(*polygon_type));
602 for (
size_t i = 0; i < num_polygons[0]; ++i) polygon_type[i] = 0;
603 for (
size_t i = 0; i < num_polygons[1]; ++i)
604 polygon_type[num_polygons[0] + i] = 1;
605 for (
size_t i = 0; i < num_polygons[2]; ++i)
606 polygon_type[num_polygons[0] + num_polygons[1] + i] = 2;
608 double * weights = NULL;
610 weights = malloc(total_num_polygons *
sizeof(*weights));
611 for (
size_t i = 0; i < num_polygons[0] + num_polygons[1]; ++i)
613 for (
size_t i = 0; i < num_polygons[2]; ++i)
614 weights[i + num_polygons[0] + num_polygons[1]] = links[i].
weight;
617 int * cell_ids = malloc(total_num_polygons *
sizeof(*cell_ids));
618 if (src_grid.cell_ids != NULL) {
619 for (
size_t i = 0; i < num_polygons[0]; ++i)
620 cell_ids[i] = (
int)(src_grid.cell_ids[i]);
622 for (
size_t i = 0; i < num_polygons[0]; ++i) cell_ids[i] = (
int)i;
624 if (tgt_grid.cell_ids != NULL) {
625 for (
size_t i = 0; i < num_polygons[1]; ++i)
626 cell_ids[num_polygons[0] + i] = (
int)(tgt_grid.cell_ids[i]);
628 for (
size_t i = 0; i < num_polygons[1]; ++i)
629 cell_ids[num_polygons[0] + i] = (
int)i;
631 for (
size_t i = 0; i < num_polygons[2]; ++i)
632 cell_ids[num_polygons[0] + num_polygons[1] + i] = (
int)i;
634 int * src_ids = malloc(total_num_polygons *
sizeof(*src_ids));
635 for (
size_t i = 0; i < num_polygons[0] + num_polygons[1]; ++i)
637 for (
size_t i = 0; i < num_polygons[2]; ++i)
638 src_ids[i + num_polygons[0] + num_polygons[1]] =
642 int * tgt_ids = malloc(total_num_polygons *
sizeof(*tgt_ids));
643 for (
size_t i = 0; i < num_polygons[0] + num_polygons[1]; ++i)
645 for (
size_t i = 0; i < num_polygons[2]; ++i)
646 tgt_ids[i + num_polygons[0] + num_polygons[1]] =
648 &tgt_grid, links[i].
tgt_idx, tgt_location);
650 int * vertex_ids = malloc(total_num_points *
sizeof(*vertex_ids));
651 if (src_grid.vertex_ids != NULL) {
652 for (
size_t i = 0; i < src_grid.num_vertices; ++i)
653 vertex_ids[i] = (
int)(src_grid.vertex_ids[i]);
655 for (
size_t i = 0; i < src_grid.num_vertices; ++i)
656 vertex_ids[i] = (
int)i;
658 if (tgt_grid.vertex_ids != NULL) {
659 for (
size_t i = 0; i < tgt_grid.num_vertices; ++i)
660 vertex_ids[src_grid.num_vertices + i] = (
int)(tgt_grid.vertex_ids[i]);
662 for (
size_t i = 0; i < tgt_grid.num_vertices; ++i)
663 vertex_ids[src_grid.num_vertices + i] = (
int)i;
665 for (
size_t i = 0; i < 2 * (size_t)num_links; ++i)
666 vertex_ids[src_grid.num_vertices + tgt_grid.num_vertices + i] =
676 file, polygon_data, num_points_per_polygon, total_num_polygons);
678 file, cell_ids, total_num_polygons,
"cell_ids");
680 file, src_ids, total_num_polygons,
"src_ids");
682 file, tgt_ids, total_num_polygons,
"tgt_ids");
684 file, polygon_type, total_num_polygons,
"polygon_type");
687 file, weights, total_num_polygons,
"weights");
689 file, vertex_ids, total_num_points,
"vertex_ids");
703 free(num_points_per_polygon);