diff --git a/.gitattributes b/.gitattributes index 66d0215..0e84e81 100644 --- a/.gitattributes +++ b/.gitattributes @@ -521,6 +521,7 @@ test/H5Fed/tetmesh_read_tags.c -text test/H5Fed/tetmesh_write.c -text test/H5Fed/tetmesh_write2.c -text test/H5Fed/tetmesh_write_tags.c -text +test/H5Fed/trimesh_adjacencies.c -text test/H5Fed/trimesh_read.c -text test/H5Fed/trimesh_write.c -text test/H5Fed/trimesh_write_dunetest.c -text diff --git a/test/H5Fed/trimesh_adjacencies.c b/test/H5Fed/trimesh_adjacencies.c new file mode 100644 index 0000000..1b9997b --- /dev/null +++ b/test/H5Fed/trimesh_adjacencies.c @@ -0,0 +1,316 @@ +#include +#include +#include + +#include "H5hut.h" + +#define PRINT_UPADJACENCIES 1 +#define PRINT_DOWNADJACENCIES 0 + +const h5_oid_t MESH_TYPE = H5_TRIANGLE_MESH; +const char* FNAME = "simple_triangle.h5"; + +static h5_err_t +print_adjacencies_of_vertex ( + h5_file_t* const f, + h5_id_t local_id, + clock_t* time_used + ) { + h5_idlist_t* uadj_edges; + h5_idlist_t* uadj_triangles; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (f, local_id, 1, &uadj_edges); + H5FedGetAdjacencies (f, local_id, 2, &uadj_triangles); + *time_used = clock() - time_used_before; + int n = 0; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + if (uadj_edges->num_items > n) n = uadj_edges->num_items; + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_id_t local_vids[4]; + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + f, local_id, local_vids); + snprintf (v, sizeof(v), "=[%lld]=", local_vids[0]); + } else { + *v = '\0'; + } + if (i < uadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, uadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + local_vids[0], local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + local_vids[0], local_vids[1], local_vids[2]); + } else { + *d = '\0'; + } + printf ("| %-18s | %-18s | %-18s |\n", v, k, d); + } + H5FedReleaseListOfAdjacencies (f, &uadj_edges); + H5FedReleaseListOfAdjacencies (f, &uadj_triangles); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_edge ( + h5_file_t* const f, + h5_id_t local_id, + clock_t* time_used + ) { + h5_idlist_t* dadj_vertices; + h5_idlist_t* uadj_triangles; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (f, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (f, local_id, 2, &uadj_triangles); + *time_used = clock() - time_used_before; + int n = dadj_vertices->num_items; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + local_vids[0]); + } else { + *v = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + f, local_id, local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + local_vids[0], local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + local_vids[0], local_vids[1], local_vids[2]); + } else { + *d = '\0'; + } + printf ("| %-18s | %-18s | %-18s |\n", v, k, d); + } + H5FedReleaseListOfAdjacencies (f, &dadj_vertices); + H5FedReleaseListOfAdjacencies (f, &uadj_triangles); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_elem ( + h5_file_t* const f, + h5_id_t local_id, + clock_t* time_used + ) { + h5_idlist_t* dadj_vertices; + h5_idlist_t* dadj_edges; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (f, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (f, local_id, 1, &dadj_edges); + *time_used = clock() - time_used_before; + int n = dadj_vertices->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + local_vids[0]); + } else { + *v = '\0'; + } + if (i < dadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + f, dadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + local_vids[0], local_vids[1]); + } else { + *k = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + f, local_id, local_vids); + snprintf (d, sizeof(k), "=[%lld,%lld,%lld]=", + local_vids[0], local_vids[1], local_vids[2]); + } else { + *d = '\0'; + } + printf ( "| %-18s | %-18s | %-18s |\n", v, k, d ); + } + H5FedReleaseListOfAdjacencies (f, &dadj_vertices); + H5FedReleaseListOfAdjacencies (f, &dadj_edges); + return H5_SUCCESS; +} + +static h5_err_t +traverse_vertices ( + h5_file_t* const f + ) { + h5_id_t local_id; + h5_id_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to vertices\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (f, 2); + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + print_adjacencies_of_vertex (f, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC ); + return H5FedEndTraverseEntities (f, iter); +} + +static h5_err_t +traverse_edges ( + h5_file_t* const f + ) { + h5_id_t local_id; + h5_id_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to edges\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (f, 1); + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + print_adjacencies_of_edge (f, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC ); + return H5FedEndTraverseEntities (f, iter); +} + +static h5_err_t +traverse_elems ( + h5_file_t* const f + ) { + h5_id_t local_id; + h5_id_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to tetrahedra\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (f, 0); + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + print_adjacencies_of_elem (f, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC); + return H5FedEndTraverseEntities (f, iter); +} + +static h5_err_t +traverse_level ( + h5_file_t* const f, + const h5_id_t level_id + ) { + printf (" Setting level to %lld\n", level_id); + H5FedSetLevel (f, level_id); + traverse_vertices (f); + traverse_edges (f); + traverse_elems (f); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + h5_file_t* const f, + const h5_id_t mesh_id, + const h5_oid_t mesh_type + ) { + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenMesh (f, mesh_id, mesh_type); + h5_size_t num_levels = H5FedGetNumLevels (f); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5_id_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (f, level_id); + } + /* done */ + H5FedCloseMesh (f); + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and get number of meshes */ + h5_file_t *f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_size_t num_meshes = H5FedGetNumMeshes (f, MESH_TYPE); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, MESH_TYPE); + } + + /* done */ + H5CloseFile (f); + return 0; +}