- use abort error handler
- polishing - adapted to coding style
This commit is contained in:
+178
-190
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user