1235f7792SMatthew G. Knepley #include <petscis.h> /*I "petscis.h" I*/ 2af0996ceSBarry Smith #include <petsc/private/isimpl.h> 3*90e28553SVaclav Hapla #include <petsc/private/viewerimpl.h> 4235f7792SMatthew G. Knepley 5235f7792SMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 6235f7792SMatthew G. Knepley /* 7235f7792SMatthew 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 8235f7792SMatthew G. Knepley checks back and forth between the two types of variables. 9235f7792SMatthew G. Knepley */ 10235f7792SMatthew G. Knepley PetscErrorCode ISLoad_HDF5(IS is, PetscViewer viewer) 11235f7792SMatthew G. Knepley { 12*90e28553SVaclav Hapla HDF5ReadCtx h; 13235f7792SMatthew G. Knepley hid_t inttype; /* int type (H5T_NATIVE_INT or H5T_NATIVE_LLONG) */ 14*90e28553SVaclav Hapla hid_t memspace; 15*90e28553SVaclav Hapla PetscInt *ind; 16235f7792SMatthew G. Knepley const char *isname; 17235f7792SMatthew G. Knepley PetscErrorCode ierr; 18235f7792SMatthew G. Knepley 19235f7792SMatthew G. Knepley PetscFunctionBegin; 20ede126feSBarry Smith if (!((PetscObject)is)->name) SETERRQ(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()"); 21235f7792SMatthew G. Knepley #if defined(PETSC_USE_64BIT_INDICES) 22235f7792SMatthew G. Knepley inttype = H5T_NATIVE_LLONG; 23235f7792SMatthew G. Knepley #else 24235f7792SMatthew G. Knepley inttype = H5T_NATIVE_INT; 25235f7792SMatthew G. Knepley #endif 26*90e28553SVaclav Hapla 27*90e28553SVaclav Hapla ierr = PetscObjectGetName((PetscObject)is,&isname);CHKERRQ(ierr); 28*90e28553SVaclav Hapla ierr = PetscViewerHDF5ReadInitialize_Internal(viewer, isname, &h);CHKERRQ(ierr); 29*90e28553SVaclav Hapla ierr = PetscViewerHDF5ReadSizes_Internal(viewer, h, &is->map);CHKERRQ(ierr); 30*90e28553SVaclav Hapla ierr = PetscViewerHDF5ReadSelectHyperslab_Internal(viewer, h, is->map, &memspace);CHKERRQ(ierr); 31*90e28553SVaclav Hapla 32*90e28553SVaclav Hapla ierr = PetscMalloc1(is->map->n,&ind);CHKERRQ(ierr); 33*90e28553SVaclav Hapla ierr = PetscViewerHDF5ReadArray_Internal(viewer, h, inttype, memspace, (void*)ind);CHKERRQ(ierr); 34*90e28553SVaclav Hapla ierr = ISGeneralSetIndices(is, is->map->n, ind, PETSC_OWN_POINTER);CHKERRQ(ierr); 35235f7792SMatthew G. Knepley 36235f7792SMatthew G. Knepley /* Close/release resources */ 37729ab6d9SBarry Smith PetscStackCallHDF5(H5Sclose,(memspace)); 38*90e28553SVaclav Hapla ierr = PetscViewerHDF5ReadFinalize_Internal(viewer, &h);CHKERRQ(ierr); 39235f7792SMatthew G. Knepley PetscFunctionReturn(0); 40235f7792SMatthew G. Knepley } 41235f7792SMatthew G. Knepley #endif 42235f7792SMatthew G. Knepley 43ede126feSBarry Smith PetscErrorCode ISLoad_Binary(IS is, PetscViewer viewer) 44ede126feSBarry Smith { 45ede126feSBarry Smith PetscErrorCode ierr; 46de8a3bf8SLisandro Dalcin PetscBool isgeneral,skipHeader,useMPIIO; 47ede126feSBarry Smith int fd; 48ede126feSBarry Smith PetscInt tr[2],N,ln,*idx; 49ede126feSBarry Smith MPI_Request request; 50ede126feSBarry Smith MPI_Status status; 51ede126feSBarry Smith MPI_Comm comm; 52ede126feSBarry Smith PetscMPIInt rank,size,tag; 53ede126feSBarry Smith 54ede126feSBarry Smith PetscFunctionBegin; 55ede126feSBarry Smith ierr = PetscObjectGetComm((PetscObject)is,&comm);CHKERRQ(ierr); 56ede126feSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)is,ISGENERAL,&isgeneral);CHKERRQ(ierr); 57ede126feSBarry Smith if (!isgeneral) SETERRQ(comm,PETSC_ERR_ARG_INCOMP,"IS must be of type ISGENERAL to load into it"); 58de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 59de8a3bf8SLisandro Dalcin if (skipHeader) SETERRQ(comm,PETSC_ERR_USER, "Currently no support for binary files without headers"); 60de8a3bf8SLisandro Dalcin /* force binary viewer to load .info file if it has not yet done so */ 61de8a3bf8SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 62ede126feSBarry Smith 63ede126feSBarry Smith ierr = PetscViewerBinaryRead(viewer,tr,2,NULL,PETSC_INT);CHKERRQ(ierr); 64ede126feSBarry Smith if (tr[0] != IS_FILE_CLASSID) SETERRQ(comm,PETSC_ERR_ARG_WRONG,"Not an IS next in file"); 65ede126feSBarry Smith 66ede126feSBarry Smith /* Has IS already had its layout defined */ 67de8a3bf8SLisandro Dalcin /* ierr = ISGetLayout(is,&map);CHKERRQ(ierr); */ 68ede126feSBarry Smith ierr = PetscLayoutGetSize(is->map,&N);CHKERRQ(ierr); 69ede126feSBarry Smith if (N > -1 && N != tr[1]) SETERRQ2(comm,PETSC_ERR_ARG_SIZ,"Size of IS in file %D does not match size of IS provided",tr[1],N); 70ede126feSBarry Smith if (N == -1) { 71ede126feSBarry Smith N = tr[1]; 72ede126feSBarry Smith ierr = PetscLayoutSetSize(is->map,N);CHKERRQ(ierr); 73ede126feSBarry Smith ierr = PetscLayoutSetUp(is->map);CHKERRQ(ierr); 74ede126feSBarry Smith } 75ede126feSBarry Smith ierr = PetscLayoutGetLocalSize(is->map,&ln);CHKERRQ(ierr); 76ede126feSBarry Smith ierr = PetscMalloc1(ln,&idx);CHKERRQ(ierr); 77de8a3bf8SLisandro Dalcin 78de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryGetUseMPIIO(viewer,&useMPIIO);CHKERRQ(ierr); 79de8a3bf8SLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 80de8a3bf8SLisandro Dalcin if (useMPIIO) { 81de8a3bf8SLisandro Dalcin MPI_File mfdes; 82de8a3bf8SLisandro Dalcin MPI_Offset off; 83de8a3bf8SLisandro Dalcin PetscMPIInt lsize; 84de8a3bf8SLisandro Dalcin PetscInt rstart; 85de8a3bf8SLisandro Dalcin 86de8a3bf8SLisandro Dalcin ierr = PetscMPIIntCast(ln,&lsize);CHKERRQ(ierr); 87de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryGetMPIIODescriptor(viewer,&mfdes);CHKERRQ(ierr); 88de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryGetMPIIOOffset(viewer,&off);CHKERRQ(ierr); 89de8a3bf8SLisandro Dalcin ierr = PetscLayoutGetRange(is->map,&rstart,NULL);CHKERRQ(ierr); 90de8a3bf8SLisandro Dalcin off += rstart*(MPI_Offset)sizeof(PetscInt); 91de8a3bf8SLisandro Dalcin ierr = MPI_File_set_view(mfdes,off,MPIU_INT,MPIU_INT,(char*)"native",MPI_INFO_NULL);CHKERRQ(ierr); 92de8a3bf8SLisandro Dalcin ierr = MPIU_File_read_all(mfdes,idx,lsize,MPIU_INT,MPI_STATUS_IGNORE);CHKERRQ(ierr); 93de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryAddMPIIOOffset(viewer,N*(MPI_Offset)sizeof(PetscInt));CHKERRQ(ierr); 94de8a3bf8SLisandro Dalcin ierr = ISGeneralSetIndices(is,ln,idx,PETSC_OWN_POINTER);CHKERRQ(ierr); 95de8a3bf8SLisandro Dalcin PetscFunctionReturn(0); 96de8a3bf8SLisandro Dalcin } 97de8a3bf8SLisandro Dalcin #endif 98de8a3bf8SLisandro Dalcin 99de8a3bf8SLisandro Dalcin ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 100de8a3bf8SLisandro Dalcin ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 101de8a3bf8SLisandro Dalcin ierr = PetscObjectGetNewTag((PetscObject)viewer,&tag);CHKERRQ(ierr); 102de8a3bf8SLisandro Dalcin ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 103de8a3bf8SLisandro Dalcin 104ede126feSBarry Smith if (!rank) { 105ede126feSBarry Smith ierr = PetscBinaryRead(fd,idx,ln,PETSC_INT);CHKERRQ(ierr); 106ede126feSBarry Smith 107ede126feSBarry Smith if (size > 1) { 108ede126feSBarry Smith PetscInt *range,n,i,*idxwork; 109ede126feSBarry Smith 110ede126feSBarry Smith /* read in other chuncks and send to other processors */ 111ede126feSBarry Smith /* determine maximum chunck owned by other */ 112ede126feSBarry Smith range = is->map->range; 113ede126feSBarry Smith n = 1; 114ede126feSBarry Smith for (i=1; i<size; i++) n = PetscMax(n,range[i+1] - range[i]); 115ede126feSBarry Smith 116ede126feSBarry Smith ierr = PetscMalloc1(n,&idxwork);CHKERRQ(ierr); 117ede126feSBarry Smith for (i=1; i<size; i++) { 118ede126feSBarry Smith n = range[i+1] - range[i]; 119ede126feSBarry Smith ierr = PetscBinaryRead(fd,idxwork,n,PETSC_INT);CHKERRQ(ierr); 120ede126feSBarry Smith ierr = MPI_Isend(idxwork,n,MPIU_INT,i,tag,comm,&request);CHKERRQ(ierr); 121ede126feSBarry Smith ierr = MPI_Wait(&request,&status);CHKERRQ(ierr); 122ede126feSBarry Smith } 123ede126feSBarry Smith ierr = PetscFree(idxwork);CHKERRQ(ierr); 124ede126feSBarry Smith } 125ede126feSBarry Smith } else { 126ede126feSBarry Smith ierr = MPI_Recv(idx,ln,MPIU_INT,0,tag,comm,&status);CHKERRQ(ierr); 127ede126feSBarry Smith } 128ede126feSBarry Smith ierr = ISGeneralSetIndices(is,ln,idx,PETSC_OWN_POINTER);CHKERRQ(ierr); 129ede126feSBarry Smith PetscFunctionReturn(0); 130ede126feSBarry Smith } 131ede126feSBarry Smith 132235f7792SMatthew G. Knepley PetscErrorCode ISLoad_Default(IS is, PetscViewer viewer) 133235f7792SMatthew G. Knepley { 134235f7792SMatthew G. Knepley PetscBool isbinary; 135235f7792SMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 136235f7792SMatthew G. Knepley PetscBool ishdf5; 137235f7792SMatthew G. Knepley #endif 138235f7792SMatthew G. Knepley PetscErrorCode ierr; 139235f7792SMatthew G. Knepley 140235f7792SMatthew G. Knepley PetscFunctionBegin; 141235f7792SMatthew G. Knepley ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 14282be971eSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 143235f7792SMatthew G. Knepley ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,&ishdf5);CHKERRQ(ierr); 14482be971eSMatthew G. Knepley #endif 145235f7792SMatthew G. Knepley if (isbinary) { 146ede126feSBarry Smith ierr = ISLoad_Binary(is, viewer);CHKERRQ(ierr); 147235f7792SMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 148235f7792SMatthew G. Knepley } else if (ishdf5) { 149235f7792SMatthew G. Knepley ierr = ISLoad_HDF5(is, viewer);CHKERRQ(ierr); 150235f7792SMatthew G. Knepley #endif 151235f7792SMatthew G. Knepley } 152235f7792SMatthew G. Knepley PetscFunctionReturn(0); 153235f7792SMatthew G. Knepley } 154