core iterator API refactored

This commit is contained in:
2010-12-15 10:14:31 +00:00
parent aec44637d7
commit 912b776b83
12 changed files with 137 additions and 165 deletions
+1 -11
View File
@@ -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,
-2
View File
@@ -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
+1 -2
View File
@@ -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) )
-16
View File
@@ -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,
+69 -61
View File
@@ -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;
}
+2 -49
View File
@@ -3,53 +3,6 @@
#include <assert.h>
/*
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);
+7 -6
View File
@@ -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__);
+6 -5
View File
@@ -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__);
+3 -3
View File
@@ -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) );
}
}
+2
View File
@@ -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"
-7
View File
@@ -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,
+46 -3
View File
@@ -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