diff --git a/src/C/H5Fed_retrieve.c b/src/C/H5Fed_retrieve.c index 08bf376..89f45d5 100644 --- a/src/C/H5Fed_retrieve.c +++ b/src/C/H5Fed_retrieve.c @@ -38,7 +38,7 @@ H5FedBeginTraverseEntities ( ) { h5t_iterator_t* iter; H5_ENTER_API (f, __func__); - if (h5t_create_mesh_iterator (f, &iter, codim) < 0) { + if (h5t_create_leaf_iterator (f, &iter, codim) < 0) { return (void*)H5_ERR; } return iter; @@ -143,16 +143,6 @@ H5FedGetVertexIndicesOfTriangle ( return h5t_get_vertex_indices_of_triangle (f, entity_id, vertex_indices); } -h5_err_t -H5FedGetVertexIndicesOfTriangleCClockwise ( - h5_file_t* const f, - h5_id_t entity_id, - h5_id_t* vertex_indices - ) { - H5_ENTER_API (f, __func__); - return h5t_get_vertex_indices_of_triangle_cclockwise (f, entity_id, vertex_indices); -} - h5_err_t H5FedGetVertexIndicesOfTet ( h5_file_t* const f, diff --git a/src/h5core/h5_core_private.h b/src/h5core/h5_core_private.h index eeb62e3..7f46180 100644 --- a/src/h5core/h5_core_private.h +++ b/src/h5core/h5_core_private.h @@ -42,8 +42,6 @@ if ((int64_t)(ptrdiff_t)(func) <= (int64_t)H5_ERR) \ return H5_ERR; -#define UNUSED_ARGUMENT(x) (void)x - #ifdef IPL_XT3 # define SEEK_END 2 #endif diff --git a/src/h5core/h5t_core_private.h b/src/h5core/h5t_core_private.h index d2221fa..617835b 100644 --- a/src/h5core/h5t_core_private.h +++ b/src/h5core/h5t_core_private.h @@ -88,8 +88,7 @@ #define h5tpriv_build_triangle_id( face_idx, elem_idx ) \ ( h5tpriv_build_entity_id ( H5T_TYPE_TRIANGLE, face_idx, elem_idx ) ) -#define h5tpriv_build_elem_id( elem_idx ) \ - ( h5tpriv_build_entity_id ( f->t->mesh_type, 0, elem_idx ) ) + #define h5tpriv_get_face_idx( entity_id ) \ ( (entity_id & H5T_FACE_MASK) >> (sizeof(h5_id_t)*7) ) diff --git a/src/h5core/h5t_map.c b/src/h5core/h5t_map.c index 071e7e0..8afd7ef 100644 --- a/src/h5core/h5t_map.c +++ b/src/h5core/h5t_map.c @@ -290,22 +290,6 @@ h5t_get_vertex_indices_of_triangle ( f, face_idx, elem_idx, vertex_indices); } -h5_err_t -h5t_get_vertex_indices_of_triangle_cclockwise ( - h5_file_t* const f, - const h5_loc_id_t entity_id, - h5_loc_idx_t* vertex_indices - ) { - TRY( h5t_get_vertex_indices_of_triangle (f, entity_id, vertex_indices) ); - h5_float64_t P0[3]; - h5_float64_t P1[3]; - h5_float64_t P2[3]; - TRY( h5t_get_vertex_coords_by_index (f, vertex_indices[0], P0) ); - TRY( h5t_get_vertex_coords_by_index (f, vertex_indices[1], P1) ); - TRY( h5t_get_vertex_coords_by_index (f, vertex_indices[2], P2) ); - -} - h5_err_t h5t_get_vertex_indices_of_triangle2 ( h5_file_t* const f, diff --git a/src/h5core/h5t_retrieve.c b/src/h5core/h5t_retrieve.c index d84c2d6..8b99843 100644 --- a/src/h5core/h5t_retrieve.c +++ b/src/h5core/h5t_retrieve.c @@ -7,45 +7,51 @@ Skip elements which have been refined on a level <= the current one. */ static h5_err_t -skip_to_next_elem_on_level ( +iter_leaf_elem_idx ( h5_file_t* f, - h5t_mesh_iterator_t* iter + h5t_leaf_iterator_t* iter ) { h5_generic_loc_elem_t* el; do { iter->elem_idx++; - if (iter->elem_idx >= f->t->num_elems[iter->level_idx]) { + if (iter->elem_idx >= f->t->num_elems[iter->leaf_level]) { return H5_NOK; } el = h5tpriv_get_loc_elem (f, iter->elem_idx); - } while (h5tpriv_elem_is_on_level (f, el, iter->level_idx) == H5_NOK); + } while (h5tpriv_elem_is_on_level (f, el, iter->leaf_level) == H5_NOK); return H5_SUCCESS; } static h5_loc_id_t -iterate_elems ( +iterate_leaf_elems ( h5_file_t* const f, - h5t_mesh_iterator_t* iter + union h5t_iterator* iter ) { - if ( skip_to_next_elem_on_level (f, iter) == H5_NOK) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; + if ( iter_leaf_elem_idx (f, it) == H5_NOK) { h5_debug ( f, "Traversing done!" ); return H5_NOK; } - return h5tpriv_build_elem_id ( iter->elem_idx ); + int dim = it->ref_elem->dim; + h5_loc_id_t type_id = it->ref_elem->entity_types[dim]; + return h5tpriv_build_entity_id (type_id, 0, it->elem_idx ); } static h5_loc_id_t iterate_boundary_elems ( h5_file_t* const f, - h5t_mesh_iterator_t* iter + h5t_iterator_t* iter ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; do { - if ( skip_to_next_elem_on_level (f, iter) == H5_NOK) { + if ( iter_leaf_elem_idx (f, it) == H5_NOK) { h5_debug ( f, "Traversing done!" ); return H5_NOK; } - } while (!h5tpriv_is_boundary_elem (f, iter->elem_idx)); - return h5tpriv_build_elem_id ( iter->elem_idx ); + } 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]; + return h5tpriv_build_entity_id (type_id, 0, it->elem_idx ); } @@ -56,54 +62,56 @@ iterate_boundary_elems ( static h5_loc_id_t iterate_boundary_facets ( h5_file_t* const f, - h5t_mesh_iterator_t* iter + h5t_iterator_t* iter ) { - int num_facets = h5tpriv_ref_elem_get_num_facets (iter) - 1; - int dim = h5tpriv_ref_elem_get_dim (iter) - iter->codim; + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; + int num_facets = h5tpriv_ref_elem_get_num_facets (it) - 1; + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; do { - if (iter->face_idx >= num_facets) { + if (it->face_idx >= num_facets) { h5_loc_id_t elem_id; TRY( elem_id = iterate_boundary_elems (f, iter) ); if (elem_id == H5_NOK) { return H5_NOK; // done! } - iter->elem_idx = h5tpriv_get_elem_idx (elem_id); - iter->face_idx = 0; + it->elem_idx = h5tpriv_get_elem_idx (elem_id); + it->face_idx = 0; } else { - iter->face_idx++; + it->face_idx++; } - } while (! h5tpriv_is_boundary_facet (f, iter->elem_idx, iter->face_idx)); - int type = h5tpriv_ref_elem_get_entity_type (iter->ref_elem, dim); - return h5tpriv_build_entity_id (type, iter->face_idx, iter->elem_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); + return h5tpriv_build_entity_id (type, it->face_idx, it->elem_idx ); } /*! Travere entities with co-dim > 0 */ static h5_loc_id_t -iterate_faces ( +iterate_leaf_faces ( h5_file_t* const f, - h5t_mesh_iterator_t* iter + h5t_iterator_t* iter ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; h5_idlist_t* entry; - int dim = h5tpriv_ref_elem_get_dim (iter) - iter->codim; - int num_faces = h5tpriv_ref_elem_get_num_faces (iter, dim) - 1; + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; + int num_faces = h5tpriv_ref_elem_get_num_faces (it, dim) - 1; int i = -1; do { - if (iter->face_idx >= num_faces) { - if (skip_to_next_elem_on_level (f, iter) == H5_NOK) { + if (it->face_idx >= num_faces) { + if (iter_leaf_elem_idx (f, it) == H5_NOK) { h5_debug (f, "Traversing done!"); return H5_NOK; } - iter->face_idx = 0; + it->face_idx = 0; } else { - iter->face_idx++; + it->face_idx++; } // Skip already visited faces: // 1. Get list of all elements with this face. Actually we // retrieve a list of entities sorted by the element index. - TRY( (iter->find)(f, iter->face_idx, iter->elem_idx, &entry) ); + TRY( (it->find)(f, it->face_idx, it->elem_idx, &entry) ); // 2. Go to first element in list which is on current level i = -1; @@ -112,13 +120,13 @@ iterate_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, iter->level_idx) == H5_NOK); + } while (h5tpriv_elem_is_on_level (f, el, it->leaf_level) == H5_NOK); // 3. Face already visited if - } while (iter->elem_idx > h5tpriv_get_elem_idx(entry->items[i])); + } while (it->elem_idx > h5tpriv_get_elem_idx(entry->items[i])); /* - note: in above test iter->elem_idx is always greater or equal to the - compared index. It cannot be smaller since iter->elem_idx is on the + note: in above test it->elem_idx is always greater or equal to the + compared index. It cannot be smaller since it->elem_idx is on the current level and the element index of entry->items[i] is the smallest element index with the given face on the current level. */ @@ -131,28 +139,29 @@ iterate_faces ( static h5_loc_id_t iterate_boundary_faces ( h5_file_t* const f, - h5t_mesh_iterator_t* iter + h5t_iterator_t* iter ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; // TODO!!! - int dim = h5tpriv_ref_elem_get_dim (iter) - iter->codim; - int num_faces = h5tpriv_ref_elem_get_num_faces (iter, dim) - 1; + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; + int num_faces = h5tpriv_ref_elem_get_num_faces (it, dim) - 1; do { // iterate to next boundary face do { // first iterate over all faces of element, if done // goto next element - if (iter->face_idx >= num_faces) { + if (it->face_idx >= num_faces) { h5_loc_id_t elem_id; TRY( elem_id = iterate_boundary_elems (f, iter) ); if (elem_id == H5_NOK) { return H5_NOK; // done! } - iter->face_idx = 0; + it->face_idx = 0; } else { - iter->face_idx++; + it->face_idx++; } } while (! h5tpriv_is_boundary_face ( - f, dim, iter->elem_idx, iter->face_idx)); + f, dim, it->elem_idx, it->face_idx)); // Skip already visited faces } while (0); return h5_error_internal (f, __FILE__, __func__, __LINE__); @@ -161,7 +170,7 @@ iterate_boundary_faces ( static h5_loc_id_t iterate_tags ( h5_file_t* const f, - h5t_tag_iterator_t* iter + h5t_iterator_t* iter ) { UNUSED_ARGUMENT (f); #if 0 @@ -180,35 +189,35 @@ iterate_tags ( } h5_err_t -h5t_init_mesh_iterator ( +h5t_init_leaf_iterator ( h5_file_t* f, h5t_iterator_t* iter, int codim ) { - h5t_mesh_iterator_t* it = (h5t_mesh_iterator_t*)iter; + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; it->face_idx = 999; it->elem_idx = -1; it->codim = codim; - it->level_idx = f->t->cur_level; + it->leaf_level = f->t->cur_level; it->ref_elem = f->t->ref_elem; if (it->codim > 0) { - it->iter = iterate_faces; + it->iter = iterate_leaf_faces; } else if (it->codim == 0) { - it->iter = iterate_elems; + it->iter = iterate_leaf_elems; } return H5_SUCCESS; } h5_err_t -h5t_create_mesh_iterator ( +h5t_create_leaf_iterator ( h5_file_t* f, h5t_iterator_t** iter, int codim ) { - h5t_mesh_iterator_t* it; - TRY( it = h5priv_calloc (f, 1, sizeof (h5t_mesh_iterator_t)) ); - TRY( h5t_init_mesh_iterator (f, (h5t_iterator_t*)it, codim) ); + h5t_leaf_iterator_t* it; + TRY( it = h5priv_calloc (f, 1, sizeof (h5t_leaf_iterator_t)) ); + TRY( h5t_init_leaf_iterator (f, (h5t_iterator_t*)it, codim) ); *iter = (h5t_iterator_t*)it; return H5_SUCCESS; } @@ -219,12 +228,12 @@ h5t_create_boundary_face_iterator ( h5t_iterator_t** iter, int codim ) { - h5t_mesh_iterator_t* it; - TRY( it = h5priv_calloc (f, 1, sizeof (h5t_mesh_iterator_t)) ); + h5t_leaf_iterator_t* it; + TRY( it = h5priv_calloc (f, 1, sizeof (h5t_leaf_iterator_t)) ); it->face_idx = 999; // just a high enough number it->elem_idx = -1; it->codim = codim; - it->level_idx = f->t->cur_level; + it->leaf_level = f->t->cur_level; it->ref_elem = f->t->ref_elem; if (it->codim <= 0 || it->codim > it->ref_elem->dim) { @@ -246,7 +255,7 @@ h5t_create_mtag_iterator ( const char* name ) { h5t_tag_iterator_t* it; - TRY( it = h5priv_calloc (f, 1, sizeof (h5t_tag_iterator_t)) ); + TRY( it = h5priv_calloc (f, 1, sizeof (*it)) ); h5t_open_mtagset (f, name, &it->tagset); it->elem_idx = -1; it->subentity_idx = 999; @@ -269,7 +278,8 @@ h5t_iterate_entities ( h5_file_t* const f, h5t_iterator_t* iter ) { - return (iter->iter (f, iter)); + h5t_generic_iterator_t* it = (h5t_generic_iterator_t*)iter; + return (it->iter (f, iter)); } h5_err_t @@ -278,13 +288,11 @@ h5t_end_iterate_entities ( h5t_iterator_t* iter ) { UNUSED_ARGUMENT (f); - h5t_mesh_iterator_t* it = (h5t_mesh_iterator_t*)iter; + bzero (iter, sizeof(*iter)); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; it->face_idx = -1; it->elem_idx = -1; it->codim = -1; - it->ref_elem = NULL; - it->find = NULL; - it->iter = NULL; return H5_SUCCESS; } diff --git a/src/h5core/h5t_retrieve_private.h b/src/h5core/h5t_retrieve_private.h index 9b1908a..0aafc9f 100644 --- a/src/h5core/h5t_retrieve_private.h +++ b/src/h5core/h5t_retrieve_private.h @@ -3,53 +3,6 @@ #include -/* - TODO: define as union of iterator types - */ -struct h5t_iterator { - h5_loc_id_t (*iter)( - h5_file_t *const f, - struct h5t_iterator* iter); -/* - const h5t_ref_elem_t* ref_elem; // pointer to reference element - - h5_id_t elem_idx; // local element id - h5_id_t face_idx; // face id according reference element - int codim; // dimension of entities to traverse - h5_err_t (*find)( - h5_file_t *const f, - h5_id_t face_idx, - h5_id_t elem_idx, - h5_idlist_t **retval); - -*/}; - -typedef struct h5t_mesh_iterator { - h5_loc_id_t (*iter)( - h5_file_t *const f, - struct h5t_mesh_iterator* iter); - h5t_lvl_idx_t level_idx; - const h5t_ref_elem_t* ref_elem; - h5_loc_idx_t elem_idx; - h5_loc_idx_t face_idx; // face id according reference element - int codim; // dimension of entities to traverse - h5_err_t (*find)( - h5_file_t *const f, - h5_id_t face_idx, - h5_id_t elem_idx, - h5_idlist_t **retval); -} h5t_mesh_iterator_t; - -typedef struct h5t_tag_iterator { - h5_loc_id_t (*iter)( - h5_file_t *const f, - struct h5t_tag_iterator* iter); - h5t_lvl_idx_t level_idx; - h5t_tagset_t* tagset; - h5_loc_idx_t elem_idx; - int subentity_idx; -} h5t_tag_iterator_t; - /* h5_err_t h5tpriv_elem_is_on_cur_level ( @@ -59,7 +12,7 @@ h5tpriv_elem_is_on_cur_level ( */ struct h5t_retrieve_methods { h5_err_t (*init_entity_iterator)( - h5_file_t* const, h5t_mesh_iterator_t*, const int); + h5_file_t* const, h5t_iterator_t*, const int); }; extern struct h5t_retrieve_methods h5tpriv_trim_retrieve_methods; @@ -100,7 +53,7 @@ h5tpriv_elem_is_on_level ( static inline h5_err_t h5tpriv_init_entity_iterator ( h5_file_t* f, - h5t_mesh_iterator_t* const iter, + h5t_iterator_t* const iter, const int codim ) { return (*f->t->methods.retrieve->init_entity_iterator) (f, iter, codim); diff --git a/src/h5core/h5t_retrieve_tetm.c b/src/h5core/h5t_retrieve_tetm.c index 697b558..aed1106 100644 --- a/src/h5core/h5t_retrieve_tetm.c +++ b/src/h5core/h5t_retrieve_tetm.c @@ -6,21 +6,22 @@ static h5_err_t begin_iterate_entities ( h5_file_t* f, - h5t_mesh_iterator_t* const iter, + h5t_iterator_t* const iter, const int codim ) { - switch (iter->ref_elem->dim - codim) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; + switch (it->ref_elem->dim - codim) { case 0: // iterate vertices - iter->find = h5tpriv_find_tv2; + it->find = h5tpriv_find_tv2; break; case 1: // iterate edges - iter->find = h5tpriv_find_te2; + it->find = h5tpriv_find_te2; break; case 2: // iterate faces - iter->find = h5tpriv_find_td2; + it->find = h5tpriv_find_td2; break; case 3: // iterate elems - iter->find = NULL; + it->find = NULL; break; default: return h5_error_internal (f, __FILE__, __func__, __LINE__); diff --git a/src/h5core/h5t_retrieve_trim.c b/src/h5core/h5t_retrieve_trim.c index 44fb4aa..29470ff 100644 --- a/src/h5core/h5t_retrieve_trim.c +++ b/src/h5core/h5t_retrieve_trim.c @@ -6,18 +6,19 @@ static h5_err_t begin_iterate_entities ( h5_file_t* f, - h5t_mesh_iterator_t* iter, + h5t_iterator_t* iter, const int codim ) { - switch (h5tpriv_ref_elem_get_dim (iter) - codim) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)&iter->leaf; + switch (h5tpriv_ref_elem_get_dim (it) - codim) { case 0: // iterate vertices - iter->find = h5tpriv_find_tv2; + it->find = h5tpriv_find_tv2; break; case 1: // iterate edges - iter->find = h5tpriv_find_te2; + it->find = h5tpriv_find_te2; break; case 2: // iterate elems - iter->find = NULL; + it->find = NULL; break; default: return h5_error_internal (f, __FILE__, __func__, __LINE__); diff --git a/src/h5core/h5t_store.c b/src/h5core/h5t_store.c index d2a2e42..59067a5 100644 --- a/src/h5core/h5t_store.c +++ b/src/h5core/h5t_store.c @@ -464,10 +464,10 @@ h5t_create_index_set ( for (codim = 0; codim <= dim; codim++) { h5_glb_idx_t idx = 0; - h5t_mesh_iterator_t it; + h5t_leaf_iterator_t it; h5_glb_id_t entity_id; - TRY( h5t_init_mesh_iterator (f, (h5t_iterator_t*)&it, codim) ); - while ((entity_id = it.iter(f,&it)) >= 0) { + TRY( h5t_init_leaf_iterator (f, (h5t_iterator_t*)&it, codim) ); + while ((entity_id = it.iter(f, (h5t_iterator_t*)&it)) >= 0) { TRY( h5t_set_mtag_by_name (f, "__IndexSet__", entity_id, 1, &idx) ); } } diff --git a/src/include/h5core/h5_core.h b/src/include/h5core/h5_core.h index 691575a..477a016 100644 --- a/src/include/h5core/h5_core.h +++ b/src/include/h5core/h5_core.h @@ -1,6 +1,8 @@ #ifndef __H5_CORE_H #define __H5_CORE_H +#define UNUSED_ARGUMENT(x) (void)x + #include "h5_types.h" #include "h5_errno.h" diff --git a/src/include/h5core/h5t_map.h b/src/include/h5core/h5t_map.h index b0fc2aa..6746a04 100644 --- a/src/include/h5core/h5t_map.h +++ b/src/include/h5core/h5t_map.h @@ -66,13 +66,6 @@ h5t_get_vertex_indices_of_triangle ( h5_loc_idx_t* vertex_indices ); -h5_err_t -h5t_get_vertex_indices_of_triangle_cclockwise ( - h5_file_t* const f, - const h5_loc_id_t entity_id, - h5_loc_idx_t* vertex_indices - ); - h5_err_t h5t_get_vertex_indices_of_triangle2 ( h5_file_t* const f, diff --git a/src/include/h5core/h5t_retrieve.h b/src/include/h5core/h5t_retrieve.h index 354408c..45a9f85 100644 --- a/src/include/h5core/h5t_retrieve.h +++ b/src/include/h5core/h5t_retrieve.h @@ -1,17 +1,60 @@ #ifndef __H5T_RETRIEVE_H #define __H5T_RETRIEVE_H -typedef struct h5t_iterator h5t_iterator_t; +struct h5t_tagset; +union h5t_iterator; + +typedef struct { + h5_loc_id_t (*iter)(h5_file_t *const f, union h5t_iterator* iter); + h5t_lvl_idx_t leaf_level; + const h5t_ref_elem_t* ref_elem; + h5_loc_idx_t elem_idx; + h5_loc_idx_t face_idx; // face according reference element + int codim; // dimension of entities to traverse + h5_err_t (*find)(h5_file_t *const f, h5_id_t face_idx, + h5_id_t elem_idx, h5_idlist_t **retval); +} h5t_leaf_iterator_t; + +typedef struct { + h5_loc_id_t (*iter)(h5_file_t *const f, union h5t_iterator* iter); + h5t_lvl_idx_t refinement_level; + const h5t_ref_elem_t* ref_elem; + h5_loc_idx_t elem_idx; + h5_loc_idx_t face_idx; // face according reference element + int codim; // dimension of entities to traverse + h5_err_t (*find)(h5_file_t *const f, h5_id_t face_idx, + h5_id_t elem_idx, h5_idlist_t **retval); +} h5t_level_iterator_t; + +typedef struct { + h5_loc_id_t (*iter)(h5_file_t *const f, union h5t_iterator* iter); + h5t_lvl_idx_t level_idx; + struct h5t_tagset* tagset; + h5_loc_idx_t elem_idx; + int subentity_idx; +} h5t_tag_iterator_t; + +typedef struct h5t_generic_iterator { + h5_loc_id_t (*iter)(h5_file_t *const f, union h5t_iterator* iter); +} h5t_generic_iterator_t; + +typedef union h5t_iterator { + h5t_leaf_iterator_t leaf; + h5t_level_iterator_t level; + h5t_tag_iterator_t tag; + h5t_generic_iterator_t generic; +} h5t_iterator_t; + h5_err_t -h5t_init_mesh_iterator ( +h5t_init_leaf_iterator ( h5_file_t* f, h5t_iterator_t* iter, const int codim ); h5_err_t -h5t_create_mesh_iterator ( +h5t_create_leaf_iterator ( h5_file_t* f, h5t_iterator_t** iter, const int codim