void free_mesh_arrays(MESH_INFO_PTR mesh) { int i; for (i = 0; i < mesh->elem_array_len; i++) free_element_arrays(&(mesh->elements[i]), mesh); safe_free((void **)(void *) &(mesh->elements)); safe_free((void **)(void *) &(mesh->blank)); for (i = 0; i < mesh->num_el_blks; i++) safe_free((void **)(void *) &(mesh->eb_names[i])); safe_free((void **)(void *) &(mesh->eb_names)); safe_free((void **)(void *) &(mesh->eb_etypes)); safe_free((void **)(void *) &(mesh->ecmap_id)); safe_free((void **)(void *) &(mesh->ecmap_cnt)); safe_free((void **)(void *) &(mesh->ecmap_elemids)); safe_free((void **)(void *) &(mesh->ecmap_sideids)); safe_free((void **)(void *) &(mesh->ecmap_neighids)); safe_free((void **)(void *) &(mesh->hgid)); safe_free((void **)(void *) &(mesh->hindex)); safe_free((void **)(void *) &(mesh->hvertex)); safe_free((void **)(void *) &(mesh->hvertex_proc)); safe_free((void **)(void *) &(mesh->heWgtId)); safe_free((void **)(void *) &(mesh->hewgts)); }
void migrate_pack_elem(void *data, int num_gid_entries, int num_lid_entries, ZOLTAN_ID_PTR elem_gid, ZOLTAN_ID_PTR elem_lid, int mig_part, int elem_data_size, char *buf, int *ierr) { int gid = num_gid_entries-1; int lid = num_lid_entries-1; if (data == NULL) { *ierr = ZOLTAN_FATAL; return; } MESH_INFO_PTR mesh = (MESH_INFO_PTR) data; ELEM_INFO *elem = mesh->elements; int proc = 0; MPI_Comm_rank(MPI_COMM_WORLD, &proc); int idx; ELEM_INFO *current_elem = (num_lid_entries ? &(elem[elem_lid[lid]]) : search_by_global_id(mesh, elem_gid[gid], &idx)); int num_nodes = mesh->eb_nnodes[current_elem->elem_blk]; ELEM_INFO *elem_mig = (ELEM_INFO *) buf; /* * copy the ELEM_INFO structure */ *elem_mig = *current_elem; int size = sizeof(ELEM_INFO); /* * copy the allocated integer fields for this element. */ /* Pad the buffer so the following casts will work. */ size = Zoltan_Align(size); ZOLTAN_ID_TYPE *buf_id_type = (ZOLTAN_ID_TYPE *) (buf + size); /* copy the connect table */ if (mesh->num_dims > 0) { for (int i = 0; i < num_nodes; i++) { *buf_id_type++ = current_elem->connect[i]; } size += num_nodes * sizeof(ZOLTAN_ID_TYPE); } /* copy the adjacency info */ /* send globalID for all adjacencies */ for (int i = 0; i < current_elem->adj_len; i++) { if (current_elem->adj[i] != ZOLTAN_ID_INVALID && current_elem->adj_proc[i] == proc) *buf_id_type++ = New_Elem_Index[current_elem->adj[i]]; else *buf_id_type++ = current_elem->adj[i]; } size += current_elem->adj_len * sizeof(ZOLTAN_ID_TYPE); int *buf_int = (int *)(buf + size); for (int i = 0; i < current_elem->adj_len; i++) { *buf_int++ = current_elem->adj_proc[i]; } size += current_elem->adj_len * sizeof(int); /* * copy the allocated float fields for this element. */ /* copy the edge_wgt data */ float *buf_float = NULL; if (Use_Edge_Wgts) { /* Pad the buffer so the following casts will work. */ size = Zoltan_Align(size); buf_float = (float *) (buf + size); for (int i = 0; i < current_elem->adj_len; i++) { *buf_float = current_elem->edge_wgt[i]; buf_float++; } size += current_elem->adj_len * sizeof(float); } /* Pad the buffer so the following casts will work. */ size = Zoltan_Align(size); buf_float = (float *) (buf + size); /* copy coordinate data */ for (int i = 0; i < num_nodes; i++) { for (int j = 0; j < mesh->num_dims; j++) { *buf_float = current_elem->coord[i][j]; buf_float++; } } size += num_nodes * mesh->num_dims * sizeof(float); /* * need to update the Mesh struct to reflect this element * being gone */ mesh->num_elems--; mesh->eb_cnts[current_elem->elem_blk]--; /* * need to remove this entry from this procs list of elements * do so by setting the globalID to ZOLTAN_ID_INVALID. */ current_elem->globalID = ZOLTAN_ID_INVALID; free_element_arrays(current_elem, mesh); /* * NOTE: it is not worth the effort to determine the change in the * number of nodes on this processor until all of the migration is * completed. */ if (size > elem_data_size) *ierr = ZOLTAN_WARN; else *ierr = ZOLTAN_OK; }