xref: /petsc/src/mat/utils/matio.c (revision 8798bf22c13d6b0f19082f7079c241038c01d971)
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