[petsc-users] VecLoad from HDF5 file

Hapla Vaclav vaclav.hapla at erdw.ethz.ch
Wed Apr 7 03:07:44 CDT 2021


Dear Thibault

On 7 Apr 2021, at 08:18, Thibault Bridel-Bertomeu <thibault.bridelbertomeu at gmail.com<mailto:thibault.bridelbertomeu at gmail.com>> wrote:

Dear all,

I have been facing a problem with VecLoad recently, even though it seems to me I did exactly like in the examples/tutorials.

Basically, a program writes a vector with the HDF5 writer like this :

                call DMCreateGlobalVector(dm, sol, ierr);           CHKERRA(ierr)
                call VecZeroEntries(X, ierr);                     CHKERRA(ierr)
                call PetscObjectSetName(X, "Solution", ierr);     CHKERRA(ierr)

                < do something with X to fill it up with relevant data >

                call PetscViewerCreate(PETSC_COMM_WORLD, hdf5Viewer, ierr); CHKERRA(ierr)
                call PetscViewerSetType(hdf5Viewer, PETSCVIEWERHDF5, ierr); CHKERRA(ierr)
                call PetscViewerFileSetMode(hdf5Viewer, FILE_MODE_WRITE, ierr); CHKERRA(ierr);
                write(filename,'(A,I5.5,A)') "restart_", stepnum, ".h5"
                call PetscViewerFileSetName(hdf5Viewer, trim(filename), ierr); CHKERRA(ierr)
                call VecView(X, hdf5Viewer, ierr); CHKERRA(ierr)
                call PetscViewerDestroy(hdf5Viewer, ierr); CHKERRA(ierr)


and the same program (but with different start-up options, say) re-reads such a file like this :


                call DMCreateGlobalVector(dm, sol, ierr);           CHKERRA(ierr)
                call VecZeroEntries(sol, ierr);                     CHKERRA(ierr)
                call PetscObjectSetName(sol, "Solution", ierr);     CHKERRA(ierr)
                call PetscViewerCreate(PETSC_COMM_WORLD, hdf5Viewer, ierr); CHKERRA(ierr)
                call PetscViewerSetType(hdf5Viewer, PETSCVIEWERHDF5, ierr); CHKERRA(ierr)
                call PetscViewerFileSetMode(hdf5Viewer, FILE_MODE_READ, ierr); CHKERRA(ierr)
                call PetscViewerFileSetName(hdf5Viewer, trim(restartname), ierr); CHKERRA(ierr)
                call VecLoad(sol, hdf5Viewer, ierr); CHKERRA(ierr)
                call PetscViewerDestroy(hdf5Viewer, ierr); CHKERRA(ierr)


Such a dataset can be found under this link : https://drive.google.com/file/d/1owLAx5vknNhj61_5ieAwnWOR9cmkTseL/view?usp=sharing

I'm just looking at the HDF5 file. The structure is like this

> $PETSC_DIR/$PETSC_ARCH/bin/h5dump -H restart_00020.h5

HDF5 "restart_00020.h5" {
GROUP "/" {
   GROUP "cell_fields" {
      DATASET "Solution_FV solver" {
         DATATYPE  H5T_IEEE_F64LE
         DATASPACE  SIMPLE { ( 21, 3884, 5 ) / ( H5S_UNLIMITED, 3884, 5 ) }
         ATTRIBUTE "vector_field_type" {
            DATATYPE  H5T_STRING {
               STRSIZE 7;
               STRPAD H5T_STR_NULLTERM;
               CSET H5T_CSET_ASCII;
               CTYPE H5T_C_S1;
            }
            DATASPACE  SCALAR
         }
      }
   }
   GROUP "fields" {
      DATASET "Solution" {
         DATATYPE  H5T_IEEE_F64LE
         DATASPACE  SIMPLE { ( 21, 5060, 5 ) / ( H5S_UNLIMITED, 5060, 5 ) }
      }
   }
   DATASET "time" {
      DATATYPE  H5T_IEEE_F64LE
      DATASPACE  SIMPLE { ( 21, 1 ) / ( H5S_UNLIMITED, 1 ) }
   }
}
}


I would like the reader to read the /fields/Solution group basically, but I am not even sure it tries to do that.
Anyhow, I got an error, saying that the size found in the file (105) does not match the expected size (25300). If I look at the shape of /fields/Solution it is given as (21, 5030, 5). First, it is weird, cause the 21 seems to be 1 + current iteration number ... but anyways we find the 5 variables and the 5030 cells. Only the reader seems to do 21 * 5 when it should be doing 5030 * 5 ...
I tried adding 'PetscViewerHDF5PushGroup(hdf5Viewer, "/fields/Solution", ierr)' to force it to read that group, but it does not change anything.

You definitely need to push the group, unless it's the root group "/". There is no way the reader would guess the correct group if it's not the root one [and I don't think it would be a good idea to implement such searching].

If you tried adding
  PetscViewerHDF5PushGroup(hdf5Viewer, "/fields/Solution", ierr)
you likely pushed a wrong group. If the Vec name was set to "Solution" like in your snippet [using PetscObjectSetName()], the absolute dataset name to look up would be "/fields/Solution/Solution".

But in your file, there's just a dataset "/fields/Solution", so its parent group is just "/fields". So please try pushing this.

I would gladly try to reproduce your case - perhaps the error handling should be improved so that it would guide you into the right direction. But it would be helpful to know exactly what you're doing - the snippet with VecView() above should produce "/Solution" dataset but in the file you're sending, there's "/fields/Solution".

Note also you don't need to do VecZeroEntries() before loading because VecLoad() fully rewrites the Vec data in memory anyway.


I would appreciate it if anyone could give me pointers on this issue ...

Thank you very much in advance !!

Thibault

Thanks,
Vaclav

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210407/5771e342/attachment-0001.html>


More information about the petsc-users mailing list