- reference elements revisited (extensions, bugfixes...)

- adjacency computation reviewed, bug fixes
- some reformating and refactoring
This commit is contained in:
2011-01-21 10:27:48 +00:00
parent 212c9b86a1
commit b9eed5630c
19 changed files with 855 additions and 721 deletions
+2 -2
View File
@@ -1247,7 +1247,7 @@ _iter_op_get_obj_type (
if ( info->type == H5L_TYPE_EXTERNAL ) {
char *buf;
TRY( buf = h5_alloc(f, NULL, info->u.val_size) );
TRY( buf = h5_calloc(f, 1, info->u.val_size) );
herr = H5Lget_val(g_id, name, buf,
info->u.val_size, H5P_DEFAULT);
@@ -1271,7 +1271,7 @@ _iter_op_get_obj_type (
"Followed external link to file '%s' / object '%s'.",
filename, objname);
free(buf);
h5_free(f, buf);
hid_t obj_id = H5Oopen(g_id, name, H5P_DEFAULT);
if ( obj_id < 0 )
+4 -4
View File
@@ -33,7 +33,7 @@ _get_lustre_stripe_size(h5_file_t *const f, const char *path )
size_t nbytes = sizeof(struct lov_user_md) +
INIT_ALLOC_NUM_OSTS * sizeof(struct lov_user_ost_data);
struct lov_user_md *lum;
TRY( lum = h5_alloc(f, NULL, nbytes) );
TRY( lum = h5_calloc(f, 1, nbytes) );
lum->lmm_magic = LOV_USER_MAGIC;
int fd = open64(path, O_RDONLY);
@@ -84,7 +84,7 @@ _get_lustre_stripe_size(h5_file_t *const f, const char *path )
_print_stripe_info(lum);
ssize_t stripe_size = (ssize_t)lum->lmm_stripe_size;
free(lum);
h5_free(f, lum);
return stripe_size;
}
@@ -98,7 +98,7 @@ h5_optimize_for_lustre (
ssize_t stripe_size;
if ( f->myproc == 0 )
{
char *path = malloc(strlen(filename)+4);
char *path = h5_calloc(f, 1, strlen(filename)+4);
strcpy(path, filename);
/* check for existing file */
FILE *test = fopen(path, "r");
@@ -116,7 +116,7 @@ h5_optimize_for_lustre (
stripe_size = _get_lustre_stripe_size(f, path);
free(path);
h5_free(f, path);
}
TRY( h5priv_mpi_bcast(f, &stripe_size, 1, MPI_LONG_LONG, 0, f->comm) );
+11 -3
View File
@@ -89,7 +89,7 @@ h5_loc_id_t
h5priv_find_idlist (
h5_file_t* const f,
h5_idlist_t* list,
h5_loc_id_t item
const h5_loc_id_t item
) {
UNUSED_ARGUMENT (f);
if (!list) {
@@ -97,9 +97,17 @@ h5priv_find_idlist (
}
register h5_loc_idx_t low = 0;
register h5_loc_idx_t high = list->num_items - 1;
register h5_loc_id_t diff;
register h5_loc_id_t mid;
const h5_loc_id_t face_idx = h5tpriv_get_face_idx(item);
const h5_loc_id_t elem_idx = h5tpriv_get_elem_idx(item);
while (low <= high) {
register h5_loc_idx_t mid = (low + high) / 2;
register h5_loc_id_t diff = list->items[mid] - item;
mid = (low + high) / 2;
diff = h5tpriv_get_elem_idx(list->items[mid]) - elem_idx;
// if element indices are equal, we decide on the face indices
if (diff == 0) {
diff = h5tpriv_get_face_idx(list->items[mid]) - face_idx;
}
if ( diff > 0 )
high = mid - 1;
else if ( diff < 0 )
+4 -4
View File
@@ -302,7 +302,7 @@ h5upriv_close_file (
TRY( h5priv_close_hdf5_dataspace (f, u->diskshape) );
TRY( h5priv_close_hdf5_dataspace (f, u->memshape) );
TRY( h5priv_close_hdf5_property (f, u->dcreate_prop) );
free (f->u);
h5_free (f, f->u);
f->u = NULL;
return f->__errno;
@@ -333,7 +333,7 @@ h5bpriv_close_file (
#if defined(PARALLEL_IO)
TRY( h5priv_mpi_type_free (f, &b->partition_mpi_t) );
#endif
free (f->b);
h5_free (f, f->b);
f->b = NULL;
return H5_SUCCESS;
@@ -368,9 +368,9 @@ h5_close_file (
TRY( h5priv_close_hdf5_property (f, f->create_prop) );
TRY( h5priv_close_hdf5_group (f, f->root_gid) );
TRY( h5priv_close_hdf5_file (f, f->file) );
free (f);
h5_debug (f, "%s (): done", __func__);
h5_free (f, f);
return H5_SUCCESS;
}
+5 -5
View File
@@ -371,7 +371,7 @@ _dissolve_ghostzones (
_dissolve_ghostzone ( f, p_max->p, p_max->q );
free ( p_max );
h5_free (f, p_max);
p_el = p_max = p_begin->next;
while ( p_el ) {
@@ -385,13 +385,13 @@ _dissolve_ghostzones (
p_el->next->prev = p_el->prev;
p_el->prev->next = p_el->next;
p_save = p_el->next;
free ( p_el );
h5_free (f, p_el);
p_el = p_save;
}
}
}
free ( p_begin );
h5_free (f, p_begin);
return H5_SUCCESS;
}
@@ -581,8 +581,8 @@ h5b_3d_set_view (
free(user_layout);
free(write_layout);
h5_free(f, user_layout);
h5_free(f, write_layout);
TRY( h5bpriv_release_hyperslab(f) );
#endif
File diff suppressed because it is too large Load Diff
+197 -179
View File
@@ -43,10 +43,10 @@ release_tv (
h5t_adjacencies_t* adj = &t->adjacencies;
if (adj->tv.v == NULL) return H5_SUCCESS;
h5_loc_idx_t idx = 0;
h5_loc_idx_t vertex_idx = 0;
h5_loc_idx_t last = t->num_vertices[t->num_leaf_levels-1];
for (; idx < last; idx++) {
TRY( h5priv_free_idlist (f, &adj->tv.v[idx]) );
for (; vertex_idx < last; vertex_idx++) {
TRY( h5priv_free_idlist (f, &adj->tv.v[vertex_idx]) );
}
TRY( h5_free (f, adj->tv.v) );
adj->tv.v = NULL;
@@ -66,19 +66,13 @@ compute_elems_of_vertices (
/* loop over all elements in current level */
h5t_fdata_t *t = f->t;
h5_loc_idx_t idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_loc_idx_t last = t->num_elems[t->num_leaf_levels-1];
h5_loc_triangle_t *el = &t->loc_elems.tris[idx];
for (;idx < last; idx++, el++) {
h5_loc_idx_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_loc_idx_t last = (t->num_leaf_levels < 0) ? 0 : t->num_elems[t->num_leaf_levels-1];
for (;elem_idx < last; elem_idx++) {
int face_idx;
int num_faces = h5tpriv_ref_elem_get_num_vertices (t);
for (face_idx = 0; face_idx < num_faces; face_idx++) {
h5_loc_idx_t vidx = el->vertex_indices[face_idx];
TRY( h5priv_insert_idlist (
f,
&t->adjacencies.tv.v[vidx],
h5tpriv_build_vertex_id (face_idx, idx),
-1) );
TRY( h5tpriv_search_tv2 (f, face_idx, elem_idx, NULL) );
}
}
return H5_SUCCESS;
@@ -92,60 +86,51 @@ compute_elems_of_edges (
h5_file_t* const f,
const h5t_lvl_idx_t from_lvl
) {
h5_debug (f, "%s (%lld)", __func__, (long long)from_lvl);
h5t_fdata_t *t = f->t;
h5_loc_idx_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_loc_idx_t num_elems = t->num_elems[t->num_leaf_levels-1];
h5_idlist_t *retval = NULL;
TRY( h5tpriv_resize_te_htab (f, 4*(num_elems-elem_idx)) );
for (;elem_idx < num_elems; elem_idx++) {
h5_loc_idx_t face_idx;
h5_loc_idx_t num_faces = h5tpriv_ref_elem_get_num_edges (t);
for (face_idx = 0; face_idx < num_faces; face_idx++) {
TRY ( h5tpriv_search_te2 (
f, face_idx, elem_idx, &retval ) );
TRY ( h5tpriv_search_te2 (f, face_idx, elem_idx, NULL ) );
}
}
h5_debug (f, "%s (): done", __func__);
return H5_SUCCESS;
}
/*
Compute the children o an edge
*/
static inline h5_err_t
compute_children_of_edge (
h5_file_t * const f,
h5_loc_id_t kid,
h5_idlist_t *children
h5_file_t* const f,
h5_loc_id_t entity_id,
h5_idlist_t** children
) {
h5t_fdata_t *t = f->t;
h5_idlist_t *te;
TRY ( h5tpriv_find_te2 (
f,
h5tpriv_get_face_idx ( kid ),
h5tpriv_get_elem_idx ( kid ),
&te )
);
h5_loc_id_t *edge = te->items;
h5_loc_id_t *end = te->items+te->num_items;
for ( ; edge < end; edge++ ) {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *edge );
h5_loc_idx_t face_idx = h5tpriv_get_face_idx ( *edge );
h5_generic_loc_elem_t *el = (h5_generic_loc_elem_t*)&t->loc_elems.tris[elem_idx];
if ( h5tpriv_is_leaf_elem ( f, el ) == H5_OK ) {
TRY( h5priv_insert_idlist (f, &children, *edge, -1) );
h5_idlist_t* te;
TRY( h5tpriv_find_te (f, entity_id, &te ) );
h5_loc_id_t* edge_idp = te->items;
h5_loc_id_t* end = te->items + te->num_items;
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp);
h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp);
h5_loc_triangle_t *elem = &f->t->loc_elems.tris[elem_idx];
if (h5tpriv_is_leaf_elem (f, elem)) {
TRY( h5priv_insert_idlist (f, children, *edge_idp, -1) );
} else {
h5_loc_id_t kids[2];
TRY ( h5tpriv_get_direct_children_of_edge (
h5_loc_id_t edge_ids[2];
TRY( h5tpriv_get_direct_children_of_edge (
f,
face_idx,
el->child_idx,
kids ) );
TRY ( compute_children_of_edge (
f, kids[0], children ) );
TRY ( compute_children_of_edge (
f, kids[1], children ) );
elem->child_idx,
edge_ids ) );
TRY( compute_children_of_edge (f, edge_ids[0], children) );
TRY( compute_children_of_edge (f, edge_ids[1], children) );
}
}
} while (++edge_idp < end);
return H5_SUCCESS;
}
@@ -155,192 +140,220 @@ compute_children_of_edge (
static inline h5_err_t
compute_sections_of_edge (
h5_file_t * const f,
h5_loc_id_t kid,
h5_idlist_t *children
h5_loc_id_t entity_id,
h5_idlist_t** children
) {
h5t_fdata_t *t = f->t;
h5_idlist_t *te;
TRY ( h5tpriv_find_te2 (
f,
h5tpriv_get_face_idx ( kid ),
h5tpriv_get_elem_idx ( kid ),
&te )
);
h5_loc_id_t *edge = te->items;
h5_idlist_t* te;
TRY( h5tpriv_find_te (f, entity_id, &te) );
h5_loc_id_t* edge_idp = te->items;
h5_loc_id_t *end = te->items+te->num_items;
int refined = 0;
for ( ; edge < end; edge++ ) {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *edge );
h5_loc_idx_t face_idx = h5tpriv_get_face_idx ( *edge );
h5_generic_loc_elem_t *el = (h5_generic_loc_elem_t*)&t->loc_elems.tris[elem_idx];
if ( ! h5tpriv_is_leaf_elem ( f, el ) == H5_OK ) {
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *edge_idp );
h5_loc_idx_t face_idx = h5tpriv_get_face_idx ( *edge_idp );
h5_loc_triangle_t* elem = &f->t->loc_elems.tris[elem_idx];
if (!h5tpriv_is_leaf_elem (f, elem)) {
refined = 1;
h5_loc_id_t kids[2];
TRY ( h5tpriv_get_direct_children_of_edge (
h5_loc_id_t edge_ids[2];
TRY( h5tpriv_get_direct_children_of_edge (
f,
face_idx,
el->child_idx,
kids ) );
TRY ( compute_sections_of_edge (
f, kids[0], children ) );
TRY ( compute_sections_of_edge (
f, kids[1], children ) );
elem->child_idx,
edge_ids) );
TRY( compute_sections_of_edge (f, edge_ids[0], children) );
TRY( compute_sections_of_edge (f, edge_ids[1], children) );
}
}
if ( ! refined ) {
TRY( h5priv_insert_idlist (f, &children, te->items[0], -1) );
} while (++edge_idp < end);
if (!refined) {
TRY( h5priv_insert_idlist (f, children, te->items[0], -1) );
}
return H5_SUCCESS;
}
/*
Add unique ID of vertex given by face and element index to list.
*/
static inline h5_err_t
add_vertex2 (
h5_file_t* const f, // in
h5_idlist_t** list, // out
h5_loc_idx_t face_idx, // in
h5_loc_idx_t elem_idx // in
) {
h5_idlist_t* tv;
TRY( h5tpriv_find_tv2 (f, face_idx, elem_idx, &tv) );
TRY( h5priv_search_idlist (f, list, tv->items[0]) );
return H5_SUCCESS;
}
/*
map edge ID to unique ID
if unique ID not in list: add
Add unique ID of edge given by ID or face and element index.
*/
static inline h5_err_t
add_edge (
h5_file_t * const f,
h5_idlist_t *list,
h5_file_t* const f, // in
h5_idlist_t** list, // out
h5_loc_id_t entity_id // in
) {
h5_idlist_t* te;
TRY( h5tpriv_find_te (f, entity_id, &te) );
TRY( h5priv_search_idlist (f, list, te->items[0]) );
return H5_SUCCESS;
}
static inline h5_err_t
add_edge2 (
h5_file_t* const f,
h5_idlist_t** list,
h5_loc_idx_t face_idx,
h5_loc_idx_t elem_idx
) {
h5_idlist_t *te;
TRY ( h5tpriv_find_te2 ( f, face_idx, elem_idx, &te ) );
TRY ( h5priv_search_idlist ( f, &list, te->items[0] ) );
TRY( h5tpriv_find_te2 (f, face_idx, elem_idx, &te) );
TRY( h5priv_search_idlist (f, list, te->items[0]) );
return H5_SUCCESS;
}
static inline h5_err_t
add_elem2 (
h5_file_t* const f, // in
h5_idlist_t** list, // out
h5_loc_idx_t elem_idx // in
) {
h5_loc_id_t elem_id = h5tpriv_build_triangle_id (0, elem_idx);
TRY( h5priv_search_idlist (f, list, elem_id) );
return H5_SUCCESS;
}
/*
Get upward adjacent edges to vertex given by ID
*/
static inline h5_err_t
get_edges_uadj_to_vertex (
h5_file_t * const f,
h5_file_t* const f,
const h5_loc_id_t entity_id,
h5_idlist_t **list
h5_idlist_t** list
) {
TRY ( h5priv_alloc_idlist ( f, list, 8 ) );
h5t_fdata_t* t = f->t;
h5_loc_idx_t idx;
TRY( h5t_get_vertex_index_of_vertex (f, entity_id, &idx) );
h5_idlist_t* tv = t->adjacencies.tv.v[idx];
h5_loc_idx_t vertex_idx;
TRY( h5t_get_vertex_index_of_vertex (f, entity_id, &vertex_idx) );
h5_idlist_t* tv = f->t->adjacencies.tv.v[vertex_idx];
h5_size_t i;
TRY( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t* vertex_idp = tv->items;
for ( i = 0; i < tv->num_items; i++, vertex_idp++ ) {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *vertex_idp );
h5_loc_idx_t face_idx = h5tpriv_get_face_idx ( *vertex_idp );
h5_generic_loc_elem_t* el = (h5_generic_loc_elem_t*)&t->loc_elems.tris[elem_idx];
h5_loc_id_t* end = vertex_idp + tv->num_items;
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp);
h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*vertex_idp);
h5_loc_triangle_t* elem= &f->t->loc_elems.tris[elem_idx];
if ( h5tpriv_is_leaf_elem ( f, el ) == H5_NOK ) {
if (!h5tpriv_is_leaf_elem (f, elem)) {
continue;
}
h5_loc_idx_t edge_idx;
edge_idx = h5tpriv_get_edge_connected_to_vertex (t->ref_elem, face_idx, 0);
TRY ( add_edge ( f, *list, edge_idx, elem_idx ) );
edge_idx = h5tpriv_get_edge_connected_to_vertex (t->ref_elem, face_idx, 1);
TRY ( add_edge ( f, *list, edge_idx, elem_idx ) );
}
TRY( add_edge2 (f, list,
h5tpriv_ref_elem_get_edge_idx (
f->t, 0, face_idx, 0),
elem_idx) );
TRY( add_edge2 (f, list,
h5tpriv_ref_elem_get_edge_idx (
f->t, 0, face_idx, 1),
elem_idx) );
} while (++vertex_idp < end);
return H5_SUCCESS;
}
static inline h5_err_t
get_triangles_uadj_to_vertex (
h5_file_t * const f,
h5_file_t* const f,
const h5_loc_id_t entity_id,
h5_idlist_t **list
h5_idlist_t** list
) {
h5_loc_idx_t vertex_idx;
TRY( h5t_get_vertex_index_of_vertex (f, entity_id, &vertex_idx) );
h5_idlist_t* tv = f->t->adjacencies.tv.v[vertex_idx];
TRY ( h5priv_alloc_idlist ( f, list, 8 ) );
h5t_fdata_t *t = f->t;
h5_loc_idx_t idx;
TRY( h5t_get_vertex_index_of_vertex (f, entity_id, &idx) );
h5_idlist_t* tv = t->adjacencies.tv.v[idx];
h5_size_t i;
h5_loc_id_t *vertex_idp = tv->items;
for ( i = 0; i < tv->num_items; i++, vertex_idp++ ) {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *vertex_idp );
h5_generic_loc_elem_t* el = (h5_generic_loc_elem_t*)&t->loc_elems.tris[elem_idx];
h5_loc_id_t* end = vertex_idp + tv->num_items;
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp);
h5_loc_triangle_t* elem = &f->t->loc_elems.tris[elem_idx];
if ( h5tpriv_is_leaf_elem ( f, el ) == H5_NOK ) {
if (!h5tpriv_is_leaf_elem (f, elem)) {
continue;
}
TRY( h5priv_search_idlist (f, list,
h5tpriv_build_entity_id (
H5T_TYPE_TRIANGLE, 0, elem_idx)) );
}
TRY( add_elem2 (f, list, elem_idx) );
} while (++vertex_idp < end);
return H5_SUCCESS;
}
static inline h5_err_t
get_triangles_uadj_to_edge (
h5_file_t * const f,
h5_file_t* const f,
const h5_loc_id_t entity_id,
h5_idlist_t **list
h5_idlist_t** list
) {
h5_idlist_t *children;
TRY ( h5priv_alloc_idlist ( f, &children, 8 ) );
TRY ( compute_children_of_edge ( f, entity_id, children ) );
TRY ( h5priv_alloc_idlist ( f, list, 8 ) );
h5_loc_id_t *edge_id = children->items;
h5_idlist_t* children;
TRY( h5priv_alloc_idlist (f, &children, 8) );
TRY( compute_children_of_edge (f, entity_id, &children) );
TRY( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t *edge_idp = children->items;
h5_loc_id_t *end = children->items+children->num_items;
for ( ; edge_id < end; edge_id++ ) {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( *edge_id );
TRY( h5priv_search_idlist (f, list,
h5tpriv_build_entity_id(
H5T_TYPE_TRIANGLE, 0, elem_idx)) );
}
TRY ( h5priv_free_idlist( f, &children ) );
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp);
TRY( add_elem2 (f, list, elem_idx) );
} while (++edge_idp < end);
TRY( h5priv_free_idlist (f, &children) );
return H5_SUCCESS;
}
static inline h5_err_t
get_edges_adj_to_edge (
h5_file_t * const f,
h5_file_t* const f,
const h5_loc_id_t entity_id,
h5_idlist_t **list
h5_idlist_t** list
) {
TRY( h5priv_alloc_idlist (f, list, 8) );
h5_idlist_t *children;
h5_idlist_t* children;
TRY( h5priv_alloc_idlist (f, &children, 8) );
TRY( compute_sections_of_edge ( f, entity_id, children ) );
TRY( compute_sections_of_edge (f, entity_id, &children) );
TRY( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t* edge_id = children->items;
h5_loc_id_t* edge_idp = children->items;
h5_loc_id_t* end = children->items+children->num_items;
h5_idlist_t* te;
for (; edge_id < end; edge_id++) {
h5_loc_idx_t face_idx = h5tpriv_get_face_idx(*edge_id);
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx(*edge_id);
TRY( h5tpriv_find_te2 (f, face_idx, elem_idx, &te) );
TRY( h5priv_search_idlist (f, list, te->items[0]) );
}
do {
TRY( add_edge (f, list, *edge_idp) );
} while (++edge_idp < end);
TRY( h5priv_free_idlist(f, &children) );
return H5_SUCCESS;
}
static inline h5_err_t
get_vertices_dadj_to_edge (
h5_file_t * const f,
h5_file_t* const f,
const h5_loc_id_t entity_id,
h5_idlist_t **list
h5_idlist_t** list
) {
h5_idlist_t *children;
TRY ( h5priv_alloc_idlist ( f, &children, 8 ) );
TRY( compute_sections_of_edge ( f, entity_id, children ) );
TRY ( h5priv_alloc_idlist ( f, list, 8 ) );
int i;
h5_loc_id_t *edge_id = children->items;
for ( i = 0; i < children->num_items; i++, edge_id++ ) {
h5_loc_idx_t vertex_indices[2];
TRY ( h5t_get_vertex_indices_of_edge ( f, *edge_id, vertex_indices ) );
TRY ( h5priv_search_idlist ( f, list, vertex_indices[0] ) );
TRY ( h5priv_search_idlist ( f, list, vertex_indices[1] ) );
}
TRY ( h5priv_free_idlist( f, &children ) );
h5_idlist_t* children;
TRY( h5priv_alloc_idlist (f, &children, 8) );
TRY( compute_sections_of_edge (f, entity_id, &children) );
TRY( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t* edge_idp = children->items;
h5_loc_id_t* end = edge_idp + children->num_items;
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp);
h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp);
TRY( add_vertex2 (f, list,
h5tpriv_ref_elem_get_vertex_idx (
f->t, 1, face_idx, 0),
elem_idx) );
TRY( add_vertex2 (f, list,
h5tpriv_ref_elem_get_vertex_idx (
f->t, 1, face_idx, 1),
elem_idx) );
} while (++edge_idp < end);
TRY( h5priv_free_idlist (f, &children) );
return H5_SUCCESS;
}
@@ -364,17 +377,24 @@ get_vertices_dadj_to_triangle (
TRY( compute_sections_of_edge (
f,
h5tpriv_build_edge_id (face_idx, elem_idx),
children) );
&children) );
}
TRY ( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t *edge_idp = children->items;
int i;
for ( i = 0; i < children->num_items; i++, edge_idp++ ) {
h5_loc_idx_t vertex_indices[2];
TRY ( h5t_get_vertex_indices_of_edge ( f, *edge_idp, vertex_indices ) );
TRY ( h5priv_search_idlist ( f, list, vertex_indices[0] ) );
TRY ( h5priv_search_idlist ( f, list, vertex_indices[1] ) );
}
h5_loc_id_t *end = edge_idp + children->num_items;
do {
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp);
h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp);
TRY( add_vertex2 (f, list,
h5tpriv_ref_elem_get_vertex_idx (
f->t, 1, face_idx, 0),
elem_idx) );
TRY( add_vertex2 (f, list,
h5tpriv_ref_elem_get_vertex_idx (
f->t, 1, face_idx, 1),
elem_idx) );
} while (++edge_idp < end);
TRY ( h5priv_free_idlist(f, &children) );
return H5_SUCCESS;
}
@@ -387,23 +407,21 @@ get_edges_dadj_to_triangle (
) {
h5_idlist_t* children;
TRY ( h5priv_alloc_idlist (f, &children, 8) );
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id);
// loop over all edges of triangle
h5_loc_idx_t face_idx;
h5_loc_idx_t num_faces = h5tpriv_ref_elem_get_num_edges (f->t);
for ( face_idx = 0; face_idx < num_faces; face_idx++ ) {
h5_loc_idx_t edge_idx = h5tpriv_ref_elem_get_num_edges (f->t);
while (--edge_idx >= 0) {
TRY( compute_sections_of_edge (
f,
h5tpriv_build_edge_id (face_idx, elem_idx),
children) );
h5tpriv_build_edge_id (edge_idx, elem_idx),
&children) );
}
TRY ( h5priv_alloc_idlist (f, list, 8) );
h5_loc_id_t *edge_idp = children->items;
int i;
for (i = 0; i < children->num_items; i++, edge_idp++) {
TRY ( h5priv_search_idlist (f, list, *edge_idp) );
}
h5_loc_id_t* edge_idp = children->items;
h5_loc_id_t* end = edge_idp + children->num_items;
do {
TRY( add_edge (f, list, *edge_idp) );
} while (++edge_idp < end);
TRY ( h5priv_free_idlist(f, &children) );
return H5_SUCCESS;
}
+2
View File
@@ -88,6 +88,8 @@
#define h5tpriv_build_triangle_id( face_idx, elem_idx ) \
( h5tpriv_build_entity_id ( H5T_TYPE_TRIANGLE, face_idx, elem_idx ) )
#define h5tpriv_build_tet_id( face_idx, elem_idx ) \
( h5tpriv_build_entity_id ( H5T_TYPE_TET, face_idx, elem_idx ) )
#define h5tpriv_get_face_idx( entity_id ) \
+88 -13
View File
@@ -3,6 +3,32 @@
#include "h5core/h5_core.h"
#include "h5_core_private.h"
h5_err_t
h5tpriv_search_tv2 (
h5_file_t* const f,
h5_loc_idx_t face_idx,
h5_loc_idx_t elem_idx,
h5_idlist_t** idlist
) {
H5_CORE_API_ENTER;
h5_err_t ret_value = H5_SUCCESS;
h5t_fdata_t* t = f->t;
h5_loc_idx_t vertex_idx;
TRY2( ret_value = h5t_get_vertex_index_of_vertex2 (
f,
face_idx, elem_idx,
&vertex_idx) );
TRY2( ret_value = h5priv_search_idlist (
f,
&t->adjacencies.tv.v[vertex_idx],
h5tpriv_build_vertex_id (face_idx, elem_idx)) );
H5_CORE_API_RETURN (ret_value);
}
static int
cmp_te_entries (
const void* __a,
@@ -18,14 +44,15 @@ compute_te_hashval (
const void* __item
) {
h5t_te_entry_t* item = (h5t_te_entry_t*)__item;
char* key = (char*)item->key.vids;
unsigned int count = 2 * sizeof (item->key.vids[0]);
uint16_t* key = (uint16_t*)item->key.vids;
unsigned int count = 2*sizeof (item->key.vids[0]) / sizeof (uint16_t);
unsigned int hval = count;
while (count-- > 0) {
if (key[count]) {
hval <<= 4;
hval += key[count];
while (count--) {
if (*key) {
hval <<= 6;
hval += *key;
}
key++;
}
return hval;
}
@@ -123,8 +150,8 @@ h5tpriv_search_te2 (
Passing item with type entry type.
*/
h5_err_t
h5tpriv_find_te (
static inline h5_err_t
find_te (
h5_file_t* const f,
h5t_te_entry_t* item, // in: item to find
h5_idlist_t** idlist // out:
@@ -151,6 +178,20 @@ h5tpriv_find_te (
Passing item with face and local element ID.
*/
h5_err_t
h5tpriv_find_te (
h5_file_t* const f,
h5_loc_idx_t edge_id, // in
h5_idlist_t** idlist // out
) {
h5t_te_entry_t item;
TRY( h5t_get_vertex_indices_of_edge (
f,
edge_id,
item.key.vids) );
return find_te (f, &item, idlist);
}
h5_err_t
h5tpriv_find_te2 (
h5_file_t* const f,
@@ -164,7 +205,7 @@ h5tpriv_find_te2 (
face_idx,
elem_idx,
item.key.vids) );
return h5tpriv_find_te (f, &item, idlist);
return find_te (f, &item, idlist);
}
static int
@@ -177,12 +218,13 @@ cmp_td_entries (
return memcmp (a->key.vids, b->key.vids, sizeof(a->key.vids));
}
#if 0
static unsigned int
compute_td_hashval (
const void* __item
) {
h5t_te_entry_t* item = (h5t_te_entry_t*)__item;
char* key = (char*)item->key.vids;
unsigned char* key = (unsigned char*)item->key.vids;
unsigned int count = sizeof (h5_3id_t);
unsigned int hval = count;
while (count-- > 0) {
@@ -193,6 +235,25 @@ compute_td_hashval (
}
return hval;
}
#endif
static unsigned int
compute_td_hashval (
const void* __item
) {
h5t_td_entry_t* item = (h5t_td_entry_t*)__item;
uint16_t* key = (uint16_t*)item->key.vids;
unsigned int count = 3 * sizeof (item->key.vids[0]) / sizeof (uint16_t);
unsigned int hval = count;
while (count--) {
if (*key) {
hval <<= 6;
hval += *key;
}
key++;
}
return hval;
}
static h5_err_t
release_td_entry (
@@ -276,8 +337,8 @@ h5tpriv_search_td2 (
return H5_SUCCESS;
}
h5_err_t
h5tpriv_find_td (
static inline h5_err_t
find_td (
h5_file_t* const f,
h5t_td_entry_t* item,
h5_idlist_t** idlist // out
@@ -297,6 +358,20 @@ h5tpriv_find_td (
return H5_SUCCESS;
}
h5_err_t
h5tpriv_find_td (
h5_file_t* const f,
h5_loc_idx_t triangle_id,
h5_idlist_t** idlist
) {
h5t_td_entry_t item;
TRY( h5t_get_vertex_indices_of_triangle (
f,
triangle_id,
item.key.vids) );
return find_td (f, &item, idlist);
}
h5_err_t
h5tpriv_find_td2 (
h5_file_t* const f,
@@ -310,7 +385,7 @@ h5tpriv_find_td2 (
face_idx,
elem_idx,
item.key.vids) );
return h5tpriv_find_td (f, &item, idlist);
return find_td (f, &item, idlist);
}
/*
+12 -13
View File
@@ -9,28 +9,19 @@ typedef struct h5t_td_entry_key {
h5_loc_idx_t vids[3];
} h5t_td_entry_key_t;
typedef struct h5t_idlisthash_key {
h5_loc_id_t ids[1];
} h5t_idlisthash_key_t;
/*
List of all upward adjacent elements of same coarsness of a specific face.
The face is specified by its local vertex IDs.
*/
typedef struct h5_te_entry {
h5_idlist_t* value;
h5t_te_entry_key_t key;
h5_idlist_t* value;
} h5t_te_entry_t;
typedef struct h5_td_entry {
h5_idlist_t* value;
h5t_td_entry_key_t key;
} h5t_td_entry_t;
typedef struct h5t_idlisthash_entry {
h5_idlist_t* value;
h5t_idlisthash_key_t key;
} h5t_idlisthash_entry_t;
} h5t_td_entry_t;
h5_err_t
h5tpriv_resize_te_htab (
@@ -38,6 +29,14 @@ h5tpriv_resize_te_htab (
size_t nel
);
h5_err_t
h5tpriv_search_tv2 (
h5_file_t * const f,
h5_loc_idx_t face_idx,
h5_loc_idx_t elem_idx,
h5_idlist_t **entry
);
h5_err_t
h5tpriv_search_te2 (
h5_file_t * const f,
@@ -49,7 +48,7 @@ h5tpriv_search_te2 (
h5_err_t
h5tpriv_find_te (
h5_file_t * const f,
h5t_te_entry_t *item,
h5_loc_idx_t edge_id,
h5_idlist_t **retval
);
@@ -78,7 +77,7 @@ h5tpriv_search_td2 (
h5_err_t
h5tpriv_find_td (
h5_file_t * const f,
h5t_td_entry_t *item,
h5_loc_idx_t triangle_id,
h5_idlist_t **retval
);
+30 -17
View File
@@ -176,7 +176,9 @@ h5tpriv_rebuild_elem_indices_mapping (
return H5_SUCCESS;
}
/*
Get local vertex indices of entity given by it's local ID.
*/
h5_err_t
h5t_get_vertex_indices_of_entity (
h5_file_t* const f, // in
@@ -195,10 +197,13 @@ h5t_get_vertex_indices_of_entity (
h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id);
h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id);
int dim = map_entity_type_to_dimension[entity_type];
assert (dim >= 0);
return h5t_get_vertex_indices_of_entity2 (f, dim, face_idx, elem_idx, vertex_indices);
}
/*
Get local vertex indices of entity given by it's face and local element index.
*/
h5_err_t
h5t_get_vertex_indices_of_entity2 (
h5_file_t* const f, // [in]
@@ -212,7 +217,7 @@ h5t_get_vertex_indices_of_entity2 (
int num_vertices = ref_elem->num_vertices_of_face[dim][face_idx];
int i;
for (i = 0; i < num_vertices; i++) {
int idx = ref_elem->map[dim][face_idx][i];
int idx = h5tpriv_ref_elem_get_vertex_idx(f->t, dim, face_idx, i);
vertex_indices[i] = indices[idx];
}
return H5_SUCCESS;
@@ -271,10 +276,12 @@ h5t_get_vertex_indices_of_edge2 (
h5_loc_idx_t* vertex_indices // OUT: vertex indices
) {
const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (f, elem_idx);
const h5t_ref_elem_t* ref_elem = f->t->ref_elem;
vertex_indices[0] = indices[ ref_elem->map[1][face_idx][0] ];
vertex_indices[1] = indices[ ref_elem->map[1][face_idx][1] ];
h5_loc_idx_t idx;
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 1, face_idx, 0);
vertex_indices[0] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 1, face_idx, 1);
vertex_indices[1] = indices[idx];
return H5_SUCCESS;
}
@@ -297,13 +304,15 @@ h5t_get_vertex_indices_of_triangle2 (
const h5_loc_idx_t elem_idx,
h5_loc_idx_t* vertex_indices
) {
const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (
f, elem_idx);
const h5t_ref_elem_t* ref_elem = f->t->ref_elem;
const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (f, elem_idx);
vertex_indices[0] = indices[ ref_elem->map[2][face_idx][0] ];
vertex_indices[1] = indices[ ref_elem->map[2][face_idx][1] ];
vertex_indices[2] = indices[ ref_elem->map[2][face_idx][2] ];
h5_loc_idx_t idx;
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 2, face_idx, 0);
vertex_indices[0] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 2, face_idx, 1);
vertex_indices[1] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 2, face_idx, 2);
vertex_indices[2] = indices[idx];
return H5_SUCCESS;
}
@@ -317,12 +326,16 @@ h5t_get_vertex_indices_of_tet (
const h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id);
const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (
f, elem_idx);
const h5t_ref_elem_t* ref_elem = f->t->ref_elem;
vertex_indices[0] = indices[ ref_elem->map[3][0][0] ];
vertex_indices[1] = indices[ ref_elem->map[3][0][1] ];
vertex_indices[2] = indices[ ref_elem->map[3][0][2] ];
vertex_indices[3] = indices[ ref_elem->map[3][0][3] ];
h5_loc_idx_t idx;
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 3, 0, 0);
vertex_indices[0] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 3, 0, 1);
vertex_indices[1] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 3, 0, 2);
vertex_indices[2] = indices[idx];
idx = h5tpriv_ref_elem_get_vertex_idx (f->t, 3, 0, 3);
vertex_indices[3] = indices[idx];
return H5_SUCCESS;
}
+2 -48
View File
@@ -14,7 +14,7 @@ init_loc_elems_struct (
const h5_loc_idx_t num_elems = t->num_elems[t->num_leaf_levels-1];
h5t_lvl_idx_t level_idx = 0;
int num_vertices = h5tpriv_ref_elem_get_num_vertices (t);
int num_facets = h5tpriv_ref_elem_get_num_faces (t, 2);
int num_facets = h5tpriv_ref_elem_get_num_facets (t);
h5_loc_tet_t* loc_elem = t->loc_elems.tets;
h5_glb_tet_t* glb_elem = t->glb_elems.tets;
@@ -69,7 +69,7 @@ init_geom_boundary_info (
h5t_fdata_t* const t = f->t;
h5_loc_idx_t elem_idx = 0;
const h5_loc_idx_t num_elems = t->num_elems[t->num_leaf_levels-1];
int num_facets = h5tpriv_ref_elem_get_num_faces (t, 2);
int num_facets = h5tpriv_ref_elem_get_num_facets (t);
h5_loc_tet_t* loc_elem = t->loc_elems.tets;
h5_glb_tet_t* glb_elem = t->glb_elems.tets;
@@ -86,52 +86,6 @@ init_geom_boundary_info (
if (i == num_facets) {
continue; // no facet on boundary
}
#if 0
// mark elements which are edge- or vertex- adjacent to the boundary
// are there more facets on the boundary?
int j;
for (j = i+1; j < num_facets; j++) {
if (loc_elem->neighbor_indices[j] == -1) {
break; // found another boundary facet
}
}
// get vertex ID's of vertices on boundary
h5_loc_idx_t vertex_indices[4];
if (j < num_facets) {
// all vertices on boundary
vertex_indices[0] = h5tpriv_build_vertex_id (0, elem_idx);
vertex_indices[1] = h5tpriv_build_vertex_id (1, elem_idx);
vertex_indices[2] = h5tpriv_build_vertex_id (2, elem_idx);
vertex_indices[3] = h5tpriv_build_vertex_id (3, elem_idx);
num_vertices = 4;
} else {
// three vertices on boundary
// get vertices of edge i
h5_loc_idx_t face_idx;
face_idx = t->ref_elem->map[2][i][0];
vertex_indices[0] = h5tpriv_get_loc_elem_vertex_idx (
f, elem_idx, face_idx);
face_idx = t->ref_elem->map[2][i][1];
vertex_indices[1] = h5tpriv_get_loc_elem_vertex_idx (
f, elem_idx, face_idx);
face_idx = t->ref_elem->map[2][i][2];
vertex_indices[2] = h5tpriv_get_loc_elem_vertex_idx (
f, elem_idx, face_idx);
num_vertices = 3;
}
// mark elements
for (i = 0; i < num_vertices; i++) {
const h5_loc_idx_t vertex_idx = vertex_indices[i];
h5_idlist_t* list = &t->adjacencies.tv.v[vertex_idx];
// set flag
for (j=0; j < list->num_items; j++) {
h5_loc_idx_t idx = h5tpriv_get_elem_idx (list->items[j]);
t->loc_elems.tris[idx].flags |= H5T_BOUNDARY_ELEM_FLAG;
}
}
#endif
}
return H5_SUCCESS;
}
+2 -42
View File
@@ -14,7 +14,7 @@ init_loc_elems_struct (
const h5_loc_idx_t num_elems = t->num_elems[t->num_leaf_levels-1];
h5t_lvl_idx_t level_idx = 0;
int num_vertices = h5tpriv_ref_elem_get_num_vertices (t);
int num_facets = h5tpriv_ref_elem_get_num_faces (t,1);
int num_facets = h5tpriv_ref_elem_get_num_facets (t);
h5_loc_triangle_t* loc_elem = t->loc_elems.tris;
h5_glb_triangle_t* glb_elem = t->glb_elems.tris;
@@ -70,7 +70,7 @@ init_geom_boundary_info (
h5t_fdata_t* const t = f->t;
h5_loc_idx_t elem_idx = 0;
const h5_loc_idx_t num_elems = t->num_elems[t->num_leaf_levels-1];
int num_facets = h5tpriv_ref_elem_get_num_faces (t, 1);
int num_facets = h5tpriv_ref_elem_get_num_facets (t);
h5_loc_triangle_t* loc_elem = t->loc_elems.tris;
h5_glb_triangle_t* glb_elem = t->glb_elems.tris;
@@ -87,46 +87,6 @@ init_geom_boundary_info (
if (i == num_facets) {
continue; // no facet on boundary
}
#if 0
// mark elements which are edge- or vertex- adjacent to the boundary
// are there more facets on the boundary?
int j;
for (j = i+1; j < num_facets; j++) {
if (loc_elem->neighbor_indices[j] == -1) {
break; // found another boundary facet
}
}
// get vertex ID's of vertices on boundary
h5_loc_idx_t vertex_indices[4];
if (j < num_facets) {
// all vertices on boundary
vertex_indices[0] = h5tpriv_get_loc_elem_vertex_idx (f, elem_idx, 0);
vertex_indices[1] = h5tpriv_get_loc_elem_vertex_idx (f, elem_idx, 1);
vertex_indices[2] = h5tpriv_get_loc_elem_vertex_idx (f, elem_idx, 2);
num_vertices = 3;
} else {
// two vertices on boundary
// get vertices of edge i
h5_loc_idx_t face_idx;
face_idx = t->ref_elem->map[1][i][0];
vertex_indices[0] = h5tpriv_get_loc_elem_vertex_idx (f, elem_idx, face_idx);
face_idx = t->ref_elem->map[1][i][1];
vertex_indices[1] = h5tpriv_get_loc_elem_vertex_idx (f, elem_idx, face_idx);
num_vertices = 2;
}
// mark elements
for (i = 0; i < num_vertices; i++) {
// get upward adjacent elements
const h5_loc_idx_t vertex_idx = vertex_indices[i];
h5_idlist_t* list = &t->adjacencies.tv.v[vertex_idx];
// set flag
for (j=0; j < list->num_items; j++) {
h5_loc_idx_t idx = h5tpriv_get_elem_idx (list->items[j]);
t->loc_elems.tris[idx].flags |= H5T_BOUNDARY_ELEM_FLAG;
}
}
#endif
}
return H5_SUCCESS;
}
+83 -32
View File
@@ -2,6 +2,40 @@
#include "h5_core_private.h"
/*
information we can retrieve from the reference element:
- number of vertices per sub-entity (1)
- vertex indices of all sub-elements
- upward connectivity
- which co-dim 1 entities are connected to a given vertex
- which co-dim 2 entities are connected to a given vertex
- which co-dim 1 entities are connected to a given co-dim 2 entity
- downward connectivity
- vertex coordinates
get_conn(face, dim, dim) -> list
for dim 3 reference elements:
get_conn(0, 3, 0) -> 0, 1, 2, 3 (all vertices)
get_conn(0, 3, 1) -> 0, 1, 2, 3, 4, 5 (all edges)
get_conn(0, 3, 2) -> 0, 1, 2, 3 (all facets)
get_conn(0, 3, 3) -> 0
get_conn(i, 2, 0) -> vertices of facet i
get_conn(i, 2, 1) -> edges of facet i
get_conn(i, 2, 2) -> facets connected to facet i
get_conn(i, 2, 3) -> 0
get_conn(i, 1, 0) -> vertices of edge i
get_conn(i, 1, 1) -> edges connected to edge i
get_conn(i, 1, 2) -> facets connected to edge i
get_conn(i, 1, 3) -> 0
get_conn(i, 0, 0) -> i
get_conn(i, 0, 1) -> edges connected to vertex i
get_conn(i, 0, 2) -> facets connected to vertex i
get_conn(i, 0, 3) -> 0
(1) For triangle and tetrahedral meshes the number of vertices is
identical for all sub-entities within the same dimension. This is not
true for other grids (like prismen)
face: All kinds of sub-elements: vertices, edges, triangles ...
facet: co-dim 1 face
@@ -46,20 +80,21 @@ const h5t_ref_elem_t h5t_tri_ref_elem = {
[1] = {2, 2, 2}, // #vertices of edges
[2] = {3} // #vertices of trinagles
},
{ // map sub-elements to vertices
[0] = {{0}, {1}, {2}}, // 3 vertices
[1] = {{0,1}, {0,2}, {1,2}}, // 3 edges
[2] = {{0,1,2}} // 1 triangles
},
{ // edges connected to vertex
[0] = {0,1},
[1] = {0,2},
[2] = {1,2}
},
{ // triangles connected to vertex
[0] = {0},
[1] = {0},
[2] = {0}
{ // connectivity
// vertices to vertices
[0][0] = {{0}, {1}, {2}},
// vertices to edges
[0][1] = {{0,1}, {0,2}, {1,2}},
// vertices to triangles
[0][2] = {{0}, {0}, {0}},
// edges to vertices
[1][0] = {{0,1}, {0,2}, {1,2}},
// edges to edges
[1][1] = {{0,1,2}, {0,1,2}, {0,1,2}},
// edges to triangle
[1][2] = {{0}, {0}, {0}},
// triangle to vertices
[2][0] = {{0,1,2}}
},
{ // coordinates
{0.0, 0.0},
@@ -68,7 +103,6 @@ const h5t_ref_elem_t h5t_tri_ref_elem = {
}
};
/*
3
**
@@ -111,23 +145,40 @@ const h5t_ref_elem_t h5t_tet_ref_elem = {
[2] = {3,3,3,3}, // #vertices of trinagles
[3] = {4} // #vertices of tets
},
{ // map faces to vertices
[0] = {{0}, {1}, {2}, {3}}, // 4 vertices
[1] = {{0,1}, {0,2}, {1,2}, {0,3}, {1,3}, {2,3}}, // 6 edges
[2] = {{0,1,2}, {0,1,3}, {0,2,3}, {1,2,3}}, // 4 triangles
[3] = {{0,1,2,3}} // 1 tets
},
{ // edges connected to vertex
[0] = {0,1,3},
[1] = {0,2,4},
[2] = {1,2,5},
[3] = {3,4,5}
},
{ // triangles connected to vertex
[0] = {0,1,2},
[1] = {0,1,3},
[2] = {0,2,3},
[3] = {1,2,3}
{ // connectivity
// vertex to vertices
[0][0] = {{0}, {1}, {2}, {3}},
// vertex to edges
[0][1] = {{0,1,3}, {0,2,4}, {1,2,5}, {3,4,5}},
// vertex to triangles
[0][2] = {{0,1,2}, {0,1,3}, {0,2,3}, {1,2,3}},
// vertex to tetrahedron
[0][3] = {{0}, {0}, {0}, {0}},
// edge to vertices
[1][0] = {{0,1}, {0,2}, {1,2}, {0,3}, {1,3}, {2,3}},
// edge to edges
[1][1] = {{0,1,2,3,4}, {0,1,2,3,5}, {0,1,2,4,5},
{0,1,3,4,5}, {0,2,3,4,5}, {1,2,3,4,5}},
// edge to triangle
[1][2] = {{0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3}},
// edge to tetrahedra
[1][3] = {{0}, {0}, {0}, {0}, {0}, {0}},
// triangle to vertices
[2][0] = {{0,1,2}, {0,1,3}, {0,2,3}, {1,2,3}},
// triangle to edges
[2][1] = {{0,1,2}, {0,3,4}, {1,3,5}, {2,4,5}},
// triangle to triangle
[2][2] = {{0,1,2,3}, {0,1,2,3}, {0,1,2,3}, {0,1,2,3}},
// tetrahedron to tetrahedron
[2][3] = {{0}},
// tetrahedron to vertices
[3][0] = {{0,1,2,3}},
// tetrahedron to edges
[3][1] = {{0,1,2,3,4,5}},
// tetrahedron to triangles
[3][2] = {{0,1,2,3}},
// tetrahedron to tetrahedron
[3][2] = {{0}}
},
{ // coordinates
{0.0, 0.0, 0.0},
+11 -7
View File
@@ -2,22 +2,26 @@
#define __H5T_REF_ELEMENTS_PRIVATE_H
#define h5tpriv_ref_elem_get_num_vertices(this) (this->ref_elem->num_faces[0])
#define h5tpriv_ref_elem_get_num_edges(this) (this->ref_elem->num_faces[1])
#define h5tpriv_ref_elem_get_num_facets(this) \
#define h5tpriv_ref_elem_get_num_facets(this) \
(this->ref_elem->num_faces[this->ref_elem->dim - 1])
#define h5tpriv_ref_elem_get_num_faces(this, dim) (this->ref_elem->num_faces[dim])
#define h5tpriv_ref_elem_get_dim(this) (this->ref_elem->dim)
#define h5tpriv_get_edge_connected_to_vertex(this,face_idx, i) \
(this->edges_connected_to_vertex[face_idx][i])
#define h5tpriv_ref_elem_get_entity_type(this,dim) \
(this->ref_elem->entity_types[dim])
#define h5tpriv_get_triangles_connected_to_vertex(this,face_idx, i) \
(this->triangles_connected_to_vertex[face_idx][i])
#define h5tpriv_ref_elem_get_vertex_idx(this, dim, face_idx, i) \
(this->ref_elem->connect[dim][0][face_idx][i])
#define h5tpriv_ref_elem_get_entity_type(this,dim) \
(this->entity_types[dim])
#define h5tpriv_ref_elem_get_edge_idx(this, dim, face_idx, i) \
(this->ref_elem->connect[dim][1][face_idx][i])
#define h5tpriv_ref_elem_get_triangle_idx(this, dim, face_idx, i) \
(this->ref_elem->connect[dim][2][face_idx][i])
#endif
+9 -9
View File
@@ -15,10 +15,10 @@ iter_leaf_elem_idx (
do {
iter->elem_idx++;
if (iter->elem_idx >= f->t->num_elems[iter->leaf_level]) {
return H5_NOK;
return H5_NOK; // done
}
el = h5tpriv_get_loc_elem (f, iter->elem_idx);
} while (h5tpriv_elem_is_on_level (f, el, iter->leaf_level) == H5_NOK);
} while (!h5tpriv_is_leaf_elem (f, el));
return H5_SUCCESS;
}
@@ -32,8 +32,8 @@ iterate_leaf_elems (
h5_debug ( f, "Traversing done!" );
return H5_NOK;
}
int dim = it->ref_elem->dim;
h5_loc_id_t type_id = it->ref_elem->entity_types[dim];
int dim = h5tpriv_ref_elem_get_dim (it);
h5_loc_id_t type_id = h5tpriv_ref_elem_get_entity_type (it, dim);
return h5tpriv_build_entity_id (type_id, 0, it->elem_idx );
}
@@ -49,8 +49,8 @@ iterate_boundary_elems (
return H5_NOK;
}
} while (!h5tpriv_is_boundary_elem (f, it->elem_idx));
int dim = it->ref_elem->dim;
h5_loc_id_t type_id = it->ref_elem->entity_types[dim];
int dim = h5tpriv_ref_elem_get_dim (it);
h5_loc_id_t type_id = h5tpriv_ref_elem_get_entity_type (it, dim);
return h5tpriv_build_entity_id (type_id, 0, it->elem_idx );
}
@@ -80,7 +80,7 @@ iterate_boundary_facets (
it->face_idx++;
}
} while (! h5tpriv_is_boundary_facet (f, it->elem_idx, it->face_idx));
int type = h5tpriv_ref_elem_get_entity_type (it->ref_elem, dim);
int type = h5tpriv_ref_elem_get_entity_type (it, dim);
return h5tpriv_build_entity_id (type, it->face_idx, it->elem_idx );
}
@@ -120,7 +120,7 @@ iterate_leaf_faces (
i++;
h5_loc_idx_t idx = h5tpriv_get_elem_idx (entry->items[i]);
el = h5tpriv_get_loc_elem (f, idx);
} while (h5tpriv_elem_is_on_level (f, el, it->leaf_level) == H5_NOK);
} while (!h5tpriv_is_leaf_elem (f, el));
// 3. Face already visited if
} while (it->elem_idx > h5tpriv_get_elem_idx(entry->items[i]));
@@ -130,7 +130,7 @@ iterate_leaf_faces (
current level and the element index of entry->items[i] is the smallest
element index with the given face on the current level.
*/
return entry->items[0];
return entry->items[i];
}
/*
+3 -26
View File
@@ -16,32 +16,9 @@ extern struct h5t_retrieve_methods h5tpriv_tetm_retrieve_methods;
- the level_id of the element is <= the current level
- and, if any, the direct children is on a level > the current level
*/
static inline h5_err_t
h5tpriv_is_leaf_elem (
h5_file_t* const f,
h5_generic_loc_elem_t *el // ptr to local element
) {
h5t_fdata_t* t = f->t;
if ( (el->level_idx > t->leaf_level) ||
(el->child_idx >= 0 && el->child_idx < f->t->num_elems[f->t->leaf_level]) ) {
return H5_NOK;
}
return H5_SUCCESS;
}
static inline h5_err_t
h5tpriv_elem_is_on_level (
h5_file_t* const f,
h5_generic_loc_elem_t *el, // ptr to local element
const h5t_lvl_idx_t level_idx
) {
assert ( level_idx < f->t->num_leaf_levels );
if ( (el->level_idx > level_idx) ||
(el->child_idx >= 0 && el->child_idx < f->t->num_elems[level_idx]) ) {
return H5_NOK;
}
return H5_SUCCESS;
}
#define h5tpriv_is_leaf_elem(f, el) \
( (el->level_idx <= f->t->leaf_level) && \
(el->child_idx < 0 || el->child_idx >= f->t->num_elems[f->t->leaf_level]) )
static inline h5_err_t
h5tpriv_init_entity_iterator (
+6 -1
View File
@@ -37,7 +37,12 @@ alloc_tets (
return H5_SUCCESS;
}
/*
Return the two direct children of the edge given by face and
element index of first child.
Note: the semantic of elem_idx is a bit confusing.
*/
static h5_err_t
get_direct_children_of_edge (
h5_file_t* const f,
+2 -3
View File
@@ -10,12 +10,11 @@ typedef struct {
int entity_types[H5T_MAX_DIM+1];
int num_faces[H5T_MAX_DIM+1];
int num_vertices_of_face[H5T_MAX_DIM+1][H5T_MAX_FACES];
int map[H5T_MAX_DIM+1][H5T_MAX_FACES][H5T_MAX_VERTICES];
int edges_connected_to_vertex[H5T_MAX_VERTICES][H5T_MAX_FACES];
int triangles_connected_to_vertex[H5T_MAX_VERTICES][H5T_MAX_FACES];
int connect[H5T_MAX_DIM+1][H5T_MAX_DIM+1][H5T_MAX_FACES][H5T_MAX_FACES];
h5_float64_t coords[H5T_MAX_VERTICES][H5T_MAX_DIM];
} h5t_ref_elem_t;
extern const h5t_ref_elem_t h5t_tet_ref_elem;
extern const h5t_ref_elem_t h5t_tri_ref_elem;