From 538b0989eb0970f30686d7bf598be5de5a2139e7 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Wed, 12 May 2010 19:51:57 +0000 Subject: [PATCH] - iterators implemented/debugged - traversal functions with iterators debugged for triangle meshes --- src/C/Makefile.am | 2 - src/h5core/Makefile.am | 10 + src/h5core/h5t_core_private.h | 5 + src/h5core/h5t_map.c | 15 +- src/h5core/h5t_openclose.c | 128 +--------- src/h5core/h5t_readwrite.c | 2 +- src/h5core/h5t_retrieve.c | 97 +++---- src/h5core/h5t_retrieve_private.h | 6 + src/h5core/h5t_storemesh.c | 390 ++++------------------------- src/h5core/h5t_storemesh_private.h | 34 --- src/h5core/h5t_tags.c | 47 ++-- src/h5core/h5t_tetm_adjacencies.c | 70 ++++-- src/h5core/h5t_types_private.h | 17 +- src/include/H5Fed.h | 1 - src/include/h5core/h5t_retrieve.h | 2 +- 15 files changed, 222 insertions(+), 604 deletions(-) diff --git a/src/C/Makefile.am b/src/C/Makefile.am index e4bb99c..9e32dc1 100644 --- a/src/C/Makefile.am +++ b/src/C/Makefile.am @@ -46,7 +46,6 @@ include_HEADERS = \ ../include/H5.h \ ../include/H5Block.h \ ../include/H5Fed.h \ - ../include/H5Fed_map.h \ ../include/H5Fed_store.h \ ../include/H5Fed_tags.h \ ../include/H5Part.h @@ -62,7 +61,6 @@ libH5_a_SOURCES = \ H5Fed.c \ H5Fed_adjacency.c \ H5Fed_inquiry.c \ - H5Fed_map.c \ H5Fed_retrieve.c \ H5Fed_store.c \ H5Fed_tags.c \ diff --git a/src/h5core/Makefile.am b/src/h5core/Makefile.am index 3ddf7bf..8ef5c6b 100644 --- a/src/h5core/Makefile.am +++ b/src/h5core/Makefile.am @@ -42,6 +42,11 @@ EXTRA_HEADERS = \ h5t_storemesh_private.h \ h5t_tags_private.h \ h5t_tetm_adjacencies_private.h \ + h5t_tetm_retrieve_private.h \ + h5t_tetm_store_private.h \ + h5t_trim_adjacencies_private.h \ + h5t_trim_retrieve_private.h \ + h5t_trim_store_private.h \ h5u_errorhandling_private.h # Extra files that I wish to include in the dist tar ball. @@ -87,6 +92,11 @@ libH5Core_a_SOURCES = \ h5t_storemesh.c \ h5t_tags.c \ h5t_tetm_adjacencies.c \ + h5t_tetm_retrieve.c \ + h5t_tetm_store.c \ + h5t_trim_adjacencies.c \ + h5t_trim_retrieve.c \ + h5t_trim_store.c \ h5u_readwrite.c \ hdf5_misc.c diff --git a/src/h5core/h5t_core_private.h b/src/h5core/h5t_core_private.h index a2e62ae..1a133f5 100644 --- a/src/h5core/h5t_core_private.h +++ b/src/h5core/h5t_core_private.h @@ -4,6 +4,11 @@ #define H5T_CONTAINER_GRPNAME "Topo" #include "h5t_tetm_adjacencies_private.h" +#include "h5t_tetm_retrieve_private.h" +#include "h5t_tetm_store_private.h" +#include "h5t_trim_adjacencies_private.h" +#include "h5t_trim_retrieve_private.h" +#include "h5t_trim_store_private.h" #include "h5t_consts_private.h" #include "h5t_errorhandling_private.h" #include "h5t_hsearch_private.h" diff --git a/src/h5core/h5t_map.c b/src/h5core/h5t_map.c index 3a95796..273ee9c 100644 --- a/src/h5core/h5t_map.c +++ b/src/h5core/h5t_map.c @@ -1,5 +1,4 @@ #include -#include #include "h5core/h5_core.h" #include "h5_core_private.h" @@ -22,7 +21,7 @@ cmp_vertices ( h5_float64_t P1[3] ) { int i; - for ( i = 2; i >= 0; i++ ) { + for ( i = 0; i < 3; i++ ) { h5_int64_t diff = h5priv_fcmp ( P0[i], P1[i], 10 ); if ( diff < 0 ) return -1; else if ( diff > 0 ) return 1; @@ -424,7 +423,7 @@ h5t_get_vertex_indices_of_entity ( h5_id_t elem_idx = h5tpriv_get_elem_idx (entity_id); int dim = map_entity_type_to_dimension[entity_type]; h5_elem_ldta_t *el = &f->t->elems_ldta[elem_idx]; - h5t_ref_element_t* ref_element = f->t->ref_element; + const h5t_ref_element_t* ref_element = f->t->ref_element; int num_vertices = ref_element->num_vertices_of_face[dim][face_idx]; int i; for (i = 0; i < num_vertices; i++) { @@ -453,10 +452,10 @@ h5t_get_vertex_index_of_vertex2 ( const h5_id_t elem_idx, // local element index h5_id_t* vertex_indices // OUT: vertex ID's ) { - h5t_ref_element_t* ref_element = f->t->ref_element; + const h5t_ref_element_t* ref_element = f->t->ref_element; h5_elem_ldta_t *el = &f->t->elems_ldta[elem_idx]; - vertex_indices[0] = el->local_vids[ref_element->map[1][face_idx][0]]; + vertex_indices[0] = el->local_vids[ref_element->map[0][face_idx][0]]; return H5_SUCCESS; } @@ -489,7 +488,7 @@ h5t_get_vertex_indices_of_edge2 ( const h5_id_t elem_idx, // local element index h5_id_t *vertex_indices // OUT: vertex ID's ) { - h5t_ref_element_t* ref_element = f->t->ref_element; + const h5t_ref_element_t* ref_element = f->t->ref_element; h5_elem_ldta_t *el = &f->t->elems_ldta[elem_idx]; vertex_indices[0] = el->local_vids[ref_element->map[1][face_idx][0]]; @@ -516,7 +515,7 @@ h5t_get_vertex_indices_of_triangle2 ( const h5_id_t elem_idx, h5_id_t *vertex_indices ) { - h5t_ref_element_t* ref_element = f->t->ref_element; + const h5t_ref_element_t* ref_element = f->t->ref_element; h5_elem_ldta_t *el = &f->t->elems_ldta[elem_idx]; vertex_indices[0] = el->local_vids[ref_element->map[2][face_idx][0]]; @@ -533,7 +532,7 @@ h5t_get_vertex_indices_of_tet ( h5_id_t *vertex_indices ) { h5_id_t elem_idx = h5tpriv_get_elem_idx (entity_id); - h5t_ref_element_t* ref_element = f->t->ref_element; + const h5t_ref_element_t* ref_element = f->t->ref_element; h5_elem_ldta_t *el = &f->t->elems_ldta[elem_idx]; vertex_indices[0] = el->local_vids[ref_element->map[3][0][0]]; diff --git a/src/h5core/h5t_openclose.c b/src/h5core/h5t_openclose.c index 2c900fc..74be566 100644 --- a/src/h5core/h5t_openclose.c +++ b/src/h5core/h5t_openclose.c @@ -11,16 +11,15 @@ #include "h5_core_private.h" static struct h5t_methods tet_funcs = { - h5tpriv_alloc_tets, - h5tpriv_store_tet, - h5tpriv_refine_tet, + &h5tpriv_tetm_store_methods, + &h5tpriv_tetm_retrieve_methods, &h5tpriv_tetm_adjacency_methods }; static struct h5t_methods tri_funcs = { - h5tpriv_alloc_tris, - h5tpriv_store_tri, - h5tpriv_refine_tri + &h5tpriv_trim_store_methods, + &h5tpriv_trim_retrieve_methods, + &h5tpriv_trim_adjacency_methods }; /* @@ -473,10 +472,12 @@ h5t_open_mesh ( case H5_OID_TETRAHEDRON: t->dsinfo_elems.type_id = t->dtypes.h5_tet_t; t->methods = tet_funcs; + t->ref_element = &h5t_tet_ref_element; break; case H5_OID_TRIANGLE: t->dsinfo_elems.type_id = t->dtypes.h5_triangle_t; t->methods = tri_funcs; + t->ref_element = &h5t_tri_ref_element; break; default: return h5_error_internal ( f, __FILE__, __func__, __LINE__ ); @@ -530,10 +531,12 @@ static h5_err_t _release_memory ( h5_file_t* const f ) { - TRY ( h5tpriv_release_tags (f) ); - TRY ( (*f->t->methods.adjacency->release_internal_structs) (f) ); - TRY ( _release_elems (f) ); - TRY ( _release_vertices (f) ); + TRY( h5tpriv_release_tags (f) ); + if (f->t->methods.adjacency != NULL) { + TRY( (*f->t->methods.adjacency->release_internal_structs) (f) ); + } + TRY( _release_elems (f) ); + TRY( _release_vertices (f) ); return H5_SUCCESS; } @@ -588,108 +591,3 @@ h5tpriv_alloc_num_vertices ( return H5_SUCCESS; } - -h5_err_t -h5tpriv_alloc_tris ( - h5_file_t * const f, - const size_t cur, - const size_t new - ) { - h5t_fdata_t *t = f->t; - const size_t nvertices = 3; - - /* alloc mem for elements */ - TRY ( t->elems.tris = h5priv_alloc ( - f, - t->elems.tris, - new * sizeof(t->elems.tris[0]) ) ); - memset ( - t->elems.tris + cur, - -1, - (new-cur) * sizeof(t->elems.tris[0]) ); - - /* alloc mem for local data of elements */ - TRY ( t->elems_ldta = h5priv_alloc ( - f, - t->elems_ldta, - new * sizeof (t->elems_ldta[0]) ) ); - memset ( - t->elems_ldta + cur, - -1, - (new-cur) * sizeof (t->elems_ldta[0]) ); - - /* alloc mem for local vertex IDs of elements */ - TRY ( t->elems_lvids = h5priv_alloc ( - f, - t->elems_lvids, - new * sizeof(t->elems_lvids[0]) * nvertices ) ); - memset ( - t->elems_lvids + cur * sizeof(t->elems_lvids[0]) * nvertices, - -1, - (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); - - /* re-init pointer to local vertex id in local data structure */ - h5_id_t *p = t->elems_lvids; - h5_id_t id; - for ( id = 0; id < new; id++, p+=nvertices ) { - t->elems_ldta[id].local_vids = p; - } - - /* alloc mem for global to local ID mapping */ - TRY ( h5priv_alloc_idmap ( f, &t->map_elem_g2l, new ) ); - - return H5_SUCCESS; -} - -h5_err_t -h5tpriv_alloc_tets ( - h5_file_t * const f, - const size_t cur, - const size_t new - ) { - h5t_fdata_t *t = f->t; - const size_t nvertices = 4; - - /* alloc mem for elements */ - TRY ( t->elems.tets = h5priv_alloc ( - f, - t->elems.tets, - new * sizeof(t->elems.tets[0]) ) ); - memset ( - t->elems.tets + cur, - -1, - (new-cur) * sizeof(t->elems.tets[0]) ); - - /* alloc mem for local data of elements */ - TRY ( t->elems_ldta = h5priv_alloc ( - f, - t->elems_ldta, - new * sizeof (t->elems_ldta[0]) ) ); - memset ( - t->elems_ldta + cur, - -1, - (new-cur) * sizeof (t->elems_ldta[0]) ); - - /* alloc mem for local vertex IDs of elements */ - TRY ( t->elems_lvids = h5priv_alloc ( - f, - t->elems_lvids, - new * sizeof(t->elems_lvids[0]) * nvertices ) ); - memset ( - t->elems_lvids + cur * nvertices, - -1, - (new-cur) * sizeof(t->elems_lvids[0]) * nvertices ); - - /* re-init pointer to local vertex id in local data structure */ - h5_id_t *p = t->elems_lvids; - h5_id_t id; - for ( id = 0; id < new; id++, p+=nvertices ) { - t->elems_ldta[id].local_vids = p; - } - - /* alloc mem for global to local ID mapping */ - TRY ( h5priv_alloc_idmap ( f, &t->map_elem_g2l, new ) ); - - return H5_SUCCESS; -} - diff --git a/src/h5core/h5t_readwrite.c b/src/h5core/h5t_readwrite.c index 8d18618..a7c4cac 100644 --- a/src/h5core/h5t_readwrite.c +++ b/src/h5core/h5t_readwrite.c @@ -296,7 +296,7 @@ _read_elems ( ) { h5t_fdata_t *t = f->t; - TRY( (*t->methods._alloc_elems)( f, 0, t->num_elems[t->num_levels-1] ) ); + TRY( (*t->methods.store->alloc_elems)( f, 0, t->num_elems[t->num_levels-1] ) ); TRY( h5priv_read_dataset_by_name ( f, t->mesh_gid, diff --git a/src/h5core/h5t_retrieve.c b/src/h5core/h5t_retrieve.c index 7c002f4..c1257fe 100644 --- a/src/h5core/h5t_retrieve.c +++ b/src/h5core/h5t_retrieve.c @@ -8,7 +8,7 @@ Skip elements which have been refined on a level <= the current one. */ h5_err_t -skip_to_next_elem_on_level ( +h5tpriv_skip_to_next_elem_on_level ( h5_file_t* f, h5t_entity_iterator_t* iter ) { @@ -44,11 +44,39 @@ h5tpriv_elem_is_on_cur_level ( return H5_SUCCESS; } +h5_err_t +h5t_alloc_entity_iterator ( + h5_file_t* f, + h5t_entity_iterator_t** iter, + int codim + ) { + TRY( *iter = h5priv_alloc (f, NULL, sizeof (h5t_entity_iterator_t)) ); + return h5t_begin_iterate_entities (f, *iter, codim); +} + +h5_err_t +h5t_release_entity_iterator ( + h5_file_t* const f, + h5t_entity_iterator_t* iter + ) { + return h5priv_free (f, iter); +} + + +h5_err_t +h5t_begin_iterate_entities ( + h5_file_t* f, + h5t_entity_iterator_t* iter, + const int codim + ) { + return (*f->t->methods.retrieve->init_iterator)(f, iter, codim); +} + /*! Travere entities with co-dim > 0 */ -h5_id_t -h5tpriv_iterate_faces ( +static h5_id_t +iterate_faces ( h5_file_t* const f, h5t_entity_iterator_t* iter ) { @@ -56,10 +84,10 @@ h5tpriv_iterate_faces ( h5_idlist_t* entry; h5_size_t i; int dim = iter->ref_element->dim - iter->codim; - int num_faces = iter->ref_element->num_faces[dim]; + int num_faces = iter->ref_element->num_faces[dim] - 1; do { if (iter->face_idx >= num_faces) { - if (skip_to_next_elem_on_level (f, iter) == H5_NOK) { + if (h5tpriv_skip_to_next_elem_on_level (f, iter) == H5_NOK) { h5_debug (f, "Traversing done!"); return H5_NOK; } @@ -86,76 +114,27 @@ h5tpriv_iterate_faces ( return entry->items[0]; } -h5_id_t -h5tpriv_iterate_elems ( +static h5_id_t +iterate_elems ( h5_file_t* const f, h5t_entity_iterator_t*iter ) { - if ( skip_to_next_elem_on_level (f, iter) == H5_NOK) { + if ( h5tpriv_skip_to_next_elem_on_level (f, iter) == H5_NOK) { h5_debug ( f, "Traversing done!" ); return H5_NOK; } return h5tpriv_build_elem_id ( iter->elem_idx ); } -h5_err_t -h5t_alloc_entity_iterator ( - h5_file_t* f, - h5t_entity_iterator_t** iter, - int codim - ) { - TRY( *iter = h5priv_alloc (f, NULL, sizeof (h5t_entity_iterator_t)) ); - return h5t_begin_iterate_entities (f, *iter, codim); -} - -h5_err_t -h5t_release_entity_iterator ( - h5_file_t* const f, - h5t_entity_iterator_t* iter - ) { - return h5priv_free (f, iter); -} - - -h5_err_t -h5t_begin_iterate_entities ( - h5_file_t* f, - h5t_entity_iterator_t* iter, - int codim - ) { - iter->face_idx = -1; - iter->elem_idx = -1; - iter->codim = codim; - iter->ref_element = f->t->ref_element; - switch (iter->ref_element->dim - codim) { - case 0: // iterate vertices - iter->find = h5tpriv_find_tv2; - break; - case 1: // iterate edges - iter->find = h5tpriv_find_te2; - break; - case 2: // iterate faces - iter->find = h5tpriv_find_td2; - break; - case 3: // iterate elems - iter->find = NULL; - break; - default: - return h5_error_internal (f, __FILE__, __func__, __LINE__); - } - - return skip_to_next_elem_on_level (f, iter); -} - h5_id_t h5t_iterate_entities ( h5_file_t* const f, h5t_entity_iterator_t* iter ) { if (iter->codim > 0) { - return h5tpriv_iterate_faces (f, iter); + return iterate_faces (f, iter); } else if (iter->codim == 0) { - return h5tpriv_iterate_elems (f, iter); + return iterate_elems (f, iter); } else { return h5_error_internal (f, __FILE__, __func__, __LINE__); } diff --git a/src/h5core/h5t_retrieve_private.h b/src/h5core/h5t_retrieve_private.h index dc4f150..aee309b 100644 --- a/src/h5core/h5t_retrieve_private.h +++ b/src/h5core/h5t_retrieve_private.h @@ -1,6 +1,12 @@ #ifndef __H5T_RETRIEVE_PRIVATE_H #define __H5T_RETRIEVE_PRIVATE_H +h5_err_t +h5tpriv_skip_to_next_elem_on_level ( + h5_file_t* f, + h5t_entity_iterator_t* iter + ); + h5_err_t h5tpriv_elem_is_on_cur_level ( h5_file_t * const f, diff --git a/src/h5core/h5t_storemesh.c b/src/h5core/h5t_storemesh.c index 78ad0df..c3ea1af 100644 --- a/src/h5core/h5t_storemesh.c +++ b/src/h5core/h5t_storemesh.c @@ -32,8 +32,8 @@ h5t_add_mesh ( consecutive numbered starting from 0. * Set the global vertex id's in element definitions. */ -h5_err_t -h5tpriv_assign_global_vertex_ids ( +static h5_err_t +assign_global_vertex_ids ( h5_file_t * const f ) { h5t_fdata_t *t = f->t; @@ -57,7 +57,7 @@ h5tpriv_assign_global_vertex_ids ( Assign unique global IDs to new elements. */ static h5_err_t -_assign_global_elem_ids ( +assign_global_elem_ids ( h5_file_t * const f ) { h5t_fdata_t *t = f->t; @@ -197,7 +197,7 @@ h5t_end_store_vertices ( t->storing_data = 0; t->num_vertices[t->cur_level] = t->last_stored_vid+1; - TRY ( h5tpriv_assign_global_vertex_ids ( f ) ); + TRY ( assign_global_vertex_ids ( f ) ); TRY ( h5tpriv_sort_vertices ( f ) ); TRY ( h5tpriv_rebuild_global_2_local_map_of_vertices ( f ) ); return H5_SUCCESS; @@ -230,19 +230,24 @@ h5t_begin_store_elems ( */ size_t nel = 2097152 > 5*new ? 2097152 : 5*new; TRY ( h5tpriv_resize_te_htab ( f, nel ) ); - return (*t->methods._alloc_elems) ( f, cur, new ); + return (*t->methods.store->alloc_elems) ( f, cur, new ); } + /*! - \param[in] local_parent_eid local parent id of element - if level \c >0 else \c -1 - \param[in] local_vids local vertex id's defining the element + Store element. The vertices are given via their local indices. + + \param[in] f File handle. + \param[in] elem_idx_of_parent Local indexd of the parent element + or \c -1. + \param[in] vertices Local vertex indices defining the + tetrahedron. */ h5_id_t -h5t_store_elem ( - h5_file_t * const f, - const h5_id_t local_parent_eid, - const h5_id_t local_vids[] +h5t_store_elem ( + h5_file_t* const f, + const h5_id_t elem_idx_of_parent, + const h5_id_t* vertices ) { h5t_fdata_t *t = f->t; @@ -258,89 +263,39 @@ h5t_store_elem ( /* check parent id */ if ( - ( t->cur_level == 0 && local_parent_eid != -1 ) || - ( t->cur_level > 0 && local_parent_eid < 0 ) || + ( t->cur_level == 0 && elem_idx_of_parent != -1 ) || + ( t->cur_level > 0 && elem_idx_of_parent < 0 ) || ( t->cur_level > 0 - && local_parent_eid >= t->num_elems[t->cur_level-1] ) + && elem_idx_of_parent >= t->num_elems[t->cur_level-1] ) ) { return HANDLE_H5_PARENT_ID_ERR ( f, h5tpriv_map_oid2str(t->mesh_type), - local_parent_eid ); + elem_idx_of_parent ); } - - return (*t->methods._store_elem)( f, local_parent_eid, local_vids ); -} - -/*! - Store tetrahedron. The vertices are given with there *local* id's! - - \param[in] f File handle. - \param[in] local_parent_id Local id of the parent element or \c -1. - \param[in] local_vids Local vertex id's defining the tetrahedron. - */ -h5_id_t -h5tpriv_store_tet ( - h5_file_t * const f, - const h5_id_t local_parent_eid, - const h5_id_t *local_vids - ) { - - h5t_fdata_t *t = f->t; t->level_changed = 1; - h5_id_t local_eid = ++t->last_stored_eid; - h5_elem_ldta_t *elem_ldta = &t->elems_ldta[local_eid]; + h5_id_t elem_idx = ++t->last_stored_eid; + h5_elem_ldta_t* elem_ldta = &t->elems_ldta[elem_idx]; - elem_ldta->local_parent_eid = local_parent_eid; + elem_ldta->local_parent_eid = elem_idx_of_parent; elem_ldta->local_child_eid = -1; elem_ldta->level_id = t->cur_level; int num_vertices = t->ref_element->num_faces[0]; - memcpy ( elem_ldta->local_vids, local_vids, - sizeof (*local_vids) * num_vertices ); - h5tpriv_sort_local_vids ( f, elem_ldta->local_vids, num_vertices ); - h5_id_t face_id; - h5_idlist_t *retval; - for ( face_id = 0; face_id < 6; face_id++ ) { + memcpy (elem_ldta->local_vids, vertices, + sizeof (*vertices) * num_vertices); + h5tpriv_sort_local_vids (f, elem_ldta->local_vids, num_vertices); + h5_id_t face_idx; + int num_faces = t->ref_element->num_faces[1]; + h5_idlist_t* retval; + for (face_idx = 0; face_idx < num_faces; face_idx++) { // add edges to neighbour struct - TRY ( h5tpriv_search_te2 ( + TRY( h5tpriv_search_te2 ( f, - face_id, - local_eid, - &retval ) ); + face_idx, + elem_idx, + &retval) ); } - return local_eid; -} - -h5_id_t -h5tpriv_store_tri ( - h5_file_t * const f, - const h5_id_t local_parent_eid, - const h5_id_t *local_vids - ) { - - h5t_fdata_t *t = f->t; - t->level_changed = 1; - h5_id_t local_eid = ++t->last_stored_eid; - h5_elem_ldta_t *elem_ldta = &t->elems_ldta[local_eid]; - - elem_ldta->local_parent_eid = local_parent_eid; - elem_ldta->local_child_eid = -1; - elem_ldta->level_id = t->cur_level; - int num_vertices = t->ref_element->num_faces[0]; - memcpy ( elem_ldta->local_vids, local_vids, - sizeof (*local_vids) * num_vertices ); - h5tpriv_sort_local_vids ( f, elem_ldta->local_vids, num_vertices ); - h5_id_t face_id; - h5_idlist_t *retval; - for ( face_id = 0; face_id < 3; face_id++ ) { - // add edges to neighbour struct - TRY ( h5tpriv_search_te2 ( - f, - face_id, - local_eid, - &retval ) ); - } - return local_eid; + return elem_idx; } h5_err_t @@ -351,7 +306,7 @@ h5t_end_store_elems ( t->storing_data = 0; t->num_elems[t->cur_level] = t->last_stored_eid+1; - TRY ( _assign_global_elem_ids ( f ) ); + TRY ( assign_global_elem_ids ( f ) ); TRY ( h5tpriv_sort_elems ( f ) ); TRY ( h5tpriv_rebuild_global_2_local_map_of_elems ( f ) ); @@ -393,6 +348,20 @@ h5t_begin_refine_elems ( return H5_SUCCESS; } + +/*! + Refine element \c local_eid + + \return local id of first new element or \c -1 +*/ +h5_id_t +h5t_refine_elem ( + h5_file_t * const f, + const h5_id_t local_eid + ) { + return (*f->t->methods.store->refine_elem)( f, local_eid ); +} + h5_err_t h5t_end_refine_elems ( h5_file_t * const f @@ -406,265 +375,8 @@ h5t_end_refine_elems ( return H5_SUCCESS; } -/*! - Refine edge. Store vertex, if new. - - Function can be used with tetrahedral and triangle meshes. - - \return local id of vertex -*/ -h5_id_t -h5tpriv_bisect_edge ( - h5_file_t * const f, - h5_id_t face_id, - h5_id_t elem_id - ) { - h5t_fdata_t *t = f->t; - h5_id_t vids[2]; - h5_idlist_t *retval; - /* - get all elements sharing the given edge - */ - TRY( h5tpriv_find_te2 (f, face_id, elem_id, &retval) ); - /* - check wether one of the found elements has been refined - */ - size_t i; - for ( i = 0; i < retval->num_items; i++ ) { - h5_id_t local_id = h5tpriv_get_elem_idx ( retval->items[i] ); - h5_elem_ldta_t *tet = &t->elems_ldta[local_id]; - if ( tet->local_child_eid >= 0 ) { - /* - this element has been refined! - return bisecting point - */ - h5_id_t face_id = h5tpriv_get_face_idx ( - retval->items[i] ); - h5_id_t kids[2], edge0[2], edge1[2]; - TRY ( h5tpriv_compute_direct_children_of_edge ( - f, - face_id, - tet->local_child_eid, - kids ) ); - TRY ( h5t_get_vertex_indices_of_edge ( f, kids[0], edge0 ) ); - TRY ( h5t_get_vertex_indices_of_edge ( f, kids[1], edge1 ) ); - if ( (edge0[0] == edge1[0]) || (edge0[0] == edge1[1]) ) - return edge0[0]; - else - return edge0[1]; - } - } - /* - None of the elements has been refined -> add new vertex. - */ - h5_float64_t *P0 = t->vertices[vids[0]].P; - h5_float64_t *P1 = t->vertices[vids[1]].P; - h5_float64_t P[3]; - - P[0] = ( P0[0] + P1[0] ) / 2.0; - P[1] = ( P0[1] + P1[1] ) / 2.0; - P[2] = ( P0[2] + P1[2] ) / 2.0; - - return h5t_store_vertex ( f, -1, P ); -} - -/*! - Refine element \c local_eid - - \return local id of first new element or \c -1 -*/ -h5_id_t -h5t_refine_elem ( - h5_file_t * const f, - const h5_id_t local_eid - ) { - return (*f->t->methods._refine_elem)( f, local_eid ); - -} - -/*! - Refine triangle \c local_eid - - \return Local id of first new triangle or \c -1 -*/ -h5_id_t -h5tpriv_refine_tri ( - h5_file_t * const f, - const h5_id_t local_eid - ) { - h5t_fdata_t *t = f->t; - h5_id_t local_vids[6]; - h5_id_t local_child_eid; - h5_elem_ldta_t *el = &t->elems_ldta[local_eid]; - - if ( el->local_child_eid >= 0 ) - return h5_error ( - f, - H5_ERR_INVAL, - "Tetrahedron %lld already refined.", - local_eid ); - - local_vids[0] = el->local_vids[0]; - local_vids[1] = el->local_vids[1]; - local_vids[2] = el->local_vids[2]; - - local_vids[3] = h5tpriv_bisect_edge( f, 0, local_eid ); /* 1,2 */ - local_vids[4] = h5tpriv_bisect_edge( f, 1, local_eid ); /* 0,2 */ - local_vids[5] = h5tpriv_bisect_edge( f, 2, local_eid ); /* 0,1 */ - - h5_id_t new_el[3]; - - /* 0 */ - new_el[0] = local_vids[0]; - new_el[1] = local_vids[4]; - new_el[2] = local_vids[5]; - TRY ( local_child_eid = h5tpriv_store_tri ( f, local_eid, new_el ) ); - - /* 1 */ - new_el[0] = local_vids[1]; - new_el[1] = local_vids[3]; - new_el[2] = local_vids[5]; - TRY ( h5tpriv_store_tri ( f, local_eid, new_el ) ); - - /* 2 */ - new_el[0] = local_vids[2]; - new_el[1] = local_vids[3]; - new_el[2] = local_vids[4]; - TRY ( h5tpriv_store_tri ( f, local_eid, new_el ) ); - - /* 3 */ - new_el[0] = local_vids[3]; - new_el[1] = local_vids[4]; - new_el[2] = local_vids[5]; - TRY ( h5tpriv_store_tri ( f, local_eid, new_el ) ); - - return local_child_eid; -} - -/*! - \param[in] f file handle - \param[in] local_kid local edge ID we search children of - \param[in] local_eid local element ID of first children - \param[out] kids direct children - -*/ -h5_err_t -h5tpriv_compute_direct_children_of_edge ( - h5_file_t * const f, - h5_id_t face_id, - h5_id_t local_eid, - h5_id_t kids[2] - ) { - int off[6][2] = { {0,1}, {1,2}, {0,2}, {0,3}, {1,3}, {2,3} }; - - if ( ( face_id < 0 ) || ( face_id >= 6 ) ) { - return h5_error_internal ( f, __FILE__, __func__, __LINE__ ); - } - kids[0] = h5tpriv_build_edge_id ( face_id, local_eid+off[face_id][0] ); - kids[1] = h5tpriv_build_edge_id ( face_id, local_eid+off[face_id][1] ); - return H5_SUCCESS; -} -/*! - Refine tetrahedron \c local_eid - \return Local id of first new tetrahedron or \c -1 -*/ -h5_id_t -h5tpriv_refine_tet ( - h5_file_t * const f, - const h5_id_t local_eid - ) { - h5t_fdata_t *t = f->t; - h5_id_t local_vids[10]; - h5_id_t local_child_eid; - h5_elem_ldta_t *tet = &t->elems_ldta[local_eid]; - if ( tet->local_child_eid >= 0 ) - return h5_error ( - f, - H5_ERR_INVAL, - "Tetrahedron %lld already refined.", - local_eid ); - local_vids[0] = tet->local_vids[0]; - local_vids[1] = tet->local_vids[1]; - local_vids[2] = tet->local_vids[2]; - local_vids[3] = tet->local_vids[3]; - - local_vids[4] = h5tpriv_bisect_edge( f, 0, local_eid ); - local_vids[5] = h5tpriv_bisect_edge( f, 2, local_eid ); - local_vids[6] = h5tpriv_bisect_edge( f, 3, local_eid ); - local_vids[7] = h5tpriv_bisect_edge( f, 1, local_eid ); - local_vids[8] = h5tpriv_bisect_edge( f, 4, local_eid ); - local_vids[9] = h5tpriv_bisect_edge( f, 5, local_eid ); - - /* - add new tets - */ - h5_id_t new_tet_local_vids[4]; - - /* 0 */ - new_tet_local_vids[0] = local_vids[0]; - new_tet_local_vids[1] = local_vids[6]; // (03) - new_tet_local_vids[2] = local_vids[5]; // (02) - new_tet_local_vids[3] = local_vids[4]; // (01) - TRY ( local_child_eid = h5tpriv_store_tet ( - f, local_eid, new_tet_local_vids ) ); - - /* 1 */ - new_tet_local_vids[0] = local_vids[4]; // (01) - new_tet_local_vids[1] = local_vids[8]; // (13) - new_tet_local_vids[2] = local_vids[7]; // (12) - new_tet_local_vids[3] = local_vids[1]; - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 2 */ - new_tet_local_vids[0] = local_vids[5]; // (02) - new_tet_local_vids[1] = local_vids[9]; // (23) - new_tet_local_vids[2] = local_vids[2]; - new_tet_local_vids[3] = local_vids[7]; // (12) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 3 */ - new_tet_local_vids[0] = local_vids[6]; // (03) - new_tet_local_vids[1] = local_vids[3]; - new_tet_local_vids[2] = local_vids[9]; // (23) - new_tet_local_vids[3] = local_vids[8]; // (13) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 4 */ - new_tet_local_vids[0] = local_vids[6]; // (03) - new_tet_local_vids[1] = local_vids[5]; // (02) - new_tet_local_vids[2] = local_vids[4]; // (01) - new_tet_local_vids[3] = local_vids[8]; // (13) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 5 */ - new_tet_local_vids[0] = local_vids[5]; // (02) - new_tet_local_vids[1] = local_vids[4]; // (01) - new_tet_local_vids[2] = local_vids[8]; // (13) - new_tet_local_vids[3] = local_vids[7]; // (12) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 6 */ - new_tet_local_vids[0] = local_vids[6]; // (03) - new_tet_local_vids[1] = local_vids[5]; // (02) - new_tet_local_vids[2] = local_vids[9]; // (23) - new_tet_local_vids[3] = local_vids[8]; // (13) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - /* 7 */ - new_tet_local_vids[0] = local_vids[5]; // (02) - new_tet_local_vids[1] = local_vids[9]; // (23) - new_tet_local_vids[2] = local_vids[8]; // (13) - new_tet_local_vids[3] = local_vids[7]; // (12) - TRY ( h5tpriv_store_tet ( f, local_eid, new_tet_local_vids ) ); - - t->elems.tets[local_eid].global_child_eid = local_child_eid; - t->elems_ldta[local_eid].local_child_eid = local_child_eid; - t->num_elems_on_level[t->cur_level]--; - - return local_child_eid; -} diff --git a/src/h5core/h5t_storemesh_private.h b/src/h5core/h5t_storemesh_private.h index 81554c6..8e63d1b 100644 --- a/src/h5core/h5t_storemesh_private.h +++ b/src/h5core/h5t_storemesh_private.h @@ -1,38 +1,4 @@ #ifndef __H5T_STOREMESH_PRIVATE_H #define __H5T_STOREMESH_PRIVATE_H -h5_id_t -h5tpriv_store_tri ( - h5_file_t * const f, - const h5_id_t local_parent_eid, - const h5_id_t vids[] - ); - -h5_id_t -h5tpriv_store_tet ( - h5_file_t * const f, - const h5_id_t local_parent_eid, - const h5_id_t vids[] - ); - -h5_err_t -h5tpriv_compute_direct_children_of_edge ( - h5_file_t * const f, - h5_id_t face_id, - h5_id_t local_eid, - h5_id_t kids[2] - ); - -h5_id_t -h5tpriv_refine_tri ( - h5_file_t * const f, - const h5_id_t local_eid - ); - -h5_id_t -h5tpriv_refine_tet ( - h5_file_t * const f, - const h5_id_t local_eid - ); - #endif diff --git a/src/h5core/h5t_tags.c b/src/h5core/h5t_tags.c index 1cdca05..6ef04df 100644 --- a/src/h5core/h5t_tags.c +++ b/src/h5core/h5t_tags.c @@ -15,7 +15,7 @@ */ static h5_err_t -_init_container ( +init_container ( h5_file_t * const f, const size_t ntags, h5t_tagcontainer_t * ctn @@ -32,14 +32,14 @@ h5tpriv_init_mtagsets ( h5_file_t * const f, size_t ntags ) { - return _init_container ( f, ntags, &f->t->mtags ); + return init_container ( f, ntags, &f->t->mtags ); } /* Release all tag values for a specific element */ static h5_err_t -_release_tagvals_of_elem ( +release_tagvals_of_elem ( h5_file_t * const f, h5t_tagsel_t *el_vals ) { @@ -54,7 +54,7 @@ _release_tagvals_of_elem ( Release a tag-set */ static h5_err_t -_release_tagset ( +release_tagset ( h5_file_t * const f, const void *__set ) { @@ -62,7 +62,7 @@ _release_tagset ( unsigned int i; for ( i = 0; i < set->num_elems; i++ ) { if ( set->elems[i] != NULL ) { - TRY ( _release_tagvals_of_elem ( f, set->elems[i] ) ); + TRY ( release_tagvals_of_elem ( f, set->elems[i] ) ); } } TRY ( h5priv_free ( f, set->name ) ); @@ -74,11 +74,12 @@ _release_tagset ( Release all sets in given container */ static h5_err_t -_release_container ( - h5_file_t * const f, - h5t_tagcontainer_t * ctn +release_container ( + h5_file_t* const f, + h5t_tagcontainer_t* ctn ) { - TRY ( h5priv_hwalk ( f, &ctn->sets, _release_tagset ) ); + if (ctn->num_sets == 0) return H5_SUCCESS; + TRY ( h5priv_hwalk ( f, &ctn->sets, release_tagset ) ); TRY ( h5priv_free ( f, ctn->names ) ); return H5_SUCCESS; @@ -92,7 +93,7 @@ h5tpriv_release_tags ( h5_file_t * const f ) { h5t_fdata_t *t = f->t; - TRY ( _release_container ( f, &t->mtags ) ); + TRY ( release_container ( f, &t->mtags ) ); return H5_SUCCESS; } @@ -185,7 +186,7 @@ h5t_add_mtagset ( \return H5_SUCCESS or error code */ static h5_err_t -_remove_tagset ( +remove_tagset ( h5_file_t *const f, h5t_tagcontainer_t *ctn, const char name[] @@ -249,7 +250,7 @@ h5t_remove_mtagset ( h5t_fdata_t *t = f->t; TRY ( t->mtags.group_id = h5priv_open_group ( f, t->mesh_gid, "Tags" ) ); - TRY ( _remove_tagset ( f, &t->mtags, name ) ); + TRY ( remove_tagset ( f, &t->mtags, name ) ); TRY ( h5priv_close_hdf5_group ( f, t->mtags.group_id ) ); return H5_SUCCESS; } @@ -585,7 +586,7 @@ h5t_remove_mtag_by_name ( } static hid_t -_open_space_all ( +open_space_all ( h5_file_t * const f, hid_t dataset_id ) { @@ -596,7 +597,7 @@ _open_space_all ( Store given tagset. */ static h5_err_t -_write_tagset ( +write_tagset ( h5_file_t * const f, hid_t loc_id, H5T_Tagset *tagset @@ -721,7 +722,7 @@ _write_tagset ( f, group_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, elems ) ); strcpy ( dsinfo.name, "entities" ); @@ -731,7 +732,7 @@ _write_tagset ( f, group_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, entities ) ); strcpy ( dsinfo.name, "values" ); @@ -742,7 +743,7 @@ _write_tagset ( f, group_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, vals ) ); return H5_SUCCESS; @@ -766,7 +767,7 @@ _write_container ( &ctn->sets ) ); H5T_Tagset *tagset = (H5T_Tagset*)__retval; if ( tagset->changed ) { - TRY ( _write_tagset ( + TRY ( write_tagset ( f, ctn->group_id, tagset ) ); @@ -791,7 +792,7 @@ h5tpriv_write_mtags ( } static h5_err_t -_read_tagset ( +read_tagset ( h5_file_t * const f, hid_t loc_id, hsize_t idx @@ -820,7 +821,7 @@ _read_tagset ( f, dset_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, elems ) ); TRY ( h5priv_close_hdf5_dataset ( f, dset_id ) ); num_elems--; @@ -835,7 +836,7 @@ _read_tagset ( f, dset_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, entities ) ); TRY ( h5priv_close_hdf5_dataset ( f, dset_id ) ); num_entities--; @@ -850,7 +851,7 @@ _read_tagset ( f, dset_id, &dsinfo, - _open_space_all, _open_space_all, + open_space_all, open_space_all, vals ) ); TRY ( h5priv_close_hdf5_dataset ( f, dset_id ) ); type = h5_normalize_h5_type ( f, dsinfo.type_id ); @@ -884,7 +885,7 @@ h5tpriv_read_tag_container ( hsize_t idx; for ( idx = 0; idx < num_sets; idx++ ) { - TRY ( _read_tagset ( f, ctn->group_id, idx ) ); + TRY( read_tagset (f, ctn->group_id, idx) ); } return H5_SUCCESS; diff --git a/src/h5core/h5t_tetm_adjacencies.c b/src/h5core/h5t_tetm_adjacencies.c index f918c45..2cae28c 100644 --- a/src/h5core/h5t_tetm_adjacencies.c +++ b/src/h5core/h5t_tetm_adjacencies.c @@ -1,5 +1,5 @@ /* - Copyright 2006-2009 + Copyright 2006-2010 Paul Scherrer Institut, Villigen, Switzerland; Achim Gsell All rights reserved. @@ -11,11 +11,7 @@ This code is under development. */ -#include -#include -#include #include -#include #include "h5core/h5_core.h" #include "h5_core_private.h" @@ -134,7 +130,7 @@ compute_children_of_edge ( ); } else { h5_id_t kids[2]; - TRY ( h5tpriv_compute_direct_children_of_edge ( + TRY ( t->methods.store->get_direct_children_of_edge ( f, face_idx, tet->local_child_eid, @@ -176,7 +172,7 @@ compute_sections_of_edge ( if ( ! h5tpriv_elem_is_on_cur_level ( f, tet ) == H5_OK ) { refined = 1; h5_id_t kids[2]; - TRY ( h5tpriv_compute_direct_children_of_edge ( + TRY ( t->methods.store->get_direct_children_of_edge ( f, face_id, tet->local_child_eid, @@ -193,22 +189,62 @@ compute_sections_of_edge ( return H5_SUCCESS; } +/* + Compute direct children of a triangle. + + Face 0 Face 1 Face 2 Face 3 + 1 1 2 1 + + + + + + |\ |\ |\ |\ + | \ | \ | \ | \ + | \ | \ | \ | \ + | \ | \ | \ | \ + 4+----+7 4+----+8 5+----+9 7+----+8 + |\ |\ |\ |\ |\ |\ |\ |\ + | \ | \ | \ | \ | \ | \ | \ | \ + | \ | \ | \ | \ | \ | \ | \ | \ + | \| \ | \| \ | \| \ | \| \ + +----+----+ +----+----+ +----+----+ +----+----+ + 0 5 2 0 6 3 0 6 3 2 9 3 + + z ^ z ^ y ^ z ^ + | | | | + +--> +--> +--> +--> + y x x x + + Triangle: face idx, #child + + [0,4,5]: 0, 0 [0,4,6]: 1, 0 [0,5,6]: 2, 0 [1,7,8]: 3, 1 + [1,4,7]: 0, 1 [1,4,8]: 1, 1 [2,5,9]: 2, 2 [2,7,9]: 3, 2 + [2,5,7]: 0, 2 [3,6,8]: 1, 3 [3,6,9]: 2, 3 [3,8,9]: 3, 3 + [4,5,7]: 0, 5 [4,6,8]: 2, 4 [5,6,9]: 1, 7 [7,8,9]: 3, 6 + +*/ static h5_err_t compute_direct_children_of_triangle ( h5_file_t * const f, - h5_id_t face_id, - h5_id_t eid, - h5_id_t dids[4] + h5_id_t face_idx, + h5_id_t elem_idx, + h5_id_t children[4] ) { - int off[4][4] = { {1,2,3,7}, {0,2,3,6}, {0,1,3,4}, {0,1,2,5} }; - - if ( ( face_id < 0 ) || ( face_id >= 4 ) ) { + h5_id_t map[4][4][2] = { + {{0,0},{0,1},{0,2},{0,5}}, + {{1,0},{1,1},{1,3},{2,4}}, + {{2,0},{2,2},{2,3},{1,7}}, + {{3,1},{3,2},{3,3},{3,6}} + }; + int num_faces = f->t->ref_element->num_faces[2]; + if ( (face_idx < 0) || (face_idx >= num_faces) ) { return h5_error_internal ( f, __FILE__, __func__, __LINE__ ); } - dids[0] = h5tpriv_build_edge_id ( face_id, eid+off[face_id][0] ); - dids[1] = h5tpriv_build_edge_id ( face_id, eid+off[face_id][1] ); - dids[2] = h5tpriv_build_edge_id ( face_id, eid+off[face_id][2] ); - dids[3] = h5tpriv_build_edge_id ( face_id, eid+off[face_id][3] ); + children[0] = h5tpriv_build_edge_id ( + map[face_idx][0][0], elem_idx+map[face_idx][0][1]); + children[1] = h5tpriv_build_edge_id ( + map[face_idx][1][0], elem_idx+map[face_idx][1][1]); + children[2] = h5tpriv_build_edge_id ( + map[face_idx][2][0], elem_idx+map[face_idx][2][1]); + children[3] = h5tpriv_build_edge_id ( + map[face_idx][3][0], elem_idx+map[face_idx][3][1]); return H5_SUCCESS; } diff --git a/src/h5core/h5t_types_private.h b/src/h5core/h5t_types_private.h index cecbb45..2e1cf26 100644 --- a/src/h5core/h5t_types_private.h +++ b/src/h5core/h5t_types_private.h @@ -1,6 +1,16 @@ #ifndef __H5T_TYPES_PRIVATE_H #define __H5T_TYPES_PRIVATE_H +struct h5t_store_methods { + h5_err_t (*alloc_elems)(h5_file_t* const, const size_t, const size_t); + h5_id_t (*refine_elem)(h5_file_t* const, const h5_id_t); + h5_id_t (*get_direct_children_of_edge)(h5_file_t* const, const h5_id_t, const h5_id_t, h5_id_t*); +}; + +struct h5t_retrieve_methods { + h5_err_t (*init_iterator)(h5_file_t* const, h5t_entity_iterator_t*, const int); +}; + struct h5t_adjacency_methods { h5_err_t (*rebuild_internal_structs)(h5_file_t * const); h5_err_t (*release_internal_structs)(h5_file_t * const); @@ -31,9 +41,8 @@ struct h5t_adjacency_methods { }; struct h5t_methods { - h5_err_t (*_alloc_elems)(h5_file_t * const, const size_t, const size_t); - h5_id_t (*_store_elem)(h5_file_t * const, const h5_id_t, const h5_id_t*); - h5_id_t (*_refine_elem)(h5_file_t * const, const h5_id_t); + struct h5t_store_methods *store; + struct h5t_retrieve_methods *retrieve; struct h5t_adjacency_methods *adjacency; }; @@ -125,7 +134,7 @@ typedef struct h5t_fdata { char mesh_name[16]; char mesh_label[256]; h5_oid_t mesh_type; /* object id of element type */ - h5t_ref_element_t* ref_element; + const h5t_ref_element_t* ref_element; h5_id_t cur_mesh; /* id of current mesh */ h5_id_t mesh_changed; /* true if new or has been changed */ h5_id_t num_meshes; /* number of meshes */ diff --git a/src/include/H5Fed.h b/src/include/H5Fed.h index 62d9c8e..4a88f76 100644 --- a/src/include/H5Fed.h +++ b/src/include/H5Fed.h @@ -22,7 +22,6 @@ #include "H5.h" #include "H5Fed_adjacency.h" #include "H5Fed_inquiry.h" -#include "H5Fed_map.h" #include "H5Fed_retrieve.h" #include "H5Fed_store.h" #include "H5Fed_tags.h" diff --git a/src/include/h5core/h5t_retrieve.h b/src/include/h5core/h5t_retrieve.h index d8fc5e9..35a5ef0 100644 --- a/src/include/h5core/h5t_retrieve.h +++ b/src/include/h5core/h5t_retrieve.h @@ -5,7 +5,7 @@ typedef struct { 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 - h5t_ref_element_t* ref_element; // pointer to reference element + const h5t_ref_element_t* ref_element; // pointer to reference element h5_err_t (*find)(h5_file_t *const f, h5_id_t face_idx, h5_id_t elem_idx,