- update of internal data structures reviewed

This commit is contained in:
2010-05-28 14:09:08 +00:00
parent cb37690b83
commit 2f30c9fcb8
7 changed files with 135 additions and 129 deletions
+9 -5
View File
@@ -222,7 +222,6 @@ _init_fdata (
t->num_meshes = -1;
t->cur_mesh = -1;
t->num_levels = -1;
t->new_level = -1;
t->cur_level = -1;
t->last_stored_vid = -1;
t->last_stored_eid = -1;
@@ -544,14 +543,19 @@ h5t_close_mesh (
h5_err_t
h5t_set_level (
h5_file_t* const f,
const h5_id_t id
const h5_id_t level_id
) {
h5t_fdata_t* t = f->t;
if ((id < 0) || (id >= t->num_levels))
return HANDLE_H5_OUT_OF_RANGE_ERR (f, "Level", id);
t->cur_level = id;
if ((level_id < 0) || (level_id >= t->num_levels))
return HANDLE_H5_OUT_OF_RANGE_ERR (f, "Level", level_id);
h5_id_t prev_level = t->cur_level;
t->cur_level = level_id;
if (level_id >= t->num_loaded_levels) {
TRY( (t->methods.adjacency->update_internal_structs)(f, prev_level+1) );
}
return H5_SUCCESS;
}
+6 -3
View File
@@ -284,7 +284,8 @@ read_elems (
) {
h5t_fdata_t* t = f->t;
TRY( (*t->methods.store->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,
@@ -295,9 +296,8 @@ read_elems (
TRY( h5tpriv_sort_elems (f) );
TRY( h5tpriv_rebuild_global_2_local_map_of_elems (f) );
TRY( build_elems_ldta (f) );
TRY( (*t->methods.adjacency->update_internal_structs)(f) );
return H5_SUCCESS;
}
@@ -314,6 +314,7 @@ h5_err_t
h5tpriv_read_mesh (
h5_file_t* const f
) {
h5t_fdata_t* t = f->t;
if (f->t->mesh_gid < 0) {
TRY( h5tpriv_open_mesh_group (f) );
}
@@ -322,6 +323,8 @@ h5tpriv_read_mesh (
TRY( read_num_elems (f) );
TRY( read_vertices (f) );
TRY( read_elems (f) );
TRY( (t->methods.adjacency->update_internal_structs)(f, 0) );
TRY( read_mtags (f) );
t->num_loaded_levels = t->num_levels;
return H5_SUCCESS;
}
+31 -41
View File
@@ -25,63 +25,59 @@ h5t_add_mesh (
/*
* Assign unique global id's to vertices. Vertices already have
unique id's assigned by the mesher but this id's may not be
consecutive numbered starting from 0.
* Set the global vertex id's in element definitions.
* Assign unique global indices to vertices.
*/
static h5_err_t
assign_global_vertex_ids (
assign_global_vertex_indices (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
h5_id_t local_id;
if (t->cur_level < 0) return H5_SUCCESS; /* no level defined */
/*
simple in serial runs: global_id = local_id
*/
for (local_id = 0;
local_id < t->num_vertices[t->num_levels-1];
local_id++) {
t->vertices[local_id].global_vid = local_id;
h5_id_t local_idx = (t->cur_level == 0) ? 0 : t->num_vertices[t->cur_level-1];
for (local_idx = 0;
local_idx < t->num_vertices[t->num_levels-1];
local_idx++) {
t->vertices[local_idx].global_vid = local_idx;
}
return H5_SUCCESS;
}
/*!
Assign unique global IDs to new elements.
Assign unique global indices to new elements.
*/
static h5_err_t
assign_global_elem_ids (
assign_global_elem_indices (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
h5_id_t local_eid;
if ( t->cur_level < 0 ) return H5_SUCCESS; /* no level defined */
if (t->cur_level < 0) return H5_SUCCESS; /* no level defined */
/*
simple in serial runs: global_id = local_id
simple in serial runs: global index = local index
*/
for (local_eid = (t->cur_level == 0) ? 0 : t->num_elems[t->cur_level-1];
local_eid < t->num_elems[t->cur_level];
local_eid++) {
h5_id_t local_idx = (t->cur_level == 0) ? 0 : t->num_elems[t->cur_level-1];
for (; local_idx < t->num_elems[t->cur_level]; local_idx++) {
h5_elem_t *elem;
h5_elem_ldta_t *elem_ldta = &t->elems_ldta[local_eid];
h5_elem_ldta_t *elem_ldta = &t->elems_ldta[local_idx];
switch ( t->mesh_type ) {
case H5_OID_TETRAHEDRON:
elem = (h5_elem_t*)&t->elems.tets[local_eid];
elem = (h5_elem_t*)&t->elems.tets[local_idx];
break;
case H5_OID_TRIANGLE:
elem = (h5_elem_t*)&t->elems.tris[local_eid];
elem = (h5_elem_t*)&t->elems.tris[local_idx];
break;
default:
return h5_error_internal (f,__FILE__,__func__,__LINE__);
}
elem->global_eid = local_eid;
elem->global_eid = local_idx;
elem->global_parent_eid = elem_ldta->local_parent_eid;
elem->global_child_eid = elem_ldta->local_child_eid;
int i;
@@ -106,9 +102,10 @@ h5t_add_level (
/* t->num_levels will be set to zero on file creation(!) */
if ((t->cur_mesh < 0) || (t->num_levels == -1)) {
return h5tpriv_error_undef_mesh ( f );
return h5tpriv_error_undef_mesh (f);
}
t->cur_level = t->num_levels++;
t->num_loaded_levels = t->num_levels;
t->dsinfo_num_vertices.dims[0] = t->num_levels;
t->dsinfo_num_elems.dims[0] = t->num_levels;
t->dsinfo_num_elems_on_level.dims[0] = t->num_levels;
@@ -123,7 +120,6 @@ h5t_add_level (
f, t->num_elems_on_level, num_bytes) );
t->num_elems_on_level[t->cur_level] = -1;
t->new_level = t->cur_level;
if (t->cur_level == 0) {
/* nothing stored yet */
t->last_stored_vid = -1;
@@ -146,7 +142,6 @@ h5t_begin_store_vertices (
if (t->cur_level < 0) {
return h5tpriv_error_undef_level(f);
}
t->storing_data = 1;
h5_size_t cur_num_vertices = (t->cur_level > 0 ?
t->num_vertices[t->cur_level-1] : 0);
t->num_vertices[t->cur_level] = cur_num_vertices+num;
@@ -175,7 +170,6 @@ h5t_store_vertex (
if (t->cur_level < 0)
return h5tpriv_error_undef_level(f);
t->level_changed = 1;
h5_id_t local_id = ++t->last_stored_vid;
h5_vertex_t *vertex = &t->vertices[local_id];
vertex->global_vid = global_vid; /* ID from mesher, replaced later!*/
@@ -188,10 +182,9 @@ h5t_end_store_vertices (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
t->storing_data = 0;
t->num_vertices[t->cur_level] = t->last_stored_vid+1;
TRY( assign_global_vertex_ids (f) );
TRY( assign_global_vertex_indices (f) );
TRY( h5tpriv_sort_vertices (f) );
TRY( h5tpriv_rebuild_global_2_local_map_of_vertices (f) );
return H5_SUCCESS;
@@ -210,7 +203,6 @@ h5t_begin_store_elems (
) {
h5t_fdata_t* const t = f->t;
t->storing_data = 1;
size_t cur = t->cur_level > 0 ? t->num_elems[t->cur_level-1] : 0;
size_t new = num + cur;
t->num_elems[t->cur_level] = new;
@@ -220,7 +212,7 @@ h5t_begin_store_elems (
num + t->num_elems_on_level[t->cur_level-1] : num;
/*
We allocate a hash table for a minimum of 2^21 edges to
prevent resizing.
avoid resizing.
*/
size_t nel = 2097152 > 5*new ? 2097152 : 5*new;
TRY( h5tpriv_resize_te_htab (f, nel) );
@@ -243,7 +235,7 @@ h5t_store_elem (
const h5_id_t elem_idx_of_parent,
const h5_id_t* vertices
) {
h5t_fdata_t *t = f->t;
h5t_fdata_t* t = f->t;
/* level set? */
if (t->cur_level < 0)
@@ -256,18 +248,16 @@ h5t_store_elem (
t->num_elems[t->cur_level] );
/* check parent id */
if (
(t->cur_level == 0 && elem_idx_of_parent != -1) ||
(t->cur_level > 0 && elem_idx_of_parent < 0) ||
(t->cur_level > 0
&& elem_idx_of_parent >= t->num_elems[t->cur_level-1])
if ((t->cur_level == 0 && elem_idx_of_parent != -1) ||
(t->cur_level > 0 && elem_idx_of_parent < 0) ||
(t->cur_level > 0
&& elem_idx_of_parent >= t->num_elems[t->cur_level-1])
) {
return HANDLE_H5_PARENT_ID_ERR (
f,
h5tpriv_map_oid2str (t->mesh_type),
elem_idx_of_parent);
}
t->level_changed = 1;
h5_id_t elem_idx = ++t->last_stored_eid;
h5_elem_ldta_t* elem_ldta = &t->elems_ldta[elem_idx];
@@ -297,13 +287,13 @@ h5t_end_store_elems (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
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_indices (f) );
TRY( h5tpriv_sort_elems (f) );
TRY( h5tpriv_rebuild_global_2_local_map_of_elems (f) );
TRY( (t->methods.adjacency->update_internal_structs)(f, t->cur_level) );
return H5_SUCCESS;
}
@@ -362,7 +352,6 @@ h5t_pre_refine (
default:
return h5_error_internal (f, __FILE__, __func__, __LINE__);
}
t->storing_data = 1;
TRY( h5t_begin_store_vertices (f, num_vertices_to_add) );
TRY( h5t_begin_store_elems (f, num_elems_to_add) );
@@ -377,7 +366,6 @@ h5t_refine (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
t->storing_data = 1;
int i;
for (i = 0; i < t->marked_entities.num_items; i++) {
TRY( h5t_refine_elem (f, t->marked_entities.items[i]) );
@@ -390,6 +378,8 @@ h5t_post_refine (
h5_file_t* const f
) {
h5t_fdata_t* const t = f->t;
TRY( h5t_end_store_vertices (f) );
TRY( h5t_end_store_elems (f) );
return h5priv_free_idlist_items (f, &t->marked_entities);
}
+47 -37
View File
@@ -20,21 +20,24 @@
compute T(V) from current level up to highest levels.
*/
static h5_err_t
compute_tets_of_vertices (
h5_file_t* const f
compute_elems_of_vertices (
h5_file_t* const f,
const h5_id_t from_lvl
) {
h5t_fdata_t* t = f->t;
h5_id_t eid = (t->cur_level <= 0) ? 0 : t->num_elems[t->cur_level-1];
h5_elem_ldta_t* tet = tet = &t->elems_ldta[eid];
h5_id_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_elem_ldta_t *el = &t->elems_ldta[elem_idx];
h5_id_t num_elems = t->num_elems[t->num_levels-1];
for (;eid < num_elems; eid++, tet++) {
int i;
for (i = 0; i < 4; i++) {
h5_id_t vid = tet->local_vids[i];
TRY ( h5priv_append_to_idlist (
f,
&t->vertices_data[vid].tv,
h5tpriv_build_vertex_id( i, eid)) );
for (;elem_idx < num_elems; elem_idx++, el++) {
int face_idx;
int num_faces = t->ref_element->num_faces[0];
for (face_idx = 0; face_idx < num_faces; face_idx++) {
h5_id_t vidx = el->local_vids[face_idx];
TRY( h5priv_append_to_idlist (
f,
&t->vertices_data[vidx].tv,
h5tpriv_build_vertex_id (
face_idx, elem_idx)) );
}
}
return H5_SUCCESS;
@@ -44,38 +47,44 @@ compute_tets_of_vertices (
Compute T(E) from current level up to highest levels.
*/
static h5_err_t
compute_tets_of_edges (
h5_file_t* const f
compute_elems_of_edges (
h5_file_t* const f,
const h5_id_t from_lvl
) {
h5t_fdata_t* t = f->t;
h5_id_t eid = (t->cur_level <= 0) ? 0 : t->num_elems[t->cur_level-1];
h5_elem_ldta_t* tet = tet = &t->elems_ldta[eid];
h5t_fdata_t *t = f->t;
h5_id_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_elem_ldta_t *el = &t->elems_ldta[elem_idx];
h5_id_t num_elems = t->num_elems[t->num_levels-1];
h5_idlist_t *retval = NULL;
TRY( h5tpriv_resize_te_htab (f, 4*(num_elems-eid)) );
for (; eid < num_elems; eid++, tet++) {
h5_id_t face;
for (face = 0; face < 6; face++) {
TRY( h5tpriv_search_te2 (f, face, eid, &retval) );
TRY( h5tpriv_resize_te_htab (f, 4*(num_elems-elem_idx)) );
for (;elem_idx < num_elems; elem_idx++, el++) {
int face_idx;
int num_faces = t->ref_element->num_faces[1];
for (face_idx = 0; face_idx < num_faces; face_idx++) {
TRY( h5tpriv_search_te2 (
f, face_idx, elem_idx, &retval) );
}
}
return H5_SUCCESS;
}
static h5_err_t
compute_tets_of_triangles (
h5_file_t* const f
compute_elems_of_triangles (
h5_file_t* const f,
const h5_id_t from_lvl
) {
h5t_fdata_t* t = f->t;
h5_id_t eid = (t->cur_level <= 0) ? 0 : t->num_elems[t->cur_level-1];
h5_elem_ldta_t* tet = tet = &t->elems_ldta[eid];
h5_id_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_elem_ldta_t *el = &t->elems_ldta[elem_idx];
h5_id_t num_elems = t->num_elems[t->num_levels-1];
h5_idlist_t* retval = NULL;
TRY( h5tpriv_resize_td_htab (f, 4*(num_elems-eid)) );
for (; eid < num_elems; eid++, tet++) {
h5_id_t face;
for (face = 0; face < 4; face++) {
TRY( h5tpriv_search_td2 (f, face, eid, &retval) );
h5_idlist_t *retval = NULL;
TRY( h5tpriv_resize_te_htab (f, 4*(num_elems-elem_idx)) );
for (;elem_idx < num_elems; elem_idx++, el++) {
int face_idx;
int num_faces = t->ref_element->num_faces[1];
for (face_idx = 0; face_idx < num_faces; face_idx++) {
TRY( h5tpriv_search_td2 (
f, face_idx, elem_idx, &retval) );
}
}
return H5_SUCCESS;
@@ -274,7 +283,7 @@ compute_sections_of_triangle (
h5_id_t* tri = td->items;
h5_id_t* end = td->items+td->num_items;
int refined = 0;
for (; tri < end; tri++ {
for (; tri < end; tri++) {
h5_id_t eid = h5tpriv_get_elem_idx (*tri);
h5_id_t face_idx = h5tpriv_get_face_idx (*tri);
h5_elem_ldta_t *tet = &t->elems_ldta[eid];
@@ -643,20 +652,21 @@ get_triangles_downadjacent_to_tet (
static h5_err_t
update_internal_structs (
h5_file_t* const f
h5_file_t* const f,
const h5_id_t from_lvl
) {
clock_t t1 = clock();
TRY( compute_tets_of_vertices (f) );
TRY( compute_elems_of_vertices (f, from_lvl) );
clock_t t2 = clock();
fprintf (stderr, "compute_tets_of_vertices(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC);
t1 = clock();
TRY( compute_tets_of_edges (f) );
TRY( compute_elems_of_edges (f, from_lvl) );
t2 = clock();
fprintf (stderr, "compute_tets_of_edge(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC);
t1 = clock();
TRY( compute_tets_of_triangles (f) );
TRY( compute_elems_of_triangles (f, from_lvl) );
t2 = clock();
fprintf (stderr, "compute_tets_of_triangle(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC);
+12 -12
View File
@@ -75,11 +75,11 @@ get_direct_children_of_edge (
{2,3} // edge 5
};
int num_faces = f->t->ref_element->num_faces[1];
if ( ( face_idx < 0 ) || ( face_idx >= num_faces ) ) {
return h5_error_internal ( f, __FILE__, __func__, __LINE__ );
if ((face_idx < 0) || ( face_idx >= num_faces)) {
return h5_error_internal (f, __FILE__, __func__, __LINE__);
}
children[0] = h5tpriv_build_edge_id ( face_idx, elem_idx+offs[face_idx][0] );
children[1] = h5tpriv_build_edge_id ( face_idx, elem_idx+offs[face_idx][1] );
children[0] = h5tpriv_build_edge_id (face_idx, elem_idx+offs[face_idx][0]);
children[1] = h5tpriv_build_edge_id (face_idx, elem_idx+offs[face_idx][1]);
return H5_SUCCESS;
}
@@ -118,14 +118,14 @@ bisect_edge (
h5_id_t face_id = h5tpriv_get_face_idx (
retval->items[i] );
h5_id_t kids[2], edge0[2], edge1[2];
TRY ( get_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]) )
TRY( get_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];
+26 -26
View File
@@ -21,11 +21,11 @@
*/
static h5_err_t
compute_elems_of_vertices (
h5_file_t * const f
h5_file_t* const f,
const h5_id_t from_lvl
) {
h5t_fdata_t *t = f->t;
h5_id_t elem_idx = (t->cur_level <= 0) ?
0 : t->num_elems[t->cur_level-1];
h5_id_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_elem_ldta_t *el = &t->elems_ldta[elem_idx];
h5_id_t num_elems = t->num_elems[t->num_levels-1];
for (;elem_idx < num_elems; elem_idx++, el++) {
@@ -48,11 +48,11 @@ compute_elems_of_vertices (
*/
static h5_err_t
compute_elems_of_edges (
h5_file_t * const f
h5_file_t* const f,
const h5_id_t from_lvl
) {
h5t_fdata_t *t = f->t;
h5_id_t elem_idx = (t->cur_level <= 0) ?
0 : t->num_elems[t->cur_level-1];
h5_id_t elem_idx = (from_lvl <= 0) ? 0 : t->num_elems[from_lvl-1];
h5_elem_ldta_t *el = &t->elems_ldta[elem_idx];
h5_id_t num_elems = t->num_elems[t->num_levels-1];
h5_idlist_t *retval = NULL;
@@ -68,24 +68,6 @@ compute_elems_of_edges (
return H5_SUCCESS;
}
static h5_err_t
update_internal_structs (
h5_file_t * const f
) {
clock_t t1 = clock();
TRY ( compute_elems_of_vertices ( f ) );
clock_t t2 = clock();
fprintf ( stderr, "compute_elems_of_vertices(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC );
t1 = clock();
TRY ( compute_elems_of_edges ( f ) );
t2 = clock();
fprintf ( stderr, "compute_elems_of_edge(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC );
return H5_SUCCESS;
}
static h5_err_t
compute_children_of_edge (
h5_file_t * const f,
@@ -346,7 +328,7 @@ get_edges_downadjacent_to_triangle (
h5tpriv_build_edge_id (face_idx, elem_idx),
children) );
}
- TRY ( h5priv_alloc_idlist (f, list, 8) );
TRY ( h5priv_alloc_idlist (f, list, 8) );
h5_id_t *edge_idp = children->items;
int i;
for (i = 0; i < children->num_items; i++, edge_idp++) {
@@ -356,10 +338,28 @@ get_edges_downadjacent_to_triangle (
return H5_SUCCESS;
}
static h5_err_t
update_internal_structs (
h5_file_t* const f,
const h5_id_t from_lvl
) {
clock_t t1 = clock();
TRY( compute_elems_of_vertices (f, from_lvl) );
clock_t t2 = clock();
fprintf (stderr, "compute_elems_of_vertices(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC);
t1 = clock();
TRY( compute_elems_of_edges (f, from_lvl ) );
t2 = clock();
fprintf (stderr, "compute_elems_of_edge(): %f\n",
(float)(t2-t1)/CLOCKS_PER_SEC);
return H5_SUCCESS;
}
static h5_err_t
release_internal_structs (
h5_file_t * const f
h5_file_t* const f
) {
/* TO BE WRITTEN @@@ */
return H5_SUCCESS;
+4 -5
View File
@@ -12,8 +12,8 @@ struct h5t_retrieve_methods {
};
struct h5t_adjacency_methods {
h5_err_t (*update_internal_structs)(h5_file_t * const);
h5_err_t (*release_internal_structs)(h5_file_t * const);
h5_err_t (*update_internal_structs)(h5_file_t* const, h5_id_t);
h5_err_t (*release_internal_structs)(h5_file_t* const);
h5_err_t (*get_edges_upadjacent_to_vertex)(
h5_file_t * const, const h5_id_t, h5_idlist_t**);
h5_err_t (*get_triangles_upadjacent_to_vertex)(
@@ -139,11 +139,10 @@ typedef struct h5t_fdata {
h5_id_t mesh_changed; /* true if new or has been changed */
h5_id_t num_meshes; /* number of meshes */
h5_id_t cur_level; /* id of current level */
h5_id_t new_level; /* idx of the first new level or -1 */
h5_size_t num_levels; /* number of levels */
h5_id_t level_changed;
h5_id_t storing_data;
h5_id_t num_loaded_levels;
/*** HDF5 IDs ***/
hid_t topo_gid; /* grp id of mesh in current
level */
hid_t meshes_gid; /* HDF5 id */