xref: /petsc/src/vec/is/utils/isio.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
1235f7792SMatthew G. Knepley #include <petscis.h>         /*I  "petscis.h"  I*/
2af0996ceSBarry Smith #include <petsc/private/isimpl.h>
390e28553SVaclav Hapla #include <petsc/private/viewerimpl.h>
420e823e8SBarry Smith #include <petsclayouthdf5.h>
5235f7792SMatthew G. Knepley 
6f92d9ac3SLisandro Dalcin PetscErrorCode ISView_Binary(IS is,PetscViewer viewer)
7f92d9ac3SLisandro Dalcin {
8f92d9ac3SLisandro Dalcin   PetscErrorCode ierr;
9f92d9ac3SLisandro Dalcin   PetscBool      skipHeader;
10f92d9ac3SLisandro Dalcin   PetscLayout    map;
11f92d9ac3SLisandro Dalcin   PetscInt       tr[2],n,s,N;
12f92d9ac3SLisandro Dalcin   const PetscInt *iarray;
13f92d9ac3SLisandro Dalcin 
14f92d9ac3SLisandro Dalcin   PetscFunctionBegin;
15f92d9ac3SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
16f92d9ac3SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
17f92d9ac3SLisandro Dalcin 
18f92d9ac3SLisandro Dalcin   ierr = ISGetLayout(is,&map);CHKERRQ(ierr);
19f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetLocalSize(map,&n);CHKERRQ(ierr);
20f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetRange(map,&s,NULL);CHKERRQ(ierr);
21f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetSize(map,&N);CHKERRQ(ierr);
22f92d9ac3SLisandro Dalcin 
23f92d9ac3SLisandro Dalcin   /* write IS header */
24f92d9ac3SLisandro Dalcin   tr[0] = IS_FILE_CLASSID; tr[1] = N;
25f92d9ac3SLisandro Dalcin   if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,tr,2,PETSC_INT);CHKERRQ(ierr);}
26f92d9ac3SLisandro Dalcin 
27f92d9ac3SLisandro Dalcin   /* write IS indices */
28f92d9ac3SLisandro Dalcin   ierr = ISGetIndices(is,&iarray);CHKERRQ(ierr);
29f92d9ac3SLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,iarray,n,s,N,PETSC_INT);CHKERRQ(ierr);
30f92d9ac3SLisandro Dalcin   ierr = ISRestoreIndices(is,&iarray);CHKERRQ(ierr);
31f92d9ac3SLisandro Dalcin   PetscFunctionReturn(0);
32f92d9ac3SLisandro Dalcin }
33f92d9ac3SLisandro Dalcin 
34235f7792SMatthew G. Knepley #if defined(PETSC_HAVE_HDF5)
35235f7792SMatthew G. Knepley /*
36235f7792SMatthew G. Knepley      This should handle properly the cases where PetscInt is 32 or 64 and hsize_t is 32 or 64. These means properly casting with
37235f7792SMatthew G. Knepley    checks back and forth between the two types of variables.
38235f7792SMatthew G. Knepley */
39235f7792SMatthew G. Knepley PetscErrorCode ISLoad_HDF5(IS is, PetscViewer viewer)
40235f7792SMatthew G. Knepley {
41235f7792SMatthew G. Knepley   hid_t           inttype;    /* int type (H5T_NATIVE_INT or H5T_NATIVE_LLONG) */
4290e28553SVaclav Hapla   PetscInt       *ind;
43235f7792SMatthew G. Knepley   const char     *isname;
44235f7792SMatthew G. Knepley   PetscErrorCode  ierr;
45235f7792SMatthew G. Knepley 
46235f7792SMatthew G. Knepley   PetscFunctionBegin;
47*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!((PetscObject)is)->name,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()");
48235f7792SMatthew G. Knepley #if defined(PETSC_USE_64BIT_INDICES)
49235f7792SMatthew G. Knepley   inttype = H5T_NATIVE_LLONG;
50235f7792SMatthew G. Knepley #else
51235f7792SMatthew G. Knepley   inttype = H5T_NATIVE_INT;
52235f7792SMatthew G. Knepley #endif
5390e28553SVaclav Hapla   ierr = PetscObjectGetName((PetscObject)is, &isname);CHKERRQ(ierr);
541c92607dSVaclav Hapla   ierr = PetscViewerHDF5Load(viewer, isname, is->map, inttype, (void**)&ind);CHKERRQ(ierr);
5590e28553SVaclav Hapla   ierr = ISGeneralSetIndices(is, is->map->n, ind, PETSC_OWN_POINTER);CHKERRQ(ierr);
56235f7792SMatthew G. Knepley   PetscFunctionReturn(0);
57235f7792SMatthew G. Knepley }
58235f7792SMatthew G. Knepley #endif
59235f7792SMatthew G. Knepley 
60ede126feSBarry Smith PetscErrorCode ISLoad_Binary(IS is, PetscViewer viewer)
61ede126feSBarry Smith {
62ede126feSBarry Smith   PetscErrorCode ierr;
63f92d9ac3SLisandro Dalcin   PetscBool      isgeneral,skipHeader;
64f92d9ac3SLisandro Dalcin   PetscInt       tr[2],rows,N,n,s,*idx;
65f92d9ac3SLisandro Dalcin   PetscLayout    map;
66ede126feSBarry Smith 
67ede126feSBarry Smith   PetscFunctionBegin;
68ede126feSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)is,ISGENERAL,&isgeneral);CHKERRQ(ierr);
69*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!isgeneral,PetscObjectComm((PetscObject)is),PETSC_ERR_ARG_INCOMP,"IS must be of type ISGENERAL to load into it");
70de8a3bf8SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
71f92d9ac3SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
72ede126feSBarry Smith 
73f92d9ac3SLisandro Dalcin   ierr = ISGetLayout(is,&map);CHKERRQ(ierr);
74f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetSize(map,&N);CHKERRQ(ierr);
75f92d9ac3SLisandro Dalcin 
76f92d9ac3SLisandro Dalcin   /* read IS header */
77f92d9ac3SLisandro Dalcin   if (!skipHeader) {
78ede126feSBarry Smith     ierr = PetscViewerBinaryRead(viewer,tr,2,NULL,PETSC_INT);CHKERRQ(ierr);
79*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(tr[0] != IS_FILE_CLASSID,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not an IS next in file");
80*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(tr[1] < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"IS size (%" PetscInt_FMT ") in file is negative",tr[1]);
81*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(N >= 0 && N != tr[1],PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"IS in file different size (%" PetscInt_FMT ") than input IS (%" PetscInt_FMT ")",tr[1],N);
82f92d9ac3SLisandro Dalcin     rows = tr[1];
83ede126feSBarry Smith   } else {
84*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(N < 0,PETSC_COMM_SELF,PETSC_ERR_USER,"IS binary file header was skipped, thus the user must specify the global size of input IS");
85f92d9ac3SLisandro Dalcin     rows = N;
86ede126feSBarry Smith   }
87f92d9ac3SLisandro Dalcin 
88f92d9ac3SLisandro Dalcin   /* set IS size if not already set */
89f92d9ac3SLisandro Dalcin   if (N < 0) {ierr = PetscLayoutSetSize(map,rows);CHKERRQ(ierr);}
90f92d9ac3SLisandro Dalcin   ierr = PetscLayoutSetUp(map);CHKERRQ(ierr);
91f92d9ac3SLisandro Dalcin 
92f92d9ac3SLisandro Dalcin   /* get IS sizes and check global size */
93f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetSize(map,&N);CHKERRQ(ierr);
94f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetLocalSize(map,&n);CHKERRQ(ierr);
95f92d9ac3SLisandro Dalcin   ierr = PetscLayoutGetRange(map,&s,NULL);CHKERRQ(ierr);
96*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(N != rows,PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"IS in file different size (%" PetscInt_FMT ") than input IS (%" PetscInt_FMT ")",rows,N);
97f92d9ac3SLisandro Dalcin 
98f92d9ac3SLisandro Dalcin   /* read IS indices */
99f92d9ac3SLisandro Dalcin   ierr = PetscMalloc1(n,&idx);CHKERRQ(ierr);
100f92d9ac3SLisandro Dalcin   ierr = PetscViewerBinaryReadAll(viewer,idx,n,s,N,PETSC_INT);CHKERRQ(ierr);
101f92d9ac3SLisandro Dalcin   ierr = ISGeneralSetIndices(is,n,idx,PETSC_OWN_POINTER);CHKERRQ(ierr);
102ede126feSBarry Smith   PetscFunctionReturn(0);
103ede126feSBarry Smith }
104ede126feSBarry Smith 
105235f7792SMatthew G. Knepley PetscErrorCode ISLoad_Default(IS is, PetscViewer viewer)
106235f7792SMatthew G. Knepley {
107f92d9ac3SLisandro Dalcin   PetscBool      isbinary,ishdf5;
108235f7792SMatthew G. Knepley   PetscErrorCode ierr;
109235f7792SMatthew G. Knepley 
110235f7792SMatthew G. Knepley   PetscFunctionBegin;
111235f7792SMatthew G. Knepley   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
112235f7792SMatthew G. Knepley   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,&ishdf5);CHKERRQ(ierr);
113235f7792SMatthew G. Knepley   if (isbinary) {
114ede126feSBarry Smith     ierr = ISLoad_Binary(is, viewer);CHKERRQ(ierr);
115235f7792SMatthew G. Knepley   } else if (ishdf5) {
116f92d9ac3SLisandro Dalcin #if defined(PETSC_HAVE_HDF5)
117235f7792SMatthew G. Knepley     ierr = ISLoad_HDF5(is, viewer);CHKERRQ(ierr);
118235f7792SMatthew G. Knepley #endif
119235f7792SMatthew G. Knepley   }
120235f7792SMatthew G. Knepley   PetscFunctionReturn(0);
121235f7792SMatthew G. Knepley }
122