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