Date: 2022-03-31T04:46:41+00:00

Actual source code: isio.c

      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: {
      8:   PetscBool      skipHeader;
      9:   PetscLayout    map;
     10:   PetscInt       tr[2],n,s,N;
     11:   const PetscInt *iarray;

     13:   PetscViewerSetUp(viewer);
     14:   PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);

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

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

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

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

     44: #if defined(PETSC_USE_64BIT_INDICES)
     45:   inttype = H5T_NATIVE_LLONG;
     46: #else
     47:   inttype = H5T_NATIVE_INT;
     48: #endif
     49:   PetscObjectGetName((PetscObject)is, &isname);
     50:   PetscViewerHDF5Load(viewer, isname, is->map, inttype, (void**)&ind);
     51:   ISGeneralSetIndices(is, is->map->n, ind, PETSC_OWN_POINTER);
     52:   return 0;
     53: }
     54: #endif

     56: PetscErrorCode ISLoad_Binary(IS is, PetscViewer viewer)
     57: {
     58:   PetscBool      isgeneral,skipHeader;
     59:   PetscInt       tr[2],rows,N,n,s,*idx;
     60:   PetscLayout    map;

     62:   PetscObjectTypeCompare((PetscObject)is,ISGENERAL,&isgeneral);
     64:   PetscViewerSetUp(viewer);
     65:   PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);

     67:   ISGetLayout(is,&map);
     68:   PetscLayoutGetSize(map,&N);

     70:   /* read IS header */
     71:   if (!skipHeader) {
     72:     PetscViewerBinaryRead(viewer,tr,2,NULL,PETSC_INT);
     76:     rows = tr[1];
     77:   } else {
     79:     rows = N;
     80:   }

     82:   /* set IS size if not already set */
     83:   if (N < 0) PetscLayoutSetSize(map,rows);
     84:   PetscLayoutSetUp(map);

     86:   /* get IS sizes and check global size */
     87:   PetscLayoutGetSize(map,&N);
     88:   PetscLayoutGetLocalSize(map,&n);
     89:   PetscLayoutGetRange(map,&s,NULL);

     92:   /* read IS indices */
     93:   PetscMalloc1(n,&idx);
     94:   PetscViewerBinaryReadAll(viewer,idx,n,s,N,PETSC_INT);
     95:   ISGeneralSetIndices(is,n,idx,PETSC_OWN_POINTER);
     96:   return 0;
     97: }

     99: PetscErrorCode ISLoad_Default(IS is, PetscViewer viewer)
    100: {
    101:   PetscBool      isbinary,ishdf5;

    103:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);
    104:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,&ishdf5);
    105:   if (isbinary) {
    106:     ISLoad_Binary(is, viewer);
    107:   } else if (ishdf5) {
    108: #if defined(PETSC_HAVE_HDF5)
    109:     ISLoad_HDF5(is, viewer);
    110: #endif
    111:   }
    112:   return 0;
    113: }