core iterator API refactored
This commit is contained in:
+1
-11
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) )
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,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__);
|
||||
|
||||
@@ -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) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user