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