- use abort error handler

- polishing
- adapted to coding style
This commit is contained in:
2010-05-19 07:35:02 +00:00
parent 5ce0374892
commit 493ca7ab49
7 changed files with 605 additions and 684 deletions
+178 -190
View File
@@ -1,277 +1,261 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <hdf5.h>
#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;
}
+115 -99
View File
@@ -1,69 +1,64 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <hdf5.h>
#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;
}
+46 -45
View File
@@ -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;
}
+64 -60
View File
@@ -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<num; i++ ) {
H5FedStoreVertex ( f, -1, V0[i].P );
/* 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;
for (i = 0; i < num_vertices; i++) {
H5FedStoreVertex (f, -1, Vertices[i].P);
}
H5FedEndStoreVertices ( f );
H5FedEndStoreVertices (f);
num = sizeof(T0)/sizeof(T0[0]);
H5FedBeginStoreElements ( f, num );
for ( i = 0; i<num; 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 );
H5FedAddLevel( f );
H5FedBeginRefineElements ( f, 1 );
H5FedRefineElement ( f, 0 );
H5FedEndRefineElements ( f );
H5FedEndStoreElements (f);
h5_int32_t num_tets_last_level = 1;
/* add 1. Level */
H5FedAddLevel(f);
H5FedBeginRefineElements (f, 1);
H5FedRefineElement (f, 0);
H5FedEndRefineElements (f);
/* add levels second to num_levels-1 */
h5_int32_t num_elems_last_level = 1;
h5_int32_t level_id;
for ( level_id = 2; level_id < num_levels; level_id++ ) {
h5_id_t level_id = H5FedAddLevel( f );
h5_int32_t num_tets2refine = power ( 4, level_id-1 );
H5FedBeginRefineElements ( f, num_tets2refine );
for ( i = num_tets_last_level;
i < num_tets_last_level+num_tets2refine;
i++ ) {
H5FedRefineElement ( f, i );
for (level_id = 2; level_id < num_levels; level_id++) {
/* refine 4 to the power of level_id-1 elems */
h5_id_t level_id = H5FedAddLevel(f);
h5_int32_t num_elems2refine = power (4, level_id-1);
H5FedBeginRefineElements (f, num_elems2refine);
for (i = num_elems_last_level;
i < num_elems_last_level+num_elems2refine;
i++) {
H5FedRefineElement (f, i);
}
H5FedEndRefineElements ( f );
num_tets_last_level += 2 * num_tets2refine;
H5FedEndRefineElements (f);
num_elems_last_level += 2 * num_elems2refine;
}
H5CloseFile ( f );
H5FedCloseMesh (f);
H5CloseFile (f);
return 0;
}
+54 -104
View File
@@ -2,59 +2,32 @@
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <hdf5.h>
#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;
}
+110 -109
View File
@@ -1,174 +1,175 @@
#include <stdio.h>
#include <stdlib.h>
#include <hdf5.h>
#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;
}
+38 -77
View File
@@ -1,112 +1,73 @@
#include <stdio.h>
#include <stdlib.h>
#include <hdf5.h>
#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;
}