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: }