Actual source code: isio.c
petsc-3.13.6 2020-09-29
Report Typos and Errors

      1:  #include <petscis.h>
      2:  #include <petsc/private/isimpl.h>
      3:  #include <petsc/private/viewerimpl.h>
      4:  #include <petsclayouthdf5.h>

      6: PetscErrorCode ISView_Binary(IS is,PetscViewer viewer)
      7: {
      9:   PetscBool      skipHeader;
     10:   PetscLayout    map;
     11:   PetscInt       tr[2],n,s,N;
     12:   const PetscInt *iarray;

     15:   PetscViewerSetUp(viewer);
     16:   PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);

     18:   ISGetLayout(is,&map);
     19:   PetscLayoutGetLocalSize(map,&n);
     20:   PetscLayoutGetRange(map,&s,NULL);
     21:   PetscLayoutGetSize(map,&N);

     23:   /* write IS header */
     24:   tr[0] = IS_FILE_CLASSID; tr[1] = N;
     25:   if (!skipHeader) {PetscViewerBinaryWrite(viewer,tr,2,PETSC_INT);}

     27:   /* write IS indices */
     28:   ISGetIndices(is,&iarray);
     29:   PetscViewerBinaryWriteAll(viewer,iarray,n,s,N,PETSC_INT);
     30:   ISRestoreIndices(is,&iarray);
     31:   return(0);
     32: }

     34: #if defined(PETSC_HAVE_HDF5)
     35: /*
     36:      This should handle properly the cases where PetscInt is 32 or 64 and hsize_t is 32 or 64. These means properly casting with
     37:    checks back and forth between the two types of variables.
     38: */
     39: PetscErrorCode ISLoad_HDF5(IS is, PetscViewer viewer)
     40: {
     41:   hid_t           inttype;    /* int type (H5T_NATIVE_INT or H5T_NATIVE_LLONG) */
     42:   PetscInt       *ind;
     43:   const char     *isname;
     44:   PetscErrorCode  ierr;

     47:   if (!((PetscObject)is)->name) SETERRQ(PetscObjectComm((PetscObject)is), PETSC_ERR_SUP, "Since HDF5 format gives ASCII name for each object in file; must use ISLoad() after setting name of Vec with PetscObjectSetName()");
     48: #if defined(PETSC_USE_64BIT_INDICES)
     49:   inttype = H5T_NATIVE_LLONG;
     50: #else
     51:   inttype = H5T_NATIVE_INT;
     52: #endif
     53:   PetscObjectGetName((PetscObject)is, &isname);
     54:   PetscViewerHDF5Load(viewer, isname, is->map, inttype, (void**)&ind);
     55:   ISGeneralSetIndices(is, is->map->n, ind, PETSC_OWN_POINTER);
     56:   return(0);
     57: }
     58: #endif

     60: PetscErrorCode ISLoad_Binary(IS is, PetscViewer viewer)
     61: {
     63:   PetscBool      isgeneral,skipHeader;
     64:   PetscInt       tr[2],rows,N,n,s,*idx;
     65:   PetscLayout    map;

     68:   PetscObjectTypeCompare((PetscObject)is,ISGENERAL,&isgeneral);
     69:   if (!isgeneral) SETERRQ(PetscObjectComm((PetscObject)is),PETSC_ERR_ARG_INCOMP,"IS must be of type ISGENERAL to load into it");
     70:   PetscViewerSetUp(viewer);
     71:   PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);

     73:   ISGetLayout(is,&map);
     74:   PetscLayoutGetSize(map,&N);

     76:   /* read IS header */
     77:   if (!skipHeader) {
     78:     PetscViewerBinaryRead(viewer,tr,2,NULL,PETSC_INT);
     79:     if (tr[0] != IS_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not an IS next in file");
     80:     if (tr[1] < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"IS size (%D) in file is negative",tr[1]);
     81:     if (N >= 0 && N != tr[1]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"IS in file different size (%D) than input IS (%D)",tr[1],N);
     82:     rows = tr[1];
     83:   } else {
     84:     if (N < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"IS binary file header was skipped, thus the user must specify the global size of input IS");
     85:     rows = N;
     86:   }

     88:   /* set IS size if not already set */
     89:   if (N < 0) {PetscLayoutSetSize(map,rows);}
     90:   PetscLayoutSetUp(map);

     92:   /* get IS sizes and check global size */
     93:   PetscLayoutGetSize(map,&N);
     94:   PetscLayoutGetLocalSize(map,&n);
     95:   PetscLayoutGetRange(map,&s,NULL);
     96:   if (N != rows) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"IS in file different size (%D) than input IS (%D)",rows,N);

     98:   /* read IS indices */
     99:   PetscMalloc1(n,&idx);
    100:   PetscViewerBinaryReadAll(viewer,idx,n,s,N,PETSC_INT);
    101:   ISGeneralSetIndices(is,n,idx,PETSC_OWN_POINTER);
    102:   return(0);
    103: }

    105: PetscErrorCode ISLoad_Default(IS is, PetscViewer viewer)
    106: {
    107:   PetscBool      isbinary,ishdf5;

    111:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);
    112:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,&ishdf5);
    113:   if (isbinary) {
    114:     ISLoad_Binary(is, viewer);
    115:   } else if (ishdf5) {
    116: #if defined(PETSC_HAVE_HDF5)
    117:     ISLoad_HDF5(is, viewer);
    118: #endif
    119:   }
    120:   return(0);
    121: }