Actual source code: matio.c
1: #define PETSCMAT_DLL
3: /*
4: This file contains simple binary read/write routines for matrices.
5: */
7: #include private/matimpl.h
11: /*@C
12: MatLoad - Loads a matrix that has been stored in binary format
13: with MatView(). The matrix format is determined from the options database.
14: Generates a parallel MPI matrix if the communicator has more than one
15: processor. The default matrix type is AIJ.
17: Collective on PetscViewer
19: Input Parameters:
20: + viewer - binary file viewer, created with PetscViewerBinaryOpen()
21: - outtype - type of matrix desired, for example MATSEQAIJ,
22: MATMPISBAIJ etc. See types in petsc/include/petscmat.h.
24: Output Parameters:
25: . newmat - new matrix
27: Basic Options Database Keys:
28: + -matload_type seqaij - AIJ type
29: . -matload_type mpiaij - parallel AIJ type
30: . -matload_type seqbaij - block AIJ type
31: . -matload_type mpibaij - parallel block AIJ type
32: . -matload_type seqsbaij - block symmetric AIJ type
33: . -matload_type mpisbaij - parallel block symmetric AIJ type
34: . -matload_type seqdense - dense type
35: . -matload_type mpidense - parallel dense type
36: - -matload_symmetric - matrix in file is symmetric
38: More Options Database Keys:
39: Used with block matrix formats (MATSEQBAIJ, ...) to specify
40: block size
41: . -matload_block_size <bs>
43: Level: beginner
45: Notes:
46: MatLoad() automatically loads into the options database any options
47: given in the file filename.info where filename is the name of the file
48: that was passed to the PetscViewerBinaryOpen(). The options in the info
49: file will be ignored if you use the -viewer_binary_skip_info option.
51: In parallel, each processor can load a subset of rows (or the
52: entire matrix). This routine is especially useful when a large
53: matrix is stored on disk and only part of it existsis desired on each
54: processor. For example, a parallel solver may access only some of
55: the rows from each processor. The algorithm used here reads
56: relatively small blocks of data rather than reading the entire
57: matrix and then subsetting it.
59: Notes for advanced users:
60: Most users should not need to know the details of the binary storage
61: format, since MatLoad() and MatView() completely hide these details.
62: But for anyone who's interested, the standard binary matrix storage
63: format is
65: $ int MAT_FILE_COOKIE
66: $ int number of rows
67: $ int number of columns
68: $ int total number of nonzeros
69: $ int *number nonzeros in each row
70: $ int *column indices of all nonzeros (starting index is zero)
71: $ PetscScalar *values of all nonzeros
73: PETSc automatically does the byte swapping for
74: machines that store the bytes reversed, e.g. DEC alpha, freebsd,
75: linux, Windows and the paragon; thus if you write your own binary
76: read/write routines you have to swap the bytes; see PetscBinaryRead()
77: and PetscBinaryWrite() to see how this may be done.
79: .keywords: matrix, load, binary, input
81: .seealso: PetscViewerBinaryOpen(), MatView(), VecLoad()
83: @*/
84: PetscErrorCode MatLoad(PetscViewer viewer, const MatType outtype,Mat *newmat)
85: {
86: Mat factory;
88: PetscTruth isbinary,flg;
89: MPI_Comm comm;
90: PetscErrorCode (*r)(PetscViewer, const MatType,Mat*);
91: char mtype[256];
92: const char *prefix;
97: *newmat = 0;
99: PetscObjectGetOptionsPrefix((PetscObject)viewer,(const char **)&prefix);
100: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);
101: if (!isbinary) {
102: SETERRQ(PETSC_ERR_ARG_WRONG,"Invalid viewer; open viewer with PetscViewerBinaryOpen()");
103: }
105: PetscOptionsGetString(prefix,"-mat_type",mtype,256,&flg);
106: if (flg) {
107: outtype = mtype;
108: }
109: PetscOptionsGetString(prefix,"-matload_type",mtype,256,&flg);
110: if (flg) {
111: outtype = mtype;
112: }
113: if (!outtype) outtype = MATAIJ;
115: PetscObjectGetComm((PetscObject)viewer,&comm);
116: MatCreate(comm,&factory);
117: MatSetSizes(factory,0,0,0,0);
118: MatSetType(factory,outtype);
119: r = factory->ops->load;
120: MatDestroy(factory);
121: if (!r) SETERRQ1(PETSC_ERR_SUP,"MatLoad is not supported for type: %s",outtype);
123: PetscLogEventBegin(MAT_Load,viewer,0,0,0);
124: (*r)(viewer,outtype,newmat);
125: PetscLogEventEnd(MAT_Load,viewer,0,0,0);
127: flg = PETSC_FALSE;
128: PetscOptionsGetTruth(prefix,"-matload_symmetric",&flg,PETSC_NULL);
129: if (flg) {
130: MatSetOption(*newmat,MAT_SYMMETRIC,PETSC_TRUE);
131: MatSetOption(*newmat,MAT_SYMMETRY_ETERNAL,PETSC_TRUE);
132: }
133: return(0);
134: }