diff --git a/test/H5Fed/tetmesh_adjacencies.c b/test/H5Fed/tetmesh_adjacencies.c index 99e3cba..fdeb5d7 100644 --- a/test/H5Fed/tetmesh_adjacencies.c +++ b/test/H5Fed/tetmesh_adjacencies.c @@ -1,277 +1,261 @@ #include #include #include -#include + #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif - #define PRINT_UPADJACENCIES 1 #define PRINT_DOWNADJACENCIES 0 -struct vertex { - h5_float64_t P[3]; -}; +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; -typedef struct vertex vertex_t; - -struct tet { - h5_id_t global_id; - h5_id_t parent_id; - h5_id_t vids[4]; -}; -typedef struct tet tet_t; - -h5_err_t +static h5_err_t print_adjacencies_of_vertex ( - h5_file_t * const f, + h5_file_t* const f, h5_id_t local_id, - clock_t *t + clock_t* t ) { - h5_idlist_t *uadj_edges; - h5_idlist_t *uadj_triangles; - h5_idlist_t *uadj_tets; + h5_idlist_t* uadj_edges; + h5_idlist_t* uadj_triangles; + h5_idlist_t* uadj_tets; clock_t t1 = clock(); - H5FedGetEdgesUpAdjacentToVertex ( f, local_id, &uadj_edges ); - H5FedGetTrianglesUpAdjacentToVertex ( f, local_id, &uadj_triangles ); - H5FedGetTetsUpAdjacentToVertex ( f, local_id, &uadj_tets ); + H5FedGetEdgesUpAdjacentToVertex (f, local_id, &uadj_edges); + H5FedGetTrianglesUpAdjacentToVertex (f, local_id, &uadj_triangles); + H5FedGetTetsUpAdjacentToVertex (f, local_id, &uadj_tets); *t = clock() - t1; int n = uadj_tets->num_items; - if ( uadj_triangles->num_items > n ) n = uadj_triangles->num_items; - if ( uadj_edges->num_items > n ) n = uadj_edges->num_items; + 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++ ) { + for (i = 0; i < n; i++) { char v[256]; char k[256]; char d[256]; char t[256]; h5_id_t local_vids[4]; - if ( i == 0 ) { - snprintf ( v, sizeof(v), "=%llx=", local_id ); + if (i == 0) { + snprintf (v, sizeof(v), "=%llx=", local_id); } else { *v = '\0'; } - if ( i < uadj_edges->num_items ) { + 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] ); + 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 ) { + 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] ); + 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'; } - if ( i < uadj_tets->num_items ) { + if (i < uadj_tets->num_items) { H5FedGetVertexIndicesOfEntity ( - f, uadj_tets->items[i], local_vids ); - snprintf ( t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + f, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", local_vids[0], local_vids[1], - local_vids[2], local_vids[3] ); + local_vids[2], local_vids[3]); } else { *t = '\0'; } - printf ( "| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t ); + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); } - H5FedReleaseListOfAdjacencies ( f, &uadj_edges ); - H5FedReleaseListOfAdjacencies ( f, &uadj_triangles ); - H5FedReleaseListOfAdjacencies ( f, &uadj_tets ); + H5FedReleaseListOfAdjacencies (f, &uadj_edges); + H5FedReleaseListOfAdjacencies (f, &uadj_triangles); + H5FedReleaseListOfAdjacencies (f, &uadj_tets); return H5_SUCCESS; } static h5_err_t print_adjacencies_of_edge ( - h5_file_t * const f, + h5_file_t* const f, h5_id_t local_id, - clock_t *t + clock_t* t ) { - h5_idlist_t *dadj_vertices; - h5_idlist_t *uadj_triangles; - h5_idlist_t *uadj_tets; + h5_idlist_t* dadj_vertices; + h5_idlist_t* uadj_triangles; + h5_idlist_t* uadj_tets; clock_t t1 = clock(); - H5FedGetVerticesDownAdjacentToEdge ( f, local_id, &dadj_vertices ); - H5FedGetTrianglesUpAdjacentToEdge ( f, local_id, &uadj_triangles ); - H5FedGetTetsUpAdjacentToEdge ( f, local_id, &uadj_tets ); + H5FedGetVerticesDownAdjacentToEdge (f, local_id, &dadj_vertices); + H5FedGetTrianglesUpAdjacentToEdge (f, local_id, &uadj_triangles); + H5FedGetTetsUpAdjacentToEdge (f, local_id, &uadj_tets); *t = clock() - t1; int n = dadj_vertices->num_items; - if ( uadj_triangles->num_items > n ) n = uadj_triangles->num_items; - if ( uadj_tets->num_items > n ) n = uadj_tets->num_items; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + if (uadj_tets->num_items > n) n = uadj_tets->num_items; int i; - for ( i = 0; i < n; i++ ) { + for (i = 0; i < n; i++) { char v[256]; char k[256]; char d[256]; char t[256]; h5_id_t local_vids[4]; - if ( i < dadj_vertices->num_items ) { - snprintf ( v, sizeof(v), "=[%lld]=", - dadj_vertices->items[i] ); + if (i < dadj_vertices->num_items) { + snprintf (v, sizeof(v), "=[%lld]=", + dadj_vertices->items[i]); } else { *v = '\0'; } - if ( i == 0 ) { - snprintf ( k, sizeof(k), "=%llx=", local_id ); + if (i == 0) { + snprintf (k, sizeof(k), "=%llx=", local_id); } else { *k = '\0'; } - if ( i < uadj_triangles->num_items ) { + 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] ); + 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'; } - if ( i < uadj_tets->num_items ) { + if (i < uadj_tets->num_items) { H5FedGetVertexIndicesOfEntity ( - f, uadj_tets->items[i], local_vids ); - snprintf ( t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + f, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", local_vids[0], local_vids[1], - local_vids[2], local_vids[3] ); + local_vids[2], local_vids[3]); } else { *t = '\0'; } - printf ( "| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t ); + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); } - H5FedReleaseListOfAdjacencies ( f, &dadj_vertices ); - H5FedReleaseListOfAdjacencies ( f, &uadj_triangles ); - H5FedReleaseListOfAdjacencies ( f, &uadj_tets ); + H5FedReleaseListOfAdjacencies (f, &dadj_vertices); + H5FedReleaseListOfAdjacencies (f, &uadj_triangles); + H5FedReleaseListOfAdjacencies (f, &uadj_tets); return H5_SUCCESS; } static h5_err_t print_adjacencies_of_triangle ( - h5_file_t * const f, + h5_file_t* const f, h5_id_t local_id, - clock_t *t + clock_t* t ) { - h5_idlist_t *dadj_vertices; - h5_idlist_t *dadj_edges; - h5_idlist_t *uadj_tets; + h5_idlist_t* dadj_vertices; + h5_idlist_t* dadj_edges; + h5_idlist_t* uadj_tets; clock_t t1 = clock(); - H5FedGetVerticesDownAdjacentToTriangle ( f, local_id, &dadj_vertices ); - H5FedGetEdgesDownAdjacentToTriangle ( f, local_id, &dadj_edges ); - H5FedGetTetsUpAdjacentToTriangle ( f, local_id, &uadj_tets ); + H5FedGetVerticesDownAdjacentToTriangle (f, local_id, &dadj_vertices); + H5FedGetEdgesDownAdjacentToTriangle (f, local_id, &dadj_edges); + H5FedGetTetsUpAdjacentToTriangle (f, local_id, &uadj_tets); *t = clock() - t1; int n = dadj_vertices->num_items; - if ( dadj_edges->num_items > n ) n = dadj_edges->num_items; - if ( uadj_tets->num_items > n ) n = uadj_tets->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + if (uadj_tets->num_items > n) n = uadj_tets->num_items; int i; - for ( i = 0; i < n; i++ ) { + for (i = 0; i < n; i++) { char v[256]; char k[256]; char d[256]; char t[256]; h5_id_t local_vids[4]; - if ( i < dadj_vertices->num_items ) { - snprintf ( v, sizeof(v), "=[%lld]=", - dadj_vertices->items[i] ); + if (i < dadj_vertices->num_items) { + snprintf (v, sizeof(v), "=[%lld]=", + dadj_vertices->items[i]); } else { *v = '\0'; } - if ( i < dadj_edges->num_items ) { + 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] ); + 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 ) { - snprintf ( d, sizeof(d), "=%llx=", local_id ); + if (i == 0) { + snprintf (d, sizeof(d), "=%llx=", local_id); } else { *d = '\0'; } - if ( i < uadj_tets->num_items ) { + if (i < uadj_tets->num_items) { H5FedGetVertexIndicesOfEntity ( - f, uadj_tets->items[i], local_vids ); - snprintf ( t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", - local_vids[0], local_vids[1], - local_vids[2], local_vids[3] ); + f, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + local_vids[0], local_vids[1], + local_vids[2], local_vids[3]); } else { *t = '\0'; } printf ( "| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t ); } - H5FedReleaseListOfAdjacencies ( f, &dadj_vertices ); - H5FedReleaseListOfAdjacencies ( f, &dadj_edges ); - H5FedReleaseListOfAdjacencies ( f, &uadj_tets ); + H5FedReleaseListOfAdjacencies (f, &dadj_vertices); + H5FedReleaseListOfAdjacencies (f, &dadj_edges); + H5FedReleaseListOfAdjacencies (f, &uadj_tets); return H5_SUCCESS; } static h5_err_t print_adjacencies_of_tet ( - h5_file_t * const f, + h5_file_t* const f, h5_id_t local_id, - clock_t *t + clock_t* t ) { - h5_idlist_t *dadj_vertices; - h5_idlist_t *dadj_edges; - h5_idlist_t *dadj_triangles; + h5_idlist_t* dadj_vertices; + h5_idlist_t* dadj_edges; + h5_idlist_t* dadj_triangles; clock_t t1 = clock(); - H5FedGetVerticesDownAdjacentToTet ( f, local_id, &dadj_vertices ); - H5FedGetEdgesDownAdjacentToTet ( f, local_id, &dadj_edges ); - H5FedGetTrianglesDownAdjacentToTet ( f, local_id, &dadj_triangles ); + H5FedGetVerticesDownAdjacentToTet (f, local_id, &dadj_vertices); + H5FedGetEdgesDownAdjacentToTet (f, local_id, &dadj_edges); + H5FedGetTrianglesDownAdjacentToTet (f, local_id, &dadj_triangles); *t = clock() - t1; int n = dadj_vertices->num_items; - if ( dadj_edges->num_items > n ) n = dadj_edges->num_items; - if ( dadj_triangles->num_items > n ) n = dadj_triangles->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + if (dadj_triangles->num_items > n) n = dadj_triangles->num_items; int i; - for ( i = 0; i < n; i++ ) { + for (i = 0; i < n; i++) { char v[256]; char k[256]; char d[256]; char t[256]; h5_id_t local_vids[4]; - if ( i < dadj_vertices->num_items ) { - snprintf ( v, sizeof(v), "=[%lld]=", - dadj_vertices->items[i] ); + if (i < dadj_vertices->num_items) { + snprintf (v, sizeof(v), "=[%lld]=", + dadj_vertices->items[i]); } else { *v = '\0'; } - if ( i < dadj_edges->num_items ) { + 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] ); + f, dadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + local_vids[0], local_vids[1]); } else { *k = '\0'; } - if ( i < dadj_triangles->num_items ) { + if (i < dadj_triangles->num_items) { H5FedGetVertexIndicesOfEntity ( - f, dadj_triangles->items[i], local_vids ); - snprintf ( d, sizeof(d), "=[%lld,%lld,%lld]=", - local_vids[0], local_vids[1], local_vids[2] ); + f, dadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + local_vids[0], local_vids[1], local_vids[2]); } else { *d = '\0'; } - if ( i == 0 ) { - snprintf ( t, sizeof(t), "=%llx=", local_id ); + if (i == 0) { + snprintf (t, sizeof(t), "=%llx=", local_id); } else { *t = '\0'; } - printf ( "| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t ); + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); } - H5FedReleaseListOfAdjacencies ( f, &dadj_vertices ); - H5FedReleaseListOfAdjacencies ( f, &dadj_edges ); - H5FedReleaseListOfAdjacencies ( f, &dadj_triangles ); + H5FedReleaseListOfAdjacencies (f, &dadj_vertices); + H5FedReleaseListOfAdjacencies (f, &dadj_edges); + H5FedReleaseListOfAdjacencies (f, &dadj_triangles); return H5_SUCCESS; } static h5_err_t traverse_vertices ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_id_t num = 0; @@ -279,17 +263,17 @@ traverse_vertices ( clock_t t_min = CLOCKS_PER_SEC; clock_t t_max = 0; clock_t t = 0; - printf ( "\nAdjacencies to vertices\n" ); + printf ("\nAdjacencies to vertices\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 3); fprintf ( stderr, "Computing all adjacencies of all vertices ... "); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { - print_adjacencies_of_vertex ( f, local_id, &t ); + 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; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; } fprintf ( stderr, @@ -304,7 +288,7 @@ traverse_vertices ( static h5_err_t traverse_edges ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_id_t num = 0; @@ -312,17 +296,17 @@ traverse_edges ( clock_t t_min = CLOCKS_PER_SEC; clock_t t_max = 0; clock_t t = 0; - printf ( "\nAdjacencies to edges\n" ); + printf ("\nAdjacencies to edges\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 2); fprintf ( stderr, "Computing all adjacencies of all edges ... "); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { - print_adjacencies_of_edge ( f, local_id, &t ); + 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; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; } fprintf ( stderr, @@ -337,7 +321,7 @@ traverse_edges ( static h5_err_t traverse_triangles ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_id_t num = 0; @@ -345,17 +329,17 @@ traverse_triangles ( clock_t t_max = 0; clock_t t_total = 0; clock_t t = 0; - printf ( "\nAdjacencies to triangle\n" ); + printf ("\nAdjacencies to triangle\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 1); fprintf ( stderr, "Computing all adjacencies of all triangles ... "); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { - print_adjacencies_of_triangle ( f, local_id, &t ); + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + print_adjacencies_of_triangle (f, local_id, &t); num++; t_total += t; - if ( t < t_min ) t_min = t; - if ( t > t_max ) t_max = t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; } fprintf ( stderr, @@ -369,8 +353,8 @@ traverse_triangles ( } static h5_err_t -traverse_tets ( - h5_file_t * f +traverse_elems ( + h5_file_t* const f ) { h5_id_t local_id; h5_id_t num = 0; @@ -378,17 +362,17 @@ traverse_tets ( clock_t t_min = CLOCKS_PER_SEC; clock_t t_max = 0; clock_t t = 0; - printf ( "\nAdjacencies to tetrahedra\n" ); + printf ("\nAdjacencies to tetrahedra\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 0); fprintf ( stderr, "Computing all adjacencies of all tetrahedra ... "); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { - print_adjacencies_of_tet ( f, local_id, &t ); + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + print_adjacencies_of_tet (f, local_id, &t); num++; t_total += t; - if ( t < t_min ) t_min = t; - if ( t > t_max ) t_max = t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; } fprintf ( stderr, @@ -397,64 +381,68 @@ traverse_tets ( (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 ); + (double)t_max / (double)CLOCKS_PER_SEC); return H5FedEndTraverseEntities (f, iter); } static h5_err_t traverse_level ( - h5_file_t * f + h5_file_t* const f, + const h5_id_t level_id ) { - fprintf ( stderr, "Level ID: %lld\n", H5FedGetLevel( f ) ); - traverse_vertices ( f ); - traverse_edges ( f ); - traverse_triangles ( f ); - traverse_tets ( f ); + printf (" Setting level to %lld\n", level_id); + H5FedSetLevel (f, level_id); + traverse_vertices (f); + traverse_edges (f); + traverse_triangles (f); + traverse_elems (f); return H5_SUCCESS; } static h5_err_t traverse_mesh ( - h5_file_t * f + 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", num_levels); + /* loop over all levels */ h5_id_t level_id; - h5_size_t num_levels = H5FedGetNumLevels ( f ); - printf ( " Number of levels in mesh: %lld\n", num_levels ); - for ( level_id = 0; level_id < num_levels; level_id++ ) { - H5FedSetLevel ( f, level_id ); - traverse_level ( f ); + 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[] + char* argv[] ) { - H5SetVerbosityLevel ( 2 ); - H5SetErrorHandler ( H5AbortErrorhandler ); - h5_file_t *f = H5OpenFile ( "simple_tet.h5", H5_O_RDONLY, 0 ); - h5_size_t num_meshes = H5FedGetNumMeshes ( f, H5_TETRAHEDRAL_MESH ); - printf ( " Number of meshes: %lld\n", num_meshes ); + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (4); + /* 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", num_meshes); + + /* loop over all meshes */ h5_id_t mesh_id; - for ( mesh_id = 0; mesh_id < num_meshes; mesh_id++ ) { - fprintf ( - stderr, - "Opening mesh ... " ); - clock_t t1 = clock(); - H5FedOpenMesh ( f, mesh_id, H5_TETRAHEDRAL_MESH ); - clock_t t2 = clock(); - fprintf ( - stderr, - "%f secs\n", - (double)(t2-t1) / (double)CLOCKS_PER_SEC ); - traverse_mesh ( f ); + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, MESH_TYPE); } - H5CloseFile ( f ); + /* done */ + H5CloseFile (f); return 0; } diff --git a/test/H5Fed/tetmesh_read.c b/test/H5Fed/tetmesh_read.c index 133b1cb..fa8acb8 100644 --- a/test/H5Fed/tetmesh_read.c +++ b/test/H5Fed/tetmesh_read.c @@ -1,69 +1,64 @@ #include #include #include -#include + #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif - -struct vertex { - h5_float64_t P[3]; -}; - -typedef struct vertex vertex_t; - -struct tet { - h5_id_t global_id; - h5_id_t parent_id; - h5_id_t vids[4]; -}; -typedef struct tet tet_t; +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; static h5_err_t traverse_vertices ( - h5_file_t * f + h5_file_t* const f ) { - h5_id_t vertex_id; - h5_float64_t P[3]; - h5_size_t real_num = 0; - h5t_entity_iterator_t* iter; + printf ( "Traversing vertices on level %lld:\n", H5FedGetLevel(f) ); - h5_size_t num = H5FedGetNumVerticesTotal ( f ); - printf ( " Number of vertices on level: %lld\n", num ); + /* get number of vertices we have to expect */ + h5_size_t num_vertices_expect = H5FedGetNumVerticesTotal (f); - iter = H5FedBeginTraverseEntities ( f, 3 ); - while ( (real_num < num) && - ((vertex_id = H5FedTraverseEntities ( f, iter )) >= 0) ) { - H5FedGetVertexCoordByID (f, vertex_id, P); + /* get iterator for co-dim 3 entities, i.e vertices */ + h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 3); + + /* iterate */ + h5_id_t local_id; + h5_size_t num_vertices = 0; + while ((local_id = H5FedTraverseEntities ( f, iter )) >= 0) { + h5_float64_t P[3]; + H5FedGetVertexCoordByID (f, local_id, P); char v[256]; - snprintf ( v, sizeof(v), "=%llx=", vertex_id ); - printf ( "| %-18s | (%f, %f, %f) |\n", - v, P[0], P[1], P[2] ); - real_num++; + snprintf (v, sizeof(v), "=%llx=", local_id); + printf ("| %-18s | (%f, %f, %f) |\n", + v, P[0], P[1], P[2]); + num_vertices++; } - H5FedEndTraverseEntities ( f, iter ); - if ( real_num != num ) { - fprintf ( stderr, "!!! Got %lld vertices, but expected %lld.\n", - real_num, num ); - exit ( 1 ); + /* done */ + H5FedEndTraverseEntities (f, iter); + + /* report error if we got a different number then expected */ + if (num_vertices != num_vertices_expect) { + fprintf (stderr, "!!! Got %lld vertices, but expected %lld.\n", + num_vertices, num_vertices_expect); } + + printf (" Number of vertices on level: %lld\n", num_vertices); return H5_SUCCESS; } static h5_err_t traverse_edges ( - h5_file_t * f + h5_file_t* const f ) { + printf ( "Travering edges on level %lld:\n", H5FedGetLevel(f) ); + + /* get iterator for co-dim 2 entities, i.e. edges */ + h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 2); + + /* iterate */ h5_id_t local_id; - h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities ( f, 2 ); - printf ( "Edges on level %lld:\n", H5FedGetLevel(f) ); - while ( (local_id = H5FedTraverseEntities ( f, iter )) >= 0 ) { + h5_size_t num_edges = 0; + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { char v[256]; char k[256]; h5_id_t local_vids[4]; @@ -72,19 +67,29 @@ traverse_edges ( snprintf ( v, sizeof(v), "=[%lld,%lld]=", local_vids[0], local_vids[1] ); printf ( "| %-18s | %-18s |\n", k, v ); + num_edges++; } + + /* done */ H5FedEndTraverseEntities ( f, iter ); + + printf (" Number of edges: %lld\n", num_edges); return H5_SUCCESS; } static h5_err_t traverse_triangles ( - h5_file_t * f + h5_file_t* const f ) { + printf ( "Travering triangles on level %lld:\n", H5FedGetLevel(f) ); + + /* get iterator for co-dim 1 entities, i.e. triangles */ + h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 1); + + /* iterate */ h5_id_t local_id; - h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities ( f, 1 ); - printf ( "Triangles on level %lld:\n", H5FedGetLevel(f) ); - while ( (local_id = H5FedTraverseEntities ( f, iter )) >= 0 ) { + h5_size_t num_triangles = 0; + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { char v[256]; char d[256]; h5_id_t local_vids[4]; @@ -93,104 +98,115 @@ traverse_triangles ( snprintf ( v, sizeof(v), "=[%lld,%lld,%lld]=", local_vids[0], local_vids[1], local_vids[2] ); printf ( "| %-18s | %-18s |\n", d, v ); + num_triangles++; } + + /* done */ H5FedEndTraverseEntities ( f, iter ); + + printf (" Number of triangles: %lld\n", num_triangles); return H5_SUCCESS; } static h5_err_t -traverse_tets ( - h5_file_t * f +traverse_elems ( + h5_file_t* const f ) { - h5_id_t local_id; - h5_size_t real_num = 0; + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumElementsTotal (f); - h5_size_t num = H5FedGetNumElementsTotal ( f ); - printf ( " Number of tetrahedra on level: %lld\n", num ); + /* get iterator for co-dim 0 */ h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 0); - while ( (real_num < num) && - ((local_id = H5FedTraverseEntities ( f, iter )) >= 0) ) { + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities ( f, iter )) >= 0) { char v[256]; char t[256]; h5_id_t local_vids[4]; snprintf ( t, sizeof(t), "=%llx=", local_id ); H5FedGetVertexIndicesOfEntity ( f, local_id, local_vids ); snprintf ( v, sizeof(v), "=[%lld,%lld,%lld,%lld]=", - local_vids[0], local_vids[1], local_vids[2],local_vids[3] ); + local_vids[0], local_vids[1], + local_vids[2],local_vids[3] ); printf ( "| %-18s | %-18s |\n", t, v ); - real_num++; + num_elems++; } + + /* done */ H5FedEndTraverseEntities (f, iter); - if ( real_num != num ) { - fprintf ( stderr, "!!! Got %lld tets, but expected %lld.\n", - real_num, num ); + + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + num_elems, num_elems_expect); exit(1); } + printf (" Number of elements on level: %lld\n", num_elems); return H5_SUCCESS; } + static h5_err_t -read_level ( - h5_file_t * f +traverse_level ( + h5_file_t* const f, + const h5_id_t level_id ) { - traverse_vertices ( f ); - traverse_edges ( f ); - traverse_triangles ( f ); - traverse_tets ( f ); + printf (" Setting level to %lld\n", level_id); + H5FedSetLevel (f, level_id); + traverse_vertices (f); + traverse_edges (f); + traverse_triangles (f); + traverse_elems (f); return H5_SUCCESS; } static h5_err_t traverse_mesh ( - h5_file_t * f + 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", num_levels); + /* loop over all levels */ h5_id_t level_id; - h5_size_t num_levels = H5FedGetNumLevels ( f ); - printf ( " Number of levels in mesh: %lld\n", num_levels ); - for ( level_id = 2; level_id < num_levels; level_id++ ) { - h5_err_t h5err = H5FedSetLevel ( f, level_id ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't set level %lld.\n", level_id ); - return -1; - } - h5err = read_level ( f ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return -1; - } + 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[] + char* argv[] ) { - H5SetVerbosityLevel ( 2 ); - H5SetErrorHandler ( H5AbortErrorhandler ); - h5_file_t *f = H5OpenFile ( "simple_tet.h5", H5_O_RDONLY, 0 ); - h5_size_t num_meshes = H5FedGetNumMeshes ( f, H5_TETRAHEDRAL_MESH ); - printf ( " Number of meshes: %lld\n", num_meshes ); + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (4); + /* 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", num_meshes); + + /* loop over all meshes */ h5_id_t mesh_id; - for ( mesh_id = 0; mesh_id < num_meshes; mesh_id++ ) { - fprintf ( - stderr, - "Time used: %f\n", - (float)clock()/(float)CLOCKS_PER_SEC ); - H5FedOpenMesh ( f, mesh_id, H5_TETRAHEDRAL_MESH ); - fprintf ( - stderr, - "Time used: %f\n", - (float)clock()/(float)CLOCKS_PER_SEC ); - traverse_mesh ( f ); + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, MESH_TYPE); } - H5CloseFile ( f ); + /* done */ + H5CloseFile (f); return 0; } diff --git a/test/H5Fed/tetmesh_write.c b/test/H5Fed/tetmesh_write.c index 7b79d80..277945a 100644 --- a/test/H5Fed/tetmesh_write.c +++ b/test/H5Fed/tetmesh_write.c @@ -11,73 +11,74 @@ #endif #endif -struct vertex { - h5_id_t global_id; +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; + +typedef struct vertex { h5_float64_t P[3]; -}; +} vertex_t; -typedef struct vertex vertex_t; - -struct tet { - h5_id_t global_id; - h5_id_t parent_id; +typedef struct elem { h5_id_t vids[4]; -}; -typedef struct tet tet_t; +} elem_t; - -vertex_t V0[5] = { - { 0, {-1.0, 0.0, 0.0} }, - { 1, { 1.0, 0.0, 0.0} }, - { 2, { 0.0, 1.0, 0.0} }, - { 3, { 0.0, 0.0, 1.0} }, - { 4, { 0.0, -1.0, 0.0} } +vertex_t Vertices[] = { + {{-1.0, 0.0, 0.0}}, + {{ 1.0, 0.0, 0.0}}, + {{ 0.0, 1.0, 0.0}}, + {{ 0.0, 0.0, 1.0}}, + {{ 0.0, -1.0, 0.0}} }; -// sorted vertices: 0, 4, 5, 3, 2, 1 - -tet_t T0[2] = { - { 1, -1, { 0, 1, 2, 3 } }, // 0, 3, 2, 1 - { 0, -1, { 0, 1, 3, 4 } } // 0, 4, 3, 1 +elem_t Elems[] = { + {{ 0, 1, 2, 3 }}, // 0, 3, 2, 1 + {{ 0, 1, 3, 4 }} // 0, 4, 3, 1 }; +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); -// sorted 0th vertex tets: 2, 1, 0, 3 int main ( int argc, - char *argv[] + char* argv[] ) { - H5SetVerbosityLevel ( 2 ); - H5SetErrorHandler ( H5AbortErrorhandler ); + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); - h5_file_t *f = H5OpenFile ( "simple_tet.h5", H5_O_WRONLY, 0 ); - H5FedAddMesh ( f, H5_TETRAHEDRAL_MESH ); + /* open file and add mesh */ + h5_file_t* const f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + H5FedAddMesh (f, MESH_TYPE); + + /* store vertices */ + H5FedBeginStoreVertices (f, num_vertices); int i; - H5FedBeginStoreVertices ( f, 5 ); - for ( i = 0; i<5; i++ ) { - H5FedStoreVertex ( f, -1, V0[i].P ); + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (f, -1, Vertices[i].P); } - H5FedEndStoreVertices ( f ); + H5FedEndStoreVertices (f); - H5FedBeginStoreElements ( f, 2 ); - for ( i = 0; i<2; i++ ) { - H5FedStoreElement ( f, T0[i].vids ); + /* store elements */ + H5FedBeginStoreElements (f, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (f, Elems[i].vids); } - H5FedEndStoreElements ( f ); + H5FedEndStoreElements (f); /* add 1. Level */ - h5_id_t level_id = H5FedAddLevel( f ); - H5FedBeginRefineElements ( f, 1 ); - h5_id_t elem_id = H5FedRefineElement ( f, 0 ); - H5FedEndRefineElements ( f ); + H5FedAddLevel(f); + H5FedBeginRefineElements (f, 1); + H5FedRefineElement (f, 0); + H5FedEndRefineElements (f); /* add 2. Level */ - level_id = H5FedAddLevel( f ); - H5FedBeginRefineElements ( f, 1 ); - elem_id = H5FedRefineElement ( f, 2 ); - H5FedEndRefineElements ( f ); + H5FedAddLevel(f); + H5FedBeginRefineElements (f, 1); + H5FedRefineElement (f, 2); + H5FedEndRefineElements (f); - H5CloseFile ( f ); + H5FedCloseMesh (f); + H5CloseFile (f); return 0; } diff --git a/test/H5Fed/tetmesh_write2.c b/test/H5Fed/tetmesh_write2.c index 92f626e..fd7ad5d 100644 --- a/test/H5Fed/tetmesh_write2.c +++ b/test/H5Fed/tetmesh_write2.c @@ -5,41 +5,37 @@ #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; +const h5_int32_t num_levels = 11; -struct vertex { + +typedef struct vertex { h5_float64_t P[3]; -}; +} vertex_t; -typedef struct vertex vertex_t; - -struct tet { +typedef struct elem { h5_id_t vids[4]; -}; -typedef struct tet tet_t; +} elem_t; - -vertex_t V0[] = { - {{ -1.0, 0.0, 0.0 }}, - {{ 1.0, 0.0, 0.0 }}, - {{ 0.0, 1.0, 0.0 }}, - {{ 0.0, 0.0, 1.0 }} +vertex_t Vertices[] = { + {{-1.0, 0.0, 0.0}}, + {{ 1.0, 0.0, 0.0}}, + {{ 0.0, 1.0, 0.0}}, + {{ 0.0, 0.0, 1.0}} }; -// sorted vertices: 0, 4, 5, 3, 2, 1 - -tet_t T0[] = { - {{ 0, 1, 2, 3 }} // 0, 3, 2, 1 +elem_t Elems[] = { + {{ 0, 1, 2, 3 }} }; +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + static h5_int32_t power ( - h5_int32_t x, - h5_int32_t y + const h5_int32_t x, + const h5_int32_t y ) { h5_int32_t p = 1; h5_int32_t b = y; @@ -48,10 +44,10 @@ power ( // multiply corresponding table entry h5_int32_t powerN = x; - while ( b != 0 ) { - if ( (b&1) != 0 ) p *= powerN; + while (b != 0) { + if ((b&1) != 0) p *= powerN; b >>= 1; - powerN=powerN*powerN; + powerN = powerN * powerN; } return p; } @@ -59,47 +55,55 @@ power ( int main ( int argc, - char *argv[] + char* argv[] ) { - h5_int32_t num_levels = 11; - H5SetVerbosityLevel ( 2 ); - H5SetErrorHandler ( H5AbortErrorhandler ); - h5_file_t *f = H5OpenFile ( "tetmesh.h5", H5_O_WRONLY, 0 ); - H5FedAddMesh ( f, H5_TETRAHEDRAL_MESH ); + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); - h5_int32_t i; - h5_int32_t num = sizeof(V0) / sizeof(V0[0]); - H5FedBeginStoreVertices ( f, num ); - for ( i = 0; i #include #include -#include + #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif - -struct vertex { - h5_float64_t P[3]; -}; - -typedef struct vertex vertex_t; - -struct tet { - h5_id_t global_id; - h5_id_t parent_id; - h5_id_t vids[4]; -}; -typedef struct tet tet_t; +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; static h5_err_t set_vertex_tags ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_int64_t val[3]; - printf ( "\nSet tags to vertices\n" ); + printf ("\nSet tags to vertices\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 3); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { val[0] = local_id; val[1] = local_id+1; val[2] = local_id+2; - H5FedSetMTag ( - f, - "testtag", - local_id, - 3, - val - ); + H5FedSetMTag (f, "testtag", local_id, 3, val); h5_int64_t retval[3]; size_t dims; - H5FedGetMTag ( - f, - "testtag", - local_id, - &dims, - retval ); - if ( memcmp ( val, retval, sizeof(val) ) ) { - fprintf ( stderr, "Oops!\n" ); + H5FedGetMTag (f, "testtag", local_id, &dims, retval); + if (memcmp (val, retval, sizeof(val))) { + fprintf ( stderr, "Oops!\n"); } } return H5FedEndTraverseEntities (f, iter); @@ -62,33 +35,22 @@ set_vertex_tags ( static h5_err_t set_edge_tags ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_int64_t val[3]; - printf ( "\nSet tags to edges\n" ); + printf ("\nSet tags to edges\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 2); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { val[0] = local_id; val[1] = local_id+1; val[2] = local_id+2; - H5FedSetMTag ( - f, - "testtag", - local_id, - 3, - val - ); + H5FedSetMTag (f, "testtag", local_id, 3, val); h5_int64_t retval[3]; size_t dims; - H5FedGetMTag ( - f, - "testtag", - local_id, - &dims, - retval ); - if ( memcmp ( val, retval, sizeof(val) ) ) { - fprintf ( stderr, "Oops!\n" ); + H5FedGetMTag (f, "testtag", local_id, &dims, retval); + if (memcmp ( val, retval, sizeof(val))) { + fprintf ( stderr, "Oops!\n"); } } return H5FedEndTraverseEntities (f, iter); @@ -96,33 +58,22 @@ set_edge_tags ( static h5_err_t set_tri_tags ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_int64_t val[3]; - printf ( "\nSet tags to triangle\n" ); + printf ("\nSet tags to triangle\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 1); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { val[0] = local_id; val[1] = local_id+1; val[2] = local_id+2; - H5FedSetMTag ( - f, - "testtag", - local_id, - 3, - val - ); + H5FedSetMTag (f, "testtag", local_id, 3, val); h5_int64_t retval[3]; size_t dims; - H5FedGetMTag ( - f, - "testtag", - local_id, - &dims, - retval ); - if ( memcmp ( val, retval, sizeof(val) ) ) { - fprintf ( stderr, "Oops!\n" ); + H5FedGetMTag (f, "testtag", local_id, &dims, retval); + if (memcmp (val, retval, sizeof(val))) { + fprintf (stderr, "Oops!\n"); } } return H5FedEndTraverseEntities (f, iter); @@ -130,33 +81,22 @@ set_tri_tags ( static h5_err_t set_tet_tags ( - h5_file_t * f + h5_file_t* const f ) { h5_id_t local_id; h5_int64_t val[3]; - printf ( "\nSet tags to tetrahedra\n" ); + printf ("\nSet tags to tetrahedra\n"); h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 0); - while ( (local_id = H5FedTraverseEntities (f, iter)) >= 0 ) { + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { val[0] = local_id; val[1] = local_id+1; val[2] = local_id+2; - H5FedSetMTag ( - f, - "testtag", - local_id, - 3, - val - ); + H5FedSetMTag (f, "testtag", local_id, 3, val); h5_int64_t retval[3]; size_t dims; - H5FedGetMTag ( - f, - "testtag", - local_id, - &dims, - retval ); - if ( memcmp ( val, retval, sizeof(val) ) ) { - fprintf ( stderr, "Oops!\n" ); + H5FedGetMTag (f, "testtag", local_id, &dims, retval); + if (memcmp (val, retval, sizeof(val))) { + fprintf (stderr, "Oops!\n"); } } return H5FedEndTraverseEntities (f, iter); @@ -165,20 +105,30 @@ set_tet_tags ( int main ( int argc, - char *argv[] + char* argv[] ) { - H5SetVerbosityLevel ( 5 ); - H5SetErrorHandler ( H5AbortErrorhandler ); - h5_file_t *f = H5OpenFile ( "simple_tet.h5", H5_O_RDONLY, 0 ); - H5FedOpenMesh ( f, 0, H5_TETRAHEDRAL_MESH ); - h5_size_t num_levels = H5FedGetNumLevels ( f ); - H5FedSetLevel ( f, num_levels-1 ); - H5FedAddMTagset ( f, "testtag", H5_INT64_T ); - set_vertex_tags ( f ); - set_edge_tags ( f ); - set_tri_tags ( f ); - set_tet_tags ( f ); - H5CloseFile ( f ); + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (4); + + /* open file and get number of meshes */ + h5_file_t* f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + H5FedOpenMesh (f, 0, MESH_TYPE); + + /* open last level */ + h5_size_t num_levels = H5FedGetNumLevels (f); + H5FedSetLevel (f, num_levels-1); + + /* add new tagset and write some data to it */ + H5FedAddMTagset (f, "testtag", H5_INT64_T); + set_vertex_tags (f); + set_edge_tags (f); + set_tri_tags (f); + set_tet_tags (f); + + /* done */ + H5FedCloseMesh (f); + H5CloseFile (f); return 0; } diff --git a/test/H5Fed/trimesh_read.c b/test/H5Fed/trimesh_read.c index 7b3d01f..6289e39 100644 --- a/test/H5Fed/trimesh_read.c +++ b/test/H5Fed/trimesh_read.c @@ -1,174 +1,175 @@ #include #include -#include + #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif - -struct vertex { - h5_float64_t P[3]; -}; - -typedef struct vertex vertex_t; - -struct entity { - h5_id_t global_id; - h5_id_t parent_id; - h5_id_t vids[3]; -}; -typedef struct entity entity_t; +const h5_oid_t MESH_TYPE = H5_TRIANGLE_MESH; +const char* FNAME = "simple_triangle.h5"; static h5_err_t traverse_vertices ( - h5_file_t * f + h5_file_t* const f ) { - h5_id_t vertex_id; - h5_float64_t P[3]; - h5_size_t real_num = 0; - h5t_entity_iterator_t* iter; + /* get number of vertices we have to expect */ + h5_size_t num_vertices_expect = H5FedGetNumVerticesTotal (f); - h5_size_t num = H5FedGetNumVerticesTotal (f); - printf (" Number of vertices on level: %lld\n", num); + /* get iterator for co-dim 2 entities, i.e. vertices */ + h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 2); - iter = H5FedBeginTraverseEntities (f, 2); - while ((real_num < num) && - ((vertex_id = H5FedTraverseEntities (f, iter)) >= 0)) { - H5FedGetVertexCoordByID (f, vertex_id, P); + /* iterate */ + h5_id_t local_id; + h5_size_t num_vertices = 0; + while ((local_id = H5FedTraverseEntities ( f, iter )) >= 0) { + h5_float64_t P[3]; + H5FedGetVertexCoordByID (f, local_id, P); char v[256]; - snprintf (v, sizeof(v), "=%llx=", vertex_id); + snprintf (v, sizeof(v), "=%llx=", local_id); printf ("| %-18s | (%f, %f, %f) |\n", v, P[0], P[1], P[2]); - real_num++; + num_vertices++; } + + /* done */ H5FedEndTraverseEntities (f, iter); - if (real_num != num) { + /* report error if we got a different number then expected */ + if (num_vertices != num_vertices_expect) { fprintf (stderr, "!!! Got %lld vertices, but expected %lld.\n", - real_num, num); - exit (1); + num_vertices, num_vertices_expect); } + + printf (" Number of vertices on level: %lld\n", num_vertices); + return H5_SUCCESS; +} + +static h5_err_t +traverse_edges ( + h5_file_t* const f + ) { + printf ( "Travering edges on level %lld:\n", H5FedGetLevel(f) ); + + /* get iterator for co-dim 1 entities, i.e. edges */ + h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 1); + + /* iterate */ + h5_id_t local_id; + h5_size_t num_edges = 0; + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { + char v[256]; + char k[256]; + h5_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", local_id ); + H5FedGetVertexIndicesOfEntity ( f, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld]=", + local_vids[0], local_vids[1] ); + printf ( "| %-18s | %-18s |\n", k, v ); + num_edges++; + } + + /* done */ + H5FedEndTraverseEntities ( f, iter ); + + printf (" Number of edges: %lld\n", num_edges); return H5_SUCCESS; } static h5_err_t traverse_elems ( - h5_file_t * f + h5_file_t* const f ) { - h5_id_t local_id; - h5_size_t real_num = 0; + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumElementsTotal (f); - h5_size_t num = H5FedGetNumElementsTotal ( f ); - printf ( " Number of tetrahedra on level: %lld\n", num ); + /* get iterator for co-dim 0 */ h5t_entity_iterator_t* iter = H5FedBeginTraverseEntities (f, 0); - while ( (real_num < num) && - ((local_id = H5FedTraverseEntities ( f, iter )) >= 0) ) { + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities (f, iter)) >= 0) { char v[256]; char t[256]; h5_id_t local_vids[4]; - snprintf ( t, sizeof(t), "=%llx=", local_id ); - H5FedGetVertexIndicesOfEntity ( f, local_id, local_vids ); + snprintf (t, sizeof(t), "=%llx=", local_id); + H5FedGetVertexIndicesOfEntity (f, local_id, local_vids); snprintf (v, sizeof(v), "=[%lld,%lld,%lld]=", local_vids[0], local_vids[1], local_vids[2]); - printf ( "| %-18s | %-18s |\n", t, v ); - real_num++; + printf ("| %-18s | %-18s |\n", t, v); + num_elems++; } + + /* done */ H5FedEndTraverseEntities (f, iter); - if ( real_num != num ) { - fprintf ( stderr, "!!! Got %lld tets, but expected %lld.\n", - real_num, num ); + + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + num_elems, num_elems_expect); exit(1); } + printf (" Number of elements on level: %lld\n", num_elems); return H5_SUCCESS; } -h5_err_t +static h5_err_t traverse_level ( - h5_file_t* const f + h5_file_t* const f, + const h5_id_t level_id ) { - h5_err_t h5err = traverse_vertices (f); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return -1; - } - h5err = traverse_elems (f); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return -1; - } + printf (" Setting level to %lld\n", level_id); + H5FedSetLevel (f, level_id); + traverse_vertices (f); + traverse_edges (f); + traverse_elems (f); return H5_SUCCESS; } -h5_err_t +static h5_err_t traverse_mesh ( - h5_file_t * f + 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", num_levels); + /* loop over all levels */ h5_id_t level_id; - h5_size_t num_levels = H5FedGetNumLevels ( f ); - if ( num_levels < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return -1; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (f, level_id); } - printf ( " Number of levels in mesh: %lld\n", num_levels ); - for ( level_id = 0; level_id < num_levels; level_id++ ) { - printf ( " Going to level %lld\n", level_id ); - h5_err_t h5err = H5FedSetLevel ( f, level_id ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't set level %lld.\n", level_id ); - return -1; - } - h5err = traverse_level ( f ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return -1; - } - } - - + /* done */ + H5FedCloseMesh (f); return H5_SUCCESS; } int main ( int argc, - char *argv[] + char* argv[] ) { - H5SetVerbosityLevel ( 4 ); + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (4); - h5_file_t *f = H5OpenFile ( "simple_triangle.h5", H5_O_RDONLY, 0 ); - if ( f == NULL ) { - fprintf ( stderr, "!!! Can't open file.\n" ); - return -1; - } - - h5_size_t num_meshes = H5FedGetNumMeshes ( f, H5_TRIANGLE_MESH ); - printf ( " Number of meshes: %lld\n", num_meshes ); + /* 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", num_meshes); + /* loop over all meshes */ h5_id_t mesh_id; - for ( mesh_id = 0; mesh_id < num_meshes; mesh_id++ ) { - h5_err_t h5err = H5FedOpenMesh ( f, mesh_id, H5_TRIANGLE_MESH ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't open mesh %lld\n", mesh_id ); - return -1; - } - h5err = traverse_mesh ( f ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Oops ...\n" ); - return 1; - } + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, MESH_TYPE); } - h5_err_t h5err = H5CloseFile ( f ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't close file.\n" ); - return -1; - } + /* done */ + H5CloseFile (f); return 0; } diff --git a/test/H5Fed/trimesh_write.c b/test/H5Fed/trimesh_write.c index d9c44eb..6a96748 100644 --- a/test/H5Fed/trimesh_write.c +++ b/test/H5Fed/trimesh_write.c @@ -1,112 +1,73 @@ #include #include -#include + #include "H5Part.h" #include "H5Fed.h" -#ifndef PARALLEL_IO -#ifndef MPI_COMM_WORLD -#define MPI_COMM_WORLD 0 -#endif -#endif +const h5_oid_t MESH_TYPE = H5_TRIANGLE_MESH; +const char* FNAME = "simple_triangle.h5"; -struct vertex { - h5_id_t global_id; +typedef struct vertex { +h5_id_t global_id; h5_float64_t P[3]; -}; +} vertex_t; -typedef struct vertex vertex_t; - -struct entity { - h5_id_t global_id; +typedef struct elem { +h5_id_t global_id; h5_id_t parent_id; h5_id_t vids[3]; -}; -typedef struct entity entity_t; +} elem_t; - -vertex_t V[4] = { +vertex_t Vertices[] = { { 0, {-1.0, 0.0, 0.0} }, { 1, { 1.0, 0.0, 0.0} }, { 2, { 0.0, 1.0, 0.0} }, { 3, { 0.0, -1.0, 0.0} } }; -entity_t T[2] = { +elem_t Elems[] = { { 1, -1, { 0, 1, 2 } }, { 0, -1, { 0, 1, 3 } } }; +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + int main ( int argc, - char *argv[] + char* argv[] ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); - H5SetVerbosityLevel ( 4 ); + /* open file and add mesh */ + h5_file_t* const f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + H5FedAddMesh (f, MESH_TYPE); - h5_file_t *f = H5OpenFile ( "simple_triangle.h5", H5_O_WRONLY, 0 ); - if ( f == NULL ) { - fprintf ( stderr, "!!! Can't open file.\n" ); - return -1; - } - - h5_err_t h5err = H5FedAddMesh ( f, H5_TRIANGLE_MESH ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't set step.\n" ); - return -1; - } - - H5FedBeginStoreVertices ( f, 4 ); + /* store vertices */ + H5FedBeginStoreVertices (f, num_vertices); int i; - for ( i = 0; i < 4; i++ ) { - h5err = H5FedStoreVertex ( - f, - -1, - V[i].P ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't store vertex.\n" ); - return -1; - } + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (f, -1, Vertices[i].P); } - H5FedEndStoreVertices ( f ); + H5FedEndStoreVertices (f); - H5FedBeginStoreElements ( f, 2 ); - for ( i = 0; i < 2; i++ ) { - h5err = H5FedStoreElement ( - f, - T[i].vids ); - - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't store tet.\n" ); - return -1; - } + /* store elements */ + H5FedBeginStoreElements (f, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (f, Elems[i].vids); } - H5FedEndStoreElements ( f ); + H5FedEndStoreElements (f); - h5_id_t level_id = H5FedAddLevel( f ); - if ( level_id < 0 ) { - fprintf ( stderr, "!!! Can't add level.\n" ); - return -1; - } + /* add 1. Level */ + H5FedAddLevel(f); + H5FedBeginRefineElements (f, 1); + H5FedRefineElement (f, 0); + H5FedEndRefineElements (f); - h5err = H5FedBeginRefineElements ( f, 1 ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't set number of elements torefine.\n" ); - return -1; - } - - h5_id_t elem_id = H5FedRefineElement ( f, 0 ); - if ( elem_id < 0 ) { - fprintf ( stderr, "!!! Can't refine tet.\n" ); - return -1; - } - H5FedEndRefineElements ( f ); - - h5err = H5CloseFile ( f ); - if ( h5err < 0 ) { - fprintf ( stderr, "!!! Can't close file.\n" ); - return -1; - } + H5FedCloseMesh (f); + H5CloseFile (f); return 0; }