On Wed, Sep 12, 2018 at 9:56 PM Ellen M. Price <[email protected]> wrote:
> Hi there, > > I'm running a complex PETSc program that outputs a LOT of data to an > HDF5 file. As such, I'd like to separate my output into groups to make > it easier to traverse in the analysis phase. > > I'm either confused about the nomenclature or the usage of > PetscViewerHDF5PushGroup/PetscViewerHDF5PopGroup. From a quick skim of > the source, it looks like the PushGroup function builds up a linked list > of group names? Also, just the name suggests that there should be a > "stack" of group names stored somewhere. > > So I would expect, after calling PetscViewerHDF5PushGroup twice, say, > > PetscViewerHDF5PushGroup(h5viewer, "group1"); > PetscViewerHDF5PushGroup(h5viewer, "group2"); > VecView(x, h5viewer); > > that I would get my vector output in /group1/group2/x. This is obviously > not what's actually happening. If I run > > http://www.mcs.anl.gov/petsc/petsc-current/src/vec/vec/examples/tutorials/ex19.c > , > for example, I get, from h5dump: > > HDF5 "ex19.h5" { > FILE_CONTENTS { > group / > dataset /TestVec > group /testBlockSize > dataset /testBlockSize/TestVec2 > group /testTimestep > dataset /testTimestep/TestVec2 > } > } > > even though multiple groups are "pushed" in sequence. > > My question is, have I misunderstood the connotation of pushing/popping > groups? How can I properly create a group and then a subgroup? Every > attempt at doing this: > > PetscViewerHDF5PushGroup(h5viewer, "/group1"); > PetscViewerHDF5PushGroup(h5viewer, "/group1/group2"); > This form works. Here is an example of me doing it: https://bitbucket.org/petsc/petsc/src/624d5184b94bda975877076c18f8637740f06a35/src/dm/impls/plex/plexhdf5.c#lines-430 Note that PushGroup just points us somewhere. If you want that 'directory' created, you have to do something like https://bitbucket.org/petsc/petsc/src/624d5184b94bda975877076c18f8637740f06a35/src/dm/impls/plex/plexhdf5.c#lines-380 HDF5 is terrible, its just that everything else is worse. Thanks, Matt > VecView(x, h5viewer); > > leads to a long string of HDF5 library errors, like: > > HDF5-DIAG: Error detected in HDF5 (1.8.16) MPI-process 0: > #000: ../../../src/H5L.c line 824 in H5Lexists(): unable to get link info > major: Symbol table > minor: Object not found > #001: ../../../src/H5L.c line 2765 in H5L_exists(): path doesn't exist > major: Symbol table > minor: Object already exists > #002: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal > path traversal failed > major: Symbol table > minor: Object not found > #003: ../../../src/H5Gtraverse.c line 755 in H5G_traverse_real(): > component not found > major: Symbol table > minor: Object not found > HDF5-DIAG: Error detected in HDF5 (1.8.16) MPI-process 0: > #000: ../../../src/H5G.c line 314 in H5Gcreate2(): unable to create group > major: Symbol table > minor: Unable to initialize object > #001: ../../../src/H5Gint.c line 194 in H5G__create_named(): unable to > create and link to group > major: Symbol table > minor: Unable to initialize object > #002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to > create new link to object > major: Links > minor: Unable to initialize object > #003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert > link > major: Symbol table > minor: Unable to insert object > #004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal > path traversal failed > major: Symbol table > minor: Object not found > #005: ../../../src/H5Gtraverse.c line 755 in H5G_traverse_real(): > component not found > major: Symbol table > minor: Object not found > > Thanks in advance, > Ellen Price > -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
