|
|
|
@@ -1,10 +1,5 @@
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdarg.h> /* va_arg - System dependent ?! */
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <hdf5.h>
|
|
|
|
|
|
|
|
|
|
#include "h5_core/h5_core.h"
|
|
|
|
|
#include "h5_core/h5_core_private.h"
|
|
|
|
@@ -13,7 +8,7 @@
|
|
|
|
|
Skip elements which have been refined on a level <= the current one.
|
|
|
|
|
*/
|
|
|
|
|
static h5_id_t
|
|
|
|
|
_skip_to_next_elem_on_level (
|
|
|
|
|
skip_to_next_elem_on_level (
|
|
|
|
|
h5_file_t * f,
|
|
|
|
|
h5_id_t *eid
|
|
|
|
|
) {
|
|
|
|
@@ -59,7 +54,7 @@ h5t_begin_traverse_vertices (
|
|
|
|
|
|
|
|
|
|
iter->cur_cid = -1;
|
|
|
|
|
iter->cur_eid = -1;
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
TRY ( skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
return H5_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -78,7 +73,7 @@ h5t_traverse_vertices (
|
|
|
|
|
h5_debug ( f, "Traversing done!" );
|
|
|
|
|
return H5_NOK;
|
|
|
|
|
}
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level (
|
|
|
|
|
TRY ( skip_to_next_elem_on_level (
|
|
|
|
|
f, &iter->cur_eid ) );
|
|
|
|
|
iter->cur_cid = 0;
|
|
|
|
|
} else {
|
|
|
|
@@ -123,7 +118,7 @@ h5t_begin_traverse_edges (
|
|
|
|
|
|
|
|
|
|
iter->cur_cid = -1;
|
|
|
|
|
iter->cur_eid = -1;
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
TRY ( skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
return H5_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -142,24 +137,23 @@ h5t_traverse_edges (
|
|
|
|
|
h5_debug ( f, "Traversing done!" );
|
|
|
|
|
return H5_NOK;
|
|
|
|
|
}
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level (
|
|
|
|
|
TRY ( skip_to_next_elem_on_level (
|
|
|
|
|
f, &iter->cur_eid ) );
|
|
|
|
|
iter->cur_cid = 0;
|
|
|
|
|
} else {
|
|
|
|
|
iter->cur_cid++;
|
|
|
|
|
}
|
|
|
|
|
TRY ( h5tpriv_find_te2 (
|
|
|
|
|
f, iter->cur_cid, iter->cur_eid, &te ) );
|
|
|
|
|
TRY( h5tpriv_find_te2 (f, iter->cur_cid, iter->cur_eid, &te) );
|
|
|
|
|
/* skip to first element which is on current level */
|
|
|
|
|
i = -1;
|
|
|
|
|
h5_elem_ldta_t *el_dta;
|
|
|
|
|
do {
|
|
|
|
|
i++;
|
|
|
|
|
h5_id_t eid = h5tpriv_get_elem_idx ( te->value.items[i] );
|
|
|
|
|
h5_id_t eid = h5tpriv_get_elem_idx (te->value.items[i]);
|
|
|
|
|
el_dta = &t->elems_ldta[eid];
|
|
|
|
|
} while ( h5tpriv_elem_is_on_cur_level ( f, el_dta ) == H5_NOK );
|
|
|
|
|
} while ( iter->cur_eid != h5tpriv_get_elem_idx(te->value.items[i]) );
|
|
|
|
|
memcpy ( local_vids, te->key.vids, 2*sizeof(h5_id_t) );
|
|
|
|
|
} while (h5tpriv_elem_is_on_cur_level (f, el_dta) == H5_NOK);
|
|
|
|
|
} while ( iter->cur_eid != h5tpriv_get_elem_idx (te->value.items[i]));
|
|
|
|
|
memcpy (local_vids, te->key.vids, 2*sizeof(h5_id_t));
|
|
|
|
|
|
|
|
|
|
return te->value.items[0];
|
|
|
|
|
}
|
|
|
|
@@ -185,7 +179,7 @@ h5t_begin_traverse_triangles (
|
|
|
|
|
|
|
|
|
|
iter->cur_cid = -1;
|
|
|
|
|
iter->cur_eid = -1;
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
TRY ( skip_to_next_elem_on_level ( f, &iter->cur_eid ) );
|
|
|
|
|
return H5_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -199,28 +193,86 @@ h5t_traverse_triangles (
|
|
|
|
|
h5t_td_entry_t *td;
|
|
|
|
|
h5_size_t i;
|
|
|
|
|
do {
|
|
|
|
|
if ( iter->cur_cid >= 3 ) {
|
|
|
|
|
if ( iter->cur_eid+1 >= t->num_elems[t->cur_level] ) {
|
|
|
|
|
h5_debug ( f, "Traversing done!" );
|
|
|
|
|
if (iter->cur_cid >= 3) {
|
|
|
|
|
if (iter->cur_eid+1 >= t->num_elems[t->cur_level]) {
|
|
|
|
|
h5_debug (f, "Traversing done!");
|
|
|
|
|
return H5_NOK;
|
|
|
|
|
}
|
|
|
|
|
TRY ( _skip_to_next_elem_on_level (
|
|
|
|
|
f, &iter->cur_eid ) );
|
|
|
|
|
TRY( skip_to_next_elem_on_level (f, &iter->cur_eid) );
|
|
|
|
|
iter->cur_cid = 0;
|
|
|
|
|
} else {
|
|
|
|
|
iter->cur_cid++;
|
|
|
|
|
}
|
|
|
|
|
TRY ( h5tpriv_find_td2 ( f, iter->cur_cid, iter->cur_eid, &td ) );
|
|
|
|
|
TRY( h5tpriv_find_td2 (f, iter->cur_cid, iter->cur_eid, &td) );
|
|
|
|
|
/* skip to first element which is on current level */
|
|
|
|
|
i = -1;
|
|
|
|
|
h5_elem_ldta_t *el_dta;
|
|
|
|
|
do {
|
|
|
|
|
i++;
|
|
|
|
|
h5_id_t eid = h5tpriv_get_elem_idx ( td->value.items[i] );
|
|
|
|
|
h5_id_t eid = h5tpriv_get_elem_idx (td->value.items[i]);
|
|
|
|
|
el_dta = &t->elems_ldta[eid];
|
|
|
|
|
} while ( h5tpriv_elem_is_on_cur_level ( f, el_dta ) == H5_NOK );
|
|
|
|
|
} while ( iter->cur_eid != h5tpriv_get_elem_idx(td->value.items[i]) );
|
|
|
|
|
memcpy ( local_vids, td->key.vids, 3*sizeof(h5_id_t) );
|
|
|
|
|
} while (h5tpriv_elem_is_on_cur_level (f, el_dta) == H5_NOK);
|
|
|
|
|
} while (iter->cur_eid != h5tpriv_get_elem_idx(td->value.items[i]));
|
|
|
|
|
memcpy (local_vids, td->key.vids, 3*sizeof(h5_id_t));
|
|
|
|
|
|
|
|
|
|
return td->value.items[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Function for traversing entities with 0 < co-dim < co-dim(vertex).
|
|
|
|
|
In a tetrahedral mesh this means edges and triangle, in triangle
|
|
|
|
|
mesh only edges.
|
|
|
|
|
*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
h5_id_t cur_elem_id; // local element id
|
|
|
|
|
h5_id_t cur_face_id; // face id according reference element
|
|
|
|
|
int32_t codim; // co-dimension of faces to traverse
|
|
|
|
|
int32_t num_faces; // number of faces
|
|
|
|
|
|
|
|
|
|
} h5t_entity_iterator2;
|
|
|
|
|
|
|
|
|
|
typedef struct h5t_idlisthash_key {
|
|
|
|
|
h5_id_t ids[1];
|
|
|
|
|
} h5t_idlisthash_key_t;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
List of all upward adjacent elements of same coarsness of a specific face.
|
|
|
|
|
The face is specified by its local vertex IDs.
|
|
|
|
|
*/
|
|
|
|
|
typedef struct h5t_idlisthash_entry {
|
|
|
|
|
h5_idlist_t value;
|
|
|
|
|
h5t_idlisthash_key_t key;
|
|
|
|
|
} h5t_idlisthash_entry_t;
|
|
|
|
|
|
|
|
|
|
h5_id_t
|
|
|
|
|
h5t_traverse_faces (
|
|
|
|
|
h5_file_t * const f,
|
|
|
|
|
h5t_entity_iterator2_t *iter;
|
|
|
|
|
) {
|
|
|
|
|
h5t_fdata_t *t = f->t;
|
|
|
|
|
h5t_idlisthash_entry_t *entry;
|
|
|
|
|
h5_size_t i;
|
|
|
|
|
do {
|
|
|
|
|
if (iter->cur_fid >= iter->num_faces) {
|
|
|
|
|
if (iter->cur_eid+1 >= t->num_elems[t->cur_level]) {
|
|
|
|
|
h5_debug (f, "Traversing done!");
|
|
|
|
|
return H5_NOK;
|
|
|
|
|
}
|
|
|
|
|
TRY( skip_to_next_elem_on_level (f, &iter->cur_eid) );
|
|
|
|
|
iter->cur_fid = 0;
|
|
|
|
|
} else {
|
|
|
|
|
iter->cur_fid++;
|
|
|
|
|
}
|
|
|
|
|
TRY( h5tpriv_find_td2 (f, iter->cur_fid, iter->cur_eid, &entry) );
|
|
|
|
|
/* skip to first element which is on current level */
|
|
|
|
|
i = -1;
|
|
|
|
|
h5_elem_ldta_t *el_dta;
|
|
|
|
|
do {
|
|
|
|
|
i++;
|
|
|
|
|
h5_id_t eid = h5tpriv_get_elem_idx (td->value.items[i]);
|
|
|
|
|
el_dta = &t->elems_ldta[eid];
|
|
|
|
|
} while (h5tpriv_elem_is_on_cur_level (f, el_dta) == H5_NOK);
|
|
|
|
|
} while (iter->cur_eid != h5tpriv_get_elem_idx(td->value.items[i]));
|
|
|
|
|
|
|
|
|
|
return td->value.items[0];
|
|
|
|
|
}
|
|
|
|
|