xref: /petsc/src/vec/is/utils/isio.c (revision da8c939b118068a1ceac5e4b3ba271c87cfc5bc7)
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 
6d71ae5a4SJacob Faibussowitsch PetscErrorCode ISView_Binary(IS is, PetscViewer viewer)
7d71ae5a4SJacob Faibussowitsch {
8f92d9ac3SLisandro Dalcin   PetscBool       skipHeader;
9f92d9ac3SLisandro Dalcin   PetscLayout     map;
10f92d9ac3SLisandro Dalcin   PetscInt        tr[2], n, s, N;
11f92d9ac3SLisandro Dalcin   const PetscInt *iarray;
12f92d9ac3SLisandro Dalcin 
13f92d9ac3SLisandro Dalcin   PetscFunctionBegin;
149566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
159566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetSkipHeader(viewer, &skipHeader));
16f92d9ac3SLisandro Dalcin 
179566063dSJacob Faibussowitsch   PetscCall(ISGetLayout(is, &map));
189566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetLocalSize(map, &n));
199566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetRange(map, &s, NULL));
209566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetSize(map, &N));
21f92d9ac3SLisandro Dalcin 
22f92d9ac3SLisandro Dalcin   /* write IS header */
239371c9d4SSatish Balay   tr[0] = IS_FILE_CLASSID;
249371c9d4SSatish Balay   tr[1] = N;
259566063dSJacob Faibussowitsch   if (!skipHeader) PetscCall(PetscViewerBinaryWrite(viewer, tr, 2, PETSC_INT));
26f92d9ac3SLisandro Dalcin 
27f92d9ac3SLisandro Dalcin   /* write IS indices */
289566063dSJacob Faibussowitsch   PetscCall(ISGetIndices(is, &iarray));
299566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWriteAll(viewer, iarray, n, s, N, PETSC_INT));
309566063dSJacob Faibussowitsch   PetscCall(ISRestoreIndices(is, &iarray));
313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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 */
39d71ae5a4SJacob Faibussowitsch PetscErrorCode ISLoad_HDF5(IS is, PetscViewer viewer)
40d71ae5a4SJacob Faibussowitsch {
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 
45235f7792SMatthew G. Knepley   PetscFunctionBegin;
46fa7c0e95SVaclav Hapla   PetscCheck(((PetscObject)is)->name, PetscObjectComm((PetscObject)is), PETSC_ERR_SUP, "IS name must be given using PetscObjectSetName() before ISLoad() since HDF5 can store multiple objects in a single file");
47235f7792SMatthew G. Knepley   #if defined(PETSC_USE_64BIT_INDICES)
48235f7792SMatthew G. Knepley   inttype = H5T_NATIVE_LLONG;
49235f7792SMatthew G. Knepley   #else
50235f7792SMatthew G. Knepley   inttype = H5T_NATIVE_INT;
51235f7792SMatthew G. Knepley   #endif
529566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)is, &isname));
539566063dSJacob Faibussowitsch   PetscCall(PetscViewerHDF5Load(viewer, isname, is->map, inttype, (void **)&ind));
549566063dSJacob Faibussowitsch   PetscCall(ISGeneralSetIndices(is, is->map->n, ind, PETSC_OWN_POINTER));
553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
56235f7792SMatthew G. Knepley }
57235f7792SMatthew G. Knepley #endif
58235f7792SMatthew G. Knepley 
59*da8c939bSJacob Faibussowitsch static PetscErrorCode ISLoad_Binary(IS is, PetscViewer viewer)
60d71ae5a4SJacob Faibussowitsch {
61f92d9ac3SLisandro Dalcin   PetscBool   isgeneral, skipHeader;
62f92d9ac3SLisandro Dalcin   PetscInt    tr[2], rows, N, n, s, *idx;
63f92d9ac3SLisandro Dalcin   PetscLayout map;
64ede126feSBarry Smith 
65ede126feSBarry Smith   PetscFunctionBegin;
669566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)is, ISGENERAL, &isgeneral));
67fa7c0e95SVaclav Hapla   PetscCheck(isgeneral, PetscObjectComm((PetscObject)is), PETSC_ERR_ARG_INCOMP, "IS must be of type ISGENERAL to load into it");
689566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
699566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetSkipHeader(viewer, &skipHeader));
70ede126feSBarry Smith 
719566063dSJacob Faibussowitsch   PetscCall(ISGetLayout(is, &map));
729566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetSize(map, &N));
73f92d9ac3SLisandro Dalcin 
74f92d9ac3SLisandro Dalcin   /* read IS header */
75f92d9ac3SLisandro Dalcin   if (!skipHeader) {
769566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(viewer, tr, 2, NULL, PETSC_INT));
77fa7c0e95SVaclav Hapla     PetscCheck(tr[0] == IS_FILE_CLASSID, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_UNEXPECTED, "Not an IS next in file");
78fa7c0e95SVaclav Hapla     PetscCheck(tr[1] >= 0, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_UNEXPECTED, "IS size (%" PetscInt_FMT ") in file is negative", tr[1]);
79c9cc58a2SBarry Smith     PetscCheck(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);
80f92d9ac3SLisandro Dalcin     rows = tr[1];
81ede126feSBarry Smith   } else {
82fa7c0e95SVaclav Hapla     PetscCheck(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");
83f92d9ac3SLisandro Dalcin     rows = N;
84ede126feSBarry Smith   }
85f92d9ac3SLisandro Dalcin 
86f92d9ac3SLisandro Dalcin   /* set IS size if not already set */
879566063dSJacob Faibussowitsch   if (N < 0) PetscCall(PetscLayoutSetSize(map, rows));
889566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(map));
89f92d9ac3SLisandro Dalcin 
90f92d9ac3SLisandro Dalcin   /* get IS sizes and check global size */
919566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetSize(map, &N));
929566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetLocalSize(map, &n));
939566063dSJacob Faibussowitsch   PetscCall(PetscLayoutGetRange(map, &s, NULL));
94fa7c0e95SVaclav Hapla   PetscCheck(N == rows, PETSC_COMM_SELF, PETSC_ERR_FILE_UNEXPECTED, "IS in file different size (%" PetscInt_FMT ") than input IS (%" PetscInt_FMT ")", rows, N);
95f92d9ac3SLisandro Dalcin 
96f92d9ac3SLisandro Dalcin   /* read IS indices */
979566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n, &idx));
989566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryReadAll(viewer, idx, n, s, N, PETSC_INT));
999566063dSJacob Faibussowitsch   PetscCall(ISGeneralSetIndices(is, n, idx, PETSC_OWN_POINTER));
1003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
101ede126feSBarry Smith }
102ede126feSBarry Smith 
103d71ae5a4SJacob Faibussowitsch PetscErrorCode ISLoad_Default(IS is, PetscViewer viewer)
104d71ae5a4SJacob Faibussowitsch {
105f92d9ac3SLisandro Dalcin   PetscBool isbinary, ishdf5;
106235f7792SMatthew G. Knepley 
107235f7792SMatthew G. Knepley   PetscFunctionBegin;
1089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary));
1099566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
110235f7792SMatthew G. Knepley   if (isbinary) {
1119566063dSJacob Faibussowitsch     PetscCall(ISLoad_Binary(is, viewer));
112235f7792SMatthew G. Knepley   } else if (ishdf5) {
113f92d9ac3SLisandro Dalcin #if defined(PETSC_HAVE_HDF5)
1149566063dSJacob Faibussowitsch     PetscCall(ISLoad_HDF5(is, viewer));
115235f7792SMatthew G. Knepley #endif
116235f7792SMatthew G. Knepley   }
1173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
118235f7792SMatthew G. Knepley }
119