1 #ifdef PETSC_RCS_HEADER 2 static char vcid[] = "$Id: matio.c,v 1.56 1999/03/07 17:28:00 bsmith Exp bsmith $"; 3 #endif 4 5 /* 6 This file contains simple binary read/write routines for matrices. 7 */ 8 9 #include "petsc.h" 10 #include "src/mat/matimpl.h" /*I "mat.h" I*/ 11 #include "sys.h" 12 13 static int MatLoadersSet = 0,(*MatLoaders[MAX_MATRIX_TYPES])(Viewer,MatType,Mat*) = 14 {0,0,0,0,0,0,0,0,0,0,0,0}; 15 16 #undef __FUNC__ 17 #define __FUNC__ "MatLoadRegister" 18 /*@C 19 MatLoadRegister - Allows one to register a routine that reads matrices 20 from a binary file for a particular matrix type. 21 22 Not Collective 23 24 Input Parameters: 25 + type - the type of matrix (defined in include/mat.h), for example, MATSEQAIJ. 26 - loader - the function that reads the matrix from the binary file. 27 28 Level: developer 29 30 .seealso: MatLoadRegisterAll(), MatLoad() 31 32 @*/ 33 int MatLoadRegister(MatType type,int (*loader)(Viewer,MatType,Mat*)) 34 { 35 PetscFunctionBegin; 36 MatLoaders[type] = loader; 37 MatLoadersSet = 1; 38 PetscFunctionReturn(0); 39 } 40 41 #undef __FUNC__ 42 #define __FUNC__ "MatLoadPrintHelp_Private" 43 static int MatLoadPrintHelp_Private(Mat A) 44 { 45 static int called = 0; 46 MPI_Comm comm = A->comm; 47 48 PetscFunctionBegin; 49 if (called) {PetscFunctionReturn(0);} else called = 1; 50 (*PetscHelpPrintf)(comm," Options for MatLoad:\n"); 51 (*PetscHelpPrintf)(comm," -matload_block_size <block_size> :Used for MATBAIJ, MATBDIAG\n"); 52 (*PetscHelpPrintf)(comm," -matload_bdiag_diags <s1,s2,s3,...> : Used for MATBDIAG\n"); 53 PetscFunctionReturn(0); 54 } 55 56 #undef __FUNC__ 57 #define __FUNC__ "MatLoad" 58 /*@C 59 MatLoad - Loads a matrix that has been stored in binary format 60 with MatView(). The matrix format is determined from the options database. 61 Generates a parallel MPI matrix if the communicator has more than one 62 processor. The default matrix type is AIJ. 63 64 Collective on Viewer 65 66 Input Parameters: 67 + viewer - binary file viewer, created with ViewerBinaryOpen() 68 - outtype - type of matrix desired, for example MATSEQAIJ, 69 MATMPIROWBS, etc. See types in petsc/include/mat.h. 70 71 Output Parameters: 72 . newmat - new matrix 73 74 Basic Options Database Keys: 75 The following options will work if you first call MatGetTypeFromOptions() 76 and pass the resulting type to MatLoad(). 77 These options use MatCreateSeqXXX or MatCreateMPIXXX, 78 depending on the communicator, comm. 79 + -mat_aij - AIJ type 80 . -mat_baij - block AIJ type 81 . -mat_dense - dense type 82 . -mat_bdiag - block diagonal type 83 . -mat_complex - indicates the matrix has complex entries 84 - -mat_double - indicates the matrix has double entries 85 86 More Options Database Keys: 87 + -mat_seqaij - AIJ type 88 . -mat_mpiaij - parallel AIJ type 89 . -mat_seqbaij - block AIJ type 90 . -mat_mpibaij - parallel block AIJ type 91 . -mat_seqbdiag - block diagonal type 92 . -mat_mpibdiag - parallel block diagonal type 93 . -mat_mpirowbs - parallel rowbs type 94 . -mat_seqdense - dense type 95 - -mat_mpidense - parallel dense type 96 97 More Options Database Keys: 98 Used with block matrix formats (MATSEQBAIJ, MATMPIBDIAG, ...) to specify 99 block size 100 . -matload_block_size <bs> 101 102 Used to specify block diagonal numbers for MATSEQBDIAG and MATMPIBDIAG formats 103 . -matload_bdiag_diags <s1,s2,s3,...> 104 105 Level: beginner 106 107 Notes: 108 MatLoad() automatically loads into the options database any options 109 given in the file filename.info where filename is the name of the file 110 that was passed to the ViewerBinaryOpen(). The options in the info 111 file will be ignored if you use the -matload_ignore_info option. 112 113 In parallel, each processor can load a subset of rows (or the 114 entire matrix). This routine is especially useful when a large 115 matrix is stored on disk and only part of it existsis desired on each 116 processor. For example, a parallel solver may access only some of 117 the rows from each processor. The algorithm used here reads 118 relatively small blocks of data rather than reading the entire 119 matrix and then subsetting it. 120 121 Notes for advanced users: 122 Most users should not need to know the details of the binary storage 123 format, since MatLoad() and MatView() completely hide these details. 124 But for anyone who's interested, the standard binary matrix storage 125 format is 126 127 $ int MAT_COOKIE 128 $ int number of rows 129 $ int number of columns 130 $ int total number of nonzeros 131 $ int *number nonzeros in each row 132 $ int *column indices of all nonzeros (starting index is zero) 133 $ Scalar *values of all nonzeros 134 135 Note for Cray users, the int's stored in the binary file are 32 bit 136 integers; not 64 as they are represented in the memory, so if you 137 write your own routines to read/write these binary files from the Cray 138 you need to adjust the integer sizes that you read in, see 139 PetscReadBinary() and PetscWriteBinary() to see how this may be 140 done. 141 142 In addition, PETSc automatically does the byte swapping for 143 machines that store the bytes reversed, e.g. DEC alpha, freebsd, 144 linux, nt and the paragon; thus if you write your own binary 145 read/write routines you have to swap the bytes; see PetscReadBinary() 146 and PetscWriteBinary() to see how this may be done. 147 148 .keywords: matrix, load, binary, input 149 150 .seealso: ViewerBinaryOpen(), MatView(), VecLoad(), MatLoadRegister(), 151 MatLoadRegisterAll(), MatGetTypeFromOptions() 152 153 @*/ 154 int MatLoad(Viewer viewer,MatType outtype,Mat *newmat) 155 { 156 int ierr,flg; 157 PetscTruth set; 158 MatType type; 159 ViewerType vtype; 160 MPI_Comm comm; 161 162 PetscFunctionBegin; 163 if (outtype > MAX_MATRIX_TYPES || outtype < 0) { 164 SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,1,"Not a valid matrix type"); 165 } 166 PetscValidHeaderSpecific(viewer,VIEWER_COOKIE); 167 *newmat = 0; 168 169 if (!MatLoadersSet) { 170 ierr = MatLoadRegisterAll(); CHKERRQ(ierr); 171 } 172 173 ierr = ViewerGetType(viewer,&vtype); CHKERRQ(ierr); 174 if (PetscStrcmp(vtype,BINARY_VIEWER)){ 175 SETERRQ(PETSC_ERR_ARG_WRONG,0,"Invalid viewer; open viewer with ViewerBinaryOpen()"); 176 } 177 178 ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 179 ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 180 if (!set) type = outtype; 181 182 PLogEventBegin(MAT_Load,viewer,0,0,0); 183 184 if (!MatLoaders[outtype]) { 185 SETERRQ(PETSC_ERR_ARG_WRONG,1,"Invalid matrix type, or matrix load not registered"); 186 } 187 188 ierr = (*MatLoaders[outtype])(viewer,type,newmat); CHKERRQ(ierr); 189 190 ierr = OptionsHasName(PETSC_NULL,"-help", &flg); CHKERRQ(ierr); 191 if (flg) {ierr = MatLoadPrintHelp_Private(*newmat); CHKERRQ(ierr); } 192 PLogEventEnd(MAT_Load,viewer,0,0,0); 193 PetscFunctionReturn(0); 194 } 195 196